From 5331441909883a8db477c8e4e77e3f0bec7ec5cb Mon Sep 17 00:00:00 2001 From: Wouter Born Date: Thu, 16 Jul 2026 09:38:03 +0200 Subject: [PATCH 1/3] Add Spotless Gradle configuration --- .gitignore | 1 + .yarn/releases/yarn-4.17.1.cjs | 944 ++++++ .yarnrc.yml | 8 + build.gradle | 2 +- gradle.properties | 1 + package.json | 19 + project.gradle | 29 + settings.gradle | 7 + spotless.gradle | 109 + tools/spotless/.prettierignore | 47 + tools/spotless/.prettierrc.json | 8 + tools/spotless/eclipse-wtp-xml.properties | 6 + tools/spotless/greclipse-google.properties | 28 + tools/spotless/openremote-license-header.txt | 18 + yarn.lock | 2788 ++++++++++++++++++ 15 files changed, 4014 insertions(+), 1 deletion(-) create mode 100755 .yarn/releases/yarn-4.17.1.cjs create mode 100644 .yarnrc.yml create mode 100644 package.json create mode 100644 spotless.gradle create mode 100644 tools/spotless/.prettierignore create mode 100644 tools/spotless/.prettierrc.json create mode 100644 tools/spotless/eclipse-wtp-xml.properties create mode 100644 tools/spotless/greclipse-google.properties create mode 100644 tools/spotless/openremote-license-header.txt create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index a245a8d..86c4517 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ bin-release/ .local/ .DS_* node_modules/ +.eslintcache .pnp.* .yarn/* !.yarn/patches diff --git a/.yarn/releases/yarn-4.17.1.cjs b/.yarn/releases/yarn-4.17.1.cjs new file mode 100755 index 0000000..17d9343 --- /dev/null +++ b/.yarn/releases/yarn-4.17.1.cjs @@ -0,0 +1,944 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Oje=Object.create;var uU=Object.defineProperty;var Lje=Object.getOwnPropertyDescriptor;var Mje=Object.getOwnPropertyNames;var Uje=Object.getPrototypeOf,_je=Object.prototype.hasOwnProperty;var Ce=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ze=(e,t)=>()=>(e&&(t=e(e=0)),t);var G=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Vt=(e,t)=>{for(var r in t)uU(e,r,{get:t[r],enumerable:!0})},Hje=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Mje(t))!_je.call(e,a)&&a!==r&&uU(e,a,{get:()=>t[a],enumerable:!(s=Lje(t,a))||s.enumerable});return e};var et=(e,t,r)=>(r=e!=null?Oje(Uje(e)):{},Hje(t||!e||!e.__esModule?uU(r,"default",{value:e,enumerable:!0}):r,e));var pi={};Vt(pi,{SAFE_TIME:()=>SX,S_IFDIR:()=>ex,S_IFLNK:()=>tx,S_IFMT:()=>Hf,S_IFREG:()=>R2});var Hf,ex,R2,tx,SX,bX=Ze(()=>{Hf=61440,ex=16384,R2=32768,tx=40960,SX=456789e3});var or={};Vt(or,{EBADF:()=>Yo,EBUSY:()=>jje,EEXIST:()=>Kje,EINVAL:()=>qje,EISDIR:()=>Vje,ENOENT:()=>Yje,ENOSYS:()=>Gje,ENOTDIR:()=>Wje,ENOTEMPTY:()=>zje,EOPNOTSUPP:()=>Zje,EROFS:()=>Jje,ERR_DIR_CLOSED:()=>fU});function vc(e,t){return Object.assign(new Error(`${e}: ${t}`),{code:e})}function jje(e){return vc("EBUSY",e)}function Gje(e,t){return vc("ENOSYS",`${e}, ${t}`)}function qje(e){return vc("EINVAL",`invalid argument, ${e}`)}function Yo(e){return vc("EBADF",`bad file descriptor, ${e}`)}function Yje(e){return vc("ENOENT",`no such file or directory, ${e}`)}function Wje(e){return vc("ENOTDIR",`not a directory, ${e}`)}function Vje(e){return vc("EISDIR",`illegal operation on a directory, ${e}`)}function Kje(e){return vc("EEXIST",`file already exists, ${e}`)}function Jje(e){return vc("EROFS",`read-only filesystem, ${e}`)}function zje(e){return vc("ENOTEMPTY",`directory not empty, ${e}`)}function Zje(e){return vc("EOPNOTSUPP",`operation not supported, ${e}`)}function fU(){return vc("ERR_DIR_CLOSED","Directory handle was closed")}var rx=Ze(()=>{});var ll={};Vt(ll,{BigIntStatsEntry:()=>uE,DEFAULT_MODE:()=>hU,DirEntry:()=>AU,StatEntry:()=>cE,areStatsEqual:()=>dU,clearStats:()=>nx,convertToBigIntStats:()=>$je,makeDefaultStats:()=>DX,makeEmptyStats:()=>Xje});function DX(){return new cE}function Xje(){return nx(DX())}function nx(e){for(let t in e)if(Object.hasOwn(e,t)){let r=e[t];typeof r=="number"?e[t]=0:typeof r=="bigint"?e[t]=BigInt(0):pU.types.isDate(r)&&(e[t]=new Date(0))}return e}function $je(e){let t=new uE;for(let r in e)if(Object.hasOwn(e,r)){let s=e[r];typeof s=="number"?t[r]=BigInt(Math.floor(s)):pU.types.isDate(s)&&(t[r]=new Date(s))}return t.atimeNs=t.atimeMs*BigInt(1e6)+BigInt(Math.floor(e.atimeMs%1*1e3))*BigInt(1e3),t.mtimeNs=t.mtimeMs*BigInt(1e6)+BigInt(Math.floor(e.mtimeMs%1*1e3))*BigInt(1e3),t.ctimeNs=t.ctimeMs*BigInt(1e6)+BigInt(Math.floor(e.ctimeMs%1*1e3))*BigInt(1e3),t.birthtimeNs=t.birthtimeMs*BigInt(1e6)+BigInt(Math.floor(e.birthtimeMs%1*1e3))*BigInt(1e3),t}function dU(e,t){if(e.atimeMs!==t.atimeMs||e.birthtimeMs!==t.birthtimeMs||e.blksize!==t.blksize||e.blocks!==t.blocks||e.ctimeMs!==t.ctimeMs||e.dev!==t.dev||e.gid!==t.gid||e.ino!==t.ino||e.isBlockDevice()!==t.isBlockDevice()||e.isCharacterDevice()!==t.isCharacterDevice()||e.isDirectory()!==t.isDirectory()||e.isFIFO()!==t.isFIFO()||e.isFile()!==t.isFile()||e.isSocket()!==t.isSocket()||e.isSymbolicLink()!==t.isSymbolicLink()||e.mode!==t.mode||e.mtimeMs!==t.mtimeMs||e.nlink!==t.nlink||e.rdev!==t.rdev||e.size!==t.size||e.uid!==t.uid)return!1;let r=e,s=t;return!(r.atimeNs!==s.atimeNs||r.mtimeNs!==s.mtimeNs||r.ctimeNs!==s.ctimeNs||r.birthtimeNs!==s.birthtimeNs)}var pU,hU,AU,cE,uE,gU=Ze(()=>{pU=et(Ce("util")),hU=33188,AU=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},cE=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=hU;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},uE=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(hU);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function i6e(e){let t,r;if(t=e.match(r6e))e=t[1];else if(r=e.match(n6e))e=`\\\\${r[1]?".\\":""}${r[2]}`;else return e;return e.replace(/\//g,"\\")}function s6e(e){e=e.replace(/\\/g,"/");let t,r;return(t=e.match(e6e))?e=`/${t[1]}`:(r=e.match(t6e))&&(e=`/unc/${r[1]?".dot/":""}${r[2]}`),e}function ix(e,t){return e===Ae?xX(t):mU(t)}var F2,wt,yr,Ae,Y,PX,e6e,t6e,r6e,n6e,mU,xX,cl=Ze(()=>{F2=et(Ce("path")),wt={root:"/",dot:".",parent:".."},yr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},Ae=Object.create(F2.default),Y=Object.create(F2.default.posix);Ae.cwd=()=>process.cwd();Y.cwd=process.platform==="win32"?()=>mU(process.cwd()):process.cwd;process.platform==="win32"&&(Y.resolve=(...e)=>e.length>0&&Y.isAbsolute(e[0])?F2.default.posix.resolve(...e):F2.default.posix.resolve(Y.cwd(),...e));PX=function(e,t,r){return t=e.normalize(t),r=e.normalize(r),t===r?".":(t.endsWith(e.sep)||(t=t+e.sep),r.startsWith(t)?r.slice(t.length):null)};Ae.contains=(e,t)=>PX(Ae,e,t);Y.contains=(e,t)=>PX(Y,e,t);e6e=/^([a-zA-Z]:.*)$/,t6e=/^\/\/(\.\/)?(.*)$/,r6e=/^\/([a-zA-Z]:.*)$/,n6e=/^\/unc\/(\.dot\/)?(.*)$/;mU=process.platform==="win32"?s6e:e=>e,xX=process.platform==="win32"?i6e:e=>e;Ae.fromPortablePath=xX;Ae.toPortablePath=mU});async function sx(e,t){let r="0123456789abcdef";await e.mkdirPromise(t.indexPath,{recursive:!0});let s=[];for(let a of r)for(let n of r)s.push(e.mkdirPromise(e.pathUtils.join(t.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(s),t.indexPath}async function kX(e,t,r,s,a){let n=e.pathUtils.normalize(t),c=r.pathUtils.normalize(s),f=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:m0,mtime:m0}:await r.lstatPromise(c);await e.mkdirpPromise(e.pathUtils.dirname(t),{utimes:[h,E]}),await yU(f,p,e,n,r,c,{...a,didParentExist:!0});for(let C of f)await C();await Promise.all(p.map(C=>C()))}async function yU(e,t,r,s,a,n,c){let f=c.didParentExist?await QX(r,s):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=c.stableTime?{atime:m0,mtime:m0}:p,C;switch(!0){case p.isDirectory():C=await a6e(e,t,r,s,f,a,n,p,c);break;case p.isFile():C=await u6e(e,t,r,s,f,a,n,p,c);break;case p.isSymbolicLink():C=await f6e(e,t,r,s,f,a,n,p,c);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(c.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((C||f?.mtime?.getTime()!==E.getTime()||f?.atime?.getTime()!==h.getTime())&&(t.push(()=>r.lutimesPromise(s,h,E)),C=!0),(f===null||(f.mode&511)!==(p.mode&511))&&(t.push(()=>r.chmodPromise(s,p.mode&511)),C=!0)),C}async function QX(e,t){try{return await e.lstatPromise(t)}catch{return null}}async function a6e(e,t,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p.overwrite)e.push(async()=>r.removePromise(s)),a=null;else return!1;let h=!1;a===null&&(e.push(async()=>{try{await r.mkdirPromise(s,{mode:f.mode})}catch(S){if(S.code!=="EEXIST")throw S}}),h=!0);let E=await n.readdirPromise(c),C=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let S of E.sort())await yU(e,t,r,r.pathUtils.join(s,S),n,n.pathUtils.join(c,S),C)&&(h=!0);else(await Promise.all(E.map(async x=>{await yU(e,t,r,r.pathUtils.join(s,x),n,n.pathUtils.join(c,x),C)}))).some(x=>x)&&(h=!0);return h}async function l6e(e,t,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromise(c,{algorithm:"sha1"}),C=420,S=f.mode&511,x=`${E}${S!==C?S.toString(8):""}`,I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${x}.dat`),R;(le=>(le[le.Lock=0]="Lock",le[le.Rename=1]="Rename"))(R||={});let N=1,U=await QX(r,I);if(a){let ie=U&&a.dev===U.dev&&a.ino===U.ino,fe=U?.mtimeMs!==o6e;if(ie&&fe&&h.autoRepair&&(N=0,U=null),!ie)if(p.overwrite)e.push(async()=>r.removePromise(s)),a=null;else return!1}let K=!U&&N===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,$=!1;return e.push(async()=>{if(!U&&(N===0&&await r.lockPromise(I,async()=>{let ie=await n.readFilePromise(c);await r.writeFilePromise(I,ie)}),N===1&&K)){let ie=await n.readFilePromise(c);await r.writeFilePromise(K,ie);try{await r.linkPromise(K,I)}catch(fe){if(fe.code==="EEXIST")$=!0,await r.unlinkPromise(K);else throw fe}}a||await r.linkPromise(I,s)}),t.push(async()=>{U||(await r.lutimesPromise(I,m0,m0),S!==C&&await r.chmodPromise(I,S)),K&&!$&&await r.unlinkPromise(K)}),!1}async function c6e(e,t,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)e.push(async()=>r.removePromise(s)),a=null;else return!1;return e.push(async()=>{let h=await n.readFilePromise(c);await r.writeFilePromise(s,h)}),!0}async function u6e(e,t,r,s,a,n,c,f,p){return p.linkStrategy?.type==="HardlinkFromIndex"?l6e(e,t,r,s,a,n,c,f,p,p.linkStrategy):c6e(e,t,r,s,a,n,c,f,p)}async function f6e(e,t,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)e.push(async()=>r.removePromise(s)),a=null;else return!1;return e.push(async()=>{await r.symlinkPromise(ix(r.pathUtils,await n.readlinkPromise(c)),s)}),!0}var m0,o6e,EU=Ze(()=>{cl();m0=new Date(456789e3*1e3),o6e=m0.getTime()});function ox(e,t,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let c=e.pathUtils.join(t,n);return Object.assign(e.statSync(c),{name:n,path:void 0})};return new N2(t,a,s)}var N2,TX=Ze(()=>{rx();N2=class{constructor(t,r,s={}){this.path=t;this.nextDirent=r;this.opts=s;this.closed=!1}throwIfClosed(){if(this.closed)throw fU()}async*[Symbol.asyncIterator](){try{let t;for(;(t=await this.read())!==null;)yield t}finally{await this.close()}}read(t){let r=this.readSync();return typeof t<"u"?t(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(t){return this.closeSync(),typeof t<"u"?t(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function RX(e,t){if(e!==t)throw new Error(`Invalid StatWatcher status: expected '${t}', got '${e}'`)}var FX,ax,NX=Ze(()=>{FX=Ce("events");gU();ax=class e extends FX.EventEmitter{constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=s,this.bigint=a,this.lastStats=this.stat()}static create(r,s,a){let n=new e(r,s,a);return n.start(),n}start(){RX(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){RX(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new uE:new cE;return nx(r)}}makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStats;dU(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?s:s.unref()}registerChangeListener(r,s){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(s))}unregisterChangeListener(r){this.removeListener("change",r);let s=this.changeListeners.get(r);typeof s<"u"&&clearInterval(s),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function fE(e,t,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=!0,c=5007,f=r;break;default:({bigint:a=!1,persistent:n=!0,interval:c=5007}=r),f=s;break}let p=lx.get(e);typeof p>"u"&&lx.set(e,p=new Map);let h=p.get(t);return typeof h>"u"&&(h=ax.create(e,t,{bigint:a}),p.set(t,h)),h.registerChangeListener(f,{persistent:n,interval:c}),h}function y0(e,t,r){let s=lx.get(e);if(typeof s>"u")return;let a=s.get(t);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),s.delete(t)))}function E0(e){let t=lx.get(e);if(!(typeof t>"u"))for(let r of t.keys())y0(e,r)}var lx,IU=Ze(()=>{NX();lx=new WeakMap});function A6e(e){let t=e.match(/\r?\n/g);if(t===null)return LX.EOL;let r=t.filter(a=>a===`\r +`).length,s=t.length-r;return r>s?`\r +`:` +`}function I0(e,t){return t.replace(/\r?\n/g,A6e(e))}var OX,LX,Ip,jf,C0=Ze(()=>{OX=Ce("crypto"),LX=Ce("os");EU();cl();Ip=class{constructor(t){this.pathUtils=t}async*genTraversePromise(t,{stableSort:r=!1}={}){let s=[t];for(;s.length>0;){let a=s.shift();if((await this.lstatPromise(a)).isDirectory()){let c=await this.readdirPromise(a);if(r)for(let f of c.sort())s.push(this.pathUtils.join(a,f));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(t,{algorithm:r="sha512"}={}){let s=await this.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,OX.createHash)(r),f=0;for(;(f=await this.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await this.closePromise(s)}}async removePromise(t,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=await this.lstatPromise(t)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(t);await Promise.all(n.map(c=>this.removePromise(this.pathUtils.resolve(t,c))))}for(let n=0;n<=s;n++)try{await this.rmdirPromise(t);break}catch(c){if(c.code!=="EBUSY"&&c.code!=="ENOTEMPTY")throw c;nsetTimeout(f,n*100))}}else await this.unlinkPromise(t)}removeSync(t,{recursive:r=!0}={}){let s;try{s=this.lstatSync(t)}catch(a){if(a.code==="ENOENT")return;throw a}if(s.isDirectory()){if(r)for(let a of this.readdirSync(t))this.removeSync(this.pathUtils.resolve(t,a));this.rmdirSync(t)}else this.unlinkSync(t)}async mkdirpPromise(t,{chmod:r,utimes:s}={}){if(t=this.resolve(t),t===this.pathUtils.dirname(t))return;let a=t.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{await this.mkdirPromise(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&await this.chmodPromise(f,r),s!=null)await this.utimesPromise(f,s[0],s[1]);else{let p=await this.statPromise(this.pathUtils.dirname(f));await this.utimesPromise(f,p.atime,p.mtime)}}}return n}mkdirpSync(t,{chmod:r,utimes:s}={}){if(t=this.resolve(t),t===this.pathUtils.dirname(t))return;let a=t.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{this.mkdirSync(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&this.chmodSync(f,r),s!=null)this.utimesSync(f,s[0],s[1]);else{let p=this.statSync(this.pathUtils.dirname(f));this.utimesSync(f,p.atime,p.mtime)}}}return n}async copyPromise(t,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stableTime:c=!1,linkStrategy:f=null}={}){return await kX(this,t,s,r,{overwrite:a,stableSort:n,stableTime:c,linkStrategy:f})}copySync(t,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=this.existsSync(t);if(n.isDirectory()){this.mkdirpSync(t);let p=s.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(t,h),s.pathUtils.join(r,h),{baseFs:s,overwrite:a})}else if(n.isFile()){if(!c||a){c&&this.removeSync(t);let p=s.readFileSync(r);this.writeFileSync(t,p)}}else if(n.isSymbolicLink()){if(!c||a){c&&this.removeSync(t);let p=s.readlinkSync(r);this.symlinkSync(ix(this.pathUtils,p),t)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let f=n.mode&511;this.chmodSync(t,f)}async changeFilePromise(t,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(t,r,s):this.changeFileTextPromise(t,r,s)}async changeFileBufferPromise(t,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(t)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(t,r,{mode:s})}async changeFileTextPromise(t,r,{automaticNewlines:s,mode:a}={}){let n="";try{n=await this.readFilePromise(t,"utf8")}catch{}let c=s?I0(n,r):r;n!==c&&await this.writeFilePromise(t,c,{mode:a})}changeFileSync(t,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(t,r,s):this.changeFileTextSync(t,r,s)}changeFileBufferSync(t,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(t)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(t,r,{mode:s})}changeFileTextSync(t,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{n=this.readFileSync(t,"utf8")}catch{}let c=s?I0(n,r):r;n!==c&&this.writeFileSync(t,c,{mode:a})}async movePromise(t,r){try{await this.renamePromise(t,r)}catch(s){if(s.code==="EXDEV")await this.copyPromise(r,t),await this.removePromise(t);else throw s}}moveSync(t,r){try{this.renameSync(t,r)}catch(s){if(s.code==="EXDEV")this.copySync(r,t),this.removeSync(t);else throw s}}async lockPromise(t,r){let s=`${t}.flock`,a=1e3/60,n=Date.now(),c=null,f=async()=>{let p;try{[p]=await this.readJsonPromise(s)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;c===null;)try{c=await this.openPromise(s,"wx")}catch(p){if(p.code==="EEXIST"){if(!await f())try{await this.unlinkPromise(s);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${s})`)}else throw p}await this.writePromise(c,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(c),await this.unlinkPromise(s)}catch{}}}async readJsonPromise(t){let r=await this.readFilePromise(t,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${t})`,s}}readJsonSync(t){let r=this.readFileSync(t,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${t})`,s}}async writeJsonPromise(t,r,{compact:s=!1}={}){let a=s?0:2;return await this.writeFilePromise(t,`${JSON.stringify(r,null,a)} +`)}writeJsonSync(t,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSync(t,`${JSON.stringify(r,null,a)} +`)}async preserveTimePromise(t,r){let s=await this.lstatPromise(t),a=await r();typeof a<"u"&&(t=a),await this.lutimesPromise(t,s.atime,s.mtime)}async preserveTimeSync(t,r){let s=this.lstatSync(t),a=r();typeof a<"u"&&(t=a),this.lutimesSync(t,s.atime,s.mtime)}},jf=class extends Ip{constructor(){super(Y)}}});var Gs,Cp=Ze(()=>{C0();Gs=class extends Ip{getExtractHint(t){return this.baseFs.getExtractHint(t)}resolve(t){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(t)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(t,r,s){return this.baseFs.openPromise(this.mapToBase(t),r,s)}openSync(t,r,s){return this.baseFs.openSync(this.mapToBase(t),r,s)}async opendirPromise(t,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(t),r),{path:t})}opendirSync(t,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(t),r),{path:t})}async readPromise(t,r,s,a,n){return await this.baseFs.readPromise(t,r,s,a,n)}readSync(t,r,s,a,n){return this.baseFs.readSync(t,r,s,a,n)}async writePromise(t,r,s,a,n){return typeof r=="string"?await this.baseFs.writePromise(t,r,s):await this.baseFs.writePromise(t,r,s,a,n)}writeSync(t,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(t,r,s):this.baseFs.writeSync(t,r,s,a,n)}async closePromise(t){return this.baseFs.closePromise(t)}closeSync(t){this.baseFs.closeSync(t)}createReadStream(t,r){return this.baseFs.createReadStream(t!==null?this.mapToBase(t):t,r)}createWriteStream(t,r){return this.baseFs.createWriteStream(t!==null?this.mapToBase(t):t,r)}async realpathPromise(t){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(t)))}realpathSync(t){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(t)))}async existsPromise(t){return this.baseFs.existsPromise(this.mapToBase(t))}existsSync(t){return this.baseFs.existsSync(this.mapToBase(t))}accessSync(t,r){return this.baseFs.accessSync(this.mapToBase(t),r)}async accessPromise(t,r){return this.baseFs.accessPromise(this.mapToBase(t),r)}async statPromise(t,r){return this.baseFs.statPromise(this.mapToBase(t),r)}statSync(t,r){return this.baseFs.statSync(this.mapToBase(t),r)}async fstatPromise(t,r){return this.baseFs.fstatPromise(t,r)}fstatSync(t,r){return this.baseFs.fstatSync(t,r)}lstatPromise(t,r){return this.baseFs.lstatPromise(this.mapToBase(t),r)}lstatSync(t,r){return this.baseFs.lstatSync(this.mapToBase(t),r)}async fchmodPromise(t,r){return this.baseFs.fchmodPromise(t,r)}fchmodSync(t,r){return this.baseFs.fchmodSync(t,r)}async chmodPromise(t,r){return this.baseFs.chmodPromise(this.mapToBase(t),r)}chmodSync(t,r){return this.baseFs.chmodSync(this.mapToBase(t),r)}async fchownPromise(t,r,s){return this.baseFs.fchownPromise(t,r,s)}fchownSync(t,r,s){return this.baseFs.fchownSync(t,r,s)}async chownPromise(t,r,s){return this.baseFs.chownPromise(this.mapToBase(t),r,s)}chownSync(t,r,s){return this.baseFs.chownSync(this.mapToBase(t),r,s)}async renamePromise(t,r){return this.baseFs.renamePromise(this.mapToBase(t),this.mapToBase(r))}renameSync(t,r){return this.baseFs.renameSync(this.mapToBase(t),this.mapToBase(r))}async copyFilePromise(t,r,s=0){return this.baseFs.copyFilePromise(this.mapToBase(t),this.mapToBase(r),s)}copyFileSync(t,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(t),this.mapToBase(r),s)}async appendFilePromise(t,r,s){return this.baseFs.appendFilePromise(this.fsMapToBase(t),r,s)}appendFileSync(t,r,s){return this.baseFs.appendFileSync(this.fsMapToBase(t),r,s)}async writeFilePromise(t,r,s){return this.baseFs.writeFilePromise(this.fsMapToBase(t),r,s)}writeFileSync(t,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(t),r,s)}async unlinkPromise(t){return this.baseFs.unlinkPromise(this.mapToBase(t))}unlinkSync(t){return this.baseFs.unlinkSync(this.mapToBase(t))}async utimesPromise(t,r,s){return this.baseFs.utimesPromise(this.mapToBase(t),r,s)}utimesSync(t,r,s){return this.baseFs.utimesSync(this.mapToBase(t),r,s)}async lutimesPromise(t,r,s){return this.baseFs.lutimesPromise(this.mapToBase(t),r,s)}lutimesSync(t,r,s){return this.baseFs.lutimesSync(this.mapToBase(t),r,s)}async mkdirPromise(t,r){return this.baseFs.mkdirPromise(this.mapToBase(t),r)}mkdirSync(t,r){return this.baseFs.mkdirSync(this.mapToBase(t),r)}async rmdirPromise(t,r){return this.baseFs.rmdirPromise(this.mapToBase(t),r)}rmdirSync(t,r){return this.baseFs.rmdirSync(this.mapToBase(t),r)}async rmPromise(t,r){return this.baseFs.rmPromise(this.mapToBase(t),r)}rmSync(t,r){return this.baseFs.rmSync(this.mapToBase(t),r)}async linkPromise(t,r){return this.baseFs.linkPromise(this.mapToBase(t),this.mapToBase(r))}linkSync(t,r){return this.baseFs.linkSync(this.mapToBase(t),this.mapToBase(r))}async symlinkPromise(t,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(t))return this.baseFs.symlinkPromise(this.mapToBase(t),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),t)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(c,a,s)}symlinkSync(t,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(t))return this.baseFs.symlinkSync(this.mapToBase(t),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),t)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(c,a,s)}async readFilePromise(t,r){return this.baseFs.readFilePromise(this.fsMapToBase(t),r)}readFileSync(t,r){return this.baseFs.readFileSync(this.fsMapToBase(t),r)}readdirPromise(t,r){return this.baseFs.readdirPromise(this.mapToBase(t),r)}readdirSync(t,r){return this.baseFs.readdirSync(this.mapToBase(t),r)}async readlinkPromise(t){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(t)))}readlinkSync(t){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(t)))}async truncatePromise(t,r){return this.baseFs.truncatePromise(this.mapToBase(t),r)}truncateSync(t,r){return this.baseFs.truncateSync(this.mapToBase(t),r)}async ftruncatePromise(t,r){return this.baseFs.ftruncatePromise(t,r)}ftruncateSync(t,r){return this.baseFs.ftruncateSync(t,r)}watch(t,r,s){return this.baseFs.watch(this.mapToBase(t),r,s)}watchFile(t,r,s){return this.baseFs.watchFile(this.mapToBase(t),r,s)}unwatchFile(t,r){return this.baseFs.unwatchFile(this.mapToBase(t),r)}fsMapToBase(t){return typeof t=="number"?t:this.mapToBase(t)}}});var Gf,MX=Ze(()=>{Cp();Gf=class extends Gs{constructor(t,{baseFs:r,pathUtils:s}){super(s),this.target=t,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(t){return t}mapToBase(t){return t}}});function UX(e){let t=e;return typeof e.path=="string"&&(t.path=Ae.toPortablePath(e.path)),t}var _X,Kn,w0=Ze(()=>{_X=et(Ce("fs"));C0();cl();Kn=class extends jf{constructor(t=_X.default){super(),this.realFs=t}getExtractHint(){return!1}getRealPath(){return wt.root}resolve(t){return Y.resolve(t)}async openPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.open(Ae.fromPortablePath(t),r,s,this.makeCallback(a,n))})}openSync(t,r,s){return this.realFs.openSync(Ae.fromPortablePath(t),r,s)}async opendirPromise(t,r){return await new Promise((s,a)=>{typeof r<"u"?this.realFs.opendir(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.opendir(Ae.fromPortablePath(t),this.makeCallback(s,a))}).then(s=>{let a=s;return Object.defineProperty(a,"path",{value:t,configurable:!0,writable:!0}),a})}opendirSync(t,r){let a=typeof r<"u"?this.realFs.opendirSync(Ae.fromPortablePath(t),r):this.realFs.opendirSync(Ae.fromPortablePath(t));return Object.defineProperty(a,"path",{value:t,configurable:!0,writable:!0}),a}async readPromise(t,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{this.realFs.read(t,r,s,a,n,(p,h)=>{p?f(p):c(h)})})}readSync(t,r,s,a,n){return this.realFs.readSync(t,r,s,a,n)}async writePromise(t,r,s,a,n){return await new Promise((c,f)=>typeof r=="string"?this.realFs.write(t,r,s,this.makeCallback(c,f)):this.realFs.write(t,r,s,a,n,this.makeCallback(c,f)))}writeSync(t,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(t,r,s):this.realFs.writeSync(t,r,s,a,n)}async closePromise(t){await new Promise((r,s)=>{this.realFs.close(t,this.makeCallback(r,s))})}closeSync(t){this.realFs.closeSync(t)}createReadStream(t,r){let s=t!==null?Ae.fromPortablePath(t):t;return this.realFs.createReadStream(s,r)}createWriteStream(t,r){let s=t!==null?Ae.fromPortablePath(t):t;return this.realFs.createWriteStream(s,r)}async realpathPromise(t){return await new Promise((r,s)=>{this.realFs.realpath(Ae.fromPortablePath(t),{},this.makeCallback(r,s))}).then(r=>Ae.toPortablePath(r))}realpathSync(t){return Ae.toPortablePath(this.realFs.realpathSync(Ae.fromPortablePath(t),{}))}async existsPromise(t){return await new Promise(r=>{this.realFs.exists(Ae.fromPortablePath(t),r)})}accessSync(t,r){return this.realFs.accessSync(Ae.fromPortablePath(t),r)}async accessPromise(t,r){return await new Promise((s,a)=>{this.realFs.access(Ae.fromPortablePath(t),r,this.makeCallback(s,a))})}existsSync(t){return this.realFs.existsSync(Ae.fromPortablePath(t))}async statPromise(t,r){return await new Promise((s,a)=>{r?this.realFs.stat(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.stat(Ae.fromPortablePath(t),this.makeCallback(s,a))})}statSync(t,r){return r?this.realFs.statSync(Ae.fromPortablePath(t),r):this.realFs.statSync(Ae.fromPortablePath(t))}async fstatPromise(t,r){return await new Promise((s,a)=>{r?this.realFs.fstat(t,r,this.makeCallback(s,a)):this.realFs.fstat(t,this.makeCallback(s,a))})}fstatSync(t,r){return r?this.realFs.fstatSync(t,r):this.realFs.fstatSync(t)}async lstatPromise(t,r){return await new Promise((s,a)=>{r?this.realFs.lstat(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.lstat(Ae.fromPortablePath(t),this.makeCallback(s,a))})}lstatSync(t,r){return r?this.realFs.lstatSync(Ae.fromPortablePath(t),r):this.realFs.lstatSync(Ae.fromPortablePath(t))}async fchmodPromise(t,r){return await new Promise((s,a)=>{this.realFs.fchmod(t,r,this.makeCallback(s,a))})}fchmodSync(t,r){return this.realFs.fchmodSync(t,r)}async chmodPromise(t,r){return await new Promise((s,a)=>{this.realFs.chmod(Ae.fromPortablePath(t),r,this.makeCallback(s,a))})}chmodSync(t,r){return this.realFs.chmodSync(Ae.fromPortablePath(t),r)}async fchownPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.fchown(t,r,s,this.makeCallback(a,n))})}fchownSync(t,r,s){return this.realFs.fchownSync(t,r,s)}async chownPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.chown(Ae.fromPortablePath(t),r,s,this.makeCallback(a,n))})}chownSync(t,r,s){return this.realFs.chownSync(Ae.fromPortablePath(t),r,s)}async renamePromise(t,r){return await new Promise((s,a)=>{this.realFs.rename(Ae.fromPortablePath(t),Ae.fromPortablePath(r),this.makeCallback(s,a))})}renameSync(t,r){return this.realFs.renameSync(Ae.fromPortablePath(t),Ae.fromPortablePath(r))}async copyFilePromise(t,r,s=0){return await new Promise((a,n)=>{this.realFs.copyFile(Ae.fromPortablePath(t),Ae.fromPortablePath(r),s,this.makeCallback(a,n))})}copyFileSync(t,r,s=0){return this.realFs.copyFileSync(Ae.fromPortablePath(t),Ae.fromPortablePath(r),s)}async appendFilePromise(t,r,s){return await new Promise((a,n)=>{let c=typeof t=="string"?Ae.fromPortablePath(t):t;s?this.realFs.appendFile(c,r,s,this.makeCallback(a,n)):this.realFs.appendFile(c,r,this.makeCallback(a,n))})}appendFileSync(t,r,s){let a=typeof t=="string"?Ae.fromPortablePath(t):t;s?this.realFs.appendFileSync(a,r,s):this.realFs.appendFileSync(a,r)}async writeFilePromise(t,r,s){return await new Promise((a,n)=>{let c=typeof t=="string"?Ae.fromPortablePath(t):t;s?this.realFs.writeFile(c,r,s,this.makeCallback(a,n)):this.realFs.writeFile(c,r,this.makeCallback(a,n))})}writeFileSync(t,r,s){let a=typeof t=="string"?Ae.fromPortablePath(t):t;s?this.realFs.writeFileSync(a,r,s):this.realFs.writeFileSync(a,r)}async unlinkPromise(t){return await new Promise((r,s)=>{this.realFs.unlink(Ae.fromPortablePath(t),this.makeCallback(r,s))})}unlinkSync(t){return this.realFs.unlinkSync(Ae.fromPortablePath(t))}async utimesPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.utimes(Ae.fromPortablePath(t),r,s,this.makeCallback(a,n))})}utimesSync(t,r,s){this.realFs.utimesSync(Ae.fromPortablePath(t),r,s)}async lutimesPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.lutimes(Ae.fromPortablePath(t),r,s,this.makeCallback(a,n))})}lutimesSync(t,r,s){this.realFs.lutimesSync(Ae.fromPortablePath(t),r,s)}async mkdirPromise(t,r){return await new Promise((s,a)=>{this.realFs.mkdir(Ae.fromPortablePath(t),r,this.makeCallback(s,a))})}mkdirSync(t,r){return this.realFs.mkdirSync(Ae.fromPortablePath(t),r)}async rmdirPromise(t,r){return await new Promise((s,a)=>{r?this.realFs.rmdir(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.rmdir(Ae.fromPortablePath(t),this.makeCallback(s,a))})}rmdirSync(t,r){return this.realFs.rmdirSync(Ae.fromPortablePath(t),r)}async rmPromise(t,r){return await new Promise((s,a)=>{r?this.realFs.rm(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.rm(Ae.fromPortablePath(t),this.makeCallback(s,a))})}rmSync(t,r){return this.realFs.rmSync(Ae.fromPortablePath(t),r)}async linkPromise(t,r){return await new Promise((s,a)=>{this.realFs.link(Ae.fromPortablePath(t),Ae.fromPortablePath(r),this.makeCallback(s,a))})}linkSync(t,r){return this.realFs.linkSync(Ae.fromPortablePath(t),Ae.fromPortablePath(r))}async symlinkPromise(t,r,s){return await new Promise((a,n)=>{this.realFs.symlink(Ae.fromPortablePath(t.replace(/\/+$/,"")),Ae.fromPortablePath(r),s,this.makeCallback(a,n))})}symlinkSync(t,r,s){return this.realFs.symlinkSync(Ae.fromPortablePath(t.replace(/\/+$/,"")),Ae.fromPortablePath(r),s)}async readFilePromise(t,r){return await new Promise((s,a)=>{let n=typeof t=="string"?Ae.fromPortablePath(t):t;this.realFs.readFile(n,r,this.makeCallback(s,a))})}readFileSync(t,r){let s=typeof t=="string"?Ae.fromPortablePath(t):t;return this.realFs.readFileSync(s,r)}async readdirPromise(t,r){return await new Promise((s,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(Ae.fromPortablePath(t),r,this.makeCallback(n=>s(n.map(UX)),a)):this.realFs.readdir(Ae.fromPortablePath(t),r,this.makeCallback(n=>s(n.map(Ae.toPortablePath)),a)):this.realFs.readdir(Ae.fromPortablePath(t),r,this.makeCallback(s,a)):this.realFs.readdir(Ae.fromPortablePath(t),this.makeCallback(s,a))})}readdirSync(t,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(Ae.fromPortablePath(t),r).map(UX):this.realFs.readdirSync(Ae.fromPortablePath(t),r).map(Ae.toPortablePath):this.realFs.readdirSync(Ae.fromPortablePath(t),r):this.realFs.readdirSync(Ae.fromPortablePath(t))}async readlinkPromise(t){return await new Promise((r,s)=>{this.realFs.readlink(Ae.fromPortablePath(t),this.makeCallback(r,s))}).then(r=>Ae.toPortablePath(r))}readlinkSync(t){return Ae.toPortablePath(this.realFs.readlinkSync(Ae.fromPortablePath(t)))}async truncatePromise(t,r){return await new Promise((s,a)=>{this.realFs.truncate(Ae.fromPortablePath(t),r,this.makeCallback(s,a))})}truncateSync(t,r){return this.realFs.truncateSync(Ae.fromPortablePath(t),r)}async ftruncatePromise(t,r){return await new Promise((s,a)=>{this.realFs.ftruncate(t,r,this.makeCallback(s,a))})}ftruncateSync(t,r){return this.realFs.ftruncateSync(t,r)}watch(t,r,s){return this.realFs.watch(Ae.fromPortablePath(t),r,s)}watchFile(t,r,s){return this.realFs.watchFile(Ae.fromPortablePath(t),r,s)}unwatchFile(t,r){return this.realFs.unwatchFile(Ae.fromPortablePath(t),r)}makeCallback(t,r){return(s,a)=>{s?r(s):t(a)}}}});var Pn,HX=Ze(()=>{w0();Cp();cl();Pn=class extends Gs{constructor(t,{baseFs:r=new Kn}={}){super(Y),this.target=this.pathUtils.normalize(t),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(t){return this.pathUtils.isAbsolute(t)?Y.normalize(t):this.baseFs.resolve(Y.join(this.target,t))}mapFromBase(t){return t}mapToBase(t){return this.pathUtils.isAbsolute(t)?t:this.pathUtils.join(this.target,t)}}});var jX,qf,GX=Ze(()=>{w0();Cp();cl();jX=wt.root,qf=class extends Gs{constructor(t,{baseFs:r=new Kn}={}){super(Y),this.target=this.pathUtils.resolve(wt.root,t),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(wt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(t){let r=this.pathUtils.normalize(t);if(this.pathUtils.isAbsolute(t))return this.pathUtils.resolve(this.target,this.pathUtils.relative(jX,t));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${t}) would escape the jail`);return this.pathUtils.resolve(this.target,t)}mapFromBase(t){return this.pathUtils.resolve(jX,this.pathUtils.relative(this.target,t))}}});var AE,qX=Ze(()=>{Cp();AE=class extends Gs{constructor(r,s){super(s);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var B0,ul,td,YX=Ze(()=>{B0=Ce("fs");C0();w0();IU();rx();cl();ul=4278190080,td=class extends jf{constructor({baseFs:r=new Kn,filter:s=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:c=!0,maxAge:f=5e3,typeCheck:p=B0.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:C}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=c?new Map:null,this.factoryPromise=E,this.factorySync=C,this.filter=s,this.getMountPoint=h,this.magic=a<<24,this.maxAge=f,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(E0(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(E0(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s]),a}async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,s,a),async(n,{subPath:c})=>this.remapFd(n,await n.openPromise(c,s,a)))}openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,a),(n,{subPath:c})=>this.remapFd(n,n.openSync(c,s,a)))}async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,s),async(a,{subPath:n})=>await a.opendirPromise(n,s),{requireSubpath:!1})}opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,s),(a,{subPath:n})=>a.opendirSync(n,s),{requireSubpath:!1})}async readPromise(r,s,a,n,c){if((r&ul)!==this.magic)return await this.baseFs.readPromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Yo("read");let[p,h]=f;return await p.readPromise(h,s,a,n,c)}readSync(r,s,a,n,c){if((r&ul)!==this.magic)return this.baseFs.readSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Yo("readSync");let[p,h]=f;return p.readSync(h,s,a,n,c)}async writePromise(r,s,a,n,c){if((r&ul)!==this.magic)return typeof s=="string"?await this.baseFs.writePromise(r,s,a):await this.baseFs.writePromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Yo("write");let[p,h]=f;return typeof s=="string"?await p.writePromise(h,s,a):await p.writePromise(h,s,a,n,c)}writeSync(r,s,a,n,c){if((r&ul)!==this.magic)return typeof s=="string"?this.baseFs.writeSync(r,s,a):this.baseFs.writeSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Yo("writeSync");let[p,h]=f;return typeof s=="string"?p.writeSync(h,s,a):p.writeSync(h,s,a,n,c)}async closePromise(r){if((r&ul)!==this.magic)return await this.baseFs.closePromise(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Yo("close");this.fdMap.delete(r);let[a,n]=s;return await a.closePromise(n)}closeSync(r){if((r&ul)!==this.magic)return this.baseFs.closeSync(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Yo("closeSync");this.fdMap.delete(r);let[a,n]=s;return a.closeSync(n)}createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,s),(a,{archivePath:n,subPath:c})=>{let f=a.createReadStream(c,s);return f.path=Ae.fromPortablePath(this.pathUtils.join(n,c)),f})}createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,s),(a,{subPath:n})=>a.createWriteStream(n,s))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=await this.baseFs.realpathPromise(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(wt.root,await s.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=this.baseFs.realpathSync(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(wt.root,s.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(s,{subPath:a})=>await s.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(s,{subPath:a})=>s.existsSync(a))}async accessPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,s),async(a,{subPath:n})=>await a.accessPromise(n,s))}accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,s),(a,{subPath:n})=>a.accessSync(n,s))}async statPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,s),async(a,{subPath:n})=>await a.statPromise(n,s))}statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(a,{subPath:n})=>a.statSync(n,s))}async fstatPromise(r,s){if((r&ul)!==this.magic)return this.baseFs.fstatPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("fstat");let[n,c]=a;return n.fstatPromise(c,s)}fstatSync(r,s){if((r&ul)!==this.magic)return this.baseFs.fstatSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("fstatSync");let[n,c]=a;return n.fstatSync(c,s)}async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,s),async(a,{subPath:n})=>await a.lstatPromise(n,s))}lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s),(a,{subPath:n})=>a.lstatSync(n,s))}async fchmodPromise(r,s){if((r&ul)!==this.magic)return this.baseFs.fchmodPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("fchmod");let[n,c]=a;return n.fchmodPromise(c,s)}fchmodSync(r,s){if((r&ul)!==this.magic)return this.baseFs.fchmodSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("fchmodSync");let[n,c]=a;return n.fchmodSync(c,s)}async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,s),async(a,{subPath:n})=>await a.chmodPromise(n,s))}chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s),(a,{subPath:n})=>a.chmodSync(n,s))}async fchownPromise(r,s,a){if((r&ul)!==this.magic)return this.baseFs.fchownPromise(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Yo("fchown");let[c,f]=n;return c.fchownPromise(f,s,a)}fchownSync(r,s,a){if((r&ul)!==this.magic)return this.baseFs.fchownSync(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Yo("fchownSync");let[c,f]=n;return c.fchownSync(f,s,a)}async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,s,a),async(n,{subPath:c})=>await n.chownPromise(c,s,a))}chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,s,a),(n,{subPath:c})=>n.chownSync(c,s,a))}async renamePromise(r,s){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.renamePromise(r,s),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(s,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,f)}))}renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.renameSync(r,s),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(s,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,f)}))}async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&B0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&B0.constants.COPYFILE_EXCL&&await this.existsPromise(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await c.readFilePromise(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.copyFilePromise(r,s,a),async(c,{subPath:f})=>await n(this.baseFs,r,c,f)),async(c,{subPath:f})=>await this.makeCallPromise(s,async()=>await n(c,f,this.baseFs,s),async(p,{subPath:h})=>c!==p?await n(c,f,p,h):await c.copyFilePromise(f,h,a)))}copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&B0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&B0.constants.COPYFILE_EXCL&&this.existsSync(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=c.readFileSync(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.copyFileSync(r,s,a),(c,{subPath:f})=>n(this.baseFs,r,c,f)),(c,{subPath:f})=>this.makeCallSync(s,()=>n(c,f,this.baseFs,s),(p,{subPath:h})=>c!==p?n(c,f,p,h):c.copyFileSync(f,h,a)))}async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,s,a),async(n,{subPath:c})=>await n.appendFilePromise(c,s,a))}appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,s,a),(n,{subPath:c})=>n.appendFileSync(c,s,a))}async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,s,a),async(n,{subPath:c})=>await n.writeFilePromise(c,s,a))}writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,s,a),(n,{subPath:c})=>n.writeFileSync(c,s,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(s,{subPath:a})=>await s.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(s,{subPath:a})=>s.unlinkSync(a))}async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,s,a),async(n,{subPath:c})=>await n.utimesPromise(c,s,a))}utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,s,a),(n,{subPath:c})=>n.utimesSync(c,s,a))}async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,s,a),async(n,{subPath:c})=>await n.lutimesPromise(c,s,a))}lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,s,a),(n,{subPath:c})=>n.lutimesSync(c,s,a))}async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,s),async(a,{subPath:n})=>await a.mkdirPromise(n,s))}mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s),(a,{subPath:n})=>a.mkdirSync(n,s))}async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,s),async(a,{subPath:n})=>await a.rmdirPromise(n,s))}rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s),(a,{subPath:n})=>a.rmdirSync(n,s))}async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,s),async(a,{subPath:n})=>await a.rmPromise(n,s))}rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{subPath:n})=>a.rmSync(n,s))}async linkPromise(r,s){return await this.makeCallPromise(s,async()=>await this.baseFs.linkPromise(r,s),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=>await this.baseFs.symlinkPromise(r,s,a),async(n,{subPath:c})=>await n.symlinkPromise(r,c))}symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSync(r,s,a),(n,{subPath:c})=>n.symlinkSync(r,c))}async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,s),async(a,{subPath:n})=>await a.readFilePromise(n,s))}readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,s),(a,{subPath:n})=>a.readFileSync(n,s))}async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,s),async(a,{subPath:n})=>await a.readdirPromise(n,s),{requireSubpath:!1})}readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,s),(a,{subPath:n})=>a.readdirSync(n,s),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(s,{subPath:a})=>await s.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(s,{subPath:a})=>s.readlinkSync(a))}async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,s),async(a,{subPath:n})=>await a.truncatePromise(n,s))}truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,s),(a,{subPath:n})=>a.truncateSync(n,s))}async ftruncatePromise(r,s){if((r&ul)!==this.magic)return this.baseFs.ftruncatePromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("ftruncate");let[n,c]=a;return n.ftruncatePromise(c,s)}ftruncateSync(r,s){if((r&ul)!==this.magic)return this.baseFs.ftruncateSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Yo("ftruncateSync");let[n,c]=a;return n.ftruncateSync(c,s)}watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,{subPath:c})=>n.watch(c,s,a))}watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,s,a),()=>fE(this,r,s,a))}unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,s),()=>y0(this,r,s))}async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await s();let c=this.resolve(r),f=this.findMount(c);return f?n&&f.subPath==="/"?await s():await this.getMountPromise(f.archivePath,async p=>await a(p,f)):await s()}makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return s();let c=this.resolve(r),f=this.findMount(c);return!f||n&&f.subPath==="/"?s():this.getMountSync(f.archivePath,p=>a(p,f))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";for(;;){let a=r.substring(s.length),n=this.getMountPoint(a,s);if(!n)return null;if(s=this.pathUtils.join(s,n),!this.isMount.has(s)){if(this.notMount.has(s))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(s).mode&B0.constants.S_IFMT)!==this.typeCheck){this.notMount.add(s);continue}}catch{return null}this.isMount.add(s)}return{archivePath:s,subPath:this.pathUtils.join(wt.root,r.substring(s.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),a=s+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[c,{childFs:f,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||f.hasOpenFileHandles?.())){if(s>=p){f.saveAndClose?.(),this.mountInstances.delete(c),n-=1;continue}else if(r===null||n<=0){a=p;break}f.saveAndClose?.(),this.mountInstances.delete(c),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-s).unref())}async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await s(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await s(a)}finally{a.saveAndClose?.()}}}getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,s(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return s(a)}finally{a.saveAndClose?.()}}}}});var er,cx,WX=Ze(()=>{C0();cl();er=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),cx=class e extends Ip{static{this.instance=new e}constructor(){super(Y)}getExtractHint(){throw er()}getRealPath(){throw er()}resolve(){throw er()}async openPromise(){throw er()}openSync(){throw er()}async opendirPromise(){throw er()}opendirSync(){throw er()}async readPromise(){throw er()}readSync(){throw er()}async writePromise(){throw er()}writeSync(){throw er()}async closePromise(){throw er()}closeSync(){throw er()}createWriteStream(){throw er()}createReadStream(){throw er()}async realpathPromise(){throw er()}realpathSync(){throw er()}async readdirPromise(){throw er()}readdirSync(){throw er()}async existsPromise(t){throw er()}existsSync(t){throw er()}async accessPromise(){throw er()}accessSync(){throw er()}async statPromise(){throw er()}statSync(){throw er()}async fstatPromise(t){throw er()}fstatSync(t){throw er()}async lstatPromise(t){throw er()}lstatSync(t){throw er()}async fchmodPromise(){throw er()}fchmodSync(){throw er()}async chmodPromise(){throw er()}chmodSync(){throw er()}async fchownPromise(){throw er()}fchownSync(){throw er()}async chownPromise(){throw er()}chownSync(){throw er()}async mkdirPromise(){throw er()}mkdirSync(){throw er()}async rmdirPromise(){throw er()}rmdirSync(){throw er()}async rmPromise(){throw er()}rmSync(){throw er()}async linkPromise(){throw er()}linkSync(){throw er()}async symlinkPromise(){throw er()}symlinkSync(){throw er()}async renamePromise(){throw er()}renameSync(){throw er()}async copyFilePromise(){throw er()}copyFileSync(){throw er()}async appendFilePromise(){throw er()}appendFileSync(){throw er()}async writeFilePromise(){throw er()}writeFileSync(){throw er()}async unlinkPromise(){throw er()}unlinkSync(){throw er()}async utimesPromise(){throw er()}utimesSync(){throw er()}async lutimesPromise(){throw er()}lutimesSync(){throw er()}async readFilePromise(){throw er()}readFileSync(){throw er()}async readlinkPromise(){throw er()}readlinkSync(){throw er()}async truncatePromise(){throw er()}truncateSync(){throw er()}async ftruncatePromise(t,r){throw er()}ftruncateSync(t,r){throw er()}watch(){throw er()}watchFile(){throw er()}unwatchFile(){throw er()}}});var rd,VX=Ze(()=>{Cp();cl();rd=class extends Gs{constructor(t){super(Ae),this.baseFs=t}mapFromBase(t){return Ae.fromPortablePath(t)}mapToBase(t){return Ae.toPortablePath(t)}}});var p6e,CU,h6e,Eo,KX=Ze(()=>{w0();Cp();cl();p6e=/^[0-9]+$/,CU=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,h6e=/^([^/]+-)?[a-f0-9]+$/,Eo=class e extends Gs{static makeVirtualPath(t,r,s){if(Y.basename(t)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!Y.basename(r).match(h6e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=Y.relative(Y.dirname(t),s).split("/"),c=0;for(;c{wU=et(Ce("buffer")),JX=Ce("url"),zX=Ce("util");Cp();cl();ux=class extends Gs{constructor(t){super(Ae),this.baseFs=t}mapFromBase(t){return t}mapToBase(t){if(typeof t=="string")return t;if(t instanceof URL)return(0,JX.fileURLToPath)(t);if(Buffer.isBuffer(t)){let r=t.toString();if(!d6e(t,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,zX.inspect)(t)}`)}}});var r$,Wo,wp,nd,fx,Ax,pE,Tu,Ru,XX,$X,e$,t$,O2,n$=Ze(()=>{r$=Ce("readline"),Wo=Symbol("kBaseFs"),wp=Symbol("kFd"),nd=Symbol("kClosePromise"),fx=Symbol("kCloseResolve"),Ax=Symbol("kCloseReject"),pE=Symbol("kRefs"),Tu=Symbol("kRef"),Ru=Symbol("kUnref"),O2=class{constructor(t,r){this[t$]=1;this[e$]=void 0;this[$X]=void 0;this[XX]=void 0;this[Wo]=r,this[wp]=t}get fd(){return this[wp]}async appendFile(t,r){try{this[Tu](this.appendFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Wo].appendFilePromise(this.fd,t,s?{encoding:s}:void 0)}finally{this[Ru]()}}async chown(t,r){try{return this[Tu](this.chown),await this[Wo].fchownPromise(this.fd,t,r)}finally{this[Ru]()}}async chmod(t){try{return this[Tu](this.chmod),await this[Wo].fchmodPromise(this.fd,t)}finally{this[Ru]()}}createReadStream(t){return this[Wo].createReadStream(null,{...t,fd:this.fd})}createWriteStream(t){return this[Wo].createWriteStream(null,{...t,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(t,r,s,a){try{this[Tu](this.read);let n,c;return ArrayBuffer.isView(t)?typeof r=="object"&&r!==null?(n=t,c=r?.offset??0,s=r?.length??n.byteLength-c,a=r?.position??null):(n=t,c=r??0,s??=0):(n=t?.buffer??Buffer.alloc(16384),c=t?.offset??0,s=t?.length??n.byteLength-c,a=t?.position??null),s===0?{bytesRead:s,buffer:n}:{bytesRead:await this[Wo].readPromise(this.fd,Buffer.isBuffer(n)?n:Buffer.from(n.buffer,n.byteOffset,n.byteLength),c,s,a),buffer:n}}finally{this[Ru]()}}async readFile(t){try{this[Tu](this.readFile);let r=(typeof t=="string"?t:t?.encoding)??void 0;return await this[Wo].readFilePromise(this.fd,r)}finally{this[Ru]()}}readLines(t){return(0,r$.createInterface)({input:this.createReadStream(t),crlfDelay:1/0})}async stat(t){try{return this[Tu](this.stat),await this[Wo].fstatPromise(this.fd,t)}finally{this[Ru]()}}async truncate(t){try{return this[Tu](this.truncate),await this[Wo].ftruncatePromise(this.fd,t)}finally{this[Ru]()}}utimes(t,r){throw new Error("Method not implemented.")}async writeFile(t,r){try{this[Tu](this.writeFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;await this[Wo].writeFilePromise(this.fd,t,s)}finally{this[Ru]()}}async write(...t){try{if(this[Tu](this.write),ArrayBuffer.isView(t[0])){let[r,s,a,n]=t;return{bytesWritten:await this[Wo].writePromise(this.fd,r,s??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,s,a]=t;return{bytesWritten:await this[Wo].writePromise(this.fd,r,s,a),buffer:r}}}finally{this[Ru]()}}async writev(t,r){try{this[Tu](this.writev);let s=0;if(typeof r<"u")for(let a of t){let n=await this.write(a,void 0,void 0,r);s+=n.bytesWritten,r+=n.bytesWritten}else for(let a of t){let n=await this.write(a);s+=n.bytesWritten}return{buffers:t,bytesWritten:s}}finally{this[Ru]()}}readv(t,r){throw new Error("Method not implemented.")}close(){if(this[wp]===-1)return Promise.resolve();if(this[nd])return this[nd];if(this[pE]--,this[pE]===0){let t=this[wp];this[wp]=-1,this[nd]=this[Wo].closePromise(t).finally(()=>{this[nd]=void 0})}else this[nd]=new Promise((t,r)=>{this[fx]=t,this[Ax]=r}).finally(()=>{this[nd]=void 0,this[Ax]=void 0,this[fx]=void 0});return this[nd]}[(Wo,wp,t$=pE,e$=nd,$X=fx,XX=Ax,Tu)](t){if(this[wp]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=t.name,r}this[pE]++}[Ru](){if(this[pE]--,this[pE]===0){let t=this[wp];this[wp]=-1,this[Wo].closePromise(t).then(this[fx],this[Ax])}}}});function L2(e,t){t=new ux(t);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?.[hE.promisify.custom]<"u"&&(n[hE.promisify.custom]=c[hE.promisify.custom])};{r(e,"exists",(s,...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{t.existsPromise(s).then(f=>{c(f)},()=>{c(!1)})})}),r(e,"read",(...s)=>{let[a,n,c,f,p,h]=s;if(s.length<=3){let E={};s.length<3?h=s[1]:(E=s[1],h=s[2]),{buffer:n=Buffer.alloc(16384),offset:c=0,length:f=n.byteLength,position:p}=E}if(c==null&&(c=0),f|=0,f===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{t.readPromise(a,n,c,f,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let s of i$){let a=s.replace(/Promise$/,"");if(typeof e[a]>"u")continue;let n=t[s];if(typeof n>"u")continue;r(e,a,(...f)=>{let h=typeof f[f.length-1]=="function"?f.pop():()=>{};process.nextTick(()=>{n.apply(t,f).then(E=>{h(null,E)},E=>{h(E)})})})}e.realpath.native=e.realpath}{r(e,"existsSync",s=>{try{return t.existsSync(s)}catch{return!1}}),r(e,"readSync",(...s)=>{let[a,n,c,f,p]=s;return s.length<=3&&({offset:c=0,length:f=n.byteLength,position:p}=s[2]||{}),c==null&&(c=0),f|=0,f===0?0:(p==null&&(p=-1),t.readSync(a,n,c,f,p))});for(let s of g6e){let a=s;if(typeof e[a]>"u")continue;let n=t[s];typeof n>"u"||r(e,a,n.bind(t))}e.realpathSync.native=e.realpathSync}{let s=e.promises;for(let a of i$){let n=a.replace(/Promise$/,"");if(typeof s[n]>"u")continue;let c=t[a];typeof c>"u"||a!=="open"&&r(s,n,(f,...p)=>f instanceof O2?f[n].apply(f,p):c.call(t,f,...p))}r(s,"open",async(...a)=>{let n=await t.openPromise(...a);return new O2(n,t)})}e.read[hE.promisify.custom]=async(s,a,...n)=>({bytesRead:await t.readPromise(s,a,...n),buffer:a}),e.write[hE.promisify.custom]=async(s,a,...n)=>({bytesWritten:await t.writePromise(s,a,...n),buffer:a})}function px(e,t){let r=Object.create(e);return L2(r,t),r}var hE,g6e,i$,s$=Ze(()=>{hE=Ce("util");ZX();n$();g6e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),i$=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function o$(e){let t=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${e}${t}`}function a$(){if(BU)return BU;let e=Ae.toPortablePath(l$.default.tmpdir()),t=ae.realpathSync(e);return process.once("exit",()=>{ae.rmtempSync()}),BU={tmpdir:e,realTmpdir:t}}var l$,Fu,BU,ae,c$=Ze(()=>{l$=et(Ce("os"));w0();cl();Fu=new Set,BU=null;ae=Object.assign(new Kn,{detachTemp(e){Fu.delete(e)},mktempSync(e){let{tmpdir:t,realTmpdir:r}=a$();for(;;){let s=o$("xfs-");try{this.mkdirSync(Y.join(t,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=Y.join(r,s);if(Fu.add(a),typeof e>"u")return a;try{return e(a)}finally{if(Fu.has(a)){Fu.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(e){let{tmpdir:t,realTmpdir:r}=a$();for(;;){let s=o$("xfs-");try{await this.mkdirPromise(Y.join(t,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=Y.join(r,s);if(Fu.add(a),typeof e>"u")return a;try{return await e(a)}finally{if(Fu.has(a)){Fu.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Fu.values()).map(async e=>{try{await ae.removePromise(e,{maxRetries:0}),Fu.delete(e)}catch{}}))},rmtempSync(){for(let e of Fu)try{ae.removeSync(e),Fu.delete(e)}catch{}}})});var M2={};Vt(M2,{AliasFS:()=>Gf,BasePortableFakeFS:()=>jf,CustomDir:()=>N2,CwdFS:()=>Pn,FakeFS:()=>Ip,Filename:()=>yr,JailFS:()=>qf,LazyFS:()=>AE,MountFS:()=>td,NoFS:()=>cx,NodeFS:()=>Kn,PortablePath:()=>wt,PosixFS:()=>rd,ProxiedFS:()=>Gs,VirtualFS:()=>Eo,constants:()=>pi,errors:()=>or,extendFs:()=>px,normalizeLineEndings:()=>I0,npath:()=>Ae,opendir:()=>ox,patchFs:()=>L2,ppath:()=>Y,setupCopyIndex:()=>sx,statUtils:()=>ll,unwatchAllFiles:()=>E0,unwatchFile:()=>y0,watchFile:()=>fE,xfs:()=>ae});var bt=Ze(()=>{bX();rx();gU();EU();TX();IU();C0();cl();cl();MX();C0();HX();GX();qX();YX();WX();w0();VX();Cp();KX();s$();c$()});var h$=G((BPt,p$)=>{p$.exports=A$;A$.sync=y6e;var u$=Ce("fs");function m6e(e,t){var r=t.pathExt!==void 0?t.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var s=0;s{y$.exports=g$;g$.sync=E6e;var d$=Ce("fs");function g$(e,t,r){d$.stat(e,function(s,a){r(s,s?!1:m$(a,t))})}function E6e(e,t){return m$(d$.statSync(e),t)}function m$(e,t){return e.isFile()&&I6e(e,t)}function I6e(e,t){var r=e.mode,s=e.uid,a=e.gid,n=t.uid!==void 0?t.uid:process.getuid&&process.getuid(),c=t.gid!==void 0?t.gid:process.getgid&&process.getgid(),f=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=f|p,C=r&h||r&p&&a===c||r&f&&s===n||r&E&&n===0;return C}});var C$=G((bPt,I$)=>{var SPt=Ce("fs"),hx;process.platform==="win32"||global.TESTING_WINDOWS?hx=h$():hx=E$();I$.exports=vU;vU.sync=C6e;function vU(e,t,r){if(typeof t=="function"&&(r=t,t={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(s,a){vU(e,t||{},function(n,c){n?a(n):s(c)})})}hx(e,t||{},function(s,a){s&&(s.code==="EACCES"||t&&t.ignoreErrors)&&(s=null,a=!1),r(s,a)})}function C6e(e,t){try{return hx.sync(e,t||{})}catch(r){if(t&&t.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var P$=G((DPt,D$)=>{var dE=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",w$=Ce("path"),w6e=dE?";":":",B$=C$(),v$=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),S$=(e,t)=>{let r=t.colon||w6e,s=e.match(/\//)||dE&&e.match(/\\/)?[""]:[...dE?[process.cwd()]:[],...(t.path||process.env.PATH||"").split(r)],a=dE?t.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=dE?a.split(r):[""];return dE&&e.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:s,pathExt:n,pathExtExe:a}},b$=(e,t,r)=>{typeof t=="function"&&(r=t,t={}),t||(t={});let{pathEnv:s,pathExt:a,pathExtExe:n}=S$(e,t),c=[],f=h=>new Promise((E,C)=>{if(h===s.length)return t.all&&c.length?E(c):C(v$(e));let S=s[h],x=/^".*"$/.test(S)?S.slice(1,-1):S,I=w$.join(x,e),R=!x&&/^\.[\\\/]/.test(e)?e.slice(0,2)+I:I;E(p(R,h,0))}),p=(h,E,C)=>new Promise((S,x)=>{if(C===a.length)return S(f(E+1));let I=a[C];B$(h+I,{pathExt:n},(R,N)=>{if(!R&&N)if(t.all)c.push(h+I);else return S(h+I);return S(p(h,E,C+1))})});return r?f(0).then(h=>r(null,h),r):f(0)},B6e=(e,t)=>{t=t||{};let{pathEnv:r,pathExt:s,pathExtExe:a}=S$(e,t),n=[];for(let c=0;c{"use strict";var x$=(e={})=>{let t=e.env||process.env;return(e.platform||process.platform)!=="win32"?"PATH":Object.keys(t).reverse().find(s=>s.toUpperCase()==="PATH")||"Path"};SU.exports=x$;SU.exports.default=x$});var F$=G((xPt,R$)=>{"use strict";var Q$=Ce("path"),v6e=P$(),S6e=k$();function T$(e,t){let r=e.options.env||process.env,s=process.cwd(),a=e.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(e.options.cwd)}catch{}let c;try{c=v6e.sync(e.command,{path:r[S6e({env:r})],pathExt:t?Q$.delimiter:void 0})}catch{}finally{n&&process.chdir(s)}return c&&(c=Q$.resolve(a?e.options.cwd:"",c)),c}function b6e(e){return T$(e)||T$(e,!0)}R$.exports=b6e});var N$=G((kPt,DU)=>{"use strict";var bU=/([()\][%!^"`<>&|;, *?])/g;function D6e(e){return e=e.replace(bU,"^$1"),e}function P6e(e,t){return e=`${e}`,e=e.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),e=e.replace(/(?=(\\+?)?)\1$/,"$1$1"),e=`"${e}"`,e=e.replace(bU,"^$1"),t&&(e=e.replace(bU,"^$1")),e}DU.exports.command=D6e;DU.exports.argument=P6e});var L$=G((QPt,O$)=>{"use strict";O$.exports=/^#!(.*)/});var U$=G((TPt,M$)=>{"use strict";var x6e=L$();M$.exports=(e="")=>{let t=e.match(x6e);if(!t)return null;let[r,s]=t[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?s:s?`${a} ${s}`:a}});var H$=G((RPt,_$)=>{"use strict";var PU=Ce("fs"),k6e=U$();function Q6e(e){let r=Buffer.alloc(150),s;try{s=PU.openSync(e,"r"),PU.readSync(s,r,0,150,0),PU.closeSync(s)}catch{}return k6e(r.toString())}_$.exports=Q6e});var Y$=G((FPt,q$)=>{"use strict";var T6e=Ce("path"),j$=F$(),G$=N$(),R6e=H$(),F6e=process.platform==="win32",N6e=/\.(?:com|exe)$/i,O6e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function L6e(e){e.file=j$(e);let t=e.file&&R6e(e.file);return t?(e.args.unshift(e.file),e.command=t,j$(e)):e.file}function M6e(e){if(!F6e)return e;let t=L6e(e),r=!N6e.test(t);if(e.options.forceShell||r){let s=O6e.test(t);e.command=T6e.normalize(e.command),e.command=G$.command(e.command),e.args=e.args.map(n=>G$.argument(n,s));let a=[e.command].concat(e.args).join(" ");e.args=["/d","/s","/c",`"${a}"`],e.command=process.env.comspec||"cmd.exe",e.options.windowsVerbatimArguments=!0}return e}function U6e(e,t,r){t&&!Array.isArray(t)&&(r=t,t=null),t=t?t.slice(0):[],r=Object.assign({},r);let s={command:e,args:t,options:r,file:void 0,original:{command:e,args:t}};return r.shell?s:M6e(s)}q$.exports=U6e});var K$=G((NPt,V$)=>{"use strict";var xU=process.platform==="win32";function kU(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function _6e(e,t){if(!xU)return;let r=e.emit;e.emit=function(s,a){if(s==="exit"){let n=W$(a,t);if(n)return r.call(e,"error",n)}return r.apply(e,arguments)}}function W$(e,t){return xU&&e===1&&!t.file?kU(t.original,"spawn"):null}function H6e(e,t){return xU&&e===1&&!t.file?kU(t.original,"spawnSync"):null}V$.exports={hookChildProcess:_6e,verifyENOENT:W$,verifyENOENTSync:H6e,notFoundError:kU}});var RU=G((OPt,gE)=>{"use strict";var J$=Ce("child_process"),QU=Y$(),TU=K$();function z$(e,t,r){let s=QU(e,t,r),a=J$.spawn(s.command,s.args,s.options);return TU.hookChildProcess(a,s),a}function j6e(e,t,r){let s=QU(e,t,r),a=J$.spawnSync(s.command,s.args,s.options);return a.error=a.error||TU.verifyENOENTSync(a.status,s),a}gE.exports=z$;gE.exports.spawn=z$;gE.exports.sync=j6e;gE.exports._parse=QU;gE.exports._enoent=TU});var X$=G((LPt,Z$)=>{"use strict";function G6e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function v0(e,t,r,s){this.message=e,this.expected=t,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,v0)}G6e(v0,Error);v0.buildMessage=function(e,t){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C>",D=ur(">>",!1),y=">&",F=ur(">&",!1),z=">",Z=ur(">",!1),ee="<<<",se=ur("<<<",!1),xe="<&",Ne=ur("<&",!1),ut="<",Ct=ur("<",!1),Yt=function(O){return{type:"argument",segments:[].concat(...O)}},ir=function(O){return O},Pt="$'",mn=ur("$'",!1),Pr="'",Cr=ur("'",!1),Lr=function(O){return[{type:"text",text:O}]},on='""',ci=ur('""',!1),Do=function(){return{type:"text",text:""}},is='"',ao=ur('"',!1),Po=function(O){return O},ji=function(O){return{type:"arithmetic",arithmetic:O,quoted:!0}},lo=function(O){return{type:"shell",shell:O,quoted:!0}},xo=function(O){return{type:"variable",...O,quoted:!0}},FA=function(O){return{type:"text",text:O}},df=function(O){return{type:"arithmetic",arithmetic:O,quoted:!1}},mh=function(O){return{type:"shell",shell:O,quoted:!1}},yh=function(O){return{type:"variable",...O,quoted:!1}},co=function(O){return{type:"glob",pattern:O}},qn=/^[^']/,Ns=zi(["'"],!0,!1),uo=function(O){return O.join("")},ou=/^[^$"]/,au=zi(["$",'"'],!0,!1),lu=`\\ +`,NA=ur(`\\ +`,!1),OA=function(){return""},Aa="\\",pa=ur("\\",!1),LA=/^[\\$"`]/,gr=zi(["\\","$",'"',"`"],!1,!1),ko=function(O){return O},qa="\\a",Ue=ur("\\a",!1),wr=function(){return"a"},gf="\\b",MA=ur("\\b",!1),UA=function(){return"\b"},cu=/^[Ee]/,uu=zi(["E","e"],!1,!1),cc=function(){return"\x1B"},we="\\f",Ot=ur("\\f",!1),uc=function(){return"\f"},Oi="\\n",fo=ur("\\n",!1),Rt=function(){return` +`},Tn="\\r",ha=ur("\\r",!1),Gi=function(){return"\r"},Li="\\t",Ya=ur("\\t",!1),yn=function(){return" "},Xn="\\v",fu=ur("\\v",!1),Eh=function(){return"\v"},Wa=/^[\\'"?]/,Va=zi(["\\","'",'"',"?"],!1,!1),Ka=function(O){return String.fromCharCode(parseInt(O,16))},$e="\\x",Ja=ur("\\x",!1),mf="\\u",fc=ur("\\u",!1),Sn="\\U",da=ur("\\U",!1),_A=function(O){return String.fromCodePoint(parseInt(O,16))},HA=/^[0-7]/,ga=zi([["0","7"]],!1,!1),Ql=/^[0-9a-fA-f]/,Ut=zi([["0","9"],["a","f"],["A","f"]],!1,!1),Rn=Cf(),ma="{}",za=ur("{}",!1),ss=function(){return"{}"},Ac="-",Au=ur("-",!1),pc="+",Za=ur("+",!1),Mi=".",vs=ur(".",!1),Tl=function(O,J,re){return{type:"number",value:(O==="-"?-1:1)*parseFloat(J.join("")+"."+re.join(""))}},yf=function(O,J){return{type:"number",value:(O==="-"?-1:1)*parseInt(J.join(""))}},hc=function(O){return{type:"variable",...O}},vi=function(O){return{type:"variable",name:O}},Fn=function(O){return O},dc="*",ze=ur("*",!1),at="/",St=ur("/",!1),lr=function(O,J,re){return{type:J==="*"?"multiplication":"division",right:re}},te=function(O,J){return J.reduce((re,de)=>({left:re,...de}),O)},Ee=function(O,J,re){return{type:J==="+"?"addition":"subtraction",right:re}},Oe="$((",mt=ur("$((",!1),Et="))",Dt=ur("))",!1),tr=function(O){return O},pn="$(",ui=ur("$(",!1),qi=function(O){return O},Nn="${",Xa=ur("${",!1),By=":-",z1=ur(":-",!1),Qo=function(O,J){return{name:O,defaultValue:J}},vy=":-}",Ih=ur(":-}",!1),Z1=function(O){return{name:O,defaultValue:[]}},To=":+",Ch=ur(":+",!1),wh=function(O,J){return{name:O,alternativeValue:J}},pu=":+}",Bh=ur(":+}",!1),Ng=function(O){return{name:O,alternativeValue:[]}},Og=function(O){return{name:O}},Lg="$",Sy=ur("$",!1),Ef=function(O){return t.isGlobPattern(O)},Ro=function(O){return O},Rl=/^[a-zA-Z0-9_]/,vh=zi([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Mg=function(){return xy()},Fl=/^[$@*?#a-zA-Z0-9_\-]/,Nl=zi(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),by=/^[()}<>$|&; \t"']/,jA=zi(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Dy=/^[<>&; \t"']/,Py=zi(["<",">","&",";"," "," ",'"',"'"],!1,!1),GA=/^[ \t]/,qA=zi([" "," "],!1,!1),W=0,xt=0,YA=[{line:1,column:1}],Fo=0,If=[],yt=0,hu;if("startRule"in t){if(!(t.startRule in s))throw new Error(`Can't start parsing from rule "`+t.startRule+'".');a=s[t.startRule]}function xy(){return e.substring(xt,W)}function Ug(){return wf(xt,W)}function X1(O,J){throw J=J!==void 0?J:wf(xt,W),WA([_g(O)],e.substring(xt,W),J)}function Sh(O,J){throw J=J!==void 0?J:wf(xt,W),mi(O,J)}function ur(O,J){return{type:"literal",text:O,ignoreCase:J}}function zi(O,J,re){return{type:"class",parts:O,inverted:J,ignoreCase:re}}function Cf(){return{type:"any"}}function $a(){return{type:"end"}}function _g(O){return{type:"other",description:O}}function du(O){var J=YA[O],re;if(J)return J;for(re=O-1;!YA[re];)re--;for(J=YA[re],J={line:J.line,column:J.column};reFo&&(Fo=W,If=[]),If.push(O))}function mi(O,J){return new v0(O,null,null,J)}function WA(O,J,re){return new v0(v0.buildMessage(O,J),O,J,re)}function el(){var O,J,re;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(re=ya(),re===r&&(re=null),re!==r?(xt=O,J=n(re),O=J):(W=O,O=r)):(W=O,O=r),O}function ya(){var O,J,re,de,Ke;if(O=W,J=bh(),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=Hg(),de!==r?(Ke=tl(),Ke===r&&(Ke=null),Ke!==r?(xt=O,J=c(J,de,Ke),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)}else W=O,O=r;if(O===r)if(O=W,J=bh(),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=Hg(),de===r&&(de=null),de!==r?(xt=O,J=f(J,de),O=J):(W=O,O=r)):(W=O,O=r)}else W=O,O=r;return O}function tl(){var O,J,re,de,Ke;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=ya(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=p(re),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r;return O}function Hg(){var O;return e.charCodeAt(W)===59?(O=h,W++):(O=r,yt===0&&Bt(E)),O===r&&(e.charCodeAt(W)===38?(O=C,W++):(O=r,yt===0&&Bt(S))),O}function bh(){var O,J,re;return O=W,J=VA(),J!==r?(re=jg(),re===r&&(re=null),re!==r?(xt=O,J=x(J,re),O=J):(W=O,O=r)):(W=O,O=r),O}function jg(){var O,J,re,de,Ke,pt,mr;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=ky(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=bh(),Ke!==r){for(pt=[],mr=kt();mr!==r;)pt.push(mr),mr=kt();pt!==r?(xt=O,J=I(re,Ke),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r;return O}function ky(){var O;return e.substr(W,2)===R?(O=R,W+=2):(O=r,yt===0&&Bt(N)),O===r&&(e.substr(W,2)===U?(O=U,W+=2):(O=r,yt===0&&Bt(K))),O}function VA(){var O,J,re;return O=W,J=Bf(),J!==r?(re=Gg(),re===r&&(re=null),re!==r?(xt=O,J=$(J,re),O=J):(W=O,O=r)):(W=O,O=r),O}function Gg(){var O,J,re,de,Ke,pt,mr;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=gu(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=VA(),Ke!==r){for(pt=[],mr=kt();mr!==r;)pt.push(mr),mr=kt();pt!==r?(xt=O,J=ie(re,Ke),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r;return O}function gu(){var O;return e.substr(W,2)===fe?(O=fe,W+=2):(O=r,yt===0&&Bt(le)),O===r&&(e.charCodeAt(W)===124?(O=ge,W++):(O=r,yt===0&&Bt(pe))),O}function mu(){var O,J,re,de,Ke,pt;if(O=W,J=xh(),J!==r)if(e.charCodeAt(W)===61?(re=De,W++):(re=r,yt===0&&Bt(ye)),re!==r)if(de=KA(),de!==r){for(Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();Ke!==r?(xt=O,J=d(J,de),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r;else W=O,O=r;if(O===r)if(O=W,J=xh(),J!==r)if(e.charCodeAt(W)===61?(re=De,W++):(re=r,yt===0&&Bt(ye)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=ve(J),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r;return O}function Bf(){var O,J,re,de,Ke,pt,mr,vr,Hn,yi,Ss;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(e.charCodeAt(W)===40?(re=Ie,W++):(re=r,yt===0&&Bt(me)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=ya(),Ke!==r){for(pt=[],mr=kt();mr!==r;)pt.push(mr),mr=kt();if(pt!==r)if(e.charCodeAt(W)===41?(mr=ce,W++):(mr=r,yt===0&&Bt(X)),mr!==r){for(vr=[],Hn=kt();Hn!==r;)vr.push(Hn),Hn=kt();if(vr!==r){for(Hn=[],yi=Yn();yi!==r;)Hn.push(yi),yi=Yn();if(Hn!==r){for(yi=[],Ss=kt();Ss!==r;)yi.push(Ss),Ss=kt();yi!==r?(xt=O,J=be(Ke,Hn),O=J):(W=O,O=r)}else W=O,O=r}else W=O,O=r}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r;if(O===r){for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(e.charCodeAt(W)===123?(re=ke,W++):(re=r,yt===0&&Bt(it)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=ya(),Ke!==r){for(pt=[],mr=kt();mr!==r;)pt.push(mr),mr=kt();if(pt!==r)if(e.charCodeAt(W)===125?(mr=_,W++):(mr=r,yt===0&&Bt(tt)),mr!==r){for(vr=[],Hn=kt();Hn!==r;)vr.push(Hn),Hn=kt();if(vr!==r){for(Hn=[],yi=Yn();yi!==r;)Hn.push(yi),yi=Yn();if(Hn!==r){for(yi=[],Ss=kt();Ss!==r;)yi.push(Ss),Ss=kt();yi!==r?(xt=O,J=Fe(Ke,Hn),O=J):(W=O,O=r)}else W=O,O=r}else W=O,O=r}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r}else W=O,O=r;else W=O,O=r;if(O===r){for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){for(re=[],de=mu();de!==r;)re.push(de),de=mu();if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r){if(Ke=[],pt=yu(),pt!==r)for(;pt!==r;)Ke.push(pt),pt=yu();else Ke=r;if(Ke!==r){for(pt=[],mr=kt();mr!==r;)pt.push(mr),mr=kt();pt!==r?(xt=O,J=Qe(re,Ke),O=J):(W=O,O=r)}else W=O,O=r}else W=O,O=r}else W=O,O=r}else W=O,O=r;if(O===r){for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){if(re=[],de=mu(),de!==r)for(;de!==r;)re.push(de),de=mu();else re=r;if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=Se(re),O=J):(W=O,O=r)}else W=O,O=r}else W=O,O=r}}}return O}function Os(){var O,J,re,de,Ke;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){if(re=[],de=xi(),de!==r)for(;de!==r;)re.push(de),de=xi();else re=r;if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=je(re),O=J):(W=O,O=r)}else W=O,O=r}else W=O,O=r;return O}function yu(){var O,J,re;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r?(re=Yn(),re!==r?(xt=O,J=Te(re),O=J):(W=O,O=r)):(W=O,O=r),O===r){for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();J!==r?(re=xi(),re!==r?(xt=O,J=Te(re),O=J):(W=O,O=r)):(W=O,O=r)}return O}function Yn(){var O,J,re,de,Ke;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(ct.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Me)),re===r&&(re=null),re!==r?(de=os(),de!==r?(Ke=xi(),Ke!==r?(xt=O,J=P(re,de,Ke),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O}function os(){var O;return e.substr(W,2)===w?(O=w,W+=2):(O=r,yt===0&&Bt(D)),O===r&&(e.substr(W,2)===y?(O=y,W+=2):(O=r,yt===0&&Bt(F)),O===r&&(e.charCodeAt(W)===62?(O=z,W++):(O=r,yt===0&&Bt(Z)),O===r&&(e.substr(W,3)===ee?(O=ee,W+=3):(O=r,yt===0&&Bt(se)),O===r&&(e.substr(W,2)===xe?(O=xe,W+=2):(O=r,yt===0&&Bt(Ne)),O===r&&(e.charCodeAt(W)===60?(O=ut,W++):(O=r,yt===0&&Bt(Ct))))))),O}function xi(){var O,J,re;for(O=W,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(re=KA(),re!==r?(xt=O,J=Te(re),O=J):(W=O,O=r)):(W=O,O=r),O}function KA(){var O,J,re;if(O=W,J=[],re=vf(),re!==r)for(;re!==r;)J.push(re),re=vf();else J=r;return J!==r&&(xt=O,J=Yt(J)),O=J,O}function vf(){var O,J;return O=W,J=En(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=W,J=qg(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=W,J=Yg(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=W,J=as(),J!==r&&(xt=O,J=ir(J)),O=J))),O}function En(){var O,J,re,de;return O=W,e.substr(W,2)===Pt?(J=Pt,W+=2):(J=r,yt===0&&Bt(mn)),J!==r?(re=In(),re!==r?(e.charCodeAt(W)===39?(de=Pr,W++):(de=r,yt===0&&Bt(Cr)),de!==r?(xt=O,J=Lr(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O}function qg(){var O,J,re,de;return O=W,e.charCodeAt(W)===39?(J=Pr,W++):(J=r,yt===0&&Bt(Cr)),J!==r?(re=Sf(),re!==r?(e.charCodeAt(W)===39?(de=Pr,W++):(de=r,yt===0&&Bt(Cr)),de!==r?(xt=O,J=Lr(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O}function Yg(){var O,J,re,de;if(O=W,e.substr(W,2)===on?(J=on,W+=2):(J=r,yt===0&&Bt(ci)),J!==r&&(xt=O,J=Do()),O=J,O===r)if(O=W,e.charCodeAt(W)===34?(J=is,W++):(J=r,yt===0&&Bt(ao)),J!==r){for(re=[],de=Ol();de!==r;)re.push(de),de=Ol();re!==r?(e.charCodeAt(W)===34?(de=is,W++):(de=r,yt===0&&Bt(ao)),de!==r?(xt=O,J=Po(re),O=J):(W=O,O=r)):(W=O,O=r)}else W=O,O=r;return O}function as(){var O,J,re;if(O=W,J=[],re=No(),re!==r)for(;re!==r;)J.push(re),re=No();else J=r;return J!==r&&(xt=O,J=Po(J)),O=J,O}function Ol(){var O,J;return O=W,J=$r(),J!==r&&(xt=O,J=ji(J)),O=J,O===r&&(O=W,J=Ph(),J!==r&&(xt=O,J=lo(J)),O=J,O===r&&(O=W,J=zA(),J!==r&&(xt=O,J=xo(J)),O=J,O===r&&(O=W,J=bf(),J!==r&&(xt=O,J=FA(J)),O=J))),O}function No(){var O,J;return O=W,J=$r(),J!==r&&(xt=O,J=df(J)),O=J,O===r&&(O=W,J=Ph(),J!==r&&(xt=O,J=mh(J)),O=J,O===r&&(O=W,J=zA(),J!==r&&(xt=O,J=yh(J)),O=J,O===r&&(O=W,J=Qy(),J!==r&&(xt=O,J=co(J)),O=J,O===r&&(O=W,J=Dh(),J!==r&&(xt=O,J=FA(J)),O=J)))),O}function Sf(){var O,J,re;for(O=W,J=[],qn.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Ns));re!==r;)J.push(re),qn.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Ns));return J!==r&&(xt=O,J=uo(J)),O=J,O}function bf(){var O,J,re;if(O=W,J=[],re=Ll(),re===r&&(ou.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(au))),re!==r)for(;re!==r;)J.push(re),re=Ll(),re===r&&(ou.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(au)));else J=r;return J!==r&&(xt=O,J=uo(J)),O=J,O}function Ll(){var O,J,re;return O=W,e.substr(W,2)===lu?(J=lu,W+=2):(J=r,yt===0&&Bt(NA)),J!==r&&(xt=O,J=OA()),O=J,O===r&&(O=W,e.charCodeAt(W)===92?(J=Aa,W++):(J=r,yt===0&&Bt(pa)),J!==r?(LA.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(gr)),re!==r?(xt=O,J=ko(re),O=J):(W=O,O=r)):(W=O,O=r)),O}function In(){var O,J,re;for(O=W,J=[],re=Oo(),re===r&&(qn.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Ns)));re!==r;)J.push(re),re=Oo(),re===r&&(qn.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Ns)));return J!==r&&(xt=O,J=uo(J)),O=J,O}function Oo(){var O,J,re;return O=W,e.substr(W,2)===qa?(J=qa,W+=2):(J=r,yt===0&&Bt(Ue)),J!==r&&(xt=O,J=wr()),O=J,O===r&&(O=W,e.substr(W,2)===gf?(J=gf,W+=2):(J=r,yt===0&&Bt(MA)),J!==r&&(xt=O,J=UA()),O=J,O===r&&(O=W,e.charCodeAt(W)===92?(J=Aa,W++):(J=r,yt===0&&Bt(pa)),J!==r?(cu.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(uu)),re!==r?(xt=O,J=cc(),O=J):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===we?(J=we,W+=2):(J=r,yt===0&&Bt(Ot)),J!==r&&(xt=O,J=uc()),O=J,O===r&&(O=W,e.substr(W,2)===Oi?(J=Oi,W+=2):(J=r,yt===0&&Bt(fo)),J!==r&&(xt=O,J=Rt()),O=J,O===r&&(O=W,e.substr(W,2)===Tn?(J=Tn,W+=2):(J=r,yt===0&&Bt(ha)),J!==r&&(xt=O,J=Gi()),O=J,O===r&&(O=W,e.substr(W,2)===Li?(J=Li,W+=2):(J=r,yt===0&&Bt(Ya)),J!==r&&(xt=O,J=yn()),O=J,O===r&&(O=W,e.substr(W,2)===Xn?(J=Xn,W+=2):(J=r,yt===0&&Bt(fu)),J!==r&&(xt=O,J=Eh()),O=J,O===r&&(O=W,e.charCodeAt(W)===92?(J=Aa,W++):(J=r,yt===0&&Bt(pa)),J!==r?(Wa.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Va)),re!==r?(xt=O,J=ko(re),O=J):(W=O,O=r)):(W=O,O=r),O===r&&(O=Eu()))))))))),O}function Eu(){var O,J,re,de,Ke,pt,mr,vr,Hn,yi,Ss,ZA;return O=W,e.charCodeAt(W)===92?(J=Aa,W++):(J=r,yt===0&&Bt(pa)),J!==r?(re=Ea(),re!==r?(xt=O,J=Ka(re),O=J):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===$e?(J=$e,W+=2):(J=r,yt===0&&Bt(Ja)),J!==r?(re=W,de=W,Ke=Ea(),Ke!==r?(pt=Ls(),pt!==r?(Ke=[Ke,pt],de=Ke):(W=de,de=r)):(W=de,de=r),de===r&&(de=Ea()),de!==r?re=e.substring(re,W):re=de,re!==r?(xt=O,J=Ka(re),O=J):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===mf?(J=mf,W+=2):(J=r,yt===0&&Bt(fc)),J!==r?(re=W,de=W,Ke=Ls(),Ke!==r?(pt=Ls(),pt!==r?(mr=Ls(),mr!==r?(vr=Ls(),vr!==r?(Ke=[Ke,pt,mr,vr],de=Ke):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r),de!==r?re=e.substring(re,W):re=de,re!==r?(xt=O,J=Ka(re),O=J):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===Sn?(J=Sn,W+=2):(J=r,yt===0&&Bt(da)),J!==r?(re=W,de=W,Ke=Ls(),Ke!==r?(pt=Ls(),pt!==r?(mr=Ls(),mr!==r?(vr=Ls(),vr!==r?(Hn=Ls(),Hn!==r?(yi=Ls(),yi!==r?(Ss=Ls(),Ss!==r?(ZA=Ls(),ZA!==r?(Ke=[Ke,pt,mr,vr,Hn,yi,Ss,ZA],de=Ke):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r)):(W=de,de=r),de!==r?re=e.substring(re,W):re=de,re!==r?(xt=O,J=_A(re),O=J):(W=O,O=r)):(W=O,O=r)))),O}function Ea(){var O;return HA.test(e.charAt(W))?(O=e.charAt(W),W++):(O=r,yt===0&&Bt(ga)),O}function Ls(){var O;return Ql.test(e.charAt(W))?(O=e.charAt(W),W++):(O=r,yt===0&&Bt(Ut)),O}function Dh(){var O,J,re,de,Ke;if(O=W,J=[],re=W,e.charCodeAt(W)===92?(de=Aa,W++):(de=r,yt===0&&Bt(pa)),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,e.substr(W,2)===ma?(de=ma,W+=2):(de=r,yt===0&&Bt(za)),de!==r&&(xt=re,de=ss()),re=de,re===r&&(re=W,de=W,yt++,Ke=Ty(),yt--,Ke===r?de=void 0:(W=de,de=r),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r))),re!==r)for(;re!==r;)J.push(re),re=W,e.charCodeAt(W)===92?(de=Aa,W++):(de=r,yt===0&&Bt(pa)),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,e.substr(W,2)===ma?(de=ma,W+=2):(de=r,yt===0&&Bt(za)),de!==r&&(xt=re,de=ss()),re=de,re===r&&(re=W,de=W,yt++,Ke=Ty(),yt--,Ke===r?de=void 0:(W=de,de=r),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r)));else J=r;return J!==r&&(xt=O,J=uo(J)),O=J,O}function JA(){var O,J,re,de,Ke,pt;if(O=W,e.charCodeAt(W)===45?(J=Ac,W++):(J=r,yt===0&&Bt(Au)),J===r&&(e.charCodeAt(W)===43?(J=pc,W++):(J=r,yt===0&&Bt(Za))),J===r&&(J=null),J!==r){if(re=[],ct.test(e.charAt(W))?(de=e.charAt(W),W++):(de=r,yt===0&&Bt(Me)),de!==r)for(;de!==r;)re.push(de),ct.test(e.charAt(W))?(de=e.charAt(W),W++):(de=r,yt===0&&Bt(Me));else re=r;if(re!==r)if(e.charCodeAt(W)===46?(de=Mi,W++):(de=r,yt===0&&Bt(vs)),de!==r){if(Ke=[],ct.test(e.charAt(W))?(pt=e.charAt(W),W++):(pt=r,yt===0&&Bt(Me)),pt!==r)for(;pt!==r;)Ke.push(pt),ct.test(e.charAt(W))?(pt=e.charAt(W),W++):(pt=r,yt===0&&Bt(Me));else Ke=r;Ke!==r?(xt=O,J=Tl(J,re,Ke),O=J):(W=O,O=r)}else W=O,O=r;else W=O,O=r}else W=O,O=r;if(O===r){if(O=W,e.charCodeAt(W)===45?(J=Ac,W++):(J=r,yt===0&&Bt(Au)),J===r&&(e.charCodeAt(W)===43?(J=pc,W++):(J=r,yt===0&&Bt(Za))),J===r&&(J=null),J!==r){if(re=[],ct.test(e.charAt(W))?(de=e.charAt(W),W++):(de=r,yt===0&&Bt(Me)),de!==r)for(;de!==r;)re.push(de),ct.test(e.charAt(W))?(de=e.charAt(W),W++):(de=r,yt===0&&Bt(Me));else re=r;re!==r?(xt=O,J=yf(J,re),O=J):(W=O,O=r)}else W=O,O=r;if(O===r&&(O=W,J=zA(),J!==r&&(xt=O,J=hc(J)),O=J,O===r&&(O=W,J=gc(),J!==r&&(xt=O,J=vi(J)),O=J,O===r)))if(O=W,e.charCodeAt(W)===40?(J=Ie,W++):(J=r,yt===0&&Bt(me)),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=Ao(),de!==r){for(Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();Ke!==r?(e.charCodeAt(W)===41?(pt=ce,W++):(pt=r,yt===0&&Bt(X)),pt!==r?(xt=O,J=Fn(de),O=J):(W=O,O=r)):(W=O,O=r)}else W=O,O=r;else W=O,O=r}else W=O,O=r}return O}function Df(){var O,J,re,de,Ke,pt,mr,vr;if(O=W,J=JA(),J!==r){for(re=[],de=W,Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();if(Ke!==r)if(e.charCodeAt(W)===42?(pt=dc,W++):(pt=r,yt===0&&Bt(ze)),pt===r&&(e.charCodeAt(W)===47?(pt=at,W++):(pt=r,yt===0&&Bt(St))),pt!==r){for(mr=[],vr=kt();vr!==r;)mr.push(vr),vr=kt();mr!==r?(vr=JA(),vr!==r?(xt=de,Ke=lr(J,pt,vr),de=Ke):(W=de,de=r)):(W=de,de=r)}else W=de,de=r;else W=de,de=r;for(;de!==r;){for(re.push(de),de=W,Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();if(Ke!==r)if(e.charCodeAt(W)===42?(pt=dc,W++):(pt=r,yt===0&&Bt(ze)),pt===r&&(e.charCodeAt(W)===47?(pt=at,W++):(pt=r,yt===0&&Bt(St))),pt!==r){for(mr=[],vr=kt();vr!==r;)mr.push(vr),vr=kt();mr!==r?(vr=JA(),vr!==r?(xt=de,Ke=lr(J,pt,vr),de=Ke):(W=de,de=r)):(W=de,de=r)}else W=de,de=r;else W=de,de=r}re!==r?(xt=O,J=te(J,re),O=J):(W=O,O=r)}else W=O,O=r;return O}function Ao(){var O,J,re,de,Ke,pt,mr,vr;if(O=W,J=Df(),J!==r){for(re=[],de=W,Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();if(Ke!==r)if(e.charCodeAt(W)===43?(pt=pc,W++):(pt=r,yt===0&&Bt(Za)),pt===r&&(e.charCodeAt(W)===45?(pt=Ac,W++):(pt=r,yt===0&&Bt(Au))),pt!==r){for(mr=[],vr=kt();vr!==r;)mr.push(vr),vr=kt();mr!==r?(vr=Df(),vr!==r?(xt=de,Ke=Ee(J,pt,vr),de=Ke):(W=de,de=r)):(W=de,de=r)}else W=de,de=r;else W=de,de=r;for(;de!==r;){for(re.push(de),de=W,Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();if(Ke!==r)if(e.charCodeAt(W)===43?(pt=pc,W++):(pt=r,yt===0&&Bt(Za)),pt===r&&(e.charCodeAt(W)===45?(pt=Ac,W++):(pt=r,yt===0&&Bt(Au))),pt!==r){for(mr=[],vr=kt();vr!==r;)mr.push(vr),vr=kt();mr!==r?(vr=Df(),vr!==r?(xt=de,Ke=Ee(J,pt,vr),de=Ke):(W=de,de=r)):(W=de,de=r)}else W=de,de=r;else W=de,de=r}re!==r?(xt=O,J=te(J,re),O=J):(W=O,O=r)}else W=O,O=r;return O}function $r(){var O,J,re,de,Ke,pt;if(O=W,e.substr(W,3)===Oe?(J=Oe,W+=3):(J=r,yt===0&&Bt(mt)),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=Ao(),de!==r){for(Ke=[],pt=kt();pt!==r;)Ke.push(pt),pt=kt();Ke!==r?(e.substr(W,2)===Et?(pt=Et,W+=2):(pt=r,yt===0&&Bt(Dt)),pt!==r?(xt=O,J=tr(de),O=J):(W=O,O=r)):(W=O,O=r)}else W=O,O=r;else W=O,O=r}else W=O,O=r;return O}function Ph(){var O,J,re,de;return O=W,e.substr(W,2)===pn?(J=pn,W+=2):(J=r,yt===0&&Bt(ui)),J!==r?(re=ya(),re!==r?(e.charCodeAt(W)===41?(de=ce,W++):(de=r,yt===0&&Bt(X)),de!==r?(xt=O,J=qi(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O}function zA(){var O,J,re,de,Ke,pt;return O=W,e.substr(W,2)===Nn?(J=Nn,W+=2):(J=r,yt===0&&Bt(Xa)),J!==r?(re=gc(),re!==r?(e.substr(W,2)===By?(de=By,W+=2):(de=r,yt===0&&Bt(z1)),de!==r?(Ke=Os(),Ke!==r?(e.charCodeAt(W)===125?(pt=_,W++):(pt=r,yt===0&&Bt(tt)),pt!==r?(xt=O,J=Qo(re,Ke),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===Nn?(J=Nn,W+=2):(J=r,yt===0&&Bt(Xa)),J!==r?(re=gc(),re!==r?(e.substr(W,3)===vy?(de=vy,W+=3):(de=r,yt===0&&Bt(Ih)),de!==r?(xt=O,J=Z1(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===Nn?(J=Nn,W+=2):(J=r,yt===0&&Bt(Xa)),J!==r?(re=gc(),re!==r?(e.substr(W,2)===To?(de=To,W+=2):(de=r,yt===0&&Bt(Ch)),de!==r?(Ke=Os(),Ke!==r?(e.charCodeAt(W)===125?(pt=_,W++):(pt=r,yt===0&&Bt(tt)),pt!==r?(xt=O,J=wh(re,Ke),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===Nn?(J=Nn,W+=2):(J=r,yt===0&&Bt(Xa)),J!==r?(re=gc(),re!==r?(e.substr(W,3)===pu?(de=pu,W+=3):(de=r,yt===0&&Bt(Bh)),de!==r?(xt=O,J=Ng(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.substr(W,2)===Nn?(J=Nn,W+=2):(J=r,yt===0&&Bt(Xa)),J!==r?(re=gc(),re!==r?(e.charCodeAt(W)===125?(de=_,W++):(de=r,yt===0&&Bt(tt)),de!==r?(xt=O,J=Og(re),O=J):(W=O,O=r)):(W=O,O=r)):(W=O,O=r),O===r&&(O=W,e.charCodeAt(W)===36?(J=Lg,W++):(J=r,yt===0&&Bt(Sy)),J!==r?(re=gc(),re!==r?(xt=O,J=Og(re),O=J):(W=O,O=r)):(W=O,O=r)))))),O}function Qy(){var O,J,re;return O=W,J=Wg(),J!==r?(xt=W,re=Ef(J),re?re=void 0:re=r,re!==r?(xt=O,J=Ro(J),O=J):(W=O,O=r)):(W=O,O=r),O}function Wg(){var O,J,re,de,Ke;if(O=W,J=[],re=W,de=W,yt++,Ke=kh(),yt--,Ke===r?de=void 0:(W=de,de=r),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r),re!==r)for(;re!==r;)J.push(re),re=W,de=W,yt++,Ke=kh(),yt--,Ke===r?de=void 0:(W=de,de=r),de!==r?(e.length>W?(Ke=e.charAt(W),W++):(Ke=r,yt===0&&Bt(Rn)),Ke!==r?(xt=re,de=ko(Ke),re=de):(W=re,re=r)):(W=re,re=r);else J=r;return J!==r&&(xt=O,J=uo(J)),O=J,O}function xh(){var O,J,re;if(O=W,J=[],Rl.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(vh)),re!==r)for(;re!==r;)J.push(re),Rl.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(vh));else J=r;return J!==r&&(xt=O,J=Mg()),O=J,O}function gc(){var O,J,re;if(O=W,J=[],Fl.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Nl)),re!==r)for(;re!==r;)J.push(re),Fl.test(e.charAt(W))?(re=e.charAt(W),W++):(re=r,yt===0&&Bt(Nl));else J=r;return J!==r&&(xt=O,J=Mg()),O=J,O}function Ty(){var O;return by.test(e.charAt(W))?(O=e.charAt(W),W++):(O=r,yt===0&&Bt(jA)),O}function kh(){var O;return Dy.test(e.charAt(W))?(O=e.charAt(W),W++):(O=r,yt===0&&Bt(Py)),O}function kt(){var O,J;if(O=[],GA.test(e.charAt(W))?(J=e.charAt(W),W++):(J=r,yt===0&&Bt(qA)),J!==r)for(;J!==r;)O.push(J),GA.test(e.charAt(W))?(J=e.charAt(W),W++):(J=r,yt===0&&Bt(qA));else O=r;return O}if(hu=a(),hu!==r&&W===e.length)return hu;throw hu!==r&&W!1}){try{return(0,$$.parse)(e,t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function mE(e,{endSemicolon:t=!1}={}){return e.map(({command:r,type:s},a)=>`${mx(r)}${s===";"?a!==e.length-1||t?";":"":" &"}`).join(" ")}function mx(e){return`${yE(e.chain)}${e.then?` ${FU(e.then)}`:""}`}function FU(e){return`${e.type} ${mx(e.line)}`}function yE(e){return`${OU(e)}${e.then?` ${NU(e.then)}`:""}`}function NU(e){return`${e.type} ${yE(e.chain)}`}function OU(e){switch(e.type){case"command":return`${e.envs.length>0?`${e.envs.map(t=>dx(t)).join(" ")} `:""}${e.args.map(t=>LU(t)).join(" ")}`;case"subshell":return`(${mE(e.subshell)})${e.args.length>0?` ${e.args.map(t=>U2(t)).join(" ")}`:""}`;case"group":return`{ ${mE(e.group,{endSemicolon:!0})} }${e.args.length>0?` ${e.args.map(t=>U2(t)).join(" ")}`:""}`;case"envs":return e.envs.map(t=>dx(t)).join(" ");default:throw new Error(`Unsupported command type: "${e.type}"`)}}function dx(e){return`${e.name}=${e.args[0]?S0(e.args[0]):""}`}function LU(e){switch(e.type){case"redirection":return U2(e);case"argument":return S0(e);default:throw new Error(`Unsupported argument type: "${e.type}"`)}}function U2(e){return`${e.subtype} ${e.args.map(t=>S0(t)).join(" ")}`}function S0(e){return e.segments.map(t=>MU(t)).join("")}function MU(e){let t=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<>$|&;"'\n\t ]/)?s.match(/['\t\p{C}]/u)?s.match(/'/)?`"${s.replace(/["$\t\p{C}]/u,W6e)}"`:`$'${s.replace(/[\t\p{C}]/u,tee)}'`:`'${s}'`:s;switch(e.type){case"text":return r(e.text);case"glob":return e.pattern;case"shell":return t(`$(${mE(e.shell)})`,e.quoted);case"variable":return t(typeof e.defaultValue>"u"?typeof e.alternativeValue>"u"?`\${${e.name}}`:e.alternativeValue.length===0?`\${${e.name}:+}`:`\${${e.name}:+${e.alternativeValue.map(s=>S0(s)).join(" ")}}`:e.defaultValue.length===0?`\${${e.name}:-}`:`\${${e.name}:-${e.defaultValue.map(s=>S0(s)).join(" ")}}`,e.quoted);case"arithmetic":return`$(( ${yx(e.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${e.type}"`)}}function yx(e){let t=a=>{switch(a){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 "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,s=a=>r(yx(a),!["number","variable"].includes(a.type));switch(e.type){case"number":return String(e.value);case"variable":return e.name;default:return`${s(e.left)} ${t(e.type)} ${s(e.right)}`}}var $$,eee,Y6e,tee,W6e,ree=Ze(()=>{$$=et(X$());eee=new Map([["\f","\\f"],[` +`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),Y6e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(eee,([e,t])=>[e,`"$'${t}'"`])]),tee=e=>eee.get(e)??`\\x${e.charCodeAt(0).toString(16).padStart(2,"0")}`,W6e=e=>Y6e.get(e)??`"$'${tee(e)}'"`});var iee=G((ZPt,nee)=>{"use strict";function V6e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function b0(e,t,r,s){this.message=e,this.expected=t,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,b0)}V6e(b0,Error);b0.buildMessage=function(e,t){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;Cfe&&(fe=K,le=[]),le.push(Me))}function tt(Me,P){return new b0(Me,null,null,P)}function Fe(Me,P,w){return new b0(b0.buildMessage(Me,P),Me,P,w)}function Qe(){var Me,P,w,D;return Me=K,P=Se(),P!==r?(e.charCodeAt(K)===47?(w=n,K++):(w=r,ge===0&&_(c)),w!==r?(D=Se(),D!==r?($=Me,P=f(P,D),Me=P):(K=Me,Me=r)):(K=Me,Me=r)):(K=Me,Me=r),Me===r&&(Me=K,P=Se(),P!==r&&($=Me,P=p(P)),Me=P),Me}function Se(){var Me,P,w,D;return Me=K,P=je(),P!==r?(e.charCodeAt(K)===64?(w=h,K++):(w=r,ge===0&&_(E)),w!==r?(D=ct(),D!==r?($=Me,P=C(P,D),Me=P):(K=Me,Me=r)):(K=Me,Me=r)):(K=Me,Me=r),Me===r&&(Me=K,P=je(),P!==r&&($=Me,P=S(P)),Me=P),Me}function je(){var Me,P,w,D,y;return Me=K,e.charCodeAt(K)===64?(P=h,K++):(P=r,ge===0&&_(E)),P!==r?(w=Te(),w!==r?(e.charCodeAt(K)===47?(D=n,K++):(D=r,ge===0&&_(c)),D!==r?(y=Te(),y!==r?($=Me,P=x(),Me=P):(K=Me,Me=r)):(K=Me,Me=r)):(K=Me,Me=r)):(K=Me,Me=r),Me===r&&(Me=K,P=Te(),P!==r&&($=Me,P=x()),Me=P),Me}function Te(){var Me,P,w;if(Me=K,P=[],I.test(e.charAt(K))?(w=e.charAt(K),K++):(w=r,ge===0&&_(R)),w!==r)for(;w!==r;)P.push(w),I.test(e.charAt(K))?(w=e.charAt(K),K++):(w=r,ge===0&&_(R));else P=r;return P!==r&&($=Me,P=x()),Me=P,Me}function ct(){var Me,P,w;if(Me=K,P=[],N.test(e.charAt(K))?(w=e.charAt(K),K++):(w=r,ge===0&&_(U)),w!==r)for(;w!==r;)P.push(w),N.test(e.charAt(K))?(w=e.charAt(K),K++):(w=r,ge===0&&_(U));else P=r;return P!==r&&($=Me,P=x()),Me=P,Me}if(pe=a(),pe!==r&&K===e.length)return pe;throw pe!==r&&K{see=et(iee())});var P0=G(($Pt,D0)=>{"use strict";function aee(e){return typeof e>"u"||e===null}function J6e(e){return typeof e=="object"&&e!==null}function z6e(e){return Array.isArray(e)?e:aee(e)?[]:[e]}function Z6e(e,t){var r,s,a,n;if(t)for(n=Object.keys(t),r=0,s=n.length;r{"use strict";function _2(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}_2.prototype=Object.create(Error.prototype);_2.prototype.constructor=_2;_2.prototype.toString=function(t){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!t&&this.mark&&(r+=" "+this.mark.toString()),r};lee.exports=_2});var fee=G((txt,uee)=>{"use strict";var cee=P0();function UU(e,t,r,s,a){this.name=e,this.buffer=t,this.position=r,this.line=s,this.column=a}UU.prototype.getSnippet=function(t,r){var s,a,n,c,f;if(!this.buffer)return null;for(t=t||4,r=r||75,s="",a=this.position;a>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){s=" ... ",a+=5;break}for(n="",c=this.position;cr/2-1){n=" ... ",c-=5;break}return f=this.buffer.slice(a,c),cee.repeat(" ",t)+s+f+n+` +`+cee.repeat(" ",t+this.position-a+s.length)+"^"};UU.prototype.toString=function(t){var r,s="";return this.name&&(s+='in "'+this.name+'" '),s+="at line "+(this.line+1)+", column "+(this.column+1),t||(r=this.getSnippet(),r&&(s+=`: +`+r)),s};uee.exports=UU});var xs=G((rxt,pee)=>{"use strict";var Aee=EE(),eGe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],tGe=["scalar","sequence","mapping"];function rGe(e){var t={};return e!==null&&Object.keys(e).forEach(function(r){e[r].forEach(function(s){t[String(s)]=r})}),t}function nGe(e,t){if(t=t||{},Object.keys(t).forEach(function(r){if(eGe.indexOf(r)===-1)throw new Aee('Unknown option "'+r+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(r){return r},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=rGe(t.styleAliases||null),tGe.indexOf(this.kind)===-1)throw new Aee('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}pee.exports=nGe});var x0=G((nxt,dee)=>{"use strict";var hee=P0(),Cx=EE(),iGe=xs();function _U(e,t,r){var s=[];return e.include.forEach(function(a){r=_U(a,t,r)}),e[t].forEach(function(a){r.forEach(function(n,c){n.tag===a.tag&&n.kind===a.kind&&s.push(c)}),r.push(a)}),r.filter(function(a,n){return s.indexOf(n)===-1})}function sGe(){var e={scalar:{},sequence:{},mapping:{},fallback:{}},t,r;function s(a){e[a.kind][a.tag]=e.fallback[a.tag]=a}for(t=0,r=arguments.length;t{"use strict";var oGe=xs();gee.exports=new oGe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return e!==null?e:""}})});var Eee=G((sxt,yee)=>{"use strict";var aGe=xs();yee.exports=new aGe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return e!==null?e:[]}})});var Cee=G((oxt,Iee)=>{"use strict";var lGe=xs();Iee.exports=new lGe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return e!==null?e:{}}})});var wx=G((axt,wee)=>{"use strict";var cGe=x0();wee.exports=new cGe({explicit:[mee(),Eee(),Cee()]})});var vee=G((lxt,Bee)=>{"use strict";var uGe=xs();function fGe(e){if(e===null)return!0;var t=e.length;return t===1&&e==="~"||t===4&&(e==="null"||e==="Null"||e==="NULL")}function AGe(){return null}function pGe(e){return e===null}Bee.exports=new uGe("tag:yaml.org,2002:null",{kind:"scalar",resolve:fGe,construct:AGe,predicate:pGe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var bee=G((cxt,See)=>{"use strict";var hGe=xs();function dGe(e){if(e===null)return!1;var t=e.length;return t===4&&(e==="true"||e==="True"||e==="TRUE")||t===5&&(e==="false"||e==="False"||e==="FALSE")}function gGe(e){return e==="true"||e==="True"||e==="TRUE"}function mGe(e){return Object.prototype.toString.call(e)==="[object Boolean]"}See.exports=new hGe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:dGe,construct:gGe,predicate:mGe,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})});var Pee=G((uxt,Dee)=>{"use strict";var yGe=P0(),EGe=xs();function IGe(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function CGe(e){return 48<=e&&e<=55}function wGe(e){return 48<=e&&e<=57}function BGe(e){if(e===null)return!1;var t=e.length,r=0,s=!1,a;if(!t)return!1;if(a=e[r],(a==="-"||a==="+")&&(a=e[++r]),a==="0"){if(r+1===t)return!0;if(a=e[++r],a==="b"){for(r++;r=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var Qee=G((fxt,kee)=>{"use strict";var xee=P0(),bGe=xs(),DGe=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 PGe(e){return!(e===null||!DGe.test(e)||e[e.length-1]==="_")}function xGe(e){var t,r,s,a;return t=e.replace(/_/g,"").toLowerCase(),r=t[0]==="-"?-1:1,a=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),t===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:t===".nan"?NaN:t.indexOf(":")>=0?(t.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),t=0,s=1,a.forEach(function(n){t+=n*s,s*=60}),r*t):r*parseFloat(t,10)}var kGe=/^[-+]?[0-9]+e/;function QGe(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(xee.isNegativeZero(e))return"-0.0";return r=e.toString(10),kGe.test(r)?r.replace("e",".e"):r}function TGe(e){return Object.prototype.toString.call(e)==="[object Number]"&&(e%1!==0||xee.isNegativeZero(e))}kee.exports=new bGe("tag:yaml.org,2002:float",{kind:"scalar",resolve:PGe,construct:xGe,predicate:TGe,represent:QGe,defaultStyle:"lowercase"})});var HU=G((Axt,Tee)=>{"use strict";var RGe=x0();Tee.exports=new RGe({include:[wx()],implicit:[vee(),bee(),Pee(),Qee()]})});var jU=G((pxt,Ree)=>{"use strict";var FGe=x0();Ree.exports=new FGe({include:[HU()]})});var Lee=G((hxt,Oee)=>{"use strict";var NGe=xs(),Fee=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Nee=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 OGe(e){return e===null?!1:Fee.exec(e)!==null||Nee.exec(e)!==null}function LGe(e){var t,r,s,a,n,c,f,p=0,h=null,E,C,S;if(t=Fee.exec(e),t===null&&(t=Nee.exec(e)),t===null)throw new Error("Date resolve error");if(r=+t[1],s=+t[2]-1,a=+t[3],!t[4])return new Date(Date.UTC(r,s,a));if(n=+t[4],c=+t[5],f=+t[6],t[7]){for(p=t[7].slice(0,3);p.length<3;)p+="0";p=+p}return t[9]&&(E=+t[10],C=+(t[11]||0),h=(E*60+C)*6e4,t[9]==="-"&&(h=-h)),S=new Date(Date.UTC(r,s,a,n,c,f,p)),h&&S.setTime(S.getTime()-h),S}function MGe(e){return e.toISOString()}Oee.exports=new NGe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:OGe,construct:LGe,instanceOf:Date,represent:MGe})});var Uee=G((dxt,Mee)=>{"use strict";var UGe=xs();function _Ge(e){return e==="<<"||e===null}Mee.exports=new UGe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:_Ge})});var jee=G((gxt,Hee)=>{"use strict";var k0;try{_ee=Ce,k0=_ee("buffer").Buffer}catch{}var _ee,HGe=xs(),GU=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function jGe(e){if(e===null)return!1;var t,r,s=0,a=e.length,n=GU;for(r=0;r64)){if(t<0)return!1;s+=6}return s%8===0}function GGe(e){var t,r,s=e.replace(/[\r\n=]/g,""),a=s.length,n=GU,c=0,f=[];for(t=0;t>16&255),f.push(c>>8&255),f.push(c&255)),c=c<<6|n.indexOf(s.charAt(t));return r=a%4*6,r===0?(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)):r===18?(f.push(c>>10&255),f.push(c>>2&255)):r===12&&f.push(c>>4&255),k0?k0.from?k0.from(f):new k0(f):f}function qGe(e){var t="",r=0,s,a,n=e.length,c=GU;for(s=0;s>18&63],t+=c[r>>12&63],t+=c[r>>6&63],t+=c[r&63]),r=(r<<8)+e[s];return a=n%3,a===0?(t+=c[r>>18&63],t+=c[r>>12&63],t+=c[r>>6&63],t+=c[r&63]):a===2?(t+=c[r>>10&63],t+=c[r>>4&63],t+=c[r<<2&63],t+=c[64]):a===1&&(t+=c[r>>2&63],t+=c[r<<4&63],t+=c[64],t+=c[64]),t}function YGe(e){return k0&&k0.isBuffer(e)}Hee.exports=new HGe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:jGe,construct:GGe,predicate:YGe,represent:qGe})});var qee=G((yxt,Gee)=>{"use strict";var WGe=xs(),VGe=Object.prototype.hasOwnProperty,KGe=Object.prototype.toString;function JGe(e){if(e===null)return!0;var t=[],r,s,a,n,c,f=e;for(r=0,s=f.length;r{"use strict";var ZGe=xs(),XGe=Object.prototype.toString;function $Ge(e){if(e===null)return!0;var t,r,s,a,n,c=e;for(n=new Array(c.length),t=0,r=c.length;t{"use strict";var t5e=xs(),r5e=Object.prototype.hasOwnProperty;function n5e(e){if(e===null)return!0;var t,r=e;for(t in r)if(r5e.call(r,t)&&r[t]!==null)return!1;return!0}function i5e(e){return e!==null?e:{}}Vee.exports=new t5e("tag:yaml.org,2002:set",{kind:"mapping",resolve:n5e,construct:i5e})});var CE=G((Cxt,Jee)=>{"use strict";var s5e=x0();Jee.exports=new s5e({include:[jU()],implicit:[Lee(),Uee()],explicit:[jee(),qee(),Wee(),Kee()]})});var Zee=G((wxt,zee)=>{"use strict";var o5e=xs();function a5e(){return!0}function l5e(){}function c5e(){return""}function u5e(e){return typeof e>"u"}zee.exports=new o5e("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:a5e,construct:l5e,predicate:u5e,represent:c5e})});var $ee=G((Bxt,Xee)=>{"use strict";var f5e=xs();function A5e(e){if(e===null||e.length===0)return!1;var t=e,r=/\/([gim]*)$/.exec(e),s="";return!(t[0]==="/"&&(r&&(s=r[1]),s.length>3||t[t.length-s.length-1]!=="/"))}function p5e(e){var t=e,r=/\/([gim]*)$/.exec(e),s="";return t[0]==="/"&&(r&&(s=r[1]),t=t.slice(1,t.length-s.length-1)),new RegExp(t,s)}function h5e(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}function d5e(e){return Object.prototype.toString.call(e)==="[object RegExp]"}Xee.exports=new f5e("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:A5e,construct:p5e,predicate:d5e,represent:h5e})});var rte=G((vxt,tte)=>{"use strict";var Bx;try{ete=Ce,Bx=ete("esprima")}catch{typeof window<"u"&&(Bx=window.esprima)}var ete,g5e=xs();function m5e(e){if(e===null)return!1;try{var t="("+e+")",r=Bx.parse(t,{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{return!1}}function y5e(e){var t="("+e+")",r=Bx.parse(t,{range:!0}),s=[],a;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(n){s.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(s,t.slice(a[0]+1,a[1]-1)):new Function(s,"return "+t.slice(a[0],a[1]))}function E5e(e){return e.toString()}function I5e(e){return Object.prototype.toString.call(e)==="[object Function]"}tte.exports=new g5e("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:m5e,construct:y5e,predicate:I5e,represent:E5e})});var H2=G((bxt,ite)=>{"use strict";var nte=x0();ite.exports=nte.DEFAULT=new nte({include:[CE()],explicit:[Zee(),$ee(),rte()]})});var Bte=G((Dxt,j2)=>{"use strict";var Bp=P0(),fte=EE(),C5e=fee(),Ate=CE(),w5e=H2(),sd=Object.prototype.hasOwnProperty,vx=1,pte=2,hte=3,Sx=4,qU=1,B5e=2,ste=3,v5e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,S5e=/[\x85\u2028\u2029]/,b5e=/[,\[\]\{\}]/,dte=/^(?:!|!!|![a-z\-]+!)$/i,gte=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function ote(e){return Object.prototype.toString.call(e)}function Yf(e){return e===10||e===13}function T0(e){return e===9||e===32}function fl(e){return e===9||e===32||e===10||e===13}function wE(e){return e===44||e===91||e===93||e===123||e===125}function D5e(e){var t;return 48<=e&&e<=57?e-48:(t=e|32,97<=t&&t<=102?t-97+10:-1)}function P5e(e){return e===120?2:e===117?4:e===85?8:0}function x5e(e){return 48<=e&&e<=57?e-48:-1}function ate(e){return e===48?"\0":e===97?"\x07":e===98?"\b":e===116||e===9?" ":e===110?` +`:e===118?"\v":e===102?"\f":e===114?"\r":e===101?"\x1B":e===32?" ":e===34?'"':e===47?"/":e===92?"\\":e===78?"\x85":e===95?"\xA0":e===76?"\u2028":e===80?"\u2029":""}function k5e(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}var mte=new Array(256),yte=new Array(256);for(Q0=0;Q0<256;Q0++)mte[Q0]=ate(Q0)?1:0,yte[Q0]=ate(Q0);var Q0;function Q5e(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||w5e,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Ete(e,t){return new fte(t,new C5e(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function Nr(e,t){throw Ete(e,t)}function bx(e,t){e.onWarning&&e.onWarning.call(null,Ete(e,t))}var lte={YAML:function(t,r,s){var a,n,c;t.version!==null&&Nr(t,"duplication of %YAML directive"),s.length!==1&&Nr(t,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(s[0]),a===null&&Nr(t,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),c=parseInt(a[2],10),n!==1&&Nr(t,"unacceptable YAML version of the document"),t.version=s[0],t.checkLineBreaks=c<2,c!==1&&c!==2&&bx(t,"unsupported YAML version of the document")},TAG:function(t,r,s){var a,n;s.length!==2&&Nr(t,"TAG directive accepts exactly two arguments"),a=s[0],n=s[1],dte.test(a)||Nr(t,"ill-formed tag handle (first argument) of the TAG directive"),sd.call(t.tagMap,a)&&Nr(t,'there is a previously declared suffix for "'+a+'" tag handle'),gte.test(n)||Nr(t,"ill-formed tag prefix (second argument) of the TAG directive"),t.tagMap[a]=n}};function id(e,t,r,s){var a,n,c,f;if(t1&&(e.result+=Bp.repeat(` +`,t-1))}function T5e(e,t,r){var s,a,n,c,f,p,h,E,C=e.kind,S=e.result,x;if(x=e.input.charCodeAt(e.position),fl(x)||wE(x)||x===35||x===38||x===42||x===33||x===124||x===62||x===39||x===34||x===37||x===64||x===96||(x===63||x===45)&&(a=e.input.charCodeAt(e.position+1),fl(a)||r&&wE(a)))return!1;for(e.kind="scalar",e.result="",n=c=e.position,f=!1;x!==0;){if(x===58){if(a=e.input.charCodeAt(e.position+1),fl(a)||r&&wE(a))break}else if(x===35){if(s=e.input.charCodeAt(e.position-1),fl(s))break}else{if(e.position===e.lineStart&&Dx(e)||r&&wE(x))break;if(Yf(x))if(p=e.line,h=e.lineStart,E=e.lineIndent,cs(e,!1,-1),e.lineIndent>=t){f=!0,x=e.input.charCodeAt(e.position);continue}else{e.position=c,e.line=p,e.lineStart=h,e.lineIndent=E;break}}f&&(id(e,n,c,!1),WU(e,e.line-p),n=c=e.position,f=!1),T0(x)||(c=e.position+1),x=e.input.charCodeAt(++e.position)}return id(e,n,c,!1),e.result?!0:(e.kind=C,e.result=S,!1)}function R5e(e,t){var r,s,a;if(r=e.input.charCodeAt(e.position),r!==39)return!1;for(e.kind="scalar",e.result="",e.position++,s=a=e.position;(r=e.input.charCodeAt(e.position))!==0;)if(r===39)if(id(e,s,e.position,!0),r=e.input.charCodeAt(++e.position),r===39)s=e.position,e.position++,a=e.position;else return!0;else Yf(r)?(id(e,s,a,!0),WU(e,cs(e,!1,t)),s=a=e.position):e.position===e.lineStart&&Dx(e)?Nr(e,"unexpected end of the document within a single quoted scalar"):(e.position++,a=e.position);Nr(e,"unexpected end of the stream within a single quoted scalar")}function F5e(e,t){var r,s,a,n,c,f;if(f=e.input.charCodeAt(e.position),f!==34)return!1;for(e.kind="scalar",e.result="",e.position++,r=s=e.position;(f=e.input.charCodeAt(e.position))!==0;){if(f===34)return id(e,r,e.position,!0),e.position++,!0;if(f===92){if(id(e,r,e.position,!0),f=e.input.charCodeAt(++e.position),Yf(f))cs(e,!1,t);else if(f<256&&mte[f])e.result+=yte[f],e.position++;else if((c=P5e(f))>0){for(a=c,n=0;a>0;a--)f=e.input.charCodeAt(++e.position),(c=D5e(f))>=0?n=(n<<4)+c:Nr(e,"expected hexadecimal character");e.result+=k5e(n),e.position++}else Nr(e,"unknown escape sequence");r=s=e.position}else Yf(f)?(id(e,r,s,!0),WU(e,cs(e,!1,t)),r=s=e.position):e.position===e.lineStart&&Dx(e)?Nr(e,"unexpected end of the document within a double quoted scalar"):(e.position++,s=e.position)}Nr(e,"unexpected end of the stream within a double quoted scalar")}function N5e(e,t){var r=!0,s,a=e.tag,n,c=e.anchor,f,p,h,E,C,S={},x,I,R,N;if(N=e.input.charCodeAt(e.position),N===91)p=93,C=!1,n=[];else if(N===123)p=125,C=!0,n={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=n),N=e.input.charCodeAt(++e.position);N!==0;){if(cs(e,!0,t),N=e.input.charCodeAt(e.position),N===p)return e.position++,e.tag=a,e.anchor=c,e.kind=C?"mapping":"sequence",e.result=n,!0;r||Nr(e,"missed comma between flow collection entries"),I=x=R=null,h=E=!1,N===63&&(f=e.input.charCodeAt(e.position+1),fl(f)&&(h=E=!0,e.position++,cs(e,!0,t))),s=e.line,vE(e,t,vx,!1,!0),I=e.tag,x=e.result,cs(e,!0,t),N=e.input.charCodeAt(e.position),(E||e.line===s)&&N===58&&(h=!0,N=e.input.charCodeAt(++e.position),cs(e,!0,t),vE(e,t,vx,!1,!0),R=e.result),C?BE(e,n,S,I,x,R):h?n.push(BE(e,null,S,I,x,R)):n.push(x),cs(e,!0,t),N=e.input.charCodeAt(e.position),N===44?(r=!0,N=e.input.charCodeAt(++e.position)):r=!1}Nr(e,"unexpected end of the stream within a flow collection")}function O5e(e,t){var r,s,a=qU,n=!1,c=!1,f=t,p=0,h=!1,E,C;if(C=e.input.charCodeAt(e.position),C===124)s=!1;else if(C===62)s=!0;else return!1;for(e.kind="scalar",e.result="";C!==0;)if(C=e.input.charCodeAt(++e.position),C===43||C===45)qU===a?a=C===43?ste:B5e:Nr(e,"repeat of a chomping mode identifier");else if((E=x5e(C))>=0)E===0?Nr(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?Nr(e,"repeat of an indentation width identifier"):(f=t+E-1,c=!0);else break;if(T0(C)){do C=e.input.charCodeAt(++e.position);while(T0(C));if(C===35)do C=e.input.charCodeAt(++e.position);while(!Yf(C)&&C!==0)}for(;C!==0;){for(YU(e),e.lineIndent=0,C=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),Yf(C)){p++;continue}if(e.lineIndentt)&&p!==0)Nr(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(vE(e,t,Sx,!0,a)&&(I?S=e.result:x=e.result),I||(BE(e,h,E,C,S,x,n,c),C=S=x=null),cs(e,!0,-1),N=e.input.charCodeAt(e.position)),e.lineIndent>t&&N!==0)Nr(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndent tag; it should be "scalar", not "'+e.kind+'"'),C=0,S=e.implicitTypes.length;C tag; it should be "'+x.kind+'", not "'+e.kind+'"'),x.resolve(e.result)?(e.result=x.construct(e.result),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):Nr(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):Nr(e,"unknown tag !<"+e.tag+">");return e.listener!==null&&e.listener("close",e),e.tag!==null||e.anchor!==null||E}function H5e(e){var t=e.position,r,s,a,n=!1,c;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};(c=e.input.charCodeAt(e.position))!==0&&(cs(e,!0,-1),c=e.input.charCodeAt(e.position),!(e.lineIndent>0||c!==37));){for(n=!0,c=e.input.charCodeAt(++e.position),r=e.position;c!==0&&!fl(c);)c=e.input.charCodeAt(++e.position);for(s=e.input.slice(r,e.position),a=[],s.length<1&&Nr(e,"directive name must not be less than one character in length");c!==0;){for(;T0(c);)c=e.input.charCodeAt(++e.position);if(c===35){do c=e.input.charCodeAt(++e.position);while(c!==0&&!Yf(c));break}if(Yf(c))break;for(r=e.position;c!==0&&!fl(c);)c=e.input.charCodeAt(++e.position);a.push(e.input.slice(r,e.position))}c!==0&&YU(e),sd.call(lte,s)?lte[s](e,s,a):bx(e,'unknown document directive "'+s+'"')}if(cs(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45?(e.position+=3,cs(e,!0,-1)):n&&Nr(e,"directives end mark is expected"),vE(e,e.lineIndent-1,Sx,!1,!0),cs(e,!0,-1),e.checkLineBreaks&&S5e.test(e.input.slice(t,e.position))&&bx(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&Dx(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,cs(e,!0,-1));return}if(e.position"u"&&(r=t,t=null);var s=Ite(e,r);if(typeof t!="function")return s;for(var a=0,n=s.length;a"u"&&(r=t,t=null),Cte(e,t,Bp.extend({schema:Ate},r))}function G5e(e,t){return wte(e,Bp.extend({schema:Ate},t))}j2.exports.loadAll=Cte;j2.exports.load=wte;j2.exports.safeLoadAll=j5e;j2.exports.safeLoad=G5e});var Wte=G((Pxt,zU)=>{"use strict";var q2=P0(),Y2=EE(),q5e=H2(),Y5e=CE(),Qte=Object.prototype.toString,Tte=Object.prototype.hasOwnProperty,W5e=9,G2=10,V5e=13,K5e=32,J5e=33,z5e=34,Rte=35,Z5e=37,X5e=38,$5e=39,e9e=42,Fte=44,t9e=45,Nte=58,r9e=61,n9e=62,i9e=63,s9e=64,Ote=91,Lte=93,o9e=96,Mte=123,a9e=124,Ute=125,Vo={};Vo[0]="\\0";Vo[7]="\\a";Vo[8]="\\b";Vo[9]="\\t";Vo[10]="\\n";Vo[11]="\\v";Vo[12]="\\f";Vo[13]="\\r";Vo[27]="\\e";Vo[34]='\\"';Vo[92]="\\\\";Vo[133]="\\N";Vo[160]="\\_";Vo[8232]="\\L";Vo[8233]="\\P";var l9e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function c9e(e,t){var r,s,a,n,c,f,p;if(t===null)return{};for(r={},s=Object.keys(t),a=0,n=s.length;a0?e.charCodeAt(n-1):null,S=S&&bte(c,f)}else{for(n=0;ns&&e[C+1]!==" ",C=n);else if(!SE(c))return Px;f=n>0?e.charCodeAt(n-1):null,S=S&&bte(c,f)}h=h||E&&n-C-1>s&&e[C+1]!==" "}return!p&&!h?S&&!a(e)?Hte:jte:r>9&&_te(e)?Px:h?qte:Gte}function d9e(e,t,r,s){e.dump=function(){if(t.length===0)return"''";if(!e.noCompatMode&&l9e.indexOf(t)!==-1)return"'"+t+"'";var a=e.indent*Math.max(1,r),n=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=s||e.flowLevel>-1&&r>=e.flowLevel;function f(p){return f9e(e,p)}switch(h9e(t,c,e.indent,n,f)){case Hte:return t;case jte:return"'"+t.replace(/'/g,"''")+"'";case Gte:return"|"+Dte(t,e.indent)+Pte(Ste(t,a));case qte:return">"+Dte(t,e.indent)+Pte(Ste(g9e(t,n),a));case Px:return'"'+m9e(t,n)+'"';default:throw new Y2("impossible error: invalid scalar style")}}()}function Dte(e,t){var r=_te(e)?String(t):"",s=e[e.length-1]===` +`,a=s&&(e[e.length-2]===` +`||e===` +`),n=a?"+":s?"":"-";return r+n+` +`}function Pte(e){return e[e.length-1]===` +`?e.slice(0,-1):e}function g9e(e,t){for(var r=/(\n+)([^\n]*)/g,s=function(){var h=e.indexOf(` +`);return h=h!==-1?h:e.length,r.lastIndex=h,xte(e.slice(0,h),t)}(),a=e[0]===` +`||e[0]===" ",n,c;c=r.exec(e);){var f=c[1],p=c[2];n=p[0]===" ",s+=f+(!a&&!n&&p!==""?` +`:"")+xte(p,t),a=n}return s}function xte(e,t){if(e===""||e[0]===" ")return e;for(var r=/ [^ ]/g,s,a=0,n,c=0,f=0,p="";s=r.exec(e);)f=s.index,f-a>t&&(n=c>a?c:f,p+=` +`+e.slice(a,n),a=n+1),c=f;return p+=` +`,e.length-a>t&&c>a?p+=e.slice(a,c)+` +`+e.slice(c+1):p+=e.slice(a),p.slice(1)}function m9e(e){for(var t="",r,s,a,n=0;n=55296&&r<=56319&&(s=e.charCodeAt(n+1),s>=56320&&s<=57343)){t+=vte((r-55296)*1024+s-56320+65536),n++;continue}a=Vo[r],t+=!a&&SE(r)?e[n]:a||vte(r)}return t}function y9e(e,t,r){var s="",a=e.tag,n,c;for(n=0,c=r.length;n1024&&(E+="? "),E+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),R0(e,t,h,!1,!1)&&(E+=e.dump,s+=E));e.tag=a,e.dump="{"+s+"}"}function C9e(e,t,r,s){var a="",n=e.tag,c=Object.keys(r),f,p,h,E,C,S;if(e.sortKeys===!0)c.sort();else if(typeof e.sortKeys=="function")c.sort(e.sortKeys);else if(e.sortKeys)throw new Y2("sortKeys must be a boolean or a function");for(f=0,p=c.length;f1024,C&&(e.dump&&G2===e.dump.charCodeAt(0)?S+="?":S+="? "),S+=e.dump,C&&(S+=VU(e,t)),R0(e,t+1,E,!0,C)&&(e.dump&&G2===e.dump.charCodeAt(0)?S+=":":S+=": ",S+=e.dump,a+=S));e.tag=n,e.dump=a||"{}"}function kte(e,t,r){var s,a,n,c,f,p;for(a=r?e.explicitTypes:e.implicitTypes,n=0,c=a.length;n tag resolver accepts not "'+p+'" style');e.dump=s}return!0}return!1}function R0(e,t,r,s,a,n){e.tag=null,e.dump=r,kte(e,r,!1)||kte(e,r,!0);var c=Qte.call(e.dump);s&&(s=e.flowLevel<0||e.flowLevel>t);var f=c==="[object Object]"||c==="[object Array]",p,h;if(f&&(p=e.duplicates.indexOf(r),h=p!==-1),(e.tag!==null&&e.tag!=="?"||h||e.indent!==2&&t>0)&&(a=!1),h&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(f&&h&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),c==="[object Object]")s&&Object.keys(e.dump).length!==0?(C9e(e,t,e.dump,a),h&&(e.dump="&ref_"+p+e.dump)):(I9e(e,t,e.dump),h&&(e.dump="&ref_"+p+" "+e.dump));else if(c==="[object Array]"){var E=e.noArrayIndent&&t>0?t-1:t;s&&e.dump.length!==0?(E9e(e,E,e.dump,a),h&&(e.dump="&ref_"+p+e.dump)):(y9e(e,E,e.dump),h&&(e.dump="&ref_"+p+" "+e.dump))}else if(c==="[object String]")e.tag!=="?"&&d9e(e,e.dump,t,n);else{if(e.skipInvalid)return!1;throw new Y2("unacceptable kind of an object to dump "+c)}e.tag!==null&&e.tag!=="?"&&(e.dump="!<"+e.tag+"> "+e.dump)}return!0}function w9e(e,t){var r=[],s=[],a,n;for(KU(e,r,s),a=0,n=s.length;a{"use strict";var xx=Bte(),Vte=Wte();function kx(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}Yi.exports.Type=xs();Yi.exports.Schema=x0();Yi.exports.FAILSAFE_SCHEMA=wx();Yi.exports.JSON_SCHEMA=HU();Yi.exports.CORE_SCHEMA=jU();Yi.exports.DEFAULT_SAFE_SCHEMA=CE();Yi.exports.DEFAULT_FULL_SCHEMA=H2();Yi.exports.load=xx.load;Yi.exports.loadAll=xx.loadAll;Yi.exports.safeLoad=xx.safeLoad;Yi.exports.safeLoadAll=xx.safeLoadAll;Yi.exports.dump=Vte.dump;Yi.exports.safeDump=Vte.safeDump;Yi.exports.YAMLException=EE();Yi.exports.MINIMAL_SCHEMA=wx();Yi.exports.SAFE_SCHEMA=CE();Yi.exports.DEFAULT_SCHEMA=H2();Yi.exports.scan=kx("scan");Yi.exports.parse=kx("parse");Yi.exports.compose=kx("compose");Yi.exports.addConstructor=kx("addConstructor")});var zte=G((kxt,Jte)=>{"use strict";var v9e=Kte();Jte.exports=v9e});var Xte=G((Qxt,Zte)=>{"use strict";function S9e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function F0(e,t,r,s){this.message=e,this.expected=t,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,F0)}S9e(F0,Error);F0.buildMessage=function(e,t){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C({[mt]:Oe})))},fe=function(te){return te},le=function(te){return te},ge=Wa("correct indentation"),pe=" ",De=yn(" ",!1),ye=function(te){return te.length===lr*St},d=function(te){return te.length===(lr+1)*St},ve=function(){return lr++,!0},Ie=function(){return lr--,!0},me=function(){return ha()},ce=Wa("pseudostring"),X=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,be=Xn(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),ke=/^[^\r\n\t ,\][{}:#"']/,it=Xn(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),_=function(){return ha().replace(/^ *| *$/g,"")},tt="--",Fe=yn("--",!1),Qe=/^[a-zA-Z\/0-9]/,Se=Xn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),je=/^[^\r\n\t :,]/,Te=Xn(["\r",` +`," "," ",":",","],!0,!1),ct="null",Me=yn("null",!1),P=function(){return null},w="true",D=yn("true",!1),y=function(){return!0},F="false",z=yn("false",!1),Z=function(){return!1},ee=Wa("string"),se='"',xe=yn('"',!1),Ne=function(){return""},ut=function(te){return te},Ct=function(te){return te.join("")},Yt=/^[^"\\\0-\x1F\x7F]/,ir=Xn(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',mn=yn('\\"',!1),Pr=function(){return'"'},Cr="\\\\",Lr=yn("\\\\",!1),on=function(){return"\\"},ci="\\/",Do=yn("\\/",!1),is=function(){return"/"},ao="\\b",Po=yn("\\b",!1),ji=function(){return"\b"},lo="\\f",xo=yn("\\f",!1),FA=function(){return"\f"},df="\\n",mh=yn("\\n",!1),yh=function(){return` +`},co="\\r",qn=yn("\\r",!1),Ns=function(){return"\r"},uo="\\t",ou=yn("\\t",!1),au=function(){return" "},lu="\\u",NA=yn("\\u",!1),OA=function(te,Ee,Oe,mt){return String.fromCharCode(parseInt(`0x${te}${Ee}${Oe}${mt}`))},Aa=/^[0-9a-fA-F]/,pa=Xn([["0","9"],["a","f"],["A","F"]],!1,!1),LA=Wa("blank space"),gr=/^[ \t]/,ko=Xn([" "," "],!1,!1),qa=Wa("white space"),Ue=/^[ \t\n\r]/,wr=Xn([" "," ",` +`,"\r"],!1,!1),gf=`\r +`,MA=yn(`\r +`,!1),UA=` +`,cu=yn(` +`,!1),uu="\r",cc=yn("\r",!1),we=0,Ot=0,uc=[{line:1,column:1}],Oi=0,fo=[],Rt=0,Tn;if("startRule"in t){if(!(t.startRule in s))throw new Error(`Can't start parsing from rule "`+t.startRule+'".');a=s[t.startRule]}function ha(){return e.substring(Ot,we)}function Gi(){return Ka(Ot,we)}function Li(te,Ee){throw Ee=Ee!==void 0?Ee:Ka(Ot,we),mf([Wa(te)],e.substring(Ot,we),Ee)}function Ya(te,Ee){throw Ee=Ee!==void 0?Ee:Ka(Ot,we),Ja(te,Ee)}function yn(te,Ee){return{type:"literal",text:te,ignoreCase:Ee}}function Xn(te,Ee,Oe){return{type:"class",parts:te,inverted:Ee,ignoreCase:Oe}}function fu(){return{type:"any"}}function Eh(){return{type:"end"}}function Wa(te){return{type:"other",description:te}}function Va(te){var Ee=uc[te],Oe;if(Ee)return Ee;for(Oe=te-1;!uc[Oe];)Oe--;for(Ee=uc[Oe],Ee={line:Ee.line,column:Ee.column};OeOi&&(Oi=we,fo=[]),fo.push(te))}function Ja(te,Ee){return new F0(te,null,null,Ee)}function mf(te,Ee,Oe){return new F0(F0.buildMessage(te,Ee),te,Ee,Oe)}function fc(){var te;return te=_A(),te}function Sn(){var te,Ee,Oe;for(te=we,Ee=[],Oe=da();Oe!==r;)Ee.push(Oe),Oe=da();return Ee!==r&&(Ot=te,Ee=n(Ee)),te=Ee,te}function da(){var te,Ee,Oe,mt,Et;return te=we,Ee=Ql(),Ee!==r?(e.charCodeAt(we)===45?(Oe=c,we++):(Oe=r,Rt===0&&$e(f)),Oe!==r?(mt=Fn(),mt!==r?(Et=ga(),Et!==r?(Ot=te,Ee=p(Et),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r),te}function _A(){var te,Ee,Oe;for(te=we,Ee=[],Oe=HA();Oe!==r;)Ee.push(Oe),Oe=HA();return Ee!==r&&(Ot=te,Ee=h(Ee)),te=Ee,te}function HA(){var te,Ee,Oe,mt,Et,Dt,tr,pn,ui;if(te=we,Ee=Fn(),Ee===r&&(Ee=null),Ee!==r){if(Oe=we,e.charCodeAt(we)===35?(mt=E,we++):(mt=r,Rt===0&&$e(C)),mt!==r){if(Et=[],Dt=we,tr=we,Rt++,pn=at(),Rt--,pn===r?tr=void 0:(we=tr,tr=r),tr!==r?(e.length>we?(pn=e.charAt(we),we++):(pn=r,Rt===0&&$e(S)),pn!==r?(tr=[tr,pn],Dt=tr):(we=Dt,Dt=r)):(we=Dt,Dt=r),Dt!==r)for(;Dt!==r;)Et.push(Dt),Dt=we,tr=we,Rt++,pn=at(),Rt--,pn===r?tr=void 0:(we=tr,tr=r),tr!==r?(e.length>we?(pn=e.charAt(we),we++):(pn=r,Rt===0&&$e(S)),pn!==r?(tr=[tr,pn],Dt=tr):(we=Dt,Dt=r)):(we=Dt,Dt=r);else Et=r;Et!==r?(mt=[mt,Et],Oe=mt):(we=Oe,Oe=r)}else we=Oe,Oe=r;if(Oe===r&&(Oe=null),Oe!==r){if(mt=[],Et=ze(),Et!==r)for(;Et!==r;)mt.push(Et),Et=ze();else mt=r;mt!==r?(Ot=te,Ee=x(),te=Ee):(we=te,te=r)}else we=te,te=r}else we=te,te=r;if(te===r&&(te=we,Ee=Ql(),Ee!==r?(Oe=za(),Oe!==r?(mt=Fn(),mt===r&&(mt=null),mt!==r?(e.charCodeAt(we)===58?(Et=I,we++):(Et=r,Rt===0&&$e(R)),Et!==r?(Dt=Fn(),Dt===r&&(Dt=null),Dt!==r?(tr=ga(),tr!==r?(Ot=te,Ee=N(Oe,tr),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r),te===r&&(te=we,Ee=Ql(),Ee!==r?(Oe=ss(),Oe!==r?(mt=Fn(),mt===r&&(mt=null),mt!==r?(e.charCodeAt(we)===58?(Et=I,we++):(Et=r,Rt===0&&$e(R)),Et!==r?(Dt=Fn(),Dt===r&&(Dt=null),Dt!==r?(tr=ga(),tr!==r?(Ot=te,Ee=N(Oe,tr),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r),te===r))){if(te=we,Ee=Ql(),Ee!==r)if(Oe=ss(),Oe!==r)if(mt=Fn(),mt!==r)if(Et=Au(),Et!==r){if(Dt=[],tr=ze(),tr!==r)for(;tr!==r;)Dt.push(tr),tr=ze();else Dt=r;Dt!==r?(Ot=te,Ee=N(Oe,Et),te=Ee):(we=te,te=r)}else we=te,te=r;else we=te,te=r;else we=te,te=r;else we=te,te=r;if(te===r)if(te=we,Ee=Ql(),Ee!==r)if(Oe=ss(),Oe!==r){if(mt=[],Et=we,Dt=Fn(),Dt===r&&(Dt=null),Dt!==r?(e.charCodeAt(we)===44?(tr=U,we++):(tr=r,Rt===0&&$e(K)),tr!==r?(pn=Fn(),pn===r&&(pn=null),pn!==r?(ui=ss(),ui!==r?(Ot=Et,Dt=$(Oe,ui),Et=Dt):(we=Et,Et=r)):(we=Et,Et=r)):(we=Et,Et=r)):(we=Et,Et=r),Et!==r)for(;Et!==r;)mt.push(Et),Et=we,Dt=Fn(),Dt===r&&(Dt=null),Dt!==r?(e.charCodeAt(we)===44?(tr=U,we++):(tr=r,Rt===0&&$e(K)),tr!==r?(pn=Fn(),pn===r&&(pn=null),pn!==r?(ui=ss(),ui!==r?(Ot=Et,Dt=$(Oe,ui),Et=Dt):(we=Et,Et=r)):(we=Et,Et=r)):(we=Et,Et=r)):(we=Et,Et=r);else mt=r;mt!==r?(Et=Fn(),Et===r&&(Et=null),Et!==r?(e.charCodeAt(we)===58?(Dt=I,we++):(Dt=r,Rt===0&&$e(R)),Dt!==r?(tr=Fn(),tr===r&&(tr=null),tr!==r?(pn=ga(),pn!==r?(Ot=te,Ee=ie(Oe,mt,pn),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)}else we=te,te=r;else we=te,te=r}return te}function ga(){var te,Ee,Oe,mt,Et,Dt,tr;if(te=we,Ee=we,Rt++,Oe=we,mt=at(),mt!==r?(Et=Ut(),Et!==r?(e.charCodeAt(we)===45?(Dt=c,we++):(Dt=r,Rt===0&&$e(f)),Dt!==r?(tr=Fn(),tr!==r?(mt=[mt,Et,Dt,tr],Oe=mt):(we=Oe,Oe=r)):(we=Oe,Oe=r)):(we=Oe,Oe=r)):(we=Oe,Oe=r),Rt--,Oe!==r?(we=Ee,Ee=void 0):Ee=r,Ee!==r?(Oe=ze(),Oe!==r?(mt=Rn(),mt!==r?(Et=Sn(),Et!==r?(Dt=ma(),Dt!==r?(Ot=te,Ee=fe(Et),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r),te===r&&(te=we,Ee=at(),Ee!==r?(Oe=Rn(),Oe!==r?(mt=_A(),mt!==r?(Et=ma(),Et!==r?(Ot=te,Ee=fe(mt),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r),te===r))if(te=we,Ee=Ac(),Ee!==r){if(Oe=[],mt=ze(),mt!==r)for(;mt!==r;)Oe.push(mt),mt=ze();else Oe=r;Oe!==r?(Ot=te,Ee=le(Ee),te=Ee):(we=te,te=r)}else we=te,te=r;return te}function Ql(){var te,Ee,Oe;for(Rt++,te=we,Ee=[],e.charCodeAt(we)===32?(Oe=pe,we++):(Oe=r,Rt===0&&$e(De));Oe!==r;)Ee.push(Oe),e.charCodeAt(we)===32?(Oe=pe,we++):(Oe=r,Rt===0&&$e(De));return Ee!==r?(Ot=we,Oe=ye(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(we=te,te=r)):(we=te,te=r),Rt--,te===r&&(Ee=r,Rt===0&&$e(ge)),te}function Ut(){var te,Ee,Oe;for(te=we,Ee=[],e.charCodeAt(we)===32?(Oe=pe,we++):(Oe=r,Rt===0&&$e(De));Oe!==r;)Ee.push(Oe),e.charCodeAt(we)===32?(Oe=pe,we++):(Oe=r,Rt===0&&$e(De));return Ee!==r?(Ot=we,Oe=d(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(we=te,te=r)):(we=te,te=r),te}function Rn(){var te;return Ot=we,te=ve(),te?te=void 0:te=r,te}function ma(){var te;return Ot=we,te=Ie(),te?te=void 0:te=r,te}function za(){var te;return te=Tl(),te===r&&(te=pc()),te}function ss(){var te,Ee,Oe;if(te=Tl(),te===r){if(te=we,Ee=[],Oe=Za(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=Za();else Ee=r;Ee!==r&&(Ot=te,Ee=me()),te=Ee}return te}function Ac(){var te;return te=Mi(),te===r&&(te=vs(),te===r&&(te=Tl(),te===r&&(te=pc()))),te}function Au(){var te;return te=Mi(),te===r&&(te=Tl(),te===r&&(te=Za())),te}function pc(){var te,Ee,Oe,mt,Et,Dt;if(Rt++,te=we,X.test(e.charAt(we))?(Ee=e.charAt(we),we++):(Ee=r,Rt===0&&$e(be)),Ee!==r){for(Oe=[],mt=we,Et=Fn(),Et===r&&(Et=null),Et!==r?(ke.test(e.charAt(we))?(Dt=e.charAt(we),we++):(Dt=r,Rt===0&&$e(it)),Dt!==r?(Et=[Et,Dt],mt=Et):(we=mt,mt=r)):(we=mt,mt=r);mt!==r;)Oe.push(mt),mt=we,Et=Fn(),Et===r&&(Et=null),Et!==r?(ke.test(e.charAt(we))?(Dt=e.charAt(we),we++):(Dt=r,Rt===0&&$e(it)),Dt!==r?(Et=[Et,Dt],mt=Et):(we=mt,mt=r)):(we=mt,mt=r);Oe!==r?(Ot=te,Ee=_(),te=Ee):(we=te,te=r)}else we=te,te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(ce)),te}function Za(){var te,Ee,Oe,mt,Et;if(te=we,e.substr(we,2)===tt?(Ee=tt,we+=2):(Ee=r,Rt===0&&$e(Fe)),Ee===r&&(Ee=null),Ee!==r)if(Qe.test(e.charAt(we))?(Oe=e.charAt(we),we++):(Oe=r,Rt===0&&$e(Se)),Oe!==r){for(mt=[],je.test(e.charAt(we))?(Et=e.charAt(we),we++):(Et=r,Rt===0&&$e(Te));Et!==r;)mt.push(Et),je.test(e.charAt(we))?(Et=e.charAt(we),we++):(Et=r,Rt===0&&$e(Te));mt!==r?(Ot=te,Ee=_(),te=Ee):(we=te,te=r)}else we=te,te=r;else we=te,te=r;return te}function Mi(){var te,Ee;return te=we,e.substr(we,4)===ct?(Ee=ct,we+=4):(Ee=r,Rt===0&&$e(Me)),Ee!==r&&(Ot=te,Ee=P()),te=Ee,te}function vs(){var te,Ee;return te=we,e.substr(we,4)===w?(Ee=w,we+=4):(Ee=r,Rt===0&&$e(D)),Ee!==r&&(Ot=te,Ee=y()),te=Ee,te===r&&(te=we,e.substr(we,5)===F?(Ee=F,we+=5):(Ee=r,Rt===0&&$e(z)),Ee!==r&&(Ot=te,Ee=Z()),te=Ee),te}function Tl(){var te,Ee,Oe,mt;return Rt++,te=we,e.charCodeAt(we)===34?(Ee=se,we++):(Ee=r,Rt===0&&$e(xe)),Ee!==r?(e.charCodeAt(we)===34?(Oe=se,we++):(Oe=r,Rt===0&&$e(xe)),Oe!==r?(Ot=te,Ee=Ne(),te=Ee):(we=te,te=r)):(we=te,te=r),te===r&&(te=we,e.charCodeAt(we)===34?(Ee=se,we++):(Ee=r,Rt===0&&$e(xe)),Ee!==r?(Oe=yf(),Oe!==r?(e.charCodeAt(we)===34?(mt=se,we++):(mt=r,Rt===0&&$e(xe)),mt!==r?(Ot=te,Ee=ut(Oe),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)),Rt--,te===r&&(Ee=r,Rt===0&&$e(ee)),te}function yf(){var te,Ee,Oe;if(te=we,Ee=[],Oe=hc(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=hc();else Ee=r;return Ee!==r&&(Ot=te,Ee=Ct(Ee)),te=Ee,te}function hc(){var te,Ee,Oe,mt,Et,Dt;return Yt.test(e.charAt(we))?(te=e.charAt(we),we++):(te=r,Rt===0&&$e(ir)),te===r&&(te=we,e.substr(we,2)===Pt?(Ee=Pt,we+=2):(Ee=r,Rt===0&&$e(mn)),Ee!==r&&(Ot=te,Ee=Pr()),te=Ee,te===r&&(te=we,e.substr(we,2)===Cr?(Ee=Cr,we+=2):(Ee=r,Rt===0&&$e(Lr)),Ee!==r&&(Ot=te,Ee=on()),te=Ee,te===r&&(te=we,e.substr(we,2)===ci?(Ee=ci,we+=2):(Ee=r,Rt===0&&$e(Do)),Ee!==r&&(Ot=te,Ee=is()),te=Ee,te===r&&(te=we,e.substr(we,2)===ao?(Ee=ao,we+=2):(Ee=r,Rt===0&&$e(Po)),Ee!==r&&(Ot=te,Ee=ji()),te=Ee,te===r&&(te=we,e.substr(we,2)===lo?(Ee=lo,we+=2):(Ee=r,Rt===0&&$e(xo)),Ee!==r&&(Ot=te,Ee=FA()),te=Ee,te===r&&(te=we,e.substr(we,2)===df?(Ee=df,we+=2):(Ee=r,Rt===0&&$e(mh)),Ee!==r&&(Ot=te,Ee=yh()),te=Ee,te===r&&(te=we,e.substr(we,2)===co?(Ee=co,we+=2):(Ee=r,Rt===0&&$e(qn)),Ee!==r&&(Ot=te,Ee=Ns()),te=Ee,te===r&&(te=we,e.substr(we,2)===uo?(Ee=uo,we+=2):(Ee=r,Rt===0&&$e(ou)),Ee!==r&&(Ot=te,Ee=au()),te=Ee,te===r&&(te=we,e.substr(we,2)===lu?(Ee=lu,we+=2):(Ee=r,Rt===0&&$e(NA)),Ee!==r?(Oe=vi(),Oe!==r?(mt=vi(),mt!==r?(Et=vi(),Et!==r?(Dt=vi(),Dt!==r?(Ot=te,Ee=OA(Oe,mt,Et,Dt),te=Ee):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)):(we=te,te=r)))))))))),te}function vi(){var te;return Aa.test(e.charAt(we))?(te=e.charAt(we),we++):(te=r,Rt===0&&$e(pa)),te}function Fn(){var te,Ee;if(Rt++,te=[],gr.test(e.charAt(we))?(Ee=e.charAt(we),we++):(Ee=r,Rt===0&&$e(ko)),Ee!==r)for(;Ee!==r;)te.push(Ee),gr.test(e.charAt(we))?(Ee=e.charAt(we),we++):(Ee=r,Rt===0&&$e(ko));else te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(LA)),te}function dc(){var te,Ee;if(Rt++,te=[],Ue.test(e.charAt(we))?(Ee=e.charAt(we),we++):(Ee=r,Rt===0&&$e(wr)),Ee!==r)for(;Ee!==r;)te.push(Ee),Ue.test(e.charAt(we))?(Ee=e.charAt(we),we++):(Ee=r,Rt===0&&$e(wr));else te=r;return Rt--,te===r&&(Ee=r,Rt===0&&$e(qa)),te}function ze(){var te,Ee,Oe,mt,Et,Dt;if(te=we,Ee=at(),Ee!==r){for(Oe=[],mt=we,Et=Fn(),Et===r&&(Et=null),Et!==r?(Dt=at(),Dt!==r?(Et=[Et,Dt],mt=Et):(we=mt,mt=r)):(we=mt,mt=r);mt!==r;)Oe.push(mt),mt=we,Et=Fn(),Et===r&&(Et=null),Et!==r?(Dt=at(),Dt!==r?(Et=[Et,Dt],mt=Et):(we=mt,mt=r)):(we=mt,mt=r);Oe!==r?(Ee=[Ee,Oe],te=Ee):(we=te,te=r)}else we=te,te=r;return te}function at(){var te;return e.substr(we,2)===gf?(te=gf,we+=2):(te=r,Rt===0&&$e(MA)),te===r&&(e.charCodeAt(we)===10?(te=UA,we++):(te=r,Rt===0&&$e(cu)),te===r&&(e.charCodeAt(we)===13?(te=uu,we++):(te=r,Rt===0&&$e(cc)))),te}let St=2,lr=0;if(Tn=a(),Tn!==r&&we===e.length)return Tn;throw Tn!==r&&we"u"?!0:typeof e=="object"&&e!==null&&!Array.isArray(e)?Object.keys(e).every(t=>rre(e[t])):!1}function ZU(e,t,r){if(e===null)return`null +`;if(typeof e=="number"||typeof e=="boolean")return`${e.toString()} +`;if(typeof e=="string")return`${ere(e)} +`;if(Array.isArray(e)){if(e.length===0)return`[] +`;let s=" ".repeat(t);return` +${e.map(n=>`${s}- ${ZU(n,t+1,!1)}`).join("")}`}if(typeof e=="object"&&e){let[s,a]=e instanceof Qx?[e.data,!1]:[e,!0],n=" ".repeat(t),c=Object.keys(s);a&&c.sort((p,h)=>{let E=$te.indexOf(p),C=$te.indexOf(h);return E===-1&&C===-1?ph?1:0:E!==-1&&C===-1?-1:E===-1&&C!==-1?1:E-C});let f=c.filter(p=>!rre(s[p])).map((p,h)=>{let E=s[p],C=ere(p),S=ZU(E,t+1,!0),x=h>0||r?n:"",I=C.length>1024?`? ${C} +${x}:`:`${C}:`,R=S.startsWith(` +`)?S:` ${S}`;return`${x}${I}${R}`}).join(t===0?` +`:"")||` +`;return r?` +${f}`:`${f}`}throw new Error(`Unsupported value type (${e})`)}function Al(e){try{let t=ZU(e,0,!1);return t!==` +`?t:""}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function P9e(e){return e.endsWith(` +`)||(e+=` +`),(0,tre.parse)(e)}function k9e(e){if(x9e.test(e))return P9e(e);let t=(0,Tx.safeLoad)(e,{schema:Tx.FAILSAFE_SCHEMA,json:!0});if(t==null)return{};if(typeof t!="object")throw new Error(`Expected an indexed object, got a ${typeof t} instead. Does your file follow Yaml's rules?`);if(Array.isArray(t))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return t}function us(e){return k9e(e)}var Tx,tre,D9e,$te,Qx,x9e,nre=Ze(()=>{Tx=et(zte()),tre=et(Xte()),D9e=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,$te=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],Qx=class{constructor(t){this.data=t}};Al.PreserveOrdering=Qx;x9e=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var W2={};Vt(W2,{parseResolution:()=>Ex,parseShell:()=>gx,parseSyml:()=>us,stringifyArgument:()=>LU,stringifyArgumentSegment:()=>MU,stringifyArithmeticExpression:()=>yx,stringifyCommand:()=>OU,stringifyCommandChain:()=>yE,stringifyCommandChainThen:()=>NU,stringifyCommandLine:()=>mx,stringifyCommandLineThen:()=>FU,stringifyEnvSegment:()=>dx,stringifyRedirectArgument:()=>U2,stringifyResolution:()=>Ix,stringifyShell:()=>mE,stringifyShellLine:()=>mE,stringifySyml:()=>Al,stringifyValueArgument:()=>S0});var Sc=Ze(()=>{ree();oee();nre()});var sre=G((Oxt,XU)=>{"use strict";var Q9e=e=>{let t=!1,r=!1,s=!1;for(let a=0;a{if(!(typeof e=="string"||Array.isArray(e)))throw new TypeError("Expected the input to be `string | string[]`");t=Object.assign({pascalCase:!1},t);let r=a=>t.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(e)?e=e.map(a=>a.trim()).filter(a=>a.length).join("-"):e=e.trim(),e.length===0?"":e.length===1?t.pascalCase?e.toUpperCase():e.toLowerCase():(e!==e.toLowerCase()&&(e=Q9e(e)),e=e.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(e))};XU.exports=ire;XU.exports.default=ire});var ore=G((Lxt,T9e)=>{T9e.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{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:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{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:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{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:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{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:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{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:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var N0=G(Wl=>{"use strict";var lre=ore(),ks=process.env;Object.defineProperty(Wl,"_vendors",{value:lre.map(function(e){return e.constant})});Wl.name=null;Wl.isPR=null;lre.forEach(function(e){let r=(Array.isArray(e.env)?e.env:[e.env]).every(function(s){return are(s)});if(Wl[e.constant]=r,!!r)switch(Wl.name=e.name,typeof e.pr){case"string":Wl.isPR=!!ks[e.pr];break;case"object":"env"in e.pr?Wl.isPR=e.pr.env in ks&&ks[e.pr.env]!==e.pr.ne:"any"in e.pr?Wl.isPR=e.pr.any.some(function(s){return!!ks[s]}):Wl.isPR=are(e.pr);break;default:Wl.isPR=null}});Wl.isCI=!!(ks.CI!=="false"&&(ks.BUILD_ID||ks.BUILD_NUMBER||ks.CI||ks.CI_APP_ID||ks.CI_BUILD_ID||ks.CI_BUILD_NUMBER||ks.CI_NAME||ks.CONTINUOUS_INTEGRATION||ks.RUN_ID||Wl.name));function are(e){return typeof e=="string"?!!ks[e]:"env"in e?ks[e.env]&&ks[e.env].includes(e.includes):"any"in e?e.any.some(function(t){return!!ks[t]}):Object.keys(e).every(function(t){return ks[t]===e[t]})}});var ii,Cn,O0,$U,Rx,cre,e_,t_,Fx=Ze(()=>{(function(e){e.StartOfInput="\0",e.EndOfInput="",e.EndOfPartialInput=""})(ii||(ii={}));(function(e){e[e.InitialNode=0]="InitialNode",e[e.SuccessNode=1]="SuccessNode",e[e.ErrorNode=2]="ErrorNode",e[e.CustomNode=3]="CustomNode"})(Cn||(Cn={}));O0=-1,$U=/^(-h|--help)(?:=([0-9]+))?$/,Rx=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,cre=/^-[a-zA-Z]{2,}$/,e_=/^([^=]+)=([\s\S]*)$/,t_=process.env.DEBUG_CLI==="1"});var ot,bE,Nx,r_,Ox=Ze(()=>{Fx();ot=class extends Error{constructor(t){super(t),this.clipanion={type:"usage"},this.name="UsageError"}},bE=class extends Error{constructor(t,r){if(super(),this.input=t,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(s=>s.reason!==null&&s.reason===r[0].reason)){let[{reason:s}]=this.candidates;this.message=`${s} + +${this.candidates.map(({usage:a})=>`$ ${a}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:s}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${s} +${r_(t)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:s},a)=>`${`${a}.`.padStart(4)} ${s}`).join(` +`)} + +${r_(t)}`}},Nx=class extends Error{constructor(t,r){super(),this.input=t,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((s,a)=>`${`${a}.`.padStart(4)} ${s}`).join(` +`)} + +${r_(t)}`}},r_=e=>`While running ${e.filter(t=>t!==ii.EndOfInput&&t!==ii.EndOfPartialInput).map(t=>{let r=JSON.stringify(t);return t.match(/\s/)||t.length===0||r!==`"${t}"`?r:t}).join(" ")}`});function R9e(e){let t=e.split(` +`),r=t.filter(a=>a.match(/\S/)),s=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return t.map(a=>a.slice(s).trimRight()).join(` +`)}function Ko(e,{format:t,paragraphs:r}){return e=e.replace(/\r\n?/g,` +`),e=R9e(e),e=e.replace(/^\n+|\n+$/g,""),e=e.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),e=e.replace(/\n(\n)?\n*/g,(s,a)=>a||" "),r&&(e=e.split(/\n/).map(s=>{let a=s.match(/^\s*[*-][\t ]+(.*)/);if(!a)return s.match(/(.{1,80})(?: |$)/g).join(` +`);let n=s.length-s.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((c,f)=>" ".repeat(n)+(f===0?"- ":" ")+c).join(` +`)}).join(` + +`)),e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(s,a,n)=>t.code(a+n+a)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(s,a,n)=>t.bold(a+n+a)),e?`${e} +`:""}var n_,ure,fre,i_=Ze(()=>{n_=Array(80).fill("\u2501");for(let e=0;e<=24;++e)n_[n_.length-e]=`\x1B[38;5;${232+e}m\u2501`;ure={header:e=>`\x1B[1m\u2501\u2501\u2501 ${e}${e.length<75?` ${n_.slice(e.length+5).join("")}`:":"}\x1B[0m`,bold:e=>`\x1B[1m${e}\x1B[22m`,error:e=>`\x1B[31m\x1B[1m${e}\x1B[22m\x1B[39m`,code:e=>`\x1B[36m${e}\x1B[39m`},fre={header:e=>e,bold:e=>e,error:e=>e,code:e=>e}});function va(e){return{...e,[V2]:!0}}function Wf(e,t){return typeof e>"u"?[e,t]:typeof e=="object"&&e!==null&&!Array.isArray(e)?[void 0,e]:[e,t]}function Lx(e,{mergeName:t=!1}={}){let r=e.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,s,a]=r;return t&&(a=a[0].toLowerCase()+a.slice(1)),a=s!=="."||!t?`${s.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function K2(e,t){return t.length===1?new ot(`${e}${Lx(t[0],{mergeName:!0})}`):new ot(`${e}: +${t.map(r=>` +- ${Lx(r)}`).join("")}`)}function L0(e,t,r){if(typeof r>"u")return t;let s=[],a=[],n=f=>{let p=t;return t=f,n.bind(null,p)};if(!r(t,{errors:s,coercions:a,coercion:n}))throw K2(`Invalid value for ${e}`,s);for(let[,f]of a)f();return t}var V2,vp=Ze(()=>{Ox();V2=Symbol("clipanion/isOption")});var qs={};Vt(qs,{KeyRelationship:()=>Vf,TypeAssertionError:()=>ad,applyCascade:()=>z2,as:()=>X9e,assert:()=>J9e,assertWithErrors:()=>z9e,cascade:()=>ld,fn:()=>$9e,hasAtLeastOneKey:()=>f_,hasExactLength:()=>gre,hasForbiddenKeys:()=>yqe,hasKeyRelationship:()=>X2,hasMaxLength:()=>tqe,hasMinLength:()=>eqe,hasMutuallyExclusiveKeys:()=>Eqe,hasRequiredKeys:()=>mqe,hasUniqueItems:()=>rqe,isArray:()=>Mx,isAtLeast:()=>c_,isAtMost:()=>sqe,isBase64:()=>pqe,isBoolean:()=>H9e,isDate:()=>G9e,isDict:()=>W9e,isEnum:()=>Qs,isHexColor:()=>Aqe,isISO8601:()=>fqe,isInExclusiveRange:()=>aqe,isInInclusiveRange:()=>oqe,isInstanceOf:()=>K9e,isInteger:()=>u_,isJSON:()=>hqe,isLiteral:()=>pre,isLowerCase:()=>lqe,isMap:()=>Y9e,isNegative:()=>nqe,isNullable:()=>gqe,isNumber:()=>a_,isObject:()=>hre,isOneOf:()=>l_,isOptional:()=>dqe,isPartial:()=>V9e,isPayload:()=>j9e,isPositive:()=>iqe,isRecord:()=>_x,isSet:()=>q9e,isString:()=>Jf,isTuple:()=>Ux,isUUID4:()=>uqe,isUnknown:()=>o_,isUpperCase:()=>cqe,makeTrait:()=>dre,makeValidator:()=>Wr,matchesRegExp:()=>Sp,softAssert:()=>Z9e});function si(e){return e===null?"null":e===void 0?"undefined":e===""?"an empty string":typeof e=="symbol"?`<${e.toString()}>`:Array.isArray(e)?"an array":JSON.stringify(e)}function DE(e,t){if(e.length===0)return"nothing";if(e.length===1)return si(e[0]);let r=e.slice(0,-1),s=e[e.length-1],a=e.length>2?`, ${t} `:` ${t} `;return`${r.map(n=>si(n)).join(", ")}${a}${si(s)}`}function od(e,t){var r,s,a;return typeof t=="number"?`${(r=e?.p)!==null&&r!==void 0?r:"."}[${t}]`:F9e.test(t)?`${(s=e?.p)!==null&&s!==void 0?s:""}.${t}`:`${(a=e?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(t)}]`}function s_(e,t,r){return e===1?t:r}function Er({errors:e,p:t}={},r){return e?.push(`${t??"."}: ${r}`),!1}function U9e(e,t){return r=>{e[t]=r}}function Kf(e,t){return r=>{let s=e[t];return e[t]=r,Kf(e,t).bind(null,s)}}function J2(e,t,r){let s=()=>(e(r()),a),a=()=>(e(t),s);return s}function o_(){return Wr({test:(e,t)=>!0})}function pre(e){return Wr({test:(t,r)=>t!==e?Er(r,`Expected ${si(e)} (got ${si(t)})`):!0})}function Jf(){return Wr({test:(e,t)=>typeof e!="string"?Er(t,`Expected a string (got ${si(e)})`):!0})}function Qs(e){let t=Array.isArray(e)?e:Object.values(e),r=t.every(a=>typeof a=="string"||typeof a=="number"),s=new Set(t);return s.size===1?pre([...s][0]):Wr({test:(a,n)=>s.has(a)?!0:r?Er(n,`Expected one of ${DE(t,"or")} (got ${si(a)})`):Er(n,`Expected a valid enumeration value (got ${si(a)})`)})}function H9e(){return Wr({test:(e,t)=>{var r;if(typeof e!="boolean"){if(typeof t?.coercions<"u"){if(typeof t?.coercion>"u")return Er(t,"Unbound coercion result");let s=_9e.get(e);if(typeof s<"u")return t.coercions.push([(r=t.p)!==null&&r!==void 0?r:".",t.coercion.bind(null,s)]),!0}return Er(t,`Expected a boolean (got ${si(e)})`)}return!0}})}function a_(){return Wr({test:(e,t)=>{var r;if(typeof e!="number"){if(typeof t?.coercions<"u"){if(typeof t?.coercion>"u")return Er(t,"Unbound coercion result");let s;if(typeof e=="string"){let a;try{a=JSON.parse(e)}catch{}if(typeof a=="number")if(JSON.stringify(a)===e)s=a;else return Er(t,`Received a number that can't be safely represented by the runtime (${e})`)}if(typeof s<"u")return t.coercions.push([(r=t.p)!==null&&r!==void 0?r:".",t.coercion.bind(null,s)]),!0}return Er(t,`Expected a number (got ${si(e)})`)}return!0}})}function j9e(e){return Wr({test:(t,r)=>{var s;if(typeof r?.coercions>"u")return Er(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return Er(r,"Unbound coercion result");if(typeof t!="string")return Er(r,`Expected a string (got ${si(t)})`);let a;try{a=JSON.parse(t)}catch{return Er(r,`Expected a JSON string (got ${si(t)})`)}let n={value:a};return e(a,Object.assign(Object.assign({},r),{coercion:Kf(n,"value")}))?(r.coercions.push([(s=r.p)!==null&&s!==void 0?s:".",r.coercion.bind(null,n.value)]),!0):!1}})}function G9e(){return Wr({test:(e,t)=>{var r;if(!(e instanceof Date)){if(typeof t?.coercions<"u"){if(typeof t?.coercion>"u")return Er(t,"Unbound coercion result");let s;if(typeof e=="string"&&Are.test(e))s=new Date(e);else{let a;if(typeof e=="string"){let n;try{n=JSON.parse(e)}catch{}typeof n=="number"&&(a=n)}else typeof e=="number"&&(a=e);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))s=new Date(a*1e3);else return Er(t,`Received a timestamp that can't be safely represented by the runtime (${e})`)}if(typeof s<"u")return t.coercions.push([(r=t.p)!==null&&r!==void 0?r:".",t.coercion.bind(null,s)]),!0}return Er(t,`Expected a date (got ${si(e)})`)}return!0}})}function Mx(e,{delimiter:t}={}){return Wr({test:(r,s)=>{var a;let n=r;if(typeof r=="string"&&typeof t<"u"&&typeof s?.coercions<"u"){if(typeof s?.coercion>"u")return Er(s,"Unbound coercion result");r=r.split(t)}if(!Array.isArray(r))return Er(s,`Expected an array (got ${si(r)})`);let c=!0;for(let f=0,p=r.length;f{var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return Er(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,C)=>E!==f[C])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",J2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=e(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return Er(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Kf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",J2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return Er(a,`Expected a set (got ${si(s)})`)}})}function Y9e(e,t){let r=Mx(Ux([e,t])),s=_x(t,{keys:e});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return Er(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let C=()=>E.some((S,x)=>S[0]!==h[x][0]||S[1]!==h[x][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",J2(n.coercion,a,C)]),!0}else{let h=!0;for(let[E,C]of a)if(h=e(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=t(C,Object.assign(Object.assign({},n),{p:od(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return Er(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",J2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Kf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",J2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return Er(n,`Expected a map (got ${si(a)})`)}})}function Ux(e,{delimiter:t}={}){let r=gre(e.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof t<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return Er(a,"Unbound coercion result");s=s.split(t),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return Er(a,`Expected a tuple (got ${si(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f{var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?Er(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return Er(a,`Expected an object (got ${si(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p{if(typeof a!="object"||a===null)return Er(n,`Expected an object (got ${si(a)})`);let c=new Set([...r,...Object.keys(a)]),f={},p=!0;for(let h of c){if(h==="constructor"||h==="__proto__")p=Er(Object.assign(Object.assign({},n),{p:od(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(e,h)?e[h]:void 0,C=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(C,Object.assign(Object.assign({},n),{p:od(n,h),coercion:Kf(a,h)}))&&p:t===null?p=Er(Object.assign(Object.assign({},n),{p:od(n,h)}),`Extraneous property (got ${si(C)})`):Object.defineProperty(f,h,{enumerable:!0,get:()=>C,set:U9e(a,h)})}if(!p&&n?.errors==null)break}return t!==null&&(p||n?.errors!=null)&&(p=t(f,n)&&p),p}});return Object.assign(s,{properties:e})}function V9e(e){return hre(e,{extra:_x(o_())})}function dre(e){return()=>e}function Wr({test:e}){return dre(e)()}function J9e(e,t){if(!t(e))throw new ad}function z9e(e,t){let r=[];if(!t(e,{errors:r}))throw new ad({errors:r})}function Z9e(e,t){}function X9e(e,t,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if(!r){if(t(e,{errors:n}))return a?e:{value:e,errors:void 0};if(a)throw new ad({errors:n});return{value:void 0,errors:n??!0}}let c={value:e},f=Kf(c,"value"),p=[];if(!t(e,{errors:n,coercion:f,coercions:p})){if(a)throw new ad({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?c.value:{value:c.value,errors:void 0}}function $9e(e,t){let r=Ux(e);return(...s)=>{if(!r(s))throw new ad;return t(...s)}}function eqe(e){return Wr({test:(t,r)=>t.length>=e?!0:Er(r,`Expected to have a length of at least ${e} elements (got ${t.length})`)})}function tqe(e){return Wr({test:(t,r)=>t.length<=e?!0:Er(r,`Expected to have a length of at most ${e} elements (got ${t.length})`)})}function gre(e){return Wr({test:(t,r)=>t.length!==e?Er(r,`Expected to have a length of exactly ${e} elements (got ${t.length})`):!0})}function rqe({map:e}={}){return Wr({test:(t,r)=>{let s=new Set,a=new Set;for(let n=0,c=t.length;ne<=0?!0:Er(t,`Expected to be negative (got ${e})`)})}function iqe(){return Wr({test:(e,t)=>e>=0?!0:Er(t,`Expected to be positive (got ${e})`)})}function c_(e){return Wr({test:(t,r)=>t>=e?!0:Er(r,`Expected to be at least ${e} (got ${t})`)})}function sqe(e){return Wr({test:(t,r)=>t<=e?!0:Er(r,`Expected to be at most ${e} (got ${t})`)})}function oqe(e,t){return Wr({test:(r,s)=>r>=e&&r<=t?!0:Er(s,`Expected to be in the [${e}; ${t}] range (got ${r})`)})}function aqe(e,t){return Wr({test:(r,s)=>r>=e&&rt!==Math.round(t)?Er(r,`Expected to be an integer (got ${t})`):!e&&!Number.isSafeInteger(t)?Er(r,`Expected to be a safe integer (got ${t})`):!0})}function Sp(e){return Wr({test:(t,r)=>e.test(t)?!0:Er(r,`Expected to match the pattern ${e.toString()} (got ${si(t)})`)})}function lqe(){return Wr({test:(e,t)=>e!==e.toLowerCase()?Er(t,`Expected to be all-lowercase (got ${e})`):!0})}function cqe(){return Wr({test:(e,t)=>e!==e.toUpperCase()?Er(t,`Expected to be all-uppercase (got ${e})`):!0})}function uqe(){return Wr({test:(e,t)=>M9e.test(e)?!0:Er(t,`Expected to be a valid UUID v4 (got ${si(e)})`)})}function fqe(){return Wr({test:(e,t)=>Are.test(e)?!0:Er(t,`Expected to be a valid ISO 8601 date string (got ${si(e)})`)})}function Aqe({alpha:e=!1}){return Wr({test:(t,r)=>(e?N9e.test(t):O9e.test(t))?!0:Er(r,`Expected to be a valid hexadecimal color string (got ${si(t)})`)})}function pqe(){return Wr({test:(e,t)=>L9e.test(e)?!0:Er(t,`Expected to be a valid base 64 string (got ${si(e)})`)})}function hqe(e=o_()){return Wr({test:(t,r)=>{let s;try{s=JSON.parse(t)}catch{return Er(r,`Expected to be a valid JSON string (got ${si(t)})`)}return e(s,r)}})}function ld(e,...t){let r=Array.isArray(t[0])?t[0]:t;return Wr({test:(s,a)=>{var n,c;let f={value:s},p=typeof a?.coercions<"u"?Kf(f,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!e(s,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,C]of h)E.push(C());try{if(typeof a?.coercions<"u"){if(f.value!==s){if(typeof a?.coercion>"u")return Er(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,f.value)])}(c=a?.coercions)===null||c===void 0||c.push(...h)}return r.every(C=>C(f.value,a))}finally{for(let C of E)C()}}})}function z2(e,...t){let r=Array.isArray(t[0])?t[0]:t;return ld(e,r)}function dqe(e){return Wr({test:(t,r)=>typeof t>"u"?!0:e(t,r)})}function gqe(e){return Wr({test:(t,r)=>t===null?!0:e(t,r)})}function mqe(e,t){var r;let s=new Set(e),a=Z2[(r=t?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)||p.push(h);return p.length>0?Er(c,`Missing required ${s_(p.length,"property","properties")} ${DE(p,"and")}`):!0}})}function f_(e,t){var r;let s=new Set(e),a=Z2[(r=t?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>Object.keys(n).some(h=>a(s,h,n))?!0:Er(c,`Missing at least one property from ${DE(Array.from(s),"or")}`)})}function yqe(e,t){var r;let s=new Set(e),a=Z2[(r=t?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>0?Er(c,`Forbidden ${s_(p.length,"property","properties")} ${DE(p,"and")}`):!0}})}function Eqe(e,t){var r;let s=new Set(e),a=Z2[(r=t?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>1?Er(c,`Mutually exclusive properties ${DE(p,"and")}`):!0}})}function X2(e,t,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==void 0?a:[]),f=Z2[(n=s?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=Iqe[t],E=t===Vf.Forbids?"or":"and";return Wr({test:(C,S)=>{let x=new Set(Object.keys(C));if(!f(x,e,C)||c.has(C[e]))return!0;let I=[];for(let R of p)(f(x,R,C)&&!c.has(C[R]))!==h.expect&&I.push(R);return I.length>=1?Er(S,`Property "${e}" ${h.message} ${s_(I.length,"property","properties")} ${DE(I,E)}`):!0}})}var F9e,N9e,O9e,L9e,M9e,Are,_9e,K9e,l_,ad,Z2,Vf,Iqe,Jo=Ze(()=>{F9e=/^[a-zA-Z_][a-zA-Z0-9_]*$/;N9e=/^#[0-9a-f]{6}$/i,O9e=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,L9e=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,M9e=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,Are=/^(?:[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)?)$/;_9e=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);K9e=e=>Wr({test:(t,r)=>t instanceof e?!0:Er(r,`Expected an instance of ${e.name} (got ${si(t)})`)}),l_=(e,{exclusive:t=!1}={})=>Wr({test:(r,s)=>{var a,n,c;let f=[],p=typeof s?.errors<"u"?[]:void 0;for(let h=0,E=e.length;h1?Er(s,`Expected to match exactly a single predicate (matched ${f.join(", ")})`):(c=s?.errors)===null||c===void 0||c.push(...p),!1}});ad=class extends Error{constructor({errors:t}={}){let r="Type mismatch";if(t&&t.length>0){r+=` +`;for(let s of t)r+=` +- ${s}`}super(r)}};Z2={missing:(e,t)=>e.has(t),undefined:(e,t,r)=>e.has(t)&&typeof r[t]<"u",nil:(e,t,r)=>e.has(t)&&r[t]!=null,falsy:(e,t,r)=>e.has(t)&&!!r[t]};(function(e){e.Forbids="Forbids",e.Requires="Requires"})(Vf||(Vf={}));Iqe={[Vf.Forbids]:{expect:!1,message:"forbids using"},[Vf.Requires]:{expect:!0,message:"requires using"}}});var st,cd=Ze(()=>{vp();st=class{constructor(){this.help=!1}static Usage(t){return t}async catch(t){throw t}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:c}=await Promise.resolve().then(()=>(Jo(),qs)),f=c(a(n()),r),p=[],h=[];if(!f(this,{errors:p,coercions:h}))throw K2("Invalid option schema",p);for(let[,C]of h)C()}else if(r!=null)throw new Error("Invalid command schema");let s=await this.execute();return typeof s<"u"?s:0}};st.isOption=V2;st.Default=[]});function pl(e){t_&&console.log(e)}function yre(){let e={nodes:[]};for(let t=0;t{if(t.has(s))return;t.add(s);let a=e.nodes[s];for(let c of Object.values(a.statics))for(let{to:f}of c)r(f);for(let[,{to:c}]of a.dynamics)r(c);for(let{to:c}of a.shortcuts)r(c);let n=new Set(a.shortcuts.map(({to:c})=>c));for(;a.shortcuts.length>0;){let{to:c}=a.shortcuts.shift(),f=e.nodes[c];for(let[p,h]of Object.entries(f.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let C of h)E.some(({to:S})=>C.to===S)||E.push(C)}for(let[p,h]of f.dynamics)a.dynamics.some(([E,{to:C}])=>p===E&&h.to===C)||a.dynamics.push([p,h]);for(let p of f.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(Cn.InitialNode)}function Bqe(e,{prefix:t=""}={}){if(t_){pl(`${t}Nodes are:`);for(let r=0;rE!==Cn.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===Cn.ErrorNode))throw new bE(t,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));s=bqe(h)}if(s.length>0){pl(" Results:");for(let n of s)pl(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else pl(" No results");return s}function Sqe(e,t,{endToken:r=ii.EndOfInput}={}){let s=vqe(e,[...t,r]);return Dqe(t,s.map(({state:a})=>a))}function bqe(e){let t=0;for(let{state:r}of e)r.path.length>t&&(t=r.path.length);return e.filter(({state:r})=>r.path.length===t)}function Dqe(e,t){let r=t.filter(S=>S.selectedIndex!==null),s=r.filter(S=>!S.partial);if(s.length>0&&(r=s),r.length===0)throw new Error;let a=r.filter(S=>S.selectedIndex===O0||S.requiredOptions.every(x=>x.some(I=>S.options.find(R=>R.name===I))));if(a.length===0)throw new bE(e,r.map(S=>({usage:S.candidateUsage,reason:null})));let n=0;for(let S of a)S.path.length>n&&(n=S.path.length);let c=a.filter(S=>S.path.length===n),f=S=>S.positionals.filter(({extra:x})=>!x).length+S.options.length,p=c.map(S=>({state:S,positionalCount:f(S)})),h=0;for(let{positionalCount:S}of p)S>h&&(h=S);let E=p.filter(({positionalCount:S})=>S===h).map(({state:S})=>S),C=Pqe(E);if(C.length>1)throw new Nx(e,C.map(S=>S.candidateUsage));return C[0]}function Pqe(e){let t=[],r=[];for(let s of e)s.selectedIndex===O0?r.push(s):t.push(s);return r.length>0&&t.push({...mre,path:Ere(...r.map(s=>s.path)),options:r.reduce((s,a)=>s.concat(a.options),[])}),t}function Ere(e,t,...r){return t===void 0?Array.from(e):Ere(e.filter((s,a)=>s===t[a]),...r)}function Vl(){return{dynamics:[],shortcuts:[],statics:{}}}function Ire(e){return e===Cn.SuccessNode||e===Cn.ErrorNode}function A_(e,t=0){return{to:Ire(e.to)?e.to:e.to>=Cn.CustomNode?e.to+t-Cn.CustomNode+1:e.to+t,reducer:e.reducer}}function xqe(e,t=0){let r=Vl();for(let[s,a]of e.dynamics)r.dynamics.push([s,A_(a,t)]);for(let s of e.shortcuts)r.shortcuts.push(A_(s,t));for(let[s,a]of Object.entries(e.statics))r.statics[s]=a.map(n=>A_(n,t));return r}function Ys(e,t,r,s,a){e.nodes[t].dynamics.push([r,{to:s,reducer:a}])}function PE(e,t,r,s){e.nodes[t].shortcuts.push({to:r,reducer:s})}function Sa(e,t,r,s,a){(Object.prototype.hasOwnProperty.call(e.nodes[t].statics,r)?e.nodes[t].statics[r]:e.nodes[t].statics[r]=[]).push({to:s,reducer:a})}function Hx(e,t,r,s,a){if(Array.isArray(t)){let[n,...c]=t;return e[n](r,s,a,...c)}else return e[t](r,s,a)}var mre,kqe,p_,Kl,h_,jx,Gx=Ze(()=>{Fx();Ox();mre={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:O0,partial:!1,tokens:[]};kqe={always:()=>!0,isOptionLike:(e,t)=>!e.ignoreOptions&&t!=="-"&&t.startsWith("-"),isNotOptionLike:(e,t)=>e.ignoreOptions||t==="-"||!t.startsWith("-"),isOption:(e,t,r,s)=>!e.ignoreOptions&&t===s,isBatchOption:(e,t,r,s)=>!e.ignoreOptions&&cre.test(t)&&[...t.slice(1)].every(a=>s.has(`-${a}`)),isBoundOption:(e,t,r,s,a)=>{let n=t.match(e_);return!e.ignoreOptions&&!!n&&Rx.test(n[1])&&s.has(n[1])&&a.filter(c=>c.nameSet.includes(n[1])).every(c=>c.allowBinding)},isNegatedOption:(e,t,r,s)=>!e.ignoreOptions&&t===`--no-${s.slice(2)}`,isHelp:(e,t)=>!e.ignoreOptions&&$U.test(t),isUnsupportedOption:(e,t,r,s)=>!e.ignoreOptions&&t.startsWith("-")&&Rx.test(t)&&!s.has(t),isInvalidOption:(e,t)=>!e.ignoreOptions&&t.startsWith("-")&&!Rx.test(t)},p_={setCandidateState:(e,t,r,s)=>({...e,...s}),setSelectedIndex:(e,t,r,s)=>({...e,selectedIndex:s}),setPartialIndex:(e,t,r,s)=>({...e,selectedIndex:s,partial:!0}),pushBatch:(e,t,r,s)=>{let a=e.options.slice(),n=e.tokens.slice();for(let c=1;c{let[,s,a]=t.match(e_),n=e.options.concat({name:s,value:a}),c=e.tokens.concat([{segmentIndex:r,type:"option",slice:[0,s.length],option:s},{segmentIndex:r,type:"assign",slice:[s.length,s.length+1]},{segmentIndex:r,type:"value",slice:[s.length+1,s.length+a.length+1]}]);return{...e,options:n,tokens:c}},pushPath:(e,t,r)=>{let s=e.path.concat(t),a=e.tokens.concat({segmentIndex:r,type:"path"});return{...e,path:s,tokens:a}},pushPositional:(e,t,r)=>{let s=e.positionals.concat({value:t,extra:!1}),a=e.tokens.concat({segmentIndex:r,type:"positional"});return{...e,positionals:s,tokens:a}},pushExtra:(e,t,r)=>{let s=e.positionals.concat({value:t,extra:!0}),a=e.tokens.concat({segmentIndex:r,type:"positional"});return{...e,positionals:s,tokens:a}},pushExtraNoLimits:(e,t,r)=>{let s=e.positionals.concat({value:t,extra:Kl}),a=e.tokens.concat({segmentIndex:r,type:"positional"});return{...e,positionals:s,tokens:a}},pushTrue:(e,t,r,s)=>{let a=e.options.concat({name:s,value:!0}),n=e.tokens.concat({segmentIndex:r,type:"option",option:s});return{...e,options:a,tokens:n}},pushFalse:(e,t,r,s)=>{let a=e.options.concat({name:s,value:!1}),n=e.tokens.concat({segmentIndex:r,type:"option",option:s});return{...e,options:a,tokens:n}},pushUndefined:(e,t,r,s)=>{let a=e.options.concat({name:t,value:void 0}),n=e.tokens.concat({segmentIndex:r,type:"option",option:t});return{...e,options:a,tokens:n}},pushStringValue:(e,t,r)=>{var s;let a=e.options[e.options.length-1],n=e.options.slice(),c=e.tokens.concat({segmentIndex:r,type:"value"});return a.value=((s=a.value)!==null&&s!==void 0?s:[]).concat([t]),{...e,options:n,tokens:c}},setStringValue:(e,t,r)=>{let s=e.options[e.options.length-1],a=e.options.slice(),n=e.tokens.concat({segmentIndex:r,type:"value"});return s.value=t,{...e,options:a,tokens:n}},inhibateOptions:e=>({...e,ignoreOptions:!0}),useHelp:(e,t,r,s)=>{let[,,a]=t.match($U);return typeof a<"u"?{...e,options:[{name:"-c",value:String(s)},{name:"-i",value:a}]}:{...e,options:[{name:"-c",value:String(s)}]}},setError:(e,t,r,s)=>t===ii.EndOfInput||t===ii.EndOfPartialInput?{...e,errorMessage:`${s}.`}:{...e,errorMessage:`${s} ("${t}").`},setOptionArityError:(e,t)=>{let r=e.options[e.options.length-1];return{...e,errorMessage:`Not enough arguments to option ${r.name}.`}}},Kl=Symbol(),h_=class{constructor(t,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=t,this.cliOpts=r}addPath(t){this.paths.push(t)}setArity({leading:t=this.arity.leading,trailing:r=this.arity.trailing,extra:s=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:t,trailing:r,extra:s,proxy:a})}addPositional({name:t="arg",required:r=!0}={}){if(!r&&this.arity.extra===Kl)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!==Kl?this.arity.extra.push(t):this.arity.extra!==Kl&&this.arity.extra.length===0?this.arity.leading.push(t):this.arity.trailing.push(t)}addRest({name:t="arg",required:r=0}={}){if(this.arity.extra===Kl)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 s=0;s1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(s))throw new Error(`The arity must be an integer, got ${s}`);if(s<0)throw new Error(`The arity must be positive, got ${s}`);let f=t.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of t)this.allOptionNames.set(p,f);this.options.push({preferredName:f,nameSet:t,description:r,arity:s,hidden:a,required:n,allowBinding:c})}setContext(t){this.context=t}usage({detailed:t=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&s.push(...this.paths[0]),t){for(let{preferredName:c,nameSet:f,arity:p,hidden:h,description:E,required:C}of this.options){if(h)continue;let S=[];for(let I=0;I`:`[${x}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===Kl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let t=yre(),r=Cn.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Nu(t,Vl()),Sa(t,Cn.InitialNode,ii.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Nu(t,Vl());PE(t,p,S),this.registerOptions(t,S),p=S}for(let S=0;S0||!this.arity.proxy){let S=Nu(t,Vl());Ys(t,p,"isHelp",S,["useHelp",this.cliIndex]),Ys(t,S,"always",S,"pushExtra"),Sa(t,S,ii.EndOfInput,Cn.SuccessNode,["setSelectedIndex",O0]),this.registerOptions(t,p)}this.arity.leading.length>0&&(Sa(t,p,ii.EndOfInput,Cn.ErrorNode,["setError","Not enough positional arguments"]),Sa(t,p,ii.EndOfPartialInput,Cn.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let S=0;S0||S+1!==this.arity.leading.length)&&(Sa(t,x,ii.EndOfInput,Cn.ErrorNode,["setError","Not enough positional arguments"]),Sa(t,x,ii.EndOfPartialInput,Cn.SuccessNode,["setPartialIndex",this.cliIndex])),Ys(t,h,"isNotOptionLike",x,"pushPositional"),h=x}let E=h;if(this.arity.extra===Kl||this.arity.extra.length>0){let S=Nu(t,Vl());if(PE(t,h,S),this.arity.extra===Kl){let x=Nu(t,Vl());this.arity.proxy||this.registerOptions(t,x),Ys(t,h,n,x,"pushExtraNoLimits"),Ys(t,x,n,x,"pushExtraNoLimits"),PE(t,x,S)}else for(let x=0;x0)&&this.registerOptions(t,I),Ys(t,E,n,I,"pushExtra"),PE(t,I,S),E=I}E=S}this.arity.trailing.length>0&&(Sa(t,E,ii.EndOfInput,Cn.ErrorNode,["setError","Not enough positional arguments"]),Sa(t,E,ii.EndOfPartialInput,Cn.SuccessNode,["setPartialIndex",this.cliIndex]));let C=E;for(let S=0;S=0&&t{let c=n?ii.EndOfPartialInput:ii.EndOfInput;return Sqe(s,a,{endToken:c})}}}}});function wre(){return qx.default&&"getColorDepth"in qx.default.WriteStream.prototype?qx.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function Bre(e){let t=Cre;if(typeof t>"u"){if(e.stdout===process.stdout&&e.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ce("async_hooks");t=Cre=new r;let s=process.stdout._write;process.stdout._write=function(n,c,f){let p=t.getStore();return typeof p>"u"?s.call(this,n,c,f):p.stdout.write(n,c,f)};let a=process.stderr._write;process.stderr._write=function(n,c,f){let p=t.getStore();return typeof p>"u"?a.call(this,n,c,f):p.stderr.write(n,c,f)}}return r=>t.run(e,r)}var qx,Cre,vre=Ze(()=>{qx=et(Ce("tty"),1)});var Yx,Sre=Ze(()=>{cd();Yx=class e extends st{constructor(t){super(),this.contexts=t,this.commands=[]}static from(t,r){let s=new e(r);s.path=t.path;for(let a of t.options)switch(a.name){case"-c":s.commands.push(Number(a.value));break;case"-i":s.index=Number(a.value);break}return s}async execute(){let t=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let s of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[s].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. +`)}}}});async function Pre(...e){let{resolvedOptions:t,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=kre(e);return ba.from(r,t).runExit(s,a)}async function xre(...e){let{resolvedOptions:t,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=kre(e);return ba.from(r,t).run(s,a)}function kre(e){let t,r,s,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(s=process.argv.slice(2)),e.length){case 1:r=e[0];break;case 2:e[0]&&e[0].prototype instanceof st||Array.isArray(e[0])?(r=e[0],Array.isArray(e[1])?s=e[1]:a=e[1]):(t=e[0],r=e[1]);break;case 3:Array.isArray(e[2])?(t=e[0],r=e[1],s=e[2]):e[0]&&e[0].prototype instanceof st||Array.isArray(e[0])?(r=e[0],s=e[1],a=e[2]):(t=e[0],r=e[1],a=e[2]);break;default:t=e[0],r=e[1],s=e[2],a=e[3];break}if(typeof s>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:t,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}}function Dre(e){return e()}var bre,ba,Qre=Ze(()=>{Fx();Gx();i_();vre();cd();Sre();bre=Symbol("clipanion/errorCommand");ba=class e{constructor({binaryLabel:t,binaryName:r="...",binaryVersion:s,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new jx({binaryName:r}),this.binaryLabel=t,this.binaryName=r,this.binaryVersion=s,this.enableCapture=a,this.enableColors=n}static from(t,r={}){let s=new e(r),a=Array.isArray(t)?t:[t];for(let n of a)s.register(n);return s}register(t){var r;let s=new Map,a=new t;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[st.isOption]&&s.set(p,h)}let n=this.builder.command(),c=n.cliIndex,f=(r=t.paths)!==null&&r!==void 0?r:a.paths;if(typeof f<"u")for(let p of f)n.addPath(p);this.registrations.set(t,{specs:s,builder:n,index:c});for(let[p,{definition:h}]of s.entries())h(n,p);n.setContext({commandClass:t})}process(t,r){let{input:s,context:a,partial:n}=typeof t=="object"&&Array.isArray(t)?{input:t,context:r}:t,{contexts:c,process:f}=this.builder.compile(),p=f(s,{partial:n}),h={...e.defaultContext,...a};switch(p.selectedIndex){case O0:{let E=Yx.from(p,c);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=c[p.selectedIndex],C=this.registrations.get(E);if(typeof C>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let S=new E;S.context=h,S.tokens=p.tokens,S.path=p.path;try{for(let[x,{transformer:I}]of C.specs.entries())S[x]=I(C.builder,x,p,h);return S}catch(x){throw x[bre]=S,x}}break}}async run(t,r){var s,a;let n,c={...e.defaultContext,...r},f=(s=this.enableColors)!==null&&s!==void 0?s:c.colorDepth>1;if(!Array.isArray(t))n=t;else try{n=this.process(t,c)}catch(E){return c.stdout.write(this.error(E,{colored:f})),1}if(n.help)return c.stdout.write(this.usage(n,{colored:f,detailed:!0})),0;n.context=c,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,C)=>this.error(E,C),format:E=>this.format(E),process:(E,C)=>this.process(E,{...c,...C}),run:(E,C)=>this.run(E,{...c,...C}),usage:(E,C)=>this.usage(E,C)};let p=this.enableCapture&&(a=Bre(c))!==null&&a!==void 0?a:Dre,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return c.stdout.write(this.error(E,{colored:f,command:n})),1}return h}async runExit(t,r){process.exitCode=await this.run(t,r)}definition(t,{colored:r=!1}={}){if(!t.usage)return null;let{usage:s}=this.getUsageByRegistration(t,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(t,{detailed:!0,inlineOptions:!1}),c=typeof t.usage.category<"u"?Ko(t.usage.category,{format:this.format(r),paragraphs:!1}):void 0,f=typeof t.usage.description<"u"?Ko(t.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof t.usage.details<"u"?Ko(t.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof t.usage.examples<"u"?t.usage.examples.map(([E,C])=>[Ko(E,{format:this.format(r),paragraphs:!1}),C.replace(/\$0/g,this.binaryName)]):void 0;return{path:s,usage:a,category:c,description:f,details:p,examples:h,options:n}}definitions({colored:t=!1}={}){let r=[];for(let s of this.registrations.keys()){let a=this.definition(s,{colored:t});a&&r.push(a)}return r}usage(t=null,{colored:r,detailed:s=!1,prefix:a="$ "}={}){var n;if(t===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(x=>x.length===0))!==null&&n!==void 0?n:!1))if(t){t=null;break}else t=p;else if(E){t=null;continue}}t&&(s=!0)}let c=t!==null&&t instanceof st?t.constructor:t,f="";if(c)if(s){let{description:p="",details:h="",examples:E=[]}=c.usage||{};p!==""&&(f+=Ko(p,{format:this.format(r),paragraphs:!1}).replace(/^./,x=>x.toUpperCase()),f+=` +`),(h!==""||E.length>0)&&(f+=`${this.format(r).header("Usage")} +`,f+=` +`);let{usage:C,options:S}=this.getUsageByRegistration(c,{inlineOptions:!1});if(f+=`${this.format(r).bold(a)}${C} +`,S.length>0){f+=` +`,f+=`${this.format(r).header("Options")} +`;let x=S.reduce((I,R)=>Math.max(I,R.definition.length),0);f+=` +`;for(let{definition:I,description:R}of S)f+=` ${this.format(r).bold(I.padEnd(x))} ${Ko(R,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(f+=` +`,f+=`${this.format(r).header("Details")} +`,f+=` +`,f+=Ko(h,{format:this.format(r),paragraphs:!0})),E.length>0){f+=` +`,f+=`${this.format(r).header("Examples")} +`;for(let[x,I]of E)f+=` +`,f+=Ko(x,{format:this.format(r),paragraphs:!1}),f+=`${I.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:p}=this.getUsageByRegistration(c);f+=`${this.format(r).bold(a)}${p} +`}else{let p=new Map;for(let[S,{index:x}]of this.registrations.entries()){if(typeof S.usage>"u")continue;let I=typeof S.usage.category<"u"?Ko(S.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(I);typeof R>"u"&&p.set(I,R=[]);let{usage:N}=this.getUsageByIndex(x);R.push({commandClass:S,usage:N})}let h=Array.from(p.keys()).sort((S,x)=>S===null?-1:x===null?1:S.localeCompare(x,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",C=typeof this.binaryVersion<"u";E||C?(E&&C?f+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:E?f+=`${this.format(r).header(`${this.binaryLabel}`)} +`:f+=`${this.format(r).header(`${this.binaryVersion}`)} +`,f+=` ${this.format(r).bold(a)}${this.binaryName} +`):f+=`${this.format(r).bold(a)}${this.binaryName} +`;for(let S of h){let x=p.get(S).slice().sort((R,N)=>R.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),I=S!==null?S.trim():"General commands";f+=` +`,f+=`${this.format(r).header(`${I}`)} +`;for(let{commandClass:R,usage:N}of x){let U=R.usage.description||"undocumented";f+=` +`,f+=` ${this.format(r).bold(N)} +`,f+=` ${Ko(U,{format:this.format(r),paragraphs:!1})}`}}f+=` +`,f+=Ko("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 f}error(t,r){var s,{colored:a,command:n=(s=t[bre])!==null&&s!==void 0?s:null}=r===void 0?{}:r;(!t||typeof t!="object"||!("stack"in t))&&(t=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(t)})`));let c="",f=t.name.replace(/([a-z])([A-Z])/g,"$1 $2");f==="Error"&&(f="Internal Error"),c+=`${this.format(a).error(f)}: ${t.message} +`;let p=t.clipanion;return typeof p<"u"?p.type==="usage"&&(c+=` +`,c+=this.usage(n)):t.stack&&(c+=`${t.stack.replace(/^.*\n/,"")} +`),c}format(t){var r;return((r=t??this.enableColors)!==null&&r!==void 0?r:e.defaultContext.colorDepth>1)?ure:fre}getUsageByRegistration(t,r){let s=this.registrations.get(t);if(typeof s>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(s.index,r)}getUsageByIndex(t,r){return this.builder.getBuilderByIndex(t).usage(r)}};ba.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:wre()}});var $2,Tre=Ze(()=>{cd();$2=class extends st{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};$2.paths=[["--clipanion=definitions"]]});var eB,Rre=Ze(()=>{cd();eB=class extends st{async execute(){this.context.stdout.write(this.cli.usage())}};eB.paths=[["-h"],["--help"]]});function Wx(e={}){return va({definition(t,r){var s;t.addProxy({name:(s=e.name)!==null&&s!==void 0?s:r,required:e.required})},transformer(t,r,s){return s.positionals.map(({value:a})=>a)}})}var d_=Ze(()=>{vp()});var tB,Fre=Ze(()=>{cd();d_();tB=class extends st{constructor(){super(...arguments),this.args=Wx()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} +`)}};tB.paths=[["--clipanion=tokens"]]});var rB,Nre=Ze(()=>{cd();rB=class extends st{async execute(){var t;this.context.stdout.write(`${(t=this.cli.binaryVersion)!==null&&t!==void 0?t:""} +`)}};rB.paths=[["-v"],["--version"]]});var g_={};Vt(g_,{DefinitionsCommand:()=>$2,HelpCommand:()=>eB,TokensCommand:()=>tB,VersionCommand:()=>rB});var Ore=Ze(()=>{Tre();Rre();Fre();Nre()});function Lre(e,t,r){let[s,a]=Wf(t,r??{}),{arity:n=1}=a,c=e.split(","),f=new Set(c);return va({definition(p){p.addOption({names:c,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let C,S=typeof s<"u"?[...s]:void 0;for(let{name:x,value:I}of E.options)f.has(x)&&(C=x,S=S??[],S.push(I));return typeof S<"u"?L0(C??h,S,a.validator):S}})}var Mre=Ze(()=>{vp()});function Ure(e,t,r){let[s,a]=Wf(t,r??{}),n=e.split(","),c=new Set(n);return va({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E=S);return E}})}var _re=Ze(()=>{vp()});function Hre(e,t,r){let[s,a]=Wf(t,r??{}),n=e.split(","),c=new Set(n);return va({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E??(E=0),S?E+=1:E=0);return E}})}var jre=Ze(()=>{vp()});function Gre(e={}){return va({definition(t,r){var s;t.addRest({name:(s=e.name)!==null&&s!==void 0?s:r,required:e.required})},transformer(t,r,s){let a=c=>{let f=s.positionals[c];return f.extra===Kl||f.extra===!1&&cc)}})}var qre=Ze(()=>{Gx();vp()});function Qqe(e,t,r){let[s,a]=Wf(t,r??{}),{arity:n=1}=a,c=e.split(","),f=new Set(c);return va({definition(p){p.addOption({names:c,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,C){let S,x=s;typeof a.env<"u"&&C.env[a.env]&&(S=a.env,x=C.env[a.env]);for(let{name:I,value:R}of E.options)f.has(I)&&(S=I,x=R);return typeof x=="string"?L0(S??h,x,a.validator):x}})}function Tqe(e={}){let{required:t=!0}=e;return va({definition(r,s){var a;r.addPositional({name:(a=e.name)!==null&&a!==void 0?a:s,required:e.required})},transformer(r,s,a){var n;for(let c=0;c{Gx();vp()});var he={};Vt(he,{Array:()=>Lre,Boolean:()=>Ure,Counter:()=>Hre,Proxy:()=>Wx,Rest:()=>Gre,String:()=>Yre,applyValidator:()=>L0,cleanValidationError:()=>Lx,formatError:()=>K2,isOptionSymbol:()=>V2,makeCommandOption:()=>va,rerouteArguments:()=>Wf});var Vre=Ze(()=>{vp();d_();Mre();_re();jre();qre();Wre()});var nB={};Vt(nB,{Builtins:()=>g_,Cli:()=>ba,Command:()=>st,Option:()=>he,UsageError:()=>ot,formatMarkdownish:()=>Ko,run:()=>xre,runExit:()=>Pre});var jt=Ze(()=>{Ox();i_();cd();Qre();Ore();Vre()});var Kre=G((qkt,Rqe)=>{Rqe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var Xre=G((Ykt,bp)=>{var Jre=Ce("fs"),y_=Ce("path"),Fqe=Ce("os"),Nqe=Ce("crypto"),Oqe=Kre(),E_=Oqe.version,Lqe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function Mqe(e){let t={},r=e.toString();r=r.replace(/\r\n?/mg,` +`);let s;for(;(s=Lqe.exec(r))!=null;){let a=s[1],n=s[2]||"";n=n.trim();let c=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),c==='"'&&(n=n.replace(/\\n/g,` +`),n=n.replace(/\\r/g,"\r")),t[a]=n}return t}function Uqe(e){let t=Zre(e),r=Ws.configDotenv({path:t});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${t} for an unknown reason`);let s=zre(e).split(","),a=s.length,n;for(let c=0;c=a)throw f}return Ws.parse(n)}function _qe(e){console.log(`[dotenv@${E_}][INFO] ${e}`)}function Hqe(e){console.log(`[dotenv@${E_}][WARN] ${e}`)}function m_(e){console.log(`[dotenv@${E_}][DEBUG] ${e}`)}function zre(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function jqe(e,t){let r;try{r=new URL(t)}catch(f){throw f.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):f}let s=r.password;if(!s)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,c=e.parsed[n];if(!c)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:c,key:s}}function Zre(e){let t=y_.resolve(process.cwd(),".env");return e&&e.path&&e.path.length>0&&(t=e.path),t.endsWith(".vault")?t:`${t}.vault`}function Gqe(e){return e[0]==="~"?y_.join(Fqe.homedir(),e.slice(1)):e}function qqe(e){_qe("Loading env from encrypted .env.vault");let t=Ws._parseVault(e),r=process.env;return e&&e.processEnv!=null&&(r=e.processEnv),Ws.populate(r,t,e),{parsed:t}}function Yqe(e){let t=y_.resolve(process.cwd(),".env"),r="utf8",s=!!(e&&e.debug);e&&(e.path!=null&&(t=Gqe(e.path)),e.encoding!=null&&(r=e.encoding));try{let a=Ws.parse(Jre.readFileSync(t,{encoding:r})),n=process.env;return e&&e.processEnv!=null&&(n=e.processEnv),Ws.populate(n,a,e),{parsed:a}}catch(a){return s&&m_(`Failed to load ${t} ${a.message}`),{error:a}}}function Wqe(e){let t=Zre(e);return zre(e).length===0?Ws.configDotenv(e):Jre.existsSync(t)?Ws._configVault(e):(Hqe(`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`),Ws.configDotenv(e))}function Vqe(e,t){let r=Buffer.from(t.slice(-64),"hex"),s=Buffer.from(e,"base64"),a=s.slice(0,12),n=s.slice(-16);s=s.slice(12,-16);try{let c=Nqe.createDecipheriv("aes-256-gcm",r,a);return c.setAuthTag(n),`${c.update(s)}${c.final()}`}catch(c){let f=c instanceof RangeError,p=c.message==="Invalid key length",h=c.message==="Unsupported state or unable to authenticate data";if(f||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",c.code),console.error("Error: ",c.message),c}}function Kqe(e,t,r={}){let s=!!(r&&r.debug),a=!!(r&&r.override);if(typeof t!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(t))Object.prototype.hasOwnProperty.call(e,n)?(a===!0&&(e[n]=t[n]),s&&m_(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):e[n]=t[n]}var Ws={configDotenv:Yqe,_configVault:qqe,_parseVault:Uqe,config:Wqe,decrypt:Vqe,parse:Mqe,populate:Kqe};bp.exports.configDotenv=Ws.configDotenv;bp.exports._configVault=Ws._configVault;bp.exports._parseVault=Ws._parseVault;bp.exports.config=Ws.config;bp.exports.decrypt=Ws.decrypt;bp.exports.parse=Ws.parse;bp.exports.populate=Ws.populate;bp.exports=Ws});var ene=G((Wkt,$re)=>{"use strict";$re.exports=(e,...t)=>new Promise(r=>{r(e(...t))})});var M0=G((Vkt,I_)=>{"use strict";var Jqe=ene(),tne=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let t=[],r=0,s=()=>{r--,t.length>0&&t.shift()()},a=(f,p,...h)=>{r++;let E=Jqe(f,...h);p(E),E.then(s,s)},n=(f,p,...h)=>{rnew Promise(h=>n(f,h,...p));return Object.defineProperties(c,{activeCount:{get:()=>r},pendingCount:{get:()=>t.length}}),c};I_.exports=tne;I_.exports.default=tne});function zf(e){return`YN${e.toString(10).padStart(4,"0")}`}function Vx(e){let t=Number(e.slice(2));if(typeof pr[t]>"u")throw new Error(`Unknown message name: "${e}"`);return t}var pr,Kx=Ze(()=>{pr=(Ue=>(Ue[Ue.UNNAMED=0]="UNNAMED",Ue[Ue.EXCEPTION=1]="EXCEPTION",Ue[Ue.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Ue[Ue.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Ue[Ue.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Ue[Ue.BUILD_DISABLED=5]="BUILD_DISABLED",Ue[Ue.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Ue[Ue.MUST_BUILD=7]="MUST_BUILD",Ue[Ue.MUST_REBUILD=8]="MUST_REBUILD",Ue[Ue.BUILD_FAILED=9]="BUILD_FAILED",Ue[Ue.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Ue[Ue.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Ue[Ue.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Ue[Ue.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Ue[Ue.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Ue[Ue.REMOTE_INVALID=15]="REMOTE_INVALID",Ue[Ue.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Ue[Ue.RESOLUTION_PACK=17]="RESOLUTION_PACK",Ue[Ue.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Ue[Ue.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Ue[Ue.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Ue[Ue.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Ue[Ue.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Ue[Ue.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Ue[Ue.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Ue[Ue.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Ue[Ue.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Ue[Ue.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Ue[Ue.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Ue[Ue.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Ue[Ue.FETCH_FAILED=30]="FETCH_FAILED",Ue[Ue.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Ue[Ue.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Ue[Ue.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Ue[Ue.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Ue[Ue.NETWORK_ERROR=35]="NETWORK_ERROR",Ue[Ue.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Ue[Ue.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Ue[Ue.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Ue[Ue.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Ue[Ue.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Ue[Ue.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Ue[Ue.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Ue[Ue.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Ue[Ue.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Ue[Ue.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Ue[Ue.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Ue[Ue.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Ue[Ue.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Ue[Ue.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Ue[Ue.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Ue[Ue.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Ue[Ue.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Ue[Ue.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Ue[Ue.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Ue[Ue.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Ue[Ue.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Ue[Ue.INVALID_MANIFEST=57]="INVALID_MANIFEST",Ue[Ue.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Ue[Ue.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Ue[Ue.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Ue[Ue.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Ue[Ue.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Ue[Ue.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Ue[Ue.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Ue[Ue.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Ue[Ue.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Ue[Ue.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Ue[Ue.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Ue[Ue.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Ue[Ue.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Ue[Ue.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Ue[Ue.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Ue[Ue.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Ue[Ue.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Ue[Ue.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Ue[Ue.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Ue[Ue.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Ue[Ue.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Ue[Ue.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Ue[Ue.NETWORK_DISABLED=80]="NETWORK_DISABLED",Ue[Ue.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Ue[Ue.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Ue[Ue.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Ue[Ue.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Ue[Ue.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Ue[Ue.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Ue[Ue.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Ue[Ue.VERSION_NOTICE=88]="VERSION_NOTICE",Ue[Ue.TIPS_NOTICE=89]="TIPS_NOTICE",Ue[Ue.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Ue[Ue.INVALID_PROVENANCE_ENVIRONMENT=91]="INVALID_PROVENANCE_ENVIRONMENT",Ue[Ue.EXPERIMENTAL=92]="EXPERIMENTAL",Ue))(pr||{})});var iB=G((Jkt,rne)=>{var zqe="2.0.0",Zqe=Number.MAX_SAFE_INTEGER||9007199254740991,Xqe=16,$qe=250,eYe=["major","premajor","minor","preminor","patch","prepatch","prerelease"];rne.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:Xqe,MAX_SAFE_BUILD_LENGTH:$qe,MAX_SAFE_INTEGER:Zqe,RELEASE_TYPES:eYe,SEMVER_SPEC_VERSION:zqe,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var sB=G((zkt,nne)=>{var tYe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};nne.exports=tYe});var xE=G((Dp,ine)=>{var{MAX_SAFE_COMPONENT_LENGTH:C_,MAX_SAFE_BUILD_LENGTH:rYe,MAX_LENGTH:nYe}=iB(),iYe=sB();Dp=ine.exports={};var sYe=Dp.re=[],oYe=Dp.safeRe=[],rr=Dp.src=[],nr=Dp.t={},aYe=0,w_="[a-zA-Z0-9-]",lYe=[["\\s",1],["\\d",nYe],[w_,rYe]],cYe=e=>{for(let[t,r]of lYe)e=e.split(`${t}*`).join(`${t}{0,${r}}`).split(`${t}+`).join(`${t}{1,${r}}`);return e},Jr=(e,t,r)=>{let s=cYe(t),a=aYe++;iYe(e,a,t),nr[e]=a,rr[a]=t,sYe[a]=new RegExp(t,r?"g":void 0),oYe[a]=new RegExp(s,r?"g":void 0)};Jr("NUMERICIDENTIFIER","0|[1-9]\\d*");Jr("NUMERICIDENTIFIERLOOSE","\\d+");Jr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${w_}*`);Jr("MAINVERSION",`(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})`);Jr("MAINVERSIONLOOSE",`(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})`);Jr("PRERELEASEIDENTIFIER",`(?:${rr[nr.NUMERICIDENTIFIER]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASEIDENTIFIERLOOSE",`(?:${rr[nr.NUMERICIDENTIFIERLOOSE]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASE",`(?:-(${rr[nr.PRERELEASEIDENTIFIER]}(?:\\.${rr[nr.PRERELEASEIDENTIFIER]})*))`);Jr("PRERELEASELOOSE",`(?:-?(${rr[nr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rr[nr.PRERELEASEIDENTIFIERLOOSE]})*))`);Jr("BUILDIDENTIFIER",`${w_}+`);Jr("BUILD",`(?:\\+(${rr[nr.BUILDIDENTIFIER]}(?:\\.${rr[nr.BUILDIDENTIFIER]})*))`);Jr("FULLPLAIN",`v?${rr[nr.MAINVERSION]}${rr[nr.PRERELEASE]}?${rr[nr.BUILD]}?`);Jr("FULL",`^${rr[nr.FULLPLAIN]}$`);Jr("LOOSEPLAIN",`[v=\\s]*${rr[nr.MAINVERSIONLOOSE]}${rr[nr.PRERELEASELOOSE]}?${rr[nr.BUILD]}?`);Jr("LOOSE",`^${rr[nr.LOOSEPLAIN]}$`);Jr("GTLT","((?:<|>)?=?)");Jr("XRANGEIDENTIFIERLOOSE",`${rr[nr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Jr("XRANGEIDENTIFIER",`${rr[nr.NUMERICIDENTIFIER]}|x|X|\\*`);Jr("XRANGEPLAIN",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:${rr[nr.PRERELEASE]})?${rr[nr.BUILD]}?)?)?`);Jr("XRANGEPLAINLOOSE",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:${rr[nr.PRERELEASELOOSE]})?${rr[nr.BUILD]}?)?)?`);Jr("XRANGE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAIN]}$`);Jr("XRANGELOOSE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("COERCEPLAIN",`(^|[^\\d])(\\d{1,${C_}})(?:\\.(\\d{1,${C_}}))?(?:\\.(\\d{1,${C_}}))?`);Jr("COERCE",`${rr[nr.COERCEPLAIN]}(?:$|[^\\d])`);Jr("COERCEFULL",rr[nr.COERCEPLAIN]+`(?:${rr[nr.PRERELEASE]})?(?:${rr[nr.BUILD]})?(?:$|[^\\d])`);Jr("COERCERTL",rr[nr.COERCE],!0);Jr("COERCERTLFULL",rr[nr.COERCEFULL],!0);Jr("LONETILDE","(?:~>?)");Jr("TILDETRIM",`(\\s*)${rr[nr.LONETILDE]}\\s+`,!0);Dp.tildeTrimReplace="$1~";Jr("TILDE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAIN]}$`);Jr("TILDELOOSE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("LONECARET","(?:\\^)");Jr("CARETTRIM",`(\\s*)${rr[nr.LONECARET]}\\s+`,!0);Dp.caretTrimReplace="$1^";Jr("CARET",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAIN]}$`);Jr("CARETLOOSE",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("COMPARATORLOOSE",`^${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]})$|^$`);Jr("COMPARATOR",`^${rr[nr.GTLT]}\\s*(${rr[nr.FULLPLAIN]})$|^$`);Jr("COMPARATORTRIM",`(\\s*)${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]}|${rr[nr.XRANGEPLAIN]})`,!0);Dp.comparatorTrimReplace="$1$2$3";Jr("HYPHENRANGE",`^\\s*(${rr[nr.XRANGEPLAIN]})\\s+-\\s+(${rr[nr.XRANGEPLAIN]})\\s*$`);Jr("HYPHENRANGELOOSE",`^\\s*(${rr[nr.XRANGEPLAINLOOSE]})\\s+-\\s+(${rr[nr.XRANGEPLAINLOOSE]})\\s*$`);Jr("STAR","(<|>)?=?\\s*\\*");Jr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Jr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Jx=G((Zkt,sne)=>{var uYe=Object.freeze({loose:!0}),fYe=Object.freeze({}),AYe=e=>e?typeof e!="object"?uYe:e:fYe;sne.exports=AYe});var B_=G((Xkt,lne)=>{var one=/^[0-9]+$/,ane=(e,t)=>{let r=one.test(e),s=one.test(t);return r&&s&&(e=+e,t=+t),e===t?0:r&&!s?-1:s&&!r?1:eane(t,e);lne.exports={compareIdentifiers:ane,rcompareIdentifiers:pYe}});var zo=G(($kt,Ane)=>{var zx=sB(),{MAX_LENGTH:cne,MAX_SAFE_INTEGER:Zx}=iB(),{safeRe:une,t:fne}=xE(),hYe=Jx(),{compareIdentifiers:kE}=B_(),v_=class e{constructor(t,r){if(r=hYe(r),t instanceof e){if(t.loose===!!r.loose&&t.includePrerelease===!!r.includePrerelease)return t;t=t.version}else if(typeof t!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof t}".`);if(t.length>cne)throw new TypeError(`version is longer than ${cne} characters`);zx("SemVer",t,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let s=t.trim().match(r.loose?une[fne.LOOSE]:une[fne.FULL]);if(!s)throw new TypeError(`Invalid Version: ${t}`);if(this.raw=t,this.major=+s[1],this.minor=+s[2],this.patch=+s[3],this.major>Zx||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Zx||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Zx||this.patch<0)throw new TypeError("Invalid patch version");s[4]?this.prerelease=s[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&s===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];s===!1&&(n=[r]),kE(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${t}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};Ane.exports=v_});var U0=G((eQt,hne)=>{var pne=zo(),dYe=(e,t,r=!1)=>{if(e instanceof pne)return e;try{return new pne(e,t)}catch(s){if(!r)return null;throw s}};hne.exports=dYe});var gne=G((tQt,dne)=>{var gYe=U0(),mYe=(e,t)=>{let r=gYe(e,t);return r?r.version:null};dne.exports=mYe});var yne=G((rQt,mne)=>{var yYe=U0(),EYe=(e,t)=>{let r=yYe(e.trim().replace(/^[=v]+/,""),t);return r?r.version:null};mne.exports=EYe});var Cne=G((nQt,Ine)=>{var Ene=zo(),IYe=(e,t,r,s,a)=>{typeof r=="string"&&(a=s,s=r,r=void 0);try{return new Ene(e instanceof Ene?e.version:e,r).inc(t,s,a).version}catch{return null}};Ine.exports=IYe});var vne=G((iQt,Bne)=>{var wne=U0(),CYe=(e,t)=>{let r=wne(e,null,!0),s=wne(t,null,!0),a=r.compare(s);if(a===0)return null;let n=a>0,c=n?r:s,f=n?s:r,p=!!c.prerelease.length;if(!!f.prerelease.length&&!p)return!f.patch&&!f.minor?"major":c.patch?"patch":c.minor?"minor":"major";let E=p?"pre":"";return r.major!==s.major?E+"major":r.minor!==s.minor?E+"minor":r.patch!==s.patch?E+"patch":"prerelease"};Bne.exports=CYe});var bne=G((sQt,Sne)=>{var wYe=zo(),BYe=(e,t)=>new wYe(e,t).major;Sne.exports=BYe});var Pne=G((oQt,Dne)=>{var vYe=zo(),SYe=(e,t)=>new vYe(e,t).minor;Dne.exports=SYe});var kne=G((aQt,xne)=>{var bYe=zo(),DYe=(e,t)=>new bYe(e,t).patch;xne.exports=DYe});var Tne=G((lQt,Qne)=>{var PYe=U0(),xYe=(e,t)=>{let r=PYe(e,t);return r&&r.prerelease.length?r.prerelease:null};Qne.exports=xYe});var bc=G((cQt,Fne)=>{var Rne=zo(),kYe=(e,t,r)=>new Rne(e,r).compare(new Rne(t,r));Fne.exports=kYe});var One=G((uQt,Nne)=>{var QYe=bc(),TYe=(e,t,r)=>QYe(t,e,r);Nne.exports=TYe});var Mne=G((fQt,Lne)=>{var RYe=bc(),FYe=(e,t)=>RYe(e,t,!0);Lne.exports=FYe});var Xx=G((AQt,_ne)=>{var Une=zo(),NYe=(e,t,r)=>{let s=new Une(e,r),a=new Une(t,r);return s.compare(a)||s.compareBuild(a)};_ne.exports=NYe});var jne=G((pQt,Hne)=>{var OYe=Xx(),LYe=(e,t)=>e.sort((r,s)=>OYe(r,s,t));Hne.exports=LYe});var qne=G((hQt,Gne)=>{var MYe=Xx(),UYe=(e,t)=>e.sort((r,s)=>MYe(s,r,t));Gne.exports=UYe});var oB=G((dQt,Yne)=>{var _Ye=bc(),HYe=(e,t,r)=>_Ye(e,t,r)>0;Yne.exports=HYe});var $x=G((gQt,Wne)=>{var jYe=bc(),GYe=(e,t,r)=>jYe(e,t,r)<0;Wne.exports=GYe});var S_=G((mQt,Vne)=>{var qYe=bc(),YYe=(e,t,r)=>qYe(e,t,r)===0;Vne.exports=YYe});var b_=G((yQt,Kne)=>{var WYe=bc(),VYe=(e,t,r)=>WYe(e,t,r)!==0;Kne.exports=VYe});var ek=G((EQt,Jne)=>{var KYe=bc(),JYe=(e,t,r)=>KYe(e,t,r)>=0;Jne.exports=JYe});var tk=G((IQt,zne)=>{var zYe=bc(),ZYe=(e,t,r)=>zYe(e,t,r)<=0;zne.exports=ZYe});var D_=G((CQt,Zne)=>{var XYe=S_(),$Ye=b_(),eWe=oB(),tWe=ek(),rWe=$x(),nWe=tk(),iWe=(e,t,r,s)=>{switch(t){case"===":return typeof e=="object"&&(e=e.version),typeof r=="object"&&(r=r.version),e===r;case"!==":return typeof e=="object"&&(e=e.version),typeof r=="object"&&(r=r.version),e!==r;case"":case"=":case"==":return XYe(e,r,s);case"!=":return $Ye(e,r,s);case">":return eWe(e,r,s);case">=":return tWe(e,r,s);case"<":return rWe(e,r,s);case"<=":return nWe(e,r,s);default:throw new TypeError(`Invalid operator: ${t}`)}};Zne.exports=iWe});var $ne=G((wQt,Xne)=>{var sWe=zo(),oWe=U0(),{safeRe:rk,t:nk}=xE(),aWe=(e,t)=>{if(e instanceof sWe)return e;if(typeof e=="number"&&(e=String(e)),typeof e!="string")return null;t=t||{};let r=null;if(!t.rtl)r=e.match(t.includePrerelease?rk[nk.COERCEFULL]:rk[nk.COERCE]);else{let p=t.includePrerelease?rk[nk.COERCERTLFULL]:rk[nk.COERCERTL],h;for(;(h=p.exec(e))&&(!r||r.index+r[0].length!==e.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let s=r[2],a=r[3]||"0",n=r[4]||"0",c=t.includePrerelease&&r[5]?`-${r[5]}`:"",f=t.includePrerelease&&r[6]?`+${r[6]}`:"";return oWe(`${s}.${a}.${n}${c}${f}`,t)};Xne.exports=aWe});var tie=G((BQt,eie)=>{"use strict";eie.exports=function(e){e.prototype[Symbol.iterator]=function*(){for(let t=this.head;t;t=t.next)yield t.value}}});var nie=G((vQt,rie)=>{"use strict";rie.exports=Ln;Ln.Node=_0;Ln.create=Ln;function Ln(e){var t=this;if(t instanceof Ln||(t=new Ln),t.tail=null,t.head=null,t.length=0,e&&typeof e.forEach=="function")e.forEach(function(a){t.push(a)});else if(arguments.length>0)for(var r=0,s=arguments.length;r1)r=t;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;s!==null;a++)r=e(r,s.value,a),s=s.next;return r};Ln.prototype.reduceReverse=function(e,t){var r,s=this.tail;if(arguments.length>1)r=t;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;s!==null;a--)r=e(r,s.value,a),s=s.prev;return r};Ln.prototype.toArray=function(){for(var e=new Array(this.length),t=0,r=this.head;r!==null;t++)e[t]=r.value,r=r.next;return e};Ln.prototype.toArrayReverse=function(){for(var e=new Array(this.length),t=0,r=this.tail;r!==null;t++)e[t]=r.value,r=r.prev;return e};Ln.prototype.slice=function(e,t){t=t||this.length,t<0&&(t+=this.length),e=e||0,e<0&&(e+=this.length);var r=new Ln;if(tthis.length&&(t=this.length);for(var s=0,a=this.head;a!==null&&sthis.length&&(t=this.length);for(var s=this.length,a=this.tail;a!==null&&s>t;s--)a=a.prev;for(;a!==null&&s>e;s--,a=a.prev)r.push(a.value);return r};Ln.prototype.splice=function(e,t,...r){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);for(var s=0,a=this.head;a!==null&&s{"use strict";var fWe=nie(),H0=Symbol("max"),xp=Symbol("length"),QE=Symbol("lengthCalculator"),lB=Symbol("allowStale"),j0=Symbol("maxAge"),Pp=Symbol("dispose"),iie=Symbol("noDisposeOnSet"),Vs=Symbol("lruList"),Ou=Symbol("cache"),oie=Symbol("updateAgeOnGet"),P_=()=>1,k_=class{constructor(t){if(typeof t=="number"&&(t={max:t}),t||(t={}),t.max&&(typeof t.max!="number"||t.max<0))throw new TypeError("max must be a non-negative number");let r=this[H0]=t.max||1/0,s=t.length||P_;if(this[QE]=typeof s!="function"?P_:s,this[lB]=t.stale||!1,t.maxAge&&typeof t.maxAge!="number")throw new TypeError("maxAge must be a number");this[j0]=t.maxAge||0,this[Pp]=t.dispose,this[iie]=t.noDisposeOnSet||!1,this[oie]=t.updateAgeOnGet||!1,this.reset()}set max(t){if(typeof t!="number"||t<0)throw new TypeError("max must be a non-negative number");this[H0]=t||1/0,aB(this)}get max(){return this[H0]}set allowStale(t){this[lB]=!!t}get allowStale(){return this[lB]}set maxAge(t){if(typeof t!="number")throw new TypeError("maxAge must be a non-negative number");this[j0]=t,aB(this)}get maxAge(){return this[j0]}set lengthCalculator(t){typeof t!="function"&&(t=P_),t!==this[QE]&&(this[QE]=t,this[xp]=0,this[Vs].forEach(r=>{r.length=this[QE](r.value,r.key),this[xp]+=r.length})),aB(this)}get lengthCalculator(){return this[QE]}get length(){return this[xp]}get itemCount(){return this[Vs].length}rforEach(t,r){r=r||this;for(let s=this[Vs].tail;s!==null;){let a=s.prev;sie(this,t,s,r),s=a}}forEach(t,r){r=r||this;for(let s=this[Vs].head;s!==null;){let a=s.next;sie(this,t,s,r),s=a}}keys(){return this[Vs].toArray().map(t=>t.key)}values(){return this[Vs].toArray().map(t=>t.value)}reset(){this[Pp]&&this[Vs]&&this[Vs].length&&this[Vs].forEach(t=>this[Pp](t.key,t.value)),this[Ou]=new Map,this[Vs]=new fWe,this[xp]=0}dump(){return this[Vs].map(t=>ik(this,t)?!1:{k:t.key,v:t.value,e:t.now+(t.maxAge||0)}).toArray().filter(t=>t)}dumpLru(){return this[Vs]}set(t,r,s){if(s=s||this[j0],s&&typeof s!="number")throw new TypeError("maxAge must be a number");let a=s?Date.now():0,n=this[QE](r,t);if(this[Ou].has(t)){if(n>this[H0])return TE(this,this[Ou].get(t)),!1;let p=this[Ou].get(t).value;return this[Pp]&&(this[iie]||this[Pp](t,p.value)),p.now=a,p.maxAge=s,p.value=r,this[xp]+=n-p.length,p.length=n,this.get(t),aB(this),!0}let c=new Q_(t,r,n,a,s);return c.length>this[H0]?(this[Pp]&&this[Pp](t,r),!1):(this[xp]+=c.length,this[Vs].unshift(c),this[Ou].set(t,this[Vs].head),aB(this),!0)}has(t){if(!this[Ou].has(t))return!1;let r=this[Ou].get(t).value;return!ik(this,r)}get(t){return x_(this,t,!0)}peek(t){return x_(this,t,!1)}pop(){let t=this[Vs].tail;return t?(TE(this,t),t.value):null}del(t){TE(this,this[Ou].get(t))}load(t){this.reset();let r=Date.now();for(let s=t.length-1;s>=0;s--){let a=t[s],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let c=n-r;c>0&&this.set(a.k,a.v,c)}}}prune(){this[Ou].forEach((t,r)=>x_(this,r,!1))}},x_=(e,t,r)=>{let s=e[Ou].get(t);if(s){let a=s.value;if(ik(e,a)){if(TE(e,s),!e[lB])return}else r&&(e[oie]&&(s.value.now=Date.now()),e[Vs].unshiftNode(s));return a.value}},ik=(e,t)=>{if(!t||!t.maxAge&&!e[j0])return!1;let r=Date.now()-t.now;return t.maxAge?r>t.maxAge:e[j0]&&r>e[j0]},aB=e=>{if(e[xp]>e[H0])for(let t=e[Vs].tail;e[xp]>e[H0]&&t!==null;){let r=t.prev;TE(e,t),t=r}},TE=(e,t)=>{if(t){let r=t.value;e[Pp]&&e[Pp](r.key,r.value),e[xp]-=r.length,e[Ou].delete(r.key),e[Vs].removeNode(t)}},Q_=class{constructor(t,r,s,a,n){this.key=t,this.value=r,this.length=s,this.now=a,this.maxAge=n||0}},sie=(e,t,r,s)=>{let a=r.value;ik(e,a)&&(TE(e,r),e[lB]||(a=void 0)),a&&t.call(s,a.value,a.key,e)};aie.exports=k_});var Dc=G((bQt,Aie)=>{var T_=class e{constructor(t,r){if(r=pWe(r),t instanceof e)return t.loose===!!r.loose&&t.includePrerelease===!!r.includePrerelease?t:new e(t.raw,r);if(t instanceof R_)return this.raw=t.value,this.set=[[t]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=t.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(s=>this.parseRange(s.trim())).filter(s=>s.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let s=this.set[0];if(this.set=this.set.filter(a=>!uie(a[0])),this.set.length===0)this.set=[s];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&IWe(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(t=>t.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(t){let s=((this.options.includePrerelease&&yWe)|(this.options.loose&&EWe))+":"+t,a=cie.get(s);if(a)return a;let n=this.options.loose,c=n?hl[Da.HYPHENRANGELOOSE]:hl[Da.HYPHENRANGE];t=t.replace(c,kWe(this.options.includePrerelease)),bi("hyphen replace",t),t=t.replace(hl[Da.COMPARATORTRIM],dWe),bi("comparator trim",t),t=t.replace(hl[Da.TILDETRIM],gWe),bi("tilde trim",t),t=t.replace(hl[Da.CARETTRIM],mWe),bi("caret trim",t);let f=t.split(" ").map(C=>CWe(C,this.options)).join(" ").split(/\s+/).map(C=>xWe(C,this.options));n&&(f=f.filter(C=>(bi("loose invalid filter",C,this.options),!!C.match(hl[Da.COMPARATORLOOSE])))),bi("range list",f);let p=new Map,h=f.map(C=>new R_(C,this.options));for(let C of h){if(uie(C))return[C];p.set(C.value,C)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return cie.set(s,E),E}intersects(t,r){if(!(t instanceof e))throw new TypeError("a Range is required");return this.set.some(s=>fie(s,r)&&t.set.some(a=>fie(a,r)&&s.every(n=>a.every(c=>n.intersects(c,r)))))}test(t){if(!t)return!1;if(typeof t=="string")try{t=new hWe(t,this.options)}catch{return!1}for(let r=0;re.value==="<0.0.0-0",IWe=e=>e.value==="",fie=(e,t)=>{let r=!0,s=e.slice(),a=s.pop();for(;r&&s.length;)r=s.every(n=>a.intersects(n,t)),a=s.pop();return r},CWe=(e,t)=>(bi("comp",e,t),e=vWe(e,t),bi("caret",e),e=wWe(e,t),bi("tildes",e),e=bWe(e,t),bi("xrange",e),e=PWe(e,t),bi("stars",e),e),Pa=e=>!e||e.toLowerCase()==="x"||e==="*",wWe=(e,t)=>e.trim().split(/\s+/).map(r=>BWe(r,t)).join(" "),BWe=(e,t)=>{let r=t.loose?hl[Da.TILDELOOSE]:hl[Da.TILDE];return e.replace(r,(s,a,n,c,f)=>{bi("tilde",e,s,a,n,c,f);let p;return Pa(a)?p="":Pa(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Pa(c)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:f?(bi("replaceTilde pr",f),p=`>=${a}.${n}.${c}-${f} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${c} <${a}.${+n+1}.0-0`,bi("tilde return",p),p})},vWe=(e,t)=>e.trim().split(/\s+/).map(r=>SWe(r,t)).join(" "),SWe=(e,t)=>{bi("caret",e,t);let r=t.loose?hl[Da.CARETLOOSE]:hl[Da.CARET],s=t.includePrerelease?"-0":"";return e.replace(r,(a,n,c,f,p)=>{bi("caret",e,a,n,c,f,p);let h;return Pa(n)?h="":Pa(c)?h=`>=${n}.0.0${s} <${+n+1}.0.0-0`:Pa(f)?n==="0"?h=`>=${n}.${c}.0${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.0${s} <${+n+1}.0.0-0`:p?(bi("replaceCaret pr",p),n==="0"?c==="0"?h=`>=${n}.${c}.${f}-${p} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}-${p} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f}-${p} <${+n+1}.0.0-0`):(bi("no pr"),n==="0"?c==="0"?h=`>=${n}.${c}.${f}${s} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f} <${+n+1}.0.0-0`),bi("caret return",h),h})},bWe=(e,t)=>(bi("replaceXRanges",e,t),e.split(/\s+/).map(r=>DWe(r,t)).join(" ")),DWe=(e,t)=>{e=e.trim();let r=t.loose?hl[Da.XRANGELOOSE]:hl[Da.XRANGE];return e.replace(r,(s,a,n,c,f,p)=>{bi("xRange",e,s,a,n,c,f,p);let h=Pa(n),E=h||Pa(c),C=E||Pa(f),S=C;return a==="="&&S&&(a=""),p=t.includePrerelease?"-0":"",h?a===">"||a==="<"?s="<0.0.0-0":s="*":a&&S?(E&&(c=0),f=0,a===">"?(a=">=",E?(n=+n+1,c=0,f=0):(c=+c+1,f=0)):a==="<="&&(a="<",E?n=+n+1:c=+c+1),a==="<"&&(p="-0"),s=`${a+n}.${c}.${f}${p}`):E?s=`>=${n}.0.0${p} <${+n+1}.0.0-0`:C&&(s=`>=${n}.${c}.0${p} <${n}.${+c+1}.0-0`),bi("xRange return",s),s})},PWe=(e,t)=>(bi("replaceStars",e,t),e.trim().replace(hl[Da.STAR],"")),xWe=(e,t)=>(bi("replaceGTE0",e,t),e.trim().replace(hl[t.includePrerelease?Da.GTE0PRE:Da.GTE0],"")),kWe=e=>(t,r,s,a,n,c,f,p,h,E,C,S,x)=>(Pa(s)?r="":Pa(a)?r=`>=${s}.0.0${e?"-0":""}`:Pa(n)?r=`>=${s}.${a}.0${e?"-0":""}`:c?r=`>=${r}`:r=`>=${r}${e?"-0":""}`,Pa(h)?p="":Pa(E)?p=`<${+h+1}.0.0-0`:Pa(C)?p=`<${h}.${+E+1}.0-0`:S?p=`<=${h}.${E}.${C}-${S}`:e?p=`<${h}.${E}.${+C+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),QWe=(e,t,r)=>{for(let s=0;s0){let a=e[s].semver;if(a.major===t.major&&a.minor===t.minor&&a.patch===t.patch)return!0}return!1}return!0}});var cB=G((DQt,yie)=>{var uB=Symbol("SemVer ANY"),O_=class e{static get ANY(){return uB}constructor(t,r){if(r=pie(r),t instanceof e){if(t.loose===!!r.loose)return t;t=t.value}t=t.trim().split(/\s+/).join(" "),N_("comparator",t,r),this.options=r,this.loose=!!r.loose,this.parse(t),this.semver===uB?this.value="":this.value=this.operator+this.semver.version,N_("comp",this)}parse(t){let r=this.options.loose?hie[die.COMPARATORLOOSE]:hie[die.COMPARATOR],s=t.match(r);if(!s)throw new TypeError(`Invalid comparator: ${t}`);this.operator=s[1]!==void 0?s[1]:"",this.operator==="="&&(this.operator=""),s[2]?this.semver=new gie(s[2],this.options.loose):this.semver=uB}toString(){return this.value}test(t){if(N_("Comparator.test",t,this.options.loose),this.semver===uB||t===uB)return!0;if(typeof t=="string")try{t=new gie(t,this.options)}catch{return!1}return F_(t,this.operator,this.semver,this.options)}intersects(t,r){if(!(t instanceof e))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new mie(t.value,r).test(this.value):t.operator===""?t.value===""?!0:new mie(this.value,r).test(t.semver):(r=pie(r),r.includePrerelease&&(this.value==="<0.0.0-0"||t.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||t.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&t.operator.startsWith(">")||this.operator.startsWith("<")&&t.operator.startsWith("<")||this.semver.version===t.semver.version&&this.operator.includes("=")&&t.operator.includes("=")||F_(this.semver,"<",t.semver,r)&&this.operator.startsWith(">")&&t.operator.startsWith("<")||F_(this.semver,">",t.semver,r)&&this.operator.startsWith("<")&&t.operator.startsWith(">")))}};yie.exports=O_;var pie=Jx(),{safeRe:hie,t:die}=xE(),F_=D_(),N_=sB(),gie=zo(),mie=Dc()});var fB=G((PQt,Eie)=>{var TWe=Dc(),RWe=(e,t,r)=>{try{t=new TWe(t,r)}catch{return!1}return t.test(e)};Eie.exports=RWe});var Cie=G((xQt,Iie)=>{var FWe=Dc(),NWe=(e,t)=>new FWe(e,t).set.map(r=>r.map(s=>s.value).join(" ").trim().split(" "));Iie.exports=NWe});var Bie=G((kQt,wie)=>{var OWe=zo(),LWe=Dc(),MWe=(e,t,r)=>{let s=null,a=null,n=null;try{n=new LWe(t,r)}catch{return null}return e.forEach(c=>{n.test(c)&&(!s||a.compare(c)===-1)&&(s=c,a=new OWe(s,r))}),s};wie.exports=MWe});var Sie=G((QQt,vie)=>{var UWe=zo(),_We=Dc(),HWe=(e,t,r)=>{let s=null,a=null,n=null;try{n=new _We(t,r)}catch{return null}return e.forEach(c=>{n.test(c)&&(!s||a.compare(c)===1)&&(s=c,a=new UWe(s,r))}),s};vie.exports=HWe});var Pie=G((TQt,Die)=>{var L_=zo(),jWe=Dc(),bie=oB(),GWe=(e,t)=>{e=new jWe(e,t);let r=new L_("0.0.0");if(e.test(r)||(r=new L_("0.0.0-0"),e.test(r)))return r;r=null;for(let s=0;s{let f=new L_(c.semver.version);switch(c.operator){case">":f.prerelease.length===0?f.patch++:f.prerelease.push(0),f.raw=f.format();case"":case">=":(!n||bie(f,n))&&(n=f);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${c.operator}`)}}),n&&(!r||bie(r,n))&&(r=n)}return r&&e.test(r)?r:null};Die.exports=GWe});var kie=G((RQt,xie)=>{var qWe=Dc(),YWe=(e,t)=>{try{return new qWe(e,t).range||"*"}catch{return null}};xie.exports=YWe});var sk=G((FQt,Fie)=>{var WWe=zo(),Rie=cB(),{ANY:VWe}=Rie,KWe=Dc(),JWe=fB(),Qie=oB(),Tie=$x(),zWe=tk(),ZWe=ek(),XWe=(e,t,r,s)=>{e=new WWe(e,s),t=new KWe(t,s);let a,n,c,f,p;switch(r){case">":a=Qie,n=zWe,c=Tie,f=">",p=">=";break;case"<":a=Tie,n=ZWe,c=Qie,f="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(JWe(e,t,s))return!1;for(let h=0;h{x.semver===VWe&&(x=new Rie(">=0.0.0")),C=C||x,S=S||x,a(x.semver,C.semver,s)?C=x:c(x.semver,S.semver,s)&&(S=x)}),C.operator===f||C.operator===p||(!S.operator||S.operator===f)&&n(e,S.semver))return!1;if(S.operator===p&&c(e,S.semver))return!1}return!0};Fie.exports=XWe});var Oie=G((NQt,Nie)=>{var $We=sk(),eVe=(e,t,r)=>$We(e,t,">",r);Nie.exports=eVe});var Mie=G((OQt,Lie)=>{var tVe=sk(),rVe=(e,t,r)=>tVe(e,t,"<",r);Lie.exports=rVe});var Hie=G((LQt,_ie)=>{var Uie=Dc(),nVe=(e,t,r)=>(e=new Uie(e,r),t=new Uie(t,r),e.intersects(t,r));_ie.exports=nVe});var Gie=G((MQt,jie)=>{var iVe=fB(),sVe=bc();jie.exports=(e,t,r)=>{let s=[],a=null,n=null,c=e.sort((E,C)=>sVe(E,C,r));for(let E of c)iVe(E,t,r)?(n=E,a||(a=E)):(n&&s.push([a,n]),n=null,a=null);a&&s.push([a,null]);let f=[];for(let[E,C]of s)E===C?f.push(E):!C&&E===c[0]?f.push("*"):C?E===c[0]?f.push(`<=${C}`):f.push(`${E} - ${C}`):f.push(`>=${E}`);let p=f.join(" || "),h=typeof t.raw=="string"?t.raw:String(t);return p.length{var qie=Dc(),U_=cB(),{ANY:M_}=U_,AB=fB(),__=bc(),oVe=(e,t,r={})=>{if(e===t)return!0;e=new qie(e,r),t=new qie(t,r);let s=!1;e:for(let a of e.set){for(let n of t.set){let c=lVe(a,n,r);if(s=s||c!==null,c)continue e}if(s)return!1}return!0},aVe=[new U_(">=0.0.0-0")],Yie=[new U_(">=0.0.0")],lVe=(e,t,r)=>{if(e===t)return!0;if(e.length===1&&e[0].semver===M_){if(t.length===1&&t[0].semver===M_)return!0;r.includePrerelease?e=aVe:e=Yie}if(t.length===1&&t[0].semver===M_){if(r.includePrerelease)return!0;t=Yie}let s=new Set,a,n;for(let x of e)x.operator===">"||x.operator===">="?a=Wie(a,x,r):x.operator==="<"||x.operator==="<="?n=Vie(n,x,r):s.add(x.semver);if(s.size>1)return null;let c;if(a&&n){if(c=__(a.semver,n.semver,r),c>0)return null;if(c===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let x of s){if(a&&!AB(x,String(a),r)||n&&!AB(x,String(n),r))return null;for(let I of t)if(!AB(x,String(I),r))return!1;return!0}let f,p,h,E,C=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,S=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;C&&C.prerelease.length===1&&n.operator==="<"&&C.prerelease[0]===0&&(C=!1);for(let x of t){if(E=E||x.operator===">"||x.operator===">=",h=h||x.operator==="<"||x.operator==="<=",a){if(S&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===S.major&&x.semver.minor===S.minor&&x.semver.patch===S.patch&&(S=!1),x.operator===">"||x.operator===">="){if(f=Wie(a,x,r),f===x&&f!==a)return!1}else if(a.operator===">="&&!AB(a.semver,String(x),r))return!1}if(n){if(C&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===C.major&&x.semver.minor===C.minor&&x.semver.patch===C.patch&&(C=!1),x.operator==="<"||x.operator==="<="){if(p=Vie(n,x,r),p===x&&p!==n)return!1}else if(n.operator==="<="&&!AB(n.semver,String(x),r))return!1}if(!x.operator&&(n||a)&&c!==0)return!1}return!(a&&h&&!n&&c!==0||n&&E&&!a&&c!==0||S||C)},Wie=(e,t,r)=>{if(!e)return t;let s=__(e.semver,t.semver,r);return s>0?e:s<0||t.operator===">"&&e.operator===">="?t:e},Vie=(e,t,r)=>{if(!e)return t;let s=__(e.semver,t.semver,r);return s<0?e:s>0||t.operator==="<"&&e.operator==="<="?t:e};Kie.exports=oVe});var hi=G((_Qt,Xie)=>{var H_=xE(),zie=iB(),cVe=zo(),Zie=B_(),uVe=U0(),fVe=gne(),AVe=yne(),pVe=Cne(),hVe=vne(),dVe=bne(),gVe=Pne(),mVe=kne(),yVe=Tne(),EVe=bc(),IVe=One(),CVe=Mne(),wVe=Xx(),BVe=jne(),vVe=qne(),SVe=oB(),bVe=$x(),DVe=S_(),PVe=b_(),xVe=ek(),kVe=tk(),QVe=D_(),TVe=$ne(),RVe=cB(),FVe=Dc(),NVe=fB(),OVe=Cie(),LVe=Bie(),MVe=Sie(),UVe=Pie(),_Ve=kie(),HVe=sk(),jVe=Oie(),GVe=Mie(),qVe=Hie(),YVe=Gie(),WVe=Jie();Xie.exports={parse:uVe,valid:fVe,clean:AVe,inc:pVe,diff:hVe,major:dVe,minor:gVe,patch:mVe,prerelease:yVe,compare:EVe,rcompare:IVe,compareLoose:CVe,compareBuild:wVe,sort:BVe,rsort:vVe,gt:SVe,lt:bVe,eq:DVe,neq:PVe,gte:xVe,lte:kVe,cmp:QVe,coerce:TVe,Comparator:RVe,Range:FVe,satisfies:NVe,toComparators:OVe,maxSatisfying:LVe,minSatisfying:MVe,minVersion:UVe,validRange:_Ve,outside:HVe,gtr:jVe,ltr:GVe,intersects:qVe,simplifyRange:YVe,subset:WVe,SemVer:cVe,re:H_.re,src:H_.src,tokens:H_.t,SEMVER_SPEC_VERSION:zie.SEMVER_SPEC_VERSION,RELEASE_TYPES:zie.RELEASE_TYPES,compareIdentifiers:Zie.compareIdentifiers,rcompareIdentifiers:Zie.rcompareIdentifiers}});var ese=G((HQt,$ie)=>{"use strict";function VVe(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function G0(e,t,r,s){this.message=e,this.expected=t,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,G0)}VVe(G0,Error);G0.buildMessage=function(e,t){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C{switch(Ne[1]){case"|":return xe|Ne[3];case"&":return xe&Ne[3];case"^":return xe^Ne[3]}},ee)},S="!",x=Fe("!",!1),I=function(ee){return!ee},R="(",N=Fe("(",!1),U=")",K=Fe(")",!1),$=function(ee){return ee},ie=/^[^ \t\n\r()!|&\^]/,fe=Qe([" "," ",` +`,"\r","(",")","!","|","&","^"],!0,!1),le=function(ee){return t.queryPattern.test(ee)},ge=function(ee){return t.checkFn(ee)},pe=Te("whitespace"),De=/^[ \t\n\r]/,ye=Qe([" "," ",` +`,"\r"],!1,!1),d=0,ve=0,Ie=[{line:1,column:1}],me=0,ce=[],X=0,be;if("startRule"in t){if(!(t.startRule in s))throw new Error(`Can't start parsing from rule "`+t.startRule+'".');a=s[t.startRule]}function ke(){return e.substring(ve,d)}function it(){return Me(ve,d)}function _(ee,se){throw se=se!==void 0?se:Me(ve,d),D([Te(ee)],e.substring(ve,d),se)}function tt(ee,se){throw se=se!==void 0?se:Me(ve,d),w(ee,se)}function Fe(ee,se){return{type:"literal",text:ee,ignoreCase:se}}function Qe(ee,se,xe){return{type:"class",parts:ee,inverted:se,ignoreCase:xe}}function Se(){return{type:"any"}}function je(){return{type:"end"}}function Te(ee){return{type:"other",description:ee}}function ct(ee){var se=Ie[ee],xe;if(se)return se;for(xe=ee-1;!Ie[xe];)xe--;for(se=Ie[xe],se={line:se.line,column:se.column};xeme&&(me=d,ce=[]),ce.push(ee))}function w(ee,se){return new G0(ee,null,null,se)}function D(ee,se,xe){return new G0(G0.buildMessage(ee,se),ee,se,xe)}function y(){var ee,se,xe,Ne,ut,Ct,Yt,ir;if(ee=d,se=F(),se!==r){for(xe=[],Ne=d,ut=Z(),ut!==r?(e.charCodeAt(d)===124?(Ct=n,d++):(Ct=r,X===0&&P(c)),Ct===r&&(e.charCodeAt(d)===38?(Ct=f,d++):(Ct=r,X===0&&P(p)),Ct===r&&(e.charCodeAt(d)===94?(Ct=h,d++):(Ct=r,X===0&&P(E)))),Ct!==r?(Yt=Z(),Yt!==r?(ir=F(),ir!==r?(ut=[ut,Ct,Yt,ir],Ne=ut):(d=Ne,Ne=r)):(d=Ne,Ne=r)):(d=Ne,Ne=r)):(d=Ne,Ne=r);Ne!==r;)xe.push(Ne),Ne=d,ut=Z(),ut!==r?(e.charCodeAt(d)===124?(Ct=n,d++):(Ct=r,X===0&&P(c)),Ct===r&&(e.charCodeAt(d)===38?(Ct=f,d++):(Ct=r,X===0&&P(p)),Ct===r&&(e.charCodeAt(d)===94?(Ct=h,d++):(Ct=r,X===0&&P(E)))),Ct!==r?(Yt=Z(),Yt!==r?(ir=F(),ir!==r?(ut=[ut,Ct,Yt,ir],Ne=ut):(d=Ne,Ne=r)):(d=Ne,Ne=r)):(d=Ne,Ne=r)):(d=Ne,Ne=r);xe!==r?(ve=ee,se=C(se,xe),ee=se):(d=ee,ee=r)}else d=ee,ee=r;return ee}function F(){var ee,se,xe,Ne,ut,Ct;return ee=d,e.charCodeAt(d)===33?(se=S,d++):(se=r,X===0&&P(x)),se!==r?(xe=F(),xe!==r?(ve=ee,se=I(xe),ee=se):(d=ee,ee=r)):(d=ee,ee=r),ee===r&&(ee=d,e.charCodeAt(d)===40?(se=R,d++):(se=r,X===0&&P(N)),se!==r?(xe=Z(),xe!==r?(Ne=y(),Ne!==r?(ut=Z(),ut!==r?(e.charCodeAt(d)===41?(Ct=U,d++):(Ct=r,X===0&&P(K)),Ct!==r?(ve=ee,se=$(Ne),ee=se):(d=ee,ee=r)):(d=ee,ee=r)):(d=ee,ee=r)):(d=ee,ee=r)):(d=ee,ee=r),ee===r&&(ee=z())),ee}function z(){var ee,se,xe,Ne,ut;if(ee=d,se=Z(),se!==r){if(xe=d,Ne=[],ie.test(e.charAt(d))?(ut=e.charAt(d),d++):(ut=r,X===0&&P(fe)),ut!==r)for(;ut!==r;)Ne.push(ut),ie.test(e.charAt(d))?(ut=e.charAt(d),d++):(ut=r,X===0&&P(fe));else Ne=r;Ne!==r?xe=e.substring(xe,d):xe=Ne,xe!==r?(ve=d,Ne=le(xe),Ne?Ne=void 0:Ne=r,Ne!==r?(ve=ee,se=ge(xe),ee=se):(d=ee,ee=r)):(d=ee,ee=r)}else d=ee,ee=r;return ee}function Z(){var ee,se;for(X++,ee=[],De.test(e.charAt(d))?(se=e.charAt(d),d++):(se=r,X===0&&P(ye));se!==r;)ee.push(se),De.test(e.charAt(d))?(se=e.charAt(d),d++):(se=r,X===0&&P(ye));return X--,ee===r&&(se=r,X===0&&P(pe)),ee}if(be=a(),be!==r&&d===e.length)return be;throw be!==r&&d{var{parse:JVe}=ese();ok.makeParser=(e=/[a-z]+/)=>(t,r)=>JVe(t,{queryPattern:e,checkFn:r});ok.parse=ok.makeParser()});var nse=G((GQt,rse)=>{"use strict";rse.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 j_=G((qQt,sse)=>{var pB=nse(),ise={};for(let e of Object.keys(pB))ise[pB[e]]=e;var dr={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"]}};sse.exports=dr;for(let e of Object.keys(dr)){if(!("channels"in dr[e]))throw new Error("missing channels property: "+e);if(!("labels"in dr[e]))throw new Error("missing channel labels property: "+e);if(dr[e].labels.length!==dr[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:t,labels:r}=dr[e];delete dr[e].channels,delete dr[e].labels,Object.defineProperty(dr[e],"channels",{value:t}),Object.defineProperty(dr[e],"labels",{value:r})}dr.rgb.hsl=function(e){let t=e[0]/255,r=e[1]/255,s=e[2]/255,a=Math.min(t,r,s),n=Math.max(t,r,s),c=n-a,f,p;n===a?f=0:t===n?f=(r-s)/c:r===n?f=2+(s-t)/c:s===n&&(f=4+(t-r)/c),f=Math.min(f*60,360),f<0&&(f+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=c/(n+a):p=c/(2-n-a),[f,p*100,h*100]};dr.rgb.hsv=function(e){let t,r,s,a,n,c=e[0]/255,f=e[1]/255,p=e[2]/255,h=Math.max(c,f,p),E=h-Math.min(c,f,p),C=function(S){return(h-S)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,t=C(c),r=C(f),s=C(p),c===h?a=s-r:f===h?a=1/3+t-s:p===h&&(a=2/3+r-t),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};dr.rgb.hwb=function(e){let t=e[0],r=e[1],s=e[2],a=dr.rgb.hsl(e)[0],n=1/255*Math.min(t,Math.min(r,s));return s=1-1/255*Math.max(t,Math.max(r,s)),[a,n*100,s*100]};dr.rgb.cmyk=function(e){let t=e[0]/255,r=e[1]/255,s=e[2]/255,a=Math.min(1-t,1-r,1-s),n=(1-t-a)/(1-a)||0,c=(1-r-a)/(1-a)||0,f=(1-s-a)/(1-a)||0;return[n*100,c*100,f*100,a*100]};function zVe(e,t){return(e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2}dr.rgb.keyword=function(e){let t=ise[e];if(t)return t;let r=1/0,s;for(let a of Object.keys(pB)){let n=pB[a],c=zVe(e,n);c.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,s=s>.04045?((s+.055)/1.055)**2.4:s/12.92;let a=t*.4124+r*.3576+s*.1805,n=t*.2126+r*.7152+s*.0722,c=t*.0193+r*.1192+s*.9505;return[a*100,n*100,c*100]};dr.rgb.lab=function(e){let t=dr.rgb.xyz(e),r=t[0],s=t[1],a=t[2];r/=95.047,s/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*s-16,c=500*(r-s),f=200*(s-a);return[n,c,f]};dr.hsl.rgb=function(e){let t=e[0]/360,r=e[1]/100,s=e[2]/100,a,n,c;if(r===0)return c=s*255,[c,c,c];s<.5?a=s*(1+r):a=s+r-s*r;let f=2*s-a,p=[0,0,0];for(let h=0;h<3;h++)n=t+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?c=f+(a-f)*6*n:2*n<1?c=a:3*n<2?c=f+(a-f)*(2/3-n)*6:c=f,p[h]=c*255;return p};dr.hsl.hsv=function(e){let t=e[0],r=e[1]/100,s=e[2]/100,a=r,n=Math.max(s,.01);s*=2,r*=s<=1?s:2-s,a*=n<=1?n:2-n;let c=(s+r)/2,f=s===0?2*a/(n+a):2*r/(s+r);return[t,f*100,c*100]};dr.hsv.rgb=function(e){let t=e[0]/60,r=e[1]/100,s=e[2]/100,a=Math.floor(t)%6,n=t-Math.floor(t),c=255*s*(1-r),f=255*s*(1-r*n),p=255*s*(1-r*(1-n));switch(s*=255,a){case 0:return[s,p,c];case 1:return[f,s,c];case 2:return[c,s,p];case 3:return[c,f,s];case 4:return[p,c,s];case 5:return[s,c,f]}};dr.hsv.hsl=function(e){let t=e[0],r=e[1]/100,s=e[2]/100,a=Math.max(s,.01),n,c;c=(2-r)*s;let f=(2-r)*a;return n=r*a,n/=f<=1?f:2-f,n=n||0,c/=2,[t,n*100,c*100]};dr.hwb.rgb=function(e){let t=e[0]/360,r=e[1]/100,s=e[2]/100,a=r+s,n;a>1&&(r/=a,s/=a);let c=Math.floor(6*t),f=1-s;n=6*t-c,c&1&&(n=1-n);let p=r+n*(f-r),h,E,C;switch(c){default:case 6:case 0:h=f,E=p,C=r;break;case 1:h=p,E=f,C=r;break;case 2:h=r,E=f,C=p;break;case 3:h=r,E=p,C=f;break;case 4:h=p,E=r,C=f;break;case 5:h=f,E=r,C=p;break}return[h*255,E*255,C*255]};dr.cmyk.rgb=function(e){let t=e[0]/100,r=e[1]/100,s=e[2]/100,a=e[3]/100,n=1-Math.min(1,t*(1-a)+a),c=1-Math.min(1,r*(1-a)+a),f=1-Math.min(1,s*(1-a)+a);return[n*255,c*255,f*255]};dr.xyz.rgb=function(e){let t=e[0]/100,r=e[1]/100,s=e[2]/100,a,n,c;return a=t*3.2406+r*-1.5372+s*-.4986,n=t*-.9689+r*1.8758+s*.0415,c=t*.0557+r*-.204+s*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,c=c>.0031308?1.055*c**(1/2.4)-.055:c*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),c=Math.min(Math.max(0,c),1),[a*255,n*255,c*255]};dr.xyz.lab=function(e){let t=e[0],r=e[1],s=e[2];t/=95.047,r/=100,s/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116;let a=116*r-16,n=500*(t-r),c=200*(r-s);return[a,n,c]};dr.lab.xyz=function(e){let t=e[0],r=e[1],s=e[2],a,n,c;n=(t+16)/116,a=r/500+n,c=n-s/200;let f=n**3,p=a**3,h=c**3;return n=f>.008856?f:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,c=h>.008856?h:(c-16/116)/7.787,a*=95.047,n*=100,c*=108.883,[a,n,c]};dr.lab.lch=function(e){let t=e[0],r=e[1],s=e[2],a;a=Math.atan2(s,r)*360/2/Math.PI,a<0&&(a+=360);let c=Math.sqrt(r*r+s*s);return[t,c,a]};dr.lch.lab=function(e){let t=e[0],r=e[1],a=e[2]/360*2*Math.PI,n=r*Math.cos(a),c=r*Math.sin(a);return[t,n,c]};dr.rgb.ansi16=function(e,t=null){let[r,s,a]=e,n=t===null?dr.rgb.hsv(e)[2]:t;if(n=Math.round(n/50),n===0)return 30;let c=30+(Math.round(a/255)<<2|Math.round(s/255)<<1|Math.round(r/255));return n===2&&(c+=60),c};dr.hsv.ansi16=function(e){return dr.rgb.ansi16(dr.hsv.rgb(e),e[2])};dr.rgb.ansi256=function(e){let t=e[0],r=e[1],s=e[2];return t===r&&r===s?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(s/255*5)};dr.ansi16.rgb=function(e){let t=e%10;if(t===0||t===7)return e>50&&(t+=3.5),t=t/10.5*255,[t,t,t];let r=(~~(e>50)+1)*.5,s=(t&1)*r*255,a=(t>>1&1)*r*255,n=(t>>2&1)*r*255;return[s,a,n]};dr.ansi256.rgb=function(e){if(e>=232){let n=(e-232)*10+8;return[n,n,n]}e-=16;let t,r=Math.floor(e/36)/5*255,s=Math.floor((t=e%36)/6)/5*255,a=t%6/5*255;return[r,s,a]};dr.rgb.hex=function(e){let r=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};dr.hex.rgb=function(e){let t=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];let r=t[0];t[0].length===3&&(r=r.split("").map(f=>f+f).join(""));let s=parseInt(r,16),a=s>>16&255,n=s>>8&255,c=s&255;return[a,n,c]};dr.rgb.hcg=function(e){let t=e[0]/255,r=e[1]/255,s=e[2]/255,a=Math.max(Math.max(t,r),s),n=Math.min(Math.min(t,r),s),c=a-n,f,p;return c<1?f=n/(1-c):f=0,c<=0?p=0:a===t?p=(r-s)/c%6:a===r?p=2+(s-t)/c:p=4+(t-r)/c,p/=6,p%=1,[p*360,c*100,f*100]};dr.hsl.hcg=function(e){let t=e[1]/100,r=e[2]/100,s=r<.5?2*t*r:2*t*(1-r),a=0;return s<1&&(a=(r-.5*s)/(1-s)),[e[0],s*100,a*100]};dr.hsv.hcg=function(e){let t=e[1]/100,r=e[2]/100,s=t*r,a=0;return s<1&&(a=(r-s)/(1-s)),[e[0],s*100,a*100]};dr.hcg.rgb=function(e){let t=e[0]/360,r=e[1]/100,s=e[2]/100;if(r===0)return[s*255,s*255,s*255];let a=[0,0,0],n=t%1*6,c=n%1,f=1-c,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=c,a[2]=0;break;case 1:a[0]=f,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=c;break;case 3:a[0]=0,a[1]=f,a[2]=1;break;case 4:a[0]=c,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=f}return p=(1-r)*s,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};dr.hcg.hsv=function(e){let t=e[1]/100,r=e[2]/100,s=t+r*(1-t),a=0;return s>0&&(a=t/s),[e[0],a*100,s*100]};dr.hcg.hsl=function(e){let t=e[1]/100,s=e[2]/100*(1-t)+.5*t,a=0;return s>0&&s<.5?a=t/(2*s):s>=.5&&s<1&&(a=t/(2*(1-s))),[e[0],a*100,s*100]};dr.hcg.hwb=function(e){let t=e[1]/100,r=e[2]/100,s=t+r*(1-t);return[e[0],(s-t)*100,(1-s)*100]};dr.hwb.hcg=function(e){let t=e[1]/100,s=1-e[2]/100,a=s-t,n=0;return a<1&&(n=(s-a)/(1-a)),[e[0],a*100,n*100]};dr.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};dr.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};dr.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};dr.gray.hsl=function(e){return[0,0,e[0]]};dr.gray.hsv=dr.gray.hsl;dr.gray.hwb=function(e){return[0,100,e[0]]};dr.gray.cmyk=function(e){return[0,0,0,e[0]]};dr.gray.lab=function(e){return[e[0],0,0]};dr.gray.hex=function(e){let t=Math.round(e[0]/100*255)&255,s=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return"000000".substring(s.length)+s};dr.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var ase=G((YQt,ose)=>{var ak=j_();function ZVe(){let e={},t=Object.keys(ak);for(let r=t.length,s=0;s{var G_=j_(),t7e=ase(),RE={},r7e=Object.keys(G_);function n7e(e){let t=function(...r){let s=r[0];return s==null?s:(s.length>1&&(r=s),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}function i7e(e){let t=function(...r){let s=r[0];if(s==null)return s;s.length>1&&(r=s);let a=e(r);if(typeof a=="object")for(let n=a.length,c=0;c{RE[e]={},Object.defineProperty(RE[e],"channels",{value:G_[e].channels}),Object.defineProperty(RE[e],"labels",{value:G_[e].labels});let t=t7e(e);Object.keys(t).forEach(s=>{let a=t[s];RE[e][s]=i7e(a),RE[e][s].raw=n7e(a)})});lse.exports=RE});var ck=G((VQt,hse)=>{"use strict";var use=(e,t)=>(...r)=>`\x1B[${e(...r)+t}m`,fse=(e,t)=>(...r)=>{let s=e(...r);return`\x1B[${38+t};5;${s}m`},Ase=(e,t)=>(...r)=>{let s=e(...r);return`\x1B[${38+t};2;${s[0]};${s[1]};${s[2]}m`},lk=e=>e,pse=(e,t,r)=>[e,t,r],FE=(e,t,r)=>{Object.defineProperty(e,t,{get:()=>{let s=r();return Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0}),s},enumerable:!0,configurable:!0})},q_,NE=(e,t,r,s)=>{q_===void 0&&(q_=cse());let a=s?10:0,n={};for(let[c,f]of Object.entries(q_)){let p=c==="ansi16"?"ansi":c;c===t?n[p]=e(r,a):typeof f=="object"&&(n[p]=e(f[t],a))}return n};function s7e(){let e=new Map,t={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]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(let[r,s]of Object.entries(t)){for(let[a,n]of Object.entries(s))t[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},s[a]=t[a],e.set(n[0],n[1]);Object.defineProperty(t,r,{value:s,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="\x1B[39m",t.bgColor.close="\x1B[49m",FE(t.color,"ansi",()=>NE(use,"ansi16",lk,!1)),FE(t.color,"ansi256",()=>NE(fse,"ansi256",lk,!1)),FE(t.color,"ansi16m",()=>NE(Ase,"rgb",pse,!1)),FE(t.bgColor,"ansi",()=>NE(use,"ansi16",lk,!0)),FE(t.bgColor,"ansi256",()=>NE(fse,"ansi256",lk,!0)),FE(t.bgColor,"ansi16m",()=>NE(Ase,"rgb",pse,!0)),t}Object.defineProperty(hse,"exports",{enumerable:!0,get:s7e})});var gse=G((KQt,dse)=>{"use strict";dse.exports=(e,t=process.argv)=>{let r=e.startsWith("-")?"":e.length===1?"-":"--",s=t.indexOf(r+e),a=t.indexOf("--");return s!==-1&&(a===-1||s{"use strict";var o7e=Ce("os"),mse=Ce("tty"),Pc=gse(),{env:Ts}=process,ud;Pc("no-color")||Pc("no-colors")||Pc("color=false")||Pc("color=never")?ud=0:(Pc("color")||Pc("colors")||Pc("color=true")||Pc("color=always"))&&(ud=1);"FORCE_COLOR"in Ts&&(Ts.FORCE_COLOR==="true"?ud=1:Ts.FORCE_COLOR==="false"?ud=0:ud=Ts.FORCE_COLOR.length===0?1:Math.min(parseInt(Ts.FORCE_COLOR,10),3));function Y_(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function W_(e,t){if(ud===0)return 0;if(Pc("color=16m")||Pc("color=full")||Pc("color=truecolor"))return 3;if(Pc("color=256"))return 2;if(e&&!t&&ud===void 0)return 0;let r=ud||0;if(Ts.TERM==="dumb")return r;if(process.platform==="win32"){let s=o7e.release().split(".");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if("CI"in Ts)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(s=>s in Ts)||Ts.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Ts)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Ts.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Ts)return 1;if(Ts.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Ts){let s=parseInt((Ts.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Ts.TERM_PROGRAM){case"iTerm.app":return s>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Ts.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Ts.TERM)||"COLORTERM"in Ts?1:r}function a7e(e){let t=W_(e,e&&e.isTTY);return Y_(t)}yse.exports={supportsColor:a7e,stdout:Y_(W_(!0,mse.isatty(1))),stderr:Y_(W_(!0,mse.isatty(2)))}});var Cse=G((zQt,Ise)=>{"use strict";var l7e=(e,t,r)=>{let s=e.indexOf(t);if(s===-1)return e;let a=t.length,n=0,c="";do c+=e.substr(n,s-n)+t+r,n=s+a,s=e.indexOf(t,n);while(s!==-1);return c+=e.substr(n),c},c7e=(e,t,r,s)=>{let a=0,n="";do{let c=e[s-1]==="\r";n+=e.substr(a,(c?s-1:s)-a)+t+(c?`\r +`:` +`)+r,a=s+1,s=e.indexOf(` +`,a)}while(s!==-1);return n+=e.substr(a),n};Ise.exports={stringReplaceAll:l7e,stringEncaseCRLFWithFirstIndex:c7e}});var bse=G((ZQt,Sse)=>{"use strict";var u7e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,wse=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,f7e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,A7e=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,p7e=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function vse(e){let t=e[0]==="u",r=e[1]==="{";return t&&!r&&e.length===5||e[0]==="x"&&e.length===3?String.fromCharCode(parseInt(e.slice(1),16)):t&&r?String.fromCodePoint(parseInt(e.slice(2,-1),16)):p7e.get(e)||e}function h7e(e,t){let r=[],s=t.trim().split(/\s*,\s*/g),a;for(let n of s){let c=Number(n);if(!Number.isNaN(c))r.push(c);else if(a=n.match(f7e))r.push(a[2].replace(A7e,(f,p,h)=>p?vse(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${e}')`)}return r}function d7e(e){wse.lastIndex=0;let t=[],r;for(;(r=wse.exec(e))!==null;){let s=r[1];if(r[2]){let a=h7e(s,r[2]);t.push([s].concat(a))}else t.push([s])}return t}function Bse(e,t){let r={};for(let a of t)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let s=e;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in s))throw new Error(`Unknown Chalk style: ${a}`);s=n.length>0?s[a](...n):s[a]}return s}Sse.exports=(e,t)=>{let r=[],s=[],a=[];if(t.replace(u7e,(n,c,f,p,h,E)=>{if(c)a.push(vse(c));else if(p){let C=a.join("");a=[],s.push(r.length===0?C:Bse(e,r)(C)),r.push({inverse:f,styles:d7e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");s.push(Bse(e,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),s.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return s.join("")}});var LE=G((XQt,Tse)=>{"use strict";var hB=ck(),{stdout:K_,stderr:J_}=Ese(),{stringReplaceAll:g7e,stringEncaseCRLFWithFirstIndex:m7e}=Cse(),{isArray:uk}=Array,Pse=["ansi","ansi","ansi256","ansi16m"],OE=Object.create(null),y7e=(e,t={})=>{if(t.level&&!(Number.isInteger(t.level)&&t.level>=0&&t.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=K_?K_.level:0;e.level=t.level===void 0?r:t.level},z_=class{constructor(t){return xse(t)}},xse=e=>{let t={};return y7e(t,e),t.template=(...r)=>Qse(t.template,...r),Object.setPrototypeOf(t,fk.prototype),Object.setPrototypeOf(t.template,t),t.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},t.template.Instance=z_,t.template};function fk(e){return xse(e)}for(let[e,t]of Object.entries(hB))OE[e]={get(){let r=Ak(this,Z_(t.open,t.close,this._styler),this._isEmpty);return Object.defineProperty(this,e,{value:r}),r}};OE.visible={get(){let e=Ak(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:e}),e}};var kse=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let e of kse)OE[e]={get(){let{level:t}=this;return function(...r){let s=Z_(hB.color[Pse[t]][e](...r),hB.color.close,this._styler);return Ak(this,s,this._isEmpty)}}};for(let e of kse){let t="bg"+e[0].toUpperCase()+e.slice(1);OE[t]={get(){let{level:r}=this;return function(...s){let a=Z_(hB.bgColor[Pse[r]][e](...s),hB.bgColor.close,this._styler);return Ak(this,a,this._isEmpty)}}}}var E7e=Object.defineProperties(()=>{},{...OE,level:{enumerable:!0,get(){return this._generator.level},set(e){this._generator.level=e}}}),Z_=(e,t,r)=>{let s,a;return r===void 0?(s=e,a=t):(s=r.openAll+e,a=t+r.closeAll),{open:e,close:t,openAll:s,closeAll:a,parent:r}},Ak=(e,t,r)=>{let s=(...a)=>uk(a[0])&&uk(a[0].raw)?Dse(s,Qse(s,...a)):Dse(s,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(s,E7e),s._generator=e,s._styler=t,s._isEmpty=r,s},Dse=(e,t)=>{if(e.level<=0||!t)return e._isEmpty?"":t;let r=e._styler;if(r===void 0)return t;let{openAll:s,closeAll:a}=r;if(t.indexOf("\x1B")!==-1)for(;r!==void 0;)t=g7e(t,r.close,r.open),r=r.parent;let n=t.indexOf(` +`);return n!==-1&&(t=m7e(t,a,s,n)),s+t+a},V_,Qse=(e,...t)=>{let[r]=t;if(!uk(r)||!uk(r.raw))return t.join(" ");let s=t.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";xc.isInteger=e=>typeof e=="number"?Number.isInteger(e):typeof e=="string"&&e.trim()!==""?Number.isInteger(Number(e)):!1;xc.find=(e,t)=>e.nodes.find(r=>r.type===t);xc.exceedsLimit=(e,t,r=1,s)=>s===!1||!xc.isInteger(e)||!xc.isInteger(t)?!1:(Number(t)-Number(e))/Number(r)>=s;xc.escapeNode=(e,t=0,r)=>{let s=e.nodes[t];s&&(r&&s.type===r||s.type==="open"||s.type==="close")&&s.escaped!==!0&&(s.value="\\"+s.value,s.escaped=!0)};xc.encloseBrace=e=>e.type!=="brace"||e.commas>>0+e.ranges>>0?!1:(e.invalid=!0,!0);xc.isInvalidBrace=e=>e.type!=="brace"?!1:e.invalid===!0||e.dollar?!0:!(e.commas>>0+e.ranges>>0)||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;xc.isOpenOrClose=e=>e.type==="open"||e.type==="close"?!0:e.open===!0||e.close===!0;xc.reduce=e=>e.reduce((t,r)=>(r.type==="text"&&t.push(r.value),r.type==="range"&&(r.type="text"),t),[]);xc.flatten=(...e)=>{let t=[],r=s=>{for(let a=0;a{"use strict";var Rse=hk();Fse.exports=(e,t={})=>{let r=(s,a={})=>{let n=t.escapeInvalid&&Rse.isInvalidBrace(a),c=s.invalid===!0&&t.escapeInvalid===!0,f="";if(s.value)return(n||c)&&Rse.isOpenOrClose(s)?"\\"+s.value:s.value;if(s.value)return s.value;if(s.nodes)for(let p of s.nodes)f+=r(p);return f};return r(e)}});var Ose=G((tTt,Nse)=>{"use strict";Nse.exports=function(e){return typeof e=="number"?e-e===0:typeof e=="string"&&e.trim()!==""?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var Yse=G((rTt,qse)=>{"use strict";var Lse=Ose(),q0=(e,t,r)=>{if(Lse(e)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(t===void 0||e===t)return String(e);if(Lse(t)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let s={relaxZeros:!0,...r};typeof s.strictZeros=="boolean"&&(s.relaxZeros=s.strictZeros===!1);let a=String(s.relaxZeros),n=String(s.shorthand),c=String(s.capture),f=String(s.wrap),p=e+":"+t+"="+a+n+c+f;if(q0.cache.hasOwnProperty(p))return q0.cache[p].result;let h=Math.min(e,t),E=Math.max(e,t);if(Math.abs(h-E)===1){let R=e+"|"+t;return s.capture?`(${R})`:s.wrap===!1?R:`(?:${R})`}let C=Gse(e)||Gse(t),S={min:e,max:t,a:h,b:E},x=[],I=[];if(C&&(S.isPadded=C,S.maxLen=String(S.max).length),h<0){let R=E<0?Math.abs(E):1;I=Mse(R,Math.abs(h),S,s),h=S.a=0}return E>=0&&(x=Mse(h,E,S,s)),S.negatives=I,S.positives=x,S.result=I7e(I,x,s),s.capture===!0?S.result=`(${S.result})`:s.wrap!==!1&&x.length+I.length>1&&(S.result=`(?:${S.result})`),q0.cache[p]=S,S.result};function I7e(e,t,r){let s=X_(e,t,"-",!1,r)||[],a=X_(t,e,"",!1,r)||[],n=X_(e,t,"-?",!0,r)||[];return s.concat(n).concat(a).join("|")}function C7e(e,t){let r=1,s=1,a=_se(e,r),n=new Set([t]);for(;e<=a&&a<=t;)n.add(a),r+=1,a=_se(e,r);for(a=Hse(t+1,s)-1;e1&&f.count.pop(),f.count.push(E.count[0]),f.string=f.pattern+jse(f.count),c=h+1;continue}r.isPadded&&(C=b7e(h,r,s)),E.string=C+E.pattern+jse(E.count),n.push(E),c=h+1,f=E}return n}function X_(e,t,r,s,a){let n=[];for(let c of e){let{string:f}=c;!s&&!Use(t,"string",f)&&n.push(r+f),s&&Use(t,"string",f)&&n.push(r+f)}return n}function B7e(e,t){let r=[];for(let s=0;st?1:t>e?-1:0}function Use(e,t,r){return e.some(s=>s[t]===r)}function _se(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function Hse(e,t){return e-e%Math.pow(10,t)}function jse(e){let[t=0,r=""]=e;return r||t>1?`{${t+(r?","+r:"")}}`:""}function S7e(e,t,r){return`[${e}${t-e===1?"":"-"}${t}]`}function Gse(e){return/^-?(0+)\d/.test(e)}function b7e(e,t,r){if(!t.isPadded)return e;let s=Math.abs(t.maxLen-String(e).length),a=r.relaxZeros!==!1;switch(s){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${s}}`:`0{${s}}`}}q0.cache={};q0.clearCache=()=>q0.cache={};qse.exports=q0});var t4=G((nTt,$se)=>{"use strict";var D7e=Ce("util"),Kse=Yse(),Wse=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),P7e=e=>t=>e===!0?Number(t):String(t),$_=e=>typeof e=="number"||typeof e=="string"&&e!=="",dB=e=>Number.isInteger(+e),e4=e=>{let t=`${e}`,r=-1;if(t[0]==="-"&&(t=t.slice(1)),t==="0")return!1;for(;t[++r]==="0";);return r>0},x7e=(e,t,r)=>typeof e=="string"||typeof t=="string"?!0:r.stringify===!0,k7e=(e,t,r)=>{if(t>0){let s=e[0]==="-"?"-":"";s&&(e=e.slice(1)),e=s+e.padStart(s?t-1:t,"0")}return r===!1?String(e):e},Vse=(e,t)=>{let r=e[0]==="-"?"-":"";for(r&&(e=e.slice(1),t--);e.length{e.negatives.sort((c,f)=>cf?1:0),e.positives.sort((c,f)=>cf?1:0);let r=t.capture?"":"?:",s="",a="",n;return e.positives.length&&(s=e.positives.join("|")),e.negatives.length&&(a=`-(${r}${e.negatives.join("|")})`),s&&a?n=`${s}|${a}`:n=s||a,t.wrap?`(${r}${n})`:n},Jse=(e,t,r,s)=>{if(r)return Kse(e,t,{wrap:!1,...s});let a=String.fromCharCode(e);if(e===t)return a;let n=String.fromCharCode(t);return`[${a}-${n}]`},zse=(e,t,r)=>{if(Array.isArray(e)){let s=r.wrap===!0,a=r.capture?"":"?:";return s?`(${a}${e.join("|")})`:e.join("|")}return Kse(e,t,r)},Zse=(...e)=>new RangeError("Invalid range arguments: "+D7e.inspect(...e)),Xse=(e,t,r)=>{if(r.strictRanges===!0)throw Zse([e,t]);return[]},T7e=(e,t)=>{if(t.strictRanges===!0)throw new TypeError(`Expected step "${e}" to be a number`);return[]},R7e=(e,t,r=1,s={})=>{let a=Number(e),n=Number(t);if(!Number.isInteger(a)||!Number.isInteger(n)){if(s.strictRanges===!0)throw Zse([e,t]);return[]}a===0&&(a=0),n===0&&(n=0);let c=a>n,f=String(e),p=String(t),h=String(r);r=Math.max(Math.abs(r),1);let E=e4(f)||e4(p)||e4(h),C=E?Math.max(f.length,p.length,h.length):0,S=E===!1&&x7e(e,t,s)===!1,x=s.transform||P7e(S);if(s.toRegex&&r===1)return Jse(Vse(e,C),Vse(t,C),!0,s);let I={negatives:[],positives:[]},R=K=>I[K<0?"negatives":"positives"].push(Math.abs(K)),N=[],U=0;for(;c?a>=n:a<=n;)s.toRegex===!0&&r>1?R(a):N.push(k7e(x(a,U),C,S)),a=c?a-r:a+r,U++;return s.toRegex===!0?r>1?Q7e(I,s):zse(N,null,{wrap:!1,...s}):N},F7e=(e,t,r=1,s={})=>{if(!dB(e)&&e.length>1||!dB(t)&&t.length>1)return Xse(e,t,s);let a=s.transform||(S=>String.fromCharCode(S)),n=`${e}`.charCodeAt(0),c=`${t}`.charCodeAt(0),f=n>c,p=Math.min(n,c),h=Math.max(n,c);if(s.toRegex&&r===1)return Jse(p,h,!1,s);let E=[],C=0;for(;f?n>=c:n<=c;)E.push(a(n,C)),n=f?n-r:n+r,C++;return s.toRegex===!0?zse(E,null,{wrap:!1,options:s}):E},gk=(e,t,r,s={})=>{if(t==null&&$_(e))return[e];if(!$_(e)||!$_(t))return Xse(e,t,s);if(typeof r=="function")return gk(e,t,1,{transform:r});if(Wse(r))return gk(e,t,0,r);let a={...s};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,dB(r)?dB(e)&&dB(t)?R7e(e,t,r,a):F7e(e,t,Math.max(Math.abs(r),1),a):r!=null&&!Wse(r)?T7e(r,a):gk(e,t,1,r)};$se.exports=gk});var roe=G((iTt,toe)=>{"use strict";var N7e=t4(),eoe=hk(),O7e=(e,t={})=>{let r=(s,a={})=>{let n=eoe.isInvalidBrace(a),c=s.invalid===!0&&t.escapeInvalid===!0,f=n===!0||c===!0,p=t.escapeInvalid===!0?"\\":"",h="";if(s.isOpen===!0||s.isClose===!0)return p+s.value;if(s.type==="open")return f?p+s.value:"(";if(s.type==="close")return f?p+s.value:")";if(s.type==="comma")return s.prev.type==="comma"?"":f?s.value:"|";if(s.value)return s.value;if(s.nodes&&s.ranges>0){let E=eoe.reduce(s.nodes),C=N7e(...E,{...t,wrap:!1,toRegex:!0});if(C.length!==0)return E.length>1&&C.length>1?`(${C})`:C}if(s.nodes)for(let E of s.nodes)h+=r(E,s);return h};return r(e)};toe.exports=O7e});var soe=G((sTt,ioe)=>{"use strict";var L7e=t4(),noe=dk(),ME=hk(),Y0=(e="",t="",r=!1)=>{let s=[];if(e=[].concat(e),t=[].concat(t),!t.length)return e;if(!e.length)return r?ME.flatten(t).map(a=>`{${a}}`):t;for(let a of e)if(Array.isArray(a))for(let n of a)s.push(Y0(n,t,r));else for(let n of t)r===!0&&typeof n=="string"&&(n=`{${n}}`),s.push(Array.isArray(n)?Y0(a,n,r):a+n);return ME.flatten(s)},M7e=(e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit,s=(a,n={})=>{a.queue=[];let c=n,f=n.queue;for(;c.type!=="brace"&&c.type!=="root"&&c.parent;)c=c.parent,f=c.queue;if(a.invalid||a.dollar){f.push(Y0(f.pop(),noe(a,t)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){f.push(Y0(f.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let C=ME.reduce(a.nodes);if(ME.exceedsLimit(...C,t.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let S=L7e(...C,t);S.length===0&&(S=noe(a,t)),f.push(Y0(f.pop(),S)),a.nodes=[];return}let p=ME.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let C=0;C{"use strict";ooe.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 Aoe=G((aTt,foe)=>{"use strict";var U7e=dk(),{MAX_LENGTH:loe,CHAR_BACKSLASH:r4,CHAR_BACKTICK:_7e,CHAR_COMMA:H7e,CHAR_DOT:j7e,CHAR_LEFT_PARENTHESES:G7e,CHAR_RIGHT_PARENTHESES:q7e,CHAR_LEFT_CURLY_BRACE:Y7e,CHAR_RIGHT_CURLY_BRACE:W7e,CHAR_LEFT_SQUARE_BRACKET:coe,CHAR_RIGHT_SQUARE_BRACKET:uoe,CHAR_DOUBLE_QUOTE:V7e,CHAR_SINGLE_QUOTE:K7e,CHAR_NO_BREAK_SPACE:J7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:z7e}=aoe(),Z7e=(e,t={})=>{if(typeof e!="string")throw new TypeError("Expected a string");let r=t||{},s=typeof r.maxLength=="number"?Math.min(loe,r.maxLength):loe;if(e.length>s)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${s})`);let a={type:"root",input:e,nodes:[]},n=[a],c=a,f=a,p=0,h=e.length,E=0,C=0,S,x={},I=()=>e[E++],R=N=>{if(N.type==="text"&&f.type==="dot"&&(f.type="text"),f&&f.type==="text"&&N.type==="text"){f.value+=N.value;return}return c.nodes.push(N),N.parent=c,N.prev=f,f=N,N};for(R({type:"bos"});E0){if(c.ranges>0){c.ranges=0;let N=c.nodes.shift();c.nodes=[N,{type:"text",value:U7e(c)}]}R({type:"comma",value:S}),c.commas++;continue}if(S===j7e&&C>0&&c.commas===0){let N=c.nodes;if(C===0||N.length===0){R({type:"text",value:S});continue}if(f.type==="dot"){if(c.range=[],f.value+=S,f.type="range",c.nodes.length!==3&&c.nodes.length!==5){c.invalid=!0,c.ranges=0,f.type="text";continue}c.ranges++,c.args=[];continue}if(f.type==="range"){N.pop();let U=N[N.length-1];U.value+=f.value+S,f=U,c.ranges--;continue}R({type:"dot",value:S});continue}R({type:"text",value:S})}do if(c=n.pop(),c.type!=="root"){c.nodes.forEach(K=>{K.nodes||(K.type==="open"&&(K.isOpen=!0),K.type==="close"&&(K.isClose=!0),K.nodes||(K.type="text"),K.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(c);N.nodes.splice(U,1,...c.nodes)}while(n.length>0);return R({type:"eos"}),a};foe.exports=Z7e});var doe=G((lTt,hoe)=>{"use strict";var poe=dk(),X7e=roe(),$7e=soe(),eKe=Aoe(),Jl=(e,t={})=>{let r=[];if(Array.isArray(e))for(let s of e){let a=Jl.create(s,t);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(Jl.create(e,t));return t&&t.expand===!0&&t.nodupes===!0&&(r=[...new Set(r)]),r};Jl.parse=(e,t={})=>eKe(e,t);Jl.stringify=(e,t={})=>poe(typeof e=="string"?Jl.parse(e,t):e,t);Jl.compile=(e,t={})=>(typeof e=="string"&&(e=Jl.parse(e,t)),X7e(e,t));Jl.expand=(e,t={})=>{typeof e=="string"&&(e=Jl.parse(e,t));let r=$7e(e,t);return t.noempty===!0&&(r=r.filter(Boolean)),t.nodupes===!0&&(r=[...new Set(r)]),r};Jl.create=(e,t={})=>e===""||e.length<3?[e]:t.expand!==!0?Jl.compile(e,t):Jl.expand(e,t);hoe.exports=Jl});var gB=G((cTt,Ioe)=>{"use strict";var tKe=Ce("path"),Zf="\\\\/",goe=`[^${Zf}]`,kp="\\.",rKe="\\+",nKe="\\?",mk="\\/",iKe="(?=.)",moe="[^/]",n4=`(?:${mk}|$)`,yoe=`(?:^|${mk})`,i4=`${kp}{1,2}${n4}`,sKe=`(?!${kp})`,oKe=`(?!${yoe}${i4})`,aKe=`(?!${kp}{0,1}${n4})`,lKe=`(?!${i4})`,cKe=`[^.${mk}]`,uKe=`${moe}*?`,Eoe={DOT_LITERAL:kp,PLUS_LITERAL:rKe,QMARK_LITERAL:nKe,SLASH_LITERAL:mk,ONE_CHAR:iKe,QMARK:moe,END_ANCHOR:n4,DOTS_SLASH:i4,NO_DOT:sKe,NO_DOTS:oKe,NO_DOT_SLASH:aKe,NO_DOTS_SLASH:lKe,QMARK_NO_DOT:cKe,STAR:uKe,START_ANCHOR:yoe},fKe={...Eoe,SLASH_LITERAL:`[${Zf}]`,QMARK:goe,STAR:`${goe}*?`,DOTS_SLASH:`${kp}{1,2}(?:[${Zf}]|$)`,NO_DOT:`(?!${kp})`,NO_DOTS:`(?!(?:^|[${Zf}])${kp}{1,2}(?:[${Zf}]|$))`,NO_DOT_SLASH:`(?!${kp}{0,1}(?:[${Zf}]|$))`,NO_DOTS_SLASH:`(?!${kp}{1,2}(?:[${Zf}]|$))`,QMARK_NO_DOT:`[^.${Zf}]`,START_ANCHOR:`(?:^|[${Zf}])`,END_ANCHOR:`(?:[${Zf}]|$)`},AKe={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"};Ioe.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:AKe,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:tKe.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===!0?fKe:Eoe}}});var mB=G(dl=>{"use strict";var pKe=Ce("path"),hKe=process.platform==="win32",{REGEX_BACKSLASH:dKe,REGEX_REMOVE_BACKSLASH:gKe,REGEX_SPECIAL_CHARS:mKe,REGEX_SPECIAL_CHARS_GLOBAL:yKe}=gB();dl.isObject=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);dl.hasRegexChars=e=>mKe.test(e);dl.isRegexChar=e=>e.length===1&&dl.hasRegexChars(e);dl.escapeRegex=e=>e.replace(yKe,"\\$1");dl.toPosixSlashes=e=>e.replace(dKe,"/");dl.removeBackslashes=e=>e.replace(gKe,t=>t==="\\"?"":t);dl.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};dl.isWindows=e=>e&&typeof e.windows=="boolean"?e.windows:hKe===!0||pKe.sep==="\\";dl.escapeLast=(e,t,r)=>{let s=e.lastIndexOf(t,r);return s===-1?e:e[s-1]==="\\"?dl.escapeLast(e,t,s-1):`${e.slice(0,s)}\\${e.slice(s)}`};dl.removePrefix=(e,t={})=>{let r=e;return r.startsWith("./")&&(r=r.slice(2),t.prefix="./"),r};dl.wrapOutput=(e,t={},r={})=>{let s=r.contains?"":"^",a=r.contains?"":"$",n=`${s}(?:${e})${a}`;return t.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var Poe=G((fTt,Doe)=>{"use strict";var Coe=mB(),{CHAR_ASTERISK:s4,CHAR_AT:EKe,CHAR_BACKWARD_SLASH:yB,CHAR_COMMA:IKe,CHAR_DOT:o4,CHAR_EXCLAMATION_MARK:a4,CHAR_FORWARD_SLASH:boe,CHAR_LEFT_CURLY_BRACE:l4,CHAR_LEFT_PARENTHESES:c4,CHAR_LEFT_SQUARE_BRACKET:CKe,CHAR_PLUS:wKe,CHAR_QUESTION_MARK:woe,CHAR_RIGHT_CURLY_BRACE:BKe,CHAR_RIGHT_PARENTHESES:Boe,CHAR_RIGHT_SQUARE_BRACKET:vKe}=gB(),voe=e=>e===boe||e===yB,Soe=e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?1/0:1)},SKe=(e,t)=>{let r=t||{},s=e.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],c=[],f=[],p=e,h=-1,E=0,C=0,S=!1,x=!1,I=!1,R=!1,N=!1,U=!1,K=!1,$=!1,ie=!1,fe=!1,le=0,ge,pe,De={value:"",depth:0,isGlob:!1},ye=()=>h>=s,d=()=>p.charCodeAt(h+1),ve=()=>(ge=pe,p.charCodeAt(++h));for(;h0&&(me=p.slice(0,E),p=p.slice(E),C-=E),Ie&&I===!0&&C>0?(Ie=p.slice(0,C),ce=p.slice(C)):I===!0?(Ie="",ce=p):Ie=p,Ie&&Ie!==""&&Ie!=="/"&&Ie!==p&&voe(Ie.charCodeAt(Ie.length-1))&&(Ie=Ie.slice(0,-1)),r.unescape===!0&&(ce&&(ce=Coe.removeBackslashes(ce)),Ie&&K===!0&&(Ie=Coe.removeBackslashes(Ie)));let X={prefix:me,input:e,start:E,base:Ie,glob:ce,isBrace:S,isBracket:x,isGlob:I,isExtglob:R,isGlobstar:N,negated:$,negatedExtglob:ie};if(r.tokens===!0&&(X.maxDepth=0,voe(pe)||c.push(De),X.tokens=c),r.parts===!0||r.tokens===!0){let be;for(let ke=0;ke{"use strict";var yk=gB(),zl=mB(),{MAX_LENGTH:Ek,POSIX_REGEX_SOURCE:bKe,REGEX_NON_SPECIAL_CHARS:DKe,REGEX_SPECIAL_CHARS_BACKREF:PKe,REPLACEMENTS:xoe}=yk,xKe=(e,t)=>{if(typeof t.expandRange=="function")return t.expandRange(...e,t);e.sort();let r=`[${e.join("-")}]`;try{new RegExp(r)}catch{return e.map(a=>zl.escapeRegex(a)).join("..")}return r},UE=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,u4=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");e=xoe[e]||e;let r={...t},s=typeof r.maxLength=="number"?Math.min(Ek,r.maxLength):Ek,a=e.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);let n={type:"bos",value:"",output:r.prepend||""},c=[n],f=r.capture?"":"?:",p=zl.isWindows(t),h=yk.globChars(p),E=yk.extglobChars(h),{DOT_LITERAL:C,PLUS_LITERAL:S,SLASH_LITERAL:x,ONE_CHAR:I,DOTS_SLASH:R,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:K,QMARK:$,QMARK_NO_DOT:ie,STAR:fe,START_ANCHOR:le}=h,ge=P=>`(${f}(?:(?!${le}${P.dot?R:C}).)*?)`,pe=r.dot?"":N,De=r.dot?$:ie,ye=r.bash===!0?ge(r):fe;r.capture&&(ye=`(${ye})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let d={input:e,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:c};e=zl.removePrefix(e,d),a=e.length;let ve=[],Ie=[],me=[],ce=n,X,be=()=>d.index===a-1,ke=d.peek=(P=1)=>e[d.index+P],it=d.advance=()=>e[++d.index]||"",_=()=>e.slice(d.index+1),tt=(P="",w=0)=>{d.consumed+=P,d.index+=w},Fe=P=>{d.output+=P.output!=null?P.output:P.value,tt(P.value)},Qe=()=>{let P=1;for(;ke()==="!"&&(ke(2)!=="("||ke(3)==="?");)it(),d.start++,P++;return P%2===0?!1:(d.negated=!0,d.start++,!0)},Se=P=>{d[P]++,me.push(P)},je=P=>{d[P]--,me.pop()},Te=P=>{if(ce.type==="globstar"){let w=d.braces>0&&(P.type==="comma"||P.type==="brace"),D=P.extglob===!0||ve.length&&(P.type==="pipe"||P.type==="paren");P.type!=="slash"&&P.type!=="paren"&&!w&&!D&&(d.output=d.output.slice(0,-ce.output.length),ce.type="star",ce.value="*",ce.output=ye,d.output+=ce.output)}if(ve.length&&P.type!=="paren"&&(ve[ve.length-1].inner+=P.value),(P.value||P.output)&&Fe(P),ce&&ce.type==="text"&&P.type==="text"){ce.value+=P.value,ce.output=(ce.output||"")+P.value;return}P.prev=ce,c.push(P),ce=P},ct=(P,w)=>{let D={...E[w],conditions:1,inner:""};D.prev=ce,D.parens=d.parens,D.output=d.output;let y=(r.capture?"(":"")+D.open;Se("parens"),Te({type:P,value:w,output:d.output?"":I}),Te({type:"paren",extglob:!0,value:it(),output:y}),ve.push(D)},Me=P=>{let w=P.close+(r.capture?")":""),D;if(P.type==="negate"){let y=ye;if(P.inner&&P.inner.length>1&&P.inner.includes("/")&&(y=ge(r)),(y!==ye||be()||/^\)+$/.test(_()))&&(w=P.close=`)$))${y}`),P.inner.includes("*")&&(D=_())&&/^\.[^\\/.]+$/.test(D)){let F=u4(D,{...t,fastpaths:!1}).output;w=P.close=`)${F})${y})`}P.prev.type==="bos"&&(d.negatedExtglob=!0)}Te({type:"paren",extglob:!0,value:X,output:w}),je("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(e)){let P=!1,w=e.replace(PKe,(D,y,F,z,Z,ee)=>z==="\\"?(P=!0,D):z==="?"?y?y+z+(Z?$.repeat(Z.length):""):ee===0?De+(Z?$.repeat(Z.length):""):$.repeat(F.length):z==="."?C.repeat(F.length):z==="*"?y?y+z+(Z?ye:""):ye:y?D:`\\${D}`);return P===!0&&(r.unescape===!0?w=w.replace(/\\/g,""):w=w.replace(/\\+/g,D=>D.length%2===0?"\\\\":D?"\\":"")),w===e&&r.contains===!0?(d.output=e,d):(d.output=zl.wrapOutput(w,d,t),d)}for(;!be();){if(X=it(),X==="\0")continue;if(X==="\\"){let D=ke();if(D==="/"&&r.bash!==!0||D==="."||D===";")continue;if(!D){X+="\\",Te({type:"text",value:X});continue}let y=/^\\+/.exec(_()),F=0;if(y&&y[0].length>2&&(F=y[0].length,d.index+=F,F%2!==0&&(X+="\\")),r.unescape===!0?X=it():X+=it(),d.brackets===0){Te({type:"text",value:X});continue}}if(d.brackets>0&&(X!=="]"||ce.value==="["||ce.value==="[^")){if(r.posix!==!1&&X===":"){let D=ce.value.slice(1);if(D.includes("[")&&(ce.posix=!0,D.includes(":"))){let y=ce.value.lastIndexOf("["),F=ce.value.slice(0,y),z=ce.value.slice(y+2),Z=bKe[z];if(Z){ce.value=F+Z,d.backtrack=!0,it(),!n.output&&c.indexOf(ce)===1&&(n.output=I);continue}}}(X==="["&&ke()!==":"||X==="-"&&ke()==="]")&&(X=`\\${X}`),X==="]"&&(ce.value==="["||ce.value==="[^")&&(X=`\\${X}`),r.posix===!0&&X==="!"&&ce.value==="["&&(X="^"),ce.value+=X,Fe({value:X});continue}if(d.quotes===1&&X!=='"'){X=zl.escapeRegex(X),ce.value+=X,Fe({value:X});continue}if(X==='"'){d.quotes=d.quotes===1?0:1,r.keepQuotes===!0&&Te({type:"text",value:X});continue}if(X==="("){Se("parens"),Te({type:"paren",value:X});continue}if(X===")"){if(d.parens===0&&r.strictBrackets===!0)throw new SyntaxError(UE("opening","("));let D=ve[ve.length-1];if(D&&d.parens===D.parens+1){Me(ve.pop());continue}Te({type:"paren",value:X,output:d.parens?")":"\\)"}),je("parens");continue}if(X==="["){if(r.nobracket===!0||!_().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(UE("closing","]"));X=`\\${X}`}else Se("brackets");Te({type:"bracket",value:X});continue}if(X==="]"){if(r.nobracket===!0||ce&&ce.type==="bracket"&&ce.value.length===1){Te({type:"text",value:X,output:`\\${X}`});continue}if(d.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(UE("opening","["));Te({type:"text",value:X,output:`\\${X}`});continue}je("brackets");let D=ce.value.slice(1);if(ce.posix!==!0&&D[0]==="^"&&!D.includes("/")&&(X=`/${X}`),ce.value+=X,Fe({value:X}),r.literalBrackets===!1||zl.hasRegexChars(D))continue;let y=zl.escapeRegex(ce.value);if(d.output=d.output.slice(0,-ce.value.length),r.literalBrackets===!0){d.output+=y,ce.value=y;continue}ce.value=`(${f}${y}|${ce.value})`,d.output+=ce.value;continue}if(X==="{"&&r.nobrace!==!0){Se("braces");let D={type:"brace",value:X,output:"(",outputIndex:d.output.length,tokensIndex:d.tokens.length};Ie.push(D),Te(D);continue}if(X==="}"){let D=Ie[Ie.length-1];if(r.nobrace===!0||!D){Te({type:"text",value:X,output:X});continue}let y=")";if(D.dots===!0){let F=c.slice(),z=[];for(let Z=F.length-1;Z>=0&&(c.pop(),F[Z].type!=="brace");Z--)F[Z].type!=="dots"&&z.unshift(F[Z].value);y=xKe(z,r),d.backtrack=!0}if(D.comma!==!0&&D.dots!==!0){let F=d.output.slice(0,D.outputIndex),z=d.tokens.slice(D.tokensIndex);D.value=D.output="\\{",X=y="\\}",d.output=F;for(let Z of z)d.output+=Z.output||Z.value}Te({type:"brace",value:X,output:y}),je("braces"),Ie.pop();continue}if(X==="|"){ve.length>0&&ve[ve.length-1].conditions++,Te({type:"text",value:X});continue}if(X===","){let D=X,y=Ie[Ie.length-1];y&&me[me.length-1]==="braces"&&(y.comma=!0,D="|"),Te({type:"comma",value:X,output:D});continue}if(X==="/"){if(ce.type==="dot"&&d.index===d.start+1){d.start=d.index+1,d.consumed="",d.output="",c.pop(),ce=n;continue}Te({type:"slash",value:X,output:x});continue}if(X==="."){if(d.braces>0&&ce.type==="dot"){ce.value==="."&&(ce.output=C);let D=Ie[Ie.length-1];ce.type="dots",ce.output+=X,ce.value+=X,D.dots=!0;continue}if(d.braces+d.parens===0&&ce.type!=="bos"&&ce.type!=="slash"){Te({type:"text",value:X,output:C});continue}Te({type:"dot",value:X,output:C});continue}if(X==="?"){if(!(ce&&ce.value==="(")&&r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){ct("qmark",X);continue}if(ce&&ce.type==="paren"){let y=ke(),F=X;if(y==="<"&&!zl.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ce.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(_()))&&(F=`\\${X}`),Te({type:"text",value:X,output:F});continue}if(r.dot!==!0&&(ce.type==="slash"||ce.type==="bos")){Te({type:"qmark",value:X,output:ie});continue}Te({type:"qmark",value:X,output:$});continue}if(X==="!"){if(r.noextglob!==!0&&ke()==="("&&(ke(2)!=="?"||!/[!=<:]/.test(ke(3)))){ct("negate",X);continue}if(r.nonegate!==!0&&d.index===0){Qe();continue}}if(X==="+"){if(r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){ct("plus",X);continue}if(ce&&ce.value==="("||r.regex===!1){Te({type:"plus",value:X,output:S});continue}if(ce&&(ce.type==="bracket"||ce.type==="paren"||ce.type==="brace")||d.parens>0){Te({type:"plus",value:X});continue}Te({type:"plus",value:S});continue}if(X==="@"){if(r.noextglob!==!0&&ke()==="("&&ke(2)!=="?"){Te({type:"at",extglob:!0,value:X,output:""});continue}Te({type:"text",value:X});continue}if(X!=="*"){(X==="$"||X==="^")&&(X=`\\${X}`);let D=DKe.exec(_());D&&(X+=D[0],d.index+=D[0].length),Te({type:"text",value:X});continue}if(ce&&(ce.type==="globstar"||ce.star===!0)){ce.type="star",ce.star=!0,ce.value+=X,ce.output=ye,d.backtrack=!0,d.globstar=!0,tt(X);continue}let P=_();if(r.noextglob!==!0&&/^\([^?]/.test(P)){ct("star",X);continue}if(ce.type==="star"){if(r.noglobstar===!0){tt(X);continue}let D=ce.prev,y=D.prev,F=D.type==="slash"||D.type==="bos",z=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!F||P[0]&&P[0]!=="/")){Te({type:"star",value:X,output:""});continue}let Z=d.braces>0&&(D.type==="comma"||D.type==="brace"),ee=ve.length&&(D.type==="pipe"||D.type==="paren");if(!F&&D.type!=="paren"&&!Z&&!ee){Te({type:"star",value:X,output:""});continue}for(;P.slice(0,3)==="/**";){let se=e[d.index+4];if(se&&se!=="/")break;P=P.slice(3),tt("/**",3)}if(D.type==="bos"&&be()){ce.type="globstar",ce.value+=X,ce.output=ge(r),d.output=ce.output,d.globstar=!0,tt(X);continue}if(D.type==="slash"&&D.prev.type!=="bos"&&!z&&be()){d.output=d.output.slice(0,-(D.output+ce.output).length),D.output=`(?:${D.output}`,ce.type="globstar",ce.output=ge(r)+(r.strictSlashes?")":"|$)"),ce.value+=X,d.globstar=!0,d.output+=D.output+ce.output,tt(X);continue}if(D.type==="slash"&&D.prev.type!=="bos"&&P[0]==="/"){let se=P[1]!==void 0?"|$":"";d.output=d.output.slice(0,-(D.output+ce.output).length),D.output=`(?:${D.output}`,ce.type="globstar",ce.output=`${ge(r)}${x}|${x}${se})`,ce.value+=X,d.output+=D.output+ce.output,d.globstar=!0,tt(X+it()),Te({type:"slash",value:"/",output:""});continue}if(D.type==="bos"&&P[0]==="/"){ce.type="globstar",ce.value+=X,ce.output=`(?:^|${x}|${ge(r)}${x})`,d.output=ce.output,d.globstar=!0,tt(X+it()),Te({type:"slash",value:"/",output:""});continue}d.output=d.output.slice(0,-ce.output.length),ce.type="globstar",ce.output=ge(r),ce.value+=X,d.output+=ce.output,d.globstar=!0,tt(X);continue}let w={type:"star",value:X,output:ye};if(r.bash===!0){w.output=".*?",(ce.type==="bos"||ce.type==="slash")&&(w.output=pe+w.output),Te(w);continue}if(ce&&(ce.type==="bracket"||ce.type==="paren")&&r.regex===!0){w.output=X,Te(w);continue}(d.index===d.start||ce.type==="slash"||ce.type==="dot")&&(ce.type==="dot"?(d.output+=U,ce.output+=U):r.dot===!0?(d.output+=K,ce.output+=K):(d.output+=pe,ce.output+=pe),ke()!=="*"&&(d.output+=I,ce.output+=I)),Te(w)}for(;d.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(UE("closing","]"));d.output=zl.escapeLast(d.output,"["),je("brackets")}for(;d.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(UE("closing",")"));d.output=zl.escapeLast(d.output,"("),je("parens")}for(;d.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(UE("closing","}"));d.output=zl.escapeLast(d.output,"{"),je("braces")}if(r.strictSlashes!==!0&&(ce.type==="star"||ce.type==="bracket")&&Te({type:"maybe_slash",value:"",output:`${x}?`}),d.backtrack===!0){d.output="";for(let P of d.tokens)d.output+=P.output!=null?P.output:P.value,P.suffix&&(d.output+=P.suffix)}return d};u4.fastpaths=(e,t)=>{let r={...t},s=typeof r.maxLength=="number"?Math.min(Ek,r.maxLength):Ek,a=e.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);e=xoe[e]||e;let n=zl.isWindows(t),{DOT_LITERAL:c,SLASH_LITERAL:f,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:C,NO_DOTS_SLASH:S,STAR:x,START_ANCHOR:I}=yk.globChars(n),R=r.dot?C:E,N=r.dot?S:E,U=r.capture?"":"?:",K={negated:!1,prefix:""},$=r.bash===!0?".*?":x;r.capture&&($=`(${$})`);let ie=pe=>pe.noglobstar===!0?$:`(${U}(?:(?!${I}${pe.dot?h:c}).)*?)`,fe=pe=>{switch(pe){case"*":return`${R}${p}${$}`;case".*":return`${c}${p}${$}`;case"*.*":return`${R}${$}${c}${p}${$}`;case"*/*":return`${R}${$}${f}${p}${N}${$}`;case"**":return R+ie(r);case"**/*":return`(?:${R}${ie(r)}${f})?${N}${p}${$}`;case"**/*.*":return`(?:${R}${ie(r)}${f})?${N}${$}${c}${p}${$}`;case"**/.*":return`(?:${R}${ie(r)}${f})?${c}${p}${$}`;default:{let De=/^(.*?)\.(\w+)$/.exec(pe);if(!De)return;let ye=fe(De[1]);return ye?ye+c+De[2]:void 0}}},le=zl.removePrefix(e,K),ge=fe(le);return ge&&r.strictSlashes!==!0&&(ge+=`${f}?`),ge};koe.exports=u4});var Roe=G((pTt,Toe)=>{"use strict";var kKe=Ce("path"),QKe=Poe(),f4=Qoe(),A4=mB(),TKe=gB(),RKe=e=>e&&typeof e=="object"&&!Array.isArray(e),Xi=(e,t,r=!1)=>{if(Array.isArray(e)){let E=e.map(S=>Xi(S,t,r));return S=>{for(let x of E){let I=x(S);if(I)return I}return!1}}let s=RKe(e)&&e.tokens&&e.input;if(e===""||typeof e!="string"&&!s)throw new TypeError("Expected pattern to be a non-empty string");let a=t||{},n=A4.isWindows(t),c=s?Xi.compileRe(e,t):Xi.makeRe(e,t,!1,!0),f=c.state;delete c.state;let p=()=>!1;if(a.ignore){let E={...t,ignore:null,onMatch:null,onResult:null};p=Xi(a.ignore,E,r)}let h=(E,C=!1)=>{let{isMatch:S,match:x,output:I}=Xi.test(E,c,t,{glob:e,posix:n}),R={glob:e,state:f,regex:c,posix:n,input:E,output:I,match:x,isMatch:S};return typeof a.onResult=="function"&&a.onResult(R),S===!1?(R.isMatch=!1,C?R:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(R),R.isMatch=!1,C?R:!1):(typeof a.onMatch=="function"&&a.onMatch(R),C?R:!0)};return r&&(h.state=f),h};Xi.test=(e,t,r,{glob:s,posix:a}={})=>{if(typeof e!="string")throw new TypeError("Expected input to be a string");if(e==="")return{isMatch:!1,output:""};let n=r||{},c=n.format||(a?A4.toPosixSlashes:null),f=e===s,p=f&&c?c(e):e;return f===!1&&(p=c?c(e):e,f=p===s),(f===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?f=Xi.matchBase(e,t,r,a):f=t.exec(p)),{isMatch:!!f,match:f,output:p}};Xi.matchBase=(e,t,r,s=A4.isWindows(r))=>(t instanceof RegExp?t:Xi.makeRe(t,r)).test(kKe.basename(e));Xi.isMatch=(e,t,r)=>Xi(t,r)(e);Xi.parse=(e,t)=>Array.isArray(e)?e.map(r=>Xi.parse(r,t)):f4(e,{...t,fastpaths:!1});Xi.scan=(e,t)=>QKe(e,t);Xi.compileRe=(e,t,r=!1,s=!1)=>{if(r===!0)return e.output;let a=t||{},n=a.contains?"":"^",c=a.contains?"":"$",f=`${n}(?:${e.output})${c}`;e&&e.negated===!0&&(f=`^(?!${f}).*$`);let p=Xi.toRegex(f,t);return s===!0&&(p.state=e),p};Xi.makeRe=(e,t={},r=!1,s=!1)=>{if(!e||typeof e!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return t.fastpaths!==!1&&(e[0]==="."||e[0]==="*")&&(a.output=f4.fastpaths(e,t)),a.output||(a=f4(e,t)),Xi.compileRe(a,t,r,s)};Xi.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(r){if(t&&t.debug===!0)throw r;return/$^/}};Xi.constants=TKe;Toe.exports=Xi});var Noe=G((hTt,Foe)=>{"use strict";Foe.exports=Roe()});var Zo=G((dTt,Uoe)=>{"use strict";var Loe=Ce("util"),Moe=doe(),Xf=Noe(),p4=mB(),Ooe=e=>e===""||e==="./",ki=(e,t,r)=>{t=[].concat(t),e=[].concat(e);let s=new Set,a=new Set,n=new Set,c=0,f=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!s.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${t.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?t.map(E=>E.replace(/\\/g,"")):t}return h};ki.match=ki;ki.matcher=(e,t)=>Xf(e,t);ki.isMatch=(e,t,r)=>Xf(t,r)(e);ki.any=ki.isMatch;ki.not=(e,t,r={})=>{t=[].concat(t).map(String);let s=new Set,a=[],n=f=>{r.onResult&&r.onResult(f),a.push(f.output)},c=new Set(ki(e,t,{...r,onResult:n}));for(let f of a)c.has(f)||s.add(f);return[...s]};ki.contains=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${Loe.inspect(e)}"`);if(Array.isArray(t))return t.some(s=>ki.contains(e,s,r));if(typeof t=="string"){if(Ooe(e)||Ooe(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return ki.isMatch(e,t,{...r,contains:!0})};ki.matchKeys=(e,t,r)=>{if(!p4.isObject(e))throw new TypeError("Expected the first argument to be an object");let s=ki(Object.keys(e),t,r),a={};for(let n of s)a[n]=e[n];return a};ki.some=(e,t,r)=>{let s=[].concat(e);for(let a of[].concat(t)){let n=Xf(String(a),r);if(s.some(c=>n(c)))return!0}return!1};ki.every=(e,t,r)=>{let s=[].concat(e);for(let a of[].concat(t)){let n=Xf(String(a),r);if(!s.every(c=>n(c)))return!1}return!0};ki.all=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${Loe.inspect(e)}"`);return[].concat(t).every(s=>Xf(s,r)(e))};ki.capture=(e,t,r)=>{let s=p4.isWindows(r),n=Xf.makeRe(String(e),{...r,capture:!0}).exec(s?p4.toPosixSlashes(t):t);if(n)return n.slice(1).map(c=>c===void 0?"":c)};ki.makeRe=(...e)=>Xf.makeRe(...e);ki.scan=(...e)=>Xf.scan(...e);ki.parse=(e,t)=>{let r=[];for(let s of[].concat(e||[]))for(let a of Moe(String(s),t))r.push(Xf.parse(a,t));return r};ki.braces=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return t&&t.nobrace===!0||!/\{.*\}/.test(e)?[e]:Moe(e,t)};ki.braceExpand=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return ki.braces(e,{...t,expand:!0})};Uoe.exports=ki});var Hoe=G((gTt,_oe)=>{"use strict";_oe.exports=({onlyFirst:e=!1}={})=>{let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}});var Ik=G((mTt,joe)=>{"use strict";var FKe=Hoe();joe.exports=e=>typeof e=="string"?e.replace(FKe(),""):e});function Goe(e){return Number.isSafeInteger(e)&&e>=0}var qoe=Ze(()=>{});function Yoe(e){return e!=null&&typeof e!="function"&&Goe(e.length)}var Woe=Ze(()=>{qoe()});function kc(e){return e==="__proto__"}var EB=Ze(()=>{});function _E(e){switch(typeof e){case"number":case"symbol":return!1;case"string":return e.includes(".")||e.includes("[")||e.includes("]")}}var Ck=Ze(()=>{});function HE(e){return typeof e=="string"||typeof e=="symbol"?e:Object.is(e?.valueOf?.(),-0)?"-0":String(e)}var wk=Ze(()=>{});function Lu(e){let t=[],r=e.length;if(r===0)return t;let s=0,a="",n="",c=!1;for(e.charCodeAt(0)===46&&(t.push(""),s++);s{});function xa(e,t,r){if(e==null)return r;switch(typeof t){case"string":{if(kc(t))return r;let s=e[t];return s===void 0?_E(t)?xa(e,Lu(t),r):r:s}case"number":case"symbol":{typeof t=="number"&&(t=HE(t));let s=e[t];return s===void 0?r:s}default:{if(Array.isArray(t))return NKe(e,t,r);if(Object.is(t?.valueOf(),-0)?t="-0":t=String(t),kc(t))return r;let s=e[t];return s===void 0?r:s}}}function NKe(e,t,r){if(t.length===0)return r;let s=e;for(let a=0;a{EB();Ck();wk();jE()});function h4(e){return e!==null&&(typeof e=="object"||typeof e=="function")}var Voe=Ze(()=>{});function GE(e){return e==null||typeof e!="object"&&typeof e!="function"}var vk=Ze(()=>{});function Sk(e,t){return e===t||Number.isNaN(e)&&Number.isNaN(t)}var d4=Ze(()=>{});function W0(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t))}var bk=Ze(()=>{});function V0(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var Dk=Ze(()=>{});var Pk,qE,YE,WE,K0,xk,kk,Qk,Tk,Rk,Koe,Fk,VE,Joe,Nk,Ok,Lk,Mk,Uk,zoe,_k,Hk,jk,Zoe,Gk,qk,Yk=Ze(()=>{Pk="[object RegExp]",qE="[object String]",YE="[object Number]",WE="[object Boolean]",K0="[object Arguments]",xk="[object Symbol]",kk="[object Date]",Qk="[object Map]",Tk="[object Set]",Rk="[object Array]",Koe="[object Function]",Fk="[object ArrayBuffer]",VE="[object Object]",Joe="[object Error]",Nk="[object DataView]",Ok="[object Uint8Array]",Lk="[object Uint8ClampedArray]",Mk="[object Uint16Array]",Uk="[object Uint32Array]",zoe="[object BigUint64Array]",_k="[object Int8Array]",Hk="[object Int16Array]",jk="[object Int32Array]",Zoe="[object BigInt64Array]",Gk="[object Float32Array]",qk="[object Float64Array]"});function KE(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}var Wk=Ze(()=>{});function Xoe(e,t){return Ad(e,void 0,e,new Map,t)}function Ad(e,t,r,s=new Map,a=void 0){let n=a?.(e,t,r,s);if(n!=null)return n;if(GE(e))return e;if(s.has(e))return s.get(e);if(Array.isArray(e)){let c=new Array(e.length);s.set(e,c);for(let f=0;f{bk();Dk();Yk();vk();Wk()});function $oe(e){return Ad(e,void 0,e,new Map,void 0)}var eae=Ze(()=>{g4()});function tae(e,t){return Xoe(e,(r,s,a,n)=>{let c=t?.(r,s,a,n);if(c!=null)return c;if(typeof e=="object")switch(Object.prototype.toString.call(e)){case YE:case qE:case WE:{let f=new e.constructor(e?.valueOf());return fd(f,e),f}case K0:{let f={};return fd(f,e),f.length=e.length,f[Symbol.iterator]=e[Symbol.iterator],f}default:return}})}var rae=Ze(()=>{g4();Yk()});function pd(e){return tae(e)}var m4=Ze(()=>{rae()});function Vk(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e{LKe=/^(?:0|[1-9]\d*)$/});function IB(e){return e!==null&&typeof e=="object"&&V0(e)==="[object Arguments]"}var E4=Ze(()=>{Dk()});function CB(e,t){let r;if(Array.isArray(t)?r=t:typeof t=="string"&&_E(t)&&e?.[t]==null?r=Lu(t):r=[t],r.length===0)return!1;let s=e;for(let a=0;a{Ck();y4();E4();jE()});function C4(e){return typeof e=="object"&&e!==null}var nae=Ze(()=>{});function iae(e){return typeof e=="symbol"||e instanceof Symbol}var sae=Ze(()=>{});function oae(e,t){return Array.isArray(e)?!1:typeof e=="number"||typeof e=="boolean"||e==null||iae(e)?!0:typeof e=="string"&&(UKe.test(e)||!MKe.test(e))||t!=null&&Object.hasOwn(t,e)}var MKe,UKe,aae=Ze(()=>{sae();MKe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,UKe=/^\w*$/});function hd(e,t){if(e==null)return!0;switch(typeof t){case"symbol":case"number":case"object":{if(Array.isArray(t))return lae(e,t);if(typeof t=="number"?t=HE(t):typeof t=="object"&&(Object.is(t?.valueOf(),-0)?t="-0":t=String(t)),kc(t))return!1;if(e?.[t]===void 0)return!0;try{return delete e[t],!0}catch{return!1}}case"string":{if(e?.[t]===void 0&&_E(t))return lae(e,Lu(t));if(kc(t))return!1;try{return delete e[t],!0}catch{return!1}}}}function lae(e,t){let r=xa(e,t.slice(0,-1),e),s=t[t.length-1];if(r?.[s]===void 0)return!0;if(kc(s))return!1;try{return delete r[s],!0}catch{return!1}}var w4=Ze(()=>{Bk();EB();Ck();wk();jE()});function cae(e){return e==null}var uae=Ze(()=>{});var fae,Aae=Ze(()=>{d4();fae=(e,t,r)=>{let s=e[t];(!(Object.hasOwn(e,t)&&Sk(s,r))||r===void 0&&!(t in e))&&(e[t]=r)}});function pae(e,t,r,s){if(e==null&&!h4(e))return e;let a=oae(t,e)?[t]:Array.isArray(t)?t:typeof t=="string"?Lu(t):[t],n=e;for(let c=0;c{EB();Aae();y4();aae();wk();Voe();jE()});function J0(e,t,r){return pae(e,t,()=>r,()=>{})}var B4=Ze(()=>{hae()});function dae(e,t=0,r={}){typeof r!="object"&&(r={});let s=null,a=null,n=null,c=0,f=null,p,{leading:h=!1,trailing:E=!0,maxWait:C}=r,S="maxWait"in r,x=S?Math.max(Number(C)||0,t):0,I=fe=>(s!==null&&(p=e.apply(a,s)),s=a=null,c=fe,p),R=fe=>(c=fe,f=setTimeout($,t),h&&s!==null?I(fe):p),N=fe=>(f=null,E&&s!==null?I(fe):p),U=fe=>{if(n===null)return!0;let le=fe-n,ge=le>=t||le<0,pe=S&&fe-c>=x;return ge||pe},K=fe=>{let le=n===null?0:fe-n,ge=t-le,pe=x-(fe-c);return S?Math.min(ge,pe):ge},$=()=>{let fe=Date.now();if(U(fe))return N(fe);f=setTimeout($,K(fe))},ie=function(...fe){let le=Date.now(),ge=U(le);if(s=fe,a=this,n=le,ge){if(f===null)return R(le);if(S)return clearTimeout(f),f=setTimeout($,t),I(le)}return f===null&&(f=setTimeout($,t)),p};return ie.cancel=()=>{f!==null&&clearTimeout(f),c=0,n=s=a=f=null},ie.flush=()=>f===null?p:N(Date.now()),ie}var gae=Ze(()=>{});function v4(e,t=0,r={}){let{leading:s=!0,trailing:a=!0}=r;return dae(e,t,{leading:s,maxWait:t,trailing:a})}var mae=Ze(()=>{gae()});function S4(e){if(e==null)return"";if(typeof e=="string")return e;if(Array.isArray(e))return e.map(S4).join(",");let t=String(e);return t==="0"&&Object.is(Number(e),-0)?"-0":t}var yae=Ze(()=>{});function b4(e){if(!e||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype||Object.getPrototypeOf(t)===null?Object.prototype.toString.call(e)==="[object Object]":!1}var Eae=Ze(()=>{});function Iae(e,t,r){return wB(e,t,void 0,void 0,void 0,void 0,r)}function wB(e,t,r,s,a,n,c){let f=c(e,t,r,s,a,n);if(f!==void 0)return f;if(typeof e==typeof t)switch(typeof e){case"bigint":case"string":case"boolean":case"symbol":case"undefined":return e===t;case"number":return e===t||Object.is(e,t);case"function":return e===t;case"object":return BB(e,t,n,c)}return BB(e,t,n,c)}function BB(e,t,r,s){if(Object.is(e,t))return!0;let a=V0(e),n=V0(t);if(a===K0&&(a=VE),n===K0&&(n=VE),a!==n)return!1;switch(a){case qE:return e.toString()===t.toString();case YE:{let p=e.valueOf(),h=t.valueOf();return Sk(p,h)}case WE:case kk:case xk:return Object.is(e.valueOf(),t.valueOf());case Pk:return e.source===t.source&&e.flags===t.flags;case Koe:return e===t}r=r??new Map;let c=r.get(e),f=r.get(t);if(c!=null&&f!=null)return c===t;r.set(e,t),r.set(t,e);try{switch(a){case Qk:{if(e.size!==t.size)return!1;for(let[p,h]of e.entries())if(!t.has(p)||!wB(h,t.get(p),p,e,t,r,s))return!1;return!0}case Tk:{if(e.size!==t.size)return!1;let p=Array.from(e.values()),h=Array.from(t.values());for(let E=0;EwB(C,x,void 0,e,t,r,s));if(S===-1)return!1;h.splice(S,1)}return!0}case Rk:case Ok:case Lk:case Mk:case Uk:case zoe:case _k:case Hk:case jk:case Zoe:case Gk:case qk:{if(typeof Buffer<"u"&&Buffer.isBuffer(e)!==Buffer.isBuffer(t)||e.length!==t.length)return!1;for(let p=0;p{Eae();bk();Dk();Yk();d4()});function wae(){}var Bae=Ze(()=>{});function D4(e,t){return Iae(e,t,wae)}var vae=Ze(()=>{Cae();Bae()});function Sae(e){return KE(e)}var bae=Ze(()=>{Wk()});function Dae(e){if(typeof e!="object"||e==null)return!1;if(Object.getPrototypeOf(e)===null)return!0;if(Object.prototype.toString.call(e)!=="[object Object]"){let r=e[Symbol.toStringTag];return r==null||!Object.getOwnPropertyDescriptor(e,Symbol.toStringTag)?.writable?!1:e.toString()===`[object ${r}]`}let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}var Pae=Ze(()=>{});function xae(e){if(GE(e))return e;if(Array.isArray(e)||KE(e)||e instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&e instanceof SharedArrayBuffer)return e.slice(0);let t=Object.getPrototypeOf(e),r=t.constructor;if(e instanceof Date||e instanceof Map||e instanceof Set)return new r(e);if(e instanceof RegExp){let s=new r(e);return s.lastIndex=e.lastIndex,s}if(e instanceof DataView)return new r(e.buffer.slice(0));if(e instanceof Error){let s=new r(e.message);return s.stack=e.stack,s.name=e.name,s.cause=e.cause,s}if(typeof File<"u"&&e instanceof File)return new r([e],e.name,{type:e.type,lastModified:e.lastModified});if(typeof e=="object"){let s=Object.create(t);return Object.assign(s,e)}return e}var kae=Ze(()=>{vk();Wk()});function P4(e,...t){let r=t.slice(0,-1),s=t[t.length-1],a=e;for(let n=0;n{m4();EB();kae();vk();bk();E4();nae();Pae();bae()});function x4(e,...t){if(e==null)return{};let r=$oe(e);for(let s=0;s{w4();eae()});function z0(e,...t){if(cae(e))return{};let r={};for(let s=0;s{Bk();I4();B4();Woe();uae()});function Fae(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}var Nae=Ze(()=>{});function vB(e){return Fae(S4(e))}var Oae=Ze(()=>{Nae();yae()});var Zl=Ze(()=>{mae();vae();m4();Bk();I4();Qae();Tae();Rae();B4();w4();Oae();jE()});var qe={};Vt(qe,{AsyncActions:()=>T4,BufferStream:()=>Q4,CachingStrategy:()=>Wae,DefaultStream:()=>R4,allSettledSafe:()=>Mu,assertNever:()=>O4,bufferStream:()=>zE,buildIgnorePattern:()=>WKe,convertMapsToIndexableObjects:()=>zk,dynamicRequire:()=>Tp,escapeRegExp:()=>HKe,getArrayWithDefault:()=>bB,getFactoryWithDefault:()=>$l,getMapWithDefault:()=>L4,getSetWithDefault:()=>Qp,groupBy:()=>JKe,isIndexableObject:()=>k4,isPathLike:()=>VKe,isTaggedYarnVersion:()=>_Ke,makeDeferred:()=>Gae,mapAndFilter:()=>Xl,mapAndFind:()=>dd,mergeIntoTarget:()=>Kae,overrideType:()=>jKe,parseBoolean:()=>DB,parseDuration:()=>Xk,parseInt:()=>ZE,parseOptionalBoolean:()=>Vae,plural:()=>Jk,prettifyAsyncErrors:()=>JE,prettifySyncErrors:()=>M4,releaseAfterUseAsync:()=>qKe,replaceEnvVariables:()=>Zk,sortMap:()=>Ks,toMerged:()=>KKe,tryParseOptionalBoolean:()=>U4,validateEnum:()=>GKe});function _Ke(e){return!!(_ae.default.valid(e)&&e.match(/^[^-]+(-rc\.[0-9]+)?$/))}function Jk(e,{one:t,more:r,zero:s=r}){return e===0?s:e===1?t:r}function HKe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function jKe(e){}function O4(e){throw new Error(`Assertion failed: Unexpected object '${e}'`)}function GKe(e,t){let r=Object.values(e);if(!r.includes(t))throw new ot(`Invalid value for enumeration: ${JSON.stringify(t)} (expected one of ${r.map(s=>JSON.stringify(s)).join(", ")})`);return t}function Xl(e,t){let r=[];for(let s of e){let a=t(s);a!==Hae&&r.push(a)}return r}function dd(e,t){for(let r of e){let s=t(r);if(s!==jae)return s}}function k4(e){return typeof e=="object"&&e!==null}async function Mu(e){let t=await Promise.allSettled(e),r=[];for(let s of t){if(s.status==="rejected")throw s.reason;r.push(s.value)}return r}function zk(e){if(e instanceof Map&&(e=Object.fromEntries(e)),k4(e))for(let t of Object.keys(e)){let r=e[t];k4(r)&&(e[t]=zk(r))}return e}function $l(e,t,r){let s=e.get(t);return typeof s>"u"&&e.set(t,s=r()),s}function bB(e,t){let r=e.get(t);return typeof r>"u"&&e.set(t,r=[]),r}function Qp(e,t){let r=e.get(t);return typeof r>"u"&&e.set(t,r=new Set),r}function L4(e,t){let r=e.get(t);return typeof r>"u"&&e.set(t,r=new Map),r}async function qKe(e,t){if(t==null)return await e();try{return await e()}finally{await t()}}async function JE(e,t){try{return await e()}catch(r){throw r.message=t(r.message),r}}function M4(e,t){try{return e()}catch(r){throw r.message=t(r.message),r}}async function zE(e){return await new Promise((t,r)=>{let s=[];e.on("error",a=>{r(a)}),e.on("data",a=>{s.push(a)}),e.on("end",()=>{t(Buffer.concat(s))})})}function Gae(){let e,t;return{promise:new Promise((s,a)=>{e=s,t=a}),resolve:e,reject:t}}function qae(e){return SB(Ae.fromPortablePath(e))}function Yae(path){let physicalPath=Ae.fromPortablePath(path),currentCacheEntry=SB.cache[physicalPath];delete SB.cache[physicalPath];let result;try{result=qae(physicalPath);let freshCacheEntry=SB.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{SB.cache[physicalPath]=currentCacheEntry}return result}function YKe(e){let t=Lae.get(e),r=ae.statSync(e);if(t?.mtime===r.mtimeMs)return t.instance;let s=Yae(e);return Lae.set(e,{mtime:r.mtimeMs,instance:s}),s}function Tp(e,{cachingStrategy:t=2}={}){switch(t){case 0:return Yae(e);case 1:return YKe(e);case 2:return qae(e);default:throw new Error("Unsupported caching strategy")}}function Ks(e,t){let r=Array.from(e);Array.isArray(t)||(t=[t]);let s=[];for(let n of t)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function WKe(e){return e.length===0?null:e.map(t=>`(${Mae.default.makeRe(t,{windows:!1,dot:!0}).source})`).join("|")}function Zk(e,{env:t}){let r="",s=0,a=0,n=e.matchAll(/\\(?[\\$}])|\$\{(?[a-zA-Z]\w*)(?:-|-|(?=\}))|(?\$\{)|\}/g),c=()=>{let f=a;for(let{0:p,index:h,groups:{variable:E}={}}of n)if(E)a++;else if(p==="}"&&--a0)throw new ot(`Incomplete variable substitution in input: ${e}`);return r+e.slice(s)}function DB(e){switch(e){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 "${e}" as a boolean`)}}function Vae(e){return typeof e>"u"?e:DB(e)}function U4(e){try{return Vae(e)}catch{return null}}function VKe(e){return!!(Ae.isAbsolute(e)||e.match(/^(\.{1,2}|~)\//))}function Kae(e,...t){let r=c=>({value:c}),s=r(e),a=t.map(c=>r(c)),{value:n}=P4(s,...a,(c,f)=>{if(Array.isArray(c)&&Array.isArray(f)){for(let p of f)c.find(h=>D4(h,p))||c.push(p);return c}});return n}function KKe(...e){return Kae({},...e)}function JKe(e,t){let r=Object.create(null);for(let s of e){let a=s[t];r[a]??=[],r[a].push(s)}return r}function ZE(e){return typeof e=="string"?Number.parseInt(e,10):e}function Xk(e,t){let r=zKe.exec(e)?.groups;if(!r)throw new Error(`Couldn't parse "${e}" as a duration`);if(r.unit===void 0)return parseFloat(r.num);let s=F4[r.unit];if(!s)throw new Error(`Invalid duration unit "${r.unit}"`);return parseFloat(r.num)*s/F4[t]}var Mae,Uae,_ae,N4,Hae,jae,Q4,T4,R4,SB,Lae,Wae,F4,zKe,Qc=Ze(()=>{bt();jt();Zl();Mae=et(Zo()),Uae=et(M0()),_ae=et(hi()),N4=Ce("stream");Hae=Symbol();Xl.skip=Hae;jae=Symbol();dd.skip=jae;Q4=class extends N4.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,s,a){if(s!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};T4=class{constructor(t){this.deferred=new Map;this.promises=new Map;this.limit=(0,Uae.default)(t)}set(t,r){let s=this.deferred.get(t);typeof s>"u"&&this.deferred.set(t,s=Gae());let a=this.limit(()=>r());return this.promises.set(t,a),a.then(()=>{this.promises.get(t)===a&&s.resolve()},n=>{this.promises.get(t)===a&&s.reject(n)}),s.promise}reduce(t,r){let s=this.promises.get(t)??Promise.resolve();this.set(t,()=>r(s))}async wait(){await Promise.all(this.promises.values())}},R4=class extends N4.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,s,a){if(s!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},SB=eval("require");Lae=new Map;Wae=(s=>(s[s.NoCache=0]="NoCache",s[s.FsTime=1]="FsTime",s[s.Node=2]="Node",s))(Wae||{});F4={ms:1,s:1e3,m:60*1e3,h:60*60*1e3,d:24*60*60*1e3,w:7*24*60*60*1e3},zKe=new RegExp(`^(?\\d*\\.?\\d+)(?${Object.keys(F4).join("|")})?$`)});var XE,_4,H4,Jae=Ze(()=>{XE=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))(XE||{}),_4=(s=>(s.Dependency="Dependency",s.PeerDependency="PeerDependency",s.PeerDependencyMeta="PeerDependencyMeta",s))(_4||{}),H4=(s=>(s.Inactive="inactive",s.Redundant="redundant",s.Active="active",s))(H4||{})});var ue={};Vt(ue,{LogLevel:()=>iQ,Style:()=>tQ,Type:()=>dt,addLogFilterSupport:()=>kB,applyColor:()=>oi,applyHyperlink:()=>eI,applyStyle:()=>Z0,json:()=>X0,jsonOrPretty:()=>$Ke,mark:()=>W4,pretty:()=>Gt,prettyField:()=>$f,prettyList:()=>Y4,prettyTruncatedLocatorList:()=>nQ,stripAnsi:()=>$E.default,supportsColor:()=>rQ,supportsHyperlinks:()=>q4,tuple:()=>Uu});function zae(e){let t=["KiB","MiB","GiB","TiB"],r=t.length;for(;r>1&&e<1024**r;)r-=1;let s=1024**r;return`${Math.floor(e*100/s)/100} ${t[r-1]}`}function $k(e,t){if(Array.isArray(t))return t.length===0?oi(e,"[]",dt.CODE):oi(e,"[ ",dt.CODE)+t.map(r=>$k(e,r)).join(", ")+oi(e," ]",dt.CODE);if(typeof t=="string")return oi(e,JSON.stringify(t),dt.STRING);if(typeof t=="number")return oi(e,JSON.stringify(t),dt.NUMBER);if(typeof t=="boolean")return oi(e,JSON.stringify(t),dt.BOOLEAN);if(t===null)return oi(e,"null",dt.NULL);if(typeof t=="object"&&Object.getPrototypeOf(t)===Object.prototype){let r=Object.entries(t);return r.length===0?oi(e,"{}",dt.CODE):oi(e,"{ ",dt.CODE)+r.map(([s,a])=>`${$k(e,s)}: ${$k(e,a)}`).join(", ")+oi(e," }",dt.CODE)}if(typeof t>"u")return oi(e,"undefined",dt.NULL);throw new Error("Assertion failed: The value doesn't seem to be a valid JSON object")}function Uu(e,t){return[t,e]}function Z0(e,t,r){return e.get("enableColors")&&r&2&&(t=xB.default.bold(t)),t}function oi(e,t,r){if(!e.get("enableColors"))return t;let s=ZKe.get(r);if(s===null)return t;let a=typeof s>"u"?r:G4.level>=3?s[0]:s[1],n=typeof a=="number"?j4.ansi256(a):a.startsWith("#")?j4.hex(a):j4[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(t)}function eI(e,t,r){return e.get("enableHyperlinks")?XKe?`\x1B]8;;${r}\x1B\\${t}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${t}\x1B]8;;\x07`:t}function Gt(e,t,r){if(t===null)return oi(e,"null",dt.NULL);if(Object.hasOwn(eQ,r))return eQ[r].pretty(e,t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return oi(e,t,r)}function Y4(e,t,r,{separator:s=", "}={}){return[...t].map(a=>Gt(e,a,r)).join(s)}function X0(e,t){if(e===null)return null;if(Object.hasOwn(eQ,t))return eQ[t].json(e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return e}function $Ke(e,t,[r,s]){return e?X0(r,s):Gt(t,r,s)}function W4(e){return{Check:oi(e,"\u2713","green"),Cross:oi(e,"\u2718","red"),Question:oi(e,"?","cyan")}}function $f(e,{label:t,value:[r,s]}){return`${Gt(e,t,dt.CODE)}: ${Gt(e,r,s)}`}function nQ(e,t,r){let s=[],a=[...t],n=r;for(;a.length>0;){let h=a[0],E=`${Vr(e,h)}, `,C=V4(h).length+2;if(s.length>0&&nh).join("").slice(0,-2);let c="X".repeat(a.length.toString().length),f=`and ${c} more.`,p=a.length;for(;s.length>1&&nh).join(""),f.replace(c,Gt(e,p,dt.NUMBER))].join("")}function kB(e,{configuration:t}){let r=t.get("logFilters"),s=new Map,a=new Map,n=[];for(let C of r){let S=C.get("level");if(typeof S>"u")continue;let x=C.get("code");typeof x<"u"&&s.set(x,S);let I=C.get("text");typeof I<"u"&&a.set(I,S);let R=C.get("pattern");typeof R<"u"&&n.push([Zae.default.matcher(R,{contains:!0}),S])}n.reverse();let c=(C,S,x)=>{if(C===null||C===0)return x;let I=a.size>0||n.length>0?(0,$E.default)(S):S;if(a.size>0){let R=a.get(I);if(typeof R<"u")return R??x}if(n.length>0){for(let[R,N]of n)if(R(I))return N??x}if(s.size>0){let R=s.get(zf(C));if(typeof R<"u")return R??x}return x},f=e.reportInfo,p=e.reportWarning,h=e.reportError,E=function(C,S,x,I){switch(c(S,x,I)){case"info":f.call(C,S,x);break;case"warning":p.call(C,S??0,x);break;case"error":h.call(C,S??0,x);break}};e.reportInfo=function(...C){return E(this,...C,"info")},e.reportWarning=function(...C){return E(this,...C,"warning")},e.reportError=function(...C){return E(this,...C,"error")}}var xB,PB,Zae,$E,dt,tQ,G4,rQ,q4,j4,ZKe,Xo,eQ,XKe,iQ,Tc=Ze(()=>{bt();xB=et(LE()),PB=et(N0());jt();Zae=et(Zo()),$E=et(Ik());Kx();$o();dt={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",STRING:"STRING",BOOLEAN:"BOOLEAN",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},tQ=(t=>(t[t.BOLD=2]="BOLD",t))(tQ||{}),G4=PB.default.GITHUB_ACTIONS?{level:2}:xB.default.supportsColor?{level:xB.default.supportsColor.level}:{level:0},rQ=G4.level!==0,q4=rQ&&!PB.default.GITHUB_ACTIONS&&!PB.default.CIRCLE&&!PB.default.GITLAB,j4=new xB.default.Instance(G4),ZKe=new Map([[dt.NO_HINT,null],[dt.NULL,["#a853b5",129]],[dt.SCOPE,["#d75f00",166]],[dt.NAME,["#d7875f",173]],[dt.RANGE,["#00afaf",37]],[dt.REFERENCE,["#87afff",111]],[dt.NUMBER,["#ffd700",220]],[dt.STRING,["#b4bd68",32]],[dt.BOOLEAN,["#faa023",209]],[dt.PATH,["#d75fd7",170]],[dt.URL,["#d75fd7",170]],[dt.ADDED,["#5faf00",70]],[dt.REMOVED,["#ff3131",160]],[dt.CODE,["#87afff",111]],[dt.SIZE,["#ffd700",220]]]),Xo=e=>e;eQ={[dt.ID]:Xo({pretty:(e,t)=>typeof t=="number"?oi(e,`${t}`,dt.NUMBER):oi(e,t,dt.CODE),json:e=>e}),[dt.INSPECT]:Xo({pretty:(e,t)=>$k(e,t),json:e=>e}),[dt.NUMBER]:Xo({pretty:(e,t)=>oi(e,`${t}`,dt.NUMBER),json:e=>e}),[dt.IDENT]:Xo({pretty:(e,t)=>$i(e,t),json:e=>fn(e)}),[dt.LOCATOR]:Xo({pretty:(e,t)=>Vr(e,t),json:e=>ml(e)}),[dt.DESCRIPTOR]:Xo({pretty:(e,t)=>ai(e,t),json:e=>gl(e)}),[dt.RESOLUTION]:Xo({pretty:(e,{descriptor:t,locator:r})=>QB(e,t,r),json:({descriptor:e,locator:t})=>({descriptor:gl(e),locator:t!==null?ml(t):null})}),[dt.DEPENDENT]:Xo({pretty:(e,{locator:t,descriptor:r})=>K4(e,t,r),json:({locator:e,descriptor:t})=>({locator:ml(e),descriptor:gl(t)})}),[dt.PACKAGE_EXTENSION]:Xo({pretty:(e,t)=>{switch(t.type){case"Dependency":return`${$i(e,t.parentDescriptor)} \u27A4 ${oi(e,"dependencies",dt.CODE)} \u27A4 ${$i(e,t.descriptor)}`;case"PeerDependency":return`${$i(e,t.parentDescriptor)} \u27A4 ${oi(e,"peerDependencies",dt.CODE)} \u27A4 ${$i(e,t.descriptor)}`;case"PeerDependencyMeta":return`${$i(e,t.parentDescriptor)} \u27A4 ${oi(e,"peerDependenciesMeta",dt.CODE)} \u27A4 ${$i(e,ka(t.selector))} \u27A4 ${oi(e,t.key,dt.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}},json:e=>{switch(e.type){case"Dependency":return`${fn(e.parentDescriptor)} > ${fn(e.descriptor)}`;case"PeerDependency":return`${fn(e.parentDescriptor)} >> ${fn(e.descriptor)}`;case"PeerDependencyMeta":return`${fn(e.parentDescriptor)} >> ${e.selector} / ${e.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}}}),[dt.SETTING]:Xo({pretty:(e,t)=>(e.get(t),eI(e,oi(e,t,dt.CODE),`https://yarnpkg.com/configuration/yarnrc#${t}`)),json:e=>e}),[dt.DURATION]:Xo({pretty:(e,t)=>{if(t>1e3*60){let r=Math.floor(t/1e3/60),s=Math.ceil((t-r*60*1e3)/1e3);return s===0?`${r}m`:`${r}m ${s}s`}else{let r=Math.floor(t/1e3),s=t-r*1e3;return s===0?`${r}s`:`${r}s ${s}ms`}},json:e=>e}),[dt.SIZE]:Xo({pretty:(e,t)=>oi(e,zae(t),dt.NUMBER),json:e=>e}),[dt.SIZE_DIFF]:Xo({pretty:(e,t)=>{let r=t>=0?"+":"-",s=r==="+"?dt.REMOVED:dt.ADDED;return oi(e,`${r} ${zae(Math.max(Math.abs(t),1))}`,s)},json:e=>e}),[dt.PATH]:Xo({pretty:(e,t)=>oi(e,Ae.fromPortablePath(t),dt.PATH),json:e=>Ae.fromPortablePath(e)}),[dt.MARKDOWN]:Xo({pretty:(e,{text:t,format:r,paragraphs:s})=>Ko(t,{format:r,paragraphs:s}),json:({text:e})=>e}),[dt.MARKDOWN_INLINE]:Xo({pretty:(e,t)=>(t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(r,s,a)=>Gt(e,s+a+s,dt.CODE)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,s,a)=>Z0(e,a,2)),t),json:e=>e})};XKe=!!process.env.KONSOLE_VERSION;iQ=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(iQ||{})});var Xae=G(tI=>{"use strict";Object.defineProperty(tI,"__esModule",{value:!0});tI.splitWhen=tI.flatten=void 0;function eJe(e){return e.reduce((t,r)=>[].concat(t,r),[])}tI.flatten=eJe;function tJe(e,t){let r=[[]],s=0;for(let a of e)t(a)?(s++,r[s]=[]):r[s].push(a);return r}tI.splitWhen=tJe});var $ae=G(sQ=>{"use strict";Object.defineProperty(sQ,"__esModule",{value:!0});sQ.isEnoentCodeError=void 0;function rJe(e){return e.code==="ENOENT"}sQ.isEnoentCodeError=rJe});var ele=G(oQ=>{"use strict";Object.defineProperty(oQ,"__esModule",{value:!0});oQ.createDirentFromStats=void 0;var J4=class{constructor(t,r){this.name=t,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 nJe(e,t){return new J4(e,t)}oQ.createDirentFromStats=nJe});var ile=G(fs=>{"use strict";Object.defineProperty(fs,"__esModule",{value:!0});fs.convertPosixPathToPattern=fs.convertWindowsPathToPattern=fs.convertPathToPattern=fs.escapePosixPath=fs.escapeWindowsPath=fs.escape=fs.removeLeadingDotSegment=fs.makeAbsolute=fs.unixify=void 0;var iJe=Ce("os"),sJe=Ce("path"),tle=iJe.platform()==="win32",oJe=2,aJe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g,lJe=/(\\?)([()[\]{}]|^!|[!+@](?=\())/g,cJe=/^\\\\([.?])/,uJe=/\\(?![!()+@[\]{}])/g;function fJe(e){return e.replace(/\\/g,"/")}fs.unixify=fJe;function AJe(e,t){return sJe.resolve(e,t)}fs.makeAbsolute=AJe;function pJe(e){if(e.charAt(0)==="."){let t=e.charAt(1);if(t==="/"||t==="\\")return e.slice(oJe)}return e}fs.removeLeadingDotSegment=pJe;fs.escape=tle?z4:Z4;function z4(e){return e.replace(lJe,"\\$2")}fs.escapeWindowsPath=z4;function Z4(e){return e.replace(aJe,"\\$2")}fs.escapePosixPath=Z4;fs.convertPathToPattern=tle?rle:nle;function rle(e){return z4(e).replace(cJe,"//$1").replace(uJe,"/")}fs.convertWindowsPathToPattern=rle;function nle(e){return Z4(e)}fs.convertPosixPathToPattern=nle});var ole=G((YFt,sle)=>{sle.exports=function(t){if(typeof t!="string"||t==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(t);){if(r[2])return!0;t=t.slice(r.index+r[0].length)}return!1}});var cle=G((WFt,lle)=>{var hJe=ole(),ale={"{":"}","(":")","[":"]"},dJe=function(e){if(e[0]==="!")return!0;for(var t=0,r=-2,s=-2,a=-2,n=-2,c=-2;tt&&(c===-1||c>s||(c=e.indexOf("\\",t),c===-1||c>s)))||a!==-1&&e[t]==="{"&&e[t+1]!=="}"&&(a=e.indexOf("}",t),a>t&&(c=e.indexOf("\\",t),c===-1||c>a))||n!==-1&&e[t]==="("&&e[t+1]==="?"&&/[:!=]/.test(e[t+2])&&e[t+3]!==")"&&(n=e.indexOf(")",t),n>t&&(c=e.indexOf("\\",t),c===-1||c>n))||r!==-1&&e[t]==="("&&e[t+1]!=="|"&&(rr&&(c=e.indexOf("\\",r),c===-1||c>n))))return!0;if(e[t]==="\\"){var f=e[t+1];t+=2;var p=ale[f];if(p){var h=e.indexOf(p,t);h!==-1&&(t=h+1)}if(e[t]==="!")return!0}else t++}return!1},gJe=function(e){if(e[0]==="!")return!0;for(var t=0;t{"use strict";var mJe=cle(),yJe=Ce("path").posix.dirname,EJe=Ce("os").platform()==="win32",X4="/",IJe=/\\/g,CJe=/[\{\[].*[\}\]]$/,wJe=/(^|[^\\])([\{\[]|\([^\)]+$)/,BJe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;ule.exports=function(t,r){var s=Object.assign({flipBackslashes:!0},r);s.flipBackslashes&&EJe&&t.indexOf(X4)<0&&(t=t.replace(IJe,X4)),CJe.test(t)&&(t+=X4),t+="a";do t=yJe(t);while(mJe(t)||wJe.test(t));return t.replace(BJe,"$1")}});var Ele=G(Gr=>{"use strict";Object.defineProperty(Gr,"__esModule",{value:!0});Gr.removeDuplicateSlashes=Gr.matchAny=Gr.convertPatternsToRe=Gr.makeRe=Gr.getPatternParts=Gr.expandBraceExpansion=Gr.expandPatternsWithBraceExpansion=Gr.isAffectDepthOfReadingPattern=Gr.endsWithSlashGlobStar=Gr.hasGlobStar=Gr.getBaseDirectory=Gr.isPatternRelatedToParentDirectory=Gr.getPatternsOutsideCurrentDirectory=Gr.getPatternsInsideCurrentDirectory=Gr.getPositivePatterns=Gr.getNegativePatterns=Gr.isPositivePattern=Gr.isNegativePattern=Gr.convertToNegativePattern=Gr.convertToPositivePattern=Gr.isDynamicPattern=Gr.isStaticPattern=void 0;var vJe=Ce("path"),SJe=fle(),$4=Zo(),Ale="**",bJe="\\",DJe=/[*?]|^!/,PJe=/\[[^[]*]/,xJe=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,kJe=/[!*+?@]\([^(]*\)/,QJe=/,|\.\./,TJe=/(?!^)\/{2,}/g;function ple(e,t={}){return!hle(e,t)}Gr.isStaticPattern=ple;function hle(e,t={}){return e===""?!1:!!(t.caseSensitiveMatch===!1||e.includes(bJe)||DJe.test(e)||PJe.test(e)||xJe.test(e)||t.extglob!==!1&&kJe.test(e)||t.braceExpansion!==!1&&RJe(e))}Gr.isDynamicPattern=hle;function RJe(e){let t=e.indexOf("{");if(t===-1)return!1;let r=e.indexOf("}",t+1);if(r===-1)return!1;let s=e.slice(t,r);return QJe.test(s)}function FJe(e){return aQ(e)?e.slice(1):e}Gr.convertToPositivePattern=FJe;function NJe(e){return"!"+e}Gr.convertToNegativePattern=NJe;function aQ(e){return e.startsWith("!")&&e[1]!=="("}Gr.isNegativePattern=aQ;function dle(e){return!aQ(e)}Gr.isPositivePattern=dle;function OJe(e){return e.filter(aQ)}Gr.getNegativePatterns=OJe;function LJe(e){return e.filter(dle)}Gr.getPositivePatterns=LJe;function MJe(e){return e.filter(t=>!e3(t))}Gr.getPatternsInsideCurrentDirectory=MJe;function UJe(e){return e.filter(e3)}Gr.getPatternsOutsideCurrentDirectory=UJe;function e3(e){return e.startsWith("..")||e.startsWith("./..")}Gr.isPatternRelatedToParentDirectory=e3;function _Je(e){return SJe(e,{flipBackslashes:!1})}Gr.getBaseDirectory=_Je;function HJe(e){return e.includes(Ale)}Gr.hasGlobStar=HJe;function gle(e){return e.endsWith("/"+Ale)}Gr.endsWithSlashGlobStar=gle;function jJe(e){let t=vJe.basename(e);return gle(e)||ple(t)}Gr.isAffectDepthOfReadingPattern=jJe;function GJe(e){return e.reduce((t,r)=>t.concat(mle(r)),[])}Gr.expandPatternsWithBraceExpansion=GJe;function mle(e){let t=$4.braces(e,{expand:!0,nodupes:!0,keepEscaping:!0});return t.sort((r,s)=>r.length-s.length),t.filter(r=>r!=="")}Gr.expandBraceExpansion=mle;function qJe(e,t){let{parts:r}=$4.scan(e,Object.assign(Object.assign({},t),{parts:!0}));return r.length===0&&(r=[e]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}Gr.getPatternParts=qJe;function yle(e,t){return $4.makeRe(e,t)}Gr.makeRe=yle;function YJe(e,t){return e.map(r=>yle(r,t))}Gr.convertPatternsToRe=YJe;function WJe(e,t){return t.some(r=>r.test(e))}Gr.matchAny=WJe;function VJe(e){return e.replace(TJe,"/")}Gr.removeDuplicateSlashes=VJe});var Ble=G((JFt,wle)=>{"use strict";var KJe=Ce("stream"),Ile=KJe.PassThrough,JJe=Array.prototype.slice;wle.exports=zJe;function zJe(){let e=[],t=JJe.call(arguments),r=!1,s=t[t.length-1];s&&!Array.isArray(s)&&s.pipe==null?t.pop():s={};let a=s.end!==!1,n=s.pipeError===!0;s.objectMode==null&&(s.objectMode=!0),s.highWaterMark==null&&(s.highWaterMark=64*1024);let c=Ile(s);function f(){for(let E=0,C=arguments.length;E0||(r=!1,p())}function x(I){function R(){I.removeListener("merge2UnpipeEnd",R),I.removeListener("end",R),n&&I.removeListener("error",N),S()}function N(U){c.emit("error",U)}if(I._readableState.endEmitted)return S();I.on("merge2UnpipeEnd",R),I.on("end",R),n&&I.on("error",N),I.pipe(c,{end:!1}),I.resume()}for(let I=0;I{"use strict";Object.defineProperty(lQ,"__esModule",{value:!0});lQ.merge=void 0;var ZJe=Ble();function XJe(e){let t=ZJe(e);return e.forEach(r=>{r.once("error",s=>t.emit("error",s))}),t.once("close",()=>vle(e)),t.once("end",()=>vle(e)),t}lQ.merge=XJe;function vle(e){e.forEach(t=>t.emit("close"))}});var ble=G(rI=>{"use strict";Object.defineProperty(rI,"__esModule",{value:!0});rI.isEmpty=rI.isString=void 0;function $Je(e){return typeof e=="string"}rI.isString=$Je;function eze(e){return e===""}rI.isEmpty=eze});var Rp=G(ea=>{"use strict";Object.defineProperty(ea,"__esModule",{value:!0});ea.string=ea.stream=ea.pattern=ea.path=ea.fs=ea.errno=ea.array=void 0;var tze=Xae();ea.array=tze;var rze=$ae();ea.errno=rze;var nze=ele();ea.fs=nze;var ize=ile();ea.path=ize;var sze=Ele();ea.pattern=sze;var oze=Sle();ea.stream=oze;var aze=ble();ea.string=aze});var kle=G(ta=>{"use strict";Object.defineProperty(ta,"__esModule",{value:!0});ta.convertPatternGroupToTask=ta.convertPatternGroupsToTasks=ta.groupPatternsByBaseDirectory=ta.getNegativePatternsAsPositive=ta.getPositivePatterns=ta.convertPatternsToTasks=ta.generate=void 0;var _u=Rp();function lze(e,t){let r=Dle(e,t),s=Dle(t.ignore,t),a=Ple(r),n=xle(r,s),c=a.filter(E=>_u.pattern.isStaticPattern(E,t)),f=a.filter(E=>_u.pattern.isDynamicPattern(E,t)),p=t3(c,n,!1),h=t3(f,n,!0);return p.concat(h)}ta.generate=lze;function Dle(e,t){let r=e;return t.braceExpansion&&(r=_u.pattern.expandPatternsWithBraceExpansion(r)),t.baseNameMatch&&(r=r.map(s=>s.includes("/")?s:`**/${s}`)),r.map(s=>_u.pattern.removeDuplicateSlashes(s))}function t3(e,t,r){let s=[],a=_u.pattern.getPatternsOutsideCurrentDirectory(e),n=_u.pattern.getPatternsInsideCurrentDirectory(e),c=r3(a),f=r3(n);return s.push(...n3(c,t,r)),"."in f?s.push(i3(".",n,t,r)):s.push(...n3(f,t,r)),s}ta.convertPatternsToTasks=t3;function Ple(e){return _u.pattern.getPositivePatterns(e)}ta.getPositivePatterns=Ple;function xle(e,t){return _u.pattern.getNegativePatterns(e).concat(t).map(_u.pattern.convertToPositivePattern)}ta.getNegativePatternsAsPositive=xle;function r3(e){let t={};return e.reduce((r,s)=>{let a=_u.pattern.getBaseDirectory(s);return a in r?r[a].push(s):r[a]=[s],r},t)}ta.groupPatternsByBaseDirectory=r3;function n3(e,t,r){return Object.keys(e).map(s=>i3(s,e[s],t,r))}ta.convertPatternGroupsToTasks=n3;function i3(e,t,r,s){return{dynamic:s,positive:t,negative:r,base:e,patterns:[].concat(t,r.map(_u.pattern.convertToNegativePattern))}}ta.convertPatternGroupToTask=i3});var Tle=G(cQ=>{"use strict";Object.defineProperty(cQ,"__esModule",{value:!0});cQ.read=void 0;function cze(e,t,r){t.fs.lstat(e,(s,a)=>{if(s!==null){Qle(r,s);return}if(!a.isSymbolicLink()||!t.followSymbolicLink){s3(r,a);return}t.fs.stat(e,(n,c)=>{if(n!==null){if(t.throwErrorOnBrokenSymbolicLink){Qle(r,n);return}s3(r,a);return}t.markSymbolicLink&&(c.isSymbolicLink=()=>!0),s3(r,c)})})}cQ.read=cze;function Qle(e,t){e(t)}function s3(e,t){e(null,t)}});var Rle=G(uQ=>{"use strict";Object.defineProperty(uQ,"__esModule",{value:!0});uQ.read=void 0;function uze(e,t){let r=t.fs.lstatSync(e);if(!r.isSymbolicLink()||!t.followSymbolicLink)return r;try{let s=t.fs.statSync(e);return t.markSymbolicLink&&(s.isSymbolicLink=()=>!0),s}catch(s){if(!t.throwErrorOnBrokenSymbolicLink)return r;throw s}}uQ.read=uze});var Fle=G(gd=>{"use strict";Object.defineProperty(gd,"__esModule",{value:!0});gd.createFileSystemAdapter=gd.FILE_SYSTEM_ADAPTER=void 0;var fQ=Ce("fs");gd.FILE_SYSTEM_ADAPTER={lstat:fQ.lstat,stat:fQ.stat,lstatSync:fQ.lstatSync,statSync:fQ.statSync};function fze(e){return e===void 0?gd.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},gd.FILE_SYSTEM_ADAPTER),e)}gd.createFileSystemAdapter=fze});var Nle=G(a3=>{"use strict";Object.defineProperty(a3,"__esModule",{value:!0});var Aze=Fle(),o3=class{constructor(t={}){this._options=t,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=Aze.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(t,r){return t??r}};a3.default=o3});var $0=G(md=>{"use strict";Object.defineProperty(md,"__esModule",{value:!0});md.statSync=md.stat=md.Settings=void 0;var Ole=Tle(),pze=Rle(),l3=Nle();md.Settings=l3.default;function hze(e,t,r){if(typeof t=="function"){Ole.read(e,c3(),t);return}Ole.read(e,c3(t),r)}md.stat=hze;function dze(e,t){let r=c3(t);return pze.read(e,r)}md.statSync=dze;function c3(e={}){return e instanceof l3.default?e:new l3.default(e)}});var Ule=G((sNt,Mle)=>{var Lle;Mle.exports=typeof queueMicrotask=="function"?queueMicrotask.bind(typeof window<"u"?window:global):e=>(Lle||(Lle=Promise.resolve())).then(e).catch(t=>setTimeout(()=>{throw t},0))});var Hle=G((oNt,_le)=>{_le.exports=mze;var gze=Ule();function mze(e,t){let r,s,a,n=!0;Array.isArray(e)?(r=[],s=e.length):(a=Object.keys(e),r={},s=a.length);function c(p){function h(){t&&t(p,r),t=null}n?gze(h):h()}function f(p,h,E){r[p]=E,(--s===0||h)&&c(h)}s?a?a.forEach(function(p){e[p](function(h,E){f(p,h,E)})}):e.forEach(function(p,h){p(function(E,C){f(h,E,C)})}):c(null),n=!1}});var u3=G(pQ=>{"use strict";Object.defineProperty(pQ,"__esModule",{value:!0});pQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var AQ=process.versions.node.split(".");if(AQ[0]===void 0||AQ[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var jle=Number.parseInt(AQ[0],10),yze=Number.parseInt(AQ[1],10),Gle=10,Eze=10,Ize=jle>Gle,Cze=jle===Gle&&yze>=Eze;pQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Ize||Cze});var qle=G(hQ=>{"use strict";Object.defineProperty(hQ,"__esModule",{value:!0});hQ.createDirentFromStats=void 0;var f3=class{constructor(t,r){this.name=t,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 wze(e,t){return new f3(e,t)}hQ.createDirentFromStats=wze});var A3=G(dQ=>{"use strict";Object.defineProperty(dQ,"__esModule",{value:!0});dQ.fs=void 0;var Bze=qle();dQ.fs=Bze});var p3=G(gQ=>{"use strict";Object.defineProperty(gQ,"__esModule",{value:!0});gQ.joinPathSegments=void 0;function vze(e,t,r){return e.endsWith(r)?e+t:e+r+t}gQ.joinPathSegments=vze});var zle=G(yd=>{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});yd.readdir=yd.readdirWithFileTypes=yd.read=void 0;var Sze=$0(),Yle=Hle(),bze=u3(),Wle=A3(),Vle=p3();function Dze(e,t,r){if(!t.stats&&bze.IS_SUPPORT_READDIR_WITH_FILE_TYPES){Kle(e,t,r);return}Jle(e,t,r)}yd.read=Dze;function Kle(e,t,r){t.fs.readdir(e,{withFileTypes:!0},(s,a)=>{if(s!==null){mQ(r,s);return}let n=a.map(f=>({dirent:f,name:f.name,path:Vle.joinPathSegments(e,f.name,t.pathSegmentSeparator)}));if(!t.followSymbolicLinks){h3(r,n);return}let c=n.map(f=>Pze(f,t));Yle(c,(f,p)=>{if(f!==null){mQ(r,f);return}h3(r,p)})})}yd.readdirWithFileTypes=Kle;function Pze(e,t){return r=>{if(!e.dirent.isSymbolicLink()){r(null,e);return}t.fs.stat(e.path,(s,a)=>{if(s!==null){if(t.throwErrorOnBrokenSymbolicLink){r(s);return}r(null,e);return}e.dirent=Wle.fs.createDirentFromStats(e.name,a),r(null,e)})}}function Jle(e,t,r){t.fs.readdir(e,(s,a)=>{if(s!==null){mQ(r,s);return}let n=a.map(c=>{let f=Vle.joinPathSegments(e,c,t.pathSegmentSeparator);return p=>{Sze.stat(f,t.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let C={name:c,path:f,dirent:Wle.fs.createDirentFromStats(c,E)};t.stats&&(C.stats=E),p(null,C)})}});Yle(n,(c,f)=>{if(c!==null){mQ(r,c);return}h3(r,f)})})}yd.readdir=Jle;function mQ(e,t){e(t)}function h3(e,t){e(null,t)}});var tce=G(Ed=>{"use strict";Object.defineProperty(Ed,"__esModule",{value:!0});Ed.readdir=Ed.readdirWithFileTypes=Ed.read=void 0;var xze=$0(),kze=u3(),Zle=A3(),Xle=p3();function Qze(e,t){return!t.stats&&kze.IS_SUPPORT_READDIR_WITH_FILE_TYPES?$le(e,t):ece(e,t)}Ed.read=Qze;function $le(e,t){return t.fs.readdirSync(e,{withFileTypes:!0}).map(s=>{let a={dirent:s,name:s.name,path:Xle.joinPathSegments(e,s.name,t.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&t.followSymbolicLinks)try{let n=t.fs.statSync(a.path);a.dirent=Zle.fs.createDirentFromStats(a.name,n)}catch(n){if(t.throwErrorOnBrokenSymbolicLink)throw n}return a})}Ed.readdirWithFileTypes=$le;function ece(e,t){return t.fs.readdirSync(e).map(s=>{let a=Xle.joinPathSegments(e,s,t.pathSegmentSeparator),n=xze.statSync(a,t.fsStatSettings),c={name:s,path:a,dirent:Zle.fs.createDirentFromStats(s,n)};return t.stats&&(c.stats=n),c})}Ed.readdir=ece});var rce=G(Id=>{"use strict";Object.defineProperty(Id,"__esModule",{value:!0});Id.createFileSystemAdapter=Id.FILE_SYSTEM_ADAPTER=void 0;var nI=Ce("fs");Id.FILE_SYSTEM_ADAPTER={lstat:nI.lstat,stat:nI.stat,lstatSync:nI.lstatSync,statSync:nI.statSync,readdir:nI.readdir,readdirSync:nI.readdirSync};function Tze(e){return e===void 0?Id.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},Id.FILE_SYSTEM_ADAPTER),e)}Id.createFileSystemAdapter=Tze});var nce=G(g3=>{"use strict";Object.defineProperty(g3,"__esModule",{value:!0});var Rze=Ce("path"),Fze=$0(),Nze=rce(),d3=class{constructor(t={}){this._options=t,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=Nze.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Rze.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new Fze.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(t,r){return t??r}};g3.default=d3});var yQ=G(Cd=>{"use strict";Object.defineProperty(Cd,"__esModule",{value:!0});Cd.Settings=Cd.scandirSync=Cd.scandir=void 0;var ice=zle(),Oze=tce(),m3=nce();Cd.Settings=m3.default;function Lze(e,t,r){if(typeof t=="function"){ice.read(e,y3(),t);return}ice.read(e,y3(t),r)}Cd.scandir=Lze;function Mze(e,t){let r=y3(t);return Oze.read(e,r)}Cd.scandirSync=Mze;function y3(e={}){return e instanceof m3.default?e:new m3.default(e)}});var oce=G((gNt,sce)=>{"use strict";function Uze(e){var t=new e,r=t;function s(){var n=t;return n.next?t=n.next:(t=new e,r=t),n.next=null,n}function a(n){r.next=n,r=n}return{get:s,release:a}}sce.exports=Uze});var lce=G((mNt,E3)=>{"use strict";var _ze=oce();function ace(e,t,r){if(typeof e=="function"&&(r=t,t=e,e=null),!(r>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");var s=_ze(Hze),a=null,n=null,c=0,f=null,p={push:R,drain:Rc,saturated:Rc,pause:E,paused:!1,get concurrency(){return r},set concurrency(fe){if(!(fe>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");if(r=fe,!p.paused)for(;a&&c=r||p.paused?n?(n.next=ge,n=ge):(a=ge,n=ge,p.saturated()):(c++,t.call(e,ge.value,ge.worked))}function N(fe,le){var ge=s.get();ge.context=e,ge.release=U,ge.value=fe,ge.callback=le||Rc,ge.errorHandler=f,c>=r||p.paused?a?(ge.next=a,a=ge):(a=ge,n=ge,p.saturated()):(c++,t.call(e,ge.value,ge.worked))}function U(fe){fe&&s.release(fe);var le=a;le&&c<=r?p.paused?c--:(n===a&&(n=null),a=le.next,le.next=null,t.call(e,le.value,le.worked),n===null&&p.empty()):--c===0&&p.drain()}function K(){a=null,n=null,p.drain=Rc}function $(){a=null,n=null,p.drain(),p.drain=Rc}function ie(fe){f=fe}}function Rc(){}function Hze(){this.value=null,this.callback=Rc,this.next=null,this.release=Rc,this.context=null,this.errorHandler=null;var e=this;this.worked=function(r,s){var a=e.callback,n=e.errorHandler,c=e.value;e.value=null,e.callback=Rc,e.errorHandler&&n(r,c),a.call(e.context,r,s),e.release(e)}}function jze(e,t,r){typeof e=="function"&&(r=t,t=e,e=null);function s(E,C){t.call(this,E).then(function(S){C(null,S)},C)}var a=ace(e,s,r),n=a.push,c=a.unshift;return a.push=f,a.unshift=p,a.drained=h,a;function f(E){var C=new Promise(function(S,x){n(E,function(I,R){if(I){x(I);return}S(R)})});return C.catch(Rc),C}function p(E){var C=new Promise(function(S,x){c(E,function(I,R){if(I){x(I);return}S(R)})});return C.catch(Rc),C}function h(){if(a.idle())return new Promise(function(S){S()});var E=a.drain,C=new Promise(function(S){a.drain=function(){E(),S()}});return C}}E3.exports=ace;E3.exports.promise=jze});var EQ=G(eA=>{"use strict";Object.defineProperty(eA,"__esModule",{value:!0});eA.joinPathSegments=eA.replacePathSegmentSeparator=eA.isAppliedFilter=eA.isFatalError=void 0;function Gze(e,t){return e.errorFilter===null?!0:!e.errorFilter(t)}eA.isFatalError=Gze;function qze(e,t){return e===null||e(t)}eA.isAppliedFilter=qze;function Yze(e,t){return e.split(/[/\\]/).join(t)}eA.replacePathSegmentSeparator=Yze;function Wze(e,t,r){return e===""?t:e.endsWith(r)?e+t:e+r+t}eA.joinPathSegments=Wze});var w3=G(C3=>{"use strict";Object.defineProperty(C3,"__esModule",{value:!0});var Vze=EQ(),I3=class{constructor(t,r){this._root=t,this._settings=r,this._root=Vze.replacePathSegmentSeparator(t,r.pathSegmentSeparator)}};C3.default=I3});var S3=G(v3=>{"use strict";Object.defineProperty(v3,"__esModule",{value:!0});var Kze=Ce("events"),Jze=yQ(),zze=lce(),IQ=EQ(),Zze=w3(),B3=class extends Zze.default{constructor(t,r){super(t,r),this._settings=r,this._scandir=Jze.scandir,this._emitter=new Kze.EventEmitter,this._queue=zze(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(t){this._emitter.on("entry",t)}onError(t){this._emitter.once("error",t)}onEnd(t){this._emitter.once("end",t)}_pushToQueue(t,r){let s={directory:t,base:r};this._queue.push(s,a=>{a!==null&&this._handleError(a)})}_worker(t,r){this._scandir(t.directory,this._settings.fsScandirSettings,(s,a)=>{if(s!==null){r(s,void 0);return}for(let n of a)this._handleEntry(n,t.base);r(null,void 0)})}_handleError(t){this._isDestroyed||!IQ.isFatalError(this._settings,t)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",t))}_handleEntry(t,r){if(this._isDestroyed||this._isFatalError)return;let s=t.path;r!==void 0&&(t.path=IQ.joinPathSegments(r,t.name,this._settings.pathSegmentSeparator)),IQ.isAppliedFilter(this._settings.entryFilter,t)&&this._emitEntry(t),t.dirent.isDirectory()&&IQ.isAppliedFilter(this._settings.deepFilter,t)&&this._pushToQueue(s,r===void 0?void 0:t.path)}_emitEntry(t){this._emitter.emit("entry",t)}};v3.default=B3});var cce=G(D3=>{"use strict";Object.defineProperty(D3,"__esModule",{value:!0});var Xze=S3(),b3=class{constructor(t,r){this._root=t,this._settings=r,this._reader=new Xze.default(this._root,this._settings),this._storage=[]}read(t){this._reader.onError(r=>{$ze(t,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{eZe(t,this._storage)}),this._reader.read()}};D3.default=b3;function $ze(e,t){e(t)}function eZe(e,t){e(null,t)}});var uce=G(x3=>{"use strict";Object.defineProperty(x3,"__esModule",{value:!0});var tZe=Ce("stream"),rZe=S3(),P3=class{constructor(t,r){this._root=t,this._settings=r,this._reader=new rZe.default(this._root,this._settings),this._stream=new tZe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(t=>{this._stream.emit("error",t)}),this._reader.onEntry(t=>{this._stream.push(t)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};x3.default=P3});var fce=G(Q3=>{"use strict";Object.defineProperty(Q3,"__esModule",{value:!0});var nZe=yQ(),CQ=EQ(),iZe=w3(),k3=class extends iZe.default{constructor(){super(...arguments),this._scandir=nZe.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(t,r){this._queue.add({directory:t,base:r})}_handleQueue(){for(let t of this._queue.values())this._handleDirectory(t.directory,t.base)}_handleDirectory(t,r){try{let s=this._scandir(t,this._settings.fsScandirSettings);for(let a of s)this._handleEntry(a,r)}catch(s){this._handleError(s)}}_handleError(t){if(CQ.isFatalError(this._settings,t))throw t}_handleEntry(t,r){let s=t.path;r!==void 0&&(t.path=CQ.joinPathSegments(r,t.name,this._settings.pathSegmentSeparator)),CQ.isAppliedFilter(this._settings.entryFilter,t)&&this._pushToStorage(t),t.dirent.isDirectory()&&CQ.isAppliedFilter(this._settings.deepFilter,t)&&this._pushToQueue(s,r===void 0?void 0:t.path)}_pushToStorage(t){this._storage.push(t)}};Q3.default=k3});var Ace=G(R3=>{"use strict";Object.defineProperty(R3,"__esModule",{value:!0});var sZe=fce(),T3=class{constructor(t,r){this._root=t,this._settings=r,this._reader=new sZe.default(this._root,this._settings)}read(){return this._reader.read()}};R3.default=T3});var pce=G(N3=>{"use strict";Object.defineProperty(N3,"__esModule",{value:!0});var oZe=Ce("path"),aZe=yQ(),F3=class{constructor(t={}){this._options=t,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,oZe.sep),this.fsScandirSettings=new aZe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(t,r){return t??r}};N3.default=F3});var BQ=G(tA=>{"use strict";Object.defineProperty(tA,"__esModule",{value:!0});tA.Settings=tA.walkStream=tA.walkSync=tA.walk=void 0;var hce=cce(),lZe=uce(),cZe=Ace(),O3=pce();tA.Settings=O3.default;function uZe(e,t,r){if(typeof t=="function"){new hce.default(e,wQ()).read(t);return}new hce.default(e,wQ(t)).read(r)}tA.walk=uZe;function fZe(e,t){let r=wQ(t);return new cZe.default(e,r).read()}tA.walkSync=fZe;function AZe(e,t){let r=wQ(t);return new lZe.default(e,r).read()}tA.walkStream=AZe;function wQ(e={}){return e instanceof O3.default?e:new O3.default(e)}});var vQ=G(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});var pZe=Ce("path"),hZe=$0(),dce=Rp(),L3=class{constructor(t){this._settings=t,this._fsStatSettings=new hZe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(t){return pZe.resolve(this._settings.cwd,t)}_makeEntry(t,r){let s={name:r,path:r,dirent:dce.fs.createDirentFromStats(r,t)};return this._settings.stats&&(s.stats=t),s}_isFatalError(t){return!dce.errno.isEnoentCodeError(t)&&!this._settings.suppressErrors}};M3.default=L3});var H3=G(_3=>{"use strict";Object.defineProperty(_3,"__esModule",{value:!0});var dZe=Ce("stream"),gZe=$0(),mZe=BQ(),yZe=vQ(),U3=class extends yZe.default{constructor(){super(...arguments),this._walkStream=mZe.walkStream,this._stat=gZe.stat}dynamic(t,r){return this._walkStream(t,r)}static(t,r){let s=t.map(this._getFullEntryPath,this),a=new dZe.PassThrough({objectMode:!0});a._write=(n,c,f)=>this._getEntry(s[n],t[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===s.length-1&&a.end(),f()}).catch(f);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(s.errorFilter(a))return null;throw a})}_getStat(t){return new Promise((r,s)=>{this._stat(t,this._fsStatSettings,(a,n)=>a===null?r(n):s(a))})}};_3.default=U3});var gce=G(G3=>{"use strict";Object.defineProperty(G3,"__esModule",{value:!0});var EZe=BQ(),IZe=vQ(),CZe=H3(),j3=class extends IZe.default{constructor(){super(...arguments),this._walkAsync=EZe.walk,this._readerStream=new CZe.default(this._settings)}dynamic(t,r){return new Promise((s,a)=>{this._walkAsync(t,r,(n,c)=>{n===null?s(c):a(n)})})}async static(t,r){let s=[],a=this._readerStream.static(t,r);return new Promise((n,c)=>{a.once("error",c),a.on("data",f=>s.push(f)),a.once("end",()=>n(s))})}};G3.default=j3});var mce=G(Y3=>{"use strict";Object.defineProperty(Y3,"__esModule",{value:!0});var TB=Rp(),q3=class{constructor(t,r,s){this._patterns=t,this._settings=r,this._micromatchOptions=s,this._storage=[],this._fillStorage()}_fillStorage(){for(let t of this._patterns){let r=this._getPatternSegments(t),s=this._splitSegmentsIntoSections(r);this._storage.push({complete:s.length<=1,pattern:t,segments:r,sections:s})}}_getPatternSegments(t){return TB.pattern.getPatternParts(t,this._micromatchOptions).map(s=>TB.pattern.isDynamicPattern(s,this._settings)?{dynamic:!0,pattern:s,patternRe:TB.pattern.makeRe(s,this._micromatchOptions)}:{dynamic:!1,pattern:s})}_splitSegmentsIntoSections(t){return TB.array.splitWhen(t,r=>r.dynamic&&TB.pattern.hasGlobStar(r.pattern))}};Y3.default=q3});var yce=G(V3=>{"use strict";Object.defineProperty(V3,"__esModule",{value:!0});var wZe=mce(),W3=class extends wZe.default{match(t){let r=t.split("/"),s=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>s);for(let n of a){let c=n.sections[0];if(!n.complete&&s>c.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};V3.default=W3});var Ece=G(J3=>{"use strict";Object.defineProperty(J3,"__esModule",{value:!0});var SQ=Rp(),BZe=yce(),K3=class{constructor(t,r){this._settings=t,this._micromatchOptions=r}getFilter(t,r,s){let a=this._getMatcher(r),n=this._getNegativePatternsRe(s);return c=>this._filter(t,c,a,n)}_getMatcher(t){return new BZe.default(t,this._settings,this._micromatchOptions)}_getNegativePatternsRe(t){let r=t.filter(SQ.pattern.isAffectDepthOfReadingPattern);return SQ.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(t,r,s,a){if(this._isSkippedByDeep(t,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=SQ.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,s)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(t,r){return this._settings.deep===1/0?!1:this._getEntryLevel(t,r)>=this._settings.deep}_getEntryLevel(t,r){let s=r.split("/").length;if(t==="")return s;let a=t.split("/").length;return s-a}_isSkippedSymbolicLink(t){return!this._settings.followSymbolicLinks&&t.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(t,r){return!this._settings.baseNameMatch&&!r.match(t)}_isSkippedByNegativePatterns(t,r){return!SQ.pattern.matchAny(t,r)}};J3.default=K3});var Ice=G(Z3=>{"use strict";Object.defineProperty(Z3,"__esModule",{value:!0});var em=Rp(),z3=class{constructor(t,r){this._settings=t,this._micromatchOptions=r,this.index=new Map}getFilter(t,r){let s=em.pattern.convertPatternsToRe(t,this._micromatchOptions),a=em.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,s,a)}_filter(t,r,s){let a=em.path.removeLeadingDotSegment(t.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(t)||this._onlyDirectoryFilter(t)||this._isSkippedByAbsoluteNegativePatterns(a,s))return!1;let n=t.dirent.isDirectory(),c=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,s,n);return this._settings.unique&&c&&this._createIndexRecord(a),c}_isDuplicateEntry(t){return this.index.has(t)}_createIndexRecord(t){this.index.set(t,void 0)}_onlyFileFilter(t){return this._settings.onlyFiles&&!t.dirent.isFile()}_onlyDirectoryFilter(t){return this._settings.onlyDirectories&&!t.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(t,r){if(!this._settings.absolute)return!1;let s=em.path.makeAbsolute(this._settings.cwd,t);return em.pattern.matchAny(s,r)}_isMatchToPatterns(t,r,s){let a=em.pattern.matchAny(t,r);return!a&&s?em.pattern.matchAny(t+"/",r):a}};Z3.default=z3});var Cce=G($3=>{"use strict";Object.defineProperty($3,"__esModule",{value:!0});var vZe=Rp(),X3=class{constructor(t){this._settings=t}getFilter(){return t=>this._isNonFatalError(t)}_isNonFatalError(t){return vZe.errno.isEnoentCodeError(t)||this._settings.suppressErrors}};$3.default=X3});var Bce=G(t8=>{"use strict";Object.defineProperty(t8,"__esModule",{value:!0});var wce=Rp(),e8=class{constructor(t){this._settings=t}getTransformer(){return t=>this._transform(t)}_transform(t){let r=t.path;return this._settings.absolute&&(r=wce.path.makeAbsolute(this._settings.cwd,r),r=wce.path.unixify(r)),this._settings.markDirectories&&t.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},t),{path:r}):r}};t8.default=e8});var bQ=G(n8=>{"use strict";Object.defineProperty(n8,"__esModule",{value:!0});var SZe=Ce("path"),bZe=Ece(),DZe=Ice(),PZe=Cce(),xZe=Bce(),r8=class{constructor(t){this._settings=t,this.errorFilter=new PZe.default(this._settings),this.entryFilter=new DZe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new bZe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new xZe.default(this._settings)}_getRootDirectory(t){return SZe.resolve(this._settings.cwd,t.base)}_getReaderOptions(t){let r=t.base==="."?"":t.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,t.positive,t.negative),entryFilter:this.entryFilter.getFilter(t.positive,t.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}}};n8.default=r8});var vce=G(s8=>{"use strict";Object.defineProperty(s8,"__esModule",{value:!0});var kZe=gce(),QZe=bQ(),i8=class extends QZe.default{constructor(){super(...arguments),this._reader=new kZe.default(this._settings)}async read(t){let r=this._getRootDirectory(t),s=this._getReaderOptions(t);return(await this.api(r,t,s)).map(n=>s.transform(n))}api(t,r,s){return r.dynamic?this._reader.dynamic(t,s):this._reader.static(r.patterns,s)}};s8.default=i8});var Sce=G(a8=>{"use strict";Object.defineProperty(a8,"__esModule",{value:!0});var TZe=Ce("stream"),RZe=H3(),FZe=bQ(),o8=class extends FZe.default{constructor(){super(...arguments),this._reader=new RZe.default(this._settings)}read(t){let r=this._getRootDirectory(t),s=this._getReaderOptions(t),a=this.api(r,t,s),n=new TZe.Readable({objectMode:!0,read:()=>{}});return a.once("error",c=>n.emit("error",c)).on("data",c=>n.emit("data",s.transform(c))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(t,r,s){return r.dynamic?this._reader.dynamic(t,s):this._reader.static(r.patterns,s)}};a8.default=o8});var bce=G(c8=>{"use strict";Object.defineProperty(c8,"__esModule",{value:!0});var NZe=$0(),OZe=BQ(),LZe=vQ(),l8=class extends LZe.default{constructor(){super(...arguments),this._walkSync=OZe.walkSync,this._statSync=NZe.statSync}dynamic(t,r){return this._walkSync(t,r)}static(t,r){let s=[];for(let a of t){let n=this._getFullEntryPath(a),c=this._getEntry(n,a,r);c===null||!r.entryFilter(c)||s.push(c)}return s}_getEntry(t,r,s){try{let a=this._getStat(t);return this._makeEntry(a,r)}catch(a){if(s.errorFilter(a))return null;throw a}}_getStat(t){return this._statSync(t,this._fsStatSettings)}};c8.default=l8});var Dce=G(f8=>{"use strict";Object.defineProperty(f8,"__esModule",{value:!0});var MZe=bce(),UZe=bQ(),u8=class extends UZe.default{constructor(){super(...arguments),this._reader=new MZe.default(this._settings)}read(t){let r=this._getRootDirectory(t),s=this._getReaderOptions(t);return this.api(r,t,s).map(s.transform)}api(t,r,s){return r.dynamic?this._reader.dynamic(t,s):this._reader.static(r.patterns,s)}};f8.default=u8});var Pce=G(sI=>{"use strict";Object.defineProperty(sI,"__esModule",{value:!0});sI.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var iI=Ce("fs"),_Ze=Ce("os"),HZe=Math.max(_Ze.cpus().length,1);sI.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:iI.lstat,lstatSync:iI.lstatSync,stat:iI.stat,statSync:iI.statSync,readdir:iI.readdir,readdirSync:iI.readdirSync};var A8=class{constructor(t={}){this._options=t,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,HZe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),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),this.ignore=[].concat(this.ignore)}_getValue(t,r){return t===void 0?r:t}_getFileSystemMethods(t={}){return Object.assign(Object.assign({},sI.DEFAULT_FILE_SYSTEM_ADAPTER),t)}};sI.default=A8});var DQ=G((jNt,kce)=>{"use strict";var xce=kle(),jZe=vce(),GZe=Sce(),qZe=Dce(),p8=Pce(),Fc=Rp();async function h8(e,t){Hu(e);let r=d8(e,jZe.default,t),s=await Promise.all(r);return Fc.array.flatten(s)}(function(e){e.glob=e,e.globSync=t,e.globStream=r,e.async=e;function t(h,E){Hu(h);let C=d8(h,qZe.default,E);return Fc.array.flatten(C)}e.sync=t;function r(h,E){Hu(h);let C=d8(h,GZe.default,E);return Fc.stream.merge(C)}e.stream=r;function s(h,E){Hu(h);let C=[].concat(h),S=new p8.default(E);return xce.generate(C,S)}e.generateTasks=s;function a(h,E){Hu(h);let C=new p8.default(E);return Fc.pattern.isDynamicPattern(h,C)}e.isDynamicPattern=a;function n(h){return Hu(h),Fc.path.escape(h)}e.escapePath=n;function c(h){return Hu(h),Fc.path.convertPathToPattern(h)}e.convertPathToPattern=c;let f;(function(h){function E(S){return Hu(S),Fc.path.escapePosixPath(S)}h.escapePath=E;function C(S){return Hu(S),Fc.path.convertPosixPathToPattern(S)}h.convertPathToPattern=C})(f=e.posix||(e.posix={}));let p;(function(h){function E(S){return Hu(S),Fc.path.escapeWindowsPath(S)}h.escapePath=E;function C(S){return Hu(S),Fc.path.convertWindowsPathToPattern(S)}h.convertPathToPattern=C})(p=e.win32||(e.win32={}))})(h8||(h8={}));function d8(e,t,r){let s=[].concat(e),a=new p8.default(r),n=xce.generate(s,a),c=new t(a);return n.map(c.read,c)}function Hu(e){if(![].concat(e).every(s=>Fc.string.isString(s)&&!Fc.string.isEmpty(s)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}kce.exports=h8});var Mn={};Vt(Mn,{checksumFile:()=>xQ,checksumPattern:()=>kQ,makeHash:()=>As});function As(...e){let t=(0,PQ.createHash)("sha512"),r="";for(let s of e)typeof s=="string"?r+=s:s&&(r&&(t.update(r),r=""),t.update(s));return r&&t.update(r),t.digest("hex")}async function xQ(e,{baseFs:t,algorithm:r}={baseFs:ae,algorithm:"sha512"}){let s=await t.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,PQ.createHash)(r),f=0;for(;(f=await t.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await t.closePromise(s)}}async function kQ(e,{cwd:t}){let s=(await(0,g8.default)(e,{cwd:Ae.fromPortablePath(t),onlyDirectories:!0})).map(f=>`${f}/**/*`),a=await(0,g8.default)([e,...s],{cwd:Ae.fromPortablePath(t),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async f=>{let p=[Buffer.from(f)],h=Y.join(t,Ae.toPortablePath(f)),E=await ae.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ae.readlinkPromise(h))):E.isFile()&&p.push(await ae.readFilePromise(h)),p.join("\0")})),c=(0,PQ.createHash)("sha512");for(let f of n)c.update(f);return c.digest("hex")}var PQ,g8,wd=Ze(()=>{bt();PQ=Ce("crypto"),g8=et(DQ())});var H={};Vt(H,{allPeerRequests:()=>HB,areDescriptorsEqual:()=>Fce,areIdentsEqual:()=>OB,areLocatorsEqual:()=>LB,areVirtualPackagesEquivalent:()=>$Ze,bindDescriptor:()=>ZZe,bindLocator:()=>XZe,convertDescriptorToLocator:()=>QQ,convertLocatorToDescriptor:()=>I8,convertPackageToLocator:()=>KZe,convertToIdent:()=>VZe,convertToManifestRange:()=>cXe,copyPackage:()=>FB,devirtualizeDescriptor:()=>NB,devirtualizeLocator:()=>aI,ensureDevirtualizedDescriptor:()=>JZe,ensureDevirtualizedLocator:()=>zZe,getIdentVendorPath:()=>v8,isPackageCompatible:()=>OQ,isPackageInRange:()=>hXe,isVirtualDescriptor:()=>Fp,isVirtualLocator:()=>ju,makeDescriptor:()=>Un,makeIdent:()=>Qa,makeLocator:()=>Js,makeRange:()=>FQ,parseDescriptor:()=>Bd,parseFileStyleRange:()=>aXe,parseIdent:()=>ka,parseLocator:()=>Np,parseRange:()=>tm,prettyDependent:()=>K4,prettyDescriptor:()=>ai,prettyIdent:()=>$i,prettyLocator:()=>Vr,prettyLocatorNoColors:()=>V4,prettyRange:()=>cI,prettyReference:()=>UB,prettyResolution:()=>QB,prettyWorkspace:()=>_B,renamePackage:()=>C8,slugifyIdent:()=>y8,slugifyLocator:()=>lI,sortDescriptors:()=>uI,stringifyDescriptor:()=>gl,stringifyIdent:()=>fn,stringifyLocator:()=>ml,tryParseDescriptor:()=>MB,tryParseIdent:()=>Nce,tryParseLocator:()=>RQ,tryParseRange:()=>oXe,unwrapIdentFromScope:()=>fXe,virtualizeDescriptor:()=>w8,virtualizePackage:()=>B8,wrapIdentIntoScope:()=>uXe});function Qa(e,t){if(e?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:As(e,t),scope:e,name:t}}function Un(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:As(e.identHash,t),range:t}}function Js(e,t){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:As(e.identHash,t),reference:t}}function VZe(e){return{identHash:e.identHash,scope:e.scope,name:e.name}}function QQ(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.descriptorHash,reference:e.range}}function I8(e){return{identHash:e.identHash,scope:e.scope,name:e.name,descriptorHash:e.locatorHash,range:e.reference}}function KZe(e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference}}function C8(e,t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference,version:e.version,languageName:e.languageName,linkType:e.linkType,conditions:e.conditions,dependencies:new Map(e.dependencies),peerDependencies:new Map(e.peerDependencies),dependenciesMeta:new Map(e.dependenciesMeta),peerDependenciesMeta:new Map(e.peerDependenciesMeta),bin:new Map(e.bin)}}function FB(e){return C8(e,e)}function w8(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return Un(e,`virtual:${t}#${e.range}`)}function B8(e,t){if(t.includes("#"))throw new Error("Invalid entropy");return C8(e,Js(e,`virtual:${t}#${e.reference}`))}function Fp(e){return e.range.startsWith(RB)}function ju(e){return e.reference.startsWith(RB)}function NB(e){if(!Fp(e))throw new Error("Not a virtual descriptor");return Un(e,e.range.replace(TQ,""))}function aI(e){if(!ju(e))throw new Error("Not a virtual descriptor");return Js(e,e.reference.replace(TQ,""))}function JZe(e){return Fp(e)?Un(e,e.range.replace(TQ,"")):e}function zZe(e){return ju(e)?Js(e,e.reference.replace(TQ,"")):e}function ZZe(e,t){return e.range.includes("::")?e:Un(e,`${e.range}::${oI.default.stringify(t)}`)}function XZe(e,t){return e.reference.includes("::")?e:Js(e,`${e.reference}::${oI.default.stringify(t)}`)}function OB(e,t){return e.identHash===t.identHash}function Fce(e,t){return e.descriptorHash===t.descriptorHash}function LB(e,t){return e.locatorHash===t.locatorHash}function $Ze(e,t){if(!ju(e))throw new Error("Invalid package type");if(!ju(t))throw new Error("Invalid package type");if(!OB(e,t)||e.dependencies.size!==t.dependencies.size)return!1;for(let r of e.dependencies.values()){let s=t.dependencies.get(r.identHash);if(!s||!Fce(r,s))return!1}return!0}function ka(e){let t=Nce(e);if(!t)throw new Error(`Invalid ident (${e})`);return t}function Nce(e){let t=e.match(eXe);if(!t)return null;let[,r,s]=t;return Qa(typeof r<"u"?r:null,s)}function Bd(e,t=!1){let r=MB(e,t);if(!r)throw new Error(`Invalid descriptor (${e})`);return r}function MB(e,t=!1){let r=t?e.match(tXe):e.match(rXe);if(!r)return null;let[,s,a,n]=r;if(n===m8)throw new Error(`Invalid range (${e})`);let c=typeof s<"u"?s:null,f=typeof n<"u"?n:m8;return Un(Qa(c,a),f)}function Np(e,t=!1){let r=RQ(e,t);if(!r)throw new Error(`Invalid locator (${e})`);return r}function RQ(e,t=!1){let r=t?e.match(nXe):e.match(iXe);if(!r)return null;let[,s,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${e})`);let c=typeof s<"u"?s:null,f=typeof n<"u"?n:"unknown";return Js(Qa(c,a),f)}function tm(e,t){let r=e.match(sXe);if(r===null)throw new Error(`Invalid range (${e})`);let s=typeof r[1]<"u"?r[1]:null;if(typeof t?.requireProtocol=="string"&&s!==t.requireProtocol)throw new Error(`Invalid protocol (${s})`);if(t?.requireProtocol&&s===null)throw new Error(`Missing protocol (${s})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(t?.requireSource&&a===null)throw new Error(`Missing source (${e})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),c=t?.parseSelector?oI.default.parse(n):n,f=typeof r[4]<"u"?oI.default.parse(r[4]):null;return{protocol:s,source:a,selector:c,params:f}}function oXe(e,t){try{return tm(e,t)}catch{return null}}function aXe(e,{protocol:t}){let{selector:r,params:s}=tm(e,{requireProtocol:t,requireBindings:!0});if(typeof s.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${e}`);return{parentLocator:Np(s.locator,!0),path:r}}function Qce(e){return e=e.replaceAll("%","%25"),e=e.replaceAll(":","%3A"),e=e.replaceAll("#","%23"),e}function lXe(e){return e===null?!1:Object.entries(e).length>0}function FQ({protocol:e,source:t,selector:r,params:s}){let a="";return e!==null&&(a+=`${e}`),t!==null&&(a+=`${Qce(t)}#`),a+=Qce(r),lXe(s)&&(a+=`::${oI.default.stringify(s)}`),a}function cXe(e){let{params:t,protocol:r,source:s,selector:a}=tm(e);for(let n in t)n.startsWith("__")&&delete t[n];return FQ({protocol:r,source:s,params:t,selector:a})}function fn(e){return e.scope?`@${e.scope}/${e.name}`:`${e.name}`}function uXe(e,t){return e.scope?Qa(t,`${e.scope}__${e.name}`):Qa(t,e.name)}function fXe(e,t){if(e.scope!==t)return e;let r=e.name.indexOf("__");if(r===-1)return Qa(null,e.name);let s=e.name.slice(0,r),a=e.name.slice(r+2);return Qa(s,a)}function gl(e){return e.scope?`@${e.scope}/${e.name}@${e.range}`:`${e.name}@${e.range}`}function ml(e){return e.scope?`@${e.scope}/${e.name}@${e.reference}`:`${e.name}@${e.reference}`}function y8(e){return e.scope!==null?`@${e.scope}-${e.name}`:e.name}function lI(e){let{protocol:t,selector:r}=tm(e.reference),s=t!==null?t.replace(AXe,""):"exotic",a=E8.default.valid(r),n=a!==null?`${s}-${a}`:`${s}`,c=10;return e.scope?`${y8(e)}-${n}-${e.locatorHash.slice(0,c)}`:`${y8(e)}-${n}-${e.locatorHash.slice(0,c)}`}function $i(e,t){return t.scope?`${Gt(e,`@${t.scope}/`,dt.SCOPE)}${Gt(e,t.name,dt.NAME)}`:`${Gt(e,t.name,dt.NAME)}`}function NQ(e){if(e.startsWith(RB)){let t=NQ(e.substring(e.indexOf("#")+1)),r=e.substring(RB.length,RB.length+YZe);return`${t} [${r}]`}else return e.replace(pXe,"?[...]")}function cI(e,t){return`${Gt(e,NQ(t),dt.RANGE)}`}function ai(e,t){return`${$i(e,t)}${Gt(e,"@",dt.RANGE)}${cI(e,t.range)}`}function UB(e,t){return`${Gt(e,NQ(t),dt.REFERENCE)}`}function Vr(e,t){return`${$i(e,t)}${Gt(e,"@",dt.REFERENCE)}${UB(e,t.reference)}`}function V4(e){return`${fn(e)}@${NQ(e.reference)}`}function uI(e){return Ks(e,[t=>fn(t),t=>t.range])}function _B(e,t){return $i(e,t.anchoredLocator)}function QB(e,t,r){let s=Fp(t)?NB(t):t;return r===null?`${ai(e,s)} \u2192 ${W4(e).Cross}`:s.identHash===r.identHash?`${ai(e,s)} \u2192 ${UB(e,r.reference)}`:`${ai(e,s)} \u2192 ${Vr(e,r)}`}function K4(e,t,r){return r===null?`${Vr(e,t)}`:`${Vr(e,t)} (via ${cI(e,r.range)})`}function v8(e){return`node_modules/${fn(e)}`}function hXe(e,t){return t===m8||!e.version?!0:E8.default.satisfies(e.version??"",t)}function OQ(e,t){return e.conditions?WZe(e.conditions,r=>{let[,s,a]=r.match(Rce),n=t[s];return n?n.includes(a):!0}):!0}function HB(e){let t=new Set;if("children"in e)t.add(e);else for(let r of e.requests.values())t.add(r);for(let r of t)for(let s of r.children.values())t.add(s);return t}var oI,E8,Tce,RB,YZe,Rce,WZe,TQ,eXe,tXe,rXe,m8,nXe,iXe,sXe,AXe,pXe,$o=Ze(()=>{oI=et(Ce("querystring")),E8=et(hi()),Tce=et(tse());Tc();wd();Qc();$o();RB="virtual:",YZe=5,Rce=/(os|cpu|libc)=([a-z0-9_-]+)/,WZe=(0,Tce.makeParser)(Rce);TQ=/^[^#]*#/;eXe=/^(?:@([^/]+?)\/)?([^@/]+)$/;tXe=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,rXe=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/,m8="unknown";nXe=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,iXe=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;sXe=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;AXe=/:$/;pXe=/\?.*/});var Oce,Lce=Ze(()=>{$o();Oce={hooks:{reduceDependency:(e,t,r,s,{resolver:a,resolveOptions:n})=>{for(let{pattern:c,reference:f}of t.topLevelWorkspace.manifest.resolutions){if(c.from&&(c.from.fullName!==fn(r)||t.configuration.normalizeLocator(Js(ka(c.from.fullName),c.from.description??r.reference)).locatorHash!==r.locatorHash)||c.descriptor.fullName!==fn(e)||t.configuration.normalizeDependency(Un(Np(c.descriptor.fullName),c.descriptor.description??e.range)).descriptorHash!==e.descriptorHash)continue;return a.bindDescriptor(t.configuration.normalizeDependency(Un(e,f)),t.topLevelWorkspace.anchoredLocator,n)}return e},validateProject:async(e,t)=>{for(let r of e.workspaces){let s=_B(e.configuration,r);await e.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>t.reportWarning(a,`${s}: ${n}`),reportError:(a,n)=>t.reportError(a,`${s}: ${n}`)})}},validateWorkspace:async(e,t)=>{let{manifest:r}=e;r.resolutions.length&&e.cwd!==e.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let s of r.errors)t.reportWarning(57,s.message)}}}});var Ii,rm=Ze(()=>{Ii=class e{static{this.protocol="workspace:"}supportsDescriptor(t,r){return!!(t.range.startsWith(e.protocol)||r.project.tryWorkspaceByDescriptor(t)!==null)}supportsLocator(t,r){return!!t.reference.startsWith(e.protocol)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){return[s.project.getWorkspaceByDescriptor(t).anchoredLocator]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){let s=r.project.getWorkspaceByCwd(t.reference.slice(e.protocol.length));return{...t,version:s.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...s.manifest.dependencies,...s.manifest.devDependencies])),peerDependencies:new Map([...s.manifest.peerDependencies]),dependenciesMeta:s.manifest.dependenciesMeta,peerDependenciesMeta:s.manifest.peerDependenciesMeta,bin:s.manifest.bin}}}});var kr={};Vt(kr,{SemVer:()=>jce.SemVer,clean:()=>gXe,getComparator:()=>_ce,mergeComparators:()=>S8,satisfiesWithPrereleases:()=>rA,simplifyRanges:()=>b8,stringifyComparator:()=>Hce,validRange:()=>yl});function rA(e,t,r=!1){if(!e)return!1;let s=`${t}${r}`,a=Mce.get(s);if(typeof a>"u")try{a=new Op.default.Range(t,{includePrerelease:!0,loose:r})}catch{return!1}finally{Mce.set(s,a||null)}else if(a===null)return!1;let n;try{n=new Op.default.SemVer(e,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(c=>{for(let f of c)f.semver.prerelease&&(f.semver.prerelease=[]);return c.every(f=>f.test(n))}))}function yl(e){if(e.indexOf(":")!==-1)return null;let t=Uce.get(e);if(typeof t<"u")return t;try{t=new Op.default.Range(e)}catch{t=null}return Uce.set(e,t),t}function gXe(e){let t=dXe.exec(e);return t?t[1]:null}function _ce(e){if(e.semver===Op.default.Comparator.ANY)return{gt:null,lt:null};switch(e.operator){case"":return{gt:[">=",e.semver],lt:["<=",e.semver]};case">":case">=":return{gt:[e.operator,e.semver],lt:null};case"<":case"<=":return{gt:null,lt:[e.operator,e.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${e.operator})`)}}function S8(e){if(e.length===0)return null;let t=null,r=null;for(let s of e){if(s.gt){let a=t!==null?Op.default.compare(s.gt[1],t[1]):null;(a===null||a>0||a===0&&s.gt[0]===">")&&(t=s.gt)}if(s.lt){let a=r!==null?Op.default.compare(s.lt[1],r[1]):null;(a===null||a<0||a===0&&s.lt[0]==="<")&&(r=s.lt)}}if(t&&r){let s=Op.default.compare(t[1],r[1]);if(s===0&&(t[0]===">"||r[0]==="<")||s>0)return null}return{gt:t,lt:r}}function Hce(e){if(e.gt&&e.lt){if(e.gt[0]===">="&&e.lt[0]==="<="&&e.gt[1].version===e.lt[1].version)return e.gt[1].version;if(e.gt[0]===">="&&e.lt[0]==="<"){if(e.lt[1].version===`${e.gt[1].major+1}.0.0-0`)return`^${e.gt[1].version}`;if(e.lt[1].version===`${e.gt[1].major}.${e.gt[1].minor+1}.0-0`)return`~${e.gt[1].version}`}}let t=[];return e.gt&&t.push(e.gt[0]+e.gt[1].version),e.lt&&t.push(e.lt[0]+e.lt[1].version),t.length?t.join(" "):"*"}function b8(e){let t=e.map(mXe).map(s=>yl(s).set.map(a=>a.map(n=>_ce(n)))),r=t.shift().map(s=>S8(s)).filter(s=>s!==null);for(let s of t){let a=[];for(let n of r)for(let c of s){let f=S8([n,...c]);f!==null&&a.push(f)}r=a}return r.length===0?null:r.map(s=>Hce(s)).join(" || ")}function mXe(e){let t=e.split("||");if(t.length>1){let r=new Set;for(let s of t)t.some(a=>a!==s&&Op.default.subset(s,a))||r.add(s);if(r.size{Op=et(hi()),jce=et(hi()),Mce=new Map;Uce=new Map;dXe=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function Gce(e){let t=e.match(/^[ \t]+/m);return t?t[0]:" "}function qce(e){return e.charCodeAt(0)===65279?e.slice(1):e}function Ta(e){return e.replace(/\\/g,"/")}function LQ(e,{yamlCompatibilityMode:t}){return t?U4(e):typeof e>"u"||typeof e=="boolean"?e:null}function Yce(e,t){let r=t.search(/[^!]/);if(r===-1)return"invalid";let s=r%2===0?"":"!",a=t.slice(r);return`${s}${e}=${a}`}function D8(e,t){return t.length===1?Yce(e,t[0]):`(${t.map(r=>Yce(e,r)).join(" | ")})`}var Wce,_t,fI=Ze(()=>{bt();Sc();Wce=et(hi());rm();Qc();Lp();$o();_t=class e{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=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{this.fileName="package.json"}static{this.allDependencies=["dependencies","devDependencies","peerDependencies"]}static{this.hardDependencies=["dependencies","devDependencies"]}static async tryFind(t,{baseFs:r=new Kn}={}){let s=Y.join(t,"package.json");try{return await e.fromFile(s,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(t,{baseFs:r}={}){let s=await e.tryFind(t,{baseFs:r});if(s===null)throw new Error("Manifest not found");return s}static async fromFile(t,{baseFs:r=new Kn}={}){let s=new e;return await s.loadFile(t,{baseFs:r}),s}static fromText(t){let r=new e;return r.loadFromText(t),r}loadFromText(t){let r;try{r=JSON.parse(qce(t)||"{}")}catch(s){throw s.message+=` (when parsing ${t})`,s}this.load(r),this.indent=Gce(t)}async loadFile(t,{baseFs:r=new Kn}){let s=await r.readFilePromise(t,"utf8"),a;try{a=JSON.parse(qce(s)||"{}")}catch(n){throw n.message+=` (when parsing ${t})`,n}this.load(a),this.indent=Gce(s)}load(t,{yamlCompatibilityMode:r=!1}={}){if(typeof t!="object"||t===null)throw new Error(`Utterly invalid manifest data (${t})`);this.raw=t;let s=[];if(this.name=null,typeof t.name=="string")try{this.name=ka(t.name)}catch{s.push(new Error("Parsing failed for the 'name' field"))}if(typeof t.version=="string"?this.version=t.version:this.version=null,Array.isArray(t.os)){let n=[];this.os=n;for(let c of t.os)typeof c!="string"?s.push(new Error("Parsing failed for the 'os' field")):n.push(c)}else this.os=null;if(Array.isArray(t.cpu)){let n=[];this.cpu=n;for(let c of t.cpu)typeof c!="string"?s.push(new Error("Parsing failed for the 'cpu' field")):n.push(c)}else this.cpu=null;if(Array.isArray(t.libc)){let n=[];this.libc=n;for(let c of t.libc)typeof c!="string"?s.push(new Error("Parsing failed for the 'libc' field")):n.push(c)}else this.libc=null;if(typeof t.type=="string"?this.type=t.type:this.type=null,typeof t.packageManager=="string"?this.packageManager=t.packageManager:this.packageManager=null,typeof t.private=="boolean"?this.private=t.private:this.private=!1,typeof t.license=="string"?this.license=t.license:this.license=null,typeof t.languageName=="string"?this.languageName=t.languageName:this.languageName=null,typeof t.main=="string"?this.main=Ta(t.main):this.main=null,typeof t.module=="string"?this.module=Ta(t.module):this.module=null,t.browser!=null)if(typeof t.browser=="string")this.browser=Ta(t.browser);else{this.browser=new Map;for(let[n,c]of Object.entries(t.browser))this.browser.set(Ta(n),typeof c=="string"?Ta(c):c)}else this.browser=null;if(this.bin=new Map,typeof t.bin=="string")t.bin.trim()===""?s.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,Ta(t.bin)):s.push(new Error("String bin field, but no attached package name"));else if(typeof t.bin=="object"&&t.bin!==null)for(let[n,c]of Object.entries(t.bin)){if(typeof c!="string"||c.trim()===""){s.push(new Error(`Invalid bin definition for '${n}'`));continue}let f=ka(n);this.bin.set(f.name,Ta(c))}if(this.scripts=new Map,typeof t.scripts=="object"&&t.scripts!==null)for(let[n,c]of Object.entries(t.scripts)){if(typeof c!="string"){s.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,c)}if(this.dependencies=new Map,typeof t.dependencies=="object"&&t.dependencies!==null)for(let[n,c]of Object.entries(t.dependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=ka(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=Un(f,c);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof t.devDependencies=="object"&&t.devDependencies!==null)for(let[n,c]of Object.entries(t.devDependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=ka(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=Un(f,c);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof t.peerDependencies=="object"&&t.peerDependencies!==null)for(let[n,c]of Object.entries(t.peerDependencies)){let f;try{f=ka(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof c!="string"||!c.startsWith(Ii.protocol)&&!yl(c))&&(s.push(new Error(`Invalid dependency range for '${n}'`)),c="*");let p=Un(f,c);this.peerDependencies.set(p.identHash,p)}typeof t.workspaces=="object"&&t.workspaces!==null&&t.workspaces.nohoist&&s.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(t.workspaces)?t.workspaces:typeof t.workspaces=="object"&&t.workspaces!==null&&Array.isArray(t.workspaces.packages)?t.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){s.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof t.dependenciesMeta=="object"&&t.dependenciesMeta!==null)for(let[n,c]of Object.entries(t.dependenciesMeta)){if(typeof c!="object"||c===null){s.push(new Error(`Invalid meta field for '${n}`));continue}let f=Bd(n),p=this.ensureDependencyMeta(f),h=LQ(c.built,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=LQ(c.optional,{yamlCompatibilityMode:r});if(E===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}let C=LQ(c.unplugged,{yamlCompatibilityMode:r});if(C===null){s.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:C})}if(this.peerDependenciesMeta=new Map,typeof t.peerDependenciesMeta=="object"&&t.peerDependenciesMeta!==null)for(let[n,c]of Object.entries(t.peerDependenciesMeta)){if(typeof c!="object"||c===null){s.push(new Error(`Invalid meta field for '${n}'`));continue}let f=Bd(n),p=this.ensurePeerDependencyMeta(f),h=LQ(c.optional,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof t.resolutions=="object"&&t.resolutions!==null)for(let[n,c]of Object.entries(t.resolutions)){if(typeof c!="string"){s.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:Ex(n),reference:c})}catch(f){s.push(f);continue}}if(Array.isArray(t.files)){this.files=new Set;for(let n of t.files){if(typeof n!="string"){s.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof t.publishConfig=="object"&&t.publishConfig!==null){if(this.publishConfig={},typeof t.publishConfig.access=="string"&&(this.publishConfig.access=t.publishConfig.access),typeof t.publishConfig.main=="string"&&(this.publishConfig.main=Ta(t.publishConfig.main)),typeof t.publishConfig.module=="string"&&(this.publishConfig.module=Ta(t.publishConfig.module)),t.publishConfig.browser!=null)if(typeof t.publishConfig.browser=="string")this.publishConfig.browser=Ta(t.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,c]of Object.entries(t.publishConfig.browser))this.publishConfig.browser.set(Ta(n),typeof c=="string"?Ta(c):c)}if(typeof t.publishConfig.registry=="string"&&(this.publishConfig.registry=t.publishConfig.registry),typeof t.publishConfig.provenance=="boolean"&&(this.publishConfig.provenance=t.publishConfig.provenance),typeof t.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,Ta(t.publishConfig.bin)]]):s.push(new Error("String bin field, but no attached package name"));else if(typeof t.publishConfig.bin=="object"&&t.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,c]of Object.entries(t.publishConfig.bin)){if(typeof c!="string"){s.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,Ta(c))}}if(Array.isArray(t.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of t.publishConfig.executableFiles){if(typeof n!="string"){s.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(Ta(n))}}}else this.publishConfig=null;if(typeof t.installConfig=="object"&&t.installConfig!==null){this.installConfig={};for(let n of Object.keys(t.installConfig))n==="hoistingLimits"?typeof t.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=t.installConfig.hoistingLimits:s.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof t.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=t.installConfig.selfReferences:s.push(new Error("Invalid selfReferences definition, must be a boolean value")):s.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof t.optionalDependencies=="object"&&t.optionalDependencies!==null)for(let[n,c]of Object.entries(t.optionalDependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=ka(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=Un(f,c);this.dependencies.set(p.identHash,p);let h=Un(f,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof t.preferUnplugged=="boolean"?this.preferUnplugged=t.preferUnplugged:this.preferUnplugged=null,this.errors=s}getForScope(t){switch(t){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${t}")`)}}hasConsumerDependency(t){return!!(this.dependencies.has(t.identHash)||this.peerDependencies.has(t.identHash))}hasHardDependency(t){return!!(this.dependencies.has(t.identHash)||this.devDependencies.has(t.identHash))}hasSoftDependency(t){return!!this.peerDependencies.has(t.identHash)}hasDependency(t){return!!(this.hasHardDependency(t)||this.hasSoftDependency(t))}getConditions(){let t=[];return this.os&&this.os.length>0&&t.push(D8("os",this.os)),this.cpu&&this.cpu.length>0&&t.push(D8("cpu",this.cpu)),this.libc&&this.libc.length>0&&t.push(D8("libc",this.libc)),t.length>0?t.join(" & "):null}ensureDependencyMeta(t){if(t.range!=="unknown"&&!Wce.default.valid(t.range))throw new Error(`Invalid meta field range for '${gl(t)}'`);let r=fn(t),s=t.range!=="unknown"?t.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(s);return n||a.set(s,n={}),n}ensurePeerDependencyMeta(t){if(t.range!=="unknown")throw new Error(`Invalid meta field range for '${gl(t)}'`);let r=fn(t),s=this.peerDependenciesMeta.get(r);return s||this.peerDependenciesMeta.set(r,s={}),s}setRawField(t,r,{after:s=[]}={}){let a=new Set(s.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,t))this.raw[t]=r;else{let n=this.raw,c=this.raw={},f=!1;for(let p of Object.keys(n))c[p]=n[p],f||(a.delete(p),a.size===0&&(c[t]=r,f=!0))}}exportTo(t,{compatibilityMode:r=!0}={}){if(Object.assign(t,this.raw),this.name!==null?t.name=fn(this.name):delete t.name,this.version!==null?t.version=this.version:delete t.version,this.os!==null?t.os=this.os:delete t.os,this.cpu!==null?t.cpu=this.cpu:delete t.cpu,this.type!==null?t.type=this.type:delete t.type,this.packageManager!==null?t.packageManager=this.packageManager:delete t.packageManager,this.private?t.private=!0:delete t.private,this.license!==null?t.license=this.license:delete t.license,this.languageName!==null?t.languageName=this.languageName:delete t.languageName,this.main!==null?t.main=this.main:delete t.main,this.module!==null?t.module=this.module:delete t.module,this.browser!==null){let n=this.browser;typeof n=="string"?t.browser=n:n instanceof Map&&(t.browser=Object.assign({},...Array.from(n.keys()).sort().map(c=>({[c]:n.get(c)}))))}else delete t.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?t.bin=this.bin.get(this.name.name):this.bin.size>0?t.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete t.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?t.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:t.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?t.workspaces=this.raw.workspaces:delete t.workspaces;let s=[],a=[];for(let n of this.dependencies.values()){let c=this.dependenciesMeta.get(fn(n)),f=!1;if(r&&c){let p=c.get(null);p&&p.optional&&(f=!0)}f?a.push(n):s.push(n)}s.length>0?t.dependencies=Object.assign({},...uI(s).map(n=>({[fn(n)]:n.range}))):delete t.dependencies,a.length>0?t.optionalDependencies=Object.assign({},...uI(a).map(n=>({[fn(n)]:n.range}))):delete t.optionalDependencies,this.devDependencies.size>0?t.devDependencies=Object.assign({},...uI(this.devDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete t.devDependencies,this.peerDependencies.size>0?t.peerDependencies=Object.assign({},...uI(this.peerDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete t.peerDependencies,t.dependenciesMeta={};for(let[n,c]of Ks(this.dependenciesMeta.entries(),([f,p])=>f))for(let[f,p]of Ks(c.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=f!==null?gl(Un(ka(n),f)):n,E={...p};r&&f===null&&delete E.optional,Object.keys(E).length!==0&&(t.dependenciesMeta[h]=E)}if(Object.keys(t.dependenciesMeta).length===0&&delete t.dependenciesMeta,this.peerDependenciesMeta.size>0?t.peerDependenciesMeta=Object.assign({},...Ks(this.peerDependenciesMeta.entries(),([n,c])=>n).map(([n,c])=>({[n]:c}))):delete t.peerDependenciesMeta,this.resolutions.length>0?t.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:c})=>({[Ix(n)]:c}))):delete t.resolutions,this.files!==null?t.files=Array.from(this.files):delete t.files,this.preferUnplugged!==null?t.preferUnplugged=this.preferUnplugged:delete t.preferUnplugged,this.scripts!==null&&this.scripts.size>0){t.scripts??={};for(let n of Object.keys(t.scripts))this.scripts.has(n)||delete t.scripts[n];for(let[n,c]of this.scripts.entries())t.scripts[n]=c}else delete t.scripts;return t}}});function EXe(e){return typeof e.reportCode<"u"}var Vce,Kce,yXe,Lt,Io,Nc=Ze(()=>{Zl();Vce=Ce("stream"),Kce=Ce("string_decoder"),yXe=15,Lt=class extends Error{constructor(r,s,a){super(s);this.reportExtra=a;this.reportCode=r}};Io=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(t){this.cacheHits.add(t.locatorHash)}reportCacheMiss(t,r){this.cacheMisses.add(t.locatorHash)}static progressViaCounter(t){let r=0,s,a=new Promise(p=>{s=p}),n=p=>{let h=s;a=new Promise(E=>{s=E}),r=p,h()},c=(p=0)=>{n(r+1)},f=async function*(){for(;r{r=c}),a=v4(c=>{let f=r;s=new Promise(p=>{r=p}),t=c,f()},1e3/yXe),n=async function*(){for(;;)await s,yield{title:t}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(t,r){let s=this.reportProgress(t);try{return await r(t)}finally{s.stop()}}startProgressSync(t,r){let s=this.reportProgress(t);try{return r(t)}finally{s.stop()}}reportInfoOnce(t,r,s){let a=s&&s.key?s.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(t,r),s?.reportExtra?.(this))}reportWarningOnce(t,r,s){let a=s&&s.key?s.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(t,r),s?.reportExtra?.(this))}reportErrorOnce(t,r,s){let a=s&&s.key?s.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(t,r),s?.reportExtra?.(this))}reportExceptionOnce(t){EXe(t)?this.reportErrorOnce(t.reportCode,t.message,{key:t,reportExtra:t.reportExtra}):this.reportErrorOnce(1,t.stack||t.message,{key:t})}createStreamReporter(t=null){let r=new Vce.PassThrough,s=new Kce.StringDecoder,a="";return r.on("data",n=>{let c=s.write(n),f;do if(f=c.indexOf(` +`),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a="",t!==null?this.reportInfo(null,`${t} ${p}`):this.reportInfo(null,p)}while(f!==-1);a+=c}),r.on("end",()=>{let n=s.end();n!==""&&(t!==null?this.reportInfo(null,`${t} ${n}`):this.reportInfo(null,n))}),r}}});var AI,P8=Ze(()=>{Nc();$o();AI=class{constructor(t){this.fetchers=t}supports(t,r){return!!this.tryFetcher(t,r)}getLocalPath(t,r){return this.getFetcher(t,r).getLocalPath(t,r)}async fetch(t,r){return await this.getFetcher(t,r).fetch(t,r)}tryFetcher(t,r){let s=this.fetchers.find(a=>a.supports(t,r));return s||null}getFetcher(t,r){let s=this.fetchers.find(a=>a.supports(t,r));if(!s)throw new Lt(11,`${Vr(r.project.configuration,t)} isn't supported by any available fetcher`);return s}}});var nm,x8=Ze(()=>{$o();nm=class{constructor(t){this.resolvers=t.filter(r=>r)}supportsDescriptor(t,r){return!!this.tryResolverByDescriptor(t,r)}supportsLocator(t,r){return!!this.tryResolverByLocator(t,r)}shouldPersistResolution(t,r){return this.getResolverByLocator(t,r).shouldPersistResolution(t,r)}bindDescriptor(t,r,s){return this.getResolverByDescriptor(t,s).bindDescriptor(t,r,s)}getResolutionDependencies(t,r){return this.getResolverByDescriptor(t,r).getResolutionDependencies(t,r)}async getCandidates(t,r,s){return await this.getResolverByDescriptor(t,s).getCandidates(t,r,s)}async getSatisfying(t,r,s,a){return this.getResolverByDescriptor(t,a).getSatisfying(t,r,s,a)}async resolve(t,r){return await this.getResolverByLocator(t,r).resolve(t,r)}tryResolverByDescriptor(t,r){let s=this.resolvers.find(a=>a.supportsDescriptor(t,r));return s||null}getResolverByDescriptor(t,r){let s=this.resolvers.find(a=>a.supportsDescriptor(t,r));if(!s)throw new Error(`${ai(r.project.configuration,t)} isn't supported by any available resolver`);return s}tryResolverByLocator(t,r){let s=this.resolvers.find(a=>a.supportsLocator(t,r));return s||null}getResolverByLocator(t,r){let s=this.resolvers.find(a=>a.supportsLocator(t,r));if(!s)throw new Error(`${Vr(r.project.configuration,t)} isn't supported by any available resolver`);return s}}});var pI,k8=Ze(()=>{bt();$o();pI=class{supports(t){return!!t.reference.startsWith("virtual:")}getLocalPath(t,r){let s=t.reference.indexOf("#");if(s===-1)throw new Error("Invalid virtual package reference");let a=t.reference.slice(s+1),n=Js(t,a);return r.fetcher.getLocalPath(n,r)}async fetch(t,r){let s=t.reference.indexOf("#");if(s===-1)throw new Error("Invalid virtual package reference");let a=t.reference.slice(s+1),n=Js(t,a),c=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(t,c,r)}getLocatorFilename(t){return lI(t)}async ensureVirtualLink(t,r,s){let a=r.packageFs.getRealPath(),n=s.project.configuration.get("virtualFolder"),c=this.getLocatorFilename(t),f=Eo.makeVirtualPath(n,c,a),p=new Gf(f,{baseFs:r.packageFs,pathUtils:Y});return{...r,packageFs:p}}}});var MQ,Jce=Ze(()=>{MQ=class e{static{this.protocol="virtual:"}static isVirtualDescriptor(t){return!!t.range.startsWith(e.protocol)}static isVirtualLocator(t){return!!t.reference.startsWith(e.protocol)}supportsDescriptor(t,r){return e.isVirtualDescriptor(t)}supportsLocator(t,r){return e.isVirtualLocator(t)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(t,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(t,r,s){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(t,r,s,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(t,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}});var hI,Q8=Ze(()=>{bt();rm();hI=class{supports(t){return!!t.reference.startsWith(Ii.protocol)}getLocalPath(t,r){return this.getWorkspace(t,r).cwd}async fetch(t,r){let s=this.getWorkspace(t,r).cwd;return{packageFs:new Pn(s),prefixPath:wt.dot,localPath:s}}getWorkspace(t,r){return r.project.getWorkspaceByCwd(t.reference.slice(Ii.protocol.length))}}});function jB(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function zce(e){return typeof e>"u"?3:jB(e)?0:Array.isArray(e)?1:2}function F8(e,t){return Object.hasOwn(e,t)}function CXe(e){return jB(e)&&F8(e,"onConflict")&&typeof e.onConflict=="string"}function wXe(e){if(typeof e>"u")return{onConflict:"default",value:e};if(!CXe(e))return{onConflict:"default",value:e};if(F8(e,"value"))return e;let{onConflict:t,...r}=e;return{onConflict:t,value:r}}function Zce(e,t){let r=jB(e)&&F8(e,t)?e[t]:void 0;return wXe(r)}function dI(e,t){return[e,t,Xce]}function N8(e){return Array.isArray(e)?e[2]===Xce:!1}function T8(e,t){if(jB(e)){let r={};for(let s of Object.keys(e))r[s]=T8(e[s],t);return dI(t,r)}return Array.isArray(e)?dI(t,e.map(r=>T8(r,t))):dI(t,e)}function R8(e,t,r,s,a){let n,c=[],f=a,p=0;for(let E=a-1;E>=s;--E){let[C,S]=e[E],{onConflict:x,value:I}=Zce(S,r),R=zce(I);if(R!==3){if(n??=R,R!==n||x==="hardReset"){p=f;break}if(R===2)return dI(C,I);if(c.unshift([C,I]),x==="reset"){p=E;break}x==="extend"&&E===s&&(s=0),f=E}}if(typeof n>"u")return null;let h=c.map(([E])=>E).join(", ");switch(n){case 1:return dI(h,new Array().concat(...c.map(([E,C])=>C.map(S=>T8(S,E)))));case 0:{let E=Object.assign({},...c.map(([,R])=>R)),C=Object.keys(E),S={},x=e.map(([R,N])=>[R,Zce(N,r).value]),I=IXe(x,([R,N])=>{let U=zce(N);return U!==0&&U!==3});if(I!==-1){let R=x.slice(I+1);for(let N of C)S[N]=R8(R,t,N,0,R.length)}else for(let R of C)S[R]=R8(x,t,R,p,x.length);return dI(h,S)}default:throw new Error("Assertion failed: Non-extendable value type")}}function $ce(e){return R8(e.map(([t,r])=>[t,{".":r}]),[],".",0,e.length)}function GB(e){return N8(e)?e[1]:e}function UQ(e){let t=N8(e)?e[1]:e;if(Array.isArray(t))return t.map(r=>UQ(r));if(jB(t)){let r={};for(let[s,a]of Object.entries(t))r[s]=UQ(a);return r}return t}function O8(e){return N8(e)?e[0]:null}var IXe,Xce,eue=Ze(()=>{IXe=(e,t,r)=>{let s=[...e];return s.reverse(),s.findIndex(t,r)};Xce=Symbol()});var _Q={};Vt(_Q,{getDefaultGlobalFolder:()=>M8,getHomeFolder:()=>gI,isFolderInside:()=>U8});function M8(){if(process.platform==="win32"){let e=Ae.toPortablePath(process.env.LOCALAPPDATA||Ae.join((0,L8.homedir)(),"AppData","Local"));return Y.resolve(e,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let e=Ae.toPortablePath(process.env.XDG_DATA_HOME);return Y.resolve(e,"yarn/berry")}return Y.resolve(gI(),".yarn/berry")}function gI(){return Ae.toPortablePath((0,L8.homedir)()||"/usr/local/share")}function U8(e,t){let r=Y.relative(t,e);return r&&!r.startsWith("..")&&!Y.isAbsolute(r)}var L8,HQ=Ze(()=>{bt();L8=Ce("os")});var nue=G((gOt,rue)=>{"use strict";var _8=Ce("https"),H8=Ce("http"),{URL:tue}=Ce("url"),j8=class extends H8.Agent{constructor(t){let{proxy:r,proxyRequestOptions:s,...a}=t;super(a),this.proxy=typeof r=="string"?new tue(r):r,this.proxyRequestOptions=s||{}}createConnection(t,r){let s={...this.proxyRequestOptions,method:"CONNECT",host:this.proxy.hostname,port:this.proxy.port,path:`${t.host}:${t.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?"keep-alive":"close",host:`${t.host}:${t.port}`},agent:!1,timeout:t.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||"")}:${decodeURIComponent(this.proxy.password||"")}`).toString("base64");s.headers["proxy-authorization"]=`Basic ${n}`}this.proxy.protocol==="https:"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol==="http:"?H8:_8).request(s);a.once("connect",(n,c,f)=>{a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200?r(null,c):(c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null))}),a.once("timeout",()=>{a.destroy(new Error("Proxy timeout"))}),a.once("error",n=>{a.removeAllListeners(),r(n,null)}),a.end()}},G8=class extends _8.Agent{constructor(t){let{proxy:r,proxyRequestOptions:s,...a}=t;super(a),this.proxy=typeof r=="string"?new tue(r):r,this.proxyRequestOptions=s||{}}createConnection(t,r){let s={...this.proxyRequestOptions,method:"CONNECT",host:this.proxy.hostname,port:this.proxy.port,path:`${t.host}:${t.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?"keep-alive":"close",host:`${t.host}:${t.port}`},agent:!1,timeout:t.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||"")}:${decodeURIComponent(this.proxy.password||"")}`).toString("base64");s.headers["proxy-authorization"]=`Basic ${n}`}this.proxy.protocol==="https:"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol==="http:"?H8:_8).request(s);a.once("connect",(n,c,f)=>{if(a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200){let p=super.createConnection({...t,socket:c});r(null,p)}else c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null)}),a.once("timeout",()=>{a.destroy(new Error("Proxy timeout"))}),a.once("error",n=>{a.removeAllListeners(),r(n,null)}),a.end()}};rue.exports={HttpProxyAgent:j8,HttpsProxyAgent:G8}});var q8,iue,sue,oue=Ze(()=>{q8=et(nue(),1),iue=q8.default.HttpProxyAgent,sue=q8.default.HttpsProxyAgent});var Up=G((Mp,jQ)=>{"use strict";Object.defineProperty(Mp,"__esModule",{value:!0});var aue=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function vXe(e){return aue.includes(e)}var SXe=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Blob","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...aue];function bXe(e){return SXe.includes(e)}var DXe=["null","undefined","string","number","bigint","boolean","symbol"];function PXe(e){return DXe.includes(e)}function mI(e){return t=>typeof t===e}var{toString:lue}=Object.prototype,qB=e=>{let t=lue.call(e).slice(8,-1);if(/HTML\w+Element/.test(t)&&Pe.domElement(e))return"HTMLElement";if(bXe(t))return t},di=e=>t=>qB(t)===e;function Pe(e){if(e===null)return"null";switch(typeof e){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(Pe.observable(e))return"Observable";if(Pe.array(e))return"Array";if(Pe.buffer(e))return"Buffer";let t=qB(e);if(t)return t;if(e instanceof String||e instanceof Boolean||e instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Pe.undefined=mI("undefined");Pe.string=mI("string");var xXe=mI("number");Pe.number=e=>xXe(e)&&!Pe.nan(e);Pe.bigint=mI("bigint");Pe.function_=mI("function");Pe.null_=e=>e===null;Pe.class_=e=>Pe.function_(e)&&e.toString().startsWith("class ");Pe.boolean=e=>e===!0||e===!1;Pe.symbol=mI("symbol");Pe.numericString=e=>Pe.string(e)&&!Pe.emptyStringOrWhitespace(e)&&!Number.isNaN(Number(e));Pe.array=(e,t)=>Array.isArray(e)?Pe.function_(t)?e.every(t):!0:!1;Pe.buffer=e=>{var t,r,s,a;return(a=(s=(r=(t=e)===null||t===void 0?void 0:t.constructor)===null||r===void 0?void 0:r.isBuffer)===null||s===void 0?void 0:s.call(r,e))!==null&&a!==void 0?a:!1};Pe.blob=e=>di("Blob")(e);Pe.nullOrUndefined=e=>Pe.null_(e)||Pe.undefined(e);Pe.object=e=>!Pe.null_(e)&&(typeof e=="object"||Pe.function_(e));Pe.iterable=e=>{var t;return Pe.function_((t=e)===null||t===void 0?void 0:t[Symbol.iterator])};Pe.asyncIterable=e=>{var t;return Pe.function_((t=e)===null||t===void 0?void 0:t[Symbol.asyncIterator])};Pe.generator=e=>{var t,r;return Pe.iterable(e)&&Pe.function_((t=e)===null||t===void 0?void 0:t.next)&&Pe.function_((r=e)===null||r===void 0?void 0:r.throw)};Pe.asyncGenerator=e=>Pe.asyncIterable(e)&&Pe.function_(e.next)&&Pe.function_(e.throw);Pe.nativePromise=e=>di("Promise")(e);var kXe=e=>{var t,r;return Pe.function_((t=e)===null||t===void 0?void 0:t.then)&&Pe.function_((r=e)===null||r===void 0?void 0:r.catch)};Pe.promise=e=>Pe.nativePromise(e)||kXe(e);Pe.generatorFunction=di("GeneratorFunction");Pe.asyncGeneratorFunction=e=>qB(e)==="AsyncGeneratorFunction";Pe.asyncFunction=e=>qB(e)==="AsyncFunction";Pe.boundFunction=e=>Pe.function_(e)&&!e.hasOwnProperty("prototype");Pe.regExp=di("RegExp");Pe.date=di("Date");Pe.error=di("Error");Pe.map=e=>di("Map")(e);Pe.set=e=>di("Set")(e);Pe.weakMap=e=>di("WeakMap")(e);Pe.weakSet=e=>di("WeakSet")(e);Pe.int8Array=di("Int8Array");Pe.uint8Array=di("Uint8Array");Pe.uint8ClampedArray=di("Uint8ClampedArray");Pe.int16Array=di("Int16Array");Pe.uint16Array=di("Uint16Array");Pe.int32Array=di("Int32Array");Pe.uint32Array=di("Uint32Array");Pe.float32Array=di("Float32Array");Pe.float64Array=di("Float64Array");Pe.bigInt64Array=di("BigInt64Array");Pe.bigUint64Array=di("BigUint64Array");Pe.arrayBuffer=di("ArrayBuffer");Pe.sharedArrayBuffer=di("SharedArrayBuffer");Pe.dataView=di("DataView");Pe.enumCase=(e,t)=>Object.values(t).includes(e);Pe.directInstanceOf=(e,t)=>Object.getPrototypeOf(e)===t.prototype;Pe.urlInstance=e=>di("URL")(e);Pe.urlString=e=>{if(!Pe.string(e))return!1;try{return new URL(e),!0}catch{return!1}};Pe.truthy=e=>!!e;Pe.falsy=e=>!e;Pe.nan=e=>Number.isNaN(e);Pe.primitive=e=>Pe.null_(e)||PXe(typeof e);Pe.integer=e=>Number.isInteger(e);Pe.safeInteger=e=>Number.isSafeInteger(e);Pe.plainObject=e=>{if(lue.call(e)!=="[object Object]")return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.getPrototypeOf({})};Pe.typedArray=e=>vXe(qB(e));var QXe=e=>Pe.safeInteger(e)&&e>=0;Pe.arrayLike=e=>!Pe.nullOrUndefined(e)&&!Pe.function_(e)&&QXe(e.length);Pe.inRange=(e,t)=>{if(Pe.number(t))return e>=Math.min(0,t)&&e<=Math.max(t,0);if(Pe.array(t)&&t.length===2)return e>=Math.min(...t)&&e<=Math.max(...t);throw new TypeError(`Invalid range: ${JSON.stringify(t)}`)};var TXe=1,RXe=["innerHTML","ownerDocument","style","attributes","nodeValue"];Pe.domElement=e=>Pe.object(e)&&e.nodeType===TXe&&Pe.string(e.nodeName)&&!Pe.plainObject(e)&&RXe.every(t=>t in e);Pe.observable=e=>{var t,r,s,a;return e?e===((r=(t=e)[Symbol.observable])===null||r===void 0?void 0:r.call(t))||e===((a=(s=e)["@@observable"])===null||a===void 0?void 0:a.call(s)):!1};Pe.nodeStream=e=>Pe.object(e)&&Pe.function_(e.pipe)&&!Pe.observable(e);Pe.infinite=e=>e===1/0||e===-1/0;var cue=e=>t=>Pe.integer(t)&&Math.abs(t%2)===e;Pe.evenInteger=cue(0);Pe.oddInteger=cue(1);Pe.emptyArray=e=>Pe.array(e)&&e.length===0;Pe.nonEmptyArray=e=>Pe.array(e)&&e.length>0;Pe.emptyString=e=>Pe.string(e)&&e.length===0;var FXe=e=>Pe.string(e)&&!/\S/.test(e);Pe.emptyStringOrWhitespace=e=>Pe.emptyString(e)||FXe(e);Pe.nonEmptyString=e=>Pe.string(e)&&e.length>0;Pe.nonEmptyStringAndNotWhitespace=e=>Pe.string(e)&&!Pe.emptyStringOrWhitespace(e);Pe.emptyObject=e=>Pe.object(e)&&!Pe.map(e)&&!Pe.set(e)&&Object.keys(e).length===0;Pe.nonEmptyObject=e=>Pe.object(e)&&!Pe.map(e)&&!Pe.set(e)&&Object.keys(e).length>0;Pe.emptySet=e=>Pe.set(e)&&e.size===0;Pe.nonEmptySet=e=>Pe.set(e)&&e.size>0;Pe.emptyMap=e=>Pe.map(e)&&e.size===0;Pe.nonEmptyMap=e=>Pe.map(e)&&e.size>0;Pe.propertyKey=e=>Pe.any([Pe.string,Pe.number,Pe.symbol],e);Pe.formData=e=>di("FormData")(e);Pe.urlSearchParams=e=>di("URLSearchParams")(e);var uue=(e,t,r)=>{if(!Pe.function_(t))throw new TypeError(`Invalid predicate: ${JSON.stringify(t)}`);if(r.length===0)throw new TypeError("Invalid number of values");return e.call(r,t)};Pe.any=(e,...t)=>(Pe.array(e)?e:[e]).some(s=>uue(Array.prototype.some,s,t));Pe.all=(e,...t)=>uue(Array.prototype.every,e,t);var Ht=(e,t,r,s={})=>{if(!e){let{multipleValues:a}=s,n=a?`received values of types ${[...new Set(r.map(c=>`\`${Pe(c)}\``))].join(", ")}`:`received value of type \`${Pe(r)}\``;throw new TypeError(`Expected value which is \`${t}\`, ${n}.`)}};Mp.assert={undefined:e=>Ht(Pe.undefined(e),"undefined",e),string:e=>Ht(Pe.string(e),"string",e),number:e=>Ht(Pe.number(e),"number",e),bigint:e=>Ht(Pe.bigint(e),"bigint",e),function_:e=>Ht(Pe.function_(e),"Function",e),null_:e=>Ht(Pe.null_(e),"null",e),class_:e=>Ht(Pe.class_(e),"Class",e),boolean:e=>Ht(Pe.boolean(e),"boolean",e),symbol:e=>Ht(Pe.symbol(e),"symbol",e),numericString:e=>Ht(Pe.numericString(e),"string with a number",e),array:(e,t)=>{Ht(Pe.array(e),"Array",e),t&&e.forEach(t)},buffer:e=>Ht(Pe.buffer(e),"Buffer",e),blob:e=>Ht(Pe.blob(e),"Blob",e),nullOrUndefined:e=>Ht(Pe.nullOrUndefined(e),"null or undefined",e),object:e=>Ht(Pe.object(e),"Object",e),iterable:e=>Ht(Pe.iterable(e),"Iterable",e),asyncIterable:e=>Ht(Pe.asyncIterable(e),"AsyncIterable",e),generator:e=>Ht(Pe.generator(e),"Generator",e),asyncGenerator:e=>Ht(Pe.asyncGenerator(e),"AsyncGenerator",e),nativePromise:e=>Ht(Pe.nativePromise(e),"native Promise",e),promise:e=>Ht(Pe.promise(e),"Promise",e),generatorFunction:e=>Ht(Pe.generatorFunction(e),"GeneratorFunction",e),asyncGeneratorFunction:e=>Ht(Pe.asyncGeneratorFunction(e),"AsyncGeneratorFunction",e),asyncFunction:e=>Ht(Pe.asyncFunction(e),"AsyncFunction",e),boundFunction:e=>Ht(Pe.boundFunction(e),"Function",e),regExp:e=>Ht(Pe.regExp(e),"RegExp",e),date:e=>Ht(Pe.date(e),"Date",e),error:e=>Ht(Pe.error(e),"Error",e),map:e=>Ht(Pe.map(e),"Map",e),set:e=>Ht(Pe.set(e),"Set",e),weakMap:e=>Ht(Pe.weakMap(e),"WeakMap",e),weakSet:e=>Ht(Pe.weakSet(e),"WeakSet",e),int8Array:e=>Ht(Pe.int8Array(e),"Int8Array",e),uint8Array:e=>Ht(Pe.uint8Array(e),"Uint8Array",e),uint8ClampedArray:e=>Ht(Pe.uint8ClampedArray(e),"Uint8ClampedArray",e),int16Array:e=>Ht(Pe.int16Array(e),"Int16Array",e),uint16Array:e=>Ht(Pe.uint16Array(e),"Uint16Array",e),int32Array:e=>Ht(Pe.int32Array(e),"Int32Array",e),uint32Array:e=>Ht(Pe.uint32Array(e),"Uint32Array",e),float32Array:e=>Ht(Pe.float32Array(e),"Float32Array",e),float64Array:e=>Ht(Pe.float64Array(e),"Float64Array",e),bigInt64Array:e=>Ht(Pe.bigInt64Array(e),"BigInt64Array",e),bigUint64Array:e=>Ht(Pe.bigUint64Array(e),"BigUint64Array",e),arrayBuffer:e=>Ht(Pe.arrayBuffer(e),"ArrayBuffer",e),sharedArrayBuffer:e=>Ht(Pe.sharedArrayBuffer(e),"SharedArrayBuffer",e),dataView:e=>Ht(Pe.dataView(e),"DataView",e),enumCase:(e,t)=>Ht(Pe.enumCase(e,t),"EnumCase",e),urlInstance:e=>Ht(Pe.urlInstance(e),"URL",e),urlString:e=>Ht(Pe.urlString(e),"string with a URL",e),truthy:e=>Ht(Pe.truthy(e),"truthy",e),falsy:e=>Ht(Pe.falsy(e),"falsy",e),nan:e=>Ht(Pe.nan(e),"NaN",e),primitive:e=>Ht(Pe.primitive(e),"primitive",e),integer:e=>Ht(Pe.integer(e),"integer",e),safeInteger:e=>Ht(Pe.safeInteger(e),"integer",e),plainObject:e=>Ht(Pe.plainObject(e),"plain object",e),typedArray:e=>Ht(Pe.typedArray(e),"TypedArray",e),arrayLike:e=>Ht(Pe.arrayLike(e),"array-like",e),domElement:e=>Ht(Pe.domElement(e),"HTMLElement",e),observable:e=>Ht(Pe.observable(e),"Observable",e),nodeStream:e=>Ht(Pe.nodeStream(e),"Node.js Stream",e),infinite:e=>Ht(Pe.infinite(e),"infinite number",e),emptyArray:e=>Ht(Pe.emptyArray(e),"empty array",e),nonEmptyArray:e=>Ht(Pe.nonEmptyArray(e),"non-empty array",e),emptyString:e=>Ht(Pe.emptyString(e),"empty string",e),emptyStringOrWhitespace:e=>Ht(Pe.emptyStringOrWhitespace(e),"empty string or whitespace",e),nonEmptyString:e=>Ht(Pe.nonEmptyString(e),"non-empty string",e),nonEmptyStringAndNotWhitespace:e=>Ht(Pe.nonEmptyStringAndNotWhitespace(e),"non-empty string and not whitespace",e),emptyObject:e=>Ht(Pe.emptyObject(e),"empty object",e),nonEmptyObject:e=>Ht(Pe.nonEmptyObject(e),"non-empty object",e),emptySet:e=>Ht(Pe.emptySet(e),"empty set",e),nonEmptySet:e=>Ht(Pe.nonEmptySet(e),"non-empty set",e),emptyMap:e=>Ht(Pe.emptyMap(e),"empty map",e),nonEmptyMap:e=>Ht(Pe.nonEmptyMap(e),"non-empty map",e),propertyKey:e=>Ht(Pe.propertyKey(e),"PropertyKey",e),formData:e=>Ht(Pe.formData(e),"FormData",e),urlSearchParams:e=>Ht(Pe.urlSearchParams(e),"URLSearchParams",e),evenInteger:e=>Ht(Pe.evenInteger(e),"even integer",e),oddInteger:e=>Ht(Pe.oddInteger(e),"odd integer",e),directInstanceOf:(e,t)=>Ht(Pe.directInstanceOf(e,t),"T",e),inRange:(e,t)=>Ht(Pe.inRange(e,t),"in range",e),any:(e,...t)=>Ht(Pe.any(e,...t),"predicate returns truthy for any value",t,{multipleValues:!0}),all:(e,...t)=>Ht(Pe.all(e,...t),"predicate returns truthy for all values",t,{multipleValues:!0})};Object.defineProperties(Pe,{class:{value:Pe.class_},function:{value:Pe.function_},null:{value:Pe.null_}});Object.defineProperties(Mp.assert,{class:{value:Mp.assert.class_},function:{value:Mp.assert.function_},null:{value:Mp.assert.null_}});Mp.default=Pe;jQ.exports=Pe;jQ.exports.default=Pe;jQ.exports.assert=Mp.assert});var fue=G((yOt,Y8)=>{"use strict";var GQ=class extends Error{constructor(t){super(t||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},qQ=class e{static fn(t){return(...r)=>new e((s,a,n)=>{r.push(n),t(...r).then(s,a)})}constructor(t){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,s)=>{this._reject=s;let a=f=>{this._isPending=!1,r(f)},n=f=>{this._isPending=!1,s(f)},c=f=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(f)};return Object.defineProperties(c,{shouldReject:{get:()=>this._rejectOnCancel,set:f=>{this._rejectOnCancel=f}}}),t(a,n,c)})}then(t,r){return this._promise.then(t,r)}catch(t){return this._promise.catch(t)}finally(t){return this._promise.finally(t)}cancel(t){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 GQ(t))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(qQ.prototype,Promise.prototype);Y8.exports=qQ;Y8.exports.CancelError=GQ});var Aue=G((V8,K8)=>{"use strict";Object.defineProperty(V8,"__esModule",{value:!0});function NXe(e){return e.encrypted}var W8=(e,t)=>{let r;typeof t=="function"?r={connect:t}:r=t;let s=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",c=()=>{s&&r.connect(),NXe(e)&&a&&(e.authorized?r.secureConnect():e.authorizationError||e.once("secureConnect",r.secureConnect)),n&&e.once("close",r.close)};e.writable&&!e.connecting?c():e.connecting?e.once("connect",c):e.destroyed&&n&&r.close(e._hadError)};V8.default=W8;K8.exports=W8;K8.exports.default=W8});var pue=G((z8,Z8)=>{"use strict";Object.defineProperty(z8,"__esModule",{value:!0});var OXe=Aue(),LXe=Number(process.versions.node.split(".")[0]),J8=e=>{let t={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}};e.timings=t;let r=c=>{let f=c.emit.bind(c);c.emit=(p,...h)=>(p==="error"&&(t.error=Date.now(),t.phases.total=t.error-t.start,c.emit=f),f(p,...h))};r(e),e.prependOnceListener("abort",()=>{t.abort=Date.now(),(!t.response||LXe>=13)&&(t.phases.total=Date.now()-t.start)});let s=c=>{t.socket=Date.now(),t.phases.wait=t.socket-t.start;let f=()=>{t.lookup=Date.now(),t.phases.dns=t.lookup-t.socket};c.prependOnceListener("lookup",f),OXe.default(c,{connect:()=>{t.connect=Date.now(),t.lookup===void 0&&(c.removeListener("lookup",f),t.lookup=t.connect,t.phases.dns=t.lookup-t.socket),t.phases.tcp=t.connect-t.lookup},secureConnect:()=>{t.secureConnect=Date.now(),t.phases.tls=t.secureConnect-t.connect}})};e.socket?s(e.socket):e.prependOnceListener("socket",s);let a=()=>{var c;t.upload=Date.now(),t.phases.request=t.upload-(c=t.secureConnect,c??t.connect)};return(typeof e.writableFinished=="boolean"?e.writableFinished:e.finished&&e.outputSize===0&&(!e.socket||e.socket.writableLength===0))?a():e.prependOnceListener("finish",a),e.prependOnceListener("response",c=>{t.response=Date.now(),t.phases.firstByte=t.response-t.upload,c.timings=t,r(c),c.prependOnceListener("end",()=>{t.end=Date.now(),t.phases.download=t.end-t.response,t.phases.total=t.end-t.start})}),t};z8.default=J8;Z8.exports=J8;Z8.exports.default=J8});var Iue=G((EOt,eH)=>{"use strict";var{V4MAPPED:MXe,ADDRCONFIG:UXe,ALL:Eue,promises:{Resolver:hue},lookup:_Xe}=Ce("dns"),{promisify:X8}=Ce("util"),HXe=Ce("os"),yI=Symbol("cacheableLookupCreateConnection"),$8=Symbol("cacheableLookupInstance"),due=Symbol("expires"),jXe=typeof Eue=="number",gue=e=>{if(!(e&&typeof e.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},GXe=e=>{for(let t of e)t.family!==6&&(t.address=`::ffff:${t.address}`,t.family=6)},mue=()=>{let e=!1,t=!1;for(let r of Object.values(HXe.networkInterfaces()))for(let s of r)if(!s.internal&&(s.family==="IPv6"?t=!0:e=!0,e&&t))return{has4:e,has6:t};return{has4:e,has6:t}},qXe=e=>Symbol.iterator in e,yue={ttl:!0},YXe={all:!0},YQ=class{constructor({cache:t=new Map,maxTtl:r=1/0,fallbackDuration:s=3600,errorTtl:a=.15,resolver:n=new hue,lookup:c=_Xe}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=t,this._resolver=n,this._dnsLookup=X8(c),this._resolver instanceof hue?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=X8(this._resolver.resolve4.bind(this._resolver)),this._resolve6=X8(this._resolver.resolve6.bind(this._resolver))),this._iface=mue(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,s<1)this._fallback=!1;else{this._fallback=!0;let f=setInterval(()=>{this._hostnamesToFallback.clear()},s*1e3);f.unref&&f.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(t){this.clear(),this._resolver.setServers(t)}get servers(){return this._resolver.getServers()}lookup(t,r,s){if(typeof r=="function"?(s=r,r={}):typeof r=="number"&&(r={family:r}),!s)throw new Error("Callback must be a function.");this.lookupAsync(t,r).then(a=>{r.all?s(null,a):s(null,a.address,a.family,a.expires,a.ttl)},s)}async lookupAsync(t,r={}){typeof r=="number"&&(r={family:r});let s=await this.query(t);if(r.family===6){let a=s.filter(n=>n.family===6);r.hints&MXe&&(jXe&&r.hints&Eue||a.length===0)?GXe(s):s=a}else r.family===4&&(s=s.filter(a=>a.family===4));if(r.hints&UXe){let{_iface:a}=this;s=s.filter(n=>n.family===6?a.has6:a.has4)}if(s.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${t}`);throw a.code="ENOTFOUND",a.hostname=t,a}return r.all?s:s[0]}async query(t){let r=await this._cache.get(t);if(!r){let s=this._pending[t];if(s)r=await s;else{let a=this.queryAndCache(t);this._pending[t]=a,r=await a}}return r=r.map(s=>({...s})),r}async _resolve(t){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[s,a]=await Promise.all([this._resolve4(t,yue),this._resolve6(t,yue)].map(h=>r(h))),n=0,c=0,f=0,p=Date.now();for(let h of s)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,c=Math.max(c,h.ttl);return s.length>0?a.length>0?f=Math.min(n,c):f=n:f=c,{entries:[...s,...a],cacheTtl:f}}async _lookup(t){try{return{entries:await this._dnsLookup(t,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(t,r,s){if(this.maxTtl>0&&s>0){s=Math.min(s,this.maxTtl)*1e3,r[due]=Date.now()+s;try{await this._cache.set(t,r,s)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}qXe(this._cache)&&this._tick(s)}}async queryAndCache(t){if(this._hostnamesToFallback.has(t))return this._dnsLookup(t,YXe);try{let r=await this._resolve(t);r.entries.length===0&&this._fallback&&(r=await this._lookup(t),r.entries.length!==0&&this._hostnamesToFallback.add(t));let s=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(t,r.entries,s),delete this._pending[t],r.entries}catch(r){throw delete this._pending[t],r}}_tick(t){let r=this._nextRemovalTime;(!r||t{this._nextRemovalTime=!1;let s=1/0,a=Date.now();for(let[n,c]of this._cache){let f=c[due];a>=f?this._cache.delete(n):f("lookup"in r||(r.lookup=this.lookup),t[yI](r,s))}uninstall(t){if(gue(t),t[yI]){if(t[$8]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");t.createConnection=t[yI],delete t[yI],delete t[$8]}}updateInterfaceInfo(){let{_iface:t}=this;this._iface=mue(),(t.has4&&!this._iface.has4||t.has6&&!this._iface.has6)&&this._cache.clear()}clear(t){if(t){this._cache.delete(t);return}this._cache.clear()}};eH.exports=YQ;eH.exports.default=YQ});var Bue=G((IOt,tH)=>{"use strict";var WXe=typeof URL>"u"?Ce("url").URL:URL,VXe="text/plain",KXe="us-ascii",Cue=(e,t)=>t.some(r=>r instanceof RegExp?r.test(e):r===e),JXe=(e,{stripHash:t})=>{let r=e.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${e}`);let s=r[1].split(";"),a=r[2],n=t?"":r[3],c=!1;s[s.length-1]==="base64"&&(s.pop(),c=!0);let f=(s.shift()||"").toLowerCase(),h=[...s.map(E=>{let[C,S=""]=E.split("=").map(x=>x.trim());return C==="charset"&&(S=S.toLowerCase(),S===KXe)?"":`${C}${S?`=${S}`:""}`}).filter(Boolean)];return c&&h.push("base64"),(h.length!==0||f&&f!==VXe)&&h.unshift(f),`data:${h.join(";")},${c?a.trim():a}${n?`#${n}`:""}`},wue=(e,t)=>{if(t={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...t},Reflect.has(t,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(t,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(t,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(e=e.trim(),/^data:/i.test(e))return JXe(e,t);let r=e.startsWith("//");!r&&/^\.*\//.test(e)||(e=e.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,t.defaultProtocol));let a=new WXe(e);if(t.forceHttp&&t.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(t.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),t.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),t.stripAuthentication&&(a.username="",a.password=""),t.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,c)=>/^(?!\/)/g.test(c)?`${c}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),t.removeDirectoryIndex===!0&&(t.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(t.removeDirectoryIndex)&&t.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),c=n[n.length-1];Cue(c,t.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),t.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(t.removeQueryParameters))for(let n of[...a.searchParams.keys()])Cue(n,t.removeQueryParameters)&&a.searchParams.delete(n);return t.sortQueryParameters&&a.searchParams.sort(),t.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),e=a.toString(),(t.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(e=e.replace(/\/$/,"")),r&&!t.normalizeProtocol&&(e=e.replace(/^http:\/\//,"//")),t.stripProtocol&&(e=e.replace(/^(?:https?:)?\/\//,"")),e};tH.exports=wue;tH.exports.default=wue});var bue=G((COt,Sue)=>{Sue.exports=vue;function vue(e,t){if(e&&t)return vue(e)(t);if(typeof e!="function")throw new TypeError("need wrapper function");return Object.keys(e).forEach(function(s){r[s]=e[s]}),r;function r(){for(var s=new Array(arguments.length),a=0;a{var Due=bue();rH.exports=Due(WQ);rH.exports.strict=Due(Pue);WQ.proto=WQ(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return WQ(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return Pue(this)},configurable:!0})});function WQ(e){var t=function(){return t.called?t.value:(t.called=!0,t.value=e.apply(this,arguments))};return t.called=!1,t}function Pue(e){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=e.apply(this,arguments)},r=e.name||"Function wrapped with `once`";return t.onceError=r+" shouldn't be called more than once",t.called=!1,t}});var iH=G((BOt,kue)=>{var zXe=nH(),ZXe=function(){},XXe=function(e){return e.setHeader&&typeof e.abort=="function"},$Xe=function(e){return e.stdio&&Array.isArray(e.stdio)&&e.stdio.length===3},xue=function(e,t,r){if(typeof t=="function")return xue(e,null,t);t||(t={}),r=zXe(r||ZXe);var s=e._writableState,a=e._readableState,n=t.readable||t.readable!==!1&&e.readable,c=t.writable||t.writable!==!1&&e.writable,f=function(){e.writable||p()},p=function(){c=!1,n||r.call(e)},h=function(){n=!1,c||r.call(e)},E=function(I){r.call(e,I?new Error("exited with error code: "+I):null)},C=function(I){r.call(e,I)},S=function(){if(n&&!(a&&a.ended))return r.call(e,new Error("premature close"));if(c&&!(s&&s.ended))return r.call(e,new Error("premature close"))},x=function(){e.req.on("finish",p)};return XXe(e)?(e.on("complete",p),e.on("abort",S),e.req?x():e.on("request",x)):c&&!s&&(e.on("end",f),e.on("close",f)),$Xe(e)&&e.on("exit",E),e.on("end",h),e.on("finish",p),t.error!==!1&&e.on("error",C),e.on("close",S),function(){e.removeListener("complete",p),e.removeListener("abort",S),e.removeListener("request",x),e.req&&e.req.removeListener("finish",p),e.removeListener("end",f),e.removeListener("close",f),e.removeListener("finish",p),e.removeListener("exit",E),e.removeListener("end",h),e.removeListener("error",C),e.removeListener("close",S)}};kue.exports=xue});var Rue=G((vOt,Tue)=>{var e$e=nH(),t$e=iH(),sH=Ce("fs"),YB=function(){},r$e=/^v?\.0/.test(process.version),VQ=function(e){return typeof e=="function"},n$e=function(e){return!r$e||!sH?!1:(e instanceof(sH.ReadStream||YB)||e instanceof(sH.WriteStream||YB))&&VQ(e.close)},i$e=function(e){return e.setHeader&&VQ(e.abort)},s$e=function(e,t,r,s){s=e$e(s);var a=!1;e.on("close",function(){a=!0}),t$e(e,{readable:t,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,n$e(e))return e.close(YB);if(i$e(e))return e.abort();if(VQ(e.destroy))return e.destroy();s(c||new Error("stream was destroyed"))}}},Que=function(e){e()},o$e=function(e,t){return e.pipe(t)},a$e=function(){var e=Array.prototype.slice.call(arguments),t=VQ(e[e.length-1]||YB)&&e.pop()||YB;if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new Error("pump requires two streams per minimum");var r,s=e.map(function(a,n){var c=n0;return s$e(a,c,f,function(p){r||(r=p),p&&s.forEach(Que),!c&&(s.forEach(Que),t(r))})});return e.reduce(o$e)};Tue.exports=a$e});var Nue=G((SOt,Fue)=>{"use strict";var{PassThrough:l$e}=Ce("stream");Fue.exports=e=>{e={...e};let{array:t}=e,{encoding:r}=e,s=r==="buffer",a=!1;t?a=!(r||s):r=r||"utf8",s&&(r=null);let n=new l$e({objectMode:a});r&&n.setEncoding(r);let c=0,f=[];return n.on("data",p=>{f.push(p),a?c=f.length:c+=p.length}),n.getBufferedValue=()=>t?f:s?Buffer.concat(f,c):f.join(""),n.getBufferedLength=()=>c,n}});var Oue=G((bOt,EI)=>{"use strict";var c$e=Rue(),u$e=Nue(),KQ=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function JQ(e,t){if(!e)return Promise.reject(new Error("Expected a stream"));t={maxBuffer:1/0,...t};let{maxBuffer:r}=t,s;return await new Promise((a,n)=>{let c=f=>{f&&(f.bufferedData=s.getBufferedValue()),n(f)};s=c$e(e,u$e(t),f=>{if(f){c(f);return}a()}),s.on("data",()=>{s.getBufferedLength()>r&&c(new KQ)})}),s.getBufferedValue()}EI.exports=JQ;EI.exports.default=JQ;EI.exports.buffer=(e,t)=>JQ(e,{...t,encoding:"buffer"});EI.exports.array=(e,t)=>JQ(e,{...t,array:!0});EI.exports.MaxBufferError=KQ});var Mue=G((POt,Lue)=>{"use strict";var f$e=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),A$e=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),p$e=new Set([500,502,503,504]),h$e={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},d$e={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function im(e){let t=parseInt(e,10);return isFinite(t)?t:0}function g$e(e){return e?p$e.has(e.status):!0}function oH(e){let t={};if(!e)return t;let r=e.trim().split(/,/);for(let s of r){let[a,n]=s.split(/=/,2);t[a.trim()]=n===void 0?!0:n.trim().replace(/^"|"$/g,"")}return t}function m$e(e){let t=[];for(let r in e){let s=e[r];t.push(s===!0?r:r+"="+s)}if(t.length)return t.join(", ")}Lue.exports=class{constructor(t,r,{shared:s,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:c,_fromObject:f}={}){if(f){this._fromObject(f);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(t),this._responseTime=this.now(),this._isShared=s!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=oH(r.headers["cache-control"]),this._method="method"in t?t.method:"GET",this._url=t.url,this._host=t.headers.host,this._noAuthorization=!t.headers.authorization,this._reqHeaders=r.headers.vary?t.headers:null,this._reqcc=oH(t.headers["cache-control"]),c&&"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":m$e(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/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())&&A$e.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||f$e.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(t){if(!t||!t.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(t){this._assertRequestHasHeaders(t);let r=oH(t.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(t.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(t,!1)}_requestMatches(t,r){return(!this._url||this._url===t.url)&&this._host===t.headers.host&&(!t.method||this._method===t.method||r&&t.method==="HEAD")&&this._varyMatches(t)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(t){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let s of r)if(t.headers[s]!==this._reqHeaders[s])return!1;return!0}_copyWithoutHopByHopHeaders(t){let r={};for(let s in t)h$e[s]||(r[s]=t[s]);if(t.connection){let s=t.connection.trim().split(/\s*,\s*/);for(let a of s)delete r[a]}if(r.warning){let s=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));s.length?r.warning=s.join(",").trim():delete r.warning}return r}responseHeaders(){let t=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(t.warning=(t.warning?`${t.warning}, `:"")+'113 - "rfc7234 5.5.4"'),t.age=`${Math.round(r)}`,t.date=new Date(this.now()).toUTCString(),t}date(){let t=Date.parse(this._resHeaders.date);return isFinite(t)?t:this._responseTime}age(){let t=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return t+r}_ageValue(){return im(this._resHeaders.age)}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 im(this._rescc["s-maxage"])}if(this._rescc["max-age"])return im(this._rescc["max-age"]);let t=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let s=Date.parse(this._resHeaders.expires);return Number.isNaN(s)||ss)return Math.max(t,(r-s)/1e3*this._cacheHeuristic)}return t}timeToLive(){let t=this.maxAge()-this.age(),r=t+im(this._rescc["stale-if-error"]),s=t+im(this._rescc["stale-while-revalidate"]);return Math.max(0,t,r,s)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+im(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+im(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(t){return new this(void 0,void 0,{_fromObject:t})}_fromObject(t){if(this._responseTime)throw Error("Reinitialized");if(!t||t.v!==1)throw Error("Invalid serialization");this._responseTime=t.t,this._isShared=t.sh,this._cacheHeuristic=t.ch,this._immutableMinTtl=t.imm!==void 0?t.imm:24*3600*1e3,this._status=t.st,this._resHeaders=t.resh,this._rescc=t.rescc,this._method=t.m,this._url=t.u,this._host=t.h,this._noAuthorization=t.a,this._reqHeaders=t.reqh,this._reqcc=t.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(t){this._assertRequestHasHeaders(t);let r=this._copyWithoutHopByHopHeaders(t.headers);if(delete r["if-range"],!this._requestMatches(t,!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 a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.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(t,r){if(this._assertRequestHasHeaders(t),this._useStaleIfError()&&g$e(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let s=!1;if(r.status!==void 0&&r.status!=304?s=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?s=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?s=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?s=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(s=!0),!s)return{policy:new this.constructor(t,r),modified:r.status!=304,matches:!1};let a={};for(let c in this._resHeaders)a[c]=c in r.headers&&!d$e[c]?r.headers[c]:this._resHeaders[c];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(t,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var zQ=G((xOt,Uue)=>{"use strict";Uue.exports=e=>{let t={};for(let[r,s]of Object.entries(e))t[r.toLowerCase()]=s;return t}});var Hue=G((kOt,_ue)=>{"use strict";var y$e=Ce("stream").Readable,E$e=zQ(),aH=class extends y$e{constructor(t,r,s,a){if(typeof t!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(s instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=t,this.headers=E$e(r),this.body=s,this.url=a}_read(){this.push(this.body),this.push(null)}};_ue.exports=aH});var Gue=G((QOt,jue)=>{"use strict";var I$e=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];jue.exports=(e,t)=>{let r=new Set(Object.keys(e).concat(I$e));for(let s of r)s in t||(t[s]=typeof e[s]=="function"?e[s].bind(e):e[s])}});var Yue=G((TOt,que)=>{"use strict";var C$e=Ce("stream").PassThrough,w$e=Gue(),B$e=e=>{if(!(e&&e.pipe))throw new TypeError("Parameter `response` must be a response stream.");let t=new C$e;return w$e(e,t),e.pipe(t)};que.exports=B$e});var Wue=G(lH=>{lH.stringify=function e(t){if(typeof t>"u")return t;if(t&&Buffer.isBuffer(t))return JSON.stringify(":base64:"+t.toString("base64"));if(t&&t.toJSON&&(t=t.toJSON()),t&&typeof t=="object"){var r="",s=Array.isArray(t);r=s?"[":"{";var a=!0;for(var n in t){var c=typeof t[n]=="function"||!s&&typeof t[n]>"u";Object.hasOwnProperty.call(t,n)&&!c&&(a||(r+=","),a=!1,s?t[n]==null?r+="null":r+=e(t[n]):t[n]!==void 0&&(r+=e(n)+":"+e(t[n])))}return r+=s?"]":"}",r}else return typeof t=="string"?JSON.stringify(/^:/.test(t)?":"+t:t):typeof t>"u"?"null":JSON.stringify(t)};lH.parse=function(e){return JSON.parse(e,function(t,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var zue=G((FOt,Jue)=>{"use strict";var v$e=Ce("events"),Vue=Wue(),S$e=e=>{let t={redis:"@keyv/redis",rediss:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql",etcd:"@keyv/etcd",offline:"@keyv/offline",tiered:"@keyv/tiered"};if(e.adapter||e.uri){let r=e.adapter||/^[^:+]*/.exec(e.uri)[0];return new(Ce(t[r]))(e)}return new Map},Kue=["sqlite","postgres","mysql","mongo","redis","tiered"],cH=class extends v$e{constructor(t,{emitErrors:r=!0,...s}={}){if(super(),this.opts={namespace:"keyv",serialize:Vue.stringify,deserialize:Vue.parse,...typeof t=="string"?{uri:t}:t,...s},!this.opts.store){let n={...this.opts};this.opts.store=S$e(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on=="function"&&r&&this.opts.store.on("error",n=>this.emit("error",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[c,f]of typeof n=="function"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(f);if(!(this.opts.store.namespace&&!c.includes(this.opts.store.namespace))){if(typeof p.expires=="number"&&Date.now()>p.expires){this.delete(c);continue}yield[this._getKeyUnprefix(c),p.value]}}};typeof this.opts.store[Symbol.iterator]=="function"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator=="function"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return Kue.includes(this.opts.store.opts.dialect)||Kue.findIndex(t=>this.opts.store.opts.url.includes(t))>=0}_getKeyPrefix(t){return`${this.opts.namespace}:${t}`}_getKeyPrefixArray(t){return t.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(t){return t.split(":").splice(1).join(":")}get(t,r){let{store:s}=this.opts,a=Array.isArray(t),n=a?this._getKeyPrefixArray(t):this._getKeyPrefix(t);if(a&&s.getMany===void 0){let c=[];for(let f of n)c.push(Promise.resolve().then(()=>s.get(f)).then(p=>typeof p=="string"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires=="number"&&Date.now()>p.expires?this.delete(f).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(c).then(f=>{let p=[];for(let h of f)p.push(h.value);return p})}return Promise.resolve().then(()=>a?s.getMany(n):s.get(n)).then(c=>typeof c=="string"?this.opts.deserialize(c):this.opts.compression?this.opts.deserialize(c):c).then(c=>{if(c!=null)return a?c.map((f,p)=>{if(typeof f=="string"&&(f=this.opts.deserialize(f)),f!=null){if(typeof f.expires=="number"&&Date.now()>f.expires){this.delete(t[p]).then(()=>{});return}return r&&r.raw?f:f.value}}):typeof c.expires=="number"&&Date.now()>c.expires?this.delete(t).then(()=>{}):r&&r.raw?c:c.value})}set(t,r,s){let a=this._getKeyPrefix(t);typeof s>"u"&&(s=this.opts.ttl),s===0&&(s=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let c=typeof s=="number"?Date.now()+s:null;return typeof r=="symbol"&&this.emit("error","symbol cannot be serialized"),r={value:r,expires:c},this.opts.serialize(r)}).then(c=>n.set(a,c,s)).then(()=>!0)}delete(t){let{store:r}=this.opts;if(Array.isArray(t)){let a=this._getKeyPrefixArray(t);if(r.deleteMany===void 0){let n=[];for(let c of a)n.push(r.delete(c));return Promise.allSettled(n).then(c=>c.every(f=>f.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let s=this._getKeyPrefix(t);return Promise.resolve().then(()=>r.delete(s))}clear(){let{store:t}=this.opts;return Promise.resolve().then(()=>t.clear())}has(t){let r=this._getKeyPrefix(t),{store:s}=this.opts;return Promise.resolve().then(async()=>typeof s.has=="function"?s.has(r):await s.get(r)!==void 0)}disconnect(){let{store:t}=this.opts;if(typeof t.disconnect=="function")return t.disconnect()}};Jue.exports=cH});var $ue=G((OOt,Xue)=>{"use strict";var b$e=Ce("events"),ZQ=Ce("url"),D$e=Bue(),P$e=Oue(),uH=Mue(),Zue=Hue(),x$e=zQ(),k$e=Yue(),Q$e=zue(),WB=class e{constructor(t,r){if(typeof t!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Q$e({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(t)}createCacheableRequest(t){return(r,s)=>{let a;if(typeof r=="string")a=fH(ZQ.parse(r)),r={};else if(r instanceof ZQ.URL)a=fH(ZQ.parse(r.toString())),r={};else{let[C,...S]=(r.path||"").split("?"),x=S.length>0?`?${S.join("?")}`:"";a=fH({...r,pathname:C,search:x})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...T$e(a)},r.headers=x$e(r.headers);let n=new b$e,c=D$e(ZQ.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),f=`${r.method}:${c}`,p=!1,h=!1,E=C=>{h=!0;let S=!1,x,I=new Promise(N=>{x=()=>{S||(S=!0,N())}}),R=N=>{if(p&&!C.forceRefresh){N.status=N.statusCode;let K=uH.fromObject(p.cachePolicy).revalidatedPolicy(C,N);if(!K.modified){let $=K.policy.responseHeaders();N=new Zue(p.statusCode,$,p.body,p.url),N.cachePolicy=K.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new uH(C,N,C),N.fromCache=!1);let U;C.cache&&N.cachePolicy.storable()?(U=k$e(N),(async()=>{try{let K=P$e.buffer(N);if(await Promise.race([I,new Promise(le=>N.once("end",le))]),S)return;let $=await K,ie={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:$},fe=C.strictTtl?N.cachePolicy.timeToLive():void 0;C.maxTtl&&(fe=fe?Math.min(fe,C.maxTtl):C.maxTtl),await this.cache.set(f,ie,fe)}catch(K){n.emit("error",new e.CacheError(K))}})()):C.cache&&p&&(async()=>{try{await this.cache.delete(f)}catch(K){n.emit("error",new e.CacheError(K))}})(),n.emit("response",U||N),typeof s=="function"&&s(U||N)};try{let N=t(C,R);N.once("error",x),N.once("abort",x),n.emit("request",N)}catch(N){n.emit("error",new e.RequestError(N))}};return(async()=>{let C=async x=>{await Promise.resolve();let I=x.cache?await this.cache.get(f):void 0;if(typeof I>"u")return E(x);let R=uH.fromObject(I.cachePolicy);if(R.satisfiesWithoutRevalidation(x)&&!x.forceRefresh){let N=R.responseHeaders(),U=new Zue(I.statusCode,N,I.body,I.url);U.cachePolicy=R,U.fromCache=!0,n.emit("response",U),typeof s=="function"&&s(U)}else p=I,x.headers=R.revalidationHeaders(x),E(x)},S=x=>n.emit("error",new e.CacheError(x));this.cache.once("error",S),n.on("response",()=>this.cache.removeListener("error",S));try{await C(r)}catch(x){r.automaticFailover&&!h&&E(r),n.emit("error",new e.CacheError(x))}})(),n}}};function T$e(e){let t={...e};return t.path=`${e.pathname||"/"}${e.search||""}`,delete t.pathname,delete t.search,t}function fH(e){return{protocol:e.protocol,auth:e.auth,hostname:e.hostname||e.host||"localhost",port:e.port,pathname:e.pathname,search:e.search}}WB.RequestError=class extends Error{constructor(e){super(e.message),this.name="RequestError",Object.assign(this,e)}};WB.CacheError=class extends Error{constructor(e){super(e.message),this.name="CacheError",Object.assign(this,e)}};Xue.exports=WB});var tfe=G((UOt,efe)=>{"use strict";var R$e=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];efe.exports=(e,t)=>{if(t._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(e).concat(R$e)),s={};for(let a of r)a in t||(s[a]={get(){let n=e[a];return typeof n=="function"?n.bind(e):n},set(n){e[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(t,s),e.once("aborted",()=>{t.destroy(),t.emit("aborted")}),e.once("close",()=>{e.complete&&t.readable?t.once("end",()=>{t.emit("close")}):t.emit("close")}),t}});var nfe=G((_Ot,rfe)=>{"use strict";var{Transform:F$e,PassThrough:N$e}=Ce("stream"),AH=Ce("zlib"),O$e=tfe();rfe.exports=e=>{let t=(e.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(t))return e;let r=t==="br";if(r&&typeof AH.createBrotliDecompress!="function")return e.destroy(new Error("Brotli is not supported on Node.js < 12")),e;let s=!0,a=new F$e({transform(f,p,h){s=!1,h(null,f)},flush(f){f()}}),n=new N$e({autoDestroy:!1,destroy(f,p){e.destroy(),p(f)}}),c=r?AH.createBrotliDecompress():AH.createUnzip();return c.once("error",f=>{if(s&&!e.readable){n.end();return}n.destroy(f)}),O$e(e,n),e.pipe(a).pipe(c).pipe(n),n}});var hH=G((HOt,ife)=>{"use strict";var pH=class{constructor(t={}){if(!(t.maxSize&&t.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=t.maxSize,this.onEviction=t.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(t,r){if(this.cache.set(t,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[s,a]of this.oldCache.entries())this.onEviction(s,a);this.oldCache=this.cache,this.cache=new Map}}get(t){if(this.cache.has(t))return this.cache.get(t);if(this.oldCache.has(t)){let r=this.oldCache.get(t);return this.oldCache.delete(t),this._set(t,r),r}}set(t,r){return this.cache.has(t)?this.cache.set(t,r):this._set(t,r),this}has(t){return this.cache.has(t)||this.oldCache.has(t)}peek(t){if(this.cache.has(t))return this.cache.get(t);if(this.oldCache.has(t))return this.oldCache.get(t)}delete(t){let r=this.cache.delete(t);return r&&this._size--,this.oldCache.delete(t)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[t]of this)yield t}*values(){for(let[,t]of this)yield t}*[Symbol.iterator](){for(let t of this.cache)yield t;for(let t of this.oldCache){let[r]=t;this.cache.has(r)||(yield t)}}get size(){let t=0;for(let r of this.oldCache.keys())this.cache.has(r)||t++;return Math.min(this._size+t,this.maxSize)}};ife.exports=pH});var gH=G((jOt,lfe)=>{"use strict";var L$e=Ce("events"),M$e=Ce("tls"),U$e=Ce("http2"),_$e=hH(),Ra=Symbol("currentStreamsCount"),sfe=Symbol("request"),Oc=Symbol("cachedOriginSet"),II=Symbol("gracefullyClosing"),H$e=["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"],j$e=(e,t,r)=>{let s=0,a=e.length;for(;s>>1;r(e[n],t)?s=n+1:a=n}return s},G$e=(e,t)=>e.remoteSettings.maxConcurrentStreams>t.remoteSettings.maxConcurrentStreams,dH=(e,t)=>{for(let r of e)r[Oc].lengtht[Oc].includes(s))&&r[Ra]+t[Ra]<=t.remoteSettings.maxConcurrentStreams&&afe(r)},q$e=(e,t)=>{for(let r of e)t[Oc].lengthr[Oc].includes(s))&&t[Ra]+r[Ra]<=r.remoteSettings.maxConcurrentStreams&&afe(t)},ofe=({agent:e,isFree:t})=>{let r={};for(let s in e.sessions){let n=e.sessions[s].filter(c=>{let f=c[sm.kCurrentStreamsCount]{e[II]=!0,e[Ra]===0&&e.close()},sm=class e extends L$e{constructor({timeout:t=6e4,maxSessions:r=1/0,maxFreeSessions:s=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=t,this.maxSessions=r,this.maxFreeSessions=s,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new _$e({maxSize:a})}static normalizeOrigin(t,r){return typeof t=="string"&&(t=new URL(t)),r&&t.hostname!==r&&(t.hostname=r),t.origin}normalizeOptions(t){let r="";if(t)for(let s of H$e)t[s]&&(r+=`:${t[s]}`);return r}_tryToCreateNewSession(t,r){if(!(t in this.queue)||!(r in this.queue[t]))return;let s=this.queue[t][r];this._sessionsCount{Array.isArray(s)?(s=[...s],a()):s=[{resolve:a,reject:n}];let c=this.normalizeOptions(r),f=e.normalizeOrigin(t,r&&r.servername);if(f===void 0){for(let{reject:E}of s)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(c in this.sessions){let E=this.sessions[c],C=-1,S=-1,x;for(let I of E){let R=I.remoteSettings.maxConcurrentStreams;if(R=R||I[II]||I.destroyed)continue;x||(C=R),N>S&&(x=I,S=N)}}if(x){if(s.length!==1){for(let{reject:I}of s){let R=new Error(`Expected the length of listeners to be 1, got ${s.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);I(R)}return}s[0].resolve(x);return}}if(c in this.queue){if(f in this.queue[c]){this.queue[c][f].listeners.push(...s),this._tryToCreateNewSession(c,f);return}}else this.queue[c]={};let p=()=>{c in this.queue&&this.queue[c][f]===h&&(delete this.queue[c][f],Object.keys(this.queue[c]).length===0&&delete this.queue[c])},h=()=>{let E=`${f}:${c}`,C=!1;try{let S=U$e.connect(t,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});S[Ra]=0,S[II]=!1;let x=()=>S[Ra]{this.tlsSessionCache.set(E,N)}),S.once("error",N=>{for(let{reject:U}of s)U(N);this.tlsSessionCache.delete(E)}),S.setTimeout(this.timeout,()=>{S.destroy()}),S.once("close",()=>{if(C){I&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[c];N.splice(N.indexOf(S),1),N.length===0&&delete this.sessions[c]}else{let N=new Error("Session closed without receiving a SETTINGS frame");N.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of s)U(N);p()}this._tryToCreateNewSession(c,f)});let R=()=>{if(!(!(c in this.queue)||!x())){for(let N of S[Oc])if(N in this.queue[c]){let{listeners:U}=this.queue[c][N];for(;U.length!==0&&x();)U.shift().resolve(S);let K=this.queue[c];if(K[N].listeners.length===0&&(delete K[N],Object.keys(K).length===0)){delete this.queue[c];break}if(!x())break}}};S.on("origin",()=>{S[Oc]=S.originSet,x()&&(R(),dH(this.sessions[c],S))}),S.once("remoteSettings",()=>{if(S.ref(),S.unref(),this._sessionsCount++,h.destroyed){let N=new Error("Agent has been destroyed");for(let U of s)U.reject(N);S.destroy();return}S[Oc]=S.originSet;{let N=this.sessions;if(c in N){let U=N[c];U.splice(j$e(U,S,G$e),0,S)}else N[c]=[S]}this._freeSessionsCount+=1,C=!0,this.emit("session",S),R(),p(),S[Ra]===0&&this._freeSessionsCount>this.maxFreeSessions&&S.close(),s.length!==0&&(this.getSession(f,r,s),s.length=0),S.on("remoteSettings",()=>{R(),dH(this.sessions[c],S)})}),S[sfe]=S.request,S.request=(N,U)=>{if(S[II])throw new Error("The session is gracefully closing. No new streams are allowed.");let K=S[sfe](N,U);return S.ref(),++S[Ra],S[Ra]===S.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,K.once("close",()=>{if(I=x(),--S[Ra],!S.destroyed&&!S.closed&&(q$e(this.sessions[c],S),x()&&!S.closed)){I||(this._freeSessionsCount++,I=!0);let $=S[Ra]===0;$&&S.unref(),$&&(this._freeSessionsCount>this.maxFreeSessions||S[II])?S.close():(dH(this.sessions[c],S),R())}}),K}}catch(S){for(let x of s)x.reject(S);p()}};h.listeners=s,h.completed=!1,h.destroyed=!1,this.queue[c][f]=h,this._tryToCreateNewSession(c,f)})}request(t,r,s,a){return new Promise((n,c)=>{this.getSession(t,r,[{reject:c,resolve:f=>{try{n(f.request(s,a))}catch(p){c(p)}}}])})}createConnection(t,r){return e.connect(t,r)}static connect(t,r){r.ALPNProtocols=["h2"];let s=t.port||443,a=t.hostname||t.host;return typeof r.servername>"u"&&(r.servername=a),M$e.connect(s,a,r)}closeFreeSessions(){for(let t of Object.values(this.sessions))for(let r of t)r[Ra]===0&&r.close()}destroy(t){for(let r of Object.values(this.sessions))for(let s of r)s.destroy(t);for(let r of Object.values(this.queue))for(let s of Object.values(r))s.destroyed=!0;this.queue={}}get freeSessions(){return ofe({agent:this,isFree:!0})}get busySessions(){return ofe({agent:this,isFree:!1})}};sm.kCurrentStreamsCount=Ra;sm.kGracefullyClosing=II;lfe.exports={Agent:sm,globalAgent:new sm}});var yH=G((GOt,cfe)=>{"use strict";var{Readable:Y$e}=Ce("stream"),mH=class extends Y$e{constructor(t,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=t,this.connection=t,this._dumped=!1}_destroy(t){this.req._request.destroy(t)}setTimeout(t,r){return this.req.setTimeout(t,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};cfe.exports=mH});var EH=G((qOt,ufe)=>{"use strict";ufe.exports=e=>{let t={protocol:e.protocol,hostname:typeof e.hostname=="string"&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return typeof e.port=="string"&&e.port.length!==0&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}});var Afe=G((YOt,ffe)=>{"use strict";ffe.exports=(e,t,r)=>{for(let s of r)e.on(s,(...a)=>t.emit(s,...a))}});var hfe=G((WOt,pfe)=>{"use strict";pfe.exports=e=>{switch(e){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var gfe=G((KOt,dfe)=>{"use strict";var CI=(e,t,r)=>{dfe.exports[t]=class extends e{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${t}]`,this.code=t}}};CI(TypeError,"ERR_INVALID_ARG_TYPE",e=>{let t=e[0].includes(".")?"property":"argument",r=e[1],s=Array.isArray(r);return s&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${e[0]}" ${t} must be ${s?"one of":"of"} type ${r}. Received ${typeof e[2]}`});CI(TypeError,"ERR_INVALID_PROTOCOL",e=>`Protocol "${e[0]}" not supported. Expected "${e[1]}"`);CI(Error,"ERR_HTTP_HEADERS_SENT",e=>`Cannot ${e[0]} headers after they are sent to the client`);CI(TypeError,"ERR_INVALID_HTTP_TOKEN",e=>`${e[0]} must be a valid HTTP token [${e[1]}]`);CI(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",e=>`Invalid value "${e[0]} for header "${e[1]}"`);CI(TypeError,"ERR_INVALID_CHAR",e=>`Invalid character in ${e[0]} [${e[1]}]`)});var vH=G((JOt,Bfe)=>{"use strict";var W$e=Ce("http2"),{Writable:V$e}=Ce("stream"),{Agent:mfe,globalAgent:K$e}=gH(),J$e=yH(),z$e=EH(),Z$e=Afe(),X$e=hfe(),{ERR_INVALID_ARG_TYPE:IH,ERR_INVALID_PROTOCOL:$$e,ERR_HTTP_HEADERS_SENT:yfe,ERR_INVALID_HTTP_TOKEN:eet,ERR_HTTP_INVALID_HEADER_VALUE:tet,ERR_INVALID_CHAR:ret}=gfe(),{HTTP2_HEADER_STATUS:Efe,HTTP2_HEADER_METHOD:Ife,HTTP2_HEADER_PATH:Cfe,HTTP2_METHOD_CONNECT:net}=W$e.constants,ra=Symbol("headers"),CH=Symbol("origin"),wH=Symbol("session"),wfe=Symbol("options"),XQ=Symbol("flushedHeaders"),VB=Symbol("jobs"),iet=/^[\^`\-\w!#$%&*+.|~]+$/,set=/[^\t\u0020-\u007E\u0080-\u00FF]/,BH=class extends V$e{constructor(t,r,s){super({autoDestroy:!1});let a=typeof t=="string"||t instanceof URL;if(a&&(t=z$e(t instanceof URL?t:new URL(t))),typeof r=="function"||r===void 0?(s=r,r=a?t:{...t}):r={...t,...r},r.h2session)this[wH]=r.h2session;else if(r.agent===!1)this.agent=new mfe({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new mfe({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=K$e;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new IH("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new $$e(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,c=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:f}=r;if(r.timeout=void 0,this[ra]=Object.create(null),this[VB]=[],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[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[ra])&&(this[ra].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[wfe]=r,n===443?(this[CH]=`https://${c}`,":authority"in this[ra]||(this[ra][":authority"]=c)):(this[CH]=`https://${c}:${n}`,":authority"in this[ra]||(this[ra][":authority"]=`${c}:${n}`)),f&&this.setTimeout(f),s&&this.once("response",s),this[XQ]=!1}get method(){return this[ra][Ife]}set method(t){t&&(this[ra][Ife]=t.toUpperCase())}get path(){return this[ra][Cfe]}set path(t){t&&(this[ra][Cfe]=t)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(t,r,s){if(this._mustNotHaveABody){s(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(t,r,s);this._request?a():this[VB].push(a)}_final(t){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){t();return}this._request.end(t)};this._request?r():this[VB].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(t,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(t)}async flushHeaders(){if(this[XQ]||this.destroyed)return;this[XQ]=!0;let t=this.method===net,r=s=>{if(this._request=s,this.destroyed){s.destroy();return}t||Z$e(s,this,["timeout","continue","close","error"]);let a=c=>(...f)=>{!this.writable&&!this.destroyed?c(...f):this.once("finish",()=>{c(...f)})};s.once("response",a((c,f,p)=>{let h=new J$e(this.socket,s.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=c[Efe],h.headers=c,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),t?(h.upgrade=!0,this.emit("connect",h,s,Buffer.alloc(0))?this.emit("close"):s.destroy()):(s.on("data",E=>{!h._dumped&&!h.push(E)&&s.pause()}),s.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),s.once("headers",a(c=>this.emit("information",{statusCode:c[Efe]}))),s.once("trailers",a((c,f,p)=>{let{res:h}=this;h.trailers=c,h.rawTrailers=p}));let{socket:n}=s.session;this.socket=n,this.connection=n;for(let c of this[VB])c();this.emit("socket",this.socket)};if(this[wH])try{r(this[wH].request(this[ra]))}catch(s){this.emit("error",s)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[CH],this[wfe],this[ra]))}catch(s){this.emit("error",s)}}}getHeader(t){if(typeof t!="string")throw new IH("name","string",t);return this[ra][t.toLowerCase()]}get headersSent(){return this[XQ]}removeHeader(t){if(typeof t!="string")throw new IH("name","string",t);if(this.headersSent)throw new yfe("remove");delete this[ra][t.toLowerCase()]}setHeader(t,r){if(this.headersSent)throw new yfe("set");if(typeof t!="string"||!iet.test(t)&&!X$e(t))throw new eet("Header name",t);if(typeof r>"u")throw new tet(r,t);if(set.test(r))throw new ret("header content",t);this[ra][t.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(t,r){let s=()=>this._request.setTimeout(t,r);return this._request?s():this[VB].push(s),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(t){}};Bfe.exports=BH});var Sfe=G((zOt,vfe)=>{"use strict";var oet=Ce("tls");vfe.exports=(e={},t=oet.connect)=>new Promise((r,s)=>{let a=!1,n,c=async()=>{await p,n.off("timeout",f),n.off("error",s),e.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit("timeout"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},f=async()=>{a=!0,c()},p=(async()=>{try{n=await t(e,c),n.on("error",s),n.once("timeout",f)}catch(h){s(h)}})()})});var Dfe=G((ZOt,bfe)=>{"use strict";var aet=Ce("net");bfe.exports=e=>{let t=e.host,r=e.headers&&e.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?t=r:t=r.slice(1,-1):t=r.split(":",1)[0]),aet.isIP(t)?"":t}});var kfe=G((XOt,bH)=>{"use strict";var Pfe=Ce("http"),SH=Ce("https"),cet=Sfe(),uet=hH(),fet=vH(),Aet=Dfe(),pet=EH(),$Q=new uet({maxSize:100}),KB=new Map,xfe=(e,t,r)=>{t._httpMessage={shouldKeepAlive:!0};let s=()=>{e.emit("free",t,r)};t.on("free",s);let a=()=>{e.removeSocket(t,r)};t.on("close",a);let n=()=>{e.removeSocket(t,r),t.off("close",a),t.off("free",s),t.off("agentRemove",n)};t.on("agentRemove",n),e.emit("free",t,r)},het=async e=>{let t=`${e.host}:${e.port}:${e.ALPNProtocols.sort()}`;if(!$Q.has(t)){if(KB.has(t))return(await KB.get(t)).alpnProtocol;let{path:r,agent:s}=e;e.path=e.socketPath;let a=cet(e);KB.set(t,a);try{let{socket:n,alpnProtocol:c}=await a;if($Q.set(t,c),e.path=r,c==="h2")n.destroy();else{let{globalAgent:f}=SH,p=SH.Agent.prototype.createConnection;s?s.createConnection===p?xfe(s,n,e):n.destroy():f.createConnection===p?xfe(f,n,e):n.destroy()}return KB.delete(t),c}catch(n){throw KB.delete(t),n}}return $Q.get(t)};bH.exports=async(e,t,r)=>{if((typeof e=="string"||e instanceof URL)&&(e=pet(new URL(e))),typeof t=="function"&&(r=t,t=void 0),t={ALPNProtocols:["h2","http/1.1"],...e,...t,resolveSocket:!0},!Array.isArray(t.ALPNProtocols)||t.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");t.protocol=t.protocol||"https:";let s=t.protocol==="https:";t.host=t.hostname||t.host||"localhost",t.session=t.tlsSession,t.servername=t.servername||Aet(t),t.port=t.port||(s?443:80),t._defaultAgent=s?SH.globalAgent:Pfe.globalAgent;let a=t.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");t.agent=a[s?"https":"http"]}return s&&await het(t)==="h2"?(a&&(t.agent=a.http2),new fet(t,r)):Pfe.request(t,r)};bH.exports.protocolCache=$Q});var Tfe=G(($Ot,Qfe)=>{"use strict";var det=Ce("http2"),get=gH(),DH=vH(),met=yH(),yet=kfe(),Eet=(e,t,r)=>new DH(e,t,r),Iet=(e,t,r)=>{let s=new DH(e,t,r);return s.end(),s};Qfe.exports={...det,ClientRequest:DH,IncomingMessage:met,...get,request:Eet,get:Iet,auto:yet}});var xH=G(PH=>{"use strict";Object.defineProperty(PH,"__esModule",{value:!0});var Rfe=Up();PH.default=e=>Rfe.default.nodeStream(e)&&Rfe.default.function_(e.getBoundary)});var Lfe=G(kH=>{"use strict";Object.defineProperty(kH,"__esModule",{value:!0});var Nfe=Ce("fs"),Ofe=Ce("util"),Ffe=Up(),Cet=xH(),wet=Ofe.promisify(Nfe.stat);kH.default=async(e,t)=>{if(t&&"content-length"in t)return Number(t["content-length"]);if(!e)return 0;if(Ffe.default.string(e))return Buffer.byteLength(e);if(Ffe.default.buffer(e))return e.length;if(Cet.default(e))return Ofe.promisify(e.getLength.bind(e))();if(e instanceof Nfe.ReadStream){let{size:r}=await wet(e.path);return r===0?void 0:r}}});var TH=G(QH=>{"use strict";Object.defineProperty(QH,"__esModule",{value:!0});function Bet(e,t,r){let s={};for(let a of r)s[a]=(...n)=>{t.emit(a,...n)},e.on(a,s[a]);return()=>{for(let a of r)e.off(a,s[a])}}QH.default=Bet});var Mfe=G(RH=>{"use strict";Object.defineProperty(RH,"__esModule",{value:!0});RH.default=()=>{let e=[];return{once(t,r,s){t.once(r,s),e.push({origin:t,event:r,fn:s})},unhandleAll(){for(let t of e){let{origin:r,event:s,fn:a}=t;r.removeListener(s,a)}e.length=0}}}});var _fe=G(JB=>{"use strict";Object.defineProperty(JB,"__esModule",{value:!0});JB.TimeoutError=void 0;var vet=Ce("net"),bet=Mfe(),Ufe=Symbol("reentry"),Det=()=>{},eT=class extends Error{constructor(t,r){super(`Timeout awaiting '${r}' for ${t}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};JB.TimeoutError=eT;JB.default=(e,t,r)=>{if(Ufe in e)return Det;e[Ufe]=!0;let s=[],{once:a,unhandleAll:n}=bet.default(),c=(C,S,x)=>{var I;let R=setTimeout(S,C,C,x);(I=R.unref)===null||I===void 0||I.call(R);let N=()=>{clearTimeout(R)};return s.push(N),N},{host:f,hostname:p}=r,h=(C,S)=>{e.destroy(new eT(C,S))},E=()=>{for(let C of s)C();n()};if(e.once("error",C=>{if(E(),e.listenerCount("error")===0)throw C}),e.once("close",E),a(e,"response",C=>{a(C,"end",E)}),typeof t.request<"u"&&c(t.request,h,"request"),typeof t.socket<"u"){let C=()=>{h(t.socket,"socket")};e.setTimeout(t.socket,C),s.push(()=>{e.removeListener("timeout",C)})}return a(e,"socket",C=>{var S;let{socketPath:x}=e;if(C.connecting){let I=!!(x??vet.isIP((S=p??f)!==null&&S!==void 0?S:"")!==0);if(typeof t.lookup<"u"&&!I&&typeof C.address().address>"u"){let R=c(t.lookup,h,"lookup");a(C,"lookup",R)}if(typeof t.connect<"u"){let R=()=>c(t.connect,h,"connect");I?a(C,"connect",R()):a(C,"lookup",N=>{N===null&&a(C,"connect",R())})}typeof t.secureConnect<"u"&&r.protocol==="https:"&&a(C,"connect",()=>{let R=c(t.secureConnect,h,"secureConnect");a(C,"secureConnect",R)})}if(typeof t.send<"u"){let I=()=>c(t.send,h,"send");C.connecting?a(C,"connect",()=>{a(e,"upload-complete",I())}):a(e,"upload-complete",I())}}),typeof t.response<"u"&&a(e,"upload-complete",()=>{let C=c(t.response,h,"response");a(e,"response",C)}),E}});var jfe=G(FH=>{"use strict";Object.defineProperty(FH,"__esModule",{value:!0});var Hfe=Up();FH.default=e=>{e=e;let t={protocol:e.protocol,hostname:Hfe.default.string(e.hostname)&&e.hostname.startsWith("[")?e.hostname.slice(1,-1):e.hostname,host:e.host,hash:e.hash,search:e.search,pathname:e.pathname,href:e.href,path:`${e.pathname||""}${e.search||""}`};return Hfe.default.string(e.port)&&e.port.length>0&&(t.port=Number(e.port)),(e.username||e.password)&&(t.auth=`${e.username||""}:${e.password||""}`),t}});var Gfe=G(NH=>{"use strict";Object.defineProperty(NH,"__esModule",{value:!0});var Pet=Ce("url"),xet=["protocol","host","hostname","port","pathname","search"];NH.default=(e,t)=>{var r,s;if(t.path){if(t.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(t.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(t.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(t.search&&t.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!e){if(!t.protocol)throw new TypeError("No URL protocol specified");e=`${t.protocol}//${(s=(r=t.hostname)!==null&&r!==void 0?r:t.host)!==null&&s!==void 0?s:""}`}let a=new Pet.URL(e);if(t.path){let n=t.path.indexOf("?");n===-1?t.pathname=t.path:(t.pathname=t.path.slice(0,n),t.search=t.path.slice(n+1)),delete t.path}for(let n of xet)t[n]&&(a[n]=t[n].toString());return a}});var qfe=G(LH=>{"use strict";Object.defineProperty(LH,"__esModule",{value:!0});var OH=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(t,r){typeof t=="object"?this.weakMap.set(t,r):this.map.set(t,r)}get(t){return typeof t=="object"?this.weakMap.get(t):this.map.get(t)}has(t){return typeof t=="object"?this.weakMap.has(t):this.map.has(t)}};LH.default=OH});var UH=G(MH=>{"use strict";Object.defineProperty(MH,"__esModule",{value:!0});var ket=async e=>{let t=[],r=0;for await(let s of e)t.push(s),r+=Buffer.byteLength(s);return Buffer.isBuffer(t[0])?Buffer.concat(t,r):Buffer.from(t.join(""))};MH.default=ket});var Wfe=G(om=>{"use strict";Object.defineProperty(om,"__esModule",{value:!0});om.dnsLookupIpVersionToFamily=om.isDnsLookupIpVersion=void 0;var Yfe={auto:0,ipv4:4,ipv6:6};om.isDnsLookupIpVersion=e=>e in Yfe;om.dnsLookupIpVersionToFamily=e=>{if(om.isDnsLookupIpVersion(e))return Yfe[e];throw new Error("Invalid DNS lookup IP version")}});var _H=G(tT=>{"use strict";Object.defineProperty(tT,"__esModule",{value:!0});tT.isResponseOk=void 0;tT.isResponseOk=e=>{let{statusCode:t}=e,r=e.request.options.followRedirect?299:399;return t>=200&&t<=r||t===304}});var Kfe=G(HH=>{"use strict";Object.defineProperty(HH,"__esModule",{value:!0});var Vfe=new Set;HH.default=e=>{Vfe.has(e)||(Vfe.add(e),process.emitWarning(`Got: ${e}`,{type:"DeprecationWarning"}))}});var Jfe=G(jH=>{"use strict";Object.defineProperty(jH,"__esModule",{value:!0});var Di=Up(),Qet=(e,t)=>{if(Di.default.null_(e.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Di.assert.any([Di.default.string,Di.default.undefined],e.encoding),Di.assert.any([Di.default.boolean,Di.default.undefined],e.resolveBodyOnly),Di.assert.any([Di.default.boolean,Di.default.undefined],e.methodRewriting),Di.assert.any([Di.default.boolean,Di.default.undefined],e.isStream),Di.assert.any([Di.default.string,Di.default.undefined],e.responseType),e.responseType===void 0&&(e.responseType="text");let{retry:r}=e;if(t?e.retry={...t.retry}:e.retry={calculateDelay:s=>s.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Di.default.object(r)?(e.retry={...e.retry,...r},e.retry.methods=[...new Set(e.retry.methods.map(s=>s.toUpperCase()))],e.retry.statusCodes=[...new Set(e.retry.statusCodes)],e.retry.errorCodes=[...new Set(e.retry.errorCodes)]):Di.default.number(r)&&(e.retry.limit=r),Di.default.undefined(e.retry.maxRetryAfter)&&(e.retry.maxRetryAfter=Math.min(...[e.timeout.request,e.timeout.connect].filter(Di.default.number))),Di.default.object(e.pagination)){t&&(e.pagination={...t.pagination,...e.pagination});let{pagination:s}=e;if(!Di.default.function_(s.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Di.default.function_(s.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Di.default.function_(s.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Di.default.function_(s.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return e.responseType==="json"&&e.headers.accept===void 0&&(e.headers.accept="application/json"),e};jH.default=Qet});var zfe=G(zB=>{"use strict";Object.defineProperty(zB,"__esModule",{value:!0});zB.retryAfterStatusCodes=void 0;zB.retryAfterStatusCodes=new Set([413,429,503]);var Tet=({attemptCount:e,retryOptions:t,error:r,retryAfter:s})=>{if(e>t.limit)return 0;let a=t.methods.includes(r.options.method),n=t.errorCodes.includes(r.code),c=r.response&&t.statusCodes.includes(r.response.statusCode);if(!a||!n&&!c)return 0;if(r.response){if(s)return t.maxRetryAfter===void 0||s>t.maxRetryAfter?0:s;if(r.response.statusCode===413)return 0}let f=Math.random()*100;return 2**(e-1)*1e3+f};zB.default=Tet});var $B=G(_n=>{"use strict";Object.defineProperty(_n,"__esModule",{value:!0});_n.UnsupportedProtocolError=_n.ReadError=_n.TimeoutError=_n.UploadError=_n.CacheError=_n.HTTPError=_n.MaxRedirectsError=_n.RequestError=_n.setNonEnumerableProperties=_n.knownHookEvents=_n.withoutBody=_n.kIsNormalizedAlready=void 0;var Zfe=Ce("util"),Xfe=Ce("stream"),Ret=Ce("fs"),vd=Ce("url"),$fe=Ce("http"),GH=Ce("http"),Fet=Ce("https"),Net=pue(),Oet=Iue(),eAe=$ue(),Let=nfe(),Met=Tfe(),Uet=zQ(),lt=Up(),_et=Lfe(),tAe=xH(),Het=TH(),rAe=_fe(),jet=jfe(),nAe=Gfe(),Get=qfe(),qet=UH(),iAe=Wfe(),Yet=_H(),Sd=Kfe(),Wet=Jfe(),Vet=zfe(),qH,Co=Symbol("request"),iT=Symbol("response"),wI=Symbol("responseSize"),BI=Symbol("downloadedSize"),vI=Symbol("bodySize"),SI=Symbol("uploadedSize"),rT=Symbol("serverResponsesPiped"),sAe=Symbol("unproxyEvents"),oAe=Symbol("isFromCache"),YH=Symbol("cancelTimeouts"),aAe=Symbol("startedReading"),bI=Symbol("stopReading"),nT=Symbol("triggerRead"),bd=Symbol("body"),ZB=Symbol("jobs"),lAe=Symbol("originalResponse"),cAe=Symbol("retryTimeout");_n.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Ket=lt.default.string(process.versions.brotli);_n.withoutBody=new Set(["GET","HEAD"]);_n.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Jet(e){for(let t in e){let r=e[t];if(!lt.default.string(r)&&!lt.default.number(r)&&!lt.default.boolean(r)&&!lt.default.null_(r)&&!lt.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function zet(e){return lt.default.object(e)&&!("statusCode"in e)}var WH=new Get.default,Zet=async e=>new Promise((t,r)=>{let s=a=>{r(a)};e.pending||t(),e.once("error",s),e.once("ready",()=>{e.off("error",s),t()})}),Xet=new Set([300,301,302,303,304,307,308]),$et=["context","body","json","form"];_n.setNonEnumerableProperties=(e,t)=>{let r={};for(let s of e)if(s)for(let a of $et)a in s&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:s[a]});Object.defineProperties(t,r)};var ps=class extends Error{constructor(t,r,s){var a;if(super(t),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,s instanceof fT?(Object.defineProperty(this,"request",{enumerable:!1,value:s}),Object.defineProperty(this,"response",{enumerable:!1,value:s[iT]}),Object.defineProperty(this,"options",{enumerable:!1,value:s.options})):Object.defineProperty(this,"options",{enumerable:!1,value:s}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,lt.default.string(r.stack)&<.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,c=this.stack.slice(n).split(` +`).reverse(),f=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;f.length!==0&&f[0]===c[0];)c.shift();this.stack=`${this.stack.slice(0,n)}${c.reverse().join(` +`)}${f.reverse().join(` +`)}`}}};_n.RequestError=ps;var sT=class extends ps{constructor(t){super(`Redirected ${t.options.maxRedirects} times. Aborting.`,{},t),this.name="MaxRedirectsError"}};_n.MaxRedirectsError=sT;var oT=class extends ps{constructor(t){super(`Response code ${t.statusCode} (${t.statusMessage})`,{},t.request),this.name="HTTPError"}};_n.HTTPError=oT;var aT=class extends ps{constructor(t,r){super(t.message,t,r),this.name="CacheError"}};_n.CacheError=aT;var lT=class extends ps{constructor(t,r){super(t.message,t,r),this.name="UploadError"}};_n.UploadError=lT;var cT=class extends ps{constructor(t,r,s){super(t.message,t,s),this.name="TimeoutError",this.event=t.event,this.timings=r}};_n.TimeoutError=cT;var XB=class extends ps{constructor(t,r){super(t.message,t,r),this.name="ReadError"}};_n.ReadError=XB;var uT=class extends ps{constructor(t){super(`Unsupported protocol "${t.url.protocol}"`,{},t),this.name="UnsupportedProtocolError"}};_n.UnsupportedProtocolError=uT;var ett=["socket","connect","continue","information","upgrade","timeout"],fT=class extends Xfe.Duplex{constructor(t,r={},s){super({autoDestroy:!1,highWaterMark:0}),this[BI]=0,this[SI]=0,this.requestInitialized=!1,this[rT]=new Set,this.redirects=[],this[bI]=!1,this[nT]=!1,this[ZB]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof GH.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:c,body:f,form:p}=r;if((c||f||p)&&this._lockWrite(),_n.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(t,r,s)}catch(h){lt.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Ret.ReadStream&&await Zet(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[Co])===null||h===void 0||h.destroy();return}for(let C of this[ZB])C();this[ZB].length=0,this.requestInitialized=!0}catch(E){if(E instanceof ps){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(t,r,s){var a,n,c,f,p;let h=r;if(lt.default.object(t)&&!lt.default.urlInstance(t))r={...s,...t,...r};else{if(t&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...s,...r},t!==void 0&&(r.url=t),lt.default.urlInstance(r.url)&&(r.url=new vd.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),lt.assert.any([lt.default.string,lt.default.undefined],r.method),lt.assert.any([lt.default.object,lt.default.undefined],r.headers),lt.assert.any([lt.default.string,lt.default.urlInstance,lt.default.undefined],r.prefixUrl),lt.assert.any([lt.default.object,lt.default.undefined],r.cookieJar),lt.assert.any([lt.default.object,lt.default.string,lt.default.undefined],r.searchParams),lt.assert.any([lt.default.object,lt.default.string,lt.default.undefined],r.cache),lt.assert.any([lt.default.object,lt.default.number,lt.default.undefined],r.timeout),lt.assert.any([lt.default.object,lt.default.undefined],r.context),lt.assert.any([lt.default.object,lt.default.undefined],r.hooks),lt.assert.any([lt.default.boolean,lt.default.undefined],r.decompress),lt.assert.any([lt.default.boolean,lt.default.undefined],r.ignoreInvalidCookies),lt.assert.any([lt.default.boolean,lt.default.undefined],r.followRedirect),lt.assert.any([lt.default.number,lt.default.undefined],r.maxRedirects),lt.assert.any([lt.default.boolean,lt.default.undefined],r.throwHttpErrors),lt.assert.any([lt.default.boolean,lt.default.undefined],r.http2),lt.assert.any([lt.default.boolean,lt.default.undefined],r.allowGetBody),lt.assert.any([lt.default.string,lt.default.undefined],r.localAddress),lt.assert.any([iAe.isDnsLookupIpVersion,lt.default.undefined],r.dnsLookupIpVersion),lt.assert.any([lt.default.object,lt.default.undefined],r.https),lt.assert.any([lt.default.boolean,lt.default.undefined],r.rejectUnauthorized),r.https&&(lt.assert.any([lt.default.boolean,lt.default.undefined],r.https.rejectUnauthorized),lt.assert.any([lt.default.function_,lt.default.undefined],r.https.checkServerIdentity),lt.assert.any([lt.default.string,lt.default.object,lt.default.array,lt.default.undefined],r.https.certificateAuthority),lt.assert.any([lt.default.string,lt.default.object,lt.default.array,lt.default.undefined],r.https.key),lt.assert.any([lt.default.string,lt.default.object,lt.default.array,lt.default.undefined],r.https.certificate),lt.assert.any([lt.default.string,lt.default.undefined],r.https.passphrase),lt.assert.any([lt.default.string,lt.default.buffer,lt.default.array,lt.default.undefined],r.https.pfx)),lt.assert.any([lt.default.object,lt.default.undefined],r.cacheOptions),lt.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===s?.headers?r.headers={...r.headers}:r.headers=Uet({...s?.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!==s?.searchParams){let x;if(lt.default.string(r.searchParams)||r.searchParams instanceof vd.URLSearchParams)x=new vd.URLSearchParams(r.searchParams);else{Jet(r.searchParams),x=new vd.URLSearchParams;for(let I in r.searchParams){let R=r.searchParams[I];R===null?x.append(I,""):R!==void 0&&x.append(I,R)}}(a=s?.searchParams)===null||a===void 0||a.forEach((I,R)=>{x.has(R)||x.append(R,I)}),r.searchParams=x}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(c=r.password)!==null&&c!==void 0?c:"",lt.default.undefined(r.prefixUrl)?r.prefixUrl=(f=s?.prefixUrl)!==null&&f!==void 0?f:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),lt.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=nAe.default(r.prefixUrl+r.url,r)}else(lt.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=nAe.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:x}=r;Object.defineProperty(r,"prefixUrl",{set:R=>{let N=r.url;if(!N.href.startsWith(R))throw new Error(`Cannot change \`prefixUrl\` from ${x} to ${R}: ${N.href}`);r.url=new vd.URL(R+N.href.slice(x.length)),x=R},get:()=>x});let{protocol:I}=r.url;if(I==="unix:"&&(I="http:",r.url=new vd.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),I!=="http:"&&I!=="https:")throw new uT(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:E}=r;if(E){let{setCookie:x,getCookieString:I}=E;lt.assert.function_(x),lt.assert.function_(I),x.length===4&&I.length===0&&(x=Zfe.promisify(x.bind(r.cookieJar)),I=Zfe.promisify(I.bind(r.cookieJar)),r.cookieJar={setCookie:x,getCookieString:I})}let{cache:C}=r;if(C&&(WH.has(C)||WH.set(C,new eAe((x,I)=>{let R=x[Co](x,I);return lt.default.promise(R)&&(R.once=(N,U)=>{if(N==="error")R.catch(U);else if(N==="abort")(async()=>{try{(await R).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return R}),R},C))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)qH||(qH=new Oet.default),r.dnsCache=qH;else if(!lt.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${lt.default(r.dnsCache)}`);lt.default.number(r.timeout)?r.timeout={request:r.timeout}:s&&r.timeout!==s.timeout?r.timeout={...s.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let S=r.hooks===s?.hooks;r.hooks={...r.hooks};for(let x of _n.knownHookEvents)if(x in r.hooks)if(lt.default.array(r.hooks[x]))r.hooks[x]=[...r.hooks[x]];else throw new TypeError(`Parameter \`${x}\` must be an Array, got ${lt.default(r.hooks[x])}`);else r.hooks[x]=[];if(s&&!S)for(let x of _n.knownHookEvents)s.hooks[x].length>0&&(r.hooks[x]=[...s.hooks[x],...r.hooks[x]]);if("family"in r&&Sd.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),s?.https&&(r.https={...s.https,...r.https}),"rejectUnauthorized"in r&&Sd.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&Sd.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&Sd.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&Sd.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&Sd.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&Sd.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&Sd.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 x in r.agent)if(x!=="http"&&x!=="https"&&x!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${x}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,_n.setNonEnumerableProperties([s,h],r),Wet.default(r,s)}_lockWrite(){let t=()=>{throw new TypeError("The payload has been already provided")};this.write=t,this.end=t}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:t}=this,{headers:r}=t,s=!lt.default.undefined(t.form),a=!lt.default.undefined(t.json),n=!lt.default.undefined(t.body),c=s||a||n,f=_n.withoutBody.has(t.method)&&!(t.method==="GET"&&t.allowGetBody);if(this._cannotHaveBody=f,c){if(f)throw new TypeError(`The \`${t.method}\` method cannot be used with a body`);if([n,s,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(t.body instanceof Xfe.Readable)&&!lt.default.string(t.body)&&!lt.default.buffer(t.body)&&!tAe.default(t.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(s&&!lt.default.object(t.form))throw new TypeError("The `form` option must be an Object");{let p=!lt.default.string(r["content-type"]);n?(tAe.default(t.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${t.body.getBoundary()}`),this[bd]=t.body):s?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[bd]=new vd.URLSearchParams(t.form).toString()):(p&&(r["content-type"]="application/json"),this[bd]=t.stringifyJson(t.json));let h=await _et.default(this[bd],t.headers);lt.default.undefined(r["content-length"])&<.default.undefined(r["transfer-encoding"])&&!f&&!lt.default.undefined(h)&&(r["content-length"]=String(h))}}else f?this._lockWrite():this._unlockWrite();this[vI]=Number(r["content-length"])||void 0}async _onResponseBase(t){let{options:r}=this,{url:s}=r;this[lAe]=t,r.decompress&&(t=Let(t));let a=t.statusCode,n=t;n.statusMessage=n.statusMessage?n.statusMessage:$fe.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=t.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[oAe]=n.isFromCache,this[wI]=Number(t.headers["content-length"])||void 0,this[iT]=t,t.once("end",()=>{this[wI]=this[BI],this.emit("downloadProgress",this.downloadProgress)}),t.once("error",f=>{t.destroy(),this._beforeError(new XB(f,this))}),t.once("aborted",()=>{this._beforeError(new XB({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let c=t.headers["set-cookie"];if(lt.default.object(r.cookieJar)&&c){let f=c.map(async p=>r.cookieJar.setCookie(p,s.toString()));r.ignoreInvalidCookies&&(f=f.map(async p=>p.catch(()=>{})));try{await Promise.all(f)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&t.headers.location&&Xet.has(a)){if(t.resume(),this[Co]&&(this[YH](),delete this[Co],this[sAe]()),(a===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[bd]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new sT(this));return}try{let p=Buffer.from(t.headers.location,"binary").toString(),h=new vd.URL(p,s),E=h.toString();decodeURI(E),h.hostname!==s.hostname||h.port!==s.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="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let C of r.hooks.beforeRedirect)await C(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!Yet.isResponseOk(n)){this._beforeError(new oT(n));return}t.on("readable",()=>{this[nT]&&this._read()}),this.on("resume",()=>{t.resume()}),this.on("pause",()=>{t.pause()}),t.once("end",()=>{this.push(null)}),this.emit("response",t);for(let f of this[rT])if(!f.headersSent){for(let p in t.headers){let h=r.decompress?p!=="content-encoding":!0,E=t.headers[p];h&&f.setHeader(p,E)}f.statusCode=a}}async _onResponse(t){try{await this._onResponseBase(t)}catch(r){this._beforeError(r)}}_onRequest(t){let{options:r}=this,{timeout:s,url:a}=r;Net.default(t),this[YH]=rAe.default(t,s,a);let n=r.cache?"cacheableResponse":"response";t.once(n,p=>{this._onResponse(p)}),t.once("error",p=>{var h;t.destroy(),(h=t.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof rAe.TimeoutError?new cT(p,this.timings,this):new ps(p.message,p,this),this._beforeError(p)}),this[sAe]=Het.default(t,this,ett),this[Co]=t,this.emit("uploadProgress",this.uploadProgress);let c=this[bd],f=this.redirects.length===0?this:t;lt.default.nodeStream(c)?(c.pipe(f),c.once("error",p=>{this._beforeError(new lT(p,this))})):(this._unlockWrite(),lt.default.undefined(c)?(this._cannotHaveBody||this._noPipe)&&(f.end(),this._lockWrite()):(this._writeRequest(c,void 0,()=>{}),f.end(),this._lockWrite())),this.emit("request",t)}async _createCacheableRequest(t,r){return new Promise((s,a)=>{Object.assign(r,jet.default(t)),delete r.url;let n,c=WH.get(r.cache)(r,async f=>{f._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",f),s(f)});r.url=t,c.once("error",a),c.once("request",async f=>{n=f,s(n)})})}async _makeRequest(){var t,r,s,a,n;let{options:c}=this,{headers:f}=c;for(let U in f)if(lt.default.undefined(f[U]))delete f[U];else if(lt.default.null_(f[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(c.decompress&<.default.undefined(f["accept-encoding"])&&(f["accept-encoding"]=Ket?"gzip, deflate, br":"gzip, deflate"),c.cookieJar){let U=await c.cookieJar.getCookieString(c.url.toString());lt.default.nonEmptyString(U)&&(c.headers.cookie=U)}for(let U of c.hooks.beforeRequest){let K=await U(c);if(!lt.default.undefined(K)){c.request=()=>K;break}}c.body&&this[bd]!==c.body&&(this[bd]=c.body);let{agent:p,request:h,timeout:E,url:C}=c;if(c.dnsCache&&!("lookup"in c)&&(c.lookup=c.dnsCache.lookup),C.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${C.pathname}${C.search}`);if(U?.groups){let{socketPath:K,path:$}=U.groups;Object.assign(c,{socketPath:K,path:$,host:""})}}let S=C.protocol==="https:",x;c.http2?x=Met.auto:x=S?Fet.request:$fe.request;let I=(t=c.request)!==null&&t!==void 0?t:x,R=c.cache?this._createCacheableRequest:I;p&&!c.http2&&(c.agent=p[S?"https":"http"]),c[Co]=I,delete c.request,delete c.timeout;let N=c;if(N.shared=(r=c.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(s=c.cacheOptions)===null||s===void 0?void 0:s.cacheHeuristic,N.immutableMinTimeToLive=(a=c.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=c.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,c.dnsLookupIpVersion!==void 0)try{N.family=iAe.dnsLookupIpVersionToFamily(c.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}c.https&&("rejectUnauthorized"in c.https&&(N.rejectUnauthorized=c.https.rejectUnauthorized),c.https.checkServerIdentity&&(N.checkServerIdentity=c.https.checkServerIdentity),c.https.certificateAuthority&&(N.ca=c.https.certificateAuthority),c.https.certificate&&(N.cert=c.https.certificate),c.https.key&&(N.key=c.https.key),c.https.passphrase&&(N.passphrase=c.https.passphrase),c.https.pfx&&(N.pfx=c.https.pfx));try{let U=await R(C,N);lt.default.undefined(U)&&(U=x(C,N)),c.request=h,c.timeout=E,c.agent=p,c.https&&("rejectUnauthorized"in c.https&&delete N.rejectUnauthorized,c.https.checkServerIdentity&&delete N.checkServerIdentity,c.https.certificateAuthority&&delete N.ca,c.https.certificate&&delete N.cert,c.https.key&&delete N.key,c.https.passphrase&&delete N.passphrase,c.https.pfx&&delete N.pfx),zet(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof eAe.CacheError?new aT(U,this):new ps(U.message,U,this)}}async _error(t){try{for(let r of this.options.hooks.beforeError)t=await r(t)}catch(r){t=new ps(r.message,r,this)}this.destroy(t)}_beforeError(t){if(this[bI])return;let{options:r}=this,s=this.retryCount+1;this[bI]=!0,t instanceof ps||(t=new ps(t.message,t,this));let a=t,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await qet.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let c;try{let f;n&&"retry-after"in n.headers&&(f=Number(n.headers["retry-after"]),Number.isNaN(f)?(f=Date.parse(n.headers["retry-after"])-Date.now(),f<=0&&(f=1)):f*=1e3),c=await r.retry.calculateDelay({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:Vet.default({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:0})})}catch(f){this._error(new ps(f.message,f,this));return}if(c){let f=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,s)}catch(p){this._error(new ps(p.message,t,this));return}this.destroyed||(this.destroy(),this.emit("retry",s,t))};this[cAe]=setTimeout(f,c);return}}this._error(a)})()}_read(){this[nT]=!0;let t=this[iT];if(t&&!this[bI]){t.readableLength&&(this[nT]=!1);let r;for(;(r=t.read())!==null;){this[BI]+=r.length,this[aAe]=!0;let s=this.downloadProgress;s.percent<1&&this.emit("downloadProgress",s),this.push(r)}}}_write(t,r,s){let a=()=>{this._writeRequest(t,r,s)};this.requestInitialized?a():this[ZB].push(a)}_writeRequest(t,r,s){this[Co].destroyed||(this._progressCallbacks.push(()=>{this[SI]+=Buffer.byteLength(t,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[Co].write(t,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),s(a)}))}_final(t){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Co in this)){t();return}if(this[Co].destroyed){t();return}this[Co].end(s=>{s||(this[vI]=this[SI],this.emit("uploadProgress",this.uploadProgress),this[Co].emit("upload-complete")),t(s)})};this.requestInitialized?r():this[ZB].push(r)}_destroy(t,r){var s;this[bI]=!0,clearTimeout(this[cAe]),Co in this&&(this[YH](),!((s=this[iT])===null||s===void 0)&&s.complete||this[Co].destroy()),t!==null&&!lt.default.undefined(t)&&!(t instanceof ps)&&(t=new ps(t.message,t,this)),r(t)}get _isAboutToError(){return this[bI]}get ip(){var t;return(t=this.socket)===null||t===void 0?void 0:t.remoteAddress}get aborted(){var t,r,s;return((r=(t=this[Co])===null||t===void 0?void 0:t.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((s=this[lAe])===null||s===void 0)&&s.complete)}get socket(){var t,r;return(r=(t=this[Co])===null||t===void 0?void 0:t.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let t;return this[wI]?t=this[BI]/this[wI]:this[wI]===this[BI]?t=1:t=0,{percent:t,transferred:this[BI],total:this[wI]}}get uploadProgress(){let t;return this[vI]?t=this[SI]/this[vI]:this[vI]===this[SI]?t=1:t=0,{percent:t,transferred:this[SI],total:this[vI]}}get timings(){var t;return(t=this[Co])===null||t===void 0?void 0:t.timings}get isFromCache(){return this[oAe]}pipe(t,r){if(this[aAe])throw new Error("Failed to pipe. The response has been emitted already.");return t instanceof GH.ServerResponse&&this[rT].add(t),super.pipe(t,r)}unpipe(t){return t instanceof GH.ServerResponse&&this[rT].delete(t),super.unpipe(t),this}};_n.default=fT});var ev=G(Gu=>{"use strict";var ttt=Gu&&Gu.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),rtt=Gu&&Gu.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&ttt(t,e,r)};Object.defineProperty(Gu,"__esModule",{value:!0});Gu.CancelError=Gu.ParseError=void 0;var uAe=$B(),VH=class extends uAe.RequestError{constructor(t,r){let{options:s}=r.request;super(`${t.message} in "${s.url.toString()}"`,t,r.request),this.name="ParseError"}};Gu.ParseError=VH;var KH=class extends uAe.RequestError{constructor(t){super("Promise was canceled",{},t),this.name="CancelError"}get isCanceled(){return!0}};Gu.CancelError=KH;rtt($B(),Gu)});var AAe=G(JH=>{"use strict";Object.defineProperty(JH,"__esModule",{value:!0});var fAe=ev(),ntt=(e,t,r,s)=>{let{rawBody:a}=e;try{if(t==="text")return a.toString(s);if(t==="json")return a.length===0?"":r(a.toString());if(t==="buffer")return a;throw new fAe.ParseError({message:`Unknown body type '${t}'`,name:"Error"},e)}catch(n){throw new fAe.ParseError(n,e)}};JH.default=ntt});var zH=G(Dd=>{"use strict";var itt=Dd&&Dd.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),stt=Dd&&Dd.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&itt(t,e,r)};Object.defineProperty(Dd,"__esModule",{value:!0});var ott=Ce("events"),att=Up(),ltt=fue(),AT=ev(),pAe=AAe(),hAe=$B(),ctt=TH(),utt=UH(),dAe=_H(),ftt=["request","response","redirect","uploadProgress","downloadProgress"];function gAe(e){let t,r,s=new ott.EventEmitter,a=new ltt((c,f,p)=>{let h=E=>{let C=new hAe.default(void 0,e);C.retryCount=E,C._noPipe=!0,p(()=>C.destroy()),p.shouldReject=!1,p(()=>f(new AT.CancelError(C))),t=C,C.once("response",async I=>{var R;if(I.retryCount=E,I.request.aborted)return;let N;try{N=await utt.default(C),I.rawBody=N}catch{return}if(C._isAboutToError)return;let U=((R=I.headers["content-encoding"])!==null&&R!==void 0?R:"").toLowerCase(),K=["gzip","deflate","br"].includes(U),{options:$}=C;if(K&&!$.decompress)I.body=N;else try{I.body=pAe.default(I,$.responseType,$.parseJson,$.encoding)}catch(ie){if(I.body=N.toString(),dAe.isResponseOk(I)){C._beforeError(ie);return}}try{for(let[ie,fe]of $.hooks.afterResponse.entries())I=await fe(I,async le=>{let ge=hAe.default.normalizeArguments(void 0,{...le,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},$);ge.hooks.afterResponse=ge.hooks.afterResponse.slice(0,ie);for(let De of ge.hooks.beforeRetry)await De(ge);let pe=gAe(ge);return p(()=>{pe.catch(()=>{}),pe.cancel()}),pe})}catch(ie){C._beforeError(new AT.RequestError(ie.message,ie,C));return}if(!dAe.isResponseOk(I)){C._beforeError(new AT.HTTPError(I));return}r=I,c(C.options.resolveBodyOnly?I.body:I)});let S=I=>{if(a.isCanceled)return;let{options:R}=C;if(I instanceof AT.HTTPError&&!R.throwHttpErrors){let{response:N}=I;c(C.options.resolveBodyOnly?N.body:N);return}f(I)};C.once("error",S);let x=C.options.body;C.once("retry",(I,R)=>{var N,U;if(x===((N=R.request)===null||N===void 0?void 0:N.options.body)&&att.default.nodeStream((U=R.request)===null||U===void 0?void 0:U.options.body)){S(R);return}h(I)}),ctt.default(C,s,ftt)};h(0)});a.on=(c,f)=>(s.on(c,f),a);let n=c=>{let f=(async()=>{await a;let{options:p}=r.request;return pAe.default(r,c,p.parseJson,p.encoding)})();return Object.defineProperties(f,Object.getOwnPropertyDescriptors(a)),f};return a.json=()=>{let{headers:c}=t.options;return!t.writableFinished&&c.accept===void 0&&(c.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}Dd.default=gAe;stt(ev(),Dd)});var mAe=G(ZH=>{"use strict";Object.defineProperty(ZH,"__esModule",{value:!0});var Att=ev();function ptt(e,...t){let r=(async()=>{if(e instanceof Att.RequestError)try{for(let a of t)if(a)for(let n of a)e=await n(e)}catch(a){e=a}throw e})(),s=()=>r;return r.json=s,r.text=s,r.buffer=s,r.on=s,r}ZH.default=ptt});var IAe=G(XH=>{"use strict";Object.defineProperty(XH,"__esModule",{value:!0});var yAe=Up();function EAe(e){for(let t of Object.values(e))(yAe.default.plainObject(t)||yAe.default.array(t))&&EAe(t);return Object.freeze(e)}XH.default=EAe});var wAe=G(CAe=>{"use strict";Object.defineProperty(CAe,"__esModule",{value:!0})});var $H=G(Mc=>{"use strict";var htt=Mc&&Mc.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),dtt=Mc&&Mc.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&htt(t,e,r)};Object.defineProperty(Mc,"__esModule",{value:!0});Mc.defaultHandler=void 0;var BAe=Up(),Lc=zH(),gtt=mAe(),hT=$B(),mtt=IAe(),ytt={RequestError:Lc.RequestError,CacheError:Lc.CacheError,ReadError:Lc.ReadError,HTTPError:Lc.HTTPError,MaxRedirectsError:Lc.MaxRedirectsError,TimeoutError:Lc.TimeoutError,ParseError:Lc.ParseError,CancelError:Lc.CancelError,UnsupportedProtocolError:Lc.UnsupportedProtocolError,UploadError:Lc.UploadError},Ett=async e=>new Promise(t=>{setTimeout(t,e)}),{normalizeArguments:pT}=hT.default,vAe=(...e)=>{let t;for(let r of e)t=pT(void 0,r,t);return t},Itt=e=>e.isStream?new hT.default(void 0,e):Lc.default(e),Ctt=e=>"defaults"in e&&"options"in e.defaults,wtt=["get","post","put","patch","head","delete"];Mc.defaultHandler=(e,t)=>t(e);var SAe=(e,t)=>{if(e)for(let r of e)r(t)},bAe=e=>{e._rawHandlers=e.handlers,e.handlers=e.handlers.map(s=>(a,n)=>{let c,f=s(a,p=>(c=n(p),c));if(f!==c&&!a.isStream&&c){let p=f,{then:h,catch:E,finally:C}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(c)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(c)),p.then=h,p.catch=E,p.finally=C}return f});let t=(s,a={},n)=>{var c,f;let p=0,h=E=>e.handlers[p++](E,p===e.handlers.length?Itt:h);if(BAe.default.plainObject(s)){let E={...s,...a};hT.setNonEnumerableProperties([s,a],E),a=E,s=void 0}try{let E;try{SAe(e.options.hooks.init,a),SAe((c=a.hooks)===null||c===void 0?void 0:c.init,a)}catch(S){E=S}let C=pT(s,a,n??e.options);if(C[hT.kIsNormalizedAlready]=!0,E)throw new Lc.RequestError(E.message,E,C);return h(C)}catch(E){if(a.isStream)throw E;return gtt.default(E,e.options.hooks.beforeError,(f=a.hooks)===null||f===void 0?void 0:f.beforeError)}};t.extend=(...s)=>{let a=[e.options],n=[...e._rawHandlers],c;for(let f of s)Ctt(f)?(a.push(f.defaults.options),n.push(...f.defaults._rawHandlers),c=f.defaults.mutableDefaults):(a.push(f),"handlers"in f&&n.push(...f.handlers),c=f.mutableDefaults);return n=n.filter(f=>f!==Mc.defaultHandler),n.length===0&&n.push(Mc.defaultHandler),bAe({options:vAe(...a),handlers:n,mutableDefaults:!!c})};let r=async function*(s,a){let n=pT(s,a,e.options);n.resolveBodyOnly=!1;let c=n.pagination;if(!BAe.default.object(c))throw new TypeError("`options.pagination` must be implemented");let f=[],{countLimit:p}=c,h=0;for(;h{let n=[];for await(let c of r(s,a))n.push(c);return n},t.paginate.each=r,t.stream=(s,a)=>t(s,{...a,isStream:!0});for(let s of wtt)t[s]=(a,n)=>t(a,{...n,method:s}),t.stream[s]=(a,n)=>t(a,{...n,method:s,isStream:!0});return Object.assign(t,ytt),Object.defineProperty(t,"defaults",{value:e.mutableDefaults?e:mtt.default(e),writable:e.mutableDefaults,configurable:e.mutableDefaults,enumerable:!0}),t.mergeOptions=vAe,t};Mc.default=bAe;dtt(wAe(),Mc)});var xAe=G((_p,dT)=>{"use strict";var Btt=_p&&_p.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),DAe=_p&&_p.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Btt(t,e,r)};Object.defineProperty(_p,"__esModule",{value:!0});var vtt=Ce("url"),PAe=$H(),Stt={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:e})=>e},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:e=>e.request.options.responseType==="json"?e.body:JSON.parse(e.body),paginate:e=>{if(!Reflect.has(e.headers,"link"))return!1;let t=e.headers.link.split(","),r;for(let s of t){let a=s.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new vtt.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:e=>JSON.parse(e),stringifyJson:e=>JSON.stringify(e),cacheOptions:{}},handlers:[PAe.defaultHandler],mutableDefaults:!1},ej=PAe.default(Stt);_p.default=ej;dT.exports=ej;dT.exports.default=ej;dT.exports.__esModule=!0;DAe($H(),_p);DAe(zH(),_p)});var nn={};Vt(nn,{Method:()=>NAe,del:()=>ktt,get:()=>nj,getNetworkSettings:()=>FAe,post:()=>ij,put:()=>xtt,request:()=>tv});async function tj(e){return $l(QAe,e,()=>ae.readFilePromise(e).then(t=>(QAe.set(e,t),t)))}function Ptt({statusCode:e,statusMessage:t},r){let s=Gt(r,e,dt.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${e}`;return eI(r,`${s}${t?` (${t})`:""}`,a)}async function gT(e,{configuration:t,customErrorMessage:r}){try{return await e}catch(s){if(s.name!=="HTTPError")throw s;let a=r?.(s,t)??s.response.body?.error;a==null&&(s.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=s.message),s.code==="ETIMEDOUT"&&s.event==="socket"&&(a+=`(can be increased via ${Gt(t,"httpTimeout",dt.SETTING)})`);let n=new Lt(35,a,c=>{s.response&&c.reportError(35,` ${$f(t,{label:"Response Code",value:Uu(dt.NO_HINT,Ptt(s.response,t))})}`),s.request&&(c.reportError(35,` ${$f(t,{label:"Request Method",value:Uu(dt.NO_HINT,s.request.options.method)})}`),c.reportError(35,` ${$f(t,{label:"Request URL",value:Uu(dt.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&c.reportError(35,` ${$f(t,{label:"Request Redirects",value:Uu(dt.NO_HINT,Y4(t,s.request.redirects,dt.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&c.reportError(35,` ${$f(t,{label:"Request Retry Count",value:Uu(dt.NO_HINT,`${Gt(t,s.request.retryCount,dt.NUMBER)} (can be increased via ${Gt(t,"httpRetry",dt.SETTING)})`)})}`)});throw n.originalError=s,n}}function FAe(e,t){let r=[...t.configuration.get("networkSettings")].sort(([c],[f])=>f.length-c.length),s={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(s),n=typeof e=="string"?new URL(e):e;for(let[c,f]of r)if(rj.default.isMatch(n.hostname,c))for(let p of a){let h=f.get(p);h!==null&&typeof s[p]>"u"&&(s[p]=h)}for(let c of a)typeof s[c]>"u"&&(s[c]=t.configuration.get(c));return s}async function tv(e,t,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c="GET",wrapNetworkRequest:f}){let p={target:e,body:t,configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c},h=async()=>await Qtt(e,t,p),E=typeof f<"u"?await f(h,p):h;return await(await r.reduceHook(S=>S.wrapNetworkRequest,E,p))()}async function nj(e,{configuration:t,jsonResponse:r,customErrorMessage:s,wrapNetworkRequest:a,...n}){let c=()=>gT(tv(e,null,{configuration:t,wrapNetworkRequest:a,...n}),{configuration:t,customErrorMessage:s}).then(p=>p.body),f=await(typeof a<"u"?c():$l(kAe,e,()=>c().then(p=>(kAe.set(e,p),p))));return r?JSON.parse(f.toString()):f}async function xtt(e,t,{customErrorMessage:r,...s}){return(await gT(tv(e,t,{...s,method:"PUT"}),{customErrorMessage:r,configuration:s.configuration})).body}async function ij(e,t,{customErrorMessage:r,...s}){return(await gT(tv(e,t,{...s,method:"POST"}),{customErrorMessage:r,configuration:s.configuration})).body}async function ktt(e,{customErrorMessage:t,...r}){return(await gT(tv(e,null,{...r,method:"DELETE"}),{customErrorMessage:t,configuration:r.configuration})).body}async function Qtt(e,t,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c="GET"}){let f=typeof e=="string"?new URL(e):e,p=FAe(f,{configuration:r});if(p.enableNetwork===!1)throw new Lt(80,`Request to '${f.href}' has been blocked because of your configuration settings`);if(f.protocol==="http:"&&!rj.default.isMatch(f.hostname,r.get("unsafeHttpWhitelist")))throw new Lt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${f.hostname})`);let h={headers:s,method:c};h.responseType=n?"json":"buffer",t!==null&&(Buffer.isBuffer(t)||!a&&typeof t=="string"?h.body=t:h.json=t);let E=r.get("httpTimeout"),C=r.get("httpRetry"),S=r.get("enableStrictSsl"),x=p.httpsCaFilePath,I=p.httpsCertFilePath,R=p.httpsKeyFilePath,{default:N}=await Promise.resolve().then(()=>et(xAe())),U=x?await tj(x):void 0,K=I?await tj(I):void 0,$=R?await tj(R):void 0,ie={rejectUnauthorized:S,ca:U,cert:K,key:$},fe={http:p.httpProxy?new iue({proxy:p.httpProxy,proxyRequestOptions:ie}):btt,https:p.httpsProxy?new sue({proxy:p.httpsProxy,proxyRequestOptions:ie}):Dtt},le=N.extend({timeout:{socket:E},retry:C,agent:fe,https:{rejectUnauthorized:S,certificateAuthority:U,certificate:K,key:$},...h});return r.getLimit("networkConcurrency")(()=>le(f))}var TAe,RAe,rj,kAe,QAe,btt,Dtt,NAe,mT=Ze(()=>{bt();oue();TAe=Ce("https"),RAe=Ce("http"),rj=et(Zo());Nc();Tc();Qc();kAe=new Map,QAe=new Map,btt=new RAe.Agent({keepAlive:!0}),Dtt=new TAe.Agent({keepAlive:!0});NAe=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(NAe||{})});var Ui={};Vt(Ui,{availableParallelism:()=>oj,getArchitecture:()=>rv,getArchitectureName:()=>Ott,getArchitectureSet:()=>sj,getCaller:()=>_tt,major:()=>Ttt,openUrl:()=>Rtt});function Ntt(){if(process.platform!=="linux")return null;let e;try{e=ae.readFileSync(Ftt)}catch{}if(typeof e<"u"){if(e&&(e.includes("GLIBC")||e.includes("GNU libc")||e.includes("GNU C Library")))return"glibc";if(e&&e.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],s=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return dd(r,a=>{let n=a.match(s);if(!n)return dd.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function rv(){return LAe=LAe??{os:(process.env.YARN_IS_TEST_ENV?process.env.YARN_OS_OVERRIDE:void 0)??process.platform,cpu:(process.env.YARN_IS_TEST_ENV?process.env.YARN_CPU_OVERRIDE:void 0)??process.arch,libc:(process.env.YARN_IS_TEST_ENV?process.env.YARN_LIBC_OVERRIDE:void 0)??Ntt()}}function Ott(e=rv()){return e.libc?`${e.os}-${e.cpu}-${e.libc}`:`${e.os}-${e.cpu}`}function sj(){let e=rv();return MAe=MAe??{os:[e.os],cpu:[e.cpu],libc:e.libc?[e.libc]:[]}}function Utt(e){let t=Ltt.exec(e);if(!t)return null;let r=t[2]&&t[2].indexOf("native")===0,s=t[2]&&t[2].indexOf("eval")===0,a=Mtt.exec(t[2]);return s&&a!=null&&(t[2]=a[1],t[3]=a[2],t[4]=a[3]),{file:r?null:t[2],methodName:t[1]||"",arguments:r?[t[2]]:[],line:t[3]?+t[3]:null,column:t[4]?+t[4]:null}}function _tt(){let t=new Error().stack.split(` +`)[3];return Utt(t)}function oj(){return typeof yT.default.availableParallelism<"u"?yT.default.availableParallelism():Math.max(1,yT.default.cpus().length)}var yT,Ttt,OAe,Rtt,Ftt,LAe,MAe,Ltt,Mtt,ET=Ze(()=>{bt();yT=et(Ce("os"));IT();Qc();Ttt=Number(process.versions.node.split(".")[0]),OAe=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),Rtt=typeof OAe<"u"?async e=>{try{return await aj(OAe,[e],{cwd:Y.cwd()}),!0}catch{return!1}}:void 0,Ftt="/usr/bin/ldd";Ltt=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Mtt=/\((\S*)(?::(\d+))(?::(\d+))\)/});function pj(e,t,r,s,a){let n=GB(r);if(s.isArray||s.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((c,f)=>lj(e,`${t}[${f}]`,c,s,a)):String(n).split(/,/).map(c=>lj(e,t,c,s,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${t}" cannot be an array`);return lj(e,t,r,s,a)}function lj(e,t,r,s,a){let n=GB(r);switch(s.type){case"ANY":return UQ(n);case"SHAPE":return qtt(e,t,r,s,a);case"MAP":return Ytt(e,t,r,s,a)}if(n===null&&!s.isNullable&&s.default!==null)throw new Error(`Non-nullable configuration settings "${t}" cannot be set to null`);if("values"in s&&s.values?.includes(n))return n;let f=(()=>{if(s.type==="BOOLEAN"&&typeof n!="string")return DB(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${t}" to be a string, got ${typeof n}`);let p=Zk(n,{env:e.env});switch(s.type){case"ABSOLUTE_PATH":{let h=a,E=O8(r);return E&&E[0]!=="<"&&(h=Y.dirname(E)),Y.resolve(h,Ae.toPortablePath(p))}case"LOCATOR_LOOSE":return Np(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return Np(p);case"BOOLEAN":return DB(p);case"DURATION":return Xk(p,s.unit);default:return p}})();if("values"in s&&s.values&&!s.values.includes(f))throw new Error(`Invalid value, expected one of ${s.values.join(", ")}`);return f}function qtt(e,t,r,s,a){let n=GB(r);if(typeof n!="object"||Array.isArray(n))throw new ot(`Object configuration settings "${t}" must be an object`);let c=hj(e,s,{ignoreArrays:!0});if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=`${t}.${f}`;if(!s.properties[f])throw new ot(`Unrecognized configuration settings found: ${t}.${f} - run "yarn config" to see the list of settings supported in Yarn`);c.set(f,pj(e,h,p,s.properties[f],a))}return c}function Ytt(e,t,r,s,a){let n=GB(r),c=new Map;if(typeof n!="object"||Array.isArray(n))throw new ot(`Map configuration settings "${t}" must be an object`);if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=s.normalizeKeys?s.normalizeKeys(f):f,E=`${t}['${h}']`,C=s.valueDefinition;c.set(h,pj(e,E,p,C,a))}return c}function hj(e,t,{ignoreArrays:r=!1}={}){switch(t.type){case"SHAPE":{if(t.isArray&&!r)return[];let s=new Map;for(let[a,n]of Object.entries(t.properties))s.set(a,hj(e,n));return s}case"MAP":return t.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return t.default===null?null:e.projectCwd===null?Array.isArray(t.default)?t.default.map(s=>Y.normalize(s)):Y.isAbsolute(t.default)?Y.normalize(t.default):t.isNullable?null:void 0:Array.isArray(t.default)?t.default.map(s=>Y.resolve(e.projectCwd,s)):Y.resolve(e.projectCwd,t.default);case"DURATION":return Xk(t.default,t.unit);default:return t.default}}function wT(e,t,r){if(t.type==="SECRET"&&typeof e=="string"&&r.hideSecrets)return Gtt;if(t.type==="ABSOLUTE_PATH"&&typeof e=="string"&&r.getNativePaths)return Ae.fromPortablePath(e);if(t.isArray&&Array.isArray(e)){let s=[];for(let a of e)s.push(wT(a,t,r));return s}if(t.type==="MAP"&&e instanceof Map){if(e.size===0)return;let s=new Map;for(let[a,n]of e.entries()){let c=wT(n,t.valueDefinition,r);typeof c<"u"&&s.set(a,c)}return s}if(t.type==="SHAPE"&&e instanceof Map){if(e.size===0)return;let s=new Map;for(let[a,n]of e.entries()){let c=t.properties[a],f=wT(n,c,r);typeof f<"u"&&s.set(a,f)}return s}return e}function Wtt(){let e={};for(let[t,r]of Object.entries(process.env))t=t.toLowerCase(),t.startsWith(BT)&&(t=(0,_Ae.default)(t.slice(BT.length)),e[t]=r);return e}function uj(){let e=`${BT}rc_filename`;for(let[t,r]of Object.entries(process.env))if(t.toLowerCase()===e&&typeof r=="string")return r;return fj}async function UAe(e){try{return await ae.readFilePromise(e)}catch{return Buffer.of()}}async function Vtt(e,t){return Buffer.compare(...await Promise.all([UAe(e),UAe(t)]))===0}async function Ktt(e,t){let[r,s]=await Promise.all([ae.statPromise(e),ae.statPromise(t)]);return r.dev===s.dev&&r.ino===s.ino}async function ztt({configuration:e,selfPath:t}){let r=e.get("yarnPath");return e.get("ignorePath")||r===null||r===t||await Jtt(r,t)?null:r}var _Ae,Hp,HAe,jAe,GAe,cj,Htt,nv,jtt,jp,BT,fj,Gtt,DI,qAe,Aj,vT,CT,Jtt,Je,iv=Ze(()=>{bt();Sc();_Ae=et(sre()),Hp=et(N0());jt();HAe=et(Xre()),jAe=Ce("module"),GAe=et(M0()),cj=Ce("stream");Lce();fI();P8();x8();k8();Jce();Q8();rm();eue();HQ();Tc();wd();mT();Qc();ET();Lp();$o();Htt=function(){if(!Hp.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let e=Ae.toPortablePath(process.env.GITHUB_EVENT_PATH),t;try{t=ae.readJsonSync(e)}catch{return!1}return!(!("repository"in t)||!t.repository||(t.repository.private??!0))}(),nv=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),jtt=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","zipDataEpilogue","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","osOverride","cpuOverride","libcOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreScripts","ignoreCwd"]),jp=/^(?!v)[a-z0-9._-]+$/i,BT="yarn_",fj=".yarnrc.yml",Gtt="********",DI=(C=>(C.ANY="ANY",C.BOOLEAN="BOOLEAN",C.ABSOLUTE_PATH="ABSOLUTE_PATH",C.LOCATOR="LOCATOR",C.LOCATOR_LOOSE="LOCATOR_LOOSE",C.NUMBER="NUMBER",C.STRING="STRING",C.DURATION="DURATION",C.SECRET="SECRET",C.SHAPE="SHAPE",C.MAP="MAP",C))(DI||{}),qAe=dt,Aj=(c=>(c.MILLISECONDS="ms",c.SECONDS="s",c.MINUTES="m",c.HOURS="h",c.DAYS="d",c.WEEKS="w",c))(Aj||{}),vT=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(vT||{}),CT={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:M8()},cacheFolder:{description:"Folder where the cache files must be written",type:"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:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"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:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:uj()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:rQ,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:q4,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Hp.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Hp.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Hp.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"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:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request",type:"DURATION",unit:"ms",default:"1m"},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:oj()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(iQ),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads",type:"DURATION",unit:"d",default:"7d"},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Hp.isPR&&Htt,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!1},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},enableCacheClean:{description:"If false, disallows the `cache clean` command",type:"BOOLEAN",default:!0},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"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:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"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:"BOOLEAN",default:!1}}}}}}}};Jtt=process.platform==="win32"?Vtt:Ktt;Je=class e{constructor(t){this.isCI=Hp.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=t}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(t,r,s){let a=new e(t);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(CT);let n=typeof s<"u"?s:r instanceof Map?r:new Map;for(let[c,f]of n)a.activatePlugin(c,f);return a}static async find(t,r,{strict:s=!0,usePathCheck:a=null,useRc:n=!0}={}){let c=Wtt();delete c.rcFilename;let f=new e(t),p=await e.findRcFiles(t),h=await e.findFolderRcFile(gI());h&&(p.find(ge=>ge.path===h.path)||p.unshift(h));let E=$ce(p.map(le=>[le.path,le.data])),C=wt.dot,S=new Set(Object.keys(CT)),x=({yarnPath:le,ignorePath:ge,injectEnvironmentFiles:pe})=>({yarnPath:le,ignorePath:ge,injectEnvironmentFiles:pe}),I=({yarnPath:le,ignorePath:ge,injectEnvironmentFiles:pe,...De})=>{let ye={};for(let[d,ve]of Object.entries(De))S.has(d)&&(ye[d]=ve);return ye},R=({yarnPath:le,ignorePath:ge,...pe})=>{let De={};for(let[ye,d]of Object.entries(pe))S.has(ye)||(De[ye]=d);return De};if(f.importSettings(x(CT)),f.useWithSource("",x(c),t,{strict:!1}),E){let[le,ge]=E;f.useWithSource(le,x(ge),C,{strict:!1})}if(a){if(await ztt({configuration:f,selfPath:a})!==null)return f;f.useWithSource("",{ignorePath:!0},t,{strict:!1,overwrite:!0})}let N=await e.findProjectCwd(t);f.startingCwd=t,f.projectCwd=N;let U=Object.assign(Object.create(null),process.env);f.env=U;let K=await Promise.all(f.get("injectEnvironmentFiles").map(async le=>{let ge=le.endsWith("?")?await ae.readFilePromise(le.slice(0,-1),"utf8").catch(()=>""):await ae.readFilePromise(le,"utf8");return(0,HAe.parse)(ge)}));for(let le of K)for(let[ge,pe]of Object.entries(le))f.env[ge]=Zk(pe,{env:U});if(f.importSettings(I(CT)),f.useWithSource("",I(c),t,{strict:s}),E){let[le,ge]=E;f.useWithSource(le,I(ge),C,{strict:s})}let $=le=>"default"in le?le.default:le,ie=new Map([["@@core",Oce]]);if(r!==null)for(let le of r.plugins.keys())ie.set(le,$(r.modules.get(le)));for(let[le,ge]of ie)f.activatePlugin(le,ge);let fe=new Map([]);if(r!==null){let le=new Map;for(let[De,ye]of r.modules)le.set(De,()=>ye);let ge=new Set,pe=async(De,ye)=>{let{factory:d,name:ve}=Tp(De);if(!d||ge.has(ve))return;let Ie=new Map(le),me=X=>{if((0,jAe.isBuiltin)(X))return Tp(X);if(Ie.has(X))return Ie.get(X)();throw new ot(`This plugin cannot access the package referenced via ${X} which is neither a builtin, nor an exposed entry`)},ce=await JE(async()=>$(await d(me)),X=>`${X} (when initializing ${ve}, defined in ${ye})`);le.set(ve,()=>ce),ge.add(ve),fe.set(ve,ce)};if(c.plugins)for(let De of c.plugins.split(";")){let ye=Y.resolve(t,Ae.toPortablePath(De));await pe(ye,"")}for(let{path:De,cwd:ye,data:d}of p)if(n&&Array.isArray(d.plugins))for(let ve of d.plugins){let Ie=typeof ve!="string"?ve.path:ve,me=ve?.spec??"",ce=ve?.checksum??"";if(nv.has(me))continue;let X=Y.resolve(ye,Ae.toPortablePath(Ie));if(!await ae.existsPromise(X)){if(!me){let it=Gt(f,Y.basename(X,".cjs"),dt.NAME),_=Gt(f,".gitignore",dt.NAME),tt=Gt(f,f.values.get("rcFilename"),dt.NAME),Fe=Gt(f,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",dt.URL);throw new ot(`Missing source for the ${it} plugin - please try to remove the plugin from ${tt} then reinstall it manually. This error usually occurs because ${_} is incorrect, check ${Fe} to make sure your plugin folder isn't gitignored.`)}if(!me.match(/^https?:/)){let it=Gt(f,Y.basename(X,".cjs"),dt.NAME),_=Gt(f,f.values.get("rcFilename"),dt.NAME);throw new ot(`Failed to recognize the source for the ${it} plugin - please try to delete the plugin from ${_} then reinstall it manually.`)}let be=await nj(me,{configuration:f}),ke=As(be);if(ce&&ce!==ke){let it=Gt(f,Y.basename(X,".cjs"),dt.NAME),_=Gt(f,f.values.get("rcFilename"),dt.NAME),tt=Gt(f,`yarn plugin import ${me}`,dt.CODE);throw new ot(`Failed to fetch the ${it} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${_} then run ${tt} to reimport it.`)}await ae.mkdirPromise(Y.dirname(X),{recursive:!0}),await ae.writeFilePromise(X,be)}await pe(X,De)}}for(let[le,ge]of fe)f.activatePlugin(le,ge);if(f.useWithSource("",R(c),t,{strict:s}),E){let[le,ge]=E;f.useWithSource(le,R(ge),C,{strict:s})}return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),f}static async findRcFiles(t){let r=uj(),s=[],a=t,n=null;for(;a!==n;){n=a;let c=Y.join(n,r);if(ae.existsSync(c)){let f,p;try{p=await ae.readFilePromise(c,"utf8"),f=us(p)}catch{let h="";throw p?.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(h=" (in particular, make sure you list the colons after each key name)"),new ot(`Parse error when loading ${c}; please check it's proper Yaml${h}`)}s.unshift({path:c,cwd:n,data:f})}a=Y.dirname(n)}return s}static async findFolderRcFile(t){let r=Y.join(t,yr.rc),s;try{s=await ae.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=us(s);return{path:r,cwd:t,data:a}}static async findProjectCwd(t){let r=null,s=t,a=null;for(;s!==a;){if(a=s,ae.existsSync(Y.join(a,yr.lockfile)))return a;ae.existsSync(Y.join(a,yr.manifest))&&(r=a),s=Y.dirname(a)}return r}static async updateConfiguration(t,r,s={}){let a=uj(),n=Y.join(t,a),c=ae.existsSync(n)?us(await ae.readFilePromise(n,"utf8")):{},f=!1,p;if(typeof r=="function"){try{p=r(c)}catch{p=r({})}if(p===c)return!1}else{p=c;for(let h of Object.keys(r)){let E=c[h],C=r[h],S;if(typeof C=="function")try{S=C(E)}catch{S=C(void 0)}else S=C;E!==S&&(S===e.deleteProperty?delete p[h]:p[h]=S,f=!0)}if(!f)return!1}return await ae.changeFilePromise(n,Al(p),{automaticNewlines:!0}),!0}static async addPlugin(t,r){r.length!==0&&await e.updateConfiguration(t,s=>{let a=s.plugins??[];if(a.length===0)return{...s,plugins:r};let n=[],c=[...r];for(let f of a){let p=typeof f!="string"?f.path:f,h=c.find(E=>E.path===p);h?(n.push(h),c=c.filter(E=>E!==h)):n.push(f)}return n.push(...c),{...s,plugins:n}})}static async updateHomeConfiguration(t){let r=gI();return await e.updateConfiguration(r,t)}activatePlugin(t,r){this.plugins.set(t,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(t){for(let[r,s]of Object.entries(t))if(s!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,s),this.values.set(r,hj(this,s))}}useWithSource(t,r,s,a){try{this.use(t,r,s,a)}catch(n){throw n.message+=` (in ${Gt(this,t,dt.PATH)})`,n}}use(t,r,s,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let c of["enableStrictSettings",...Object.keys(r)]){let f=r[c],p=O8(f);if(p&&(t=p),typeof f>"u"||c==="plugins"||t===""&&jtt.has(c))continue;if(c==="rcFilename")throw new ot(`The rcFilename settings can only be set via ${`${BT}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(c);if(!h){let C=gI(),S=t[0]!=="<"?Y.dirname(t):null;if(a&&!(S!==null?C===S:!1))throw new ot(`Unrecognized or legacy configuration settings found: ${c} - run "yarn config" to see the list of settings supported in Yarn`);this.invalid.set(c,t);continue}if(this.sources.has(c)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=pj(this,c,f,h,s)}catch(C){throw C.message+=` in ${Gt(this,t,dt.PATH)}`,C}if(c==="enableStrictSettings"&&t!==""){a=E;continue}if(h.type==="MAP"){let C=this.values.get(c);this.values.set(c,new Map(n?[...C,...E]:[...E,...C])),this.sources.set(c,`${this.sources.get(c)}, ${t}`)}else if(h.isArray&&h.concatenateValues){let C=this.values.get(c);this.values.set(c,n?[...C,...E]:[...E,...C]),this.sources.set(c,`${this.sources.get(c)}, ${t}`)}else this.values.set(c,E),this.sources.set(c,t)}}get(t){if(!this.values.has(t))throw new Error(`Invalid configuration key "${t}"`);return this.values.get(t)}getSpecial(t,{hideSecrets:r=!1,getNativePaths:s=!1}){let a=this.get(t),n=this.settings.get(t);if(typeof n>"u")throw new ot(`Couldn't find a configuration settings named "${t}"`);return wT(a,n,{hideSecrets:r,getNativePaths:s})}getSubprocessStreams(t,{header:r,prefix:s,report:a}){let n,c,f=ae.createWriteStream(t);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${s} ${Gt(this,"STDOUT","green")}`),h=a.createStreamReporter(`${s} ${Gt(this,"STDERR","red")}`);n=new cj.PassThrough,n.pipe(p),n.pipe(f),c=new cj.PassThrough,c.pipe(h),c.pipe(f)}else n=f,c=f,typeof r<"u"&&n.write(`${r} +`);return{stdout:n,stderr:c}}makeResolver(){let t=[];for(let r of this.plugins.values())for(let s of r.resolvers||[])t.push(new s);return new nm([new MQ,new Ii,...t])}makeFetcher(){let t=[];for(let r of this.plugins.values())for(let s of r.fetchers||[])t.push(new s);return new AI([new pI,new hI,...t])}getLinkers(){let t=[];for(let r of this.plugins.values())for(let s of r.linkers||[])t.push(new s);return t}getSupportedArchitectures(){let t=rv(),r=this.get("supportedArchitectures"),s=r.get("os");s!==null&&(s=s.map(c=>c==="current"?t.os:c));let a=r.get("cpu");a!==null&&(a=a.map(c=>c==="current"?t.cpu:c));let n=r.get("libc");return n!==null&&(n=Xl(n,c=>c==="current"?t.libc??Xl.skip:c)),{os:s,cpu:a,libc:n}}isInteractive({interactive:t,stdout:r}){return r.isTTY?t??this.get("preferInteractive"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let t=this.packageExtensions,r=(s,a,{userProvided:n=!1}={})=>{if(!yl(s.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let c=new _t;c.load(a,{yamlCompatibilityMode:!0});let f=bB(t,s.identHash),p=[];f.push([s.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:s};for(let E of c.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of c.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,C]of c.peerDependenciesMeta)for(let[S,x]of Object.entries(C))p.push({...h,type:"PeerDependencyMeta",selector:E,key:S,value:x})};await this.triggerHook(s=>s.registerPackageExtensions,this,r);for(let[s,a]of this.get("packageExtensions"))r(Bd(s,!0),zk(a),{userProvided:!0});return t}normalizeLocator(t){return yl(t.reference)?Js(t,`${this.get("defaultProtocol")}${t.reference}`):jp.test(t.reference)?Js(t,`${this.get("defaultProtocol")}${t.reference}`):t}normalizeDependency(t){return yl(t.range)?Un(t,`${this.get("defaultProtocol")}${t.range}`):jp.test(t.range)?Un(t,`${this.get("defaultProtocol")}${t.range}`):t}normalizeDependencyMap(t){return new Map([...t].map(([r,s])=>[r,this.normalizeDependency(s)]))}normalizePackage(t,{packageExtensions:r}){let s=FB(t),a=r.get(t.identHash);if(typeof a<"u"){let c=t.version;if(c!==null){for(let[f,p]of a)if(rA(c,f))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof s.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",s.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof s.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",s.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=s.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",$l(s.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:O4(h)}}}let n=c=>c.scope?`${c.scope}__${c.name}`:`${c.name}`;for(let c of s.peerDependenciesMeta.keys()){let f=ka(c);s.peerDependencies.has(f.identHash)||s.peerDependencies.set(f.identHash,Un(f,"*"))}for(let c of s.peerDependencies.values()){if(c.scope==="types")continue;let f=n(c),p=Qa("types",f),h=fn(p);s.peerDependencies.has(p.identHash)||s.peerDependenciesMeta.has(h)||s.dependencies.has(p.identHash)||(s.peerDependencies.set(p.identHash,Un(p,"*")),s.peerDependenciesMeta.set(h,{optional:!0}))}return s.dependencies=new Map(Ks(s.dependencies,([,c])=>gl(c))),s.peerDependencies=new Map(Ks(s.peerDependencies,([,c])=>gl(c))),s}getLimit(t){return $l(this.limits,t,()=>(0,GAe.default)(this.get(t)))}async triggerHook(t,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=t(a);n&&await n(...r)}}async triggerMultipleHooks(t,r){for(let s of r)await this.triggerHook(t,...s)}async reduceHook(t,r,...s){let a=r;for(let n of this.plugins.values()){let c=n.hooks;if(!c)continue;let f=t(c);f&&(a=await f(a,...s))}return a}async firstHook(t,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=t(a);if(!n)continue;let c=await n(...r);if(typeof c<"u")return c}return null}}});var Yr={};Vt(Yr,{EndStrategy:()=>yj,ExecError:()=>ST,PipeError:()=>sv,execvp:()=>aj,pipevp:()=>qu});function am(e){return e!==null&&typeof e.fd=="number"}function dj(){}function gj(){for(let e of lm)e.kill()}async function qu(e,t,{cwd:r,env:s=process.env,strict:a=!1,stdin:n=null,stdout:c,stderr:f,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":am(n)&&(h[0]=n),am(c)&&(h[1]=c),am(f)&&(h[2]=f);let E=(0,mj.default)(e,t,{cwd:Ae.fromPortablePath(r),env:{...s,PWD:Ae.fromPortablePath(r)},stdio:h});lm.add(E),lm.size===1&&(process.on("SIGINT",dj),process.on("SIGTERM",gj)),!am(n)&&n!==null&&n.pipe(E.stdin),am(c)||E.stdout.pipe(c,{end:!1}),am(f)||E.stderr.pipe(f,{end:!1});let C=()=>{for(let S of new Set([c,f]))am(S)||S.end()};return new Promise((S,x)=>{E.on("error",I=>{lm.delete(E),lm.size===0&&(process.off("SIGINT",dj),process.off("SIGTERM",gj)),(p===2||p===1)&&C(),x(I)}),E.on("close",(I,R)=>{lm.delete(E),lm.size===0&&(process.off("SIGINT",dj),process.off("SIGTERM",gj)),(p===2||p===1&&I!==0)&&C(),I===0||!a?S({code:Ej(I,R)}):x(new sv({fileName:e,code:I,signal:R}))})})}async function aj(e,t,{cwd:r,env:s=process.env,encoding:a="utf8",strict:n=!1}){let c=["ignore","pipe","pipe"],f=[],p=[],h=Ae.fromPortablePath(r);typeof s.PWD<"u"&&(s={...s,PWD:h});let E=(0,mj.default)(e,t,{cwd:h,env:s,stdio:c});return E.stdout.on("data",C=>{f.push(C)}),E.stderr.on("data",C=>{p.push(C)}),await new Promise((C,S)=>{E.on("error",x=>{let I=Je.create(r),R=Gt(I,e,dt.PATH);S(new Lt(1,`Process ${R} failed to spawn`,N=>{N.reportError(1,` ${$f(I,{label:"Thrown Error",value:Uu(dt.NO_HINT,x.message)})}`)}))}),E.on("close",(x,I)=>{let R=a==="buffer"?Buffer.concat(f):Buffer.concat(f).toString(a),N=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);x===0||!n?C({code:Ej(x,I),stdout:R,stderr:N}):S(new ST({fileName:e,code:x,signal:I,stdout:R,stderr:N}))})})}function Ej(e,t){let r=Ztt.get(t);return typeof r<"u"?128+r:e??1}function Xtt(e,t,{configuration:r,report:s}){s.reportError(1,` ${$f(r,e!==null?{label:"Exit Code",value:Uu(dt.NUMBER,e)}:{label:"Exit Signal",value:Uu(dt.CODE,t)})}`)}var mj,yj,sv,ST,lm,Ztt,IT=Ze(()=>{bt();mj=et(RU());iv();Nc();Tc();yj=(s=>(s[s.Never=0]="Never",s[s.ErrorCode=1]="ErrorCode",s[s.Always=2]="Always",s))(yj||{}),sv=class extends Lt{constructor({fileName:t,code:r,signal:s}){let a=Je.create(Y.cwd()),n=Gt(a,t,dt.PATH);super(1,`Child ${n} reported an error`,c=>{Xtt(r,s,{configuration:a,report:c})}),this.code=Ej(r,s)}},ST=class extends sv{constructor({fileName:t,code:r,signal:s,stdout:a,stderr:n}){super({fileName:t,code:r,signal:s}),this.stdout=a,this.stderr=n}};lm=new Set;Ztt=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function WAe(e){YAe=e}function ov(){return typeof Ij>"u"&&(Ij=YAe()),Ij}var Ij,YAe,Cj=Ze(()=>{YAe=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var VAe=G((bT,Bj)=>{var $tt=Object.assign({},Ce("fs")),wj=function(){var e=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(e=e||__filename),function(t){t=t||{};var r=typeof t<"u"?t:{},s,a;r.ready=new Promise(function(ze,at){s=ze,a=at});var n={},c;for(c in r)r.hasOwnProperty(c)&&(n[c]=r[c]);var f=[],p="./this.program",h=function(ze,at){throw at},E=!1,C=!0,S="";function x(ze){return r.locateFile?r.locateFile(ze,S):S+ze}var I,R,N,U;C&&(E?S=Ce("path").dirname(S)+"/":S=__dirname+"/",I=function(at,St){var lr=qa(at);return lr?St?lr:lr.toString():(N||(N=$tt),U||(U=Ce("path")),at=U.normalize(at),N.readFileSync(at,St?null:"utf8"))},R=function(at){var St=I(at,!0);return St.buffer||(St=new Uint8Array(St)),ve(St.buffer),St},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),f=process.argv.slice(2),h=function(ze){process.exit(ze)},r.inspect=function(){return"[Emscripten Module object]"});var K=r.print||console.log.bind(console),$=r.printErr||console.warn.bind(console);for(c in n)n.hasOwnProperty(c)&&(r[c]=n[c]);n=null,r.arguments&&(f=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var ie=0,fe=function(ze){ie=ze},le;r.wasmBinary&&(le=r.wasmBinary);var ge=r.noExitRuntime||!0;typeof WebAssembly!="object"&&is("no native wasm support detected");function pe(ze,at,St){switch(at=at||"i8",at.charAt(at.length-1)==="*"&&(at="i32"),at){case"i1":return je[ze>>0];case"i8":return je[ze>>0];case"i16":return yh((ze>>1)*2);case"i32":return co((ze>>2)*4);case"i64":return co((ze>>2)*4);case"float":return df((ze>>2)*4);case"double":return mh((ze>>3)*8);default:is("invalid type for getValue: "+at)}return null}var De,ye=!1,d;function ve(ze,at){ze||is("Assertion failed: "+at)}function Ie(ze){var at=r["_"+ze];return ve(at,"Cannot call unknown function "+ze+", make sure it is exported"),at}function me(ze,at,St,lr,te){var Ee={string:function(qi){var Nn=0;if(qi!=null&&qi!==0){var Xa=(qi.length<<2)+1;Nn=vi(Xa),it(qi,Nn,Xa)}return Nn},array:function(qi){var Nn=vi(qi.length);return Fe(qi,Nn),Nn}};function Oe(qi){return at==="string"?be(qi):at==="boolean"?!!qi:qi}var mt=Ie(ze),Et=[],Dt=0;if(lr)for(var tr=0;tr=St)&&Te[lr];)++lr;return X.decode(Te.subarray(ze,lr))}function ke(ze,at,St,lr){if(!(lr>0))return 0;for(var te=St,Ee=St+lr-1,Oe=0;Oe=55296&&mt<=57343){var Et=ze.charCodeAt(++Oe);mt=65536+((mt&1023)<<10)|Et&1023}if(mt<=127){if(St>=Ee)break;at[St++]=mt}else if(mt<=2047){if(St+1>=Ee)break;at[St++]=192|mt>>6,at[St++]=128|mt&63}else if(mt<=65535){if(St+2>=Ee)break;at[St++]=224|mt>>12,at[St++]=128|mt>>6&63,at[St++]=128|mt&63}else{if(St+3>=Ee)break;at[St++]=240|mt>>18,at[St++]=128|mt>>12&63,at[St++]=128|mt>>6&63,at[St++]=128|mt&63}}return at[St]=0,St-te}function it(ze,at,St){return ke(ze,Te,at,St)}function _(ze){for(var at=0,St=0;St=55296&&lr<=57343&&(lr=65536+((lr&1023)<<10)|ze.charCodeAt(++St)&1023),lr<=127?++at:lr<=2047?at+=2:lr<=65535?at+=3:at+=4}return at}function tt(ze){var at=_(ze)+1,St=Va(at);return St&&ke(ze,je,St,at),St}function Fe(ze,at){je.set(ze,at)}function Qe(ze,at){return ze%at>0&&(ze+=at-ze%at),ze}var Se,je,Te,ct,Me,P,w,D,y,F;function z(ze){Se=ze,r.HEAP_DATA_VIEW=F=new DataView(ze),r.HEAP8=je=new Int8Array(ze),r.HEAP16=ct=new Int16Array(ze),r.HEAP32=P=new Int32Array(ze),r.HEAPU8=Te=new Uint8Array(ze),r.HEAPU16=Me=new Uint16Array(ze),r.HEAPU32=w=new Uint32Array(ze),r.HEAPF32=D=new Float32Array(ze),r.HEAPF64=y=new Float64Array(ze)}var Z=r.INITIAL_MEMORY||16777216,ee,se=[],xe=[],Ne=[],ut=!1;function Ct(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)Pt(r.preRun.shift());Ns(se)}function Yt(){ut=!0,Ns(xe)}function ir(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Pr(r.postRun.shift());Ns(Ne)}function Pt(ze){se.unshift(ze)}function mn(ze){xe.unshift(ze)}function Pr(ze){Ne.unshift(ze)}var Cr=0,Lr=null,on=null;function ci(ze){Cr++,r.monitorRunDependencies&&r.monitorRunDependencies(Cr)}function Do(ze){if(Cr--,r.monitorRunDependencies&&r.monitorRunDependencies(Cr),Cr==0&&(Lr!==null&&(clearInterval(Lr),Lr=null),on)){var at=on;on=null,at()}}r.preloadedImages={},r.preloadedAudios={};function is(ze){r.onAbort&&r.onAbort(ze),ze+="",$(ze),ye=!0,d=1,ze="abort("+ze+"). Build with -s ASSERTIONS=1 for more info.";var at=new WebAssembly.RuntimeError(ze);throw a(at),at}var ao="data:application/octet-stream;base64,";function Po(ze){return ze.startsWith(ao)}var ji="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";Po(ji)||(ji=x(ji));function lo(ze){try{if(ze==ji&&le)return new Uint8Array(le);var at=qa(ze);if(at)return at;if(R)return R(ze);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(St){is(St)}}function xo(ze,at){var St,lr,te;try{te=lo(ze),lr=new WebAssembly.Module(te),St=new WebAssembly.Instance(lr,at)}catch(Oe){var Ee=Oe.toString();throw $("failed to compile wasm module: "+Ee),(Ee.includes("imported Memory")||Ee.includes("memory import"))&&$("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)."),Oe}return[St,lr]}function FA(){var ze={a:Ue};function at(te,Ee){var Oe=te.exports;r.asm=Oe,De=r.asm.g,z(De.buffer),ee=r.asm.W,mn(r.asm.h),Do("wasm-instantiate")}if(ci("wasm-instantiate"),r.instantiateWasm)try{var St=r.instantiateWasm(ze,at);return St}catch(te){return $("Module.instantiateWasm callback failed with error: "+te),!1}var lr=xo(ji,ze);return at(lr[0]),r.asm}function df(ze){return F.getFloat32(ze,!0)}function mh(ze){return F.getFloat64(ze,!0)}function yh(ze){return F.getInt16(ze,!0)}function co(ze){return F.getInt32(ze,!0)}function qn(ze,at){F.setInt32(ze,at,!0)}function Ns(ze){for(;ze.length>0;){var at=ze.shift();if(typeof at=="function"){at(r);continue}var St=at.func;typeof St=="number"?at.arg===void 0?ee.get(St)():ee.get(St)(at.arg):St(at.arg===void 0?null:at.arg)}}function uo(ze,at){var St=new Date(co((ze>>2)*4)*1e3);qn((at>>2)*4,St.getUTCSeconds()),qn((at+4>>2)*4,St.getUTCMinutes()),qn((at+8>>2)*4,St.getUTCHours()),qn((at+12>>2)*4,St.getUTCDate()),qn((at+16>>2)*4,St.getUTCMonth()),qn((at+20>>2)*4,St.getUTCFullYear()-1900),qn((at+24>>2)*4,St.getUTCDay()),qn((at+36>>2)*4,0),qn((at+32>>2)*4,0);var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return qn((at+28>>2)*4,te),uo.GMTString||(uo.GMTString=tt("GMT")),qn((at+40>>2)*4,uo.GMTString),at}function ou(ze,at){return uo(ze,at)}function au(ze,at,St){Te.copyWithin(ze,at,at+St)}function lu(ze){try{return De.grow(ze-Se.byteLength+65535>>>16),z(De.buffer),1}catch{}}function NA(ze){var at=Te.length;ze=ze>>>0;var St=2147483648;if(ze>St)return!1;for(var lr=1;lr<=4;lr*=2){var te=at*(1+.2/lr);te=Math.min(te,ze+100663296);var Ee=Math.min(St,Qe(Math.max(ze,te),65536)),Oe=lu(Ee);if(Oe)return!0}return!1}function OA(ze){fe(ze)}function Aa(ze){var at=Date.now()/1e3|0;return ze&&qn((ze>>2)*4,at),at}function pa(){if(pa.called)return;pa.called=!0;var ze=new Date().getFullYear(),at=new Date(ze,0,1),St=new Date(ze,6,1),lr=at.getTimezoneOffset(),te=St.getTimezoneOffset(),Ee=Math.max(lr,te);qn((Tl()>>2)*4,Ee*60),qn((vs()>>2)*4,+(lr!=te));function Oe(pn){var ui=pn.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ui?ui[1]:"GMT"}var mt=Oe(at),Et=Oe(St),Dt=tt(mt),tr=tt(Et);te>2)*4,Dt),qn((Mi()+4>>2)*4,tr)):(qn((Mi()>>2)*4,tr),qn((Mi()+4>>2)*4,Dt))}function LA(ze){pa();var at=Date.UTC(co((ze+20>>2)*4)+1900,co((ze+16>>2)*4),co((ze+12>>2)*4),co((ze+8>>2)*4),co((ze+4>>2)*4),co((ze>>2)*4),0),St=new Date(at);qn((ze+24>>2)*4,St.getUTCDay());var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return qn((ze+28>>2)*4,te),St.getTime()/1e3|0}var gr=typeof atob=="function"?atob:function(ze){var at="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",St="",lr,te,Ee,Oe,mt,Et,Dt,tr=0;ze=ze.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Oe=at.indexOf(ze.charAt(tr++)),mt=at.indexOf(ze.charAt(tr++)),Et=at.indexOf(ze.charAt(tr++)),Dt=at.indexOf(ze.charAt(tr++)),lr=Oe<<2|mt>>4,te=(mt&15)<<4|Et>>2,Ee=(Et&3)<<6|Dt,St=St+String.fromCharCode(lr),Et!==64&&(St=St+String.fromCharCode(te)),Dt!==64&&(St=St+String.fromCharCode(Ee));while(tr0||(Ct(),Cr>0))return;function at(){Fn||(Fn=!0,r.calledRun=!0,!ye&&(Yt(),s(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),ir()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),at()},1)):at()}if(r.run=dc,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return dc(),t}}();typeof bT=="object"&&typeof Bj=="object"?Bj.exports=wj:typeof define=="function"&&define.amd?define([],function(){return wj}):typeof bT=="object"&&(bT.createModule=wj)});var Gp,KAe,JAe,zAe=Ze(()=>{Gp=["number","number"],KAe=(X=>(X[X.ZIP_ER_OK=0]="ZIP_ER_OK",X[X.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",X[X.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",X[X.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",X[X.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",X[X.ZIP_ER_READ=5]="ZIP_ER_READ",X[X.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",X[X.ZIP_ER_CRC=7]="ZIP_ER_CRC",X[X.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",X[X.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",X[X.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",X[X.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",X[X.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",X[X.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",X[X.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",X[X.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",X[X.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",X[X.ZIP_ER_EOF=17]="ZIP_ER_EOF",X[X.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",X[X.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",X[X.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",X[X.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",X[X.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",X[X.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",X[X.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",X[X.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",X[X.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",X[X.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",X[X.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",X[X.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",X[X.ZIP_ER_TELL=30]="ZIP_ER_TELL",X[X.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",X))(KAe||{}),JAe=e=>({get HEAPU8(){return e.HEAPU8},errors:KAe,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,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:e._malloc(1),uint32S:e._malloc(4),malloc:e._malloc,free:e._free,getValue:e.getValue,openFromSource:e.cwrap("zip_open_from_source","number",["number","number","number"]),close:e.cwrap("zip_close","number",["number"]),discard:e.cwrap("zip_discard",null,["number"]),getError:e.cwrap("zip_get_error","number",["number"]),getName:e.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:e.cwrap("zip_get_num_entries","number",["number","number"]),delete:e.cwrap("zip_delete","number",["number","number"]),statIndex:e.cwrap("zip_stat_index","number",["number",...Gp,"number","number"]),fopenIndex:e.cwrap("zip_fopen_index","number",["number",...Gp,"number"]),fread:e.cwrap("zip_fread","number",["number","number","number","number"]),fclose:e.cwrap("zip_fclose","number",["number"]),dir:{add:e.cwrap("zip_dir_add","number",["number","string"])},file:{add:e.cwrap("zip_file_add","number",["number","string","number","number"]),getError:e.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:e.cwrap("zip_file_get_external_attributes","number",["number",...Gp,"number","number","number"]),setExternalAttributes:e.cwrap("zip_file_set_external_attributes","number",["number",...Gp,"number","number","number"]),setMtime:e.cwrap("zip_file_set_mtime","number",["number",...Gp,"number","number"]),setCompression:e.cwrap("zip_set_file_compression","number",["number",...Gp,"number","number"])},ext:{countSymlinks:e.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:e.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:e.cwrap("zip_error_strerror","string",["number"])},name:{locate:e.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:e.cwrap("zip_source_buffer_create","number",["number",...Gp,"number","number"]),fromBuffer:e.cwrap("zip_source_buffer","number",["number","number",...Gp,"number"]),free:e.cwrap("zip_source_free",null,["number"]),keep:e.cwrap("zip_source_keep",null,["number"]),open:e.cwrap("zip_source_open","number",["number"]),close:e.cwrap("zip_source_close","number",["number"]),seek:e.cwrap("zip_source_seek","number",["number",...Gp,"number"]),tell:e.cwrap("zip_source_tell","number",["number"]),read:e.cwrap("zip_source_read","number",["number","number","number"]),error:e.cwrap("zip_source_error","number",["number"])},struct:{statS:e.cwrap("zipstruct_statS","number",[]),statSize:e.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:e.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:e.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:e.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:e.cwrap("zipstruct_stat_crc","number",["number"]),errorS:e.cwrap("zipstruct_errorS","number",[]),errorCodeZip:e.cwrap("zipstruct_error_code_zip","number",["number"])}})});function vj(e,t){let r=e.indexOf(t);if(r<=0)return null;let s=r;for(;r>=0&&(s=r+t.length,e[s]!==Y.sep);){if(e[r-1]===Y.sep)return null;r=e.indexOf(t,s)}return e.length>s&&e[s]!==Y.sep?null:e.slice(0,s)}var nA,ZAe=Ze(()=>{bt();bt();iA();nA=class e extends td{static async openPromise(t,r){let s=new e(r);try{return await t(s)}finally{s.saveAndClose()}}constructor(t={}){let r=t.fileExtensions,s=t.readOnlyArchives,a=typeof r>"u"?f=>vj(f,".zip"):f=>{for(let p of r){let h=vj(f,p);if(h)return h}return null},n=(f,p)=>new hs(p,{baseFs:f,readOnly:s,stats:f.statSync(p),customZipImplementation:t.customZipImplementation}),c=async(f,p)=>{let h={baseFs:f,readOnly:s,stats:await f.statPromise(p),customZipImplementation:t.customZipImplementation};return()=>new hs(p,h)};super({...t,factorySync:n,factoryPromise:c,getMountPoint:a})}}});var Sj,PI,bj=Ze(()=>{Cj();Sj=class extends Error{constructor(t,r){super(t),this.name="Libzip Error",this.code=r}},PI=class{constructor(t){this.filesShouldBeCached=!0;let r="buffer"in t?t.buffer:t.baseFs.readFileSync(t.path);this.libzip=ov();let s=this.libzip.malloc(4);try{let c=0;t.readOnly&&(c|=this.libzip.ZIP_RDONLY);let f=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(f,c,s),this.lzSource=f}catch(p){throw this.libzip.source.free(f),p}if(this.zip===0){let p=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(p,this.libzip.getValue(s,"i32")),this.makeLibzipError(p)}}finally{this.libzip.free(s)}let a=this.libzip.getNumEntries(this.zip,0),n=new Array(a);for(let c=0;c>>0,n=this.libzip.struct.statMtime(r)>>>0,c=this.libzip.struct.statCrc(r)>>>0;return{size:a,mtime:n,crc:c}}makeLibzipError(t){let r=this.libzip.struct.errorCodeZip(t),s=this.libzip.error.strerror(t),a=new Sj(s,this.libzip.errors[r]);if(r===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${a.message}`);return a}setFileSource(t,r,s){let a=this.allocateSource(s);try{let n=this.libzip.file.add(this.zip,t,a,this.libzip.ZIP_FL_OVERWRITE);if(n===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(r!==null&&this.libzip.file.setCompression(this.zip,n,0,r[0],r[1])===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return n}catch(n){throw this.libzip.source.free(a),n}}setMtime(t,r){if(this.libzip.file.setMtime(this.zip,t,0,r,0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}getExternalAttributes(t){if(this.libzip.file.getExternalAttributes(this.zip,t,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let s=this.libzip.getValue(this.libzip.uint08S,"i8")>>>0,a=this.libzip.getValue(this.libzip.uint32S,"i32")>>>0;return[s,a]}setExternalAttributes(t,r,s){if(this.libzip.file.setExternalAttributes(this.zip,t,0,0,r,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}locate(t){return this.libzip.name.locate(this.zip,t,0)}getFileSource(t){let r=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,t,0,0,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statCompSize(r),n=this.libzip.struct.statCompMethod(r),c=this.libzip.malloc(a);try{let f=this.libzip.fopenIndex(this.zip,t,0,this.libzip.ZIP_FL_COMPRESSED);if(f===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let p=this.libzip.fread(f,c,a,0);if(p===-1)throw this.makeLibzipError(this.libzip.file.getError(f));if(pa)throw new Error("Overread");let h=this.libzip.HEAPU8.subarray(c,c+a);return{data:Buffer.from(h),compressionMethod:n}}finally{this.libzip.fclose(f)}}finally{this.libzip.free(c)}}deleteEntry(t){if(this.libzip.delete(this.zip,t)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}addDirectory(t){let r=this.libzip.dir.add(this.zip,t);if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return r}getBufferAndClose(){try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let t=this.libzip.source.tell(this.lzSource);if(t===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let r=this.libzip.malloc(t);if(!r)throw new Error("Couldn't allocate enough memory");try{let s=this.libzip.source.read(this.lzSource,r,t);if(s===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(st)throw new Error("Overread");let a=Buffer.from(this.libzip.HEAPU8.subarray(r,r+t));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(a=Buffer.concat([a,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),a}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource)}}allocateBuffer(t){Buffer.isBuffer(t)||(t=Buffer.from(t));let r=this.libzip.malloc(t.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,t.byteLength).set(t),{buffer:r,byteLength:t.byteLength}}allocateUnattachedSource(t){let r=this.libzip.struct.errorS(),{buffer:s,byteLength:a}=this.allocateBuffer(t),n=this.libzip.source.fromUnattachedBuffer(s,a,0,1,r);if(n===0)throw this.libzip.free(r),this.makeLibzipError(r);return n}allocateSource(t){let{buffer:r,byteLength:s}=this.allocateBuffer(t),a=this.libzip.source.fromBuffer(this.zip,r,s,0,1);if(a===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return a}discard(){this.libzip.discard(this.zip)}}});function ert(e){if(typeof e=="string"&&String(+e)===e)return+e;if(typeof e=="number"&&Number.isFinite(e))return e<0?Date.now()/1e3:e;if(XAe.types.isDate(e))return e.getTime()/1e3;throw new Error("Invalid time")}function DT(){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 Fa,Dj,XAe,Pj,cm,xj,kj,$Ae,hs,PT=Ze(()=>{bt();bt();bt();bt();bt();bt();Fa=Ce("fs"),Dj=Ce("stream"),XAe=Ce("util"),Pj=et(Ce("zlib"));bj();cm=3,xj=0,kj=8,$Ae="mixed";hs=class extends jf{constructor(r,s={}){super();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;s.readOnly&&(this.readOnly=!0);let a=s;this.level=typeof a.level<"u"?a.level:$Ae;let n=s.customZipImplementation??PI;if(typeof r=="string"){let{baseFs:f=new Kn}=a;this.baseFs=f,this.path=r}else this.path=null,this.baseFs=null;if(s.stats)this.stats=s.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(f){if(f.code==="ENOENT"&&a.create)this.stats=ll.makeDefaultStats();else throw f}else this.stats=ll.makeDefaultStats();typeof r=="string"?s.create?this.zipImpl=new n({buffer:DT(),readOnly:this.readOnly}):this.zipImpl=new n({path:r,baseFs:this.baseFs,readOnly:this.readOnly,size:this.stats.size}):this.zipImpl=new n({buffer:r??DT(),readOnly:this.readOnly}),this.listings.set(wt.root,new Set);let c=this.zipImpl.getListings();for(let f=0;f{this.closeSync(f)}})}async readPromise(r,s,a,n,c){return this.readSync(r,s,a,n,c)}readSync(r,s,a=0,n=s.byteLength,c=-1){let f=this.fds.get(r);if(typeof f>"u")throw or.EBADF("read");let p=c===-1||c===null?f.cursor:c,h=this.readFileSync(f.p);h.copy(s,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(c===-1||c===null)&&(f.cursor+=E),E}async writePromise(r,s,a,n,c){return typeof s=="string"?this.writeSync(r,s,c):this.writeSync(r,s,a,n,c)}writeSync(r,s,a,n,c){throw typeof this.fds.get(r)>"u"?or.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw or.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:s}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new Dj.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(f,p)=>{clearImmediate(c),this.closeSync(a),p(f)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),c=setImmediate(async()=>{try{let f=await this.readFilePromise(r,s);n.bytesRead=f.length,n.end(f)}catch(f){n.destroy(f)}});return n}createWriteStream(r,{encoding:s}={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),c=Object.assign(new Dj.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(f,p)=>{try{f?p(f):(this.writeFileSync(r,Buffer.concat(a),s),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){c.destroy()},bytesWritten:0,path:r,pending:!1});return c.on("data",f=>{let p=Buffer.from(f);c.bytesWritten+=p.length,a.push(p)}),c}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let s=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`lstat '${r}'`);return s}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw or.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=Y.resolve(wt.root,r);return this.entries.has(a)||this.listings.has(a)}let s;try{s=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return s===void 0?!1:this.entries.has(s)||this.listings.has(s)}async accessPromise(r,s){return this.accessSync(r,s)}accessSync(r,s=Fa.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`access '${r}'`);if(this.readOnly&&s&Fa.constants.W_OK)throw or.EROFS(`access '${r}'`)}async statPromise(r,s={bigint:!1}){return s.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,s)}}async fstatPromise(r,s){return this.fstatSync(r,s)}fstatSync(r,s){let a=this.fds.get(r);if(typeof a>"u")throw or.EBADF("fstatSync");let{p:n}=a,c=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(c)&&!this.listings.has(c))throw or.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(c))throw or.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,c,s)}async lstatPromise(r,s={bigint:!1}){return s.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,s)}}statImpl(r,s,a={}){let n=this.entries.get(s);if(typeof n<"u"){let c=this.zipImpl.stat(n),f=c.crc,p=c.size,h=c.mtime*1e3,E=this.stats.uid,C=this.stats.gid,S=512,x=Math.ceil(c.size/S),I=h,R=h,N=h,U=new Date(I),K=new Date(R),$=new Date(N),ie=new Date(h),fe=this.listings.has(s)?Fa.constants.S_IFDIR:this.isSymbolicLink(n)?Fa.constants.S_IFLNK:Fa.constants.S_IFREG,le=fe===Fa.constants.S_IFDIR?493:420,ge=fe|this.getUnixMode(n,le)&511,pe=Object.assign(new ll.StatEntry,{uid:E,gid:C,size:p,blksize:S,blocks:x,atime:U,birthtime:K,ctime:$,mtime:ie,atimeMs:I,birthtimeMs:R,ctimeMs:N,mtimeMs:h,mode:ge,crc:f});return a.bigint===!0?ll.convertToBigIntStats(pe):pe}if(this.listings.has(s)){let c=this.stats.uid,f=this.stats.gid,p=0,h=512,E=0,C=this.stats.mtimeMs,S=this.stats.mtimeMs,x=this.stats.mtimeMs,I=this.stats.mtimeMs,R=new Date(C),N=new Date(S),U=new Date(x),K=new Date(I),$=Fa.constants.S_IFDIR|493,fe=Object.assign(new ll.StatEntry,{uid:c,gid:f,size:p,blksize:h,blocks:E,atime:R,birthtime:N,ctime:U,mtime:K,atimeMs:C,birthtimeMs:S,ctimeMs:x,mtimeMs:I,mode:$,crc:0});return a.bigint===!0?ll.convertToBigIntStats(fe):fe}throw new Error("Unreachable")}getUnixMode(r,s){let[a,n]=this.zipImpl.getExternalAttributes(r);return a!==cm?s:n>>>16}registerListing(r){let s=this.listings.get(r);if(s)return s;this.registerListing(Y.dirname(r)).add(Y.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,s){this.registerListing(Y.dirname(r)).add(Y.basename(r)),this.entries.set(r,s)}unregisterListing(r){this.listings.delete(r),this.listings.get(Y.dirname(r))?.delete(Y.basename(r))}unregisterEntry(r){this.unregisterListing(r);let s=this.entries.get(r);this.entries.delete(r),!(typeof s>"u")&&(this.fileSources.delete(s),this.isSymbolicLink(s)&&this.symlinkCount--)}deleteEntry(r,s){this.unregisterEntry(r),this.zipImpl.deleteEntry(s)}resolveFilename(r,s,a=!0,n=!0){if(!this.ready)throw or.EBUSY(`archive closed, ${r}`);let c=Y.resolve(wt.root,s);if(c==="/")return wt.root;let f=this.entries.get(c);if(a&&f!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(f)){let p=this.getFileSource(f).toString();return this.resolveFilename(r,Y.resolve(Y.dirname(c),p),!0,n)}else return c;for(;;){let p=this.resolveFilename(r,Y.dirname(c),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw or.ENOENT(r)}if(!h)throw or.ENOTDIR(r);if(c=Y.resolve(p,Y.basename(c)),!a||this.symlinkCount===0)break;let C=this.zipImpl.locate(c.slice(1));if(C===-1)break;if(this.isSymbolicLink(C)){let S=this.getFileSource(C).toString();c=Y.resolve(Y.dirname(c),S)}else break}return c}setFileSource(r,s){let a=Buffer.isBuffer(s)?s:Buffer.from(s),n=Y.relative(wt.root,r),c=null;this.level!=="mixed"&&(c=[this.level===0?xj:kj,this.level]);let f=this.zipImpl.setFileSource(n,c,a);return this.fileSources.set(f,a),f}isSymbolicLink(r){if(this.symlinkCount===0)return!1;let[s,a]=this.zipImpl.getExternalAttributes(r);return s!==cm?!1:(a>>>16&Fa.constants.S_IFMT)===Fa.constants.S_IFLNK}getFileSource(r,s={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let{data:n,compressionMethod:c}=this.zipImpl.getFileSource(r);if(c===xj)return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,n),n;if(c===kj){if(s.asyncDecompress)return new Promise((f,p)=>{Pj.default.inflateRaw(n,(h,E)=>{h?p(h):(this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,E),f(E))})});{let f=Pj.default.inflateRawSync(n);return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,f),f}}else throw new Error(`Unsupported compression method: ${c}`)}async fchmodPromise(r,s){return this.chmodPromise(this.fdToPath(r,"fchmod"),s)}fchmodSync(r,s){return this.chmodSync(this.fdToPath(r,"fchmodSync"),s)}async chmodPromise(r,s){return this.chmodSync(r,s)}chmodSync(r,s){if(this.readOnly)throw or.EROFS(`chmod '${r}'`);s&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let f=this.getUnixMode(n,Fa.constants.S_IFREG|0)&-512|s;this.zipImpl.setExternalAttributes(n,cm,f<<16)}async fchownPromise(r,s,a){return this.chownPromise(this.fdToPath(r,"fchown"),s,a)}fchownSync(r,s,a){return this.chownSync(this.fdToPath(r,"fchownSync"),s,a)}async chownPromise(r,s,a){return this.chownSync(r,s,a)}chownSync(r,s,a){throw new Error("Unimplemented")}async renamePromise(r,s){return this.renameSync(r,s)}renameSync(r,s){throw new Error("Unimplemented")}async copyFilePromise(r,s,a){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}copyFileSync(r,s,a=0){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=this.getFileSource(n),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}prepareCopyFile(r,s,a=0){if(this.readOnly)throw or.EROFS(`copyfile '${r} -> '${s}'`);if(a&Fa.constants.COPYFILE_FICLONE_FORCE)throw or.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${s}'`);let n=this.resolveFilename(`copyfile '${r} -> ${s}'`,r),c=this.entries.get(n);if(typeof c>"u")throw or.EINVAL(`copyfile '${r}' -> '${s}'`);let f=this.resolveFilename(`copyfile '${r}' -> ${s}'`,s),p=this.entries.get(f);if(a&(Fa.constants.COPYFILE_EXCL|Fa.constants.COPYFILE_FICLONE_FORCE)&&typeof p<"u")throw or.EEXIST(`copyfile '${r}' -> '${s}'`);return{indexSource:c,resolvedDestP:f,indexDest:p}}async appendFilePromise(r,s,a){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,s,a)}appendFileSync(r,s,a={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,s,a)}fdToPath(r,s){let a=this.fds.get(r)?.p;if(typeof a>"u")throw or.EBADF(s);return a}async writeFilePromise(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(s=Buffer.concat([await this.getFileSource(f,{asyncDecompress:!0}),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&await this.chmodPromise(p,c)}writeFileSync(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(s=Buffer.concat([this.getFileSource(f),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&this.chmodSync(p,c)}prepareWriteFile(r,s){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw or.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw or.EISDIR(`open '${r}'`);let n=null,c=null;typeof s=="string"?n=s:typeof s=="object"&&({encoding:n=null,mode:c=null}=s);let f=this.entries.get(a);return{encoding:n,mode:c,resolvedP:a,index:f}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw or.EROFS(`unlink '${r}'`);let s=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(s))throw or.EISDIR(`unlink '${r}'`);let a=this.entries.get(s);if(typeof a>"u")throw or.EINVAL(`unlink '${r}'`);this.deleteEntry(s,a)}async utimesPromise(r,s,a){return this.utimesSync(r,s,a)}utimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,s,a){return this.lutimesSync(r,s,a)}lutimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,s){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");this.zipImpl.setMtime(a,ert(s))}async mkdirPromise(r,s){return this.mkdirSync(r,s)}mkdirSync(r,{mode:s=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:s});if(this.readOnly)throw or.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw or.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,s)}async rmdirPromise(r,s){return this.rmdirSync(r,s)}rmdirSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rmdir '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rmdir '${r}'`);let c=this.entries.get(a);if(typeof c>"u")throw or.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,c)}async rmPromise(r,s){return this.rmSync(r,s)}rmSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rm '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rm '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rm '${r}'`);let c=this.entries.get(a);if(typeof c>"u")throw or.EINVAL(`rm '${r}'`);this.deleteEntry(r,c)}hydrateDirectory(r){let s=this.zipImpl.addDirectory(Y.relative(wt.root,r));return this.registerListing(r),this.registerEntry(r,s),s}async linkPromise(r,s){return this.linkSync(r,s)}linkSync(r,s){throw or.EOPNOTSUPP(`link '${r}' -> '${s}'`)}async symlinkPromise(r,s){return this.symlinkSync(r,s)}symlinkSync(r,s){if(this.readOnly)throw or.EROFS(`symlink '${r}' -> '${s}'`);let a=this.resolveFilename(`symlink '${r}' -> '${s}'`,s);if(this.listings.has(a))throw or.EISDIR(`symlink '${r}' -> '${s}'`);if(this.entries.has(a))throw or.EEXIST(`symlink '${r}' -> '${s}'`);let n=this.setFileSource(a,r);this.registerEntry(a,n),this.zipImpl.setExternalAttributes(n,cm,(Fa.constants.S_IFLNK|511)<<16),this.symlinkCount+=1}async readFilePromise(r,s){typeof s=="object"&&(s=s?s.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return s?a.toString(s):a}readFileSync(r,s){typeof s=="object"&&(s=s?s.encoding:void 0);let a=this.readFileBuffer(r);return s?a.toString(s):a}readFileBuffer(r,s={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw or.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,s)}async readdirPromise(r,s){return this.readdirSync(r,s)}readdirSync(r,s){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw or.ENOTDIR(`scandir '${r}'`);if(s?.recursive)if(s?.withFileTypes){let c=Array.from(n,f=>Object.assign(this.statImpl("lstat",Y.join(r,f)),{name:f,path:wt.dot,parentPath:wt.dot}));for(let f of c){if(!f.isDirectory())continue;let p=Y.join(f.path,f.name),h=this.listings.get(Y.join(a,p));for(let E of h)c.push(Object.assign(this.statImpl("lstat",Y.join(r,p,E)),{name:E,path:p,parentPath:p}))}return c}else{let c=[...n];for(let f of c){let p=this.listings.get(Y.join(a,f));if(!(typeof p>"u"))for(let h of p)c.push(Y.join(f,h))}return c}else return s?.withFileTypes?Array.from(n,c=>Object.assign(this.statImpl("lstat",Y.join(r,c)),{name:c,path:void 0,parentPath:void 0})):[...n]}async readlinkPromise(r){let s=this.prepareReadlink(r);return(await this.getFileSource(s,{asyncDecompress:!0})).toString()}readlinkSync(r){let s=this.prepareReadlink(r);return this.getFileSource(s).toString()}prepareReadlink(r){let s=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(s))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(s))throw or.EINVAL(`readlink '${r}'`);let a=this.entries.get(s);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw or.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw or.EINVAL(`open '${r}'`);let c=await this.getFileSource(n,{asyncDecompress:!0}),f=Buffer.alloc(s,0);return c.copy(f),await this.writeFilePromise(r,f)}truncateSync(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw or.EINVAL(`open '${r}'`);let c=this.getFileSource(n),f=Buffer.alloc(s,0);return c.copy(f),this.writeFileSync(r,f)}async ftruncatePromise(r,s){return this.truncatePromise(this.fdToPath(r,"ftruncate"),s)}ftruncateSync(r,s){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),s)}watch(r,s,a){let n;switch(typeof s){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=s);break}if(!n)return{on:()=>{},close:()=>{}};let c=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(c)}}}watchFile(r,s,a){let n=Y.resolve(wt.root,r);return fE(this,n,s,a)}unwatchFile(r,s){let a=Y.resolve(wt.root,r);return y0(this,a,s)}}});function tpe(e,t,r=Buffer.alloc(0),s){let a=new hs(r),n=C=>C===t||C.startsWith(`${t}/`)?C.slice(0,t.length):null,c=async(C,S)=>()=>a,f=(C,S)=>a,p={...e},h=new Kn(p),E=new td({baseFs:h,getMountPoint:n,factoryPromise:c,factorySync:f,magicByte:21,maxAge:1/0,typeCheck:s?.typeCheck});return L2(epe.default,new rd(E)),a}var epe,rpe=Ze(()=>{bt();epe=et(Ce("fs"));PT()});var npe=Ze(()=>{ZAe();PT();rpe()});var Qj,av,xT,ipe=Ze(()=>{bt();PT();Qj={CENTRAL_DIRECTORY:33639248,END_OF_CENTRAL_DIRECTORY:101010256},av=22,xT=class e{constructor(t){this.filesShouldBeCached=!1;if("buffer"in t)throw new Error("Buffer based zip archives are not supported");if(!t.readOnly)throw new Error("Writable zip archives are not supported");this.baseFs=t.baseFs,this.fd=this.baseFs.openSync(t.path,"r");try{this.entries=e.readZipSync(this.fd,this.baseFs,t.size)}catch(r){throw this.baseFs.closeSync(this.fd),this.fd="closed",r}}static readZipSync(t,r,s){if(s=0;N--)if(n.readUInt32LE(N)===Qj.END_OF_CENTRAL_DIRECTORY){a=N;break}if(a===-1)throw new Error("Not a zip archive")}let c=n.readUInt16LE(a+10),f=n.readUInt32LE(a+12),p=n.readUInt32LE(a+16),h=n.readUInt16LE(a+20);if(a+h+av>n.length)throw new Error("Zip archive inconsistent");if(c==65535||f==4294967295||p==4294967295)throw new Error("Zip 64 is not supported");if(f>s)throw new Error("Zip archive inconsistent");if(c>f/46)throw new Error("Zip archive inconsistent");let E=Buffer.alloc(f);if(r.readSync(t,E,0,E.length,p)!==E.length)throw new Error("Zip archive inconsistent");let C=[],S=0,x=0,I=0;for(;xE.length)throw new Error("Zip archive inconsistent");if(E.readUInt32LE(S)!==Qj.CENTRAL_DIRECTORY)throw new Error("Zip archive inconsistent");let N=E.readUInt16LE(S+4)>>>8;if(E.readUInt16LE(S+8)&1)throw new Error("Encrypted zip files are not supported");let K=E.readUInt16LE(S+10),$=E.readUInt32LE(S+16),ie=E.readUInt16LE(S+28),fe=E.readUInt16LE(S+30),le=E.readUInt16LE(S+32),ge=E.readUInt32LE(S+42),pe=E.toString("utf8",S+46,S+46+ie).replaceAll("\0"," ");if(pe.includes("\0"))throw new Error("Invalid ZIP file");let De=E.readUInt32LE(S+20),ye=E.readUInt32LE(S+38);C.push({name:pe,os:N,mtime:pi.SAFE_TIME,crc:$,compressionMethod:K,isSymbolicLink:N===cm&&(ye>>>16&pi.S_IFMT)===pi.S_IFLNK,size:E.readUInt32LE(S+24),compressedSize:De,externalAttributes:ye,localHeaderOffset:ge}),I+=De,x+=1,S+=46+ie+fe+le}if(I>s)throw new Error("Zip archive inconsistent");if(S!==E.length)throw new Error("Zip archive inconsistent");return C}getExternalAttributes(t){let r=this.entries[t];return[r.os,r.externalAttributes]}getListings(){return this.entries.map(t=>t.name)}getSymlinkCount(){let t=0;for(let r of this.entries)r.isSymbolicLink&&(t+=1);return t}stat(t){let r=this.entries[t];return{crc:r.crc,mtime:r.mtime,size:r.size}}locate(t){for(let r=0;r$Ae,DEFLATE:()=>kj,JsZipImpl:()=>xT,LibZipImpl:()=>PI,STORE:()=>xj,ZIP_UNIX:()=>cm,ZipFS:()=>hs,ZipOpenFS:()=>nA,getArchivePart:()=>vj,getLibzipPromise:()=>rrt,getLibzipSync:()=>trt,makeEmptyArchive:()=>DT,mountMemoryDrive:()=>tpe});function trt(){return ov()}async function rrt(){return ov()}var spe,iA=Ze(()=>{Cj();spe=et(VAe());zAe();npe();ipe();bj();WAe(()=>{let e=(0,spe.default)();return JAe(e)})});var cv,ope=Ze(()=>{bt();jt();uv();cv=class extends st{constructor(){super(...arguments);this.cwd=he.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=he.String();this.args=he.Proxy()}static{this.usage={description:"run a command using yarn's portable shell",details:` + This command will run a command using Yarn's portable shell. + + Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. + + Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. + + Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. + + For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. + `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await xI(r,[],{cwd:Ae.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var ec,ape=Ze(()=>{ec=class extends Error{constructor(t){super(t),this.name="ShellError"}}});var TT={};Vt(TT,{fastGlobOptions:()=>upe,isBraceExpansion:()=>Tj,isGlobPattern:()=>nrt,match:()=>irt,micromatchOptions:()=>QT});function nrt(e){if(!kT.default.scan(e,QT).isGlob)return!1;try{kT.default.parse(e,QT)}catch{return!1}return!0}function irt(e,{cwd:t,baseFs:r}){return(0,lpe.default)(e,{...upe,cwd:Ae.fromPortablePath(t),fs:px(cpe.default,new rd(r))})}function Tj(e){return kT.default.scan(e,QT).isBrace}var lpe,cpe,kT,QT,upe,fpe=Ze(()=>{bt();lpe=et(DQ()),cpe=et(Ce("fs")),kT=et(Zo()),QT={strictBrackets:!0},upe={onlyDirectories:!1,onlyFiles:!1}});function Rj(){}function Fj(){for(let e of um)e.kill()}function dpe(e,t,r,s){return a=>{let n=a[0]instanceof sA.Transform?"pipe":a[0],c=a[1]instanceof sA.Transform?"pipe":a[1],f=a[2]instanceof sA.Transform?"pipe":a[2],p=(0,ppe.default)(e,t,{...s,stdio:[n,c,f]});return um.add(p),um.size===1&&(process.on("SIGINT",Rj),process.on("SIGTERM",Fj)),a[0]instanceof sA.Transform&&a[0].pipe(p.stdin),a[1]instanceof sA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof sA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(um.delete(p),um.size===0&&(process.off("SIGINT",Rj),process.off("SIGTERM",Fj)),E.code){case"ENOENT":a[2].write(`command not found: ${e} +`),h(127);break;case"EACCES":a[2].write(`permission denied: ${e} +`),h(128);break;default:a[2].write(`uncaught error: ${E.message} +`),h(1);break}}),p.on("close",E=>{um.delete(p),um.size===0&&(process.off("SIGINT",Rj),process.off("SIGTERM",Fj)),h(E!==null?E:129)})})}}}function gpe(e){return t=>{let r=t[0]==="pipe"?new sA.PassThrough:t[0];return{stdin:r,promise:Promise.resolve().then(()=>e({stdin:r,stdout:t[1],stderr:t[2]}))}}}function RT(e,t){return Oj.start(e,t)}function Ape(e,t=null){let r=new sA.PassThrough,s=new hpe.StringDecoder,a="";return r.on("data",n=>{let c=s.write(n),f;do if(f=c.indexOf(` +`),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a="",e(t!==null?`${t} ${p}`:p)}while(f!==-1);a+=c}),r.on("end",()=>{let n=s.end();n!==""&&e(t!==null?`${t} ${n}`:n)}),r}function mpe(e,{prefix:t}){return{stdout:Ape(r=>e.stdout.write(`${r} +`),e.stdout.isTTY?t:null),stderr:Ape(r=>e.stderr.write(`${r} +`),e.stderr.isTTY?t:null)}}var ppe,sA,hpe,um,Uc,Nj,Oj,Lj=Ze(()=>{ppe=et(RU()),sA=Ce("stream"),hpe=Ce("string_decoder"),um=new Set;Uc=class{constructor(t){this.stream=t}close(){}get(){return this.stream}},Nj=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(t){this.stream=t}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Oj=class e{constructor(t,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=t,this.implementation=r}static start(t,{stdin:r,stdout:s,stderr:a}){let n=new e(null,t);return n.stdin=r,n.stdout=s,n.stderr=a,n}pipeTo(t,r=1){let s=new e(this,t),a=new Nj;return s.pipe=a,s.stdout=this.stdout,s.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),s}async exec(){let t=["ignore","ignore","ignore"];if(this.pipe)t[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");t[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,t[1]=r.get();let s;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");s=this.stderr,t[2]=s.get();let a=this.implementation(t);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),s.close(),n))}async run(){let t=[];for(let s=this;s;s=s.ancestor)t.push(s.exec());return(await Promise.all(t))[0]}}});var hv={};Vt(hv,{EntryCommand:()=>cv,ShellError:()=>ec,execute:()=>xI,globUtils:()=>TT});function ype(e,t,r){let s=new tc.PassThrough({autoDestroy:!0});switch(e){case 0:(t&1)===1&&r.stdin.pipe(s,{end:!1}),(t&2)===2&&r.stdin instanceof tc.Writable&&s.pipe(r.stdin,{end:!1});break;case 1:(t&1)===1&&r.stdout.pipe(s,{end:!1}),(t&2)===2&&s.pipe(r.stdout,{end:!1});break;case 2:(t&1)===1&&r.stderr.pipe(s,{end:!1}),(t&2)===2&&s.pipe(r.stderr,{end:!1});break;default:throw new ec(`Bad file descriptor: "${e}"`)}return s}function NT(e,t={}){let r={...e,...t};return r.environment={...e.environment,...t.environment},r.variables={...e.variables,...t.variables},r}async function ort(e,t,r){let s=[],a=new tc.PassThrough;return a.on("data",n=>s.push(n)),await OT(e,t,NT(r,{stdout:a})),Buffer.concat(s).toString().replace(/[\r\n]+$/,"")}async function Epe(e,t,r){let s=e.map(async n=>{let c=await fm(n.args,t,r);return{name:n.name,value:c.join(" ")}});return(await Promise.all(s)).reduce((n,c)=>(n[c.name]=c.value,n),{})}function FT(e){return e.match(/[^ \r\n\t]+/g)||[]}async function Spe(e,t,r,s,a=s){switch(e.name){case"$":s(String(process.pid));break;case"#":s(String(t.args.length));break;case"@":if(e.quoted)for(let n of t.args)a(n);else for(let n of t.args){let c=FT(n);for(let f=0;f=0&&n"u"&&(e.defaultValue?c=(await fm(e.defaultValue,t,r)).join(" "):e.alternativeValue&&(c="")),typeof c>"u")throw f?new ec(`Unbound argument #${n}`):new ec(`Unbound variable "${e.name}"`);if(e.quoted)s(c);else{let p=FT(c);for(let E=0;Es.push(n));let a=Number(s.join(" "));return Number.isNaN(a)?fv({type:"variable",name:s.join(" ")},t,r):fv({type:"number",value:a},t,r)}else return art[e.type](await fv(e.left,t,r),await fv(e.right,t,r))}async function fm(e,t,r){let s=new Map,a=[],n=[],c=E=>{n.push(E)},f=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{c(E),f()},h=(E,C,S)=>{let x=JSON.stringify({type:E,fd:C}),I=s.get(x);typeof I>"u"&&s.set(x,I=[]),I.push(S)};for(let E of e){let C=!1;switch(E.type){case"redirection":{let S=await fm(E.args,t,r);for(let x of S)h(E.subtype,E.fd,x)}break;case"argument":for(let S of E.segments)switch(S.type){case"text":c(S.text);break;case"glob":c(S.pattern),C=!0;break;case"shell":{let x=await ort(S.shell,t,r);if(S.quoted)c(x);else{let I=FT(x);for(let R=0;R"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let x=await t.glob.match(S,{cwd:r.cwd,baseFs:t.baseFs});if(x.length===0){let I=Tj(S)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new ec(`No matches found: "${S}"${I}`)}for(let I of x.sort())p(I)}}if(s.size>0){let E=[];for(let[C,S]of s.entries())E.splice(E.length,0,C,String(S.length),...S);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function Av(e,t,r){t.builtins.has(e[0])||(e=["command",...e]);let s=Ae.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:s});let[n,...c]=e;if(n==="command")return dpe(c[0],c.slice(1),t,{cwd:s,env:a});let f=t.builtins.get(n);if(typeof f>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return gpe(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:C,stdout:S,stderr:x}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await f(c,t,r)}finally{r.stdin=C,r.stdout=S,r.stderr=x}})}function lrt(e,t,r){return s=>{let a=new tc.PassThrough,n=OT(e,t,NT(r,{stdin:a}));return{stdin:a,promise:n}}}function crt(e,t,r){return s=>{let a=new tc.PassThrough,n=OT(e,t,r);return{stdin:a,promise:n}}}function Ipe(e,t,r,s){if(t.length===0)return e;{let a;do a=String(Math.random());while(Object.hasOwn(s.procedures,a));return s.procedures={...s.procedures},s.procedures[a]=e,Av([...t,"__ysh_run_procedure",a],r,s)}}async function Cpe(e,t,r){let s=e,a=null,n=null;for(;s;){let c=s.then?{...r}:r,f;switch(s.type){case"command":{let p=await fm(s.args,t,r),h=await Epe(s.envs,t,r);f=s.envs.length?Av(p,t,NT(c,{environment:h})):Av(p,t,c)}break;case"subshell":{let p=await fm(s.args,t,r),h=lrt(s.subshell,t,c);f=Ipe(h,p,t,c)}break;case"group":{let p=await fm(s.args,t,r),h=crt(s.group,t,c);f=Ipe(h,p,t,c)}break;case"envs":{let p=await Epe(s.envs,t,r);c.environment={...c.environment,...p},f=Av(["true"],t,c)}break}if(typeof f>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=RT(f,{stdin:new Uc(c.stdin),stdout:new Uc(c.stdout),stderr:new Uc(c.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(f,1);break;case"|&":n=n.pipeTo(f,3);break}}s.then?(a=s.then.type,s=s.then.chain):s=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function urt(e,t,r,{background:s=!1}={}){function a(n){let c=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],f=c[n%c.length];return wpe.default.hex(f)}if(s){let n=r.nextBackgroundJobIndex++,c=a(n),f=`[${n}]`,p=c(f),{stdout:h,stderr:E}=mpe(r,{prefix:p});return r.backgroundJobs.push(Cpe(e,t,NT(r,{stdout:h,stderr:E})).catch(C=>E.write(`${C.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${c(yE(e))}' has ended +`)})),0}return await Cpe(e,t,r)}async function frt(e,t,r,{background:s=!1}={}){let a,n=f=>{a=f,r.variables["?"]=String(f)},c=async f=>{try{return await urt(f.chain,t,r,{background:s&&typeof f.then>"u"})}catch(p){if(!(p instanceof ec))throw p;return r.stderr.write(`${p.message} +`),1}};for(n(await c(e));e.then;){if(r.exitCode!==null)return r.exitCode;switch(e.then.type){case"&&":a===0&&n(await c(e.then.line));break;case"||":a!==0&&n(await c(e.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${e.then.type}"`)}e=e.then.line}return a}async function OT(e,t,r){let s=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:c}of e){if(a=await frt(n,t,r,{background:c==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=s,a}function bpe(e){switch(e.type){case"variable":return e.name==="@"||e.name==="#"||e.name==="*"||Number.isFinite(parseInt(e.name,10))||"defaultValue"in e&&!!e.defaultValue&&e.defaultValue.some(t=>pv(t))||"alternativeValue"in e&&!!e.alternativeValue&&e.alternativeValue.some(t=>pv(t));case"arithmetic":return Mj(e.arithmetic);case"shell":return Uj(e.shell);default:return!1}}function pv(e){switch(e.type){case"redirection":return e.args.some(t=>pv(t));case"argument":return e.segments.some(t=>bpe(t));default:throw new Error(`Assertion failed: Unsupported argument type: "${e.type}"`)}}function Mj(e){switch(e.type){case"variable":return bpe(e);case"number":return!1;default:return Mj(e.left)||Mj(e.right)}}function Uj(e){return e.some(({command:t})=>{for(;t;){let r=t.chain;for(;r;){let s;switch(r.type){case"subshell":s=Uj(r.subshell);break;case"command":s=r.envs.some(a=>a.args.some(n=>pv(n)))||r.args.some(a=>pv(a));break}if(s)return!0;if(!r.then)break;r=r.then.chain}if(!t.then)break;t=t.then.line}return!1})}async function xI(e,t=[],{baseFs:r=new Kn,builtins:s={},cwd:a=Ae.toPortablePath(process.cwd()),env:n=process.env,stdin:c=process.stdin,stdout:f=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=TT}={}){let C={};for(let[I,R]of Object.entries(n))typeof R<"u"&&(C[I]=R);let S=new Map(srt);for(let[I,R]of Object.entries(s))S.set(I,R);c===null&&(c=new tc.PassThrough,c.end());let x=gx(e,E);if(!Uj(x)&&x.length>0&&t.length>0){let{command:I}=x[x.length-1];for(;I.then;)I=I.then.line;let R=I.chain;for(;R.then;)R=R.then.chain;R.type==="command"&&(R.args=R.args.concat(t.map(N=>({type:"argument",segments:[{type:"text",text:N}]}))))}return await OT(x,{args:t,baseFs:r,builtins:S,initialStdin:c,initialStdout:f,initialStderr:p,glob:E},{cwd:a,environment:C,exitCode:null,procedures:{},stdin:c,stdout:f,stderr:p,variables:Object.assign({},h,{"?":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var wpe,Bpe,tc,vpe,srt,art,uv=Ze(()=>{bt();Sc();wpe=et(LE()),Bpe=Ce("os"),tc=Ce("stream"),vpe=Ce("timers/promises");ope();ape();fpe();Lj();Lj();srt=new Map([["cd",async([e=(0,Bpe.homedir)(),...t],r,s)=>{let a=Y.resolve(s.cwd,Ae.toPortablePath(e));if(!(await r.baseFs.statPromise(a).catch(c=>{throw c.code==="ENOENT"?new ec(`cd: no such file or directory: ${e}`):c})).isDirectory())throw new ec(`cd: not a directory: ${e}`);return s.cwd=a,0}],["pwd",async(e,t,r)=>(r.stdout.write(`${Ae.fromPortablePath(r.cwd)} +`),0)],[":",async(e,t,r)=>0],["true",async(e,t,r)=>0],["false",async(e,t,r)=>1],["exit",async([e,...t],r,s)=>s.exitCode=parseInt(e??s.variables["?"],10)],["echo",async(e,t,r)=>(r.stdout.write(`${e.join(" ")} +`),0)],["sleep",async([e],t,r)=>{if(typeof e>"u")throw new ec("sleep: missing operand");let s=Number(e);if(Number.isNaN(s))throw new ec(`sleep: invalid time interval '${e}'`);return await(0,vpe.setTimeout)(1e3*s,0)}],["unset",async(e,t,r)=>{for(let s of e)delete r.environment[s],delete r.variables[s];return 0}],["__ysh_run_procedure",async(e,t,r)=>{let s=r.procedures[e[0]];return await RT(s,{stdin:new Uc(r.stdin),stdout:new Uc(r.stdout),stderr:new Uc(r.stderr)}).run()}],["__ysh_set_redirects",async(e,t,r)=>{let s=r.stdin,a=r.stdout,n=r.stderr,c=[],f=[],p=[],h=0;for(;e[h]!=="--";){let C=e[h++],{type:S,fd:x}=JSON.parse(C),I=K=>{switch(x){case null:case 0:c.push(K);break;default:throw new Error(`Unsupported file descriptor: "${x}"`)}},R=K=>{switch(x){case null:case 1:f.push(K);break;case 2:p.push(K);break;default:throw new Error(`Unsupported file descriptor: "${x}"`)}},N=Number(e[h++]),U=h+N;for(let K=h;Kt.baseFs.createReadStream(Y.resolve(r.cwd,Ae.toPortablePath(e[K]))));break;case"<<<":I(()=>{let $=new tc.PassThrough;return process.nextTick(()=>{$.write(`${e[K]} +`),$.end()}),$});break;case"<&":I(()=>ype(Number(e[K]),1,r));break;case">":case">>":{let $=Y.resolve(r.cwd,Ae.toPortablePath(e[K]));R($==="/dev/null"?new tc.Writable({autoDestroy:!0,emitClose:!0,write(ie,fe,le){setImmediate(le)}}):t.baseFs.createWriteStream($,S===">>"?{flags:"a"}:void 0))}break;case">&":R(ype(Number(e[K]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${S}"`)}}if(c.length>0){let C=new tc.PassThrough;s=C;let S=x=>{if(x===c.length)C.end();else{let I=c[x]();I.pipe(C,{end:!1}),I.on("end",()=>{S(x+1)})}};S(0)}if(f.length>0){let C=new tc.PassThrough;a=C;for(let S of f)C.pipe(S)}if(p.length>0){let C=new tc.PassThrough;n=C;for(let S of p)C.pipe(S)}let E=await RT(Av(e.slice(h+1),t,r),{stdin:new Uc(s),stdout:new Uc(a),stderr:new Uc(n)}).run();return await Promise.all(f.map(C=>new Promise((S,x)=>{C.on("error",I=>{x(I)}),C.on("close",()=>{S()}),C.end()}))),await Promise.all(p.map(C=>new Promise((S,x)=>{C.on("error",I=>{x(I)}),C.on("close",()=>{S()}),C.end()}))),E}]]);art={addition:(e,t)=>e+t,subtraction:(e,t)=>e-t,multiplication:(e,t)=>e*t,division:(e,t)=>Math.trunc(e/t)}});var Dpe=G((wUt,LT)=>{function Art(){var e=0,t=1,r=2,s=3,a=4,n=5,c=6,f=7,p=8,h=9,E=10,C=11,S=12,x=13,I=14,R=15,N=16,U=17,K=0,$=1,ie=2,fe=3,le=4;function ge(d,ve){return 55296<=d.charCodeAt(ve)&&d.charCodeAt(ve)<=56319&&56320<=d.charCodeAt(ve+1)&&d.charCodeAt(ve+1)<=57343}function pe(d,ve){ve===void 0&&(ve=0);var Ie=d.charCodeAt(ve);if(55296<=Ie&&Ie<=56319&&ve=1){var me=d.charCodeAt(ve-1),ce=Ie;return 55296<=me&&me<=56319?(me-55296)*1024+(ce-56320)+65536:ce}return Ie}function De(d,ve,Ie){var me=[d].concat(ve).concat([Ie]),ce=me[me.length-2],X=Ie,be=me.lastIndexOf(I);if(be>1&&me.slice(1,be).every(function(_){return _==s})&&[s,x,U].indexOf(d)==-1)return ie;var ke=me.lastIndexOf(a);if(ke>0&&me.slice(1,ke).every(function(_){return _==a})&&[S,a].indexOf(ce)==-1)return me.filter(function(_){return _==a}).length%2==1?fe:le;if(ce==e&&X==t)return K;if(ce==r||ce==e||ce==t)return X==I&&ve.every(function(_){return _==s})?ie:$;if(X==r||X==e||X==t)return $;if(ce==c&&(X==c||X==f||X==h||X==E))return K;if((ce==h||ce==f)&&(X==f||X==p))return K;if((ce==E||ce==p)&&X==p)return K;if(X==s||X==R)return K;if(X==n)return K;if(ce==S)return K;var it=me.indexOf(s)!=-1?me.lastIndexOf(s)-1:me.length-2;return[x,U].indexOf(me[it])!=-1&&me.slice(it+1,-1).every(function(_){return _==s})&&X==I||ce==R&&[N,U].indexOf(X)!=-1?K:ve.indexOf(a)!=-1?ie:ce==a&&X==a?K:$}this.nextBreak=function(d,ve){if(ve===void 0&&(ve=0),ve<0)return 0;if(ve>=d.length-1)return d.length;for(var Ie=ye(pe(d,ve)),me=[],ce=ve+1;ce{var prt=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,MT;function hrt(){if(MT)return MT;if(typeof Intl.Segmenter<"u"){let e=new Intl.Segmenter("en",{granularity:"grapheme"});return MT=t=>Array.from(e.segment(t),({segment:r})=>r)}else{let e=Dpe(),t=new e;return MT=r=>t.splitGraphemes(r)}}Ppe.exports=(e,t=0,r=e.length)=>{if(t<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let s=r-t,a="",n=0,c=0;for(;e.length>0;){let f=e.match(prt)||[e,e,void 0],p=hrt()(f[1]),h=Math.min(t-n,p.length);p=p.slice(h);let E=Math.min(s-c,p.length);a+=p.slice(0,E).join(""),n+=h,c+=E,typeof f[2]<"u"&&(a+=f[2]),e=e.slice(f[0].length)}return a}});var An,dv=Ze(()=>{An=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.17.1"});function Npe(e,{configuration:t,json:r}){if(!t.get("enableMessageNames"))return"";let a=zf(e===null?0:e);return!r&&e===null?Gt(t,a,"grey"):a}function _j(e,{configuration:t,json:r}){let s=Npe(e,{configuration:t,json:r});if(!s||e===null||e===0)return s;let a=pr[e],n=`https://yarnpkg.com/advanced/error-codes#${s}---${a}`.toLowerCase();return eI(t,s,n)}async function kI({configuration:e,stdout:t,forceError:r},s){let a=await Ft.start({configuration:e,stdout:t,includeFooter:!1},async n=>{let c=!1,f=!1;for(let p of s)typeof p.option<"u"&&(p.error||r?(f=!0,n.reportError(50,p.message)):(c=!0,n.reportWarning(50,p.message)),p.callback?.());c&&!f&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Rpe,UT,drt,kpe,Qpe,Pd,Fpe,Tpe,grt,mrt,_T,yrt,Ft,gv=Ze(()=>{Rpe=et(xpe()),UT=et(N0());Kx();Nc();dv();Tc();drt="\xB7",kpe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Qpe=80,Pd=UT.default.GITHUB_ACTIONS?{start:e=>`::group::${e} +`,end:e=>`::endgroup:: +`}:UT.default.TRAVIS?{start:e=>`travis_fold:start:${e} +`,end:e=>`travis_fold:end:${e} +`}:UT.default.GITLAB?{start:e=>`section_start:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${e} +`,end:e=>`section_end:${Math.floor(Date.now()/1e3)}:${e.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,Fpe=Pd!==null,Tpe=new Date,grt=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,mrt=e=>e,_T=mrt({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}}),yrt=grt&&Object.keys(_T).find(e=>{let t=_T[e];return!(t.date&&(t.date[0]!==Tpe.getDate()||t.date[1]!==Tpe.getMonth()+1))})||"default";Ft=class extends Io{constructor({configuration:r,stdout:s,json:a=!1,forceSectionAlignment:n=!1,includeNames:c=!0,includePrefix:f=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:C=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(kB(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=c,this.includePrefix=f,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=C,this.json=a,this.stdout=s,r.get("enableProgressBars")&&!a&&s.isTTY&&s.columns>22){let S=r.get("progressBarStyle")||yrt;if(!Object.hasOwn(_T,S))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=_T[S];let x=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*x/80)}}static async start(r,s){let a=new this(r),n=process.emitWarning;process.emitWarning=(c,f)=>{if(typeof c!="string"){let h=c;c=h.message,f=f??h.name}let p=typeof f<"u"?`${f}: ${c}`:c;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,Z0(r.configuration,`Yarn ${An}`,2));try{await s(a)}catch(c){a.reportExceptionOnce(c)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let s=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,s-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}async startSectionPromise({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}startTimerImpl(r,s,a){return{cb:typeof s=="function"?s:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,Pd!==null&&!this.json&&this.includeInfos&&this.stdout.write(Pd.start(r))},reportFooter:f=>{if(this.indent-=1,Pd!==null&&!this.json&&this.includeInfos){this.stdout.write(Pd.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&f>200?this.reportInfo(null,`\u2514 Completed in ${Gt(this.configuration,f,dt.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof s=="function"?{}:s).skipIfEmpty}}startTimerSync(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionSync(c,n)}async startTimerPromise(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionPromise(c,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,s){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",c=`${this.formatPrefix(n,"blueBright")}${s}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(c)}reportWarning(r,s){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${s}`)}reportError(r,s){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,s)),this.reportErrorImpl(r,s)}reportErrorImpl(r,s){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,"redBright")}${s}`,{truncate:!1})}reportFold(r,s){if(!Pd)return;let a=`${Pd.start(r)}${s}${Pd.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let s=!1,a=Promise.resolve().then(async()=>{let c={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:c,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:f,title:p}of r)s||c.progress===f&&c.title===p||(c.progress=f,c.title=p,this.refreshProgress());n()}),n=()=>{s||(s=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let s=Gt(this.configuration,Date.now()-this.startTime,dt.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${s}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:s}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:s})} +`),this.writeProgress()}writeLines(r,{truncate:s}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:s})} +`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let s of r)s.committed=!0,s.action()}clearProgress({delta:r=0,clear:s=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||s)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Qpe&&(this.progressFrame=(this.progressFrame+1)%kpe.length,this.progressTime=r);let s=kpe[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let c=this.formatName(null),f=c?`${c}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Gt(this.configuration,"\u27A4","blueBright")} ${f}${s}${n}${p} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Qpe)}refreshProgress({delta:r=0,force:s=!1}={}){let a=!1,n=!1;if(s||this.progress.size===0)a=!0;else for(let c of this.progress.values()){let f=typeof c.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*c.definition.progress):void 0,p=c.lastScaledSize;c.lastScaledSize=f;let h=c.lastTitle;if(c.lastTitle=c.definition.title,f!==p||(n=h!==c.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:s}={}){return this.progressStyle===null&&(s=!1),typeof s>"u"&&(s=this.configuration.get("preferTruncatedLines")),s&&(r=(0,Rpe.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?Npe(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,s){return this.includePrefix?`${Gt(this.configuration,"\u27A4",s)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?_j(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${drt} `}}});var wn={};Vt(wn,{PackageManager:()=>Lpe,detectPackageManager:()=>Mpe,executePackageAccessibleBinary:()=>Gpe,executePackageScript:()=>HT,executePackageShellcode:()=>Hj,executeWorkspaceAccessibleBinary:()=>Srt,executeWorkspaceLifecycleScript:()=>Hpe,executeWorkspaceScript:()=>_pe,getPackageAccessibleBinaries:()=>jT,getWorkspaceAccessibleBinaries:()=>jpe,hasPackageScript:()=>wrt,hasWorkspaceScript:()=>jj,isNodeScript:()=>Gj,makeScriptEnv:()=>mv,maybeExecuteWorkspaceLifecycleScript:()=>vrt,prepareExternalProject:()=>Crt});async function xd(e,t,r,s=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${s.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await ae.writeFilePromise(Y.format({dir:e,name:t,ext:".cmd"}),a)}await ae.writeFilePromise(Y.join(e,t),`#!/bin/sh +exec "${r}" ${s.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function Mpe(e){let t=await _t.tryFind(e);if(t?.packageManager){let s=RQ(t.packageManager);if(s?.name){let a=`found ${JSON.stringify({packageManager:t.packageManager})} in manifest`,[n]=s.reference.split(".");switch(s.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await ae.readFilePromise(Y.join(e,yr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:ae.existsSync(Y.join(e,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:ae.existsSync(Y.join(e,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function mv({project:e,locator:t,binFolder:r,ignoreCorepack:s,lifecycleScript:a,baseEnv:n=e?.configuration.env??process.env}){let c={};for(let[E,C]of Object.entries(n))typeof C<"u"&&(c[E.toLowerCase()!=="path"?E:"PATH"]=C);let f=Ae.fromPortablePath(r);c.BERRY_BIN_FOLDER=Ae.fromPortablePath(f);let p=process.env.COREPACK_ROOT&&!s?Ae.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([xd(r,"node",process.execPath),...An!==null?[xd(r,"run",process.execPath,[p,"run"]),xd(r,"yarn",process.execPath,[p]),xd(r,"yarnpkg",process.execPath,[p]),xd(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),e&&(c.INIT_CWD=Ae.fromPortablePath(e.configuration.startingCwd),c.PROJECT_CWD=Ae.fromPortablePath(e.cwd)),c.PATH=c.PATH?`${f}${Ae.delimiter}${c.PATH}`:`${f}`,c.npm_execpath=`${f}${Ae.sep}yarn`,c.npm_node_execpath=`${f}${Ae.sep}node`,t){if(!e)throw new Error("Assertion failed: Missing project");let E=e.tryWorkspaceByLocator(t),C=E?E.manifest.version??"":e.storedPackages.get(t.locatorHash).version??"";c.npm_package_name=fn(t),c.npm_package_version=C;let S;if(E)S=E.cwd;else{let x=e.storedPackages.get(t.locatorHash);if(!x)throw new Error(`Package for ${Vr(e.configuration,t)} not found in the project`);let I=e.configuration.getLinkers(),R={project:e,report:new Ft({stdout:new kd.PassThrough,configuration:e.configuration})},N=I.find(U=>U.supportsPackage(x,R));if(!N)throw new Error(`The package ${Vr(e.configuration,x)} isn't supported by any of the available linkers`);S=await N.findPackageLocation(x,R)}c.npm_package_json=Ae.fromPortablePath(Y.join(S,yr.manifest))}let h=An!==null?`yarn/${An}`:`yarn/${Tp("@yarnpkg/core").version}-core`;return c.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(c.npm_lifecycle_event=a),e&&await e.configuration.triggerHook(E=>E.setupScriptEnvironment,e,c,async(E,C,S)=>await xd(r,E,C,S)),c}async function Crt(e,t,{configuration:r,report:s,workspace:a=null,locator:n=null}){await Irt(async()=>{await ae.mktempPromise(async c=>{let f=Y.join(c,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(f,{prefix:Ae.fromPortablePath(e),report:s}),C=n&&ju(n)?aI(n):n,S=C?ml(C):"an external project";h.write(`Packing ${S} from sources +`);let x=await Mpe(e),I;x!==null?(h.write(`Using ${x.packageManager} for bootstrap. Reason: ${x.reason} + +`),I=x.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn + +`),I="Yarn");let R=I==="Yarn"&&!x?.packageManagerField;await ae.mktempPromise(async N=>{let U=await mv({binFolder:N,ignoreCorepack:R,baseEnv:{...process.env,COREPACK_ENABLE_AUTO_PIN:"0"}}),$=new Map([["Yarn Classic",async()=>{let fe=a!==null?["workspace",a]:[],le=Y.join(e,yr.manifest),ge=await ae.readFilePromise(le),pe=await qu(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:e,env:U,stdin:p,stdout:h,stderr:E,end:1});if(pe.code!==0)return pe.code;await ae.writeFilePromise(le,ge),await ae.appendFilePromise(Y.join(e,".npmignore"),`/.yarn +`),h.write(` +`),delete U.NODE_ENV;let De=await qu("yarn",["install"],{cwd:e,env:U,stdin:p,stdout:h,stderr:E,end:1});if(De.code!==0)return De.code;h.write(` +`);let ye=await qu("yarn",[...fe,"pack","--filename",Ae.fromPortablePath(t)],{cwd:e,env:U,stdin:p,stdout:h,stderr:E});return ye.code!==0?ye.code:0}],["Yarn",async()=>{let fe=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let le=Y.join(e,yr.lockfile);await ae.existsPromise(le)||await ae.writeFilePromise(le,"");let ge=await qu("yarn",[...fe,"pack","--install-if-needed","--filename",Ae.fromPortablePath(t)],{cwd:e,env:U,stdin:p,stdout:h,stderr:E});return ge.code!==0?ge.code:0}],["npm",async()=>{if(a!==null){let ve=new kd.PassThrough,Ie=zE(ve);ve.pipe(h,{end:!1});let me=await qu("npm",["--version"],{cwd:e,env:U,stdin:p,stdout:ve,stderr:E,end:0});if(ve.end(),me.code!==0)return h.end(),E.end(),me.code;let ce=(await Ie).toString().trim();if(!rA(ce,">=7.x")){let X=Qa(null,"npm"),be=Un(X,ce),ke=Un(X,">=7.x");throw new Error(`Workspaces aren't supported by ${ai(r,be)}; please upgrade to ${ai(r,ke)} (npm has been detected as the primary package manager for ${Gt(r,e,dt.PATH)})`)}}let fe=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let le=await qu("npm",["install","--legacy-peer-deps"],{cwd:e,env:U,stdin:p,stdout:h,stderr:E,end:1});if(le.code!==0)return le.code;let ge=new kd.PassThrough,pe=zE(ge);ge.pipe(h);let De=await qu("npm",["pack","--silent",...fe],{cwd:e,env:U,stdin:p,stdout:ge,stderr:E});if(De.code!==0)return De.code;let ye=(await pe).toString().trim().replace(/^.*\n/s,""),d=Y.resolve(e,Ae.toPortablePath(ye));return await ae.renamePromise(d,t),0}]]).get(I);if(typeof $>"u")throw new Error("Assertion failed: Unsupported workflow");let ie=await $();if(!(ie===0||typeof ie>"u"))throw ae.detachTemp(c),new Lt(58,`Packing the package failed (exit code ${ie}, logs can be found here: ${Gt(r,f,dt.PATH)})`)})})})}async function wrt(e,t,{project:r}){let s=r.tryWorkspaceByLocator(e);if(s!==null)return jj(s,t);let a=r.storedPackages.get(e.locatorHash);if(!a)throw new Error(`Package for ${Vr(r.configuration,e)} not found in the project`);return await nA.openPromise(async n=>{let c=r.configuration,f=r.configuration.getLinkers(),p={project:r,report:new Ft({stdout:new kd.PassThrough,configuration:c})},h=f.find(x=>x.supportsPackage(a,p));if(!h)throw new Error(`The package ${Vr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),C=new Pn(E,{baseFs:n});return(await _t.find(wt.dot,{baseFs:C})).scripts.has(t)})}async function HT(e,t,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ae.mktempPromise(async p=>{let{manifest:h,env:E,cwd:C}=await Upe(e,{project:a,binFolder:p,cwd:s,lifecycleScript:t}),S=h.scripts.get(t);if(typeof S>"u")return 1;let x=async()=>await xI(S,r,{cwd:C,env:E,stdin:n,stdout:c,stderr:f});return await(await a.configuration.reduceHook(R=>R.wrapScriptExecution,x,a,e,t,{script:S,args:r,cwd:C,env:E,stdin:n,stdout:c,stderr:f}))()})}async function Hj(e,t,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ae.mktempPromise(async p=>{let{env:h,cwd:E}=await Upe(e,{project:a,binFolder:p,cwd:s});return await xI(t,r,{cwd:E,env:h,stdin:n,stdout:c,stderr:f})})}async function Brt(e,{binFolder:t,cwd:r,lifecycleScript:s}){let a=await mv({project:e.project,locator:e.anchoredLocator,binFolder:t,lifecycleScript:s});return await qj(t,await jpe(e)),typeof r>"u"&&(r=Y.dirname(await ae.realpathPromise(Y.join(e.cwd,"package.json")))),{manifest:e.manifest,binFolder:t,env:a,cwd:r}}async function Upe(e,{project:t,binFolder:r,cwd:s,lifecycleScript:a}){let n=t.tryWorkspaceByLocator(e);if(n!==null)return Brt(n,{binFolder:r,cwd:s,lifecycleScript:a});let c=t.storedPackages.get(e.locatorHash);if(!c)throw new Error(`Package for ${Vr(t.configuration,e)} not found in the project`);return await nA.openPromise(async f=>{let p=t.configuration,h=t.configuration.getLinkers(),E={project:t,report:new Ft({stdout:new kd.PassThrough,configuration:p})},C=h.find(N=>N.supportsPackage(c,E));if(!C)throw new Error(`The package ${Vr(t.configuration,c)} isn't supported by any of the available linkers`);let S=await mv({project:t,locator:e,binFolder:r,lifecycleScript:a});await qj(r,await jT(e,{project:t}));let x=await C.findPackageLocation(c,E),I=new Pn(x,{baseFs:f}),R=await _t.find(wt.dot,{baseFs:I});return typeof s>"u"&&(s=x),{manifest:R,binFolder:r,env:S,cwd:s}})}async function _pe(e,t,r,{cwd:s,stdin:a,stdout:n,stderr:c}){return await HT(e.anchoredLocator,t,r,{cwd:s,project:e.project,stdin:a,stdout:n,stderr:c})}function jj(e,t){return e.manifest.scripts.has(t)}async function Hpe(e,t,{cwd:r,report:s}){let{configuration:a}=e.project,n=null;await ae.mktempPromise(async c=>{let f=Y.join(c,`${t}.log`),p=`# This file contains the result of Yarn calling the "${t}" lifecycle script inside a workspace ("${Ae.fromPortablePath(e.cwd)}") +`,{stdout:h,stderr:E}=a.getSubprocessStreams(f,{report:s,prefix:Vr(a,e.anchoredLocator),header:p});s.reportInfo(36,`Calling the "${t}" lifecycle script`);let C=await _pe(e,t,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),C!==0)throw ae.detachTemp(c),new Lt(36,`${vB(t)} script failed (exit code ${Gt(a,C,dt.NUMBER)}, logs can be found here: ${Gt(a,f,dt.PATH)}); run ${Gt(a,`yarn ${t}`,dt.CODE)} to investigate`)})}async function vrt(e,t,r){jj(e,t)&&await Hpe(e,t,r)}function Gj(e){let t=Y.extname(e);if(t.match(/\.[cm]?[jt]sx?$/))return!0;if(t===".exe"||t===".bin")return!1;let r=Buffer.alloc(4),s;try{s=ae.openSync(e,"r")}catch{return!0}try{ae.readSync(s,r,0,r.length,0)}finally{ae.closeSync(s)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function jT(e,{project:t}){let r=t.configuration,s=new Map,a=t.storedPackages.get(e.locatorHash);if(!a)throw new Error(`Package for ${Vr(r,e)} not found in the project`);let n=new kd.Writable,c=r.getLinkers(),f={project:t,report:new Ft({configuration:r,stdout:n})},p=new Set([e.locatorHash]);for(let E of a.dependencies.values()){let C=t.storedResolutions.get(E.descriptorHash);if(!C)throw new Error(`Assertion failed: The resolution (${ai(r,E)}) should have been registered`);p.add(C)}let h=await Promise.all(Array.from(p,async E=>{let C=t.storedPackages.get(E);if(!C)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(C.bin.size===0)return Xl.skip;let S=c.find(I=>I.supportsPackage(C,f));if(!S)return Xl.skip;let x=null;try{x=await S.findPackageLocation(C,f)}catch(I){if(I.code==="LOCATOR_NOT_INSTALLED")return Xl.skip;throw I}return{dependency:C,packageLocation:x}}));for(let E of h){if(E===Xl.skip)continue;let{dependency:C,packageLocation:S}=E;for(let[x,I]of C.bin){let R=Y.resolve(S,I);s.set(x,[C,Ae.fromPortablePath(R),Gj(R)])}}return s}async function jpe(e){return await jT(e.anchoredLocator,{project:e.project})}async function qj(e,t){await Promise.all(Array.from(t,([r,[,s,a]])=>a?xd(e,r,process.execPath,[s]):xd(e,r,s,[])))}async function Gpe(e,t,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await jT(e,{project:a});let E=h.get(t);if(!E)throw new Error(`Binary not found (${t}) for ${Vr(a.configuration,e)}`);return await ae.mktempPromise(async C=>{let[,S]=E,x=await mv({project:a,locator:e,binFolder:C});await qj(x.BERRY_BIN_FOLDER,h);let I=Gj(Ae.toPortablePath(S))?qu(process.execPath,[...p,S,...r],{cwd:s,env:x,stdin:n,stdout:c,stderr:f}):qu(S,r,{cwd:s,env:x,stdin:n,stdout:c,stderr:f}),R;try{R=await I}finally{await ae.removePromise(x.BERRY_BIN_FOLDER)}return R.code})}async function Srt(e,t,r,{cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f}){return await Gpe(e.anchoredLocator,t,r,{project:e.project,cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f})}var Ope,kd,Lpe,Ert,Irt,Yj=Ze(()=>{bt();bt();iA();uv();Zl();Ope=et(M0()),kd=Ce("stream");fI();Nc();gv();dv();IT();Tc();Qc();Lp();$o();Lpe=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))(Lpe||{});Ert=2,Irt=(0,Ope.default)(Ert)});function Mnt(e,t,r){let s=t,a=t?t.next:e.head,n=new J6(r,s,a,e);return n.next===void 0&&(e.tail=n),n.prev===void 0&&(e.head=n),e.length++,n}function Unt(e,t){e.tail=new J6(t,e.tail,void 0,e),e.head||(e.head=e.tail),e.length++}function _nt(e,t){e.head=new J6(t,void 0,e.head,e),e.tail||(e.tail=e.head),e.length++}var Ihe,Oa,yR,H6,Che,G6,wm,IR,vhe,hR,Ud,Kpe,She,Cm,Qhe,Uv,Ku,B6,Ohe,Q6,Z6,jhe,X6,Bn,gs,$6,jv,_I,Il,Vhe,_v,eG,El,rG,brt,Drt,qpe,Prt,xrt,krt,qp,Yp,Qd,GT,yv,qT,Ype,YT,Wpe,Yu,QI,zs,Ev,NI,Zs,Na,Xs,Wj,WT,na,es,Vj,Kj,Vpe,Jj,oA,zj,VT,Iv,Am,rc,Cv,Qrt,Trt,Rrt,Frt,whe,Nrt,Ort,Lrt,Dm,Mrt,Hd,zu,wv,Jn,Zj,Jp,Xj,E6,I6,Tv,KT,UI,HI,$j,OI,jd,Ju,Nd,aA,LI,e6,Kp,Bv,t6,nR,pm,iR,Bm,j6,Urt,ER,Bhe,_rt,Hrt,jrt,Grt,qrt,Yrt,Wrt,q6,Hv,Vrt,uA,Krt,Jpe,Jrt,r6,vm,JT,n6,Y6,bhe,zrt,Zrt,Dhe,Xrt,$rt,Phe,ent,tnt,rnt,nnt,int,snt,ont,ant,xhe,khe,lnt,sR,cnt,CR,W6,Sm,unt,hm,i6,fnt,Od,Ant,pnt,hnt,Ld,dnt,gnt,mnt,s6,ynt,dm,dR,Ent,Int,Cnt,wnt,cn,Rhe,wR,Bnt,C6,w6,vnt,_c,gm,Wp,o6,zpe,lA,vv,Td,Zpe,Ci,Vp,Rd,a6,mm,ds,zT,ZT,l6,Xpe,$pe,Sv,c6,XT,TI,Fd,$T,ym,eR,tR,ehe,Snt,bm,Rv,bnt,Fhe,Dnt,Pnt,BR,Nhe,xnt,the,V6,vR,K6,knt,Qnt,rhe,Tnt,Lhe,Rnt,nhe,ihe,she,v6,ohe,bv,oR,S6,aR,b6,D6,P6,x6,Md,gR,k6,u6,cA,Mhe,Fnt,Nnt,Ont,Lnt,J6,ahe,lhe,lR,Dv,Wu,Em,Im,Pv,f6,Vu,A6,cR,che,T6,R6,uR,fR,uhe,p6,AR,Uhe,h6,SR,z6,Hnt,jnt,_he,Hhe,Gnt,qnt,YUt,Ynt,Wnt,Vnt,Knt,Jnt,Ghe,znt,Znt,Xnt,qhe,F6,mR,$nt,Yhe,eit,Whe,Khe,bR,tit,rit,N6,Jhe,nit,iit,d6,fhe,RI,sit,oit,ait,lit,cit,uit,Ahe,O6,phe,L6,Hc,M6,U6,pR,hhe,dhe,Qv,ghe,mhe,g6,_d,$s,rR,yhe,FI,m6,y6,_6,Fv,Nv,Ov,Lv,fit,Mv,Ait,pit,hit,Ehe,tG,xv,zhe,dit,git,WUt,mit,yit,Eit,Iit,Cit,kv,VUt,wit,Zhe=Ze(()=>{Ihe=et(Ce("events"),1),Oa=et(Ce("fs"),1),yR=Ce("node:events"),H6=et(Ce("node:stream"),1),Che=Ce("node:string_decoder"),G6=et(Ce("node:path"),1),wm=et(Ce("node:fs"),1),IR=Ce("path"),vhe=Ce("events"),hR=et(Ce("assert"),1),Ud=Ce("buffer"),Kpe=et(Ce("zlib"),1),She=et(Ce("zlib"),1),Cm=Ce("node:path"),Qhe=Ce("node:path"),Uv=et(Ce("fs"),1),Ku=et(Ce("fs"),1),B6=et(Ce("path"),1),Ohe=Ce("node:path"),Q6=et(Ce("path"),1),Z6=et(Ce("node:fs"),1),jhe=et(Ce("node:assert"),1),X6=Ce("node:crypto"),Bn=et(Ce("node:fs"),1),gs=et(Ce("node:path"),1),$6=et(Ce("fs"),1),jv=et(Ce("node:fs"),1),_I=et(Ce("node:path"),1),Il=et(Ce("node:fs"),1),Vhe=et(Ce("node:fs/promises"),1),_v=et(Ce("node:path"),1),eG=Ce("node:path"),El=et(Ce("node:fs"),1),rG=et(Ce("node:path"),1),brt=Object.defineProperty,Drt=(e,t)=>{for(var r in t)brt(e,r,{get:t[r],enumerable:!0})},qpe=typeof process=="object"&&process?process:{stdout:null,stderr:null},Prt=e=>!!e&&typeof e=="object"&&(e instanceof Dm||e instanceof H6.default||xrt(e)||krt(e)),xrt=e=>!!e&&typeof e=="object"&&e instanceof yR.EventEmitter&&typeof e.pipe=="function"&&e.pipe!==H6.default.Writable.prototype.pipe,krt=e=>!!e&&typeof e=="object"&&e instanceof yR.EventEmitter&&typeof e.write=="function"&&typeof e.end=="function",qp=Symbol("EOF"),Yp=Symbol("maybeEmitEnd"),Qd=Symbol("emittedEnd"),GT=Symbol("emittingEnd"),yv=Symbol("emittedError"),qT=Symbol("closed"),Ype=Symbol("read"),YT=Symbol("flush"),Wpe=Symbol("flushChunk"),Yu=Symbol("encoding"),QI=Symbol("decoder"),zs=Symbol("flowing"),Ev=Symbol("paused"),NI=Symbol("resume"),Zs=Symbol("buffer"),Na=Symbol("pipes"),Xs=Symbol("bufferLength"),Wj=Symbol("bufferPush"),WT=Symbol("bufferShift"),na=Symbol("objectMode"),es=Symbol("destroyed"),Vj=Symbol("error"),Kj=Symbol("emitData"),Vpe=Symbol("emitEnd"),Jj=Symbol("emitEnd2"),oA=Symbol("async"),zj=Symbol("abort"),VT=Symbol("aborted"),Iv=Symbol("signal"),Am=Symbol("dataListeners"),rc=Symbol("discarded"),Cv=e=>Promise.resolve().then(e),Qrt=e=>e(),Trt=e=>e==="end"||e==="finish"||e==="prefinish",Rrt=e=>e instanceof ArrayBuffer||!!e&&typeof e=="object"&&e.constructor&&e.constructor.name==="ArrayBuffer"&&e.byteLength>=0,Frt=e=>!Buffer.isBuffer(e)&&ArrayBuffer.isView(e),whe=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[NI](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Nrt=class extends whe{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,r){super(e,t,r),this.proxyErrors=s=>t.emit("error",s),e.on("error",this.proxyErrors)}},Ort=e=>!!e.objectMode,Lrt=e=>!e.objectMode&&!!e.encoding&&e.encoding!=="buffer",Dm=class extends yR.EventEmitter{[zs]=!1;[Ev]=!1;[Na]=[];[Zs]=[];[na];[Yu];[oA];[QI];[qp]=!1;[Qd]=!1;[GT]=!1;[qT]=!1;[yv]=null;[Xs]=0;[es]=!1;[Iv];[VT]=!1;[Am]=0;[rc]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Ort(t)?(this[na]=!0,this[Yu]=null):Lrt(t)?(this[Yu]=t.encoding,this[na]=!1):(this[na]=!1,this[Yu]=null),this[oA]=!!t.async,this[QI]=this[Yu]?new Che.StringDecoder(this[Yu]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[Zs]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[Na]});let{signal:r}=t;r&&(this[Iv]=r,r.aborted?this[zj]():r.addEventListener("abort",()=>this[zj]()))}get bufferLength(){return this[Xs]}get encoding(){return this[Yu]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[na]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[oA]}set async(e){this[oA]=this[oA]||!!e}[zj](){this[VT]=!0,this.emit("abort",this[Iv]?.reason),this.destroy(this[Iv]?.reason)}get aborted(){return this[VT]}set aborted(e){}write(e,t,r){if(this[VT])return!1;if(this[qp])throw new Error("write after end");if(this[es])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(r=t,t="utf8"),t||(t="utf8");let s=this[oA]?Cv:Qrt;if(!this[na]&&!Buffer.isBuffer(e)){if(Frt(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(Rrt(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[na]?(this[zs]&&this[Xs]!==0&&this[YT](!0),this[zs]?this.emit("data",e):this[Wj](e),this[Xs]!==0&&this.emit("readable"),r&&s(r),this[zs]):e.length?(typeof e=="string"&&!(t===this[Yu]&&!this[QI]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[Yu]&&(e=this[QI].write(e)),this[zs]&&this[Xs]!==0&&this[YT](!0),this[zs]?this.emit("data",e):this[Wj](e),this[Xs]!==0&&this.emit("readable"),r&&s(r),this[zs]):(this[Xs]!==0&&this.emit("readable"),r&&s(r),this[zs])}read(e){if(this[es])return null;if(this[rc]=!1,this[Xs]===0||e===0||e&&e>this[Xs])return this[Yp](),null;this[na]&&(e=null),this[Zs].length>1&&!this[na]&&(this[Zs]=[this[Yu]?this[Zs].join(""):Buffer.concat(this[Zs],this[Xs])]);let t=this[Ype](e||null,this[Zs][0]);return this[Yp](),t}[Ype](e,t){if(this[na])this[WT]();else{let r=t;e===r.length||e===null?this[WT]():typeof r=="string"?(this[Zs][0]=r.slice(e),t=r.slice(0,e),this[Xs]-=e):(this[Zs][0]=r.subarray(e),t=r.subarray(0,e),this[Xs]-=e)}return this.emit("data",t),!this[Zs].length&&!this[qp]&&this.emit("drain"),t}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t="utf8"),e!==void 0&&this.write(e,t),r&&this.once("end",r),this[qp]=!0,this.writable=!1,(this[zs]||!this[Ev])&&this[Yp](),this}[NI](){this[es]||(!this[Am]&&!this[Na].length&&(this[rc]=!0),this[Ev]=!1,this[zs]=!0,this.emit("resume"),this[Zs].length?this[YT]():this[qp]?this[Yp]():this.emit("drain"))}resume(){return this[NI]()}pause(){this[zs]=!1,this[Ev]=!0,this[rc]=!1}get destroyed(){return this[es]}get flowing(){return this[zs]}get paused(){return this[Ev]}[Wj](e){this[na]?this[Xs]+=1:this[Xs]+=e.length,this[Zs].push(e)}[WT](){return this[na]?this[Xs]-=1:this[Xs]-=this[Zs][0].length,this[Zs].shift()}[YT](e=!1){do;while(this[Wpe](this[WT]())&&this[Zs].length);!e&&!this[Zs].length&&!this[qp]&&this.emit("drain")}[Wpe](e){return this.emit("data",e),this[zs]}pipe(e,t){if(this[es])return e;this[rc]=!1;let r=this[Qd];return t=t||{},e===qpe.stdout||e===qpe.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[Na].push(t.proxyErrors?new Nrt(this,e,t):new whe(this,e,t)),this[oA]?Cv(()=>this[NI]()):this[NI]()),e}unpipe(e){let t=this[Na].find(r=>r.dest===e);t&&(this[Na].length===1?(this[zs]&&this[Am]===0&&(this[zs]=!1),this[Na]=[]):this[Na].splice(this[Na].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let r=super.on(e,t);if(e==="data")this[rc]=!1,this[Am]++,!this[Na].length&&!this[zs]&&this[NI]();else if(e==="readable"&&this[Xs]!==0)super.emit("readable");else if(Trt(e)&&this[Qd])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[yv]){let s=t;this[oA]?Cv(()=>s.call(this,this[yv])):s.call(this,this[yv])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Am]=this.listeners("data").length,this[Am]===0&&!this[rc]&&!this[Na].length&&(this[zs]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Am]=0,!this[rc]&&!this[Na].length&&(this[zs]=!1)),t}get emittedEnd(){return this[Qd]}[Yp](){!this[GT]&&!this[Qd]&&!this[es]&&this[Zs].length===0&&this[qp]&&(this[GT]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[qT]&&this.emit("close"),this[GT]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==es&&this[es])return!1;if(e==="data")return!this[na]&&!r?!1:this[oA]?(Cv(()=>this[Kj](r)),!0):this[Kj](r);if(e==="end")return this[Vpe]();if(e==="close"){if(this[qT]=!0,!this[Qd]&&!this[es])return!1;let a=super.emit("close");return this.removeAllListeners("close"),a}else if(e==="error"){this[yv]=r,super.emit(Vj,r);let a=!this[Iv]||this.listeners("error").length?super.emit("error",r):!1;return this[Yp](),a}else if(e==="resume"){let a=super.emit("resume");return this[Yp](),a}else if(e==="finish"||e==="prefinish"){let a=super.emit(e);return this.removeAllListeners(e),a}let s=super.emit(e,...t);return this[Yp](),s}[Kj](e){for(let r of this[Na])r.dest.write(e)===!1&&this.pause();let t=this[rc]?!1:super.emit("data",e);return this[Yp](),t}[Vpe](){return this[Qd]?!1:(this[Qd]=!0,this.readable=!1,this[oA]?(Cv(()=>this[Jj]()),!0):this[Jj]())}[Jj](){if(this[QI]){let t=this[QI].end();if(t){for(let r of this[Na])r.dest.write(t);this[rc]||super.emit("data",t)}}for(let t of this[Na])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[na]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[na]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[na])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[Yu]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(es,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[rc]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[qp])return t();let s,a,n=h=>{this.off("data",c),this.off("end",f),this.off(es,p),t(),a(h)},c=h=>{this.off("error",n),this.off("end",f),this.off(es,p),this.pause(),s({value:h,done:!!this[qp]})},f=()=>{this.off("error",n),this.off("data",c),this.off(es,p),t(),s({done:!0,value:void 0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,s=h,this.once(es,p),this.once("error",n),this.once("end",f),this.once("data",c)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[rc]=!1;let e=!1,t=()=>(this.pause(),this.off(Vj,t),this.off(es,t),this.off("end",t),e=!0,{done:!0,value:void 0}),r=()=>{if(e)return t();let s=this.read();return s===null?t():{done:!1,value:s}};return this.once("end",t),this.once(Vj,t),this.once(es,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[es])return e?this.emit("error",e):this.emit(es),this;this[es]=!0,this[rc]=!0,this[Zs].length=0,this[Xs]=0;let t=this;return typeof t.close=="function"&&!this[qT]&&t.close(),e?this.emit("error",e):this.emit(es),this}static get isStream(){return Prt}},Mrt=Oa.default.writev,Hd=Symbol("_autoClose"),zu=Symbol("_close"),wv=Symbol("_ended"),Jn=Symbol("_fd"),Zj=Symbol("_finished"),Jp=Symbol("_flags"),Xj=Symbol("_flush"),E6=Symbol("_handleChunk"),I6=Symbol("_makeBuf"),Tv=Symbol("_mode"),KT=Symbol("_needDrain"),UI=Symbol("_onerror"),HI=Symbol("_onopen"),$j=Symbol("_onread"),OI=Symbol("_onwrite"),jd=Symbol("_open"),Ju=Symbol("_path"),Nd=Symbol("_pos"),aA=Symbol("_queue"),LI=Symbol("_read"),e6=Symbol("_readSize"),Kp=Symbol("_reading"),Bv=Symbol("_remain"),t6=Symbol("_size"),nR=Symbol("_write"),pm=Symbol("_writing"),iR=Symbol("_defaultFlag"),Bm=Symbol("_errored"),j6=class extends Dm{[Bm]=!1;[Jn];[Ju];[e6];[Kp]=!1;[t6];[Bv];[Hd];constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Bm]=!1,this[Jn]=typeof t.fd=="number"?t.fd:void 0,this[Ju]=e,this[e6]=t.readSize||16*1024*1024,this[Kp]=!1,this[t6]=typeof t.size=="number"?t.size:1/0,this[Bv]=this[t6],this[Hd]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[Jn]=="number"?this[LI]():this[jd]()}get fd(){return this[Jn]}get path(){return this[Ju]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[jd](){Oa.default.open(this[Ju],"r",(e,t)=>this[HI](e,t))}[HI](e,t){e?this[UI](e):(this[Jn]=t,this.emit("open",t),this[LI]())}[I6](){return Buffer.allocUnsafe(Math.min(this[e6],this[Bv]))}[LI](){if(!this[Kp]){this[Kp]=!0;let e=this[I6]();if(e.length===0)return process.nextTick(()=>this[$j](null,0,e));Oa.default.read(this[Jn],e,0,e.length,null,(t,r,s)=>this[$j](t,r,s))}}[$j](e,t,r){this[Kp]=!1,e?this[UI](e):this[E6](t,r)&&this[LI]()}[zu](){if(this[Hd]&&typeof this[Jn]=="number"){let e=this[Jn];this[Jn]=void 0,Oa.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}[UI](e){this[Kp]=!0,this[zu](),this.emit("error",e)}[E6](e,t){let r=!1;return this[Bv]-=e,e>0&&(r=super.write(ethis[HI](e,t))}[HI](e,t){this[iR]&&this[Jp]==="r+"&&e&&e.code==="ENOENT"?(this[Jp]="w",this[jd]()):e?this[UI](e):(this[Jn]=t,this.emit("open",t),this[pm]||this[Xj]())}end(e,t){return e&&this.write(e,t),this[wv]=!0,!this[pm]&&!this[aA].length&&typeof this[Jn]=="number"&&this[OI](null,0),this}write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[wv]?(this.emit("error",new Error("write() after end()")),!1):this[Jn]===void 0||this[pm]||this[aA].length?(this[aA].push(e),this[KT]=!0,!1):(this[pm]=!0,this[nR](e),!0)}[nR](e){Oa.default.write(this[Jn],e,0,e.length,this[Nd],(t,r)=>this[OI](t,r))}[OI](e,t){e?this[UI](e):(this[Nd]!==void 0&&typeof t=="number"&&(this[Nd]+=t),this[aA].length?this[Xj]():(this[pm]=!1,this[wv]&&!this[Zj]?(this[Zj]=!0,this[zu](),this.emit("finish")):this[KT]&&(this[KT]=!1,this.emit("drain"))))}[Xj](){if(this[aA].length===0)this[wv]&&this[OI](null,0);else if(this[aA].length===1)this[nR](this[aA].pop());else{let e=this[aA];this[aA]=[],Mrt(this[Jn],e,this[Nd],(t,r)=>this[OI](t,r))}}[zu](){if(this[Hd]&&typeof this[Jn]=="number"){let e=this[Jn];this[Jn]=void 0,Oa.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}},Bhe=class extends ER{[jd](){let e;if(this[iR]&&this[Jp]==="r+")try{e=Oa.default.openSync(this[Ju],this[Jp],this[Tv])}catch(t){if(t?.code==="ENOENT")return this[Jp]="w",this[jd]();throw t}else e=Oa.default.openSync(this[Ju],this[Jp],this[Tv]);this[HI](null,e)}[zu](){if(this[Hd]&&typeof this[Jn]=="number"){let e=this[Jn];this[Jn]=void 0,Oa.default.closeSync(e),this.emit("close")}}[nR](e){let t=!0;try{this[OI](null,Oa.default.writeSync(this[Jn],e,0,e.length,this[Nd])),t=!1}finally{if(t)try{this[zu]()}catch{}}}},_rt=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"],["onentry","onReadEntry"]]),Hrt=e=>!!e.sync&&!!e.file,jrt=e=>!e.sync&&!!e.file,Grt=e=>!!e.sync&&!e.file,qrt=e=>!e.sync&&!e.file,Yrt=e=>!!e.file,Wrt=e=>_rt.get(e)||e,q6=(e={})=>{if(!e)return{};let t={};for(let[r,s]of Object.entries(e)){let a=Wrt(r);t[a]=s}return t.chmod===void 0&&t.noChmod===!1&&(t.chmod=!0),delete t.noChmod,t},Hv=(e,t,r,s,a)=>Object.assign((n=[],c,f)=>{Array.isArray(n)&&(c=n,n={}),typeof c=="function"&&(f=c,c=void 0),c?c=Array.from(c):c=[];let p=q6(n);if(a?.(p,c),Hrt(p)){if(typeof f=="function")throw new TypeError("callback not supported for sync tar functions");return e(p,c)}else if(jrt(p)){let h=t(p,c),E=f||void 0;return E?h.then(()=>E(),E):h}else if(Grt(p)){if(typeof f=="function")throw new TypeError("callback not supported for sync tar functions");return r(p,c)}else if(qrt(p)){if(typeof f=="function")throw new TypeError("callback only supported with file option");return s(p,c)}else throw new Error("impossible options??")},{syncFile:e,asyncFile:t,syncNoFile:r,asyncNoFile:s,validate:a}),Vrt=She.default.constants||{ZLIB_VERNUM:4736},uA=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:1/0,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},Vrt)),Krt=Ud.Buffer.concat,Jpe=Object.getOwnPropertyDescriptor(Ud.Buffer,"concat"),Jrt=e=>e,r6=Jpe?.writable===!0||Jpe?.set!==void 0?e=>{Ud.Buffer.concat=e?Jrt:Krt}:e=>{},vm=Symbol("_superWrite"),JT=class extends Error{code;errno;constructor(e,t){super("zlib: "+e.message,{cause:e}),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,t??this.constructor)}get name(){return"ZlibError"}},n6=Symbol("flushFlag"),Y6=class extends Dm{#e=!1;#t=!1;#s;#r;#i;#n;#o;get sawError(){return this.#e}get handle(){return this.#n}get flushFlag(){return this.#s}constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(e),this.#s=e.flush??0,this.#r=e.finishFlush??0,this.#i=e.fullFlushFlag??0,typeof Kpe[t]!="function")throw new TypeError("Compression method not supported: "+t);try{this.#n=new Kpe[t](e)}catch(r){throw new JT(r,this.constructor)}this.#o=r=>{this.#e||(this.#e=!0,this.close(),this.emit("error",r))},this.#n?.on("error",r=>this.#o(new JT(r))),this.once("end",()=>this.close)}close(){this.#n&&(this.#n.close(),this.#n=void 0,this.emit("close"))}reset(){if(!this.#e)return(0,hR.default)(this.#n,"zlib binding closed"),this.#n.reset?.()}flush(e){this.ended||(typeof e!="number"&&(e=this.#i),this.write(Object.assign(Ud.Buffer.alloc(0),{[n6]:e})))}end(e,t,r){return typeof e=="function"&&(r=e,t=void 0,e=void 0),typeof t=="function"&&(r=t,t=void 0),e&&(t?this.write(e,t):this.write(e)),this.flush(this.#r),this.#t=!0,super.end(r)}get ended(){return this.#t}[vm](e){return super.write(e)}write(e,t,r){if(typeof t=="function"&&(r=t,t="utf8"),typeof e=="string"&&(e=Ud.Buffer.from(e,t)),this.#e)return;(0,hR.default)(this.#n,"zlib binding closed");let s=this.#n._handle,a=s.close;s.close=()=>{};let n=this.#n.close;this.#n.close=()=>{},r6(!0);let c;try{let p=typeof e[n6]=="number"?e[n6]:this.#s;c=this.#n._processChunk(e,p),r6(!1)}catch(p){r6(!1),this.#o(new JT(p,this.write))}finally{this.#n&&(this.#n._handle=s,s.close=a,this.#n.close=n,this.#n.removeAllListeners("error"))}this.#n&&this.#n.on("error",p=>this.#o(new JT(p,this.write)));let f;if(c)if(Array.isArray(c)&&c.length>0){let p=c[0];f=this[vm](Ud.Buffer.from(p));for(let h=1;h{typeof s=="function"&&(a=s,s=this.flushFlag),this.flush(s),a?.()};try{this.handle.params(e,t)}finally{this.handle.flush=r}this.handle&&(this.#e=e,this.#t=t)}}}},zrt=class extends bhe{#e;constructor(e){super(e,"Gzip"),this.#e=e&&!!e.portable}[vm](e){return this.#e?(this.#e=!1,e[9]=255,super[vm](e)):super[vm](e)}},Zrt=class extends bhe{constructor(e){super(e,"Unzip")}},Dhe=class extends Y6{constructor(e,t){e=e||{},e.flush=e.flush||uA.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||uA.BROTLI_OPERATION_FINISH,e.fullFlushFlag=uA.BROTLI_OPERATION_FLUSH,super(e,t)}},Xrt=class extends Dhe{constructor(e){super(e,"BrotliCompress")}},$rt=class extends Dhe{constructor(e){super(e,"BrotliDecompress")}},Phe=class extends Y6{constructor(e,t){e=e||{},e.flush=e.flush||uA.ZSTD_e_continue,e.finishFlush=e.finishFlush||uA.ZSTD_e_end,e.fullFlushFlag=uA.ZSTD_e_flush,super(e,t)}},ent=class extends Phe{constructor(e){super(e,"ZstdCompress")}},tnt=class extends Phe{constructor(e){super(e,"ZstdDecompress")}},rnt=(e,t)=>{if(Number.isSafeInteger(e))e<0?int(e,t):nnt(e,t);else throw Error("cannot encode number outside of javascript safe integer range");return t},nnt=(e,t)=>{t[0]=128;for(var r=t.length;r>1;r--)t[r-1]=e&255,e=Math.floor(e/256)},int=(e,t)=>{t[0]=255;var r=!1;e=e*-1;for(var s=t.length;s>1;s--){var a=e&255;e=Math.floor(e/256),r?t[s-1]=xhe(a):a===0?t[s-1]=0:(r=!0,t[s-1]=khe(a))}},snt=e=>{let t=e[0],r=t===128?ant(e.subarray(1,e.length)):t===255?ont(e):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},ont=e=>{for(var t=e.length,r=0,s=!1,a=t-1;a>-1;a--){var n=Number(e[a]),c;s?c=xhe(n):n===0?c=n:(s=!0,c=khe(n)),c!==0&&(r-=c*Math.pow(256,t-a-1))}return r},ant=e=>{for(var t=e.length,r=0,s=t-1;s>-1;s--){var a=Number(e[s]);a!==0&&(r+=a*Math.pow(256,t-s-1))}return r},xhe=e=>(255^e)&255,khe=e=>(255^e)+1&255,lnt={};Drt(lnt,{code:()=>W6,isCode:()=>sR,isName:()=>cnt,name:()=>CR});sR=e=>CR.has(e),cnt=e=>W6.has(e),CR=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"]]),W6=new Map(Array.from(CR).map(e=>[e[1],e[0]])),Sm=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#e="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(e,t=0,r,s){Buffer.isBuffer(e)?this.decode(e,t||0,r,s):e&&this.#t(e)}decode(e,t,r,s){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");this.path=r?.path??hm(e,t,100),this.mode=r?.mode??s?.mode??Od(e,t+100,8),this.uid=r?.uid??s?.uid??Od(e,t+108,8),this.gid=r?.gid??s?.gid??Od(e,t+116,8),this.size=r?.size??s?.size??Od(e,t+124,12),this.mtime=r?.mtime??s?.mtime??i6(e,t+136,12),this.cksum=Od(e,t+148,12),s&&this.#t(s,!0),r&&this.#t(r);let a=hm(e,t+156,1);if(sR(a)&&(this.#e=a||"0"),this.#e==="0"&&this.path.slice(-1)==="/"&&(this.#e="5"),this.#e==="5"&&(this.size=0),this.linkpath=hm(e,t+157,100),e.subarray(t+257,t+265).toString()==="ustar\x0000")if(this.uname=r?.uname??s?.uname??hm(e,t+265,32),this.gname=r?.gname??s?.gname??hm(e,t+297,32),this.devmaj=r?.devmaj??s?.devmaj??Od(e,t+329,8)??0,this.devmin=r?.devmin??s?.devmin??Od(e,t+337,8)??0,e[t+475]!==0){let c=hm(e,t+345,155);this.path=c+"/"+this.path}else{let c=hm(e,t+345,130);c&&(this.path=c+"/"+this.path),this.atime=r?.atime??s?.atime??i6(e,t+476,12),this.ctime=r?.ctime??s?.ctime??i6(e,t+488,12)}let n=256;for(let c=t;c!(s==null||r==="path"&&t||r==="linkpath"&&t||r==="global"))))}encode(e,t=0){if(e||(e=this.block=Buffer.alloc(512)),this.#e==="Unsupported"&&(this.#e="0"),!(e.length>=t+512))throw new Error("need 512 bytes for header");let r=this.ctime||this.atime?130:155,s=unt(this.path||"",r),a=s[0],n=s[1];this.needPax=!!s[2],this.needPax=dm(e,t,100,a)||this.needPax,this.needPax=Ld(e,t+100,8,this.mode)||this.needPax,this.needPax=Ld(e,t+108,8,this.uid)||this.needPax,this.needPax=Ld(e,t+116,8,this.gid)||this.needPax,this.needPax=Ld(e,t+124,12,this.size)||this.needPax,this.needPax=s6(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this.#e.charCodeAt(0),this.needPax=dm(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=dm(e,t+265,32,this.uname)||this.needPax,this.needPax=dm(e,t+297,32,this.gname)||this.needPax,this.needPax=Ld(e,t+329,8,this.devmaj)||this.needPax,this.needPax=Ld(e,t+337,8,this.devmin)||this.needPax,this.needPax=dm(e,t+345,r,n)||this.needPax,e[t+475]!==0?this.needPax=dm(e,t+345,155,n)||this.needPax:(this.needPax=dm(e,t+345,130,n)||this.needPax,this.needPax=s6(e,t+476,12,this.atime)||this.needPax,this.needPax=s6(e,t+488,12,this.ctime)||this.needPax);let c=256;for(let f=t;f{let r=e,s="",a,n=Cm.posix.parse(e).root||".";if(Buffer.byteLength(r)<100)a=[r,s,!1];else{s=Cm.posix.dirname(r),r=Cm.posix.basename(r);do Buffer.byteLength(r)<=100&&Buffer.byteLength(s)<=t?a=[r,s,!1]:Buffer.byteLength(r)>100&&Buffer.byteLength(s)<=t?a=[r.slice(0,99),s,!0]:(r=Cm.posix.join(Cm.posix.basename(s),r),s=Cm.posix.dirname(s));while(s!==n&&a===void 0);a||(a=[e.slice(0,99),"",!0])}return a},hm=(e,t,r)=>e.subarray(t,t+r).toString("utf8").replace(/\0.*/,""),i6=(e,t,r)=>fnt(Od(e,t,r)),fnt=e=>e===void 0?void 0:new Date(e*1e3),Od=(e,t,r)=>Number(e[t])&128?snt(e.subarray(t,t+r)):pnt(e,t,r),Ant=e=>isNaN(e)?void 0:e,pnt=(e,t,r)=>Ant(parseInt(e.subarray(t,t+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),hnt={12:8589934591,8:2097151},Ld=(e,t,r,s)=>s===void 0?!1:s>hnt[r]||s<0?(rnt(s,e.subarray(t,t+r)),!0):(dnt(e,t,r,s),!1),dnt=(e,t,r,s)=>e.write(gnt(s,r),t,r,"ascii"),gnt=(e,t)=>mnt(Math.floor(e).toString(8),t),mnt=(e,t)=>(e.length===t-1?e:new Array(t-e.length-1).join("0")+e+" ")+"\0",s6=(e,t,r,s)=>s===void 0?!1:Ld(e,t,r,s.getTime()/1e3),ynt=new Array(156).join("\0"),dm=(e,t,r,s)=>s===void 0?!1:(e.write(s+ynt,t,r,"utf8"),s.length!==Buffer.byteLength(s)||s.length>r),dR=class The{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(t,r=!1){this.atime=t.atime,this.charset=t.charset,this.comment=t.comment,this.ctime=t.ctime,this.dev=t.dev,this.gid=t.gid,this.global=r,this.gname=t.gname,this.ino=t.ino,this.linkpath=t.linkpath,this.mtime=t.mtime,this.nlink=t.nlink,this.path=t.path,this.size=t.size,this.uid=t.uid,this.uname=t.uname}encode(){let t=this.encodeBody();if(t==="")return Buffer.allocUnsafe(0);let r=Buffer.byteLength(t),s=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(s);for(let n=0;n<512;n++)a[n]=0;new Sm({path:("PaxHeader/"+(0,Qhe.basename)(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:r,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(a),a.write(t,512,r,"utf8");for(let n=r+512;n=Math.pow(10,c)&&(c+=1),c+n+a}static parse(t,r,s=!1){return new The(Ent(Int(t),r),s)}},Ent=(e,t)=>t?Object.assign({},t,e):e,Int=e=>e.replace(/\n$/,"").split(` +`).reduce(Cnt,Object.create(null)),Cnt=(e,t)=>{let r=parseInt(t,10);if(r!==Buffer.byteLength(t)+1)return e;t=t.slice((r+" ").length);let s=t.split("="),a=s.shift();if(!a)return e;let n=a.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),c=s.join("=");return e[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(c)*1e3):/^[0-9]+$/.test(c)?+c:c,e},wnt=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,cn=wnt!=="win32"?e=>e:e=>e&&e.replace(/\\/g,"/"),Rhe=class extends Dm{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(e,t,r){switch(super({}),this.pause(),this.extended=t,this.globalExtended=r,this.header=e,this.remain=e.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=e.type,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}if(!e.path)throw new Error("no path provided for tar.ReadEntry");this.path=cn(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=this.remain,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath?cn(e.linkpath):void 0,this.uname=e.uname,this.gname=e.gname,t&&this.#e(t),r&&this.#e(r,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let r=this.remain,s=this.blockRemain;return this.remain=Math.max(0,r-t),this.blockRemain=Math.max(0,s-t),this.ignore?!0:r>=t?super.write(e):super.write(e.subarray(0,r))}#e(e,t=!1){e.path&&(e.path=cn(e.path)),e.linkpath&&(e.linkpath=cn(e.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(e).filter(([r,s])=>!(s==null||r==="path"&&t))))}},wR=(e,t,r,s={})=>{e.file&&(s.file=e.file),e.cwd&&(s.cwd=e.cwd),s.code=r instanceof Error&&r.code||t,s.tarCode=t,!e.strict&&s.recoverable!==!1?(r instanceof Error&&(s=Object.assign(r,s),r=r.message),e.emit("warn",t,r,s)):r instanceof Error?e.emit("error",Object.assign(r,s)):e.emit("error",Object.assign(new Error(`${t}: ${r}`),s))},Bnt=1024*1024,C6=Buffer.from([31,139]),w6=Buffer.from([40,181,47,253]),vnt=Math.max(C6.length,w6.length),_c=Symbol("state"),gm=Symbol("writeEntry"),Wp=Symbol("readEntry"),o6=Symbol("nextEntry"),zpe=Symbol("processEntry"),lA=Symbol("extendedHeader"),vv=Symbol("globalExtendedHeader"),Td=Symbol("meta"),Zpe=Symbol("emitMeta"),Ci=Symbol("buffer"),Vp=Symbol("queue"),Rd=Symbol("ended"),a6=Symbol("emittedEnd"),mm=Symbol("emit"),ds=Symbol("unzip"),zT=Symbol("consumeChunk"),ZT=Symbol("consumeChunkSub"),l6=Symbol("consumeBody"),Xpe=Symbol("consumeMeta"),$pe=Symbol("consumeHeader"),Sv=Symbol("consuming"),c6=Symbol("bufferConcat"),XT=Symbol("maybeEnd"),TI=Symbol("writing"),Fd=Symbol("aborted"),$T=Symbol("onDone"),ym=Symbol("sawValidEntry"),eR=Symbol("sawNullBlock"),tR=Symbol("sawEOF"),ehe=Symbol("closeStream"),Snt=()=>!0,bm=class extends vhe.EventEmitter{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[Vp]=[];[Ci];[Wp];[gm];[_c]="begin";[Td]="";[lA];[vv];[Rd]=!1;[ds];[Fd]=!1;[ym];[eR]=!1;[tR]=!1;[TI]=!1;[Sv]=!1;[a6]=!1;constructor(e={}){super(),this.file=e.file||"",this.on($T,()=>{(this[_c]==="begin"||this[ym]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on($T,e.ondone):this.on($T,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||Bnt,this.filter=typeof e.filter=="function"?e.filter:Snt;let t=e.file&&(e.file.endsWith(".tar.br")||e.file.endsWith(".tbr"));this.brotli=!(e.gzip||e.zstd)&&e.brotli!==void 0?e.brotli:t?void 0:!1;let r=e.file&&(e.file.endsWith(".tar.zst")||e.file.endsWith(".tzst"));this.zstd=!(e.gzip||e.brotli)&&e.zstd!==void 0?e.zstd:r?!0:void 0,this.on("end",()=>this[ehe]()),typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onReadEntry=="function"&&this.on("entry",e.onReadEntry)}warn(e,t,r={}){wR(this,e,t,r)}[$pe](e,t){this[ym]===void 0&&(this[ym]=!1);let r;try{r=new Sm(e,t,this[lA],this[vv])}catch(s){return this.warn("TAR_ENTRY_INVALID",s)}if(r.nullBlock)this[eR]?(this[tR]=!0,this[_c]==="begin"&&(this[_c]="header"),this[mm]("eof")):(this[eR]=!0,this[mm]("nullBlock"));else if(this[eR]=!1,!r.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:r});else if(!r.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:r});else{let s=r.type;if(/^(Symbolic)?Link$/.test(s)&&!r.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:r});else if(!/^(Symbolic)?Link$/.test(s)&&!/^(Global)?ExtendedHeader$/.test(s)&&r.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:r});else{let a=this[gm]=new Rhe(r,this[lA],this[vv]);if(!this[ym])if(a.remain){let n=()=>{a.invalid||(this[ym]=!0)};a.on("end",n)}else this[ym]=!0;a.meta?a.size>this.maxMetaEntrySize?(a.ignore=!0,this[mm]("ignoredEntry",a),this[_c]="ignore",a.resume()):a.size>0&&(this[Td]="",a.on("data",n=>this[Td]+=n),this[_c]="meta"):(this[lA]=void 0,a.ignore=a.ignore||!this.filter(a.path,a),a.ignore?(this[mm]("ignoredEntry",a),this[_c]=a.remain?"ignore":"header",a.resume()):(a.remain?this[_c]="body":(this[_c]="header",a.end()),this[Wp]?this[Vp].push(a):(this[Vp].push(a),this[o6]())))}}}[ehe](){queueMicrotask(()=>this.emit("close"))}[zpe](e){let t=!0;if(!e)this[Wp]=void 0,t=!1;else if(Array.isArray(e)){let[r,...s]=e;this.emit(r,...s)}else this[Wp]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",()=>this[o6]()),t=!1);return t}[o6](){do;while(this[zpe](this[Vp].shift()));if(!this[Vp].length){let e=this[Wp];!e||e.flowing||e.size===e.remain?this[TI]||this.emit("drain"):e.once("drain",()=>this.emit("drain"))}}[l6](e,t){let r=this[gm];if(!r)throw new Error("attempt to consume body without entry??");let s=r.blockRemain??0,a=s>=e.length&&t===0?e:e.subarray(t,t+s);return r.write(a),r.blockRemain||(this[_c]="header",this[gm]=void 0,r.end()),a.length}[Xpe](e,t){let r=this[gm],s=this[l6](e,t);return!this[gm]&&r&&this[Zpe](r),s}[mm](e,t,r){!this[Vp].length&&!this[Wp]?this.emit(e,t,r):this[Vp].push([e,t,r])}[Zpe](e){switch(this[mm]("meta",this[Td]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[lA]=dR.parse(this[Td],this[lA],!1);break;case"GlobalExtendedHeader":this[vv]=dR.parse(this[Td],this[vv],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let t=this[lA]??Object.create(null);this[lA]=t,t.path=this[Td].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let t=this[lA]||Object.create(null);this[lA]=t,t.linkpath=this[Td].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Fd]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e,t,r){if(typeof t=="function"&&(r=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this[Fd])return r?.(),!1;if((this[ds]===void 0||this.brotli===void 0&&this[ds]===!1)&&e){if(this[Ci]&&(e=Buffer.concat([this[Ci],e]),this[Ci]=void 0),e.lengththis[zT](p)),this[ds].on("error",p=>this.abort(p)),this[ds].on("end",()=>{this[Rd]=!0,this[zT]()}),this[TI]=!0;let f=!!this[ds][c?"end":"write"](e);return this[TI]=!1,r?.(),f}}this[TI]=!0,this[ds]?this[ds].write(e):this[zT](e),this[TI]=!1;let s=this[Vp].length?!1:this[Wp]?this[Wp].flowing:!0;return!s&&!this[Vp].length&&this[Wp]?.once("drain",()=>this.emit("drain")),r?.(),s}[c6](e){e&&!this[Fd]&&(this[Ci]=this[Ci]?Buffer.concat([this[Ci],e]):e)}[XT](){if(this[Rd]&&!this[a6]&&!this[Fd]&&!this[Sv]){this[a6]=!0;let e=this[gm];if(e&&e.blockRemain){let t=this[Ci]?this[Ci].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[Ci]&&e.write(this[Ci]),e.end()}this[mm]($T)}}[zT](e){if(this[Sv]&&e)this[c6](e);else if(!e&&!this[Ci])this[XT]();else if(e){if(this[Sv]=!0,this[Ci]){this[c6](e);let t=this[Ci];this[Ci]=void 0,this[ZT](t)}else this[ZT](e);for(;this[Ci]&&this[Ci]?.length>=512&&!this[Fd]&&!this[tR];){let t=this[Ci];this[Ci]=void 0,this[ZT](t)}this[Sv]=!1}(!this[Ci]||this[Rd])&&this[XT]()}[ZT](e){let t=0,r=e.length;for(;t+512<=r&&!this[Fd]&&!this[tR];)switch(this[_c]){case"begin":case"header":this[$pe](e,t),t+=512;break;case"ignore":case"body":t+=this[l6](e,t);break;case"meta":t+=this[Xpe](e,t);break;default:throw new Error("invalid state: "+this[_c])}t{let t=e.length-1,r=-1;for(;t>-1&&e.charAt(t)==="/";)r=t,t--;return r===-1?e:e.slice(0,r)},bnt=e=>{let t=e.onReadEntry;e.onReadEntry=t?r=>{t(r),r.resume()}:r=>r.resume()},Fhe=(e,t)=>{let r=new Map(t.map(n=>[Rv(n),!0])),s=e.filter,a=(n,c="")=>{let f=c||(0,IR.parse)(n).root||".",p;if(n===f)p=!1;else{let h=r.get(n);h!==void 0?p=h:p=a((0,IR.dirname)(n),f)}return r.set(n,p),p};e.filter=s?(n,c)=>s(n,c)&&a(Rv(n)):n=>a(Rv(n))},Dnt=e=>{let t=new bm(e),r=e.file,s;try{s=wm.default.openSync(r,"r");let a=wm.default.fstatSync(s),n=e.maxReadSize||16*1024*1024;if(a.size{let r=new bm(e),s=e.maxReadSize||16*1024*1024,a=e.file;return new Promise((n,c)=>{r.on("error",c),r.on("end",n),wm.default.stat(a,(f,p)=>{if(f)c(f);else{let h=new j6(a,{readSize:s,size:p.size});h.on("error",c),h.pipe(r)}})})},BR=Hv(Dnt,Pnt,e=>new bm(e),e=>new bm(e),(e,t)=>{t?.length&&Fhe(e,t),e.noResume||bnt(e)}),Nhe=(e,t,r)=>(e&=4095,r&&(e=(e|384)&-19),t&&(e&256&&(e|=64),e&32&&(e|=8),e&4&&(e|=1)),e),{isAbsolute:xnt,parse:the}=Ohe.win32,V6=e=>{let t="",r=the(e);for(;xnt(e)||r.root;){let s=e.charAt(0)==="/"&&e.slice(0,4)!=="//?/"?"/":r.root;e=e.slice(s.length),t+=s,r=the(e)}return[t,e]},vR=["|","<",">","?",":"],K6=vR.map(e=>String.fromCharCode(61440+e.charCodeAt(0))),knt=new Map(vR.map((e,t)=>[e,K6[t]])),Qnt=new Map(K6.map((e,t)=>[e,vR[t]])),rhe=e=>vR.reduce((t,r)=>t.split(r).join(knt.get(r)),e),Tnt=e=>K6.reduce((t,r)=>t.split(r).join(Qnt.get(r)),e),Lhe=(e,t)=>t?(e=cn(e).replace(/^\.(\/|$)/,""),Rv(t)+"/"+e):cn(e),Rnt=16*1024*1024,nhe=Symbol("process"),ihe=Symbol("file"),she=Symbol("directory"),v6=Symbol("symlink"),ohe=Symbol("hardlink"),bv=Symbol("header"),oR=Symbol("read"),S6=Symbol("lstat"),aR=Symbol("onlstat"),b6=Symbol("onread"),D6=Symbol("onreadlink"),P6=Symbol("openfile"),x6=Symbol("onopenfile"),Md=Symbol("close"),gR=Symbol("mode"),k6=Symbol("awaitDrain"),u6=Symbol("ondrain"),cA=Symbol("prefix"),Mhe=class extends Dm{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#e=!1;constructor(e,t={}){let r=q6(t);super(),this.path=cn(e),this.portable=!!r.portable,this.maxReadSize=r.maxReadSize||Rnt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=cn(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime,this.prefix=r.prefix?cn(r.prefix):void 0,this.onWriteEntry=r.onWriteEntry,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let s=!1;if(!this.preservePaths){let[n,c]=V6(this.path);n&&typeof c=="string"&&(this.path=c,s=n)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=Tnt(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=cn(r.absolute||B6.default.resolve(this.cwd,e)),this.path===""&&(this.path="./"),s&&this.warn("TAR_ENTRY_INFO",`stripping ${s} from absolute path`,{entry:this,path:s+this.path});let a=this.statCache.get(this.absolute);a?this[aR](a):this[S6]()}warn(e,t,r={}){return wR(this,e,t,r)}emit(e,...t){return e==="error"&&(this.#e=!0),super.emit(e,...t)}[S6](){Ku.default.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[aR](t)})}[aR](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=Ont(e),this.emit("stat",e),this[nhe]()}[nhe](){switch(this.type){case"File":return this[ihe]();case"Directory":return this[she]();case"SymbolicLink":return this[v6]();default:return this.end()}}[gR](e){return Nhe(e,this.type==="Directory",this.portable)}[cA](e){return Lhe(e,this.prefix)}[bv](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new Sm({path:this[cA](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[cA](this.linkpath):this.linkpath,mode:this[gR](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new dR({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[cA](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[cA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let e=this.header?.block;if(!e)throw new Error("failed to encode header");super.write(e)}[she](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[bv](),this.end()}[v6](){Ku.default.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[D6](t)})}[D6](e){this.linkpath=cn(e),this[bv](),this.end()}[ohe](e){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=cn(B6.default.relative(this.cwd,e)),this.stat.size=0,this[bv](),this.end()}[ihe](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let e=`${this.stat.dev}:${this.stat.ino}`,t=this.linkCache.get(e);if(t?.indexOf(this.cwd)===0)return this[ohe](t);this.linkCache.set(e,this.absolute)}if(this[bv](),this.stat.size===0)return this.end();this[P6]()}[P6](){Ku.default.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[x6](t)})}[x6](e){if(this.fd=e,this.#e)return this[Md]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[oR]()}[oR](){let{fd:e,buf:t,offset:r,length:s,pos:a}=this;if(e===void 0||t===void 0)throw new Error("cannot read file without first opening");Ku.default.read(e,t,r,s,a,(n,c)=>{if(n)return this[Md](()=>this.emit("error",n));this[b6](c)})}[Md](e=()=>{}){this.fd!==void 0&&Ku.default.close(this.fd,e)}[b6](e){if(e<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[Md](()=>this.emit("error",r))}if(e>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[Md](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(e===this.remain)for(let r=e;rthis[u6]())}[k6](e){this.once("drain",e)}write(e,t,r){if(typeof t=="function"&&(r=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this.blockRemaine?this.emit("error",e):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[oR]()}},Fnt=class extends Mhe{sync=!0;[S6](){this[aR](Ku.default.lstatSync(this.absolute))}[v6](){this[D6](Ku.default.readlinkSync(this.absolute))}[P6](){this[x6](Ku.default.openSync(this.absolute,"r"))}[oR](){let e=!0;try{let{fd:t,buf:r,offset:s,length:a,pos:n}=this;if(t===void 0||r===void 0)throw new Error("fd and buf must be set in READ method");let c=Ku.default.readSync(t,r,s,a,n);this[b6](c),e=!1}finally{if(e)try{this[Md](()=>{})}catch{}}}[k6](e){e()}[Md](e=()=>{}){this.fd!==void 0&&Ku.default.closeSync(this.fd),e()}},Nnt=class extends Dm{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(e,t,r={}){return wR(this,e,t,r)}constructor(e,t={}){let r=q6(t);super(),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.onWriteEntry=r.onWriteEntry,this.readEntry=e;let{type:s}=e;if(s==="Unsupported")throw new Error("writing entry that should be ignored");this.type=s,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix,this.path=cn(e.path),this.mode=e.mode!==void 0?this[gR](e.mode):void 0,this.uid=this.portable?void 0:e.uid,this.gid=this.portable?void 0:e.gid,this.uname=this.portable?void 0:e.uname,this.gname=this.portable?void 0:e.gname,this.size=e.size,this.mtime=this.noMtime?void 0:r.mtime||e.mtime,this.atime=this.portable?void 0:e.atime,this.ctime=this.portable?void 0:e.ctime,this.linkpath=e.linkpath!==void 0?cn(e.linkpath):void 0,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let a=!1;if(!this.preservePaths){let[c,f]=V6(this.path);c&&typeof f=="string"&&(this.path=f,a=c)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.onWriteEntry?.(this),this.header=new Sm({path:this[cA](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[cA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),a&&this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:this,path:a+this.path}),this.header.encode()&&!this.noPax&&super.write(new dR({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[cA](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[cA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let n=this.header?.block;if(!n)throw new Error("failed to encode header");super.write(n),e.pipe(this)}[cA](e){return Lhe(e,this.prefix)}[gR](e){return Nhe(e,this.type==="Directory",this.portable)}write(e,t,r){typeof t=="function"&&(r=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8"));let s=e.length;if(s>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=s,super.write(e,r)}end(e,t,r){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof e=="function"&&(r=e,t=void 0,e=void 0),typeof t=="function"&&(r=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t??"utf8")),r&&this.once("finish",r),e?super.end(e,r):super.end(r),this}},Ont=e=>e.isFile()?"File":e.isDirectory()?"Directory":e.isSymbolicLink()?"SymbolicLink":"Unsupported",Lnt=class MI{tail;head;length=0;static create(t=[]){return new MI(t)}constructor(t=[]){for(let r of t)this.push(r)}*[Symbol.iterator](){for(let t=this.head;t;t=t.next)yield t.value}removeNode(t){if(t.list!==this)throw new Error("removing node which does not belong to this list");let r=t.next,s=t.prev;return r&&(r.prev=s),s&&(s.next=r),t===this.head&&(this.head=r),t===this.tail&&(this.tail=s),this.length--,t.next=void 0,t.prev=void 0,t.list=void 0,r}unshiftNode(t){if(t===this.head)return;t.list&&t.list.removeNode(t);let r=this.head;t.list=this,t.next=r,r&&(r.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}pushNode(t){if(t===this.tail)return;t.list&&t.list.removeNode(t);let r=this.tail;t.list=this,t.prev=r,r&&(r.next=t),this.tail=t,this.head||(this.head=t),this.length++}push(...t){for(let r=0,s=t.length;r1)s=r;else if(this.head)a=this.head.next,s=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;a;n++)s=t(s,a.value,n),a=a.next;return s}reduceReverse(t,r){let s,a=this.tail;if(arguments.length>1)s=r;else if(this.tail)a=this.tail.prev,s=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;a;n--)s=t(s,a.value,n),a=a.prev;return s}toArray(){let t=new Array(this.length);for(let r=0,s=this.head;s;r++)t[r]=s.value,s=s.next;return t}toArrayReverse(){let t=new Array(this.length);for(let r=0,s=this.tail;s;r++)t[r]=s.value,s=s.prev;return t}slice(t=0,r=this.length){r<0&&(r+=this.length),t<0&&(t+=this.length);let s=new MI;if(rthis.length&&(r=this.length);let a=this.head,n=0;for(n=0;a&&nthis.length&&(r=this.length);let a=this.length,n=this.tail;for(;n&&a>r;a--)n=n.prev;for(;n&&a>t;a--,n=n.prev)s.push(n.value);return s}splice(t,r=0,...s){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);let a=this.head;for(let c=0;a&&c1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(e.gzip&&(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new zrt(e.gzip)),e.brotli&&(typeof e.brotli!="object"&&(e.brotli={}),this.zip=new Xrt(e.brotli)),e.zstd&&(typeof e.zstd!="object"&&(e.zstd={}),this.zip=new ent(e.zstd)),!this.zip)throw new Error("impossible");let t=this.zip;t.on("data",r=>super.write(r)),t.on("end",()=>super.end()),t.on("drain",()=>this[h6]()),this.on("resume",()=>t.resume())}else this.on("drain",this[h6]);this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,e.mtime&&(this.mtime=e.mtime),this.filter=typeof e.filter=="function"?e.filter:()=>!0,this[Wu]=new Lnt,this[Vu]=0,this.jobs=Number(e.jobs)||4,this[Pv]=!1,this[Dv]=!1}[Uhe](e){return super.write(e)}add(e){return this.write(e),this}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t=void 0),e&&this.add(e),this[Dv]=!0,this[Im](),r&&r(),this}write(e){if(this[Dv])throw new Error("write after end");return e instanceof Rhe?this[che](e):this[cR](e),this.flowing}[che](e){let t=cn(Q6.default.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let r=new ahe(e.path,t);r.entry=new Nnt(e,this[p6](r)),r.entry.on("end",()=>this[A6](r)),this[Vu]+=1,this[Wu].push(r)}this[Im]()}[cR](e){let t=cn(Q6.default.resolve(this.cwd,e));this[Wu].push(new ahe(e,t)),this[Im]()}[T6](e){e.pending=!0,this[Vu]+=1;let t=this.follow?"stat":"lstat";Uv.default[t](e.absolute,(r,s)=>{e.pending=!1,this[Vu]-=1,r?this.emit("error",r):this[lR](e,s)})}[lR](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)?t.isFile()&&t.nlink>1&&e===this[Em]&&!this.linkCache.get(`${t.dev}:${t.ino}`)&&!this.sync&&this[f6](e):e.ignore=!0,this[Im]()}[R6](e){e.pending=!0,this[Vu]+=1,Uv.default.readdir(e.absolute,(t,r)=>{if(e.pending=!1,this[Vu]-=1,t)return this.emit("error",t);this[uR](e,r)})}[uR](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[Im]()}[Im](){if(!this[Pv]){this[Pv]=!0;for(let e=this[Wu].head;e&&this[Vu]this.warn(t,r,s),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,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[uhe](e){this[Vu]+=1;try{return new this[AR](e.path,this[p6](e)).on("end",()=>this[A6](e)).on("error",t=>this.emit("error",t))}catch(t){this.emit("error",t)}}[h6](){this[Em]&&this[Em].entry&&this[Em].entry.resume()}[fR](e){e.piped=!0,e.readdir&&e.readdir.forEach(s=>{let a=e.path,n=a==="./"?"":a.replace(/\/*$/,"/");this[cR](n+s)});let t=e.entry,r=this.zip;if(!t)throw new Error("cannot pipe without source");r?t.on("data",s=>{r.write(s)||t.pause()}):t.on("data",s=>{super.write(s)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(e,t,r={}){wR(this,e,t,r)}},z6=class extends SR{sync=!0;constructor(e){super(e),this[AR]=Fnt}pause(){}resume(){}[T6](e){let t=this.follow?"statSync":"lstatSync";this[lR](e,Uv.default[t](e.absolute))}[R6](e){this[uR](e,Uv.default.readdirSync(e.absolute))}[fR](e){let t=e.entry,r=this.zip;if(e.readdir&&e.readdir.forEach(s=>{let a=e.path,n=a==="./"?"":a.replace(/\/*$/,"/");this[cR](n+s)}),!t)throw new Error("Cannot pipe without source");r?t.on("data",s=>{r.write(s)}):t.on("data",s=>{super[Uhe](s)})}},Hnt=(e,t)=>{let r=new z6(e),s=new Bhe(e.file,{mode:e.mode||438});r.pipe(s),_he(r,t)},jnt=(e,t)=>{let r=new SR(e),s=new ER(e.file,{mode:e.mode||438});r.pipe(s);let a=new Promise((n,c)=>{s.on("error",c),s.on("close",n),r.on("error",c)});return Hhe(r,t),a},_he=(e,t)=>{t.forEach(r=>{r.charAt(0)==="@"?BR({file:G6.default.resolve(e.cwd,r.slice(1)),sync:!0,noResume:!0,onReadEntry:s=>e.add(s)}):e.add(r)}),e.end()},Hhe=async(e,t)=>{for(let r=0;r{e.add(a)}}):e.add(s)}e.end()},Gnt=(e,t)=>{let r=new z6(e);return _he(r,t),r},qnt=(e,t)=>{let r=new SR(e);return Hhe(r,t),r},YUt=Hv(Hnt,jnt,Gnt,qnt,(e,t)=>{if(!t?.length)throw new TypeError("no paths specified to add to archive")}),Ynt=process.platform,Wnt=Ynt==="win32",{O_CREAT:Vnt,O_TRUNC:Knt,O_WRONLY:Jnt}=$6.default.constants,Ghe=Number(process.env.__FAKE_FS_O_FILENAME__)||$6.default.constants.UV_FS_O_FILEMAP||0,znt=Wnt&&!!Ghe,Znt=512*1024,Xnt=Ghe|Knt|Vnt|Jnt,qhe=znt?e=>e"w",F6=(e,t,r)=>{try{return jv.default.lchownSync(e,t,r)}catch(s){if(s?.code!=="ENOENT")throw s}},mR=(e,t,r,s)=>{jv.default.lchown(e,t,r,a=>{s(a&&a?.code!=="ENOENT"?a:null)})},$nt=(e,t,r,s,a)=>{if(t.isDirectory())Yhe(_I.default.resolve(e,t.name),r,s,n=>{if(n)return a(n);let c=_I.default.resolve(e,t.name);mR(c,r,s,a)});else{let n=_I.default.resolve(e,t.name);mR(n,r,s,a)}},Yhe=(e,t,r,s)=>{jv.default.readdir(e,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return s();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return s(a)}if(a||!n.length)return mR(e,t,r,s);let c=n.length,f=null,p=h=>{if(!f){if(h)return s(f=h);if(--c===0)return mR(e,t,r,s)}};for(let h of n)$nt(e,h,t,r,p)})},eit=(e,t,r,s)=>{t.isDirectory()&&Whe(_I.default.resolve(e,t.name),r,s),F6(_I.default.resolve(e,t.name),r,s)},Whe=(e,t,r)=>{let s;try{s=jv.default.readdirSync(e,{withFileTypes:!0})}catch(a){let n=a;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return F6(e,t,r);throw n}for(let a of s)eit(e,a,t,r);return F6(e,t,r)},Khe=class extends Error{path;code;syscall="chdir";constructor(e,t){super(`${t}: Cannot cd into '${e}'`),this.path=e,this.code=t}get name(){return"CwdError"}},bR=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(e,t){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=e,this.path=t}get name(){return"SymlinkError"}},tit=(e,t)=>{Il.default.stat(e,(r,s)=>{(r||!s.isDirectory())&&(r=new Khe(e,r?.code||"ENOTDIR")),t(r)})},rit=(e,t,r)=>{e=cn(e);let s=t.umask??18,a=t.mode|448,n=(a&s)!==0,c=t.uid,f=t.gid,p=typeof c=="number"&&typeof f=="number"&&(c!==t.processUid||f!==t.processGid),h=t.preserve,E=t.unlink,C=cn(t.cwd),S=(I,R)=>{I?r(I):R&&p?Yhe(R,c,f,N=>S(N)):n?Il.default.chmod(e,a,r):r()};if(e===C)return tit(e,S);if(h)return Vhe.default.mkdir(e,{mode:a,recursive:!0}).then(I=>S(null,I??void 0),S);let x=cn(_v.default.relative(C,e)).split("/");N6(C,x,a,E,C,void 0,S)},N6=(e,t,r,s,a,n,c)=>{if(!t.length)return c(null,n);let f=t.shift(),p=cn(_v.default.resolve(e+"/"+f));Il.default.mkdir(p,r,Jhe(p,t,r,s,a,n,c))},Jhe=(e,t,r,s,a,n,c)=>f=>{f?Il.default.lstat(e,(p,h)=>{if(p)p.path=p.path&&cn(p.path),c(p);else if(h.isDirectory())N6(e,t,r,s,a,n,c);else if(s)Il.default.unlink(e,E=>{if(E)return c(E);Il.default.mkdir(e,r,Jhe(e,t,r,s,a,n,c))});else{if(h.isSymbolicLink())return c(new bR(e,e+"/"+t.join("/")));c(f)}}):(n=n||e,N6(e,t,r,s,a,n,c))},nit=e=>{let t=!1,r;try{t=Il.default.statSync(e).isDirectory()}catch(s){r=s?.code}finally{if(!t)throw new Khe(e,r??"ENOTDIR")}},iit=(e,t)=>{e=cn(e);let r=t.umask??18,s=t.mode|448,a=(s&r)!==0,n=t.uid,c=t.gid,f=typeof n=="number"&&typeof c=="number"&&(n!==t.processUid||c!==t.processGid),p=t.preserve,h=t.unlink,E=cn(t.cwd),C=I=>{I&&f&&Whe(I,n,c),a&&Il.default.chmodSync(e,s)};if(e===E)return nit(E),C();if(p)return C(Il.default.mkdirSync(e,{mode:s,recursive:!0})??void 0);let S=cn(_v.default.relative(E,e)).split("/"),x;for(let I=S.shift(),R=E;I&&(R+="/"+I);I=S.shift()){R=cn(_v.default.resolve(R));try{Il.default.mkdirSync(R,s),x=x||R}catch{let N=Il.default.lstatSync(R);if(N.isDirectory())continue;if(h){Il.default.unlinkSync(R),Il.default.mkdirSync(R,s),x=x||R;continue}else if(N.isSymbolicLink())return new bR(R,R+"/"+S.join("/"))}}return C(x)},d6=Object.create(null),fhe=1e4,RI=new Set,sit=e=>{RI.has(e)?RI.delete(e):d6[e]=e.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),RI.add(e);let t=d6[e],r=RI.size-fhe;if(r>fhe/10){for(let s of RI)if(RI.delete(s),delete d6[s],--r<=0)break}return t},oit=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,ait=oit==="win32",lit=e=>e.split("/").slice(0,-1).reduce((t,r)=>{let s=t[t.length-1];return s!==void 0&&(r=(0,eG.join)(s,r)),t.push(r||"/"),t},[]),cit=class{#e=new Map;#t=new Map;#s=new Set;reserve(e,t){e=ait?["win32 parallelization disabled"]:e.map(s=>Rv((0,eG.join)(sit(s))));let r=new Set(e.map(s=>lit(s)).reduce((s,a)=>s.concat(a)));this.#t.set(t,{dirs:r,paths:e});for(let s of e){let a=this.#e.get(s);a?a.push(t):this.#e.set(s,[t])}for(let s of r){let a=this.#e.get(s);if(!a)this.#e.set(s,[new Set([t])]);else{let n=a[a.length-1];n instanceof Set?n.add(t):a.push(new Set([t]))}}return this.#i(t)}#r(e){let t=this.#t.get(e);if(!t)throw new Error("function does not have any path reservations");return{paths:t.paths.map(r=>this.#e.get(r)),dirs:[...t.dirs].map(r=>this.#e.get(r))}}check(e){let{paths:t,dirs:r}=this.#r(e);return t.every(s=>s&&s[0]===e)&&r.every(s=>s&&s[0]instanceof Set&&s[0].has(e))}#i(e){return this.#s.has(e)||!this.check(e)?!1:(this.#s.add(e),e(()=>this.#n(e)),!0)}#n(e){if(!this.#s.has(e))return!1;let t=this.#t.get(e);if(!t)throw new Error("invalid reservation");let{paths:r,dirs:s}=t,a=new Set;for(let n of r){let c=this.#e.get(n);if(!c||c?.[0]!==e)continue;let f=c[1];if(!f){this.#e.delete(n);continue}if(c.shift(),typeof f=="function")a.add(f);else for(let p of f)a.add(p)}for(let n of s){let c=this.#e.get(n),f=c?.[0];if(!(!c||!(f instanceof Set)))if(f.size===1&&c.length===1){this.#e.delete(n);continue}else if(f.size===1){c.shift();let p=c[0];typeof p=="function"&&a.add(p)}else f.delete(e)}return this.#s.delete(e),a.forEach(n=>this.#i(n)),!0}},uit=()=>process.umask(),Ahe=Symbol("onEntry"),O6=Symbol("checkFs"),phe=Symbol("checkFs2"),L6=Symbol("isReusable"),Hc=Symbol("makeFs"),M6=Symbol("file"),U6=Symbol("directory"),pR=Symbol("link"),hhe=Symbol("symlink"),dhe=Symbol("hardlink"),Qv=Symbol("ensureNoSymlink"),ghe=Symbol("unsupported"),mhe=Symbol("checkPath"),g6=Symbol("stripAbsolutePath"),_d=Symbol("mkdir"),$s=Symbol("onError"),rR=Symbol("pending"),yhe=Symbol("pend"),FI=Symbol("unpend"),m6=Symbol("ended"),y6=Symbol("maybeClose"),_6=Symbol("skip"),Fv=Symbol("doChown"),Nv=Symbol("uid"),Ov=Symbol("gid"),Lv=Symbol("checkedCwd"),fit=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Mv=fit==="win32",Ait=1024,pit=(e,t)=>{if(!Mv)return Bn.default.unlink(e,t);let r=e+".DELETE."+(0,X6.randomBytes)(16).toString("hex");Bn.default.rename(e,r,s=>{if(s)return t(s);Bn.default.unlink(r,t)})},hit=e=>{if(!Mv)return Bn.default.unlinkSync(e);let t=e+".DELETE."+(0,X6.randomBytes)(16).toString("hex");Bn.default.renameSync(e,t),Bn.default.unlinkSync(t)},Ehe=(e,t,r)=>e!==void 0&&e===e>>>0?e:t!==void 0&&t===t>>>0?t:r,tG=class extends bm{[m6]=!1;[Lv]=!1;[rR]=0;reservations=new cit;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(e={}){if(e.ondone=()=>{this[m6]=!0,this[y6]()},super(e),this.transform=e.transform,this.chmod=!!e.chmod,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=void 0,this.gid=void 0,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():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof e.maxDepth=="number"?e.maxDepth:Ait,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Mv,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=cn(gs.default.resolve(e.cwd||process.cwd())),this.strip=Number(e.strip)||0,this.processUmask=this.chmod?typeof e.processUmask=="number"?e.processUmask:uit():0,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",t=>this[Ahe](t))}warn(e,t,r={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(r.recoverable=!1),super.warn(e,t,r)}[y6](){this[m6]&&this[rR]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[g6](e,t){let r=e[t],{type:s}=e;if(!r||this.preservePaths)return!0;let a=r.split("/");if(a.includes("..")||Mv&&/^[a-z]:\.\.$/i.test(a[0]??"")){if(t==="path"||s==="Link")return this.warn("TAR_ENTRY_ERROR",`${t} contains '..'`,{entry:e,[t]:r}),!1;{let f=gs.default.posix.dirname(e.path),p=gs.default.posix.normalize(gs.default.posix.join(f,r));if(p.startsWith("../")||p==="..")return this.warn("TAR_ENTRY_ERROR",`${t} escapes extraction directory`,{entry:e,[t]:r}),!1}}let[n,c]=V6(r);return n&&(e[t]=String(c),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${t}`,{entry:e,[t]:r})),!0}[mhe](e){let t=cn(e.path),r=t.split("/");if(this.strip){if(r.length=this.strip)e.linkpath=s.slice(this.strip).join("/");else return!1}r.splice(0,this.strip),e.path=r.join("/")}if(isFinite(this.maxDepth)&&r.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:e,path:t,depth:r.length,maxDepth:this.maxDepth}),!1;if(!this[g6](e,"path")||!this[g6](e,"linkpath"))return!1;if(gs.default.isAbsolute(e.path)?e.absolute=cn(gs.default.resolve(e.path)):e.absolute=cn(gs.default.resolve(this.cwd,e.path)),!this.preservePaths&&typeof e.absolute=="string"&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:cn(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:s}=gs.default.win32.parse(String(e.absolute));e.absolute=s+rhe(String(e.absolute).slice(s.length));let{root:a}=gs.default.win32.parse(e.path);e.path=a+rhe(e.path.slice(a.length))}return!0}[Ahe](e){if(!this[mhe](e))return e.resume();switch(jhe.default.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[O6](e);default:return this[ghe](e)}}[$s](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[FI](),t.resume())}[_d](e,t,r){rit(cn(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t},r)}[Fv](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}[Nv](e){return Ehe(this.uid,e.uid,this.processUid)}[Ov](e){return Ehe(this.gid,e.gid,this.processGid)}[M6](e,t){let r=typeof e.mode=="number"?e.mode&4095:this.fmode,s=new ER(String(e.absolute),{flags:qhe(e.size),mode:r,autoClose:!1});s.on("error",f=>{s.fd&&Bn.default.close(s.fd,()=>{}),s.write=()=>!0,this[$s](f,e),t()});let a=1,n=f=>{if(f){s.fd&&Bn.default.close(s.fd,()=>{}),this[$s](f,e),t();return}--a===0&&s.fd!==void 0&&Bn.default.close(s.fd,p=>{p?this[$s](p,e):this[FI](),t()})};s.on("finish",()=>{let f=String(e.absolute),p=s.fd;if(typeof p=="number"&&e.mtime&&!this.noMtime){a++;let h=e.atime||new Date,E=e.mtime;Bn.default.futimes(p,h,E,C=>C?Bn.default.utimes(f,h,E,S=>n(S&&C)):n())}if(typeof p=="number"&&this[Fv](e)){a++;let h=this[Nv](e),E=this[Ov](e);typeof h=="number"&&typeof E=="number"&&Bn.default.fchown(p,h,E,C=>C?Bn.default.chown(f,h,E,S=>n(S&&C)):n())}n()});let c=this.transform&&this.transform(e)||e;c!==e&&(c.on("error",f=>{this[$s](f,e),t()}),e.pipe(c)),c.pipe(s)}[U6](e,t){let r=typeof e.mode=="number"?e.mode&4095:this.dmode;this[_d](String(e.absolute),r,s=>{if(s){this[$s](s,e),t();return}let a=1,n=()=>{--a===0&&(t(),this[FI](),e.resume())};e.mtime&&!this.noMtime&&(a++,Bn.default.utimes(String(e.absolute),e.atime||new Date,e.mtime,n)),this[Fv](e)&&(a++,Bn.default.chown(String(e.absolute),Number(this[Nv](e)),Number(this[Ov](e)),n)),n()})}[ghe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[hhe](e,t){let r=cn(gs.default.relative(this.cwd,gs.default.resolve(gs.default.dirname(String(e.absolute)),String(e.linkpath)))).split("/");this[Qv](e,this.cwd,r,()=>this[pR](e,String(e.linkpath),"symlink",t),s=>{this[$s](s,e),t()})}[dhe](e,t){let r=cn(gs.default.resolve(this.cwd,String(e.linkpath))),s=cn(String(e.linkpath)).split("/");this[Qv](e,this.cwd,s,()=>this[pR](e,r,"link",t),a=>{this[$s](a,e),t()})}[Qv](e,t,r,s,a){let n=r.shift();if(this.preservePaths||n===void 0)return s();let c=gs.default.resolve(t,n);Bn.default.lstat(c,(f,p)=>{if(f)return s();if(p?.isSymbolicLink())return a(new bR(c,gs.default.resolve(c,r.join("/"))));this[Qv](e,c,r,s,a)})}[yhe](){this[rR]++}[FI](){this[rR]--,this[y6]()}[_6](e){this[FI](),e.resume()}[L6](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!Mv}[O6](e){this[yhe]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,r=>this[phe](e,r))}[phe](e,t){let r=c=>{t(c)},s=()=>{this[_d](this.cwd,this.dmode,c=>{if(c){this[$s](c,e),r();return}this[Lv]=!0,a()})},a=()=>{if(e.absolute!==this.cwd){let c=cn(gs.default.dirname(String(e.absolute)));if(c!==this.cwd)return this[_d](c,this.dmode,f=>{if(f){this[$s](f,e),r();return}n()})}n()},n=()=>{Bn.default.lstat(String(e.absolute),(c,f)=>{if(f&&(this.keep||this.newer&&f.mtime>(e.mtime??f.mtime))){this[_6](e),r();return}if(c||this[L6](e,f))return this[Hc](null,e,r);if(f.isDirectory()){if(e.type==="Directory"){let p=this.chmod&&e.mode&&(f.mode&4095)!==e.mode,h=E=>this[Hc](E??null,e,r);return p?Bn.default.chmod(String(e.absolute),Number(e.mode),h):h()}if(e.absolute!==this.cwd)return Bn.default.rmdir(String(e.absolute),p=>this[Hc](p??null,e,r))}if(e.absolute===this.cwd)return this[Hc](null,e,r);pit(String(e.absolute),p=>this[Hc](p??null,e,r))})};this[Lv]?a():s()}[Hc](e,t,r){if(e){this[$s](e,t),r();return}switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[M6](t,r);case"Link":return this[dhe](t,r);case"SymbolicLink":return this[hhe](t,r);case"Directory":case"GNUDumpDir":return this[U6](t,r)}}[pR](e,t,r,s){Bn.default[r](t,String(e.absolute),a=>{a?this[$s](a,e):(this[FI](),e.resume()),s()})}},xv=e=>{try{return[null,e()]}catch(t){return[t,null]}},zhe=class extends tG{sync=!0;[Hc](e,t){return super[Hc](e,t,()=>{})}[O6](e){if(!this[Lv]){let a=this[_d](this.cwd,this.dmode);if(a)return this[$s](a,e);this[Lv]=!0}if(e.absolute!==this.cwd){let a=cn(gs.default.dirname(String(e.absolute)));if(a!==this.cwd){let n=this[_d](a,this.dmode);if(n)return this[$s](n,e)}}let[t,r]=xv(()=>Bn.default.lstatSync(String(e.absolute)));if(r&&(this.keep||this.newer&&r.mtime>(e.mtime??r.mtime)))return this[_6](e);if(t||this[L6](e,r))return this[Hc](null,e);if(r.isDirectory()){if(e.type==="Directory"){let n=this.chmod&&e.mode&&(r.mode&4095)!==e.mode,[c]=n?xv(()=>{Bn.default.chmodSync(String(e.absolute),Number(e.mode))}):[];return this[Hc](c,e)}let[a]=xv(()=>Bn.default.rmdirSync(String(e.absolute)));this[Hc](a,e)}let[s]=e.absolute===this.cwd?[]:xv(()=>hit(String(e.absolute)));this[Hc](s,e)}[M6](e,t){let r=typeof e.mode=="number"?e.mode&4095:this.fmode,s=c=>{let f;try{Bn.default.closeSync(a)}catch(p){f=p}(c||f)&&this[$s](c||f,e),t()},a;try{a=Bn.default.openSync(String(e.absolute),qhe(e.size),r)}catch(c){return s(c)}let n=this.transform&&this.transform(e)||e;n!==e&&(n.on("error",c=>this[$s](c,e)),e.pipe(n)),n.on("data",c=>{try{Bn.default.writeSync(a,c,0,c.length)}catch(f){s(f)}}),n.on("end",()=>{let c=null;if(e.mtime&&!this.noMtime){let f=e.atime||new Date,p=e.mtime;try{Bn.default.futimesSync(a,f,p)}catch(h){try{Bn.default.utimesSync(String(e.absolute),f,p)}catch{c=h}}}if(this[Fv](e)){let f=this[Nv](e),p=this[Ov](e);try{Bn.default.fchownSync(a,Number(f),Number(p))}catch(h){try{Bn.default.chownSync(String(e.absolute),Number(f),Number(p))}catch{c=c||h}}}s(c)})}[U6](e,t){let r=typeof e.mode=="number"?e.mode&4095:this.dmode,s=this[_d](String(e.absolute),r);if(s){this[$s](s,e),t();return}if(e.mtime&&!this.noMtime)try{Bn.default.utimesSync(String(e.absolute),e.atime||new Date,e.mtime)}catch{}if(this[Fv](e))try{Bn.default.chownSync(String(e.absolute),Number(this[Nv](e)),Number(this[Ov](e)))}catch{}t(),e.resume()}[_d](e,t){try{return iit(cn(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t})}catch(r){return r}}[Qv](e,t,r,s,a){if(this.preservePaths||!r.length)return s();let n=t;for(let c of r){n=gs.default.resolve(n,c);let[f,p]=xv(()=>Bn.default.lstatSync(n));if(f)return s();if(p.isSymbolicLink())return a(new bR(n,gs.default.resolve(t,r.join("/"))))}s()}[pR](e,t,r,s){let a=`${r}Sync`;try{Bn.default[a](t,String(e.absolute)),s(),e.resume()}catch(n){return this[$s](n,e)}}},dit=e=>{let t=new zhe(e),r=e.file,s=Z6.default.statSync(r),a=e.maxReadSize||16*1024*1024;new Urt(r,{readSize:a,size:s.size}).pipe(t)},git=(e,t)=>{let r=new tG(e),s=e.maxReadSize||16*1024*1024,a=e.file;return new Promise((n,c)=>{r.on("error",c),r.on("close",n),Z6.default.stat(a,(f,p)=>{if(f)c(f);else{let h=new j6(a,{readSize:s,size:p.size});h.on("error",c),h.pipe(r)}})})},WUt=Hv(dit,git,e=>new zhe(e),e=>new tG(e),(e,t)=>{t?.length&&Fhe(e,t)}),mit=(e,t)=>{let r=new z6(e),s=!0,a,n;try{try{a=El.default.openSync(e.file,"r+")}catch(p){if(p?.code==="ENOENT")a=El.default.openSync(e.file,"w+");else throw p}let c=El.default.fstatSync(a),f=Buffer.alloc(512);e:for(n=0;nc.size)break;n+=h,e.mtimeCache&&p.mtime&&e.mtimeCache.set(String(p.path),p.mtime)}s=!1,yit(e,r,n,a,t)}finally{if(s)try{El.default.closeSync(a)}catch{}}},yit=(e,t,r,s,a)=>{let n=new Bhe(e.file,{fd:s,start:r});t.pipe(n),Iit(t,a)},Eit=(e,t)=>{t=Array.from(t);let r=new SR(e),s=(a,n,c)=>{let f=(S,x)=>{S?El.default.close(a,I=>c(S)):c(null,x)},p=0;if(n===0)return f(null,0);let h=0,E=Buffer.alloc(512),C=(S,x)=>{if(S||typeof x>"u")return f(S);if(h+=x,h<512&&x)return El.default.read(a,E,h,E.length-h,p+h,C);if(p===0&&E[0]===31&&E[1]===139)return f(new Error("cannot append to compressed archives"));if(h<512)return f(null,p);let I=new Sm(E);if(!I.cksumValid)return f(null,p);let R=512*Math.ceil((I.size??0)/512);if(p+R+512>n||(p+=R+512,p>=n))return f(null,p);e.mtimeCache&&I.mtime&&e.mtimeCache.set(String(I.path),I.mtime),h=0,El.default.read(a,E,0,512,p,C)};El.default.read(a,E,0,512,p,C)};return new Promise((a,n)=>{r.on("error",n);let c="r+",f=(p,h)=>{if(p&&p.code==="ENOENT"&&c==="r+")return c="w+",El.default.open(e.file,c,f);if(p||!h)return n(p);El.default.fstat(h,(E,C)=>{if(E)return El.default.close(h,()=>n(E));s(h,C.size,(S,x)=>{if(S)return n(S);let I=new ER(e.file,{fd:h,start:x});r.pipe(I),I.on("error",n),I.on("close",a),Cit(r,t)})})};El.default.open(e.file,c,f)})},Iit=(e,t)=>{t.forEach(r=>{r.charAt(0)==="@"?BR({file:rG.default.resolve(e.cwd,r.slice(1)),sync:!0,noResume:!0,onReadEntry:s=>e.add(s)}):e.add(r)}),e.end()},Cit=async(e,t)=>{for(let r=0;re.add(a)}):e.add(s)}e.end()},kv=Hv(mit,Eit,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(e,t)=>{if(!Yrt(e))throw new TypeError("file is required");if(e.gzip||e.brotli||e.zstd||e.file.endsWith(".br")||e.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!t?.length)throw new TypeError("no paths specified to add/replace")}),VUt=Hv(kv.syncFile,kv.asyncFile,kv.syncNoFile,kv.asyncNoFile,(e,t=[])=>{kv.validate?.(e,t),wit(e)}),wit=e=>{let t=e.filter;e.mtimeCache||(e.mtimeCache=new Map),e.filter=t?(r,s)=>t(r,s)&&!((e.mtimeCache?.get(r)??s.mtime??0)>(s.mtime??0)):(r,s)=>!((e.mtimeCache?.get(r)??s.mtime??0)>(s.mtime??0))}});var nG,Xhe,Gd,Gv,qv,$he=Ze(()=>{nG=et(M0()),Xhe=Ce("worker_threads"),Gd=Symbol("kTaskInfo"),Gv=class{constructor(t,r){this.fn=t;this.limit=(0,nG.default)(r.poolSize)}run(t){return this.limit(()=>this.fn(t))}},qv=class{constructor(t,r){this.source=t;this.workers=[];this.limit=(0,nG.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let s=this.workers.pop();s?s.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let t=new Xhe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return t.on("message",r=>{if(!t[Gd])throw new Error("Assertion failed: Worker sent a result without having a task assigned");t[Gd].resolve(r),t[Gd]=null,t.unref(),this.workers.push(t)}),t.on("error",r=>{t[Gd]?.reject(r),t[Gd]=null}),t.on("exit",r=>{r!==0&&t[Gd]?.reject(new Error(`Worker exited with code ${r}`)),t[Gd]=null}),t}run(t){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((s,a)=>{r[Gd]={resolve:s,reject:a},r.postMessage(t)})})}}});var tde=G((x_t,ede)=>{var iG;ede.exports.getContent=()=>(typeof iG>"u"&&(iG=Ce("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),iG)});var ms={};Vt(ms,{convertToZip:()=>Dit,convertToZipWorker:()=>aG,extractArchiveTo:()=>sde,getDefaultTaskPool:()=>nde,getTaskPoolForConfiguration:()=>ide,makeArchiveFromDirectory:()=>bit});function vit(e,t){switch(e){case"async":return new Gv(aG,{poolSize:t});case"workers":return new qv((0,oG.getContent)(),{poolSize:t});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}}function nde(){return typeof sG>"u"&&(sG=vit("workers",Ui.availableParallelism())),sG}function ide(e){return typeof e>"u"?nde():$l(Sit,e,()=>{let t=e.get("taskPoolMode"),r=e.get("taskPoolConcurrency");switch(t){case"async":return new Gv(aG,{poolSize:r});case"workers":return new qv((0,oG.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}})}async function aG(e){let{tmpFile:t,tgz:r,compressionLevel:s,extractBufferOpts:a}=e,n=new hs(t,{create:!0,level:s,stats:ll.makeDefaultStats()}),c=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await sde(c,n,a),n.saveAndClose(),t}async function bit(e,{baseFs:t=new Kn,prefixPath:r=wt.root,compressionLevel:s,inMemory:a=!1}={}){let n;if(a)n=new hs(null,{level:s});else{let f=await ae.mktempPromise(),p=Y.join(f,"archive.zip");n=new hs(p,{create:!0,level:s})}let c=Y.resolve(wt.root,r);return await n.copyPromise(c,e,{baseFs:t,stableTime:!0,stableSort:!0}),n}async function Dit(e,t={}){let r=await ae.mktempPromise(),s=Y.join(r,"archive.zip"),a=t.compressionLevel??t.configuration?.get("compressionLevel")??"mixed",n={prefixPath:t.prefixPath,stripComponents:t.stripComponents};return await(t.taskPool??ide(t.configuration)).run({tmpFile:s,tgz:e,compressionLevel:a,extractBufferOpts:n}),new hs(s,{level:t.compressionLevel})}async function*Pit(e){let t=new bm,r=new rde.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});t.on("entry",s=>{r.write(s)}),t.on("error",s=>{r.destroy(s)}),t.on("close",()=>{r.destroyed||r.end()}),t.end(e);for await(let s of r){let a=s;yield a,a.resume()}}async function sde(e,t,{stripComponents:r=0,prefixPath:s=wt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let c=n.path.split(/\//g);return!!(c.some(f=>f==="..")||c.length<=r)}for await(let n of Pit(e)){if(a(n))continue;let c=Y.normalize(Ae.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(c.length<=r)continue;let f=c.slice(r).join("/"),p=Y.join(s,f),h=420;switch((n.type==="Directory"||(n.mode??0)&73)&&(h|=73),n.type){case"Directory":t.mkdirpSync(Y.dirname(p),{chmod:493,utimes:[pi.SAFE_TIME,pi.SAFE_TIME]}),t.mkdirSync(p,{mode:h}),t.utimesSync(p,pi.SAFE_TIME,pi.SAFE_TIME);break;case"OldFile":case"File":t.mkdirpSync(Y.dirname(p),{chmod:493,utimes:[pi.SAFE_TIME,pi.SAFE_TIME]}),t.writeFileSync(p,await zE(n),{mode:h}),t.utimesSync(p,pi.SAFE_TIME,pi.SAFE_TIME);break;case"SymbolicLink":t.mkdirpSync(Y.dirname(p),{chmod:493,utimes:[pi.SAFE_TIME,pi.SAFE_TIME]}),t.symlinkSync(n.linkpath,p),t.lutimesSync(p,pi.SAFE_TIME,pi.SAFE_TIME);break}}return t}var rde,oG,sG,Sit,ode=Ze(()=>{Ge();bt();iA();rde=Ce("stream");Zhe();$he();Qc();oG=et(tde());Sit=new WeakMap});var lde=G((lG,ade)=>{(function(e,t){typeof lG=="object"?ade.exports=t():typeof define=="function"&&define.amd?define(t):e.treeify=t()})(lG,function(){function e(a,n){var c=n?"\u2514":"\u251C";return a?c+="\u2500 ":c+="\u2500\u2500\u2510",c}function t(a,n){var c=[];for(var f in a)a.hasOwnProperty(f)&&(n&&typeof a[f]=="function"||c.push(f));return c}function r(a,n,c,f,p,h,E){var C="",S=0,x,I,R=f.slice(0);if(R.push([n,c])&&f.length>0&&(f.forEach(function(U,K){K>0&&(C+=(U[1]?" ":"\u2502")+" "),!I&&U[0]===n&&(I=!0)}),C+=e(a,c)+a,p&&(typeof n!="object"||n instanceof Date)&&(C+=": "+n),I&&(C+=" (circular ref.)"),E(C)),!I&&typeof n=="object"){var N=t(n,h);N.forEach(function(U){x=++S===N.length,r(U,n[U],x,R,p,h,E)})}}var s={};return s.asLines=function(a,n,c,f){var p=typeof c!="function"?c:!1;r(".",a,!1,[],n,p,f||c)},s.asTree=function(a,n,c){var f="";return r(".",a,!1,[],n,c,function(p){f+=p+` +`}),f},s})});var ts={};Vt(ts,{emitList:()=>xit,emitTree:()=>Ade,treeNodeToJson:()=>fde,treeNodeToTreeify:()=>ude});function ude(e,{configuration:t}){let r={},s=0,a=(n,c)=>{let f=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of f){if(!h)continue;let{label:E,value:C,children:S}=h,x=[];typeof E<"u"&&x.push(Z0(t,E,2)),typeof C<"u"&&x.push(Gt(t,C[0],C[1])),x.length===0&&x.push(Z0(t,`${p}`,2));let I=x.join(": ").trim(),R=`\0${s++}\0`,N=c[`${R}${I}`]={};typeof S<"u"&&a(S,N)}};if(typeof e.children>"u")throw new Error("The root node must only contain children");return a(e.children,r),r}function fde(e){let t=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return X0(r.value[0],r.value[1])}let s=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,c]of s)c&&(a[kit(n)]=t(c));return typeof r.value>"u"?a:{value:X0(r.value[0],r.value[1]),children:a}};return t(e)}function xit(e,{configuration:t,stdout:r,json:s}){let a=e.map(n=>({value:n}));Ade({children:a},{configuration:t,stdout:r,json:s})}function Ade(e,{configuration:t,stdout:r,json:s,separators:a=0}){if(s){let c=Array.isArray(e.children)?e.children.values():Object.values(e.children??{});for(let f of c)f&&r.write(`${JSON.stringify(fde(f))} +`);return}let n=(0,cde.asTree)(ude(e,{configuration:t}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),a>=2)for(let c=0;c<2;++c)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function kit(e){return typeof e=="string"?e.replace(/^\0[0-9]+\0/,""):e}var cde,pde=Ze(()=>{cde=et(lde());Tc()});var DR,hde=Ze(()=>{DR=class{constructor(t){this.releaseFunction=t;this.map=new Map}addOrCreate(t,r){let s=this.map.get(t);if(typeof s<"u"){if(s.refCount<=0)throw new Error(`Race condition in RefCountedMap. While adding a new key the refCount is: ${s.refCount} for ${JSON.stringify(t)}`);return s.refCount++,{value:s.value,release:()=>this.release(t)}}else{let a=r();return this.map.set(t,{refCount:1,value:a}),{value:a,release:()=>this.release(t)}}}release(t){let r=this.map.get(t);if(!r)throw new Error(`Unbalanced calls to release. No known instances of: ${JSON.stringify(t)}`);let s=r.refCount;if(s<=0)throw new Error(`Unbalanced calls to release. Too many release vs alloc refcount would become: ${s-1} of ${JSON.stringify(t)}`);s==1?(this.map.delete(t),this.releaseFunction(r.value)):r.refCount--}}});function Yv(e){let t=e.match(Qit);if(!t?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=t.groups.cacheVersion?parseInt(t.groups.cacheVersion):null;return{cacheKey:t.groups.cacheKey??null,cacheVersion:r,cacheSpec:t.groups.cacheSpec??null,hash:t.groups.hash}}var dde,cG,uG,PR,zr,Qit,fG=Ze(()=>{Ge();bt();bt();iA();dde=Ce("crypto"),cG=et(Ce("fs"));hde();Nc();wd();Qc();$o();uG=ZE(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),PR=ZE(process.env.YARN_CACHE_VERSION_OVERRIDE??10),zr=class e{constructor(t,{configuration:r,immutable:s=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.refCountedZipFsCache=new DR(t=>{t.discardAndClose()});this.cacheId=`-${(0,dde.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=t,this.immutable=s,this.check=a;let{cacheSpec:n,cacheKey:c}=e.getCacheKey(r);this.cacheSpec=n,this.cacheKey=c}static async find(t,{immutable:r,check:s}={}){let a=new e(t.get("cacheFolder"),{configuration:t,immutable:r,check:s});return await a.setup(),a}static getCacheKey(t){let r=t.get("compressionLevel"),s=r!=="mixed"?`c${r}`:"";return{cacheKey:[PR,s].join(""),cacheSpec:s}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let t=`${this.configuration.get("globalFolder")}/cache`;return t!==this.cwd?t:null}getVersionFilename(t){return`${lI(t)}-${this.cacheKey}.zip`}getChecksumFilename(t,r){let a=Yv(r).hash.slice(0,10);return`${lI(t)}-${a}.zip`}isChecksumCompatible(t){if(t===null)return!1;let{cacheVersion:r,cacheSpec:s}=Yv(t);if(r===null||r{let pe=new hs,De=Y.join(wt.root,v8(t));return pe.mkdirSync(De,{recursive:!0}),pe.writeJsonSync(Y.join(De,yr.manifest),{name:fn(t),mocked:!0}),pe},E=async(pe,{isColdHit:De,controlPath:ye=null})=>{if(ye===null&&c.unstablePackages?.has(t.locatorHash))return{isValid:!0,hash:null};let d=r&&!De?Yv(r).cacheKey:this.cacheKey,ve=!c.skipIntegrityCheck||!r?`${d}/${await xQ(pe)}`:r;if(ye!==null){let me=!c.skipIntegrityCheck||!r?`${this.cacheKey}/${await xQ(ye)}`:r;if(ve!==me)throw new Lt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let Ie=null;switch(r!==null&&ve!==r&&(this.check?Ie="throw":Yv(r).cacheKey!==Yv(ve).cacheKey?Ie="update":Ie=this.configuration.get("checksumBehavior")),Ie){case null:case"update":return{isValid:!0,hash:ve};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new Lt(18,"The remote archive doesn't match the expected checksum")}},C=async pe=>{if(!n)throw new Error(`Cache check required but no loader configured for ${Vr(this.configuration,t)}`);let De=await n(),ye=De.getRealPath();De.saveAndClose(),await ae.chmodPromise(ye,420);let d=await E(pe,{controlPath:ye,isColdHit:!1});if(!d.isValid)throw new Error("Assertion failed: Expected a valid checksum");return d.hash},S=async()=>{if(f===null||!await ae.existsPromise(f)){let pe=await n(),De=pe.getRealPath();return pe.saveAndClose(),{source:"loader",path:De}}return{source:"mirror",path:f}},x=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${Vr(this.configuration,t)}`);if(this.immutable)throw new Lt(56,`Cache entry required but missing for ${Vr(this.configuration,t)}`);let{path:pe,source:De}=await S(),{hash:ye}=await E(pe,{isColdHit:!0}),d=this.getLocatorPath(t,ye),ve=[];De!=="mirror"&&f!==null&&ve.push(async()=>{let me=`${f}${this.cacheId}`;await ae.copyFilePromise(pe,me,cG.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(me,420),await ae.renamePromise(me,f)}),(!c.mirrorWriteOnly||f===null)&&ve.push(async()=>{let me=`${d}${this.cacheId}`;await ae.copyFilePromise(pe,me,cG.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(me,420),await ae.renamePromise(me,d)});let Ie=c.mirrorWriteOnly?f??d:d;return await Promise.all(ve.map(me=>me())),[!1,Ie,ye]},I=async()=>{let De=(async()=>{let ye=c.unstablePackages?.has(t.locatorHash),d=ye||!r||this.isChecksumCompatible(r)?this.getLocatorPath(t,r):null,ve=d!==null?this.markedFiles.has(d)||await p.existsPromise(d):!1,Ie=!!c.mockedPackages?.has(t.locatorHash)&&(!this.check||!ve),me=Ie||ve,ce=me?s:a;if(ce&&ce(),me){let X=null,be=d;if(!Ie)if(this.check)X=await C(be);else{let ke=await E(be,{isColdHit:!1});if(ke.isValid)X=ke.hash;else return x()}return[Ie,be,X]}else{if(this.immutable&&ye)throw new Lt(56,`Cache entry required but missing for ${Vr(this.configuration,t)}; consider defining ${ue.pretty(this.configuration,"supportedArchitectures",ue.Type.CODE)} to cache packages for multiple systems`);return x()}})();this.mutexes.set(t.locatorHash,De);try{return await De}finally{this.mutexes.delete(t.locatorHash)}};for(let pe;pe=this.mutexes.get(t.locatorHash);)await pe;let[R,N,U]=await I();R||this.markedFiles.add(N);let K=()=>this.refCountedZipFsCache.addOrCreate(N,()=>R?h():new hs(N,{baseFs:p,readOnly:!0})),$,ie=new AE(()=>M4(()=>($=K(),$.value),pe=>`Failed to open the cache entry for ${Vr(this.configuration,t)}: ${pe}`),Y),fe=new Gf(N,{baseFs:ie,pathUtils:Y}),le=()=>{$?.release()},ge=c.unstablePackages?.has(t.locatorHash)?null:U;return[fe,le,ge]}},Qit=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var xR,gde=Ze(()=>{xR=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(xR||{})});var Tit,jI,AG=Ze(()=>{bt();Sc();Lp();$o();Tit=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(e,t,r,s)=>`${r}#commit=${s}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(e,t,r="",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(e,t,r="",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,e=>`npm:${e}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,e=>`npm:${e}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,e=>`npm:${e}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(e,t)=>FQ({protocol:"npm:",source:null,selector:e,params:{__archiveUrl:t}})],[/^[^/]+\.tgz#[0-9a-f]+$/,e=>`npm:${e}`]],jI=class{constructor(t){this.resolver=t;this.resolutions=null}async setup(t,{report:r}){let s=Y.join(t.cwd,yr.lockfile);if(!ae.existsSync(s))return;let a=await ae.readFilePromise(s,"utf8"),n=us(a);if(Object.hasOwn(n,"__metadata"))return;let c=this.resolutions=new Map;for(let f of Object.keys(n)){let p=MB(f);if(!p){r.reportWarning(14,`Failed to parse the string "${f}" into a proper descriptor`);continue}let h=yl(p.range)?Un(p,`npm:${p.range}`):p,{version:E,resolved:C}=n[f];if(!C)continue;let S;for(let[I,R]of Tit){let N=C.match(I);if(N){S=R(E,...N);break}}if(!S){r.reportWarning(14,`${ai(t.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${C}")`);continue}let x=h;try{let I=tm(h.range),R=MB(I.selector,!0);R&&(x=R)}catch{}c.set(h.descriptorHash,Js(x,S))}}supportsDescriptor(t,r){return this.resolutions?this.resolutions.has(t.descriptorHash):!1}supportsLocator(t,r){return!1}shouldPersistResolution(t,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(t.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=I8(a),c=s.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(c,r,s)}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var fA,mde=Ze(()=>{Nc();gv();Tc();fA=class extends Io{constructor({configuration:r,stdout:s,suggestInstall:a=!0}){super();this.errorCount=0;kB(this,{configuration:r}),this.configuration=r,this.stdout=s,this.suggestInstall=a}static async start(r,s){let a=new this(r);try{await s(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,s){return s()}async startSectionPromise(r,s){return await s()}startTimerSync(r,s,a){return(typeof s=="function"?s:a)()}async startTimerPromise(r,s,a){return await(typeof s=="function"?s:a)()}reportSeparator(){}reportInfo(r,s){}reportWarning(r,s){}reportError(r,s){this.errorCount+=1,this.stdout.write(`${Gt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${s} +`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,s){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Gt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Gt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(r){return _j(r,{configuration:this.configuration,json:!1})}}});var GI,pG=Ze(()=>{$o();GI=class{constructor(t){this.resolver=t}supportsDescriptor(t,r){return!!(r.project.storedResolutions.get(t.descriptorHash)||r.project.originalPackages.has(QQ(t).locatorHash))}supportsLocator(t,r){return!!(r.project.originalPackages.has(t.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(t,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return this.resolver.getResolutionDependencies(t,r)}async getCandidates(t,r,s){let a=s.project.storedResolutions.get(t.descriptorHash);if(a){let c=s.project.originalPackages.get(a);if(c)return[c]}let n=s.project.originalPackages.get(QQ(t).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){let s=r.project.originalPackages.get(t.locatorHash);if(!s)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return s}}});function zp(){}function Rit(e,t,r,s,a){for(var n=0,c=t.length,f=0,p=0;nx.length?R:x}),h.value=e.join(E)}else h.value=e.join(r.slice(f,f+h.count));f+=h.count,h.added||(p+=h.count)}}var S=t[c-1];return c>1&&typeof S.value=="string"&&(S.added||S.removed)&&e.equals("",S.value)&&(t[c-2].value+=S.value,t.pop()),t}function Fit(e){return{newPos:e.newPos,components:e.components.slice(0)}}function Nit(e,t){if(typeof e=="function")t.callback=e;else if(e)for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t}function Ide(e,t,r){return r=Nit(r,{ignoreWhitespace:!0}),yG.diff(e,t,r)}function Oit(e,t,r){return EG.diff(e,t,r)}function kR(e){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?kR=function(t){return typeof t}:kR=function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},kR(e)}function hG(e){return Uit(e)||_it(e)||Hit(e)||jit()}function Uit(e){if(Array.isArray(e))return dG(e)}function _it(e){if(typeof Symbol<"u"&&Symbol.iterator in Object(e))return Array.from(e)}function Hit(e,t){if(e){if(typeof e=="string")return dG(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return dG(e,t)}}function dG(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,s=new Array(t);r"u"&&(c.context=4);var f=Oit(r,s,c);if(!f)return;f.push({value:"",lines:[]});function p(U){return U.map(function(K){return" "+K})}for(var h=[],E=0,C=0,S=[],x=1,I=1,R=function(K){var $=f[K],ie=$.lines||$.value.replace(/\n$/,"").split(` +`);if($.lines=ie,$.added||$.removed){var fe;if(!E){var le=f[K-1];E=x,C=I,le&&(S=c.context>0?p(le.lines.slice(-c.context)):[],E-=S.length,C-=S.length)}(fe=S).push.apply(fe,hG(ie.map(function(me){return($.added?"+":"-")+me}))),$.added?I+=ie.length:x+=ie.length}else{if(E)if(ie.length<=c.context*2&&K=f.length-2&&ie.length<=c.context){var d=/\n$/.test(r),ve=/\n$/.test(s),Ie=ie.length==0&&S.length>ye.oldLines;!d&&Ie&&r.length>0&&S.splice(ye.oldLines,0,"\\ No newline at end of file"),(!d&&!Ie||!ve)&&S.push("\\ No newline at end of file")}h.push(ye),E=0,C=0,S=[]}x+=ie.length,I+=ie.length}},N=0;N{zp.prototype={diff:function(t,r){var s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=s.callback;typeof s=="function"&&(a=s,s={}),this.options=s;var n=this;function c(R){return a?(setTimeout(function(){a(void 0,R)},0),!0):R}t=this.castInput(t),r=this.castInput(r),t=this.removeEmpty(this.tokenize(t)),r=this.removeEmpty(this.tokenize(r));var f=r.length,p=t.length,h=1,E=f+p;s.maxEditLength&&(E=Math.min(E,s.maxEditLength));var C=[{newPos:-1,components:[]}],S=this.extractCommon(C[0],r,t,0);if(C[0].newPos+1>=f&&S+1>=p)return c([{value:this.join(r),count:r.length}]);function x(){for(var R=-1*h;R<=h;R+=2){var N=void 0,U=C[R-1],K=C[R+1],$=(K?K.newPos:0)-R;U&&(C[R-1]=void 0);var ie=U&&U.newPos+1=f&&$+1>=p)return c(Rit(n,N.components,r,t,n.useLongestToken));C[R]=N}h++}if(a)(function R(){setTimeout(function(){if(h>E)return a();x()||R()},0)})();else for(;h<=E;){var I=x();if(I)return I}},pushComponent:function(t,r,s){var a=t[t.length-1];a&&a.added===r&&a.removed===s?t[t.length-1]={count:a.count+1,added:r,removed:s}:t.push({count:1,added:r,removed:s})},extractCommon:function(t,r,s,a){for(var n=r.length,c=s.length,f=t.newPos,p=f-a,h=0;f+1"u"?r:c}:s;return typeof e=="string"?e:JSON.stringify(gG(e,null,null,a),a," ")};Wv.equals=function(e,t){return zp.prototype.equals.call(Wv,e.replace(/,([\r\n])/g,"$1"),t.replace(/,([\r\n])/g,"$1"))};mG=new zp;mG.tokenize=function(e){return e.slice()};mG.join=mG.removeEmpty=function(e){return e}});var QR,wde=Ze(()=>{Nc();QR=class{constructor(t){this.resolver=t}supportsDescriptor(t,r){return this.resolver.supportsDescriptor(t,r)}supportsLocator(t,r){return this.resolver.supportsLocator(t,r)}shouldPersistResolution(t,r){return this.resolver.shouldPersistResolution(t,r)}bindDescriptor(t,r,s){return this.resolver.bindDescriptor(t,r,s)}getResolutionDependencies(t,r){return this.resolver.getResolutionDependencies(t,r)}async getCandidates(t,r,s){throw new Lt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(t,r,s,a){throw new Lt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(t,r){throw new Lt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var Qi,CG=Ze(()=>{Nc();Qi=class extends Io{reportCacheHit(t){}reportCacheMiss(t){}startSectionSync(t,r){return r()}async startSectionPromise(t,r){return await r()}startTimerSync(t,r,s){return(typeof r=="function"?r:s)()}async startTimerPromise(t,r,s){return await(typeof r=="function"?r:s)()}reportSeparator(){}reportInfo(t,r){}reportWarning(t,r){}reportError(t,r){}reportProgress(t){return{...Promise.resolve().then(async()=>{for await(let{}of t);}),stop:()=>{}}}reportJson(t){}reportFold(t,r){}async finalize(){}}});var Bde,qI,wG=Ze(()=>{bt();Bde=et(DQ());fI();rm();Tc();wd();Lp();$o();qI=class{constructor(t,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=t}async setup(){this.manifest=await _t.tryFind(this.cwd)??new _t,this.relativeCwd=Y.relative(this.project.cwd,this.cwd)||wt.dot;let t=this.manifest.name?this.manifest.name:Qa(null,`${this.computeCandidateName()}-${As(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=Un(t,`${Ii.protocol}${this.relativeCwd}`),this.anchoredLocator=Js(t,`${Ii.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let s=await(0,Bde.default)(r,{cwd:Ae.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});s.sort(),await s.reduce(async(a,n)=>{let c=Y.resolve(this.cwd,Ae.toPortablePath(n)),f=await ae.existsPromise(Y.join(c,"package.json"));await a,f&&this.workspacesCwds.add(c)},Promise.resolve())}get anchoredPackage(){let t=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${_B(this.project.configuration,this)} (${Gt(this.project.configuration,Y.join(this.cwd,yr.manifest),dt.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return t}accepts(t){let r=t.indexOf(":"),s=r!==-1?t.slice(0,r+1):null,a=r!==-1?t.slice(r+1):t;if(s===Ii.protocol&&Y.normalize(a)===this.relativeCwd||s===Ii.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=yl(a);return n?s===Ii.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${Y.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:t=_t.hardDependencies}={}){let r=new Set,s=a=>{for(let n of t)for(let c of a.manifest[n].values()){let f=this.project.tryWorkspaceByDescriptor(c);f===null||r.has(f)||(r.add(f),s(f))}};return s(this),r}getRecursiveWorkspaceDependents({dependencies:t=_t.hardDependencies}={}){let r=new Set,s=a=>{for(let n of this.project.workspaces)t.some(f=>[...n.manifest[f].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&LB(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),s(n))};return s(this),r}getRecursiveWorkspaceChildren(){let t=new Set([this]);for(let r of t)for(let s of r.workspacesCwds){let a=this.project.workspacesByCwd.get(s);a&&t.add(a)}return t.delete(this),Array.from(t)}async persistManifest(){let t={};this.manifest.exportTo(t);let r=Y.join(this.cwd,_t.fileName),s=`${JSON.stringify(t,null,this.manifest.indent)} +`;await ae.changeFilePromise(r,s,{automaticNewlines:!0}),this.manifest.raw=t}}});function Jit({project:e,allDescriptors:t,allResolutions:r,allPackages:s,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:c=new Map,peerWarnings:f=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,C=[],S=new Map,x=new Map,I=new Map,R=new Map,N=new Map,U=new Map(e.workspaces.map(le=>{let ge=le.anchoredLocator.locatorHash,pe=s.get(ge);if(typeof pe>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[ge,FB(pe)]})),K=()=>{let le=ae.mktempSync(),ge=Y.join(le,"stacktrace.log"),pe=String(C.length+1).length,De=C.map((ye,d)=>`${`${d+1}.`.padStart(pe," ")} ${ml(ye)} +`).join("");throw ae.writeFileSync(ge,De),ae.detachTemp(le),new Lt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${Ae.fromPortablePath(ge)}`)},$=le=>{let ge=r.get(le.descriptorHash);if(typeof ge>"u")throw new Error("Assertion failed: The resolution should have been registered");let pe=s.get(ge);if(!pe)throw new Error("Assertion failed: The package could not be found");return pe},ie=(le,ge,pe,{top:De,optional:ye})=>{C.length>1e3&&K(),C.push(ge);let d=fe(le,ge,pe,{top:De,optional:ye});return C.pop(),d},fe=(le,ge,pe,{top:De,optional:ye})=>{if(ye||n.delete(ge.locatorHash),a.has(ge.locatorHash))return;a.add(ge.locatorHash);let d=s.get(ge.locatorHash);if(!d)throw new Error(`Assertion failed: The package (${Vr(e.configuration,ge)}) should have been registered`);let ve=new Set,Ie=new Map,me=[],ce=[],X=[],be=[];for(let ke of Array.from(d.dependencies.values())){if(d.peerDependencies.has(ke.identHash)&&d.locatorHash!==De)continue;if(Fp(ke))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");h.delete(ke.descriptorHash);let it=ye;if(!it){let Te=d.dependenciesMeta.get(fn(ke));if(typeof Te<"u"){let ct=Te.get(null);typeof ct<"u"&&ct.optional&&(it=!0)}}let _=r.get(ke.descriptorHash);if(!_)throw new Error(`Assertion failed: The resolution (${ai(e.configuration,ke)}) should have been registered`);let tt=U.get(_)||s.get(_);if(!tt)throw new Error(`Assertion failed: The package (${_}, resolved from ${ai(e.configuration,ke)}) should have been registered`);if(tt.peerDependencies.size===0){ie(ke,tt,new Map,{top:De,optional:it});continue}let Fe,Qe,Se=new Set,je=new Map;me.push(()=>{Fe=w8(ke,ge.locatorHash),Qe=B8(tt,ge.locatorHash),d.dependencies.set(ke.identHash,Fe),r.set(Fe.descriptorHash,Qe.locatorHash),t.set(Fe.descriptorHash,Fe),s.set(Qe.locatorHash,Qe),Qp(R,Qe.locatorHash).add(Fe.descriptorHash),ve.add(Qe.locatorHash)}),ce.push(()=>{N.set(Qe.locatorHash,je);for(let Te of Qe.peerDependencies.values()){let Me=$l(Ie,Te.identHash,()=>{let P=pe.get(Te.identHash)??null,w=d.dependencies.get(Te.identHash);return!w&&OB(ge,Te)&&(le.identHash===ge.identHash?w=le:(w=Un(ge,le.range),t.set(w.descriptorHash,w),r.set(w.descriptorHash,ge.locatorHash),h.delete(w.descriptorHash),P=null)),w||(w=Un(Te,"missing:")),{subject:ge,ident:Te,provided:w,root:!P,requests:new Map,hash:`p${As(ge.locatorHash,Te.identHash).slice(0,6)}`}}).provided;if(Me.range==="missing:"&&Qe.dependencies.has(Te.identHash)){Qe.peerDependencies.delete(Te.identHash);continue}if(je.set(Te.identHash,{requester:Qe,descriptor:Te,meta:Qe.peerDependenciesMeta.get(fn(Te)),children:new Map}),Qe.dependencies.set(Te.identHash,Me),Fp(Me)){let P=r.get(Me.descriptorHash);Qp(I,P).add(Qe.locatorHash)}S.set(Me.identHash,Me),Me.range==="missing:"&&Se.add(Me.identHash)}Qe.dependencies=new Map(Ks(Qe.dependencies,([Te,ct])=>fn(ct)))}),X.push(()=>{if(!s.has(Qe.locatorHash))return;let Te=E.get(tt.locatorHash);typeof Te=="number"&&Te>=2&&K();let ct=E.get(tt.locatorHash),Me=typeof ct<"u"?ct+1:1;E.set(tt.locatorHash,Me),ie(Fe,Qe,je,{top:De,optional:it}),E.set(tt.locatorHash,Me-1)}),be.push(()=>{let Te=r.get(Fe.descriptorHash);if(typeof Te>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let ct=N.get(Te);if(typeof ct>"u")throw new Error("Assertion failed: Expected the peer requests to be registered");for(let Me of Ie.values()){let P=ct.get(Me.ident.identHash);P&&(Me.requests.set(Fe.descriptorHash,P),p.set(Me.hash,Me),Me.root||pe.get(Me.ident.identHash)?.children.set(Fe.descriptorHash,P))}if(s.has(Qe.locatorHash))for(let Me of Se)Qe.dependencies.delete(Me)})}for(let ke of[...me,...ce])ke();for(let ke of ve){ve.delete(ke);let it=s.get(ke),_=As(aI(it).locatorHash,...Array.from(it.dependencies.values(),Se=>{let je=Se.range!=="missing:"?r.get(Se.descriptorHash):"missing:";if(typeof je>"u")throw new Error(`Assertion failed: Expected the resolution for ${ai(e.configuration,Se)} to have been registered`);return je===De?`${je} (top)`:je})),tt=x.get(_);if(typeof tt>"u"){x.set(_,it);continue}let Fe=Qp(R,tt.locatorHash);for(let Se of R.get(it.locatorHash)??[])r.set(Se,tt.locatorHash),Fe.add(Se);s.delete(it.locatorHash),a.delete(it.locatorHash),ve.delete(it.locatorHash);let Qe=I.get(it.locatorHash);if(Qe!==void 0){let Se=Qp(I,tt.locatorHash);for(let je of Qe)Se.add(je),ve.add(je)}}for(let ke of[...X,...be])ke()};for(let le of e.workspaces){let ge=le.anchoredLocator;h.delete(le.anchoredDescriptor.descriptorHash),ie(le.anchoredDescriptor,ge,new Map,{top:ge.locatorHash,optional:!1})}for(let le of p.values()){if(!le.root)continue;let ge=s.get(le.subject.locatorHash);if(typeof ge>"u")continue;for(let De of le.requests.values()){let ye=`p${As(le.subject.locatorHash,fn(le.ident),De.requester.locatorHash).slice(0,6)}`;c.set(ye,{subject:le.subject.locatorHash,requested:le.ident,rootRequester:De.requester.locatorHash,allRequesters:Array.from(HB(De),d=>d.requester.locatorHash)})}let pe=[...HB(le)];if(le.provided.range!=="missing:"){let De=$(le.provided),ye=De.version??"0.0.0",d=Ie=>{if(Ie.startsWith(Ii.protocol)){if(!e.tryWorkspaceByLocator(De))return null;Ie=Ie.slice(Ii.protocol.length),(Ie==="^"||Ie==="~")&&(Ie="*")}return Ie},ve=!0;for(let Ie of pe){let me=d(Ie.descriptor.range);if(me===null){ve=!1;continue}if(!rA(ye,me)){ve=!1;let ce=`p${As(le.subject.locatorHash,fn(le.ident),Ie.requester.locatorHash).slice(0,6)}`;f.push({type:1,subject:ge,requested:le.ident,requester:Ie.requester,version:ye,hash:ce,requirementCount:pe.length})}}if(!ve){let Ie=pe.map(me=>d(me.descriptor.range));f.push({type:3,node:le,range:Ie.includes(null)?null:b8(Ie),hash:le.hash})}}else{let De=!0;for(let ye of pe)if(!ye.meta?.optional){De=!1;let d=`p${As(le.subject.locatorHash,fn(le.ident),ye.requester.locatorHash).slice(0,6)}`;f.push({type:0,subject:ge,requested:le.ident,requester:ye.requester,hash:d})}De||f.push({type:2,node:le,hash:le.hash})}}}function*zit(e){let t=new Map;if("children"in e)t.set(e,e);else for(let r of e.requests.values())t.set(r,r);for(let[r,s]of t){yield{request:r,root:s};for(let a of r.children.values())t.has(a)||t.set(a,s)}}function Zit(e,t){let r=[],s=[],a=!1;for(let n of e.peerWarnings)if(!(n.type===1||n.type===0)){if(!e.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let c=e.storedResolutions.get(n.node.provided.descriptorHash);if(typeof c>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let f=e.storedPackages.get(c);if(typeof f>"u")throw new Error("Assertion failed: Expected the package to be registered");let p=dd(zit(n.node),({request:C,root:S})=>rA(f.version??"0.0.0",C.descriptor.range)?dd.skip:C===S?$i(e.configuration,C.requester):`${$i(e.configuration,C.requester)} (via ${$i(e.configuration,S.requester)})`),h=[...HB(n.node)].length>1?"and other dependencies request":"requests",E=n.range?cI(e.configuration,n.range):Gt(e.configuration,"but they have non-overlapping ranges!","redBright");r.push(`${$i(e.configuration,n.node.ident)} is listed by your project with version ${UB(e.configuration,f.version??"0.0.0")} (${Gt(e.configuration,n.hash,dt.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let c=n.node.requests.size>1?" and other dependencies":"";s.push(`${Vr(e.configuration,n.node.subject)} doesn't provide ${$i(e.configuration,n.node.ident)} (${Gt(e.configuration,n.hash,dt.CODE)}), requested by ${$i(e.configuration,n.node.requests.values().next().value.requester)}${c}.`)}}t.startSectionSync({reportFooter:()=>{t.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Gt(e.configuration,"yarn explain peer-requirements ",dt.CODE)} for details, where ${Gt(e.configuration,"",dt.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of Ks(r,c=>$E.default(c)))t.reportWarning(60,n);for(let n of Ks(s,c=>$E.default(c)))t.reportWarning(2,n)}),a&&t.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Gt(e.configuration,"yarn explain peer-requirements",dt.CODE)} for details.`)}var TR,RR,bde,SG,vG,bG,FR,qit,Yit,vde,Wit,Vit,Kit,La,BG,NR,Sde,Tt,Dde=Ze(()=>{bt();bt();Sc();jt();TR=Ce("crypto");IG();Zl();RR=et(M0()),bde=et(hi()),SG=Ce("util"),vG=et(Ce("v8")),bG=et(Ce("zlib"));fG();iv();AG();pG();fI();x8();Nc();wde();gv();CG();rm();wG();HQ();Tc();wd();Qc();ET();Yj();Lp();$o();FR=ZE(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??10),qit=3,Yit=/ *, */g,vde=/\/$/,Wit=32,Vit=(0,SG.promisify)(bG.default.gzip),Kit=(0,SG.promisify)(bG.default.gunzip),La=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(La||{}),BG={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},NR=(a=>(a[a.NotProvided=0]="NotProvided",a[a.NotCompatible=1]="NotCompatible",a[a.NodeNotProvided=2]="NodeNotProvided",a[a.NodeNotCompatible=3]="NodeNotCompatible",a))(NR||{}),Sde=e=>As(`${qit}`,e),Tt=class e{constructor(t,{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.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=t}static async find(t,r){if(!t.projectCwd)throw new ot(`No project found in ${r}`);let s=t.projectCwd,a=r,n=null;for(;n!==t.projectCwd;){if(n=a,ae.existsSync(Y.join(n,yr.manifest))){s=n;break}a=Y.dirname(n)}let c=new e(t.projectCwd,{configuration:t});Je.telemetry?.reportProject(c.cwd),await c.setupResolutions(),await c.setupWorkspaces(),Je.telemetry?.reportWorkspaceCount(c.workspaces.length),Je.telemetry?.reportDependencyCount(c.workspaces.reduce((I,R)=>I+R.manifest.dependencies.size+R.manifest.devDependencies.size,0));let f=c.tryWorkspaceByCwd(s);if(f)return{project:c,workspace:f,locator:f.anchoredLocator};let p=await c.findLocatorForLocation(`${s}/`,{strict:!0});if(p)return{project:c,locator:p,workspace:null};let h=Gt(t,c.cwd,dt.PATH),E=Gt(t,Y.relative(c.cwd,s),dt.PATH),C=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,S=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,x=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new ot(`The nearest package directory (${Gt(t,s,dt.PATH)}) doesn't seem to be part of the project declared in ${Gt(t,c.cwd,dt.PATH)}. + +${[C,S,x].join(` +`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let t=Y.join(this.cwd,yr.lockfile),r=this.configuration.get("defaultLanguageName");if(ae.existsSync(t)){let s=await ae.readFilePromise(t,"utf8");this.lockFileChecksum=Sde(s);let a=us(s);if(a.__metadata){let n=a.__metadata.version,c=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${f})`);let h=Np(p.resolution,!0),E=new _t;E.load(p,{yamlCompatibilityMode:!0});let C=E.version,S=E.languageName||r,x=p.linkType.toUpperCase(),I=p.conditions??null,R=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,K=E.peerDependenciesMeta,$=E.bin;if(p.checksum!=null){let fe=typeof c<"u"&&!p.checksum.includes("/")?`${c}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,fe)}let ie={...h,version:C,languageName:S,linkType:x,conditions:I,dependencies:R,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:K,bin:$};this.originalPackages.set(ie.locatorHash,ie);for(let fe of f.split(Yit)){let le=Bd(fe);n<=6&&(le=this.configuration.normalizeDependency(le),le=Un(le,le.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(le.descriptorHash,le),this.storedResolutions.set(le.descriptorHash,h.locatorHash)}}}else s.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let t=new Set,r=(0,RR.default)(4),s=async(a,n)=>{if(t.has(n))return a;t.add(n);let c=new qI(n,{project:this});await r(()=>c.setup());let f=a.then(()=>{this.addWorkspace(c)});return Array.from(c.workspacesCwds).reduce(s,f)};await s(Promise.resolve(),this.cwd)}addWorkspace(t){let r=this.workspacesByIdent.get(t.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${$i(this.configuration,t.anchoredLocator)}: ${Ae.fromPortablePath(t.cwd)} conflicts with ${Ae.fromPortablePath(r.cwd)}`);this.workspaces.push(t),this.workspacesByCwd.set(t.cwd,t),this.workspacesByIdent.set(t.anchoredLocator.identHash,t)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(t){Y.isAbsolute(t)||(t=Y.resolve(this.cwd,t)),t=Y.normalize(t).replace(/\/+$/,"");let r=this.workspacesByCwd.get(t);return r||null}getWorkspaceByCwd(t){let r=this.tryWorkspaceByCwd(t);if(!r)throw new Error(`Workspace not found (${t})`);return r}tryWorkspaceByFilePath(t){let r=null;for(let s of this.workspaces)Y.relative(s.cwd,t).startsWith("../")||r&&r.cwd.length>=s.cwd.length||(r=s);return r||null}getWorkspaceByFilePath(t){let r=this.tryWorkspaceByFilePath(t);if(!r)throw new Error(`Workspace not found (${t})`);return r}tryWorkspaceByIdent(t){let r=this.workspacesByIdent.get(t.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(t){let r=this.tryWorkspaceByIdent(t);if(!r)throw new Error(`Workspace not found (${$i(this.configuration,t)})`);return r}tryWorkspaceByDescriptor(t){if(t.range.startsWith(Ii.protocol)){let s=t.range.slice(Ii.protocol.length);if(s!=="^"&&s!=="~"&&s!=="*"&&!yl(s))return this.tryWorkspaceByCwd(s)}let r=this.tryWorkspaceByIdent(t);return r===null||(Fp(t)&&(t=NB(t)),!r.accepts(t.range))?null:r}getWorkspaceByDescriptor(t){let r=this.tryWorkspaceByDescriptor(t);if(r===null)throw new Error(`Workspace not found (${ai(this.configuration,t)})`);return r}tryWorkspaceByLocator(t){let r=this.tryWorkspaceByIdent(t);return r===null||(ju(t)&&(t=aI(t)),r.anchoredLocator.locatorHash!==t.locatorHash)?null:r}getWorkspaceByLocator(t){let r=this.tryWorkspaceByLocator(t);if(!r)throw new Error(`Workspace not found (${Vr(this.configuration,t)})`);return r}deleteDescriptor(t){this.storedResolutions.delete(t),this.storedDescriptors.delete(t)}deleteLocator(t){this.originalPackages.delete(t),this.storedPackages.delete(t),this.accessibleLocators.delete(t)}forgetResolution(t){if("descriptorHash"in t){let r=this.storedResolutions.get(t.descriptorHash);this.deleteDescriptor(t.descriptorHash);let s=new Set(this.storedResolutions.values());typeof r<"u"&&!s.has(r)&&this.deleteLocator(r)}if("locatorHash"in t){this.deleteLocator(t.locatorHash);for(let[r,s]of this.storedResolutions)s===t.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let t=this.configuration.makeResolver(),r=new Map;for(let[s,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(s)}for(let s of this.originalPackages.values()){let a;try{a=t.shouldPersistResolution(s,{project:this,resolver:t})}catch{a=!1}if(!a){this.deleteLocator(s.locatorHash);let n=r.get(s.locatorHash);if(n){r.delete(s.locatorHash);for(let c of n)this.deleteDescriptor(c)}}}}forgetVirtualResolutions(){for(let t of this.storedPackages.values())for(let[r,s]of t.dependencies)Fp(s)&&t.dependencies.set(r,NB(s))}getDependencyMeta(t,r){let s={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(fn(t));if(!n)return s;let c=n.get(null);if(c&&Object.assign(s,c),r===null||!bde.default.valid(r))return s;for(let[f,p]of n)f!==null&&f===r&&Object.assign(s,p);return s}async findLocatorForLocation(t,{strict:r=!1}={}){let s=new Qi,a=this.configuration.getLinkers(),n={project:this,report:s};for(let c of a){let f=await c.findPackageLocator(t,n);if(f){if(r&&(await c.findPackageLocation(f,n)).replace(vde,"")!==t.replace(vde,""))continue;return f}}return null}async loadUserConfig(){let t=Y.join(this.cwd,".pnp.cjs");await ae.existsPromise(t)&&Tp(t).setup();let r=Y.join(this.cwd,"yarn.config.cjs");return await ae.existsPromise(r)?Tp(r):null}async preparePackage(t,{resolver:r,resolveOptions:s}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(t,{packageExtensions:a});for(let[c,f]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,f,this,n,f,{resolver:r,resolveOptions:s});if(!OB(f,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,s);n.dependencies.set(c,h)}return n}async resolveEverything(t){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),s=[];t.lockfileOnly||this.forgetTransientResolutions();let a=t.resolver||this.configuration.makeResolver(),n=new jI(a);await n.setup(this,{report:t.report});let c=t.lockfileOnly?[new QR(a)]:[n,a],f=new nm([new GI(a),...c]),p=new nm([...c]),h=this.configuration.makeFetcher(),E=t.lockfileOnly?{project:this,report:t.report,resolver:f}:{project:this,report:t.report,resolver:f,fetchOptions:{project:this,cache:t.cache,checksums:this.storedChecksums,report:t.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},C=new Map,S=new Map,x=new Map,I=new Map,R=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,K=new Set,$=[],ie=sj(),fe=this.configuration.getSupportedArchitectures();await t.report.startProgressPromise(Io.progressViaTitle(),async ce=>{let X=async tt=>{let Fe=await JE(async()=>await f.resolve(tt,E),Te=>`${Vr(this.configuration,tt)}: ${Te}`);if(!LB(tt,Fe))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${Vr(this.configuration,tt)} to ${Vr(this.configuration,Fe)})`);I.set(Fe.locatorHash,Fe),!r.delete(Fe.locatorHash)&&!this.tryWorkspaceByLocator(Fe)&&s.push(Fe);let Se=await this.preparePackage(Fe,{resolver:f,resolveOptions:E}),je=Mu([...Se.dependencies.values()].map(Te=>_(Te)));return $.push(je),je.catch(()=>{}),S.set(Se.locatorHash,Se),Se},be=async tt=>{let Fe=R.get(tt.locatorHash);if(typeof Fe<"u")return Fe;let Qe=Promise.resolve().then(()=>X(tt));return R.set(tt.locatorHash,Qe),Qe},ke=async(tt,Fe)=>{let Qe=await _(Fe);return C.set(tt.descriptorHash,tt),x.set(tt.descriptorHash,Qe.locatorHash),Qe},it=async tt=>{ce.setTitle(ai(this.configuration,tt));let Fe=this.resolutionAliases.get(tt.descriptorHash);if(typeof Fe<"u")return ke(tt,this.storedDescriptors.get(Fe));let Qe=f.getResolutionDependencies(tt,E),Se=Object.fromEntries(await Mu(Object.entries(Qe).map(async([ct,Me])=>{let P=f.bindDescriptor(Me,U,E),w=await _(P);return K.add(w.locatorHash),[ct,w]}))),Te=(await JE(async()=>await f.getCandidates(tt,Se,E),ct=>`${ai(this.configuration,tt)}: ${ct}`))[0];if(typeof Te>"u")throw new Lt(82,`${ai(this.configuration,tt)}: No candidates found`);if(t.checkResolutions){let{locators:ct}=await p.getSatisfying(tt,Se,[Te],{...E,resolver:p});if(!ct.find(Me=>Me.locatorHash===Te.locatorHash))throw new Lt(78,`Invalid resolution ${QB(this.configuration,tt,Te)}`)}return C.set(tt.descriptorHash,tt),x.set(tt.descriptorHash,Te.locatorHash),be(Te)},_=tt=>{let Fe=N.get(tt.descriptorHash);if(typeof Fe<"u")return Fe;C.set(tt.descriptorHash,tt);let Qe=Promise.resolve().then(()=>it(tt));return N.set(tt.descriptorHash,Qe),Qe};for(let tt of this.workspaces){let Fe=tt.anchoredDescriptor;$.push(_(Fe))}for(;$.length>0;){let tt=[...$];$.length=0,await Mu(tt)}});let le=Xl(r.values(),ce=>this.tryWorkspaceByLocator(ce)?Xl.skip:ce);if(s.length>0||le.length>0){let ce=new Set(this.workspaces.flatMap(tt=>{let Fe=S.get(tt.anchoredLocator.locatorHash);if(!Fe)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(Fe.dependencies.values(),Qe=>{let Se=x.get(Qe.descriptorHash);if(!Se)throw new Error("Assertion failed: The resolution should have been registered");return Se})})),X=tt=>ce.has(tt.locatorHash)?"0":"1",be=tt=>ml(tt),ke=Ks(s,[X,be]),it=Ks(le,[X,be]),_=t.report.getRecommendedLength();ke.length>0&&t.report.reportInfo(85,`${Gt(this.configuration,"+",dt.ADDED)} ${nQ(this.configuration,ke,_)}`),it.length>0&&t.report.reportInfo(85,`${Gt(this.configuration,"-",dt.REMOVED)} ${nQ(this.configuration,it,_)}`)}let ge=new Set(this.resolutionAliases.values()),pe=new Set(S.keys()),De=new Set,ye=new Map,d=[],ve=new Map;Jit({project:this,accessibleLocators:De,volatileDescriptors:ge,optionalBuilds:pe,peerRequirements:ye,peerWarnings:d,peerRequirementNodes:ve,allDescriptors:C,allResolutions:x,allPackages:S});for(let ce of K)pe.delete(ce);for(let ce of ge)C.delete(ce),x.delete(ce);let Ie=new Set,me=new Set;for(let ce of S.values())ce.conditions!=null&&pe.has(ce.locatorHash)&&(OQ(ce,fe)||(OQ(ce,ie)&&t.report.reportWarningOnce(77,`${Vr(this.configuration,ce)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Gt(this.configuration,"supportedArchitectures",dt.SETTING)} setting`),me.add(ce.locatorHash)),Ie.add(ce.locatorHash));this.storedResolutions=x,this.storedDescriptors=C,this.storedPackages=S,this.accessibleLocators=De,this.conditionalLocators=Ie,this.disabledLocators=me,this.originalPackages=I,this.optionalBuilds=pe,this.peerRequirements=ye,this.peerWarnings=d,this.peerRequirementNodes=ve}async fetchEverything({cache:t,report:r,fetcher:s,mode:a,persistProject:n=!0}){let c={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},f=s||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:t,fetcher:f,report:r,cacheOptions:c},h=Array.from(new Set(Ks(this.storedResolutions.values(),[I=>{let R=this.storedPackages.get(I);if(!R)throw new Error("Assertion failed: The locator should have been registered");return ml(R)}])));a==="update-lockfile"&&(h=h.filter(I=>!this.storedChecksums.has(I)));let E=!1,C=Io.progressViaCounter(h.length);await r.reportProgress(C);let S=(0,RR.default)(Wit);if(await Mu(h.map(I=>S(async()=>{let R=this.storedPackages.get(I);if(!R)throw new Error("Assertion failed: The locator should have been registered");if(ju(R))return;let N;try{N=await f.fetch(R,p)}catch(U){U.message=`${Vr(this.configuration,R)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(R.locatorHash,N.checksum):this.storedChecksums.delete(R.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{C.tick()}))),E)throw E;let x=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:t,report:r}):null;if(r.cacheMisses.size>0||x){let R=(await Promise.all([...r.cacheMisses].map(async le=>{let ge=this.storedPackages.get(le),pe=this.storedChecksums.get(le)??null,De=t.getLocatorPath(ge,pe);return(await ae.statPromise(De)).size}))).reduce((le,ge)=>le+ge,0)-(x?.size??0),N=r.cacheMisses.size,U=x?.count??0,K=`${Jk(N,{zero:"No new packages",one:"A package was",more:`${Gt(this.configuration,N,dt.NUMBER)} packages were`})} added to the project`,$=`${Jk(U,{zero:"none were",one:"one was",more:`${Gt(this.configuration,U,dt.NUMBER)} were`})} removed`,ie=R!==0?` (${Gt(this.configuration,R,dt.SIZE_DIFF)})`:"",fe=U>0?N>0?`${K}, and ${$}${ie}.`:`${K}, but ${$}${ie}.`:`${K}${ie}.`;r.reportInfo(13,fe)}}async linkEverything({cache:t,report:r,fetcher:s,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},c=s||this.configuration.makeFetcher(),f={checksums:this.storedChecksums,project:this,cache:t,fetcher:c,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(Ie=>{let me=Ie.makeInstaller(h),ce=Ie.getCustomDataKey(),X=this.linkersCustomData.get(ce);return typeof X<"u"&&me.attachCustomData(X),[Ie,me]})),C=new Map,S=new Map,x=new Map,I=new Map(await Mu([...this.accessibleLocators].map(async Ie=>{let me=this.storedPackages.get(Ie);if(!me)throw new Error("Assertion failed: The locator should have been registered");return[Ie,await c.fetch(me,f)]}))),R=[],N=new Set,U=[];for(let Ie of this.accessibleLocators){let me=this.storedPackages.get(Ie);if(typeof me>"u")throw new Error("Assertion failed: The locator should have been registered");let ce=I.get(me.locatorHash);if(typeof ce>"u")throw new Error("Assertion failed: The fetch result should have been registered");let X=[],be=it=>{X.push(it)},ke=this.tryWorkspaceByLocator(me);if(ke!==null){let it=[],{scripts:_}=ke.manifest;for(let Fe of["preinstall","install","postinstall"])_.has(Fe)&&it.push({type:0,script:Fe});try{for(let[Fe,Qe]of E)if(Fe.supportsPackage(me,h)&&(await Qe.installPackage(me,ce,{holdFetchResult:be})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{X.length===0?ce.releaseFs?.():R.push(Mu(X).catch(()=>{}).then(()=>{ce.releaseFs?.()}))}let tt=Y.join(ce.packageFs.getRealPath(),ce.prefixPath);S.set(me.locatorHash,tt),!ju(me)&&it.length>0&&x.set(me.locatorHash,{buildDirectives:it,buildLocations:[tt]})}else{let it=p.find(Fe=>Fe.supportsPackage(me,h));if(!it)throw new Lt(12,`${Vr(this.configuration,me)} isn't supported by any available linker`);let _=E.get(it);if(!_)throw new Error("Assertion failed: The installer should have been registered");let tt;try{tt=await _.installPackage(me,ce,{holdFetchResult:be})}finally{X.length===0?ce.releaseFs?.():R.push(Mu(X).then(()=>{}).then(()=>{ce.releaseFs?.()}))}C.set(me.locatorHash,it),S.set(me.locatorHash,tt.packageLocation),tt.buildRequest&&tt.packageLocation&&(tt.buildRequest.skipped?(N.add(me.locatorHash),this.skippedBuilds.has(me.locatorHash)||U.push([me,tt.buildRequest.explain])):x.set(me.locatorHash,{buildDirectives:tt.buildRequest.directives,buildLocations:[tt.packageLocation]}))}}let K=new Map;for(let Ie of this.accessibleLocators){let me=this.storedPackages.get(Ie);if(!me)throw new Error("Assertion failed: The locator should have been registered");let ce=this.tryWorkspaceByLocator(me)!==null,X=async(be,ke)=>{let it=S.get(me.locatorHash);if(typeof it>"u")throw new Error(`Assertion failed: The package (${Vr(this.configuration,me)}) should have been registered`);let _=[];for(let tt of me.dependencies.values()){let Fe=this.storedResolutions.get(tt.descriptorHash);if(typeof Fe>"u")throw new Error(`Assertion failed: The resolution (${ai(this.configuration,tt)}, from ${Vr(this.configuration,me)})should have been registered`);let Qe=this.storedPackages.get(Fe);if(typeof Qe>"u")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ai(this.configuration,tt)}) should have been registered`);let Se=this.tryWorkspaceByLocator(Qe)===null?C.get(Fe):null;if(typeof Se>"u")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ai(this.configuration,tt)}) should have been registered`);Se===be||Se===null?S.get(Qe.locatorHash)!==null&&_.push([tt,Qe]):!ce&&it!==null&&bB(K,Fe).push(it)}it!==null&&await ke.attachInternalDependencies(me,_)};if(ce)for(let[be,ke]of E)be.supportsPackage(me,h)&&await X(be,ke);else{let be=C.get(me.locatorHash);if(!be)throw new Error("Assertion failed: The linker should have been found");let ke=E.get(be);if(!ke)throw new Error("Assertion failed: The installer should have been registered");await X(be,ke)}}for(let[Ie,me]of K){let ce=this.storedPackages.get(Ie);if(!ce)throw new Error("Assertion failed: The package should have been registered");let X=C.get(ce.locatorHash);if(!X)throw new Error("Assertion failed: The linker should have been found");let be=E.get(X);if(!be)throw new Error("Assertion failed: The installer should have been registered");await be.attachExternalDependents(ce,me)}let $=new Map;for(let[Ie,me]of E){let ce=await me.finalizeInstall();for(let X of ce?.records??[])X.buildRequest.skipped?(N.add(X.locator.locatorHash),this.skippedBuilds.has(X.locator.locatorHash)||U.push([X.locator,X.buildRequest.explain])):x.set(X.locator.locatorHash,{buildDirectives:X.buildRequest.directives,buildLocations:X.buildLocations});typeof ce?.customData<"u"&&$.set(Ie.getCustomDataKey(),ce.customData)}if(this.linkersCustomData=$,await Mu(R),a==="skip-build")return;for(let[,Ie]of Ks(U,([me])=>ml(me)))Ie(r);let ie=new Set(x.keys()),fe=(0,TR.createHash)("sha512");fe.update(process.versions.node),await this.configuration.triggerHook(Ie=>Ie.globalHashGeneration,this,Ie=>{fe.update("\0"),fe.update(Ie)});let le=fe.digest("hex"),ge=new Map,pe=Ie=>{let me=ge.get(Ie.locatorHash);if(typeof me<"u")return me;let ce=this.storedPackages.get(Ie.locatorHash);if(typeof ce>"u")throw new Error("Assertion failed: The package should have been registered");let X=(0,TR.createHash)("sha512");X.update(Ie.locatorHash),ge.set(Ie.locatorHash,"");for(let be of ce.dependencies.values()){let ke=this.storedResolutions.get(be.descriptorHash);if(typeof ke>"u")throw new Error(`Assertion failed: The resolution (${ai(this.configuration,be)}) should have been registered`);let it=this.storedPackages.get(ke);if(typeof it>"u")throw new Error("Assertion failed: The package should have been registered");X.update(pe(it))}return me=X.digest("hex"),ge.set(Ie.locatorHash,me),me},De=(Ie,me)=>{let ce=(0,TR.createHash)("sha512");ce.update(le),ce.update(pe(Ie));for(let X of me)ce.update(X);return ce.digest("hex")},ye=new Map,d=!1,ve=Ie=>{let me=new Set([Ie.locatorHash]);for(let ce of me){let X=this.storedPackages.get(ce);if(!X)throw new Error("Assertion failed: The package should have been registered");for(let be of X.dependencies.values()){let ke=this.storedResolutions.get(be.descriptorHash);if(!ke)throw new Error(`Assertion failed: The resolution (${ai(this.configuration,be)}) should have been registered`);if(ke!==Ie.locatorHash&&ie.has(ke))return!1;let it=this.storedPackages.get(ke);if(!it)throw new Error("Assertion failed: The package should have been registered");let _=this.tryWorkspaceByLocator(it);if(_){if(_.anchoredLocator.locatorHash!==Ie.locatorHash&&ie.has(_.anchoredLocator.locatorHash))return!1;me.add(_.anchoredLocator.locatorHash)}me.add(ke)}}return!0};for(;ie.size>0;){let Ie=ie.size,me=[];for(let ce of ie){let X=this.storedPackages.get(ce);if(!X)throw new Error("Assertion failed: The package should have been registered");if(!ve(X))continue;let be=x.get(X.locatorHash);if(!be)throw new Error("Assertion failed: The build directive should have been registered");let ke=De(X,be.buildLocations);if(this.storedBuildState.get(X.locatorHash)===ke){ye.set(X.locatorHash,ke),ie.delete(ce);continue}d||(await this.persistInstallStateFile(),d=!0),this.storedBuildState.has(X.locatorHash)?r.reportInfo(8,`${Vr(this.configuration,X)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${Vr(this.configuration,X)} must be built because it never has been before or the last one failed`);let it=be.buildLocations.map(async _=>{if(!Y.isAbsolute(_))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${_})`);for(let tt of be.buildDirectives){let Fe=`# This file contains the result of Yarn building a package (${ml(X)}) +`;switch(tt.type){case 0:Fe+=`# Script name: ${tt.script} +`;break;case 1:Fe+=`# Script code: ${tt.script} +`;break}let Qe=null;if(!await ae.mktempPromise(async je=>{let Te=Y.join(je,"build.log"),{stdout:ct,stderr:Me}=this.configuration.getSubprocessStreams(Te,{header:Fe,prefix:Vr(this.configuration,X),report:r}),P;try{switch(tt.type){case 0:P=await HT(X,tt.script,[],{cwd:_,project:this,stdin:Qe,stdout:ct,stderr:Me});break;case 1:P=await Hj(X,tt.script,[],{cwd:_,project:this,stdin:Qe,stdout:ct,stderr:Me});break}}catch(y){Me.write(y.stack),P=1}if(ct.end(),Me.end(),P===0)return!0;ae.detachTemp(je);let w=`${Vr(this.configuration,X)} couldn't be built successfully (exit code ${Gt(this.configuration,P,dt.NUMBER)}, logs can be found here: ${Gt(this.configuration,Te,dt.PATH)})`,D=this.optionalBuilds.has(X.locatorHash);return D?r.reportInfo(9,w):r.reportError(9,w),Fpe&&r.reportFold(Ae.fromPortablePath(Te),ae.readFileSync(Te,"utf8")),D}))return!1}return!0});me.push(...it,Promise.allSettled(it).then(_=>{ie.delete(ce),_.every(tt=>tt.status==="fulfilled"&&tt.value===!0)&&ye.set(X.locatorHash,ke)}))}if(await Mu(me),Ie===ie.size){let ce=Array.from(ie).map(X=>{let be=this.storedPackages.get(X);if(!be)throw new Error("Assertion failed: The package should have been registered");return Vr(this.configuration,be)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ce})`);break}}this.storedBuildState=ye,this.skippedBuilds=N}async installWithNewReport(t,r){return(await Ft.start({configuration:this.configuration,json:t.json,stdout:t.stdout,forceSectionAlignment:!0,includeLogs:!t.json&&!t.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(t){let r=this.configuration.get("nodeLinker");Je.telemetry?.reportInstall(r);let s=!1;if(await t.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&t.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,C)=>{t.report.reportWarning(E,C)},reportError:(E,C)=>{t.report.reportError(E,C),s=!0}})}),s)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,C]of E)for(let S of C)S.status="inactive";let n=Y.join(this.cwd,yr.lockfile),c=null;if(t.immutable)try{c=await ae.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new Lt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):E}await t.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(t)}),await t.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{Zit(this,t.report);for(let[,E]of a)for(let[,C]of E)for(let S of C)if(S.userProvided){let x=Gt(this.configuration,S,dt.PACKAGE_EXTENSION);switch(S.status){case"inactive":t.report.reportWarning(68,`${x}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":t.report.reportWarning(69,`${x}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(c!==null){let E=I0(c,this.generateLockfile());if(E!==c){let C=Cde(n,n,c,E,void 0,void 0,{maxEditLength:100});if(C){t.report.reportSeparator();for(let S of C.hunks){t.report.reportInfo(null,`@@ -${S.oldStart},${S.oldLines} +${S.newStart},${S.newLines} @@`);for(let x of S.lines)x.startsWith("+")?t.report.reportError(28,Gt(this.configuration,x,dt.ADDED)):x.startsWith("-")?t.report.reportError(28,Gt(this.configuration,x,dt.REMOVED)):t.report.reportInfo(null,Gt(this.configuration,x,"grey"))}t.report.reportSeparator()}throw new Lt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,C]of E)for(let S of C)S.userProvided&&S.status==="active"&&Je.telemetry?.reportPackageExtension(X0(S,dt.PACKAGE_EXTENSION));await t.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(t)});let f=t.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(f.map(async E=>kQ(E,{cwd:this.cwd})));(typeof t.persistProject>"u"||t.persistProject)&&await this.persist(),await t.report.startTimerPromise("Link step",async()=>{if(t.mode==="update-lockfile"){t.report.reportWarning(73,`Skipped due to ${Gt(this.configuration,"mode=update-lockfile",dt.CODE)}`);return}await this.linkEverything(t);let E=await Promise.all(f.map(async C=>kQ(C,{cwd:this.cwd})));for(let C=0;C{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,C)=>{t.report.reportWarning(E,C)},reportError:(E,C)=>{t.report.reportError(E,C),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,t)}generateLockfile(){let t=new Map;for(let[n,c]of this.storedResolutions.entries()){let f=t.get(c);f||t.set(c,f=new Set),f.add(n)}let r={},{cacheKey:s}=zr.getCacheKey(this.configuration);r.__metadata={version:FR,cacheKey:s};for(let[n,c]of t.entries()){let f=this.originalPackages.get(n);if(!f)continue;let p=[];for(let C of c){let S=this.storedDescriptors.get(C);if(!S)throw new Error("Assertion failed: The descriptor should have been registered");p.push(S)}let h=p.map(C=>gl(C)).sort().join(", "),E=new _t;E.version=f.linkType==="HARD"?f.version:"0.0.0-use.local",E.languageName=f.languageName,E.dependencies=new Map(f.dependencies),E.peerDependencies=new Map(f.peerDependencies),E.dependenciesMeta=new Map(f.dependenciesMeta),E.peerDependenciesMeta=new Map(f.peerDependenciesMeta),E.bin=new Map(f.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:f.linkType.toLowerCase(),resolution:ml(f),checksum:this.storedChecksums.get(f.locatorHash),conditions:f.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Al(r)}async persistLockfile(){let t=Y.join(this.cwd,yr.lockfile),r="";try{r=await ae.readFilePromise(t,"utf8")}catch{}let s=this.generateLockfile(),a=I0(r,s);a!==r&&(await ae.writeFilePromise(t,a),this.lockFileChecksum=Sde(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let t=[];for(let c of Object.values(BG))t.push(...c);let r=z0(this,t),s=vG.default.serialize(r),a=As(s);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await ae.mkdirPromise(Y.dirname(n),{recursive:!0}),await ae.writeFilePromise(n,await Vit(s)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:t=!0,restoreResolutions:r=!0,restoreBuildState:s=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let c=await Kit(await ae.readFilePromise(a));n=vG.default.deserialize(c),this.installStateChecksum=As(c)}catch{r&&await this.applyLightResolution();return}t&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),s&&Object.assign(this,z0(n,BG.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,z0(n,BG.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Qi}),await this.persistInstallStateFile()}async persist(){let t=(0,RR.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>t(()=>r.persistManifest()))])}async cacheCleanup({cache:t,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let s=new Set([".gitignore"]);if(!U8(t.cwd,this.cwd)||!await ae.existsPromise(t.cwd))return null;let a=[];for(let c of await ae.readdirPromise(t.cwd)){if(s.has(c))continue;let f=Y.resolve(t.cwd,c);t.markedFiles.has(f)||(t.immutable?r.reportError(56,`${Gt(this.configuration,Y.basename(f),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(ae.lstatPromise(f).then(async p=>(await ae.removePromise(f),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((c,f)=>c+f,0)}}}});function Xit(e){let s=Math.floor(e.timeNow/864e5),a=e.updateInterval*864e5,n=e.state.lastUpdate??e.timeNow+a+Math.floor(a*e.randomInitialInterval),c=n+a,f=e.state.lastTips??s*864e5,p=f+864e5+8*36e5-e.timeZone,h=c<=e.timeNow,E=p<=e.timeNow,C=null;return(h||E||!e.state.lastUpdate||!e.state.lastTips)&&(C={},C.lastUpdate=h?e.timeNow:n,C.lastTips=f,C.blocks=h?{}:e.state.blocks,C.displayedTips=e.state.displayedTips),{nextState:C,triggerUpdate:h,triggerTips:E,nextTips:E?s*864e5:f}}var YI,Pde=Ze(()=>{bt();dv();wd();mT();Qc();Lp();YI=class{constructor(t,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=t;let s=this.getRegistryPath();this.isNew=!ae.existsSync(s),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(t){let r=new Set(this.displayedTips),s=f=>f&&An?rA(An,f):!1,a=t.map((f,p)=>p).filter(f=>t[f]&&s(t[f]?.selector));if(a.length===0)return null;let n=a.filter(f=>!r.has(f));if(n.length===0){let f=Math.floor(a.length*.2);this.displayedTips=f>0?this.displayedTips.slice(-f):[],n=a.filter(p=>!r.has(p))}let c=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(c),this.commitTips(),t[c]}reportVersion(t){this.reportValue("version",t.replace(/-git\..*/,"-git"))}reportCommandName(t){this.reportValue("commandName",t||"")}reportPluginName(t){this.reportValue("pluginName",t)}reportProject(t){this.reportEnumerator("projectCount",t)}reportInstall(t){this.reportHit("installCount",t)}reportPackageExtension(t){this.reportValue("packageExtension",t)}reportWorkspaceCount(t){this.reportValue("workspaceCount",String(t))}reportDependencyCount(t){this.reportValue("dependencyCount",String(t))}reportValue(t,r){Qp(this.values,t).add(r)}reportEnumerator(t,r){Qp(this.enumerators,t).add(As(r))}reportHit(t,r="*"){let s=L4(this.hits,t),a=$l(s,r,()=>0);s.set(r,a+1)}getRegistryPath(){let t=this.configuration.get("globalFolder");return Y.join(t,"telemetry.json")}sendReport(t){let r=this.getRegistryPath(),s;try{s=ae.readJsonSync(r)}catch{s={}}let{nextState:a,triggerUpdate:n,triggerTips:c,nextTips:f}=Xit({state:s,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=f,this.displayedTips=s.displayedTips??[],a!==null)try{ae.mkdirSync(Y.dirname(r),{recursive:!0}),ae.writeJsonSync(r,a)}catch{return!1}if(c&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=s.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${t}?ddsource=yarn`,E=C=>ij(h,C,{configuration:this.configuration}).catch(()=>{});for(let[C,S]of Object.entries(s.blocks??{})){if(Object.keys(S).length===0)continue;let x=S;x.userId=C,x.reportType="primary";for(let N of Object.keys(x.enumerators??{}))x.enumerators[N]=x.enumerators[N].length;E(x);let I=new Map,R=20;for(let[N,U]of Object.entries(x.values))U.length>0&&I.set(N,U.slice(0,R));for(;I.size>0;){let N={};N.userId=C,N.reportType="secondary",N.metrics={};for(let[U,K]of I)N.metrics[U]=K.shift(),K.length===0&&I.delete(U);E(N)}}}}return!0}applyChanges(){let t=this.getRegistryPath(),r;try{r=ae.readJsonSync(t)}catch{r={}}let s=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[s]=a[s]??{};for(let c of this.hits.keys()){let f=n.hits=n.hits??{},p=f[c]=f[c]??{};for(let[h,E]of this.hits.get(c))p[h]=(p[h]??0)+E}for(let c of["values","enumerators"])for(let f of this[c].keys()){let p=n[c]=n[c]??{};p[f]=[...new Set([...p[f]??[],...this[c].get(f)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),ae.mkdirSync(Y.dirname(t),{recursive:!0}),ae.writeJsonSync(t,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var Vv={};Vt(Vv,{BuildDirectiveType:()=>xR,CACHE_CHECKPOINT:()=>uG,CACHE_VERSION:()=>PR,Cache:()=>zr,Configuration:()=>Je,DEFAULT_RC_FILENAME:()=>fj,DurationUnit:()=>Aj,FormatType:()=>qAe,InstallMode:()=>La,LEGACY_PLUGINS:()=>nv,LOCKFILE_VERSION:()=>FR,LegacyMigrationResolver:()=>jI,LightReport:()=>fA,LinkType:()=>XE,LockfileResolver:()=>GI,Manifest:()=>_t,MessageName:()=>pr,MultiFetcher:()=>AI,PackageExtensionStatus:()=>H4,PackageExtensionType:()=>_4,PeerWarningType:()=>NR,Project:()=>Tt,Report:()=>Io,ReportError:()=>Lt,SettingsType:()=>DI,StreamReport:()=>Ft,TAG_REGEXP:()=>jp,TelemetryManager:()=>YI,ThrowReport:()=>Qi,VirtualFetcher:()=>pI,WindowsLinkType:()=>vT,Workspace:()=>qI,WorkspaceFetcher:()=>hI,WorkspaceResolver:()=>Ii,YarnVersion:()=>An,execUtils:()=>Yr,folderUtils:()=>_Q,formatUtils:()=>ue,hashUtils:()=>Mn,httpUtils:()=>nn,miscUtils:()=>qe,nodeUtils:()=>Ui,parseMessageName:()=>Vx,reportOptionDeprecations:()=>kI,scriptUtils:()=>wn,semverUtils:()=>kr,stringifyMessageName:()=>zf,structUtils:()=>H,tgzUtils:()=>ms,treeUtils:()=>ts});var Ge=Ze(()=>{IT();HQ();Tc();wd();mT();Qc();ET();Yj();Lp();$o();ode();pde();fG();iv();iv();gde();AG();mde();pG();fI();Kx();P8();Dde();Nc();gv();Pde();CG();k8();Q8();rm();wG();dv();Jae()});var Fde=G((T3t,Jv)=>{"use strict";var est=process.env.TERM_PROGRAM==="Hyper",tst=process.platform==="win32",Qde=process.platform==="linux",DG={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"},Tde=Object.assign({},DG,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),Rde=Object.assign({},DG,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Qde?"\u25B8":"\u276F",pointerSmall:Qde?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});Jv.exports=tst&&!est?Tde:Rde;Reflect.defineProperty(Jv.exports,"common",{enumerable:!1,value:DG});Reflect.defineProperty(Jv.exports,"windows",{enumerable:!1,value:Tde});Reflect.defineProperty(Jv.exports,"other",{enumerable:!1,value:Rde})});var Zu=G((R3t,PG)=>{"use strict";var rst=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),nst=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Nde=()=>{let e={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(e.enabled=process.env.FORCE_COLOR!=="0");let t=n=>{let c=n.open=`\x1B[${n.codes[0]}m`,f=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(f)&&(h=h.replace(p,f+c));let C=c+h+f;return E?C.replace(/\r*\n/g,`${f}$&${c}`):C},n},r=(n,c,f)=>typeof n=="function"?n(c):n.wrap(c,f),s=(n,c)=>{if(n===""||n==null)return"";if(e.enabled===!1)return n;if(e.visible===!1)return"";let f=""+n,p=f.includes(` +`),h=c.length;for(h>0&&c.includes("unstyle")&&(c=[...new Set(["unstyle",...c])].reverse());h-- >0;)f=r(e.styles[c[h]],f,p);return f},a=(n,c,f)=>{e.styles[n]=t({name:n,codes:c}),(e.keys[f]||(e.keys[f]=[])).push(n),Reflect.defineProperty(e,n,{configurable:!0,enumerable:!0,set(h){e.alias(n,h)},get(){let h=E=>s(E,h.stack);return Reflect.setPrototypeOf(h,e),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),e.ansiRegex=nst,e.hasColor=e.hasAnsi=n=>(e.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&e.ansiRegex.test(n)),e.alias=(n,c)=>{let f=typeof c=="string"?e[c]:c;if(typeof f!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");f.stack||(Reflect.defineProperty(f,"name",{value:n}),e.styles[n]=f,f.stack=[n]),Reflect.defineProperty(e,n,{configurable:!0,enumerable:!0,set(p){e.alias(n,p)},get(){let p=h=>s(h,p.stack);return Reflect.setPrototypeOf(p,e),p.stack=this.stack?this.stack.concat(f.stack):f.stack,p}})},e.theme=n=>{if(!rst(n))throw new TypeError("Expected theme to be an object");for(let c of Object.keys(n))e.alias(c,n[c]);return e},e.alias("unstyle",n=>typeof n=="string"&&n!==""?(e.ansiRegex.lastIndex=0,n.replace(e.ansiRegex,"")):""),e.alias("noop",n=>n),e.none=e.clear=e.noop,e.stripColor=e.unstyle,e.symbols=Fde(),e.define=a,e};PG.exports=Nde();PG.exports.create=Nde});var ia=G(hn=>{"use strict";var ist=Object.prototype.toString,jc=Zu(),Ode=!1,xG=[],Lde={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};hn.longest=(e,t)=>e.reduce((r,s)=>Math.max(r,t?s[t].length:s.length),0);hn.hasColor=e=>!!e&&jc.hasColor(e);var LR=hn.isObject=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);hn.nativeType=e=>ist.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"");hn.isAsyncFn=e=>hn.nativeType(e)==="asyncfunction";hn.isPrimitive=e=>e!=null&&typeof e!="object"&&typeof e!="function";hn.resolve=(e,t,...r)=>typeof t=="function"?t.call(e,...r):t;hn.scrollDown=(e=[])=>[...e.slice(1),e[0]];hn.scrollUp=(e=[])=>[e.pop(),...e];hn.reorder=(e=[])=>{let t=e.slice();return t.sort((r,s)=>r.index>s.index?1:r.index{let s=e.length,a=r===s?0:r<0?s-1:r,n=e[t];e[t]=e[a],e[a]=n};hn.width=(e,t=80)=>{let r=e&&e.columns?e.columns:t;return e&&typeof e.getWindowSize=="function"&&(r=e.getWindowSize()[0]),process.platform==="win32"?r-1:r};hn.height=(e,t=20)=>{let r=e&&e.rows?e.rows:t;return e&&typeof e.getWindowSize=="function"&&(r=e.getWindowSize()[1]),r};hn.wordWrap=(e,t={})=>{if(!e)return e;typeof t=="number"&&(t={width:t});let{indent:r="",newline:s=` +`+r,width:a=80}=t,n=(s+r).match(/[^\S\n]/g)||[];a-=n.length;let c=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,f=e.trim(),p=new RegExp(c,"g"),h=f.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),t.padEnd&&(h=h.map(E=>E.padEnd(a," "))),t.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(s)};hn.unmute=e=>{let t=e.stack.find(s=>jc.keys.color.includes(s));return t?jc[t]:e.stack.find(s=>s.slice(2)==="bg")?jc[t.slice(2)]:s=>s};hn.pascal=e=>e?e[0].toUpperCase()+e.slice(1):"";hn.inverse=e=>{if(!e||!e.stack)return e;let t=e.stack.find(s=>jc.keys.color.includes(s));if(t){let s=jc["bg"+hn.pascal(t)];return s?s.black:e}let r=e.stack.find(s=>s.slice(0,2)==="bg");return r?jc[r.slice(2).toLowerCase()]||e:jc.none};hn.complement=e=>{if(!e||!e.stack)return e;let t=e.stack.find(s=>jc.keys.color.includes(s)),r=e.stack.find(s=>s.slice(0,2)==="bg");if(t&&!r)return jc[Lde[t]||t];if(r){let s=r.slice(2).toLowerCase(),a=Lde[s];return a&&jc["bg"+hn.pascal(a)]||e}return jc.none};hn.meridiem=e=>{let t=e.getHours(),r=e.getMinutes(),s=t>=12?"pm":"am";t=t%12;let a=t===0?12:t,n=r<10?"0"+r:r;return a+":"+n+" "+s};hn.set=(e={},t="",r)=>t.split(".").reduce((s,a,n,c)=>{let f=c.length-1>n?s[a]||{}:r;return!hn.isObject(f)&&n{let s=e[t]==null?t.split(".").reduce((a,n)=>a&&a[n],e):e[t];return s??r};hn.mixin=(e,t)=>{if(!LR(e))return t;if(!LR(t))return e;for(let r of Object.keys(t)){let s=Object.getOwnPropertyDescriptor(t,r);if(s.hasOwnProperty("value"))if(e.hasOwnProperty(r)&&LR(s.value)){let a=Object.getOwnPropertyDescriptor(e,r);LR(a.value)?e[r]=hn.merge({},e[r],t[r]):Reflect.defineProperty(e,r,s)}else Reflect.defineProperty(e,r,s);else Reflect.defineProperty(e,r,s)}return e};hn.merge=(...e)=>{let t={};for(let r of e)hn.mixin(t,r);return t};hn.mixinEmitter=(e,t)=>{let r=t.constructor.prototype;for(let s of Object.keys(r)){let a=r[s];typeof a=="function"?hn.define(e,s,a.bind(t)):hn.define(e,s,a)}};hn.onExit=e=>{let t=(r,s)=>{Ode||(Ode=!0,xG.forEach(a=>a()),r===!0&&process.exit(128+s))};xG.length===0&&(process.once("SIGTERM",t.bind(null,!0,15)),process.once("SIGINT",t.bind(null,!0,2)),process.once("exit",t)),xG.push(e)};hn.define=(e,t,r)=>{Reflect.defineProperty(e,t,{value:r})};hn.defineExport=(e,t,r)=>{let s;Reflect.defineProperty(e,t,{enumerable:!0,configurable:!0,set(a){s=a},get(){return s?s():r()}})}});var Mde=G(JI=>{"use strict";JI.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"};JI.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};JI.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};JI.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};JI.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 Hde=G((O3t,_de)=>{"use strict";var Ude=Ce("readline"),sst=Mde(),ost=/^(?:\x1b)([a-zA-Z0-9])$/,ast=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,lst={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 cst(e){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(e)}function ust(e){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(e)}var MR=(e="",t={})=>{let r,s={name:t.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:e,raw:e,...t};if(Buffer.isBuffer(e)?e[0]>127&&e[1]===void 0?(e[0]-=128,e="\x1B"+String(e)):e=String(e):e!==void 0&&typeof e!="string"?e=String(e):e||(e=s.sequence||""),s.sequence=s.sequence||e||s.name,e==="\r")s.raw=void 0,s.name="return";else if(e===` +`)s.name="enter";else if(e===" ")s.name="tab";else if(e==="\b"||e==="\x7F"||e==="\x1B\x7F"||e==="\x1B\b")s.name="backspace",s.meta=e.charAt(0)==="\x1B";else if(e==="\x1B"||e==="\x1B\x1B")s.name="escape",s.meta=e.length===2;else if(e===" "||e==="\x1B ")s.name="space",s.meta=e.length===2;else if(e<="")s.name=String.fromCharCode(e.charCodeAt(0)+97-1),s.ctrl=!0;else if(e.length===1&&e>="0"&&e<="9")s.name="number";else if(e.length===1&&e>="a"&&e<="z")s.name=e;else if(e.length===1&&e>="A"&&e<="Z")s.name=e.toLowerCase(),s.shift=!0;else if(r=ost.exec(e))s.meta=!0,s.shift=/^[A-Z]$/.test(r[1]);else if(r=ast.exec(e)){let a=[...e];a[0]==="\x1B"&&a[1]==="\x1B"&&(s.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),c=(r[3]||r[5]||1)-1;s.ctrl=!!(c&4),s.meta=!!(c&10),s.shift=!!(c&1),s.code=n,s.name=lst[n],s.shift=cst(n)||s.shift,s.ctrl=ust(n)||s.ctrl}return s};MR.listen=(e={},t)=>{let{stdin:r}=e;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let s=Ude.createInterface({terminal:!0,input:r});Ude.emitKeypressEvents(r,s);let a=(f,p)=>t(f,MR(f,p),s),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),s.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),s.pause(),s.close()}};MR.action=(e,t,r)=>{let s={...sst,...r};return t.ctrl?(t.action=s.ctrl[t.name],t):t.option&&s.option?(t.action=s.option[t.name],t):t.shift?(t.action=s.shift[t.name],t):(t.action=s.keys[t.name],t)};_de.exports=MR});var Gde=G((L3t,jde)=>{"use strict";jde.exports=e=>{e.timers=e.timers||{};let t=e.options.timers;if(t)for(let r of Object.keys(t)){let s=t[r];typeof s=="number"&&(s={interval:s}),fst(e,r,s)}};function fst(e,t,r={}){let s=e.timers[t]={name:t,start:Date.now(),ms:0,tick:0},a=r.interval||120;s.frames=r.frames||[],s.loading=!0;let n=setInterval(()=>{s.ms=Date.now()-s.start,s.tick++,e.render()},a);return s.stop=()=>{s.loading=!1,clearInterval(n)},Reflect.defineProperty(s,"interval",{value:n}),e.once("close",()=>s.stop()),s.stop}});var Yde=G((M3t,qde)=>{"use strict";var{define:Ast,width:pst}=ia(),kG=class{constructor(t){let r=t.options;Ast(this,"_prompt",t),this.type=t.type,this.name=t.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=pst(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=t.symbols,this.styles=t.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let t={...this};return t.status=this.status,t.buffer=Buffer.from(t.buffer),delete t.clone,t}set color(t){this._color=t}get color(){let t=this.prompt.styles;if(this.cancelled)return t.cancelled;if(this.submitted)return t.submitted;let r=this._color||t[this.status];return typeof r=="function"?r:t.pending}set loading(t){this._loading=t}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};qde.exports=kG});var Vde=G((U3t,Wde)=>{"use strict";var QG=ia(),wo=Zu(),TG={default:wo.noop,noop:wo.noop,set inverse(e){this._inverse=e},get inverse(){return this._inverse||QG.inverse(this.primary)},set complement(e){this._complement=e},get complement(){return this._complement||QG.complement(this.primary)},primary:wo.cyan,success:wo.green,danger:wo.magenta,strong:wo.bold,warning:wo.yellow,muted:wo.dim,disabled:wo.gray,dark:wo.dim.gray,underline:wo.underline,set info(e){this._info=e},get info(){return this._info||this.primary},set em(e){this._em=e},get em(){return this._em||this.primary.underline},set heading(e){this._heading=e},get heading(){return this._heading||this.muted.underline},set pending(e){this._pending=e},get pending(){return this._pending||this.primary},set submitted(e){this._submitted=e},get submitted(){return this._submitted||this.success},set cancelled(e){this._cancelled=e},get cancelled(){return this._cancelled||this.danger},set typing(e){this._typing=e},get typing(){return this._typing||this.dim},set placeholder(e){this._placeholder=e},get placeholder(){return this._placeholder||this.primary.dim},set highlight(e){this._highlight=e},get highlight(){return this._highlight||this.inverse}};TG.merge=(e={})=>{e.styles&&typeof e.styles.enabled=="boolean"&&(wo.enabled=e.styles.enabled),e.styles&&typeof e.styles.visible=="boolean"&&(wo.visible=e.styles.visible);let t=QG.merge({},TG,e.styles);delete t.merge;for(let r of Object.keys(wo))t.hasOwnProperty(r)||Reflect.defineProperty(t,r,{get:()=>wo[r]});for(let r of Object.keys(wo.styles))t.hasOwnProperty(r)||Reflect.defineProperty(t,r,{get:()=>wo[r]});return t};Wde.exports=TG});var Jde=G((_3t,Kde)=>{"use strict";var RG=process.platform==="win32",Zp=Zu(),hst=ia(),FG={...Zp.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Zp.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:Zp.symbols.question,submitted:Zp.symbols.check,cancelled:Zp.symbols.cross},separator:{pending:Zp.symbols.pointerSmall,submitted:Zp.symbols.middot,cancelled:Zp.symbols.middot},radio:{off:RG?"( )":"\u25EF",on:RG?"(*)":"\u25C9",disabled:RG?"(|)":"\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"]};FG.merge=e=>{let t=hst.merge({},Zp.symbols,FG,e.symbols);return delete t.merge,t};Kde.exports=FG});var Zde=G((H3t,zde)=>{"use strict";var dst=Vde(),gst=Jde(),mst=ia();zde.exports=e=>{e.options=mst.merge({},e.options.theme,e.options),e.symbols=gst.merge(e.options),e.styles=dst.merge(e.options)}});var rge=G((ege,tge)=>{"use strict";var Xde=process.env.TERM_PROGRAM==="Apple_Terminal",yst=Zu(),NG=ia(),Xu=tge.exports=ege,_i="\x1B[",$de="\x07",OG=!1,qd=Xu.code={bell:$de,beep:$de,beginning:`${_i}G`,down:`${_i}J`,esc:_i,getPosition:`${_i}6n`,hide:`${_i}?25l`,line:`${_i}2K`,lineEnd:`${_i}K`,lineStart:`${_i}1K`,restorePosition:_i+(Xde?"8":"u"),savePosition:_i+(Xde?"7":"s"),screen:`${_i}2J`,show:`${_i}?25h`,up:`${_i}1J`},Pm=Xu.cursor={get hidden(){return OG},hide(){return OG=!0,qd.hide},show(){return OG=!1,qd.show},forward:(e=1)=>`${_i}${e}C`,backward:(e=1)=>`${_i}${e}D`,nextLine:(e=1)=>`${_i}E`.repeat(e),prevLine:(e=1)=>`${_i}F`.repeat(e),up:(e=1)=>e?`${_i}${e}A`:"",down:(e=1)=>e?`${_i}${e}B`:"",right:(e=1)=>e?`${_i}${e}C`:"",left:(e=1)=>e?`${_i}${e}D`:"",to(e,t){return t?`${_i}${t+1};${e+1}H`:`${_i}${e+1}G`},move(e=0,t=0){let r="";return r+=e<0?Pm.left(-e):e>0?Pm.right(e):"",r+=t<0?Pm.up(-t):t>0?Pm.down(t):"",r},restore(e={}){let{after:t,cursor:r,initial:s,input:a,prompt:n,size:c,value:f}=e;if(s=NG.isPrimitive(s)?String(s):"",a=NG.isPrimitive(a)?String(a):"",f=NG.isPrimitive(f)?String(f):"",c){let p=Xu.cursor.up(c)+Xu.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Xu.cursor.left(h)),p}if(f||t){let p=!a&&s?-s.length:-a.length+r;return t&&(p-=t.length),a===""&&s&&!n.includes(s)&&(p+=s.length),Xu.cursor.move(p)}}},LG=Xu.erase={screen:qd.screen,up:qd.up,down:qd.down,line:qd.line,lineEnd:qd.lineEnd,lineStart:qd.lineStart,lines(e){let t="";for(let r=0;r{if(!t)return LG.line+Pm.to(0);let r=n=>[...yst.unstyle(n)].length,s=e.split(/\r?\n/),a=0;for(let n of s)a+=1+Math.floor(Math.max(r(n)-1,0)/t);return(LG.line+Pm.prevLine()).repeat(a-1)+LG.line+Pm.to(0)}});var zI=G((j3t,ige)=>{"use strict";var Est=Ce("events"),nge=Zu(),MG=Hde(),Ist=Gde(),Cst=Yde(),wst=Zde(),Cl=ia(),xm=rge(),UG=class e extends Est{constructor(t={}){super(),this.name=t.name,this.type=t.type,this.options=t,wst(this),Ist(this),this.state=new Cst(this),this.initial=[t.initial,t.default].find(r=>r!=null),this.stdout=t.stdout||process.stdout,this.stdin=t.stdin||process.stdin,this.scale=t.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=vst(this.options.margin),this.setMaxListeners(0),Bst(this)}async keypress(t,r={}){this.keypressed=!0;let s=MG.action(t,MG(t,r),this.options.actions);this.state.keypress=s,this.emit("keypress",t,s),this.emit("state",this.state.clone());let a=this.options[s.action]||this[s.action]||this.dispatch;if(typeof a=="function")return await a.call(this,t,s);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(xm.code.beep)}cursorHide(){this.stdout.write(xm.cursor.hide()),Cl.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(xm.cursor.show())}write(t){t&&(this.stdout&&this.state.show!==!1&&this.stdout.write(t),this.state.buffer+=t)}clear(t=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!t||this.options.show===!1)&&this.stdout.write(xm.cursor.down(t)+xm.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:t,after:r,rest:s}=this.sections(),{cursor:a,initial:n="",input:c="",value:f=""}=this,p=this.state.size=s.length,h={after:r,cursor:a,initial:n,input:c,prompt:t,size:p,value:f},E=xm.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:t,input:r,prompt:s}=this.state;s=nge.unstyle(s);let a=nge.unstyle(t),n=a.indexOf(s),c=a.slice(0,n),p=a.slice(n).split(` +`),h=p[0],E=p[p.length-1],S=(s+(r?" "+r:"")).length,x=St.call(this,this.value),this.result=()=>s.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 a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(t,r)=>{if(this.once("submit",t),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(t,r,s){let{options:a,state:n,symbols:c,timers:f}=this,p=f&&f[t];n.timer=p;let h=a[t]||n[t]||c[t],E=r&&r[t]!=null?r[t]:await h;if(E==="")return E;let C=await this.resolve(E,n,r,s);return!C&&r&&r[t]?this.resolve(h,n,r,s):C}async prefix(){let t=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,s=this.state;return s.timer=r,Cl.isObject(t)&&(t=t[s.status]||t.pending),Cl.hasColor(t)?t:(this.styles[s.status]||this.styles.pending)(t)}async message(){let t=await this.element("message");return Cl.hasColor(t)?t:this.styles.strong(t)}async separator(){let t=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,s=this.state;s.timer=r;let a=t[s.status]||t.pending||s.separator,n=await this.resolve(a,s);return Cl.isObject(n)&&(n=n[s.status]||n.pending),Cl.hasColor(n)?n:this.styles.muted(n)}async pointer(t,r){let s=await this.element("pointer",t,r);if(typeof s=="string"&&Cl.hasColor(s))return s;if(s){let a=this.styles,n=this.index===r,c=n?a.primary:h=>h,f=await this.resolve(s[n?"on":"off"]||s,this.state),p=Cl.hasColor(f)?f:c(f);return n?p:" ".repeat(f.length)}}async indicator(t,r){let s=await this.element("indicator",t,r);if(typeof s=="string"&&Cl.hasColor(s))return s;if(s){let a=this.styles,n=t.enabled===!0,c=n?a.success:a.dark,f=s[n?"on":"off"]||s;return Cl.hasColor(f)?f:c(f)}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 t=await this.element("hint");return Cl.hasColor(t)?t:this.styles.muted(t)}}error(t){return this.state.submitted?"":t||this.state.error}format(t){return t}result(t){return t}validate(t){return this.options.required===!0?this.isValue(t):!0}isValue(t){return t!=null&&t!==""}resolve(t,...r){return Cl.resolve(this,t,...r)}get base(){return e.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Cl.height(this.stdout,25)}get width(){return this.options.columns||Cl.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(t){this.state.cursor=t}get cursor(){return this.state.cursor}set input(t){this.state.input=t}get input(){return this.state.input}set value(t){this.state.value=t}get value(){let{input:t,value:r}=this.state,s=[r,t].find(this.isValue.bind(this));return this.isValue(s)?s:this.initial}static get prompt(){return t=>new this(t).run()}};function Bst(e){let t=a=>e[a]===void 0||typeof e[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],s=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(e.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=e.options[a];typeof n=="function"&&t(a)?s.includes(a)||(e[a]=n.bind(e)):typeof e[a]!="function"&&(e[a]=n)}}function vst(e){typeof e=="number"&&(e=[e,e,e,e]);let t=[].concat(e||[]),r=a=>a%2===0?` +`:" ",s=[];for(let a=0;a<4;a++){let n=r(a);t[a]?s.push(n.repeat(t[a])):s.push("")}return s}ige.exports=UG});var age=G((G3t,oge)=>{"use strict";var Sst=ia(),sge={default(e,t){return t},checkbox(e,t){throw new Error("checkbox role is not implemented yet")},editable(e,t){throw new Error("editable role is not implemented yet")},expandable(e,t){throw new Error("expandable role is not implemented yet")},heading(e,t){return t.disabled="",t.indicator=[t.indicator," "].find(r=>r!=null),t.message=t.message||"",t},input(e,t){throw new Error("input role is not implemented yet")},option(e,t){return sge.default(e,t)},radio(e,t){throw new Error("radio role is not implemented yet")},separator(e,t){return t.disabled="",t.indicator=[t.indicator," "].find(r=>r!=null),t.message=t.message||e.symbols.line.repeat(5),t},spacer(e,t){return t}};oge.exports=(e,t={})=>{let r=Sst.merge({},sge,t.roles);return r[e]||r.default}});var zv=G((q3t,uge)=>{"use strict";var bst=Zu(),Dst=zI(),Pst=age(),UR=ia(),{reorder:_G,scrollUp:xst,scrollDown:kst,isObject:lge,swap:Qst}=UR,HG=class extends Dst{constructor(t){super(t),this.cursorHide(),this.maxSelected=t.maxSelected||1/0,this.multiple=t.multiple||!1,this.initial=t.initial||0,this.delay=t.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:t,initial:r,autofocus:s,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(t)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");lge(r)&&(r=Object.keys(r)),Array.isArray(r)?(s!=null&&(this.index=this.findIndex(s)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(s!=null&&(r=s),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(t,r){this.state.loadingChoices=!0;let s=[],a=0,n=async(c,f)=>{typeof c=="function"&&(c=await c.call(this)),c instanceof Promise&&(c=await c);for(let p=0;p(this.state.loadingChoices=!1,c))}async toChoice(t,r,s){if(typeof t=="function"&&(t=await t.call(this,this)),t instanceof Promise&&(t=await t),typeof t=="string"&&(t={name:t}),t.normalized)return t;t.normalized=!0;let a=t.value;if(t=Pst(t.role,this.options)(this,t),typeof t.disabled=="string"&&!t.hint&&(t.hint=t.disabled,t.disabled=!0),t.disabled===!0&&t.hint==null&&(t.hint="(disabled)"),t.index!=null)return t;t.name=t.name||t.key||t.title||t.value||t.message,t.message=t.message||t.name||"",t.value=[t.value,t.name].find(this.isValue.bind(this)),t.input="",t.index=r,t.cursor=0,UR.define(t,"parent",s),t.level=s?s.level+1:1,t.indent==null&&(t.indent=s?s.indent+" ":t.indent||""),t.path=s?s.path+"."+t.name:t.name,t.enabled=!!(this.multiple&&!this.isDisabled(t)&&(t.enabled||this.isSelected(t))),this.isDisabled(t)||(this.longest=Math.max(this.longest,bst.unstyle(t.message).length));let c={...t};return t.reset=(f=c.input,p=c.value)=>{for(let h of Object.keys(c))t[h]=c[h];t.input=f,t.value=p},a==null&&typeof t.initial=="function"&&(t.input=await t.initial.call(this,this.state,t,r)),t}async onChoice(t,r){this.emit("choice",t,r,this),typeof t.onChoice=="function"&&await t.onChoice.call(this,this.state,t,r)}async addChoice(t,r,s){let a=await this.toChoice(t,r,s);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(t,r,s){let a={name:"New choice name?",editable:!0,newChoice:!0,...t},n=await this.addChoice(a,r,s);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(t){return t.indent==null?t.level>1?" ".repeat(t.level-1):"":t.indent}dispatch(t,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(t,r){return typeof r!="boolean"&&(r=t.enabled),r&&!t.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=t.index,t.enabled=r&&!this.isDisabled(t),t)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!t),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(t=>t.enabled=!t.enabled),this.render())}g(t=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(t.parent&&!t.choices?t.parent:t),this.render()):this.a()}toggle(t,r){if(!t.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!t.enabled),t.enabled=r,t.choices&&t.choices.forEach(a=>this.toggle(a,r));let s=t.parent;for(;s;){let a=s.choices.filter(n=>this.isDisabled(n));s.enabled=a.every(n=>n.enabled===!0),s=s.parent}return cge(this,this.choices),this.emit("toggle",t,this),t}enable(t){return this.selected.length>=this.maxSelected?this.alert():(t.enabled=!this.isDisabled(t),t.choices&&t.choices.forEach(this.enable.bind(this)),t)}disable(t){return t.enabled=!1,t.choices&&t.choices.forEach(this.disable.bind(this)),t}number(t){this.num+=t;let r=s=>{let a=Number(s);if(a>this.choices.length-1)return this.alert();let n=this.focused,c=this.choices.find(f=>a===f.index);if(!c.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(c)===-1){let f=_G(this.choices),p=f.indexOf(c);if(n.index>p){let h=f.slice(p,p+this.limit),E=f.filter(C=>!h.includes(C));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=f.slice(h).concat(f.slice(0,h))}}return this.index=this.choices.indexOf(c),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(s=>{let a=this.choices.length,n=this.num,c=(f=!1,p)=>{clearTimeout(this.numberTimeout),f&&(p=r(n)),this.num="",s(p)};if(n==="0"||n.length===1&&+(n+"0")>a)return c(!0);if(Number(n)>a)return c(!1,this.alert());this.numberTimeout=setTimeout(()=>c(!0),this.delay)})}home(){return this.choices=_G(this.choices),this.index=0,this.render()}end(){let t=this.choices.length-this.limit,r=_G(this.choices);return this.choices=r.slice(t).concat(r.slice(0,t)),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 t=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===0?this.alert():t>r&&s===0?this.scrollUp():(this.index=(s-1%t+t)%t,this.isDisabled()?this.up():this.render())}down(){let t=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===r-1?this.alert():t>r&&s===r-1?this.scrollDown():(this.index=(s+1)%t,this.isDisabled()?this.down():this.render())}scrollUp(t=0){return this.choices=xst(this.choices),this.index=t,this.isDisabled()?this.up():this.render()}scrollDown(t=this.visible.length-1){return this.choices=kst(this.choices),this.index=t,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(t){Qst(this.choices,this.index,t)}isDisabled(t=this.focused){return t&&["disabled","collapsed","hidden","completing","readonly"].some(s=>t[s]===!0)?!0:t&&t.role==="heading"}isEnabled(t=this.focused){if(Array.isArray(t))return t.every(r=>this.isEnabled(r));if(t.choices){let r=t.choices.filter(s=>!this.isDisabled(s));return t.enabled&&r.every(s=>this.isEnabled(s))}return t.enabled&&!this.isDisabled(t)}isChoice(t,r){return t.name===r||t.index===Number(r)}isSelected(t){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(t,r)):this.isChoice(t,this.initial)}map(t=[],r="value"){return[].concat(t||[]).reduce((s,a)=>(s[a]=this.find(a,r),s),{})}filter(t,r){let a=typeof t=="function"?t:(f,p)=>[f.name,p].includes(t),c=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?c.map(f=>f[r]):c}find(t,r){if(lge(t))return r?t[r]:t;let a=typeof t=="function"?t:(c,f)=>[c.name,f].includes(t),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(t){return this.choices.indexOf(this.find(t))}async submit(){let t=this.focused;if(!t)return this.alert();if(t.newChoice)return t.input?(t.updateChoice(),this.render()):this.alert();if(this.choices.some(c=>c.newChoice))return this.alert();let{reorder:r,sort:s}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&s!==!0&&(n=UR.reorder(n)),this.value=a?n.map(c=>c.name):n.name,super.submit())}set choices(t=[]){this.state._choices=this.state._choices||[],this.state.choices=t;for(let r of t)this.state._choices.some(s=>s.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 s=this.find(r);s&&(this.initial=s.index,this.focus(s,!0))}}}get choices(){return cge(this,this.state.choices||[])}set visible(t){this.state.visible=t}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(t){this.state.limit=t}get limit(){let{state:t,options:r,choices:s}=this,a=t.limit||this._limit||r.limit||s.length;return Math.min(a,this.height)}set value(t){super.value=t}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(t){this.state.index=t}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let t=this.choices[this.index];return t&&this.state.submitted&&this.multiple!==!0&&(t.enabled=!0),t}get selectable(){return this.choices.filter(t=>!this.isDisabled(t))}get selected(){return this.multiple?this.enabled:this.focused}};function cge(e,t){if(t instanceof Promise)return t;if(typeof t=="function"){if(UR.isAsyncFn(t))return t;t=t.call(e,e)}for(let r of t){if(Array.isArray(r.choices)){let s=r.choices.filter(a=>!e.isDisabled(a));r.enabled=s.every(a=>a.enabled===!0)}e.isDisabled(r)===!0&&delete r.enabled}return t}uge.exports=HG});var Yd=G((Y3t,fge)=>{"use strict";var Tst=zv(),jG=ia(),GG=class extends Tst{constructor(t){super(t),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(t,r){if(this.multiple)return this[r.name]?await this[r.name](t,r):await super.dispatch(t,r);this.alert()}separator(){if(this.options.separator)return super.separator();let t=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():t}pointer(t,r){return!this.multiple||this.options.pointer?super.pointer(t,r):""}indicator(t,r){return this.multiple?super.indicator(t,r):""}choiceMessage(t,r){let s=this.resolve(t.message,this.state,t,r);return t.role==="heading"&&!jG.hasColor(s)&&(s=this.styles.strong(s)),this.resolve(s,this.state,t,r)}choiceSeparator(){return":"}async renderChoice(t,r){await this.onChoice(t,r);let s=this.index===r,a=await this.pointer(t,r),n=await this.indicator(t,r)+(t.pad||""),c=await this.resolve(t.hint,this.state,t,r);c&&!jG.hasColor(c)&&(c=this.styles.muted(c));let f=this.indent(t),p=await this.choiceMessage(t,r),h=()=>[this.margin[3],f+a+n,p,this.margin[1],c].filter(Boolean).join(" ");return t.role==="heading"?h():t.disabled?(jG.hasColor(p)||(p=this.styles.disabled(p)),h()):(s&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let t=this.visible.map(async(n,c)=>await this.renderChoice(n,c)),r=await Promise.all(t);r.length||r.push(this.styles.danger("No matching choices"));let s=this.margin[0]+r.join(` +`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,s].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(t=>this.styles.primary(t.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:t,size:r}=this.state,s="",a=await this.header(),n=await this.prefix(),c=await this.separator(),f=await this.message();this.options.promptLine!==!1&&(s=[n,f,c,""].join(" "),this.state.prompt=s);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();p&&(s+=p),h&&!s.includes(h)&&(s+=" "+h),t&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(s+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,s,E,C].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};fge.exports=GG});var pge=G((W3t,Age)=>{"use strict";var Rst=Yd(),Fst=(e,t)=>{let r=e.toLowerCase();return s=>{let n=s.toLowerCase().indexOf(r),c=t(s.slice(n,n+r.length));return n>=0?s.slice(0,n)+c+s.slice(n+r.length):s}},qG=class extends Rst{constructor(t){super(t),this.cursorShow()}moveCursor(t){this.state.cursor+=t}dispatch(t){return this.append(t)}space(t){return this.options.multiple?super.space(t):this.append(t)}append(t){let{cursor:r,input:s}=this.state;return this.input=s.slice(0,r)+t+s.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:t,input:r}=this.state;return r?(this.input=r.slice(0,t-1)+r.slice(t),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:t,input:r}=this.state;return r[t]===void 0?this.alert():(this.input=`${r}`.slice(0,t)+`${r}`.slice(t+1),this.complete())}number(t){return this.append(t)}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(t=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,t,r);let s=t.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(s))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(t=>this.styles.primary(t.message)).join(", ");if(this.state.submitted){let t=this.value=this.input=this.focused.value;return this.styles.primary(t)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let t=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=Fst(this.input,t),s=this.choices;this.choices=s.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=s}submit(){return this.options.multiple&&(this.value=this.selected.map(t=>t.name)),super.submit()}};Age.exports=qG});var WG=G((V3t,hge)=>{"use strict";var YG=ia();hge.exports=(e,t={})=>{e.cursorHide();let{input:r="",initial:s="",pos:a,showCursor:n=!0,color:c}=t,f=c||e.styles.placeholder,p=YG.inverse(e.styles.primary),h=R=>p(e.styles.black(R)),E=r,C=" ",S=h(C);if(e.blink&&e.blink.off===!0&&(h=R=>R,S=""),n&&a===0&&s===""&&r==="")return h(C);if(n&&a===0&&(r===s||r===""))return h(s[0])+f(s.slice(1));s=YG.isPrimitive(s)?`${s}`:"",r=YG.isPrimitive(r)?`${r}`:"";let x=s&&s.startsWith(r)&&s!==r,I=x?h(s[r.length]):S;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),I=""),n===!1&&(I=""),x){let R=e.styles.unstyle(E+I);return E+I+f(s.slice(R.length))}return E+I}});var _R=G((K3t,dge)=>{"use strict";var Nst=Zu(),Ost=Yd(),Lst=WG(),VG=class extends Ost{constructor(t){super({...t,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(t){return await super.reset(),t===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(t){return!!t&&this.append(t)}append(t){let r=this.focused;if(!r)return this.alert();let{cursor:s,input:a}=r;return r.value=r.input=a.slice(0,s)+t+a.slice(s),r.cursor++,this.render()}delete(){let t=this.focused;if(!t||t.cursor<=0)return this.alert();let{cursor:r,input:s}=t;return t.value=t.input=s.slice(0,r-1)+s.slice(r),t.cursor--,this.render()}deleteForward(){let t=this.focused;if(!t)return this.alert();let{cursor:r,input:s}=t;if(s[r]===void 0)return this.alert();let a=`${s}`.slice(0,r)+`${s}`.slice(r+1);return t.value=t.input=a,this.render()}right(){let t=this.focused;return t?t.cursor>=t.input.length?this.alert():(t.cursor++,this.render()):this.alert()}left(){let t=this.focused;return t?t.cursor<=0?this.alert():(t.cursor--,this.render()):this.alert()}space(t,r){return this.dispatch(t,r)}number(t,r){return this.dispatch(t,r)}next(){let t=this.focused;if(!t)return this.alert();let{initial:r,input:s}=t;return r&&r.startsWith(s)&&s!==r?(t.value=t.input=r,t.cursor=t.value.length,this.render()):super.next()}prev(){let t=this.focused;return t?t.cursor===0?super.prev():(t.value=t.input="",t.cursor=0,this.render()):this.alert()}separator(){return""}format(t){return this.state.submitted?"":super.format(t)}pointer(){return""}indicator(t){return t.input?"\u29BF":"\u2299"}async choiceSeparator(t,r){let s=await this.resolve(t.separator,this.state,t,r)||":";return s?" "+this.styles.disabled(s):""}async renderChoice(t,r){await this.onChoice(t,r);let{state:s,styles:a}=this,{cursor:n,initial:c="",name:f,hint:p,input:h=""}=t,{muted:E,submitted:C,primary:S,danger:x}=a,I=p,R=this.index===r,N=t.validate||(()=>!0),U=await this.choiceSeparator(t,r),K=t.message;this.align==="right"&&(K=K.padStart(this.longest+1," ")),this.align==="left"&&(K=K.padEnd(this.longest+1," "));let $=this.values[f]=h||c,ie=h?"success":"dark";await N.call(t,$,this.state)!==!0&&(ie="danger");let fe=a[ie],le=fe(await this.indicator(t,r))+(t.pad||""),ge=this.indent(t),pe=()=>[ge,le,K+U,h,I].filter(Boolean).join(" ");if(s.submitted)return K=Nst.unstyle(K),h=C(h),I="",pe();if(t.format)h=await t.format.call(this,h,t,r);else{let De=this.styles.muted;h=Lst(this,{input:h,initial:c,pos:n,showCursor:R,color:De})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),t.result&&(this.values[f]=await t.result.call(this,$,t,r)),R&&(K=S(K)),t.error?h+=(h?" ":"")+x(t.error.trim()):t.hint&&(h+=(h?" ":"")+E(t.hint.trim())),pe()}async submit(){return this.value=this.values,super.base.submit.call(this)}};dge.exports=VG});var KG=G((J3t,mge)=>{"use strict";var Mst=_R(),Ust=()=>{throw new Error("expected prompt to have a custom authenticate method")},gge=(e=Ust)=>{class t extends Mst{constructor(s){super(s)}async submit(){this.value=await e.call(this,this.values,this.state),super.base.submit.call(this)}static create(s){return gge(s)}}return t};mge.exports=gge()});var Ige=G((z3t,Ege)=>{"use strict";var _st=KG();function Hst(e,t){return e.username===this.options.username&&e.password===this.options.password}var yge=(e=Hst)=>{let t=[{name:"username",message:"username"},{name:"password",message:"password",format(s){return this.options.showPassword?s:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(s.length))}}];class r extends _st.create(e){constructor(a){super({...a,choices:t})}static create(a){return yge(a)}}return r};Ege.exports=yge()});var HR=G((Z3t,Cge)=>{"use strict";var jst=zI(),{isPrimitive:Gst,hasColor:qst}=ia(),JG=class extends jst{constructor(t){super(t),this.cursorHide()}async initialize(){let t=await this.resolve(this.initial,this.state);this.input=await this.cast(t),await super.initialize()}dispatch(t){return this.isValue(t)?(this.input=t,this.submit()):this.alert()}format(t){let{styles:r,state:s}=this;return s.submitted?r.success(t):r.primary(t)}cast(t){return this.isTrue(t)}isTrue(t){return/^[ty1]/i.test(t)}isFalse(t){return/^[fn0]/i.test(t)}isValue(t){return Gst(t)&&(this.isTrue(t)||this.isFalse(t))}async hint(){if(this.state.status==="pending"){let t=await this.element("hint");return qst(t)?t:this.styles.muted(t)}}async render(){let{input:t,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=this.styles.muted(this.default),f=[s,n,c,a].filter(Boolean).join(" ");this.state.prompt=f;let p=await this.header(),h=this.value=this.cast(t),E=await this.format(h),C=await this.error()||await this.hint(),S=await this.footer();C&&!f.includes(C)&&(E+=" "+C),f+=" "+E,this.clear(r),this.write([p,f,S].filter(Boolean).join(` +`)),this.restore()}set value(t){super.value=t}get value(){return this.cast(super.value)}};Cge.exports=JG});var Bge=G((X3t,wge)=>{"use strict";var Yst=HR(),zG=class extends Yst{constructor(t){super(t),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};wge.exports=zG});var Sge=G(($3t,vge)=>{"use strict";var Wst=Yd(),Vst=_R(),ZI=Vst.prototype,ZG=class extends Wst{constructor(t){super({...t,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(t,r){let s=this.focused,a=s.parent||{};return!s.editable&&!a.editable&&(t==="a"||t==="i")?super[t]():ZI.dispatch.call(this,t,r)}append(t,r){return ZI.append.call(this,t,r)}delete(t,r){return ZI.delete.call(this,t,r)}space(t){return this.focused.editable?this.append(t):super.space()}number(t){return this.focused.editable?this.append(t):super.number(t)}next(){return this.focused.editable?ZI.next.call(this):super.next()}prev(){return this.focused.editable?ZI.prev.call(this):super.prev()}async indicator(t,r){let s=t.indicator||"",a=t.editable?s:super.indicator(t,r);return await this.resolve(a,this.state,t,r)||""}indent(t){return t.role==="heading"?"":t.editable?" ":" "}async renderChoice(t,r){return t.indent="",t.editable?ZI.renderChoice.call(this,t,r):super.renderChoice(t,r)}error(){return""}footer(){return this.state.error}async validate(){let t=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let s=r.parent?this.value[r.parent.name]:this.value;if(r.editable?s=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(s=r.enabled===!0),t=await r.validate(s,this.state),t!==!0)break}return t!==!0&&(this.state.error=typeof t=="string"?t:"Invalid Input"),t}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(t=>t.newChoice))return this.alert();this.value={};for(let t of this.choices){let r=t.parent?this.value[t.parent.name]:this.value;if(t.role==="heading"){this.value[t.name]={};continue}t.editable?r[t.name]=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(r[t.name]=t.enabled===!0)}return this.base.submit.call(this)}};vge.exports=ZG});var km=G((e8t,bge)=>{"use strict";var Kst=zI(),Jst=WG(),{isPrimitive:zst}=ia(),XG=class extends Kst{constructor(t){super(t),this.initial=zst(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(t,r={}){let s=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!s||s.name!=="return")?this.append(` +`,r):super.keypress(t,r)}moveCursor(t){this.cursor+=t}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(t,r){if(!t||r.ctrl||r.code)return this.alert();this.append(t)}append(t){let{cursor:r,input:s}=this.state;this.input=`${s}`.slice(0,r)+t+`${s}`.slice(r),this.moveCursor(String(t).length),this.render()}insert(t){this.append(t)}delete(){let{cursor:t,input:r}=this.state;if(t<=0)return this.alert();this.input=`${r}`.slice(0,t-1)+`${r}`.slice(t),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:t,input:r}=this.state;if(r[t]===void 0)return this.alert();this.input=`${r}`.slice(0,t)+`${r}`.slice(t+1),this.render()}cutForward(){let t=this.cursor;if(this.input.length<=t)return this.alert();this.state.clipboard.push(this.input.slice(t)),this.input=this.input.slice(0,t),this.render()}cutLeft(){let t=this.cursor;if(t===0)return this.alert();let r=this.input.slice(0,t),s=this.input.slice(t),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=s,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 t=this.initial!=null?String(this.initial):"";if(!t||!t.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(t){return!!t}async format(t=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(t||r):Jst(this,{input:t,initial:r,pos:this.cursor})}async render(){let t=this.state.size,r=await this.prefix(),s=await this.separator(),a=await this.message(),n=[r,a,s].filter(Boolean).join(" ");this.state.prompt=n;let c=await this.header(),f=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!f.includes(p)&&(f+=" "+p),n+=" "+f,this.clear(t),this.write([c,n,h].filter(Boolean).join(` +`)),this.restore()}};bge.exports=XG});var Pge=G((t8t,Dge)=>{"use strict";var Zst=e=>e.filter((t,r)=>e.lastIndexOf(t)===r),jR=e=>Zst(e).filter(Boolean);Dge.exports=(e,t={},r="")=>{let{past:s=[],present:a=""}=t,n,c;switch(e){case"prev":case"undo":return n=s.slice(0,s.length-1),c=s[s.length-1]||"",{past:jR([r,...n]),present:c};case"next":case"redo":return n=s.slice(1),c=s[0]||"",{past:jR([...n,r]),present:c};case"save":return{past:jR([...s,r]),present:""};case"remove":return c=jR(s.filter(f=>f!==r)),a="",c.length&&(a=c.pop()),{past:c,present:a};default:throw new Error(`Invalid action: "${e}"`)}}});var e5=G((r8t,kge)=>{"use strict";var Xst=km(),xge=Pge(),$G=class extends Xst{constructor(t){super(t);let r=this.options.history;if(r&&r.store){let s=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:s},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(t){return this.store?(this.data=xge(t,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=xge("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};kge.exports=$G});var Tge=G((n8t,Qge)=>{"use strict";var $st=km(),t5=class extends $st{format(){return""}};Qge.exports=t5});var Fge=G((i8t,Rge)=>{"use strict";var eot=km(),r5=class extends eot{constructor(t={}){super(t),this.sep=this.options.separator||/, */,this.initial=t.initial||""}split(t=this.value){return t?String(t).split(this.sep):[]}format(){let t=this.state.submitted?this.styles.primary:r=>r;return this.list.map(t).join(", ")}async submit(t){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()}};Rge.exports=r5});var Oge=G((s8t,Nge)=>{"use strict";var tot=Yd(),n5=class extends tot{constructor(t){super({...t,multiple:!0})}};Nge.exports=n5});var s5=G((o8t,Lge)=>{"use strict";var rot=km(),i5=class extends rot{constructor(t={}){super({style:"number",...t}),this.min=this.isValue(t.min)?this.toNumber(t.min):-1/0,this.max=this.isValue(t.max)?this.toNumber(t.max):1/0,this.delay=t.delay!=null?t.delay:1e3,this.float=t.float!==!1,this.round=t.round===!0||t.float===!1,this.major=t.major||10,this.minor=t.minor||1,this.initial=t.initial!=null?t.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(t){return!/[-+.]/.test(t)||t==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(t)}number(t){return super.append(t)}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(t){let r=t||this.minor,s=this.toNumber(this.input);return s>this.max+r?this.alert():(this.input=`${s+r}`,this.render())}down(t){let r=t||this.minor,s=this.toNumber(this.input);return sthis.isValue(r));return this.value=this.toNumber(t||0),super.submit()}};Lge.exports=i5});var Uge=G((a8t,Mge)=>{Mge.exports=s5()});var Hge=G((l8t,_ge)=>{"use strict";var not=km(),o5=class extends not{constructor(t){super(t),this.cursorShow()}format(t=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(t.length)):""}};_ge.exports=o5});var qge=G((c8t,Gge)=>{"use strict";var iot=Zu(),sot=zv(),jge=ia(),a5=class extends sot{constructor(t={}){super(t),this.widths=[].concat(t.messageWidth||50),this.align=[].concat(t.align||"left"),this.linebreak=t.linebreak||!1,this.edgeLength=t.edgeLength||3,this.newline=t.newline||` + `;let r=t.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((s,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let t=0;for(let r of this.choices){t=Math.max(t,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let s=0;s=this.scale.length-1?this.alert():(t.scaleIndex++,this.render())}left(){let t=this.focused;return t.scaleIndex<=0?this.alert():(t.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(s=>` ${s.name} - ${s.message}`)].map(s=>this.styles.muted(s)).join(` +`)}renderScaleHeading(t){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,t));let s=this.scaleLength-r.join("").length,a=Math.round(s/(r.length-1)),c=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),f=" ".repeat(this.widths[0]);return this.margin[3]+f+this.margin[1]+c}scaleIndicator(t,r,s){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,t,r,s);let a=t.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(t,r){let s=t.scale.map(n=>this.scaleIndicator(t,n,r)),a=this.term==="Hyper"?"":" ";return s.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(t,r){await this.onChoice(t,r);let s=this.index===r,a=await this.pointer(t,r),n=await t.hint;n&&!jge.hasColor(n)&&(n=this.styles.muted(n));let c=I=>this.margin[3]+I.replace(/\s+$/,"").padEnd(this.widths[0]," "),f=this.newline,p=this.indent(t),h=await this.resolve(t.message,this.state,t,r),E=await this.renderScale(t,r),C=this.margin[1]+this.margin[3];this.scaleLength=iot.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-C.length);let x=jge.wordWrap(h,{width:this.widths[0],newline:f}).split(` +`).map(I=>c(I)+this.margin[1]);return s&&(E=this.styles.info(E),x=x.map(I=>this.styles.info(I))),x[0]+=E,this.linebreak&&x.push(""),[p+a,x.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let t=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(t),s=await this.renderScaleHeading();return this.margin[0]+[s,...r.map(a=>a.join(" "))].join(` +`)}async render(){let{submitted:t,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c="";this.options.promptLine!==!1&&(c=[s,n,a,""].join(" "),this.state.prompt=c);let f=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),C=await this.renderChoices(),S=await this.footer(),x=this.emptyError;p&&(c+=p),E&&!c.includes(E)&&(c+=" "+E),t&&!p&&!C.trim()&&this.multiple&&x!=null&&(c+=this.styles.danger(x)),this.clear(r),this.write([f,c,h,C,S].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let t of this.choices)this.value[t.name]=t.scaleIndex;return this.base.submit.call(this)}};Gge.exports=a5});var Vge=G((u8t,Wge)=>{"use strict";var Yge=Zu(),oot=(e="")=>typeof e=="string"?e.replace(/^['"]|['"]$/g,""):"",c5=class{constructor(t){this.name=t.key,this.field=t.field||{},this.value=oot(t.initial||this.field.initial||""),this.message=t.message||this.name,this.cursor=0,this.input="",this.lines=[]}},aot=async(e={},t={},r=s=>s)=>{let s=new Set,a=e.fields||[],n=e.template,c=[],f=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,C=()=>n[++E],S=()=>n[E+1],x=I=>{I.line=h,c.push(I)};for(x({type:"bos",value:""});Eie.name===U.key);U.field=a.find(ie=>ie.name===U.key),$||($=new c5(U),f.push($)),$.lines.push(U.line-1);continue}let R=c[c.length-1];R.type==="text"&&R.line===h?R.value+=I:x({type:"text",value:I})}return x({type:"eos",value:""}),{input:n,tabstops:c,unique:s,keys:p,items:f}};Wge.exports=async e=>{let t=e.options,r=new Set(t.required===!0?[]:t.required||[]),s={...t.values,...t.initial},{tabstops:a,items:n,keys:c}=await aot(t,s),f=l5("result",e,t),p=l5("format",e,t),h=l5("validate",e,t,!0),E=e.isValue.bind(e);return async(C={},S=!1)=>{let x=0;C.required=r,C.items=n,C.keys=c,C.output="";let I=async(K,$,ie,fe)=>{let le=await h(K,$,ie,fe);return le===!1?"Invalid field "+ie.name:le};for(let K of a){let $=K.value,ie=K.key;if(K.type!=="template"){$&&(C.output+=$);continue}if(K.type==="template"){let fe=n.find(ye=>ye.name===ie);t.required===!0&&C.required.add(fe.name);let le=[fe.input,C.values[fe.value],fe.value,$].find(E),pe=(fe.field||{}).message||K.inner;if(S){let ye=await I(C.values[ie],C,fe,x);if(ye&&typeof ye=="string"||ye===!1){C.invalid.set(ie,ye);continue}C.invalid.delete(ie);let d=await f(C.values[ie],C,fe,x);C.output+=Yge.unstyle(d);continue}fe.placeholder=!1;let De=$;$=await p($,C,fe,x),le!==$?(C.values[ie]=le,$=e.styles.typing(le),C.missing.delete(pe)):(C.values[ie]=void 0,le=`<${pe}>`,$=e.styles.primary(le),fe.placeholder=!0,C.required.has(ie)&&C.missing.add(pe)),C.missing.has(pe)&&C.validating&&($=e.styles.warning(le)),C.invalid.has(ie)&&C.validating&&($=e.styles.danger(le)),x===C.index&&(De!==$?$=e.styles.underline($):$=e.styles.heading(Yge.unstyle($))),x++}$&&(C.output+=$)}let R=C.output.split(` +`).map(K=>" "+K),N=n.length,U=0;for(let K of n)C.invalid.has(K.name)&&K.lines.forEach($=>{R[$][0]===" "&&(R[$]=C.styles.danger(C.symbols.bullet)+R[$].slice(1))}),e.isValue(C.values[K.name])&&U++;return C.completed=(U/N*100).toFixed(0),C.output=R.join(` +`),C.output}};function l5(e,t,r,s){return(a,n,c,f)=>typeof c.field[e]=="function"?c.field[e].call(t,a,n,c,f):[s,a].find(p=>t.isValue(p))}});var Jge=G((f8t,Kge)=>{"use strict";var lot=Zu(),cot=Vge(),uot=zI(),u5=class extends uot{constructor(t){super(t),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await cot(this),await super.initialize()}async reset(t){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},t!==!0&&(await this.initialize(),await this.render())}moveCursor(t){let r=this.getItem();this.cursor+=t,r.cursor+=t}dispatch(t,r){if(!r.code&&!r.ctrl&&t!=null&&this.getItem()){this.append(t,r);return}this.alert()}append(t,r){let s=this.getItem(),a=s.input.slice(0,this.cursor),n=s.input.slice(this.cursor);this.input=s.input=`${a}${t}${n}`,this.moveCursor(1),this.render()}delete(){let t=this.getItem();if(this.cursor<=0||!t.input)return this.alert();let r=t.input.slice(this.cursor),s=t.input.slice(0,this.cursor-1);this.input=t.input=`${s}${r}`,this.moveCursor(-1),this.render()}increment(t){return t>=this.state.keys.length-1?0:t+1}decrement(t){return t<=0?this.state.keys.length-1:t-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(t){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:t,keys:r=[],submitted:s,size:a}=this.state,n=[this.options.newline,` +`].find(K=>K!=null),c=await this.prefix(),f=await this.separator(),p=await this.message(),h=[c,p,f].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),C=await this.error()||"",S=await this.hint()||"",x=s?"":await this.interpolate(this.state),I=this.state.key=r[t]||"",R=await this.format(I),N=await this.footer();R&&(h+=" "+R),S&&!R&&this.state.completed===0&&(h+=" "+S),this.clear(a);let U=[E,h,x,N,C.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(t){let{items:r,keys:s,index:a}=this.state,n=r.find(c=>c.name===s[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:t,missing:r,output:s,values:a}=this.state;if(t.size){let f="";for(let[p,h]of t)f+=`Invalid ${p}: ${h} +`;return this.state.error=f,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let c=lot.unstyle(s).split(` +`).map(f=>f.slice(1)).join(` +`);return this.value={values:a,result:c},super.submit()}};Kge.exports=u5});var Zge=G((A8t,zge)=>{"use strict";var fot="(Use + to sort)",Aot=Yd(),f5=class extends Aot{constructor(t){super({...t,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,fot].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(t,r){let s=await super.renderChoice(t,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+s:n+s}get selected(){return this.choices}submit(){return this.value=this.choices.map(t=>t.value),super.submit()}};zge.exports=f5});var $ge=G((p8t,Xge)=>{"use strict";var pot=zv(),A5=class extends pot{constructor(t={}){if(super(t),this.emptyError=t.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(s=>this.styles.muted(s)),this.state.header=r.join(` + `)}}async toChoices(...t){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...t);for(let s of r)s.scale=hot(5,this.options),s.scaleIdx=2;return r}dispatch(){this.alert()}space(){let t=this.focused,r=t.scale[t.scaleIdx],s=r.selected;return t.scale.forEach(a=>a.selected=!1),r.selected=!s,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let t=this.focused;return t.scaleIdx>=t.scale.length-1?this.alert():(t.scaleIdx++,this.render())}left(){let t=this.focused;return t.scaleIdx<=0?this.alert():(t.scaleIdx--,this.render())}indent(){return" "}async renderChoice(t,r){await this.onChoice(t,r);let s=this.index===r,a=this.term==="Hyper",n=a?9:8,c=a?"":" ",f=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=$=>($?this.styles.success("\u25C9"):"\u25EF")+c,E=r+1+".",C=s?this.styles.heading:this.styles.noop,S=await this.resolve(t.message,this.state,t,r),x=this.indent(t),I=x+t.scale.map(($,ie)=>h(ie===t.scaleIdx)).join(f),R=$=>$===t.scaleIdx?C($):$,N=x+t.scale.map(($,ie)=>R(ie)).join(p),U=()=>[E,S].filter(Boolean).join(" "),K=()=>[U(),I,N," "].filter(Boolean).join(` +`);return s&&(I=this.styles.cyan(I),N=this.styles.cyan(N)),K()}async renderChoices(){if(this.state.submitted)return"";let t=this.visible.map(async(s,a)=>await this.renderChoice(s,a)),r=await Promise.all(t);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:t,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=[s,n,a].filter(Boolean).join(" ");this.state.prompt=c;let f=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();(p||!h)&&(c+=" "+p),h&&!c.includes(h)&&(c+=" "+h),t&&!p&&!E&&this.multiple&&this.type!=="form"&&(c+=this.styles.danger(this.emptyError)),this.clear(r),this.write([c,f,E,C].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let t of this.choices)this.value[t.name]=t.scaleIdx;return this.base.submit.call(this)}};function hot(e,t={}){if(Array.isArray(t.scale))return t.scale.map(s=>({...s}));let r=[];for(let s=1;s{e0e.exports=e5()});var n0e=G((d8t,r0e)=>{"use strict";var dot=HR(),p5=class extends dot{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(t="",r){switch(t.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 t=s=>this.styles.primary.underline(s);return[this.value?this.disabled:t(this.disabled),this.value?t(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:t}=this.state,r=await this.header(),s=await this.prefix(),a=await this.separator(),n=await this.message(),c=await this.format(),f=await this.error()||await this.hint(),p=await this.footer(),h=[s,n,a,c].join(" ");this.state.prompt=h,f&&!h.includes(f)&&(h+=" "+f),this.clear(t),this.write([r,h,p].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};r0e.exports=p5});var s0e=G((g8t,i0e)=>{"use strict";var got=Yd(),h5=class extends got{constructor(t){if(super(t),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(t,r){let s=await super.toChoices(t,r);if(s.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>s.length)throw new Error("Please specify the index of the correct answer from the list of choices");return s}check(t){return t.index===this.options.correctChoice}async result(t){return{selectedAnswer:t,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};i0e.exports=h5});var a0e=G(d5=>{"use strict";var o0e=ia(),Rs=(e,t)=>{o0e.defineExport(d5,e,t),o0e.defineExport(d5,e.toLowerCase(),t)};Rs("AutoComplete",()=>pge());Rs("BasicAuth",()=>Ige());Rs("Confirm",()=>Bge());Rs("Editable",()=>Sge());Rs("Form",()=>_R());Rs("Input",()=>e5());Rs("Invisible",()=>Tge());Rs("List",()=>Fge());Rs("MultiSelect",()=>Oge());Rs("Numeral",()=>Uge());Rs("Password",()=>Hge());Rs("Scale",()=>qge());Rs("Select",()=>Yd());Rs("Snippet",()=>Jge());Rs("Sort",()=>Zge());Rs("Survey",()=>$ge());Rs("Text",()=>t0e());Rs("Toggle",()=>n0e());Rs("Quiz",()=>s0e())});var c0e=G((y8t,l0e)=>{l0e.exports={ArrayPrompt:zv(),AuthPrompt:KG(),BooleanPrompt:HR(),NumberPrompt:s5(),StringPrompt:km()}});var Xv=G((E8t,f0e)=>{"use strict";var u0e=Ce("assert"),m5=Ce("events"),Wd=ia(),$u=class extends m5{constructor(t,r){super(),this.options=Wd.merge({},t),this.answers={...r}}register(t,r){if(Wd.isObject(t)){for(let a of Object.keys(t))this.register(a,t[a]);return this}u0e.equal(typeof r,"function","expected a function");let s=t.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[s]=r:this.prompts[s]=r(this.Prompt,this),this}async prompt(t=[]){for(let r of[].concat(t))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(Wd.merge({},this.options,r))}catch(s){return Promise.reject(s)}return this.answers}async ask(t){typeof t=="function"&&(t=await t.call(this));let r=Wd.merge({},this.options,t),{type:s,name:a}=t,{set:n,get:c}=Wd;if(typeof s=="function"&&(s=await s.call(this,t,this.answers)),!s)return this.answers[a];u0e(this.prompts[s],`Prompt "${s}" is not registered`);let f=new this.prompts[s](r),p=c(this.answers,a);f.state.answers=this.answers,f.enquirer=this,a&&f.on("submit",E=>{this.emit("answer",a,E,f),n(this.answers,a,E)});let h=f.emit.bind(f);return f.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",f,this),r.autofill&&p!=null?(f.value=f.input=p,r.autofill==="show"&&await f.submit()):p=f.value=await f.run(),p}use(t){return t.call(this,this),this}set Prompt(t){this._Prompt=t}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(t){this._Prompt=t}static get Prompt(){return this._Prompt||zI()}static get prompts(){return a0e()}static get types(){return c0e()}static get prompt(){let t=(r,...s)=>{let a=new this(...s),n=a.emit.bind(a);return a.emit=(...c)=>(t.emit(...c),n(...c)),a.prompt(r)};return Wd.mixinEmitter(t,new m5),t}};Wd.mixinEmitter($u,new m5);var g5=$u.prompts;for(let e of Object.keys(g5)){let t=e.toLowerCase(),r=s=>new g5[e](s).run();$u.prompt[t]=r,$u[t]=r,$u[e]||Reflect.defineProperty($u,e,{get:()=>g5[e]})}var Zv=e=>{Wd.defineExport($u,e,()=>$u.types[e])};Zv("ArrayPrompt");Zv("AuthPrompt");Zv("BooleanPrompt");Zv("NumberPrompt");Zv("StringPrompt");f0e.exports=$u});var E0e=G((jHt,Sot)=>{Sot.exports={name:"@yarnpkg/cli",version:"4.17.1",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-catalog":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-jsr":"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/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^4.0.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},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",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-catalog","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-jsr","@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","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"git+https://github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var R5=G((y5t,Q0e)=>{"use strict";Q0e.exports=function(t,r){r===!0&&(r=0);var s="";if(typeof t=="string")try{s=new URL(t).protocol}catch{}else t&&t.constructor===URL&&(s=t.protocol);var a=s.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var R0e=G((E5t,T0e)=>{"use strict";var Yot=R5();function Wot(e){var t={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:e,query:{},parse_failed:!1};try{var r=new URL(e);t.protocols=Yot(r),t.protocol=t.protocols[0],t.port=r.port,t.resource=r.hostname,t.host=r.host,t.user=r.username||"",t.password=r.password||"",t.pathname=r.pathname,t.hash=r.hash.slice(1),t.search=r.search.slice(1),t.href=r.href,t.query=Object.fromEntries(r.searchParams)}catch{t.protocols=["file"],t.protocol=t.protocols[0],t.port="",t.resource="",t.user="",t.pathname="",t.hash="",t.search="",t.href=e,t.query={},t.parse_failed=!0}return t}T0e.exports=Wot});var O0e=G((I5t,N0e)=>{"use strict";var Vot=R0e();function Kot(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var Jot=Kot(Vot),zot="text/plain",Zot="us-ascii",F0e=(e,t)=>t.some(r=>r instanceof RegExp?r.test(e):r===e),Xot=(e,{stripHash:t})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(e);if(!r)throw new Error(`Invalid URL: ${e}`);let{type:s,data:a,hash:n}=r.groups,c=s.split(";");n=t?"":n;let f=!1;c[c.length-1]==="base64"&&(c.pop(),f=!0);let p=(c.shift()||"").toLowerCase(),E=[...c.map(C=>{let[S,x=""]=C.split("=").map(I=>I.trim());return S==="charset"&&(x=x.toLowerCase(),x===Zot)?"":`${S}${x?`=${x}`:""}`}).filter(Boolean)];return f&&E.push("base64"),(E.length>0||p&&p!==zot)&&E.unshift(p),`data:${E.join(";")},${f?a.trim():a}${n?`#${n}`:""}`};function $ot(e,t){if(t={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...t},e=e.trim(),/^data:/i.test(e))return Xot(e,t);if(/^view-source:/i.test(e))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=e.startsWith("//");!r&&/^\.*\//.test(e)||(e=e.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,t.defaultProtocol));let a=new URL(e);if(t.forceHttp&&t.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(t.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),t.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),t.stripAuthentication&&(a.username="",a.password=""),t.stripHash?a.hash="":t.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let c=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,f=0,p="";for(;;){let E=c.exec(a.pathname);if(!E)break;let C=E[0],S=E.index,x=a.pathname.slice(f,S);p+=x.replace(/\/{2,}/g,"/"),p+=C,f=S+C.length}let h=a.pathname.slice(f,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(t.removeDirectoryIndex===!0&&(t.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(t.removeDirectoryIndex)&&t.removeDirectoryIndex.length>0){let c=a.pathname.split("/"),f=c[c.length-1];F0e(f,t.removeDirectoryIndex)&&(c=c.slice(0,-1),a.pathname=c.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),t.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(t.removeQueryParameters))for(let c of[...a.searchParams.keys()])F0e(c,t.removeQueryParameters)&&a.searchParams.delete(c);if(t.removeQueryParameters===!0&&(a.search=""),t.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}t.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=e;return e=a.toString(),!t.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(e=e.replace(/\/$/,"")),(t.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&t.removeSingleSlash&&(e=e.replace(/\/$/,"")),r&&!t.normalizeProtocol&&(e=e.replace(/^http:\/\//,"//")),t.stripProtocol&&(e=e.replace(/^(?:https?:)?\/\//,"")),e}var F5=(e,t=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,s=n=>{let c=new Error(n);throw c.subject_url=e,c};(typeof e!="string"||!e.trim())&&s("Invalid url."),e.length>F5.MAX_INPUT_LENGTH&&s("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),t&&(typeof t!="object"&&(t={stripHash:!1}),e=$ot(e,t));let a=Jot.default(e);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):s("URL parsing failed.")}return a};F5.MAX_INPUT_LENGTH=2048;N0e.exports=F5});var U0e=G((C5t,M0e)=>{"use strict";var eat=R5();function L0e(e){if(Array.isArray(e))return e.indexOf("ssh")!==-1||e.indexOf("rsync")!==-1;if(typeof e!="string")return!1;var t=eat(e);if(e=e.substring(e.indexOf("://")+3),L0e(t))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!e.match(r)&&e.indexOf("@"){"use strict";var tat=O0e(),_0e=U0e();function rat(e){var t=tat(e);return t.token="",t.password==="x-oauth-basic"?t.token=t.user:t.user==="x-token-auth"&&(t.token=t.password),_0e(t.protocols)||t.protocols.length===0&&_0e(e)?t.protocol="ssh":t.protocols.length?t.protocol=t.protocols[0]:(t.protocol="file",t.protocols=["file"]),t.href=t.href.replace(/\/$/,""),t}H0e.exports=rat});var q0e=G((B5t,G0e)=>{"use strict";var nat=j0e();function N5(e){if(typeof e!="string")throw new Error("The url must be a string.");var t=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;t.test(e)&&(e="https://github.com/"+e);var r=nat(e),s=r.resource.split("."),a=null;switch(r.toString=function(N){return N5.stringify(this,N)},r.source=s.length>2?s.slice(1-s.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=s[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var c=a.indexOf("-",2),f=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),C=a.indexOf("raw",2),S=a.indexOf("edit",2);n=c>0?c-1:f>0?f-1:p>0?p-1:h>0?h-1:E>0?E-1:C>0?C-1:S>0?S-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var x=a.length>n&&a[n+1]==="-"?n+1:n;a.length>x+2&&["raw","src","blob","tree","edit"].indexOf(a[x+1])>=0&&(r.filepathtype=a[x+1],r.ref=a[x+2],a.length>x+3&&(r.filepath=a.slice(x+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var I=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,R=I.exec(r.pathname);return R!=null&&(r.source="bitbucket-server",R[1]==="users"?r.owner="~"+R[2]:r.owner=R[2],r.organization=r.owner,r.name=R[3],a=R[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}N5.stringify=function(e,t){t=t||(e.protocols&&e.protocols.length?e.protocols.join("+"):e.protocol);var r=e.port?":"+e.port:"",s=e.user||"git",a=e.git_suffix?".git":"";switch(t){case"ssh":return r?"ssh://"+s+"@"+e.resource+r+"/"+e.full_name+a:s+"@"+e.resource+":"+e.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return t+"://"+s+"@"+e.resource+r+"/"+e.full_name+a;case"http":case"https":var n=e.token?iat(e):e.user&&(e.protocols.includes("http")||e.protocols.includes("https"))?e.user+"@":"";return t+"://"+n+e.resource+r+"/"+sat(e)+a;default:return e.href}};function iat(e){switch(e.source){case"bitbucket.org":return"x-token-auth:"+e.token+"@";default:return e.token+"@"}}function sat(e){switch(e.source){case"bitbucket-server":return"scm/"+e.full_name;default:return""+e.full_name}}G0e.exports=N5});function Bat(e,t){return t===1&&wat.has(e[0])}function lS(e){let t=Array.isArray(e)?e:Lu(e);return t.map((s,a)=>Iat.test(s)?`[${s}]`:Cat.test(s)&&!Bat(t,a)?`.${s}`:`[${JSON.stringify(s)}]`).join("").replace(/^\./,"")}function vat(e,t){let r=[];if(t.methodName!==null&&r.push(ue.pretty(e,t.methodName,ue.Type.CODE)),t.file!==null){let s=[];s.push(ue.pretty(e,t.file,ue.Type.PATH)),t.line!==null&&(s.push(ue.pretty(e,t.line,ue.Type.NUMBER)),t.column!==null&&s.push(ue.pretty(e,t.column,ue.Type.NUMBER))),r.push(`(${s.join(ue.pretty(e,":","grey"))})`)}return r.join(" ")}function VR(e,{manifestUpdates:t,reportedErrors:r},{fix:s}={}){let a=new Map,n=new Map,c=[...r.keys()].map(f=>[f,new Map]);for(let[f,p]of[...c,...t]){let h=r.get(f)?.map(x=>({text:x,fixable:!1}))??[],E=!1,C=e.getWorkspaceByCwd(f),S=C.manifest.exportTo({});for(let[x,I]of p){if(I.size>1){let R=[...I].map(([N,U])=>{let K=ue.pretty(e.configuration,N,ue.Type.INSPECT),$=U.size>0?vat(e.configuration,U.values().next().value):null;return $!==null?` +${K} at ${$}`:` +${K}`}).join("");h.push({text:`Conflict detected in constraint targeting ${ue.pretty(e.configuration,x,ue.Type.CODE)}; conflicting values are:${R}`,fixable:!1})}else{let[[R]]=I,N=xa(S,x);if(JSON.stringify(N)===JSON.stringify(R))continue;if(!s){let U=typeof N>"u"?`Missing field ${ue.pretty(e.configuration,x,ue.Type.CODE)}; expected ${ue.pretty(e.configuration,R,ue.Type.INSPECT)}`:typeof R>"u"?`Extraneous field ${ue.pretty(e.configuration,x,ue.Type.CODE)} currently set to ${ue.pretty(e.configuration,N,ue.Type.INSPECT)}`:`Invalid field ${ue.pretty(e.configuration,x,ue.Type.CODE)}; expected ${ue.pretty(e.configuration,R,ue.Type.INSPECT)}, found ${ue.pretty(e.configuration,N,ue.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof R>"u"?hd(S,x):J0(S,x,R),E=!0}E&&a.set(C,S)}h.length>0&&n.set(C,h)}return{changedWorkspaces:a,remainingErrors:n}}function sme(e,{configuration:t}){let r={children:[]};for(let[s,a]of e){let n=[];for(let f of a){let p=f.text.split(/\n/);f.fixable&&(p[0]=`${ue.pretty(t,"\u2699","gray")} ${p[0]}`),n.push({value:ue.tuple(ue.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:ue.tuple(ue.Type.NO_HINT,h)}))})}let c={value:ue.tuple(ue.Type.LOCATOR,s.anchoredLocator),children:qe.sortMap(n,f=>f.value[1])};r.children.push(c)}return r.children=qe.sortMap(r.children,s=>s.value[1]),r}var UC,Iat,Cat,wat,cS=Ze(()=>{Ge();Zl();UC=class{constructor(t){this.indexedFields=t;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let t of this.indexedFields)this.indexes[t]=new Map}insert(t){this.items.push(t);for(let r of this.indexedFields){let s=Object.hasOwn(t,r)?t[r]:void 0;if(typeof s>"u")continue;qe.getArrayWithDefault(this.indexes[r],s).push(t)}return t}find(t){if(typeof t>"u")return this.items;let r=Object.entries(t);if(r.length===0)return this.items;let s=[],a;for(let[c,f]of r){let p=c,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){s.push([p,f]);continue}let E=new Set(h.get(f)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let C of a)E.has(C)||a.delete(C);if(a.size===0)break}let n=[...a??[]];return s.length>0&&(n=n.filter(c=>{for(let[f,p]of s)if(!(typeof p<"u"?Object.hasOwn(c,f)&&c[f]===p:Object.hasOwn(c,f)===!1))return!1;return!0})),n}},Iat=/^[0-9]+$/,Cat=/^[a-zA-Z0-9_]+$/,wat=new Set(["scripts",..._t.allDependencies])});var ome=G((Sqt,$5)=>{var Sat;(function(e){var t=function(){return{"append/2":[new e.type.Rule(new e.type.Term("append",[new e.type.Var("X"),new e.type.Var("L")]),new e.type.Term("foldl",[new e.type.Term("append",[]),new e.type.Var("X"),new e.type.Term("[]",[]),new e.type.Var("L")]))],"append/3":[new e.type.Rule(new e.type.Term("append",[new e.type.Term("[]",[]),new e.type.Var("X"),new e.type.Var("X")]),null),new e.type.Rule(new e.type.Term("append",[new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("T")]),new e.type.Var("X"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("S")])]),new e.type.Term("append",[new e.type.Var("T"),new e.type.Var("X"),new e.type.Var("S")]))],"member/2":[new e.type.Rule(new e.type.Term("member",[new e.type.Var("X"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("_")])]),null),new e.type.Rule(new e.type.Term("member",[new e.type.Var("X"),new e.type.Term(".",[new e.type.Var("_"),new e.type.Var("Xs")])]),new e.type.Term("member",[new e.type.Var("X"),new e.type.Var("Xs")]))],"permutation/2":[new e.type.Rule(new e.type.Term("permutation",[new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("permutation",[new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("T")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("permutation",[new e.type.Var("T"),new e.type.Var("P")]),new e.type.Term(",",[new e.type.Term("append",[new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("P")]),new e.type.Term("append",[new e.type.Var("X"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("Y")]),new e.type.Var("S")])])]))],"maplist/2":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("X")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("Xs")])]))],"maplist/3":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs")])]))],"maplist/4":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")]),new e.type.Term(".",[new e.type.Var("C"),new e.type.Var("Cs")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B"),new e.type.Var("C")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs"),new e.type.Var("Cs")])]))],"maplist/5":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")]),new e.type.Term(".",[new e.type.Var("C"),new e.type.Var("Cs")]),new e.type.Term(".",[new e.type.Var("D"),new e.type.Var("Ds")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B"),new e.type.Var("C"),new e.type.Var("D")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs"),new e.type.Var("Cs"),new e.type.Var("Ds")])]))],"maplist/6":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")]),new e.type.Term(".",[new e.type.Var("C"),new e.type.Var("Cs")]),new e.type.Term(".",[new e.type.Var("D"),new e.type.Var("Ds")]),new e.type.Term(".",[new e.type.Var("E"),new e.type.Var("Es")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B"),new e.type.Var("C"),new e.type.Var("D"),new e.type.Var("E")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs"),new e.type.Var("Cs"),new e.type.Var("Ds"),new e.type.Var("Es")])]))],"maplist/7":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")]),new e.type.Term(".",[new e.type.Var("C"),new e.type.Var("Cs")]),new e.type.Term(".",[new e.type.Var("D"),new e.type.Var("Ds")]),new e.type.Term(".",[new e.type.Var("E"),new e.type.Var("Es")]),new e.type.Term(".",[new e.type.Var("F"),new e.type.Var("Fs")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B"),new e.type.Var("C"),new e.type.Var("D"),new e.type.Var("E"),new e.type.Var("F")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs"),new e.type.Var("Cs"),new e.type.Var("Ds"),new e.type.Var("Es"),new e.type.Var("Fs")])]))],"maplist/8":[new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("A"),new e.type.Var("As")]),new e.type.Term(".",[new e.type.Var("B"),new e.type.Var("Bs")]),new e.type.Term(".",[new e.type.Var("C"),new e.type.Var("Cs")]),new e.type.Term(".",[new e.type.Var("D"),new e.type.Var("Ds")]),new e.type.Term(".",[new e.type.Var("E"),new e.type.Var("Es")]),new e.type.Term(".",[new e.type.Var("F"),new e.type.Var("Fs")]),new e.type.Term(".",[new e.type.Var("G"),new e.type.Var("Gs")])]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P"),new e.type.Var("A"),new e.type.Var("B"),new e.type.Var("C"),new e.type.Var("D"),new e.type.Var("E"),new e.type.Var("F"),new e.type.Var("G")]),new e.type.Term("maplist",[new e.type.Var("P"),new e.type.Var("As"),new e.type.Var("Bs"),new e.type.Var("Cs"),new e.type.Var("Ds"),new e.type.Var("Es"),new e.type.Var("Fs"),new e.type.Var("Gs")])]))],"include/3":[new e.type.Rule(new e.type.Term("include",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("include",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("T")]),new e.type.Var("L")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("P"),new e.type.Var("A")]),new e.type.Term(",",[new e.type.Term("append",[new e.type.Var("A"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Term("[]",[])]),new e.type.Var("B")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("F"),new e.type.Var("B")]),new e.type.Term(",",[new e.type.Term(";",[new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("F")]),new e.type.Term(",",[new e.type.Term("=",[new e.type.Var("L"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("S")])]),new e.type.Term("!",[])])]),new e.type.Term("=",[new e.type.Var("L"),new e.type.Var("S")])]),new e.type.Term("include",[new e.type.Var("P"),new e.type.Var("T"),new e.type.Var("S")])])])])]))],"exclude/3":[new e.type.Rule(new e.type.Term("exclude",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Term("[]",[])]),null),new e.type.Rule(new e.type.Term("exclude",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("T")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("exclude",[new e.type.Var("P"),new e.type.Var("T"),new e.type.Var("E")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("P"),new e.type.Var("L")]),new e.type.Term(",",[new e.type.Term("append",[new e.type.Var("L"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Term("[]",[])]),new e.type.Var("Q")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("R"),new e.type.Var("Q")]),new e.type.Term(";",[new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("R")]),new e.type.Term(",",[new e.type.Term("!",[]),new e.type.Term("=",[new e.type.Var("S"),new e.type.Var("E")])])]),new e.type.Term("=",[new e.type.Var("S"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("E")])])])])])])]))],"foldl/4":[new e.type.Rule(new e.type.Term("foldl",[new e.type.Var("_"),new e.type.Term("[]",[]),new e.type.Var("I"),new e.type.Var("I")]),null),new e.type.Rule(new e.type.Term("foldl",[new e.type.Var("P"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Var("T")]),new e.type.Var("I"),new e.type.Var("R")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("P"),new e.type.Var("L")]),new e.type.Term(",",[new e.type.Term("append",[new e.type.Var("L"),new e.type.Term(".",[new e.type.Var("I"),new e.type.Term(".",[new e.type.Var("H"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Term("[]",[])])])]),new e.type.Var("L2")]),new e.type.Term(",",[new e.type.Term("=..",[new e.type.Var("P2"),new e.type.Var("L2")]),new e.type.Term(",",[new e.type.Term("call",[new e.type.Var("P2")]),new e.type.Term("foldl",[new e.type.Var("P"),new e.type.Var("T"),new e.type.Var("X"),new e.type.Var("R")])])])])]))],"select/3":[new e.type.Rule(new e.type.Term("select",[new e.type.Var("E"),new e.type.Term(".",[new e.type.Var("E"),new e.type.Var("Xs")]),new e.type.Var("Xs")]),null),new e.type.Rule(new e.type.Term("select",[new e.type.Var("E"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Ys")])]),new e.type.Term("select",[new e.type.Var("E"),new e.type.Var("Xs"),new e.type.Var("Ys")]))],"sum_list/2":[new e.type.Rule(new e.type.Term("sum_list",[new e.type.Term("[]",[]),new e.type.Num(0,!1)]),null),new e.type.Rule(new e.type.Term("sum_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("sum_list",[new e.type.Var("Xs"),new e.type.Var("Y")]),new e.type.Term("is",[new e.type.Var("S"),new e.type.Term("+",[new e.type.Var("X"),new e.type.Var("Y")])])]))],"max_list/2":[new e.type.Rule(new e.type.Term("max_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Term("[]",[])]),new e.type.Var("X")]),null),new e.type.Rule(new e.type.Term("max_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("max_list",[new e.type.Var("Xs"),new e.type.Var("Y")]),new e.type.Term(";",[new e.type.Term(",",[new e.type.Term(">=",[new e.type.Var("X"),new e.type.Var("Y")]),new e.type.Term(",",[new e.type.Term("=",[new e.type.Var("S"),new e.type.Var("X")]),new e.type.Term("!",[])])]),new e.type.Term("=",[new e.type.Var("S"),new e.type.Var("Y")])])]))],"min_list/2":[new e.type.Rule(new e.type.Term("min_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Term("[]",[])]),new e.type.Var("X")]),null),new e.type.Rule(new e.type.Term("min_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("min_list",[new e.type.Var("Xs"),new e.type.Var("Y")]),new e.type.Term(";",[new e.type.Term(",",[new e.type.Term("=<",[new e.type.Var("X"),new e.type.Var("Y")]),new e.type.Term(",",[new e.type.Term("=",[new e.type.Var("S"),new e.type.Var("X")]),new e.type.Term("!",[])])]),new e.type.Term("=",[new e.type.Var("S"),new e.type.Var("Y")])])]))],"prod_list/2":[new e.type.Rule(new e.type.Term("prod_list",[new e.type.Term("[]",[]),new e.type.Num(1,!1)]),null),new e.type.Rule(new e.type.Term("prod_list",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("S")]),new e.type.Term(",",[new e.type.Term("prod_list",[new e.type.Var("Xs"),new e.type.Var("Y")]),new e.type.Term("is",[new e.type.Var("S"),new e.type.Term("*",[new e.type.Var("X"),new e.type.Var("Y")])])]))],"last/2":[new e.type.Rule(new e.type.Term("last",[new e.type.Term(".",[new e.type.Var("X"),new e.type.Term("[]",[])]),new e.type.Var("X")]),null),new e.type.Rule(new e.type.Term("last",[new e.type.Term(".",[new e.type.Var("_"),new e.type.Var("Xs")]),new e.type.Var("X")]),new e.type.Term("last",[new e.type.Var("Xs"),new e.type.Var("X")]))],"prefix/2":[new e.type.Rule(new e.type.Term("prefix",[new e.type.Var("Part"),new e.type.Var("Whole")]),new e.type.Term("append",[new e.type.Var("Part"),new e.type.Var("_"),new e.type.Var("Whole")]))],"nth0/3":[new e.type.Rule(new e.type.Term("nth0",[new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z")]),new e.type.Term(";",[new e.type.Term("->",[new e.type.Term("var",[new e.type.Var("X")]),new e.type.Term("nth",[new e.type.Num(0,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("_")])]),new e.type.Term(",",[new e.type.Term(">=",[new e.type.Var("X"),new e.type.Num(0,!1)]),new e.type.Term(",",[new e.type.Term("nth",[new e.type.Num(0,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("_")]),new e.type.Term("!",[])])])]))],"nth1/3":[new e.type.Rule(new e.type.Term("nth1",[new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z")]),new e.type.Term(";",[new e.type.Term("->",[new e.type.Term("var",[new e.type.Var("X")]),new e.type.Term("nth",[new e.type.Num(1,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("_")])]),new e.type.Term(",",[new e.type.Term(">",[new e.type.Var("X"),new e.type.Num(0,!1)]),new e.type.Term(",",[new e.type.Term("nth",[new e.type.Num(1,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("_")]),new e.type.Term("!",[])])])]))],"nth0/4":[new e.type.Rule(new e.type.Term("nth0",[new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")]),new e.type.Term(";",[new e.type.Term("->",[new e.type.Term("var",[new e.type.Var("X")]),new e.type.Term("nth",[new e.type.Num(0,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")])]),new e.type.Term(",",[new e.type.Term(">=",[new e.type.Var("X"),new e.type.Num(0,!1)]),new e.type.Term(",",[new e.type.Term("nth",[new e.type.Num(0,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")]),new e.type.Term("!",[])])])]))],"nth1/4":[new e.type.Rule(new e.type.Term("nth1",[new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")]),new e.type.Term(";",[new e.type.Term("->",[new e.type.Term("var",[new e.type.Var("X")]),new e.type.Term("nth",[new e.type.Num(1,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")])]),new e.type.Term(",",[new e.type.Term(">",[new e.type.Var("X"),new e.type.Num(0,!1)]),new e.type.Term(",",[new e.type.Term("nth",[new e.type.Num(1,!1),new e.type.Var("X"),new e.type.Var("Y"),new e.type.Var("Z"),new e.type.Var("W")]),new e.type.Term("!",[])])])]))],"nth/5":[new e.type.Rule(new e.type.Term("nth",[new e.type.Var("N"),new e.type.Var("N"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("X"),new e.type.Var("Xs")]),null),new e.type.Rule(new e.type.Term("nth",[new e.type.Var("N"),new e.type.Var("O"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Xs")]),new e.type.Var("Y"),new e.type.Term(".",[new e.type.Var("X"),new e.type.Var("Ys")])]),new e.type.Term(",",[new e.type.Term("is",[new e.type.Var("M"),new e.type.Term("+",[new e.type.Var("N"),new e.type.Num(1,!1)])]),new e.type.Term("nth",[new e.type.Var("M"),new e.type.Var("O"),new e.type.Var("Xs"),new e.type.Var("Y"),new e.type.Var("Ys")])]))],"length/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(!e.type.is_variable(f)&&!e.type.is_integer(f))s.throw_error(e.error.type("integer",f,n.indicator));else if(e.type.is_integer(f)&&f.value<0)s.throw_error(e.error.domain("not_less_than_zero",f,n.indicator));else{var p=new e.type.Term("length",[c,new e.type.Num(0,!1),f]);e.type.is_integer(f)&&(p=new e.type.Term(",",[p,new e.type.Term("!",[])])),s.prepend([new e.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new e.type.Rule(new e.type.Term("length",[new e.type.Term("[]",[]),new e.type.Var("N"),new e.type.Var("N")]),null),new e.type.Rule(new e.type.Term("length",[new e.type.Term(".",[new e.type.Var("_"),new e.type.Var("X")]),new e.type.Var("A"),new e.type.Var("N")]),new e.type.Term(",",[new e.type.Term("succ",[new e.type.Var("A"),new e.type.Var("B")]),new e.type.Term("length",[new e.type.Var("X"),new e.type.Var("B"),new e.type.Var("N")])]))],"replicate/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(e.type.is_variable(f))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_integer(f))s.throw_error(e.error.type("integer",f,n.indicator));else if(f.value<0)s.throw_error(e.error.domain("not_less_than_zero",f,n.indicator));else if(!e.type.is_variable(p)&&!e.type.is_list(p))s.throw_error(e.error.type("list",p,n.indicator));else{for(var h=new e.type.Term("[]"),E=0;E0;C--)E[C].equals(E[C-1])&&E.splice(C,1);for(var S=new e.type.Term("[]"),C=E.length-1;C>=0;C--)S=new e.type.Term(".",[E[C],S]);s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[S,f])),a.substitution,a)])}}},"msort/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(e.type.is_variable(c))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_variable(f)&&!e.type.is_fully_list(f))s.throw_error(e.error.type("list",f,n.indicator));else{for(var p=[],h=c;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(e.type.is_variable(h))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_empty_list(h))s.throw_error(e.error.type("list",c,n.indicator));else{for(var E=p.sort(e.compare),C=new e.type.Term("[]"),S=E.length-1;S>=0;S--)C=new e.type.Term(".",[E[S],C]);s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[C,f])),a.substitution,a)])}}},"keysort/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(e.type.is_variable(c))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_variable(f)&&!e.type.is_fully_list(f))s.throw_error(e.error.type("list",f,n.indicator));else{for(var p=[],h,E=c;E.indicator==="./2";){if(h=E.args[0],e.type.is_variable(h)){s.throw_error(e.error.instantiation(n.indicator));return}else if(!e.type.is_term(h)||h.indicator!=="-/2"){s.throw_error(e.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(e.type.is_variable(E))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_empty_list(E))s.throw_error(e.error.type("list",c,n.indicator));else{for(var C=p.sort(e.compare),S=new e.type.Term("[]"),x=C.length-1;x>=0;x--)S=new e.type.Term(".",[new e.type.Term("-",[C[x],C[x].pair]),S]),delete C[x].pair;s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[S,f])),a.substitution,a)])}}},"take/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(e.type.is_variable(f)||e.type.is_variable(c))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_list(f))s.throw_error(e.error.type("list",f,n.indicator));else if(!e.type.is_integer(c))s.throw_error(e.error.type("integer",c,n.indicator));else if(!e.type.is_variable(p)&&!e.type.is_list(p))s.throw_error(e.error.type("list",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator==="./2";)E.push(C.args[0]),C=C.args[1],h--;if(h===0){for(var S=new e.type.Term("[]"),h=E.length-1;h>=0;h--)S=new e.type.Term(".",[E[h],S]);s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[S,p])),a.substitution,a)])}}},"drop/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(e.type.is_variable(f)||e.type.is_variable(c))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_list(f))s.throw_error(e.error.type("list",f,n.indicator));else if(!e.type.is_integer(c))s.throw_error(e.error.type("integer",c,n.indicator));else if(!e.type.is_variable(p)&&!e.type.is_list(p))s.throw_error(e.error.type("list",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator==="./2";)E.push(C.args[0]),C=C.args[1],h--;h===0&&s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[C,p])),a.substitution,a)])}},"reverse/2":function(s,a,n){var c=n.args[0],f=n.args[1],p=e.type.is_instantiated_list(c),h=e.type.is_instantiated_list(f);if(e.type.is_variable(c)&&e.type.is_variable(f))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_variable(c)&&!e.type.is_fully_list(c))s.throw_error(e.error.type("list",c,n.indicator));else if(!e.type.is_variable(f)&&!e.type.is_fully_list(f))s.throw_error(e.error.type("list",f,n.indicator));else if(!p&&!h)s.throw_error(e.error.instantiation(n.indicator));else{for(var E=p?c:f,C=new e.type.Term("[]",[]);E.indicator==="./2";)C=new e.type.Term(".",[E.args[0],C]),E=E.args[1];s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[C,p?f:c])),a.substitution,a)])}},"list_to_set/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(e.type.is_variable(c))s.throw_error(e.error.instantiation(n.indicator));else{for(var p=c,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(e.type.is_variable(p))s.throw_error(e.error.instantiation(n.indicator));else if(!e.type.is_term(p)||p.indicator!=="[]/0")s.throw_error(e.error.type("list",c,n.indicator));else{for(var E=[],C=new e.type.Term("[]",[]),S,x=0;x=0;x--)C=new e.type.Term(".",[E[x],C]);s.prepend([new e.type.State(a.goal.replace(new e.type.Term("=",[f,C])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof $5<"u"?$5.exports=function(s){e=s,new e.type.Module("lists",t(),r)}:new e.type.Module("lists",t(),r)})(Sat)});var Cme=G(en=>{"use strict";var Rm=process.platform==="win32",e9="aes-256-cbc",bat="sha256",cme="The current environment doesn't support interactive reading from TTY.",li=Ce("fs"),ame=process.binding("tty_wrap").TTY,r9=Ce("child_process"),Kd=Ce("path"),n9={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},$p="none",tf,HC,lme=!1,Vd,JR,t9,Dat=0,l9="",Tm=[],zR,ume=!1,i9=!1,uS=!1;function fme(e){function t(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(s){return"#"+s.charCodeAt(0)+";"})}return JR.concat(function(r){var s=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?e[a]&&s.push("--"+a):r[a]==="string"&&e[a]&&s.push("--"+a,t(e[a]))}),s}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function Pat(e,t){function r(U){var K,$="",ie;for(t9=t9||Ce("os").tmpdir();;){K=Kd.join(t9,U+$);try{ie=li.openSync(K,"wx")}catch(fe){if(fe.code==="EEXIST"){$++;continue}else throw fe}li.closeSync(ie);break}return K}var s,a,n,c={},f,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),C=r("readline-sync.exit"),S=r("readline-sync.done"),x=Ce("crypto"),I,R,N;I=x.createHash(bat),I.update(""+process.pid+Dat+++Math.random()),N=I.digest("hex"),R=x.createDecipher(e9,N),s=fme(e),Rm?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+Vd+"%Q%"+s.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+C+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+e9+"%Q% %Q%"+N+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+S+"%Q%"]):(a="/bin/sh",n=["-c",'("'+Vd+'"'+s.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+C+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+e9+'" "'+N+'" >"'+h+'"; echo 1 >"'+S+'"']),uS&&uS("_execFileSync",s);try{r9.spawn(a,n,t)}catch(U){c.error=new Error(U.message),c.error.method="_execFileSync - spawn",c.error.program=a,c.error.args=n}for(;li.readFileSync(S,{encoding:e.encoding}).trim()!=="1";);return(f=li.readFileSync(C,{encoding:e.encoding}).trim())==="0"?c.input=R.update(li.readFileSync(h,{encoding:"binary"}),"hex",e.encoding)+R.final(e.encoding):(p=li.readFileSync(E,{encoding:e.encoding}).trim(),c.error=new Error(cme+(p?` +`+p:"")),c.error.method="_execFileSync",c.error.program=a,c.error.args=n,c.error.extMessage=p,c.error.exitCode=+f),li.unlinkSync(h),li.unlinkSync(E),li.unlinkSync(C),li.unlinkSync(S),c}function xat(e){var t,r={},s,a={env:process.env,encoding:e.encoding};if(Vd||(Rm?process.env.PSModulePath?(Vd="powershell.exe",JR=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(Vd="cscript.exe",JR=["//nologo",__dirname+"\\read.cs.js"]):(Vd="/bin/sh",JR=[__dirname+"/read.sh"])),Rm&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),r9.execFileSync){t=fme(e),uS&&uS("execFileSync",t);try{r.input=r9.execFileSync(Vd,t,a)}catch(n){s=n.stderr?(n.stderr+"").trim():"",r.error=new Error(cme+(s?` +`+s:"")),r.error.method="execFileSync",r.error.program=Vd,r.error.args=t,r.error.extMessage=s,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=Pat(e,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),e.display=""),r}function s9(e){var t="",r=e.display,s=!e.display&&e.keyIn&&e.hideEchoBack&&!e.mask;function a(){var n=xat(e);if(n.error)throw n.error;return n.input}return i9&&i9(e),function(){var n,c,f;function p(){return n||(n=process.binding("fs"),c=process.binding("constants")),n}if(typeof $p=="string")if($p=null,Rm){if(f=function(h){var E=h.replace(/^\D+/,"").split("."),C=0;return(E[0]=+E[0])&&(C+=E[0]*1e4),(E[1]=+E[1])&&(C+=E[1]*100),(E[2]=+E[2])&&(C+=E[2]),C}(process.version),!(f>=20302&&f<40204||f>=5e4&&f<50100||f>=50600&&f<60200)&&process.stdin.isTTY)process.stdin.pause(),$p=process.stdin.fd,HC=process.stdin._handle;else try{$p=p().open("CONIN$",c.O_RDWR,parseInt("0666",8)),HC=new ame($p,!0)}catch{}if(process.stdout.isTTY)tf=process.stdout.fd;else{try{tf=li.openSync("\\\\.\\CON","w")}catch{}if(typeof tf!="number")try{tf=p().open("CONOUT$",c.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{$p=li.openSync("/dev/tty","r"),HC=process.stdin._handle}catch{}}else try{$p=li.openSync("/dev/tty","r"),HC=new ame($p,!1)}catch{}if(process.stdout.isTTY)tf=process.stdout.fd;else try{tf=li.openSync("/dev/tty","w")}catch{}}}(),function(){var n,c,f=!e.hideEchoBack&&!e.keyIn,p,h,E,C,S;zR="";function x(I){return I===lme?!0:HC.setRawMode(I)!==0?!1:(lme=I,!0)}if(ume||!HC||typeof tf!="number"&&(e.display||!f)){t=a();return}if(e.display&&(li.writeSync(tf,e.display),e.display=""),!e.displayOnly){if(!x(!f)){t=a();return}for(h=e.keyIn?1:e.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),e.keyIn&&e.limit&&(c=new RegExp("[^"+e.limit+"]","g"+(e.caseSensitive?"":"i")));;){E=0;try{E=li.readSync($p,p,0,h)}catch(I){if(I.code!=="EOF"){x(!1),t+=a();return}}if(E>0?(C=p.toString(e.encoding,0,E),zR+=C):(C=` +`,zR+="\0"),C&&typeof(S=(C.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(C=S,n=!0),C&&(C=C.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),C&&c&&(C=C.replace(c,"")),C&&(f||(e.hideEchoBack?e.mask&&li.writeSync(tf,new Array(C.length+1).join(e.mask)):li.writeSync(tf,C)),t+=C),!e.keyIn&&n||e.keyIn&&t.length>=h)break}!f&&!s&&li.writeSync(tf,` +`),x(!1)}}(),e.print&&!s&&e.print(r+(e.displayOnly?"":(e.hideEchoBack?new Array(t.length+1).join(e.mask):t)+` +`),e.encoding),e.displayOnly?"":l9=e.keepWhitespace||e.keyIn?t:t.trim()}function kat(e,t){var r=[];function s(a){a!=null&&(Array.isArray(a)?a.forEach(s):(!t||t(a))&&r.push(a))}return s(e),r}function c9(e){return e.replace(/[\x00-\x7f]/g,function(t){return"\\x"+("00"+t.charCodeAt().toString(16)).substr(-2)})}function eo(){var e=Array.prototype.slice.call(arguments),t,r;return e.length&&typeof e[0]=="boolean"&&(r=e.shift(),r&&(t=Object.keys(n9),e.unshift(n9))),e.reduce(function(s,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(t=Object.keys(a)),t.forEach(function(n){var c;if(a.hasOwnProperty(n))switch(c=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":c=c!=null?c+"":"",c&&n!=="limitMessage"&&(c=c.replace(/[\r\n]/g,"")),s[n]=c;break;case"bufferSize":!isNaN(c=parseInt(c,10))&&typeof c=="number"&&(s[n]=c);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":s[n]=!!c;break;case"limit":case"trueValue":case"falseValue":s[n]=kat(c,function(f){var p=typeof f;return p==="string"||p==="number"||p==="function"||f instanceof RegExp}).map(function(f){return typeof f=="string"?f.replace(/[\r\n]/g,""):f});break;case"print":case"phContent":case"preCheck":s[n]=typeof c=="function"?c:void 0;break;case"prompt":case"display":s[n]=c??"";break}})),s},{})}function o9(e,t,r){return t.some(function(s){var a=typeof s;return a==="string"?r?e===s:e.toLowerCase()===s.toLowerCase():a==="number"?parseFloat(e)===s:a==="function"?s(e):s instanceof RegExp?s.test(e):!1})}function u9(e,t){var r=Kd.normalize(Rm?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return e=Kd.normalize(e),t?e.replace(/^~(?=\/|\\|$)/,r):e.replace(new RegExp("^"+c9(r)+"(?=\\/|\\\\|$)",Rm?"i":""),"~")}function jC(e,t){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",s=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(c,f,p,h,E,C){var S;return f||typeof(S=t(E))!="string"?p:S?(h||"")+S+(C||""):""}return e.replace(s,n).replace(a,n)}function Ame(e,t,r){var s,a=[],n=-1,c=0,f="",p;function h(E,C){return C.length>3?(E.push(C[0]+"..."+C[C.length-1]),p=!0):C.length&&(E=E.concat(C)),E}return s=e.reduce(function(E,C){return E.concat((C+"").split(""))},[]).reduce(function(E,C){var S,x;return t||(C=C.toLowerCase()),S=/^\d$/.test(C)?1:/^[A-Z]$/.test(C)?2:/^[a-z]$/.test(C)?3:0,r&&S===0?f+=C:(x=C.charCodeAt(0),S&&S===n&&x===c+1?a.push(C):(E=h(E,a),a=[C],n=S),c=x),E},[]),s=h(s,a),f&&(s.push(f),p=!0),{values:s,suppressed:p}}function pme(e,t){return e.join(e.length>2?", ":t?" / ":"/")}function hme(e,t){var r,s,a={},n;if(t.phContent&&(r=t.phContent(e,t)),typeof r!="string")switch(e){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=t.hasOwnProperty(e)?typeof t[e]=="boolean"?t[e]?"on":"off":t[e]+"":"";break;case"limit":case"trueValue":case"falseValue":s=t[t.hasOwnProperty(e+"Src")?e+"Src":e],t.keyIn?(a=Ame(s,t.caseSensitive),s=a.values):s=s.filter(function(c){var f=typeof c;return f==="string"||f==="number"}),r=pme(s,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=t[t.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||e!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=l9;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),e==="CWD"?r=Kd.basename(r):e==="cwdHome"&&(r=u9(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+e.replace(/^./,function(c){return c.toUpperCase()})+"String"]();break;default:typeof(n=(e.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=Tm[Tm.length-n]||"")}return r}function dme(e){var t=/^(.)-(.)$/.exec(e),r="",s,a,n,c;if(!t)return null;for(s=t[1].charCodeAt(0),a=t[2].charCodeAt(0),c=s +And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},t,{history:!1,cd:!1,phContent:function(x){return x==="charlist"?r.text:x==="length"?s+"..."+a:null}}),c,f,p,h,E,C,S;for(t=t||{},c=jC(t.charlist?t.charlist+"":"$",dme),(isNaN(s=parseInt(t.min,10))||typeof s!="number")&&(s=12),(isNaN(a=parseInt(t.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+c9(c)+"]{"+s+","+a+"}$"),r=Ame([c],n.caseSensitive,!0),r.text=pme(r.values,r.suppressed),f=t.confirmMessage!=null?t.confirmMessage:"Reinput a same one to confirm it: ",p=t.unmatchMessage!=null?t.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",e==null&&(e="Input new password: "),E=n.limitMessage;!S;)n.limit=h,n.limitMessage=E,C=en.question(e,n),n.limit=[C,""],n.limitMessage=p,S=en.question(f,n);return C};function yme(e,t,r){var s;function a(n){return s=r(n),!isNaN(s)&&typeof s=="number"}return en.question(e,eo({limitMessage:"Input valid number, please."},t,{limit:a,cd:!1})),s}en.questionInt=function(e,t){return yme(e,t,function(r){return parseInt(r,10)})};en.questionFloat=function(e,t){return yme(e,t,parseFloat)};en.questionPath=function(e,t){var r,s="",a=eo({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},t,{keepWhitespace:!1,limit:function(n){var c,f,p;n=u9(n,!0),s="";function h(E){E.split(/\/|\\/).reduce(function(C,S){var x=Kd.resolve(C+=S+Kd.sep);if(!li.existsSync(x))li.mkdirSync(x);else if(!li.statSync(x).isDirectory())throw new Error("Non directory already exists: "+x);return C},"")}try{if(c=li.existsSync(n),r=c?li.realpathSync(n):Kd.resolve(n),!t.hasOwnProperty("exists")&&!c||typeof t.exists=="boolean"&&t.exists!==c)return s=(c?"Already exists":"No such file or directory")+": "+r,!1;if(!c&&t.create&&(t.isDirectory?h(r):(h(Kd.dirname(r)),li.closeSync(li.openSync(r,"w"))),r=li.realpathSync(r)),c&&(t.min||t.max||t.isFile||t.isDirectory)){if(f=li.statSync(r),t.isFile&&!f.isFile())return s="Not file: "+r,!1;if(t.isDirectory&&!f.isDirectory())return s="Not directory: "+r,!1;if(t.min&&f.size<+t.min||t.max&&f.size>+t.max)return s="Size "+f.size+" is out of range: "+r,!1}if(typeof t.validate=="function"&&(p=t.validate(r))!==!0)return typeof p=="string"&&(s=p),!1}catch(E){return s=E+"",!1}return!0},phContent:function(n){return n==="error"?s:n!=="min"&&n!=="max"?null:t.hasOwnProperty(n)?t[n]+"":""}});return t=t||{},e==null&&(e='Input path (you can "cd" and "pwd"): '),en.question(e,a),r};function Eme(e,t){var r={},s={};return typeof e=="object"?(Object.keys(e).forEach(function(a){typeof e[a]=="function"&&(s[t.caseSensitive?a:a.toLowerCase()]=e[a])}),r.preCheck=function(a){var n;return r.args=a9(a),n=r.args[0]||"",t.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&s.hasOwnProperty(n)?s[n].apply(a,r.args.slice(1)):s.hasOwnProperty("_")?s._.apply(a,r.args):null,{res:a,forceNext:!1}},s.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return t.caseSensitive||(a=a.toLowerCase()),s.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=a9(a),r.hRes=typeof e=="function"?e.apply(a,r.args):!0,{res:a,forceNext:!1}},r}en.promptCL=function(e,t){var r=eo({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},t),s=Eme(e,r);return r.limit=s.limit,r.preCheck=s.preCheck,en.prompt(r),s.args};en.promptLoop=function(e,t){for(var r=eo({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},t);!e(en.prompt(r)););};en.promptCLLoop=function(e,t){var r=eo({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},t),s=Eme(e,r);for(r.limit=s.limit,r.preCheck=s.preCheck;en.prompt(r),!s.hRes;);};en.promptSimShell=function(e){return en.prompt(eo({hideEchoBack:!1,history:!0},e,{prompt:function(){return Rm?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function Ime(e,t,r){var s;return e==null&&(e="Are you sure? "),(!t||t.guide!==!1)&&(e+="")&&(e=e.replace(/\s*:?\s*$/,"")+" [y/n]: "),s=en.keyIn(e,eo(t,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof s=="boolean"?s:""}en.keyInYN=function(e,t){return Ime(e,t)};en.keyInYNStrict=function(e,t){return Ime(e,t,"yn")};en.keyInPause=function(e,t){e==null&&(e="Continue..."),(!t||t.guide!==!1)&&(e+="")&&(e=e.replace(/\s+$/,"")+" (Hit any key)"),en.keyIn(e,eo({limit:null},t,{hideEchoBack:!0,mask:""}))};en.keyInSelect=function(e,t,r){var s=eo({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?e.length+"":p==="firstItem"?(e[0]+"").trim():p==="lastItem"?(e[e.length-1]+"").trim():null}}),a="",n={},c=49,f=` +`;if(!Array.isArray(e)||!e.length||e.length>35)throw"`items` must be Array (max length: 35).";return e.forEach(function(p,h){var E=String.fromCharCode(c);a+=E,n[E]=h,f+="["+E+"] "+(p+"").trim()+` +`,c=c===57?97:c+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,f+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` +`),s.limit=a,f+=` +`,t==null&&(t="Choose one from list: "),(t+="")&&((!r||r.guide!==!1)&&(t=t.replace(/\s*:?\s*$/,"")+" [$]: "),f+=t),n[en.keyIn(f,s).toLowerCase()]};en.getRawInput=function(){return zR};function fS(e,t){var r;return t.length&&(r={},r[e]=t[0]),en.setDefaultOptions(r)[e]}en.setPrint=function(){return fS("print",arguments)};en.setPrompt=function(){return fS("prompt",arguments)};en.setEncoding=function(){return fS("encoding",arguments)};en.setMask=function(){return fS("mask",arguments)};en.setBufferSize=function(){return fS("bufferSize",arguments)}});var f9=G((Dqt,nc)=>{(function(){var e={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(w,D,y){var F=tau_file_system.files[w];if(!F){if(y==="read")return null;F={path:w,text:"",type:D,get:function(z,Z){return Z===this.text.length||Z>this.text.length?"end_of_file":this.text.substring(Z,Z+z)},put:function(z,Z){return Z==="end_of_file"?(this.text+=z,!0):Z==="past_end_of_file"?null:(this.text=this.text.substring(0,Z)+z+this.text.substring(Z+z.length),!0)},get_byte:function(z){if(z==="end_of_stream")return-1;var Z=Math.floor(z/2);if(this.text.length<=Z)return-1;var ee=n(this.text[Math.floor(z/2)],0);return z%2===0?ee&255:ee/256>>>0},put_byte:function(z,Z){var ee=Z==="end_of_stream"?this.text.length:Math.floor(Z/2);if(this.text.length>>0,se=(se&255)<<8|z&255):(se=se&255,se=(z&255)<<8|se&255),this.text.length===ee?this.text+=c(se):this.text=this.text.substring(0,ee)+c(se)+this.text.substring(ee+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[w]=F}return y==="write"&&(F.text=""),F}},tau_user_input={buffer:"",get:function(w,D){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function N(w,D){return w.get_flag("char_conversion").id==="on"?D.replace(/./g,function(y){return w.get_char_conversion(y)}):D}function U(w){this.thread=w,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var D,y=0,F=0,z=0,Z=[],ee=!1;if(w){var se=this.tokens[w-1];y=se.len,D=N(this.thread,this.text.substr(se.len)),F=se.line,z=se.start}else D=this.text;if(/^\s*$/.test(D))return null;for(;D!=="";){var xe=[],Ne=!1;if(/^\n/.exec(D)!==null){F++,z=0,y++,D=D.replace(/\n/,""),ee=!0;continue}for(var ut in R)if(R.hasOwnProperty(ut)){var Ct=R[ut].exec(D);Ct&&xe.push({value:Ct[0],name:ut,matches:Ct})}if(!xe.length)return this.set_last_tokens([{value:D,matches:[],name:"lexical",line:F,start:z}]);var se=r(xe,function(Pr,Cr){return Pr.value.length>=Cr.value.length?Pr:Cr});switch(se.start=z,se.line=F,D=D.replace(se.value,""),z+=se.value.length,y+=se.value.length,se.name){case"atom":se.raw=se.value,se.value.charAt(0)==="'"&&(se.value=S(se.value.substr(1,se.value.length-2),"'"),se.value===null&&(se.name="lexical",se.value="unknown escape sequence"));break;case"number":se.float=se.value.substring(0,2)!=="0x"&&se.value.match(/[.eE]/)!==null&&se.value!=="0'.",se.value=I(se.value),se.blank=Ne;break;case"string":var Yt=se.value.charAt(0);se.value=S(se.value.substr(1,se.value.length-2),Yt),se.value===null&&(se.name="lexical",se.value="unknown escape sequence");break;case"whitespace":var ir=Z[Z.length-1];ir&&(ir.space=!0),Ne=!0;continue;case"r_bracket":Z.length>0&&Z[Z.length-1].name==="l_bracket"&&(se=Z.pop(),se.name="atom",se.value="{}",se.raw="{}",se.space=!1);break;case"r_brace":Z.length>0&&Z[Z.length-1].name==="l_brace"&&(se=Z.pop(),se.name="atom",se.value="[]",se.raw="[]",se.space=!1);break}se.len=y,Z.push(se),Ne=!1}var Pt=this.set_last_tokens(Z);return Pt.length===0?null:Pt};function K(w,D,y,F,z){if(!D[y])return{type:f,value:P.error.syntax(D[y-1],"expression expected",!0)};var Z;if(F==="0"){var ee=D[y];switch(ee.name){case"number":return{type:p,len:y+1,value:new P.type.Num(ee.value,ee.float)};case"variable":return{type:p,len:y+1,value:new P.type.Var(ee.value)};case"string":var se;switch(w.get_flag("double_quotes").id){case"atom":se=new _(ee.value,[]);break;case"codes":se=new _("[]",[]);for(var xe=ee.value.length-1;xe>=0;xe--)se=new _(".",[new P.type.Num(n(ee.value,xe),!1),se]);break;case"chars":se=new _("[]",[]);for(var xe=ee.value.length-1;xe>=0;xe--)se=new _(".",[new P.type.Term(ee.value.charAt(xe),[]),se]);break}return{type:p,len:y+1,value:se};case"l_paren":var Pt=K(w,D,y+1,w.__get_max_priority(),!0);return Pt.type!==p?Pt:D[Pt.len]&&D[Pt.len].name==="r_paren"?(Pt.len++,Pt):{type:f,derived:!0,value:P.error.syntax(D[Pt.len]?D[Pt.len]:D[Pt.len-1],") or operator expected",!D[Pt.len])};case"l_bracket":var Pt=K(w,D,y+1,w.__get_max_priority(),!0);return Pt.type!==p?Pt:D[Pt.len]&&D[Pt.len].name==="r_bracket"?(Pt.len++,Pt.value=new _("{}",[Pt.value]),Pt):{type:f,derived:!0,value:P.error.syntax(D[Pt.len]?D[Pt.len]:D[Pt.len-1],"} or operator expected",!D[Pt.len])}}var Ne=$(w,D,y,z);return Ne.type===p||Ne.derived||(Ne=ie(w,D,y),Ne.type===p||Ne.derived)?Ne:{type:f,derived:!1,value:P.error.syntax(D[y],"unexpected token")}}var ut=w.__get_max_priority(),Ct=w.__get_next_priority(F),Yt=y;if(D[y].name==="atom"&&D[y+1]&&(D[y].space||D[y+1].name!=="l_paren")){var ee=D[y++],ir=w.__lookup_operator_classes(F,ee.value);if(ir&&ir.indexOf("fy")>-1){var Pt=K(w,D,y,F,z);if(Pt.type!==f)return ee.value==="-"&&!ee.space&&P.type.is_number(Pt.value)?{value:new P.type.Num(-Pt.value.value,Pt.value.is_float),len:Pt.len,type:p}:{value:new P.type.Term(ee.value,[Pt.value]),len:Pt.len,type:p};Z=Pt}else if(ir&&ir.indexOf("fx")>-1){var Pt=K(w,D,y,Ct,z);if(Pt.type!==f)return{value:new P.type.Term(ee.value,[Pt.value]),len:Pt.len,type:p};Z=Pt}}y=Yt;var Pt=K(w,D,y,Ct,z);if(Pt.type===p){y=Pt.len;var ee=D[y];if(D[y]&&(D[y].name==="atom"&&w.__lookup_operator_classes(F,ee.value)||D[y].name==="bar"&&w.__lookup_operator_classes(F,"|"))){var mn=Ct,Pr=F,ir=w.__lookup_operator_classes(F,ee.value);if(ir.indexOf("xf")>-1)return{value:new P.type.Term(ee.value,[Pt.value]),len:++Pt.len,type:p};if(ir.indexOf("xfx")>-1){var Cr=K(w,D,y+1,mn,z);return Cr.type===p?{value:new P.type.Term(ee.value,[Pt.value,Cr.value]),len:Cr.len,type:p}:(Cr.derived=!0,Cr)}else if(ir.indexOf("xfy")>-1){var Cr=K(w,D,y+1,Pr,z);return Cr.type===p?{value:new P.type.Term(ee.value,[Pt.value,Cr.value]),len:Cr.len,type:p}:(Cr.derived=!0,Cr)}else if(Pt.type!==f)for(;;){y=Pt.len;var ee=D[y];if(ee&&ee.name==="atom"&&w.__lookup_operator_classes(F,ee.value)){var ir=w.__lookup_operator_classes(F,ee.value);if(ir.indexOf("yf")>-1)Pt={value:new P.type.Term(ee.value,[Pt.value]),len:++y,type:p};else if(ir.indexOf("yfx")>-1){var Cr=K(w,D,++y,mn,z);if(Cr.type===f)return Cr.derived=!0,Cr;y=Cr.len,Pt={value:new P.type.Term(ee.value,[Pt.value,Cr.value]),len:y,type:p}}else break}else break}}else Z={type:f,value:P.error.syntax(D[Pt.len-1],"operator expected")};return Pt}return Pt}function $(w,D,y,F){if(!D[y]||D[y].name==="atom"&&D[y].raw==="."&&!F&&(D[y].space||!D[y+1]||D[y+1].name!=="l_paren"))return{type:f,derived:!1,value:P.error.syntax(D[y-1],"unfounded token")};var z=D[y],Z=[];if(D[y].name==="atom"&&D[y].raw!==","){if(y++,D[y-1].space)return{type:p,len:y,value:new P.type.Term(z.value,Z)};if(D[y]&&D[y].name==="l_paren"){if(D[y+1]&&D[y+1].name==="r_paren")return{type:f,derived:!0,value:P.error.syntax(D[y+1],"argument expected")};var ee=K(w,D,++y,"999",!0);if(ee.type===f)return ee.derived?ee:{type:f,derived:!0,value:P.error.syntax(D[y]?D[y]:D[y-1],"argument expected",!D[y])};for(Z.push(ee.value),y=ee.len;D[y]&&D[y].name==="atom"&&D[y].value===",";){if(ee=K(w,D,y+1,"999",!0),ee.type===f)return ee.derived?ee:{type:f,derived:!0,value:P.error.syntax(D[y+1]?D[y+1]:D[y],"argument expected",!D[y+1])};Z.push(ee.value),y=ee.len}if(D[y]&&D[y].name==="r_paren")y++;else return{type:f,derived:!0,value:P.error.syntax(D[y]?D[y]:D[y-1],", or ) expected",!D[y])}}return{type:p,len:y,value:new P.type.Term(z.value,Z)}}return{type:f,derived:!1,value:P.error.syntax(D[y],"term expected")}}function ie(w,D,y){if(!D[y])return{type:f,derived:!1,value:P.error.syntax(D[y-1],"[ expected")};if(D[y]&&D[y].name==="l_brace"){var F=K(w,D,++y,"999",!0),z=[F.value],Z=void 0;if(F.type===f)return D[y]&&D[y].name==="r_brace"?{type:p,len:y+1,value:new P.type.Term("[]",[])}:{type:f,derived:!0,value:P.error.syntax(D[y],"] expected")};for(y=F.len;D[y]&&D[y].name==="atom"&&D[y].value===",";){if(F=K(w,D,y+1,"999",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:P.error.syntax(D[y+1]?D[y+1]:D[y],"argument expected",!D[y+1])};z.push(F.value),y=F.len}var ee=!1;if(D[y]&&D[y].name==="bar"){if(ee=!0,F=K(w,D,y+1,"999",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:P.error.syntax(D[y+1]?D[y+1]:D[y],"argument expected",!D[y+1])};Z=F.value,y=F.len}return D[y]&&D[y].name==="r_brace"?{type:p,len:y+1,value:d(z,Z)}:{type:f,derived:!0,value:P.error.syntax(D[y]?D[y]:D[y-1],ee?"] expected":", or | or ] expected",!D[y])}}return{type:f,derived:!1,value:P.error.syntax(D[y],"list expected")}}function fe(w,D,y){var F=D[y].line,z=K(w,D,y,w.__get_max_priority(),!1),Z=null,ee;if(z.type!==f)if(y=z.len,D[y]&&D[y].name==="atom"&&D[y].raw===".")if(y++,P.type.is_term(z.value)){if(z.value.indicator===":-/2"?(Z=new P.type.Rule(z.value.args[0],ye(z.value.args[1])),ee={value:Z,len:y,type:p}):z.value.indicator==="-->/2"?(Z=pe(new P.type.Rule(z.value.args[0],z.value.args[1]),w),Z.body=ye(Z.body),ee={value:Z,len:y,type:P.type.is_rule(Z)?p:f}):(Z=new P.type.Rule(z.value,null),ee={value:Z,len:y,type:p}),Z){var se=Z.singleton_variables();se.length>0&&w.throw_warning(P.warning.singleton(se,Z.head.indicator,F))}return ee}else return{type:f,value:P.error.syntax(D[y],"callable expected")};else return{type:f,value:P.error.syntax(D[y]?D[y]:D[y-1],". or operator expected")};return z}function le(w,D,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),z={},Z;F.new_text(D);var ee=0,se=F.get_tokens(ee);do{if(se===null||!se[ee])break;var xe=fe(w,se,ee);if(xe.type===f)return new _("throw",[xe.value]);if(xe.value.body===null&&xe.value.head.indicator==="?-/1"){var Ne=new ct(w.session);Ne.add_goal(xe.value.head.args[0]),Ne.answer(function(Ct){P.type.is_error(Ct)?w.throw_warning(Ct.args[0]):(Ct===!1||Ct===null)&&w.throw_warning(P.warning.failed_goal(xe.value.head.args[0],xe.len))}),ee=xe.len;var ut=!0}else if(xe.value.body===null&&xe.value.head.indicator===":-/1"){var ut=w.run_directive(xe.value.head.args[0]);ee=xe.len,xe.value.head.args[0].indicator==="char_conversion/2"&&(se=F.get_tokens(ee),ee=0)}else{Z=xe.value.head.indicator,y.reconsult!==!1&&z[Z]!==!0&&!w.is_multifile_predicate(Z)&&(w.session.rules[Z]=a(w.session.rules[Z]||[],function(Yt){return Yt.dynamic}),z[Z]=!0);var ut=w.add_rule(xe.value,y);ee=xe.len}if(!ut)return ut}while(!0);return!0}function ge(w,D){var y=new U(w);y.new_text(D);var F=0;do{var z=y.get_tokens(F);if(z===null)break;var Z=K(w,z,0,w.__get_max_priority(),!1);if(Z.type!==f){var ee=Z.len,se=ee;if(z[ee]&&z[ee].name==="atom"&&z[ee].raw===".")w.add_goal(ye(Z.value));else{var xe=z[ee];return new _("throw",[P.error.syntax(xe||z[ee-1],". or operator expected",!xe)])}F=Z.len+1}else return new _("throw",[Z.value])}while(!0);return!0}function pe(w,D){w=w.rename(D);var y=D.next_free_variable(),F=De(w.body,y,D);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new _(w.head.id,w.head.args),w)}function De(w,D,y){var F;if(P.type.is_term(w)&&w.indicator==="!/0")return{value:w,variable:D,error:!1};if(P.type.is_term(w)&&w.indicator===",/2"){var z=De(w.args[0],D,y);if(z.error)return z;var Z=De(w.args[1],z.variable,y);return Z.error?Z:{value:new _(",",[z.value,Z.value]),variable:Z.variable,error:!1}}else{if(P.type.is_term(w)&&w.indicator==="{}/1")return{value:w.args[0],variable:D,error:!1};if(P.type.is_empty_list(w))return{value:new _("true",[]),variable:D,error:!1};if(P.type.is_list(w)){F=y.next_free_variable();for(var ee=w,se;ee.indicator==="./2";)se=ee,ee=ee.args[1];return P.type.is_variable(ee)?{value:P.error.instantiation("DCG"),variable:D,error:!0}:P.type.is_empty_list(ee)?(se.args[1]=F,{value:new _("=",[D,w]),variable:F,error:!1}):{value:P.error.type("list",w,"DCG"),variable:D,error:!0}}else return P.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([D,F]),w=new _(w.id,w.args),{value:w,variable:F,error:!1}):{value:P.error.type("callable",w,"DCG"),variable:D,error:!0}}}function ye(w){return P.type.is_variable(w)?new _("call",[w]):P.type.is_term(w)&&[",/2",";/2","->/2"].indexOf(w.indicator)!==-1?new _(w.id,[ye(w.args[0]),ye(w.args[1])]):w}function d(w,D){for(var y=D||new P.type.Term("[]",[]),F=w.length-1;F>=0;F--)y=new P.type.Term(".",[w[F],y]);return y}function ve(w,D){for(var y=w.length-1;y>=0;y--)w[y]===D&&w.splice(y,1)}function Ie(w){for(var D={},y=[],F=0;F=0;D--)if(w.charAt(D)==="/")return new _("/",[new _(w.substring(0,D)),new ke(parseInt(w.substring(D+1)),!1)])}function be(w){this.id=w}function ke(w,D){this.is_float=D!==void 0?D:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var it=0;function _(w,D,y){this.ref=y||++it,this.id=w,this.args=D||[],this.indicator=w+"/"+this.args.length}var tt=0;function Fe(w,D,y,F,z,Z){this.id=tt++,this.stream=w,this.mode=D,this.alias=y,this.type=F!==void 0?F:"text",this.reposition=z!==void 0?z:!0,this.eof_action=Z!==void 0?Z:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Qe(w){w=w||{},this.links=w}function Se(w,D,y){D=D||new Qe,y=y||null,this.goal=w,this.substitution=D,this.parent=y}function je(w,D,y){this.head=w,this.body=D,this.dynamic=y||!1}function Te(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new ct(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Fe(typeof nc<"u"&&nc.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Fe(typeof nc<"u"&&nc.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof nc<"u"&&nc.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(D){return D.substitution},this.format_error=function(D){return D.goal},this.flag={bounded:P.flag.bounded.value,max_integer:P.flag.max_integer.value,min_integer:P.flag.min_integer.value,integer_rounding_function:P.flag.integer_rounding_function.value,char_conversion:P.flag.char_conversion.value,debug:P.flag.debug.value,max_arity:P.flag.max_arity.value,unknown:P.flag.unknown.value,double_quotes:P.flag.double_quotes.value,occurs_check:P.flag.occurs_check.value,dialect:P.flag.dialect.value,version_data:P.flag.version_data.value,nodejs:P.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function ct(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function Me(w,D,y){this.id=w,this.rules=D,this.exports=y,P.module[w]=this}Me.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},be.prototype.unify=function(w,D){if(D&&t(w.variables(),this.id)!==-1&&!P.type.is_variable(w))return null;var y={};return y[this.id]=w,new Qe(y)},ke.prototype.unify=function(w,D){return P.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new Qe:null},_.prototype.unify=function(w,D){if(P.type.is_term(w)&&this.indicator===w.indicator){for(var y=new Qe,F=0;F=0){var F=this.args[0].value,z=Math.floor(F/26),Z=F%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[Z]+(z!==0?z:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(w)+"}";case"./2":for(var ee="["+this.args[0].toString(w),se=this.args[1];se.indicator==="./2";)ee+=", "+se.args[0].toString(w),se=se.args[1];return se.indicator!=="[]/0"&&(ee+="|"+se.toString(w)),ee+="]",ee;case",/2":return"("+this.args[0].toString(w)+", "+this.args[1].toString(w)+")";default:var xe=this.id,Ne=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Ne===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(xe)&&xe!=="{}"&&xe!=="[]"&&(xe="'"+x(xe)+"'"),xe+(this.args.length?"("+s(this.args,function(ir){return ir.toString(w)}).join(", ")+")":"");var ut=Ne.priority>D.priority||Ne.priority===D.priority&&(Ne.class==="xfy"&&this.indicator!==D.indicator||Ne.class==="yfx"&&this.indicator!==D.indicator||this.indicator===D.indicator&&Ne.class==="yfx"&&y==="right"||this.indicator===D.indicator&&Ne.class==="xfy"&&y==="left");Ne.indicator=this.indicator;var Ct=ut?"(":"",Yt=ut?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Ne.class)!==-1?Ct+xe+" "+this.args[0].toString(w,Ne)+Yt:["yf","xf"].indexOf(Ne.class)!==-1?Ct+this.args[0].toString(w,Ne)+" "+xe+Yt:Ct+this.args[0].toString(w,Ne,"left")+" "+this.id+" "+this.args[1].toString(w,Ne,"right")+Yt}},Fe.prototype.toString=function(w){return"("+this.id+")"},Qe.prototype.toString=function(w){var D="{";for(var y in this.links)this.links.hasOwnProperty(y)&&(D!=="{"&&(D+=", "),D+=y+"/"+this.links[y].toString(w));return D+="}",D},Se.prototype.toString=function(w){return this.goal===null?"<"+this.substitution.toString(w)+">":"<"+this.goal.toString(w)+", "+this.substitution.toString(w)+">"},je.prototype.toString=function(w){return this.body?this.head.toString(w)+" :- "+this.body.toString(w)+".":this.head.toString(w)+"."},Te.prototype.toString=function(w){for(var D="",y=0;y=0;z--)F=new _(".",[D[z],F]);return F}return new _(this.id,s(this.args,function(Z){return Z.apply(w)}),this.ref)},Fe.prototype.apply=function(w){return this},je.prototype.apply=function(w){return new je(this.head.apply(w),this.body!==null?this.body.apply(w):null)},Qe.prototype.apply=function(w){var D,y={};for(D in this.links)this.links.hasOwnProperty(D)&&(y[D]=this.links[D].apply(w));return new Qe(y)},_.prototype.select=function(){for(var w=this;w.indicator===",/2";)w=w.args[0];return w},_.prototype.replace=function(w){return this.indicator===",/2"?this.args[0].indicator===",/2"?new _(",",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new _(",",[w,this.args[1]]):w},_.prototype.search=function(w){if(P.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var D=0;DD&&F0&&(D=this.head_point().substitution.domain());t(D,P.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id==="_")return new be(P.format_variable(this.session.rename));this.session.renamed_variables[w.id]=P.format_variable(this.session.rename)}return new be(this.session.renamed_variables[w.id])},Te.prototype.next_free_variable=function(){return this.thread.next_free_variable()},ct.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());t(w,P.format_variable(this.session.rename))!==-1;)this.session.rename++;return new be(P.format_variable(this.session.rename))},Te.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},ct.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},Te.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},ct.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},Te.prototype.prepend=function(w){return this.thread.prepend(w)},ct.prototype.prepend=function(w){for(var D=w.length-1;D>=0;D--)this.points.push(w[D])},Te.prototype.success=function(w,D){return this.thread.success(w,D)},ct.prototype.success=function(w,y){var y=typeof y>"u"?w:y;this.prepend([new Se(w.goal.replace(null),w.substitution,y)])},Te.prototype.throw_error=function(w){return this.thread.throw_error(w)},ct.prototype.throw_error=function(w){this.prepend([new Se(new _("throw",[w]),new Qe,null,null)])},Te.prototype.step_rule=function(w,D){return this.thread.step_rule(w,D)},ct.prototype.step_rule=function(w,D){var y=D.indicator;if(w==="user"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:t(this.session.modules,w)===-1?[]:[w],z=0;z1)&&this.again()},Te.prototype.answers=function(w,D,y){return this.thread.answers(w,D,y)},ct.prototype.answers=function(w,D,y){var F=D||1e3,z=this;if(D<=0){y&&y();return}this.answer(function(Z){w(Z),Z!==!1?setTimeout(function(){z.answers(w,D-1,y)},1):y&&y()})},Te.prototype.again=function(w){return this.thread.again(w)},ct.prototype.again=function(w){for(var D,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!P.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):P.type.is_error(this.head_point().goal)?(D=this.session.format_error(this.points.pop()),this.points=[],z(D)):(this.debugger&&this.debugger_states.push(this.head_point()),D=this.session.format_success(this.points.pop()),z(D))}},Te.prototype.unfold=function(w){if(w.body===null)return!1;var D=w.head,y=w.body,F=y.select(),z=new ct(this),Z=[];z.add_goal(F),z.step();for(var ee=z.points.length-1;ee>=0;ee--){var se=z.points[ee],xe=D.apply(se.substitution),Ne=y.replace(se.goal);Ne!==null&&(Ne=Ne.apply(se.substitution)),Z.push(new je(xe,Ne))}var ut=this.rules[D.indicator],Ct=t(ut,w);return Z.length>0&&Ct!==-1?(ut.splice.apply(ut,[Ct,1].concat(Z)),!0):!1},ct.prototype.unfold=function(w){return this.session.unfold(w)},be.prototype.interpret=function(w){return P.error.instantiation(w.level)},ke.prototype.interpret=function(w){return this},_.prototype.interpret=function(w){return P.type.is_unitary_list(this)?this.args[0].interpret(w):P.operate(w,this)},be.prototype.compare=function(w){return this.idw.id?1:0},ke.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.valuew.value)return 1},_.prototype.compare=function(w){if(this.args.lengthw.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var D=0;DF)return 1;if(w.constructor===ke){if(w.is_float&&D.is_float)return 0;if(w.is_float)return-1;if(D.is_float)return 1}return 0},is_substitution:function(w){return w instanceof Qe},is_state:function(w){return w instanceof Se},is_rule:function(w){return w instanceof je},is_variable:function(w){return w instanceof be},is_stream:function(w){return w instanceof Fe},is_anonymous_var:function(w){return w instanceof be&&w.id==="_"},is_callable:function(w){return w instanceof _},is_number:function(w){return w instanceof ke},is_integer:function(w){return w instanceof ke&&!w.is_float},is_float:function(w){return w instanceof ke&&w.is_float},is_term:function(w){return w instanceof _},is_atom:function(w){return w instanceof _&&w.args.length===0},is_ground:function(w){if(w instanceof be)return!1;if(w instanceof _){for(var D=0;D0},is_list:function(w){return w instanceof _&&(w.indicator==="[]/0"||w.indicator==="./2")},is_empty_list:function(w){return w instanceof _&&w.indicator==="[]/0"},is_non_empty_list:function(w){return w instanceof _&&w.indicator==="./2"},is_fully_list:function(w){for(;w instanceof _&&w.indicator==="./2";)w=w.args[1];return w instanceof be||w instanceof _&&w.indicator==="[]/0"},is_instantiated_list:function(w){for(;w instanceof _&&w.indicator==="./2";)w=w.args[1];return w instanceof _&&w.indicator==="[]/0"},is_unitary_list:function(w){return w instanceof _&&w.indicator==="./2"&&w.args[1]instanceof _&&w.args[1].indicator==="[]/0"},is_character:function(w){return w instanceof _&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof ke&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof ke&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof _&&P.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof _&&P.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof _&&P.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof _&&w.indicator==="throw/1"},is_predicate_indicator:function(w){return w instanceof _&&w.indicator==="//2"&&w.args[0]instanceof _&&w.args[0].args.length===0&&w.args[1]instanceof ke&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof _&&w.args.length===0&&P.flag[w.id]!==void 0},is_value_flag:function(w,D){if(!P.type.is_flag(w))return!1;for(var y in P.flag[w.id].allowed)if(P.flag[w.id].allowed.hasOwnProperty(y)&&P.flag[w.id].allowed[y].equals(D))return!0;return!1},is_io_mode:function(w){return P.type.is_atom(w)&&["read","write","append"].indexOf(w.id)!==-1},is_stream_option:function(w){return P.type.is_term(w)&&(w.indicator==="alias/1"&&P.type.is_atom(w.args[0])||w.indicator==="reposition/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="type/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary")||w.indicator==="eof_action/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))},is_stream_position:function(w){return P.type.is_integer(w)&&w.value>=0||P.type.is_atom(w)&&(w.id==="end_of_stream"||w.id==="past_end_of_stream")},is_stream_property:function(w){return P.type.is_term(w)&&(w.indicator==="input/0"||w.indicator==="output/0"||w.indicator==="alias/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0]))||w.indicator==="file_name/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0]))||w.indicator==="position/1"&&(P.type.is_variable(w.args[0])||P.type.is_stream_position(w.args[0]))||w.indicator==="reposition/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))||w.indicator==="type/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary"))||w.indicator==="mode/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0])&&(w.args[0].id==="read"||w.args[0].id==="write"||w.args[0].id==="append"))||w.indicator==="eof_action/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))||w.indicator==="end_of_stream/1"&&(P.type.is_variable(w.args[0])||P.type.is_atom(w.args[0])&&(w.args[0].id==="at"||w.args[0].id==="past"||w.args[0].id==="not")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return P.type.is_term(w)&&["variables/1","variable_names/1","singletons/1"].indexOf(w.indicator)!==-1},is_write_option:function(w){return P.type.is_term(w)&&(w.indicator==="quoted/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="ignore_ops/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="numbervars/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))},is_close_option:function(w){return P.type.is_term(w)&&w.indicator==="force/1"&&P.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")},is_modifiable_flag:function(w){return P.type.is_flag(w)&&P.flag[w.id].changeable},is_module:function(w){return w instanceof _&&w.indicator==="library/1"&&w.args[0]instanceof _&&w.args[0].args.length===0&&P.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(w){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(w,D){return w}},"-/1":{type_args:null,type_result:null,fn:function(w,D){return-w}},"\\/1":{type_args:!1,type_result:!1,fn:function(w,D){return~w}},"abs/1":{type_args:null,type_result:null,fn:function(w,D){return Math.abs(w)}},"sign/1":{type_args:null,type_result:null,fn:function(w,D){return Math.sign(w)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(w,D){return parseInt(w)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(w,D){return w-parseInt(w)}},"float/1":{type_args:null,type_result:!0,fn:function(w,D){return parseFloat(w)}},"floor/1":{type_args:!0,type_result:!1,fn:function(w,D){return Math.floor(w)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(w,D){return parseInt(w)}},"round/1":{type_args:!0,type_result:!1,fn:function(w,D){return Math.round(w)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(w,D){return Math.ceil(w)}},"sin/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.sin(w)}},"cos/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.cos(w)}},"tan/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.tan(w)}},"asin/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.asin(w)}},"acos/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.acos(w)}},"atan/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.atan(w)}},"atan2/2":{type_args:null,type_result:!0,fn:function(w,D,y){return Math.atan2(w,D)}},"exp/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.exp(w)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(w,D){return Math.sqrt(w)}},"log/1":{type_args:null,type_result:!0,fn:function(w,D){return w>0?Math.log(w):P.error.evaluation("undefined",D.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(w,D,y){return w+D}},"-/2":{type_args:null,type_result:null,fn:function(w,D,y){return w-D}},"*/2":{type_args:null,type_result:null,fn:function(w,D,y){return w*D}},"//2":{type_args:null,type_result:!0,fn:function(w,D,y){return D?w/D:P.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(w,D,y){return D?parseInt(w/D):P.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(w,D,y){return Math.pow(w,D)}},"^/2":{type_args:null,type_result:null,fn:function(w,D,y){return Math.pow(w,D)}},"<>/2":{type_args:!1,type_result:!1,fn:function(w,D,y){return w>>D}},"/\\/2":{type_args:!1,type_result:!1,fn:function(w,D,y){return w&D}},"\\//2":{type_args:!1,type_result:!1,fn:function(w,D,y){return w|D}},"xor/2":{type_args:!1,type_result:!1,fn:function(w,D,y){return w^D}},"rem/2":{type_args:!1,type_result:!1,fn:function(w,D,y){return D?w%D:P.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(w,D,y){return D?w-parseInt(w/D)*D:P.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(w,D,y){return Math.max(w,D)}},"min/2":{type_args:null,type_result:null,fn:function(w,D,y){return Math.min(w,D)}}}},directive:{"dynamic/1":function(w,D){var y=D.args[0];if(P.type.is_variable(y))w.throw_error(P.error.instantiation(D.indicator));else if(!P.type.is_compound(y)||y.indicator!=="//2")w.throw_error(P.error.type("predicate_indicator",y,D.indicator));else if(P.type.is_variable(y.args[0])||P.type.is_variable(y.args[1]))w.throw_error(P.error.instantiation(D.indicator));else if(!P.type.is_atom(y.args[0]))w.throw_error(P.error.type("atom",y.args[0],D.indicator));else if(!P.type.is_integer(y.args[1]))w.throw_error(P.error.type("integer",y.args[1],D.indicator));else{var F=D.args[0].args[0].id+"/"+D.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},"multifile/1":function(w,D){var y=D.args[0];P.type.is_variable(y)?w.throw_error(P.error.instantiation(D.indicator)):!P.type.is_compound(y)||y.indicator!=="//2"?w.throw_error(P.error.type("predicate_indicator",y,D.indicator)):P.type.is_variable(y.args[0])||P.type.is_variable(y.args[1])?w.throw_error(P.error.instantiation(D.indicator)):P.type.is_atom(y.args[0])?P.type.is_integer(y.args[1])?w.session.multifile_predicates[D.args[0].args[0].id+"/"+D.args[0].args[1].value]=!0:w.throw_error(P.error.type("integer",y.args[1],D.indicator)):w.throw_error(P.error.type("atom",y.args[0],D.indicator))},"set_prolog_flag/2":function(w,D){var y=D.args[0],F=D.args[1];P.type.is_variable(y)||P.type.is_variable(F)?w.throw_error(P.error.instantiation(D.indicator)):P.type.is_atom(y)?P.type.is_flag(y)?P.type.is_value_flag(y,F)?P.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(P.error.permission("modify","flag",y)):w.throw_error(P.error.domain("flag_value",new _("+",[y,F]),D.indicator)):w.throw_error(P.error.domain("prolog_flag",y,D.indicator)):w.throw_error(P.error.type("atom",y,D.indicator))},"use_module/1":function(w,D){var y=D.args[0];if(P.type.is_variable(y))w.throw_error(P.error.instantiation(D.indicator));else if(!P.type.is_term(y))w.throw_error(P.error.type("term",y,D.indicator));else if(P.type.is_module(y)){var F=y.args[0].id;t(w.session.modules,F)===-1&&w.session.modules.push(F)}},"char_conversion/2":function(w,D){var y=D.args[0],F=D.args[1];P.type.is_variable(y)||P.type.is_variable(F)?w.throw_error(P.error.instantiation(D.indicator)):P.type.is_character(y)?P.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(P.error.type("character",F,D.indicator)):w.throw_error(P.error.type("character",y,D.indicator))},"op/3":function(w,D){var y=D.args[0],F=D.args[1],z=D.args[2];if(P.type.is_variable(y)||P.type.is_variable(F)||P.type.is_variable(z))w.throw_error(P.error.instantiation(D.indicator));else if(!P.type.is_integer(y))w.throw_error(P.error.type("integer",y,D.indicator));else if(!P.type.is_atom(F))w.throw_error(P.error.type("atom",F,D.indicator));else if(!P.type.is_atom(z))w.throw_error(P.error.type("atom",z,D.indicator));else if(y.value<0||y.value>1200)w.throw_error(P.error.domain("operator_priority",y,D.indicator));else if(z.id===",")w.throw_error(P.error.permission("modify","operator",z,D.indicator));else if(z.id==="|"&&(y.value<1001||F.id.length!==3))w.throw_error(P.error.permission("modify","operator",z,D.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(F.id)===-1)w.throw_error(P.error.domain("operator_specifier",F,D.indicator));else{var Z={prefix:null,infix:null,postfix:null};for(var ee in w.session.__operators)if(w.session.__operators.hasOwnProperty(ee)){var se=w.session.__operators[ee][z.id];se&&(t(se,"fx")!==-1&&(Z.prefix={priority:ee,type:"fx"}),t(se,"fy")!==-1&&(Z.prefix={priority:ee,type:"fy"}),t(se,"xf")!==-1&&(Z.postfix={priority:ee,type:"xf"}),t(se,"yf")!==-1&&(Z.postfix={priority:ee,type:"yf"}),t(se,"xfx")!==-1&&(Z.infix={priority:ee,type:"xfx"}),t(se,"xfy")!==-1&&(Z.infix={priority:ee,type:"xfy"}),t(se,"yfx")!==-1&&(Z.infix={priority:ee,type:"yfx"}))}var xe;switch(F.id){case"fy":case"fx":xe="prefix";break;case"yf":case"xf":xe="postfix";break;default:xe="infix";break}if(((Z.prefix&&xe==="prefix"||Z.postfix&&xe==="postfix"||Z.infix&&xe==="infix")&&Z[xe].type!==F.id||Z.infix&&xe==="postfix"||Z.postfix&&xe==="infix")&&y.value!==0)w.throw_error(P.error.permission("create","operator",z,D.indicator));else return Z[xe]&&(ve(w.session.__operators[Z[xe].priority][z.id],F.id),w.session.__operators[Z[xe].priority][z.id].length===0&&delete w.session.__operators[Z[xe].priority][z.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][z.id]||(w.session.__operators[y.value][z.id]=[]),w.session.__operators[y.value][z.id].push(F.id)),!0}}},predicate:{"op/3":function(w,D,y){P.directive["op/3"](w,y)&&w.success(D)},"current_op/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2],ee=[];for(var se in w.session.__operators)for(var xe in w.session.__operators[se])for(var Ne=0;Ne/2"){var F=w.points,z=w.session.format_success,Z=w.session.format_error;w.session.format_success=function(Ne){return Ne.substitution},w.session.format_error=function(Ne){return Ne.goal},w.points=[new Se(y.args[0].args[0],D.substitution,D)];var ee=function(Ne){w.points=F,w.session.format_success=z,w.session.format_error=Z,Ne===!1?w.prepend([new Se(D.goal.replace(y.args[1]),D.substitution,D)]):P.type.is_error(Ne)?w.throw_error(Ne.args[0]):Ne===null?(w.prepend([D]),w.__calls.shift()(null)):w.prepend([new Se(D.goal.replace(y.args[0].args[1]).apply(Ne),D.substitution.apply(Ne),D)])};w.__calls.unshift(ee)}else{var se=new Se(D.goal.replace(y.args[0]),D.substitution,D),xe=new Se(D.goal.replace(y.args[1]),D.substitution,D);w.prepend([se,xe])}},"!/0":function(w,D,y){var F,z,Z=[];for(F=D,z=null;F.parent!==null&&F.parent.goal.search(y);)if(z=F,F=F.parent,F.goal!==null){var ee=F.goal.select();if(ee&&ee.id==="call"&&ee.search(y)){F=z;break}}for(var se=w.points.length-1;se>=0;se--){for(var xe=w.points[se],Ne=xe.parent;Ne!==null&&Ne!==F.parent;)Ne=Ne.parent;Ne===null&&Ne!==F.parent&&Z.push(xe)}w.points=Z.reverse(),w.success(D)},"\\+/1":function(w,D,y){var F=y.args[0];P.type.is_variable(F)?w.throw_error(P.error.instantiation(w.level)):P.type.is_callable(F)?w.prepend([new Se(D.goal.replace(new _(",",[new _(",",[new _("call",[F]),new _("!",[])]),new _("fail",[])])),D.substitution,D),new Se(D.goal.replace(null),D.substitution,D)]):w.throw_error(P.error.type("callable",F,w.level))},"->/2":function(w,D,y){var F=D.goal.replace(new _(",",[y.args[0],new _(",",[new _("!"),y.args[1]])]));w.prepend([new Se(F,D.substitution,D)])},"fail/0":function(w,D,y){},"false/0":function(w,D,y){},"true/0":function(w,D,y){w.success(D)},"call/1":ce(1),"call/2":ce(2),"call/3":ce(3),"call/4":ce(4),"call/5":ce(5),"call/6":ce(6),"call/7":ce(7),"call/8":ce(8),"once/1":function(w,D,y){var F=y.args[0];w.prepend([new Se(D.goal.replace(new _(",",[new _("call",[F]),new _("!",[])])),D.substitution,D)])},"forall/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _("\\+",[new _(",",[new _("call",[F]),new _("\\+",[new _("call",[z])])])])),D.substitution,D)])},"repeat/0":function(w,D,y){w.prepend([new Se(D.goal.replace(null),D.substitution,D),D])},"throw/1":function(w,D,y){P.type.is_variable(y.args[0])?w.throw_error(P.error.instantiation(w.level)):w.throw_error(y.args[0])},"catch/3":function(w,D,y){var F=w.points;w.points=[],w.prepend([new Se(y.args[0],D.substitution,D)]);var z=w.session.format_success,Z=w.session.format_error;w.session.format_success=function(se){return se.substitution},w.session.format_error=function(se){return se.goal};var ee=function(se){var xe=w.points;if(w.points=F,w.session.format_success=z,w.session.format_error=Z,P.type.is_error(se)){for(var Ne=[],ut=w.points.length-1;ut>=0;ut--){for(var ir=w.points[ut],Ct=ir.parent;Ct!==null&&Ct!==D.parent;)Ct=Ct.parent;Ct===null&&Ct!==D.parent&&Ne.push(ir)}w.points=Ne;var Yt=w.get_flag("occurs_check").indicator==="true/0",ir=new Se,Pt=P.unify(se.args[0],y.args[1],Yt);Pt!==null?(ir.substitution=D.substitution.apply(Pt),ir.goal=D.goal.replace(y.args[2]).apply(Pt),ir.parent=D,w.prepend([ir])):w.throw_error(se.args[0])}else if(se!==!1){for(var mn=se===null?[]:[new Se(D.goal.apply(se).replace(null),D.substitution.apply(se),D)],Pr=[],ut=xe.length-1;ut>=0;ut--){Pr.push(xe[ut]);var Cr=xe[ut].goal!==null?xe[ut].goal.select():null;if(P.type.is_term(Cr)&&Cr.indicator==="!/0")break}var Lr=s(Pr,function(on){return on.goal===null&&(on.goal=new _("true",[])),on=new Se(D.goal.replace(new _("catch",[on.goal,y.args[1],y.args[2]])),D.substitution.apply(on.substitution),on.parent),on.exclude=y.args[0].variables(),on}).reverse();w.prepend(Lr),w.prepend(mn),se===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift(ee)},"=/2":function(w,D,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=new Se,Z=P.unify(y.args[0],y.args[1],F);Z!==null&&(z.goal=D.goal.apply(Z).replace(null),z.substitution=D.substitution.apply(Z),z.parent=D,w.prepend([z]))},"unify_with_occurs_check/2":function(w,D,y){var F=new Se,z=P.unify(y.args[0],y.args[1],!0);z!==null&&(F.goal=D.goal.apply(z).replace(null),F.substitution=D.substitution.apply(z),F.parent=D,w.prepend([F]))},"\\=/2":function(w,D,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=P.unify(y.args[0],y.args[1],F);z===null&&w.success(D)},"subsumes_term/2":function(w,D,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=P.unify(y.args[1],y.args[0],F);z!==null&&y.args[1].apply(z).equals(y.args[1])&&w.success(D)},"findall/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(z))w.throw_error(P.error.type("callable",z,y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_list(Z))w.throw_error(P.error.type("list",Z,y.indicator));else{var ee=w.next_free_variable(),se=new _(",",[z,new _("=",[ee,F])]),xe=w.points,Ne=w.session.limit,ut=w.session.format_success;w.session.format_success=function(ir){return ir.substitution},w.add_goal(se,!0,D);var Ct=[],Yt=function(ir){if(ir!==!1&&ir!==null&&!P.type.is_error(ir))w.__calls.unshift(Yt),Ct.push(ir.links[ee.id]),w.session.limit=w.current_limit;else if(w.points=xe,w.session.limit=Ne,w.session.format_success=ut,P.type.is_error(ir))w.throw_error(ir.args[0]);else if(w.current_limit>0){for(var Pt=new _("[]"),mn=Ct.length-1;mn>=0;mn--)Pt=new _(".",[Ct[mn],Pt]);w.prepend([new Se(D.goal.replace(new _("=",[Z,Pt])),D.substitution,D)])}};w.__calls.unshift(Yt)}},"bagof/3":function(w,D,y){var F,z=y.args[0],Z=y.args[1],ee=y.args[2];if(P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(Z))w.throw_error(P.error.type("callable",Z,y.indicator));else if(!P.type.is_variable(ee)&&!P.type.is_list(ee))w.throw_error(P.error.type("list",ee,y.indicator));else{var se=w.next_free_variable(),xe;Z.indicator==="^/2"?(xe=Z.args[0].variables(),Z=Z.args[1]):xe=[],xe=xe.concat(z.variables());for(var Ne=Z.variables().filter(function(Lr){return t(xe,Lr)===-1}),ut=new _("[]"),Ct=Ne.length-1;Ct>=0;Ct--)ut=new _(".",[new be(Ne[Ct]),ut]);var Yt=new _(",",[Z,new _("=",[se,new _(",",[ut,z])])]),ir=w.points,Pt=w.session.limit,mn=w.session.format_success;w.session.format_success=function(Lr){return Lr.substitution},w.add_goal(Yt,!0,D);var Pr=[],Cr=function(Lr){if(Lr!==!1&&Lr!==null&&!P.type.is_error(Lr)){w.__calls.unshift(Cr);var on=!1,ci=Lr.links[se.id].args[0],Do=Lr.links[se.id].args[1];for(var is in Pr)if(Pr.hasOwnProperty(is)){var ao=Pr[is];if(ao.variables.equals(ci)){ao.answers.push(Do),on=!0;break}}on||Pr.push({variables:ci,answers:[Do]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=Pt,w.session.format_success=mn,P.type.is_error(Lr))w.throw_error(Lr.args[0]);else if(w.current_limit>0){for(var Po=[],ji=0;ji=0;xo--)lo=new _(".",[Lr[xo],lo]);Po.push(new Se(D.goal.replace(new _(",",[new _("=",[ut,Pr[ji].variables]),new _("=",[ee,lo])])),D.substitution,D))}w.prepend(Po)}};w.__calls.unshift(Cr)}},"setof/3":function(w,D,y){var F,z=y.args[0],Z=y.args[1],ee=y.args[2];if(P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(Z))w.throw_error(P.error.type("callable",Z,y.indicator));else if(!P.type.is_variable(ee)&&!P.type.is_list(ee))w.throw_error(P.error.type("list",ee,y.indicator));else{var se=w.next_free_variable(),xe;Z.indicator==="^/2"?(xe=Z.args[0].variables(),Z=Z.args[1]):xe=[],xe=xe.concat(z.variables());for(var Ne=Z.variables().filter(function(Lr){return t(xe,Lr)===-1}),ut=new _("[]"),Ct=Ne.length-1;Ct>=0;Ct--)ut=new _(".",[new be(Ne[Ct]),ut]);var Yt=new _(",",[Z,new _("=",[se,new _(",",[ut,z])])]),ir=w.points,Pt=w.session.limit,mn=w.session.format_success;w.session.format_success=function(Lr){return Lr.substitution},w.add_goal(Yt,!0,D);var Pr=[],Cr=function(Lr){if(Lr!==!1&&Lr!==null&&!P.type.is_error(Lr)){w.__calls.unshift(Cr);var on=!1,ci=Lr.links[se.id].args[0],Do=Lr.links[se.id].args[1];for(var is in Pr)if(Pr.hasOwnProperty(is)){var ao=Pr[is];if(ao.variables.equals(ci)){ao.answers.push(Do),on=!0;break}}on||Pr.push({variables:ci,answers:[Do]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=Pt,w.session.format_success=mn,P.type.is_error(Lr))w.throw_error(Lr.args[0]);else if(w.current_limit>0){for(var Po=[],ji=0;ji=0;xo--)lo=new _(".",[Lr[xo],lo]);Po.push(new Se(D.goal.replace(new _(",",[new _("=",[ut,Pr[ji].variables]),new _("=",[ee,lo])])),D.substitution,D))}w.prepend(Po)}};w.__calls.unshift(Cr)}},"functor/3":function(w,D,y){var F,z=y.args[0],Z=y.args[1],ee=y.args[2];if(P.type.is_variable(z)&&(P.type.is_variable(Z)||P.type.is_variable(ee)))w.throw_error(P.error.instantiation("functor/3"));else if(!P.type.is_variable(ee)&&!P.type.is_integer(ee))w.throw_error(P.error.type("integer",y.args[2],"functor/3"));else if(!P.type.is_variable(Z)&&!P.type.is_atomic(Z))w.throw_error(P.error.type("atomic",y.args[1],"functor/3"));else if(P.type.is_integer(Z)&&P.type.is_integer(ee)&&ee.value!==0)w.throw_error(P.error.type("atom",y.args[1],"functor/3"));else if(P.type.is_variable(z)){if(y.args[2].value>=0){for(var se=[],xe=0;xe0&&F<=y.args[1].args.length){var z=new _("=",[y.args[1].args[F-1],y.args[2]]);w.prepend([new Se(D.goal.replace(z),D.substitution,D)])}}},"=../2":function(w,D,y){var F;if(P.type.is_variable(y.args[0])&&(P.type.is_variable(y.args[1])||P.type.is_non_empty_list(y.args[1])&&P.type.is_variable(y.args[1].args[0])))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_fully_list(y.args[1]))w.throw_error(P.error.type("list",y.args[1],y.indicator));else if(P.type.is_variable(y.args[0])){if(!P.type.is_variable(y.args[1])){var Z=[];for(F=y.args[1].args[1];F.indicator==="./2";)Z.push(F.args[0]),F=F.args[1];P.type.is_variable(y.args[0])&&P.type.is_variable(F)?w.throw_error(P.error.instantiation(y.indicator)):Z.length===0&&P.type.is_compound(y.args[1].args[0])?w.throw_error(P.error.type("atomic",y.args[1].args[0],y.indicator)):Z.length>0&&(P.type.is_compound(y.args[1].args[0])||P.type.is_number(y.args[1].args[0]))?w.throw_error(P.error.type("atom",y.args[1].args[0],y.indicator)):Z.length===0?w.prepend([new Se(D.goal.replace(new _("=",[y.args[1].args[0],y.args[0]],D)),D.substitution,D)]):w.prepend([new Se(D.goal.replace(new _("=",[new _(y.args[1].args[0].id,Z),y.args[0]])),D.substitution,D)])}}else{if(P.type.is_atomic(y.args[0]))F=new _(".",[y.args[0],new _("[]")]);else{F=new _("[]");for(var z=y.args[0].args.length-1;z>=0;z--)F=new _(".",[y.args[0].args[z],F]);F=new _(".",[new _(y.args[0].id),F])}w.prepend([new Se(D.goal.replace(new _("=",[F,y.args[1]])),D.substitution,D)])}},"copy_term/2":function(w,D,y){var F=y.args[0].rename(w);w.prepend([new Se(D.goal.replace(new _("=",[F,y.args[1]])),D.substitution,D.parent)])},"term_variables/2":function(w,D,y){var F=y.args[0],z=y.args[1];if(!P.type.is_fully_list(z))w.throw_error(P.error.type("list",z,y.indicator));else{var Z=d(s(Ie(F.variables()),function(ee){return new be(ee)}));w.prepend([new Se(D.goal.replace(new _("=",[z,Z])),D.substitution,D)])}},"clause/2":function(w,D,y){if(P.type.is_variable(y.args[0]))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(y.args[0]))w.throw_error(P.error.type("callable",y.args[0],y.indicator));else if(!P.type.is_variable(y.args[1])&&!P.type.is_callable(y.args[1]))w.throw_error(P.error.type("callable",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var z in w.session.rules[y.args[0].indicator])if(w.session.rules[y.args[0].indicator].hasOwnProperty(z)){var Z=w.session.rules[y.args[0].indicator][z];w.session.renamed_variables={},Z=Z.rename(w),Z.body===null&&(Z.body=new _("true"));var ee=new _(",",[new _("=",[Z.head,y.args[0]]),new _("=",[Z.body,y.args[1]])]);F.push(new Se(D.goal.replace(ee),D.substitution,D))}w.prepend(F)}else w.throw_error(P.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(w,D,y){var F=y.args[0];if(!P.type.is_variable(F)&&(!P.type.is_compound(F)||F.indicator!=="//2"))w.throw_error(P.error.type("predicate_indicator",F,y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_variable(F.args[0])&&!P.type.is_atom(F.args[0]))w.throw_error(P.error.type("atom",F.args[0],y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_variable(F.args[1])&&!P.type.is_integer(F.args[1]))w.throw_error(P.error.type("integer",F.args[1],y.indicator));else{var z=[];for(var Z in w.session.rules)if(w.session.rules.hasOwnProperty(Z)){var ee=Z.lastIndexOf("/"),se=Z.substr(0,ee),xe=parseInt(Z.substr(ee+1,Z.length-(ee+1))),Ne=new _("/",[new _(se),new ke(xe,!1)]),ut=new _("=",[Ne,F]);z.push(new Se(D.goal.replace(ut),D.substitution,D))}w.prepend(z)}},"asserta/1":function(w,D,y){if(P.type.is_variable(y.args[0]))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(y.args[0]))w.throw_error(P.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=ye(y.args[0].args[1])):(F=y.args[0],z=null),P.type.is_callable(F)?z!==null&&!P.type.is_callable(z)?w.throw_error(P.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new je(F,z,!0)].concat(w.session.rules[F.indicator]),w.success(D)):w.throw_error(P.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(P.error.type("callable",F,y.indicator))}},"assertz/1":function(w,D,y){if(P.type.is_variable(y.args[0]))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(y.args[0]))w.throw_error(P.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=ye(y.args[0].args[1])):(F=y.args[0],z=null),P.type.is_callable(F)?z!==null&&!P.type.is_callable(z)?w.throw_error(P.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new je(F,z,!0)),w.success(D)):w.throw_error(P.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(P.error.type("callable",F,y.indicator))}},"retract/1":function(w,D,y){if(P.type.is_variable(y.args[0]))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_callable(y.args[0]))w.throw_error(P.error.type("callable",y.args[0],y.indicator));else{var F,z;if(y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=y.args[0].args[1]):(F=y.args[0],z=new _("true")),typeof D.retract>"u")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var Z=[],ee=0;eew.get_flag("max_arity").value)w.throw_error(P.error.representation("max_arity",y.indicator));else{var F=y.args[0].args[0].id+"/"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(D)):w.throw_error(P.error.permission("modify","static_procedure",F,y.indicator))}},"atom_length/2":function(w,D,y){if(P.type.is_variable(y.args[0]))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_atom(y.args[0]))w.throw_error(P.error.type("atom",y.args[0],y.indicator));else if(!P.type.is_variable(y.args[1])&&!P.type.is_integer(y.args[1]))w.throw_error(P.error.type("integer",y.args[1],y.indicator));else if(P.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(P.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var F=new ke(y.args[0].id.length,!1);w.prepend([new Se(D.goal.replace(new _("=",[F,y.args[1]])),D.substitution,D)])}},"atom_concat/3":function(w,D,y){var F,z,Z=y.args[0],ee=y.args[1],se=y.args[2];if(P.type.is_variable(se)&&(P.type.is_variable(Z)||P.type.is_variable(ee)))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_atom(Z))w.throw_error(P.error.type("atom",Z,y.indicator));else if(!P.type.is_variable(ee)&&!P.type.is_atom(ee))w.throw_error(P.error.type("atom",ee,y.indicator));else if(!P.type.is_variable(se)&&!P.type.is_atom(se))w.throw_error(P.error.type("atom",se,y.indicator));else{var xe=P.type.is_variable(Z),Ne=P.type.is_variable(ee);if(!xe&&!Ne)z=new _("=",[se,new _(Z.id+ee.id)]),w.prepend([new Se(D.goal.replace(z),D.substitution,D)]);else if(xe&&!Ne)F=se.id.substr(0,se.id.length-ee.id.length),F+ee.id===se.id&&(z=new _("=",[Z,new _(F)]),w.prepend([new Se(D.goal.replace(z),D.substitution,D)]));else if(Ne&&!xe)F=se.id.substr(Z.id.length),Z.id+F===se.id&&(z=new _("=",[ee,new _(F)]),w.prepend([new Se(D.goal.replace(z),D.substitution,D)]));else{for(var ut=[],Ct=0;Ct<=se.id.length;Ct++){var Yt=new _(se.id.substr(0,Ct)),ir=new _(se.id.substr(Ct));z=new _(",",[new _("=",[Yt,Z]),new _("=",[ir,ee])]),ut.push(new Se(D.goal.replace(z),D.substitution,D))}w.prepend(ut)}}},"sub_atom/5":function(w,D,y){var F,z=y.args[0],Z=y.args[1],ee=y.args[2],se=y.args[3],xe=y.args[4];if(P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_integer(Z))w.throw_error(P.error.type("integer",Z,y.indicator));else if(!P.type.is_variable(ee)&&!P.type.is_integer(ee))w.throw_error(P.error.type("integer",ee,y.indicator));else if(!P.type.is_variable(se)&&!P.type.is_integer(se))w.throw_error(P.error.type("integer",se,y.indicator));else if(P.type.is_integer(Z)&&Z.value<0)w.throw_error(P.error.domain("not_less_than_zero",Z,y.indicator));else if(P.type.is_integer(ee)&&ee.value<0)w.throw_error(P.error.domain("not_less_than_zero",ee,y.indicator));else if(P.type.is_integer(se)&&se.value<0)w.throw_error(P.error.domain("not_less_than_zero",se,y.indicator));else{var Ne=[],ut=[],Ct=[];if(P.type.is_variable(Z))for(F=0;F<=z.id.length;F++)Ne.push(F);else Ne.push(Z.value);if(P.type.is_variable(ee))for(F=0;F<=z.id.length;F++)ut.push(F);else ut.push(ee.value);if(P.type.is_variable(se))for(F=0;F<=z.id.length;F++)Ct.push(F);else Ct.push(se.value);var Yt=[];for(var ir in Ne)if(Ne.hasOwnProperty(ir)){F=Ne[ir];for(var Pt in ut)if(ut.hasOwnProperty(Pt)){var mn=ut[Pt],Pr=z.id.length-F-mn;if(t(Ct,Pr)!==-1&&F+mn+Pr===z.id.length){var Cr=z.id.substr(F,mn);if(z.id===z.id.substr(0,F)+Cr+z.id.substr(F+mn,Pr)){var Lr=new _("=",[new _(Cr),xe]),on=new _("=",[Z,new ke(F)]),ci=new _("=",[ee,new ke(mn)]),Do=new _("=",[se,new ke(Pr)]),is=new _(",",[new _(",",[new _(",",[on,ci]),Do]),Lr]);Yt.push(new Se(D.goal.replace(is),D.substitution,D))}}}}w.prepend(Yt)}},"atom_chars/2":function(w,D,y){var F=y.args[0],z=y.args[1];if(P.type.is_variable(F)&&P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_atom(F))w.throw_error(P.error.type("atom",F,y.indicator));else if(P.type.is_variable(F)){for(var se=z,xe=P.type.is_variable(F),Ne="";se.indicator==="./2";){if(P.type.is_character(se.args[0]))Ne+=se.args[0].id;else if(P.type.is_variable(se.args[0])&&xe){w.throw_error(P.error.instantiation(y.indicator));return}else if(!P.type.is_variable(se.args[0])){w.throw_error(P.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}P.type.is_variable(se)&&xe?w.throw_error(P.error.instantiation(y.indicator)):!P.type.is_empty_list(se)&&!P.type.is_variable(se)?w.throw_error(P.error.type("list",z,y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[new _(Ne),F])),D.substitution,D)])}else{for(var Z=new _("[]"),ee=F.id.length-1;ee>=0;ee--)Z=new _(".",[new _(F.id.charAt(ee)),Z]);w.prepend([new Se(D.goal.replace(new _("=",[z,Z])),D.substitution,D)])}},"atom_codes/2":function(w,D,y){var F=y.args[0],z=y.args[1];if(P.type.is_variable(F)&&P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_atom(F))w.throw_error(P.error.type("atom",F,y.indicator));else if(P.type.is_variable(F)){for(var se=z,xe=P.type.is_variable(F),Ne="";se.indicator==="./2";){if(P.type.is_character_code(se.args[0]))Ne+=c(se.args[0].value);else if(P.type.is_variable(se.args[0])&&xe){w.throw_error(P.error.instantiation(y.indicator));return}else if(!P.type.is_variable(se.args[0])){w.throw_error(P.error.representation("character_code",y.indicator));return}se=se.args[1]}P.type.is_variable(se)&&xe?w.throw_error(P.error.instantiation(y.indicator)):!P.type.is_empty_list(se)&&!P.type.is_variable(se)?w.throw_error(P.error.type("list",z,y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[new _(Ne),F])),D.substitution,D)])}else{for(var Z=new _("[]"),ee=F.id.length-1;ee>=0;ee--)Z=new _(".",[new ke(n(F.id,ee),!1),Z]);w.prepend([new Se(D.goal.replace(new _("=",[z,Z])),D.substitution,D)])}},"char_code/2":function(w,D,y){var F=y.args[0],z=y.args[1];if(P.type.is_variable(F)&&P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_character(F))w.throw_error(P.error.type("character",F,y.indicator));else if(!P.type.is_variable(z)&&!P.type.is_integer(z))w.throw_error(P.error.type("integer",z,y.indicator));else if(!P.type.is_variable(z)&&!P.type.is_character_code(z))w.throw_error(P.error.representation("character_code",y.indicator));else if(P.type.is_variable(z)){var Z=new ke(n(F.id,0),!1);w.prepend([new Se(D.goal.replace(new _("=",[Z,z])),D.substitution,D)])}else{var ee=new _(c(z.value));w.prepend([new Se(D.goal.replace(new _("=",[ee,F])),D.substitution,D)])}},"number_chars/2":function(w,D,y){var F,z=y.args[0],Z=y.args[1];if(P.type.is_variable(z)&&P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(z)&&!P.type.is_number(z))w.throw_error(P.error.type("number",z,y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_list(Z))w.throw_error(P.error.type("list",Z,y.indicator));else{var ee=P.type.is_variable(z);if(!P.type.is_variable(Z)){var se=Z,xe=!0;for(F="";se.indicator==="./2";){if(P.type.is_character(se.args[0]))F+=se.args[0].id;else if(P.type.is_variable(se.args[0]))xe=!1;else if(!P.type.is_variable(se.args[0])){w.throw_error(P.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}if(xe=xe&&P.type.is_empty_list(se),!P.type.is_empty_list(se)&&!P.type.is_variable(se)){w.throw_error(P.error.type("list",Z,y.indicator));return}if(!xe&&ee){w.throw_error(P.error.instantiation(y.indicator));return}else if(xe)if(P.type.is_variable(se)&&ee){w.throw_error(P.error.instantiation(y.indicator));return}else{var Ne=w.parse(F),ut=Ne.value;!P.type.is_number(ut)||Ne.tokens[Ne.tokens.length-1].space?w.throw_error(P.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[z,ut])),D.substitution,D)]);return}}if(!ee){F=z.toString();for(var Ct=new _("[]"),Yt=F.length-1;Yt>=0;Yt--)Ct=new _(".",[new _(F.charAt(Yt)),Ct]);w.prepend([new Se(D.goal.replace(new _("=",[Z,Ct])),D.substitution,D)])}}},"number_codes/2":function(w,D,y){var F,z=y.args[0],Z=y.args[1];if(P.type.is_variable(z)&&P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(z)&&!P.type.is_number(z))w.throw_error(P.error.type("number",z,y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_list(Z))w.throw_error(P.error.type("list",Z,y.indicator));else{var ee=P.type.is_variable(z);if(!P.type.is_variable(Z)){var se=Z,xe=!0;for(F="";se.indicator==="./2";){if(P.type.is_character_code(se.args[0]))F+=c(se.args[0].value);else if(P.type.is_variable(se.args[0]))xe=!1;else if(!P.type.is_variable(se.args[0])){w.throw_error(P.error.type("character_code",se.args[0],y.indicator));return}se=se.args[1]}if(xe=xe&&P.type.is_empty_list(se),!P.type.is_empty_list(se)&&!P.type.is_variable(se)){w.throw_error(P.error.type("list",Z,y.indicator));return}if(!xe&&ee){w.throw_error(P.error.instantiation(y.indicator));return}else if(xe)if(P.type.is_variable(se)&&ee){w.throw_error(P.error.instantiation(y.indicator));return}else{var Ne=w.parse(F),ut=Ne.value;!P.type.is_number(ut)||Ne.tokens[Ne.tokens.length-1].space?w.throw_error(P.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[z,ut])),D.substitution,D)]);return}}if(!ee){F=z.toString();for(var Ct=new _("[]"),Yt=F.length-1;Yt>=0;Yt--)Ct=new _(".",[new ke(n(F,Yt),!1),Ct]);w.prepend([new Se(D.goal.replace(new _("=",[Z,Ct])),D.substitution,D)])}}},"upcase_atom/2":function(w,D,y){var F=y.args[0],z=y.args[1];P.type.is_variable(F)?w.throw_error(P.error.instantiation(y.indicator)):P.type.is_atom(F)?!P.type.is_variable(z)&&!P.type.is_atom(z)?w.throw_error(P.error.type("atom",z,y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[z,new _(F.id.toUpperCase(),[])])),D.substitution,D)]):w.throw_error(P.error.type("atom",F,y.indicator))},"downcase_atom/2":function(w,D,y){var F=y.args[0],z=y.args[1];P.type.is_variable(F)?w.throw_error(P.error.instantiation(y.indicator)):P.type.is_atom(F)?!P.type.is_variable(z)&&!P.type.is_atom(z)?w.throw_error(P.error.type("atom",z,y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[z,new _(F.id.toLowerCase(),[])])),D.substitution,D)]):w.throw_error(P.error.type("atom",F,y.indicator))},"atomic_list_concat/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _("atomic_list_concat",[F,new _("",[]),z])),D.substitution,D)])},"atomic_list_concat/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(P.type.is_variable(z)||P.type.is_variable(F)&&P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_list(F))w.throw_error(P.error.type("list",F,y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_atom(Z))w.throw_error(P.error.type("atom",Z,y.indicator));else if(P.type.is_variable(Z)){for(var se="",xe=F;P.type.is_term(xe)&&xe.indicator==="./2";){if(!P.type.is_atom(xe.args[0])&&!P.type.is_number(xe.args[0])){w.throw_error(P.error.type("atomic",xe.args[0],y.indicator));return}se!==""&&(se+=z.id),P.type.is_atom(xe.args[0])?se+=xe.args[0].id:se+=""+xe.args[0].value,xe=xe.args[1]}se=new _(se,[]),P.type.is_variable(xe)?w.throw_error(P.error.instantiation(y.indicator)):!P.type.is_term(xe)||xe.indicator!=="[]/0"?w.throw_error(P.error.type("list",F,y.indicator)):w.prepend([new Se(D.goal.replace(new _("=",[se,Z])),D.substitution,D)])}else{var ee=d(s(Z.id.split(z.id),function(Ne){return new _(Ne,[])}));w.prepend([new Se(D.goal.replace(new _("=",[ee,F])),D.substitution,D)])}},"@=/2":function(w,D,y){P.compare(y.args[0],y.args[1])>0&&w.success(D)},"@>=/2":function(w,D,y){P.compare(y.args[0],y.args[1])>=0&&w.success(D)},"compare/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(!P.type.is_variable(F)&&!P.type.is_atom(F))w.throw_error(P.error.type("atom",F,y.indicator));else if(P.type.is_atom(F)&&["<",">","="].indexOf(F.id)===-1)w.throw_error(P.type.domain("order",F,y.indicator));else{var ee=P.compare(z,Z);ee=ee===0?"=":ee===-1?"<":">",w.prepend([new Se(D.goal.replace(new _("=",[F,new _(ee,[])])),D.substitution,D)])}},"is/2":function(w,D,y){var F=y.args[1].interpret(w);P.type.is_number(F)?w.prepend([new Se(D.goal.replace(new _("=",[y.args[0],F],w.level)),D.substitution,D)]):w.throw_error(F)},"between/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(P.type.is_variable(F)||P.type.is_variable(z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_integer(F))w.throw_error(P.error.type("integer",F,y.indicator));else if(!P.type.is_integer(z))w.throw_error(P.error.type("integer",z,y.indicator));else if(!P.type.is_variable(Z)&&!P.type.is_integer(Z))w.throw_error(P.error.type("integer",Z,y.indicator));else if(P.type.is_variable(Z)){var ee=[new Se(D.goal.replace(new _("=",[Z,F])),D.substitution,D)];F.value=Z.value&&w.success(D)},"succ/2":function(w,D,y){var F=y.args[0],z=y.args[1];P.type.is_variable(F)&&P.type.is_variable(z)?w.throw_error(P.error.instantiation(y.indicator)):!P.type.is_variable(F)&&!P.type.is_integer(F)?w.throw_error(P.error.type("integer",F,y.indicator)):!P.type.is_variable(z)&&!P.type.is_integer(z)?w.throw_error(P.error.type("integer",z,y.indicator)):!P.type.is_variable(F)&&F.value<0?w.throw_error(P.error.domain("not_less_than_zero",F,y.indicator)):!P.type.is_variable(z)&&z.value<0?w.throw_error(P.error.domain("not_less_than_zero",z,y.indicator)):(P.type.is_variable(z)||z.value>0)&&(P.type.is_variable(F)?w.prepend([new Se(D.goal.replace(new _("=",[F,new ke(z.value-1,!1)])),D.substitution,D)]):w.prepend([new Se(D.goal.replace(new _("=",[z,new ke(F.value+1,!1)])),D.substitution,D)]))},"=:=/2":function(w,D,y){var F=P.arithmetic_compare(w,y.args[0],y.args[1]);P.type.is_term(F)?w.throw_error(F):F===0&&w.success(D)},"=\\=/2":function(w,D,y){var F=P.arithmetic_compare(w,y.args[0],y.args[1]);P.type.is_term(F)?w.throw_error(F):F!==0&&w.success(D)},"/2":function(w,D,y){var F=P.arithmetic_compare(w,y.args[0],y.args[1]);P.type.is_term(F)?w.throw_error(F):F>0&&w.success(D)},">=/2":function(w,D,y){var F=P.arithmetic_compare(w,y.args[0],y.args[1]);P.type.is_term(F)?w.throw_error(F):F>=0&&w.success(D)},"var/1":function(w,D,y){P.type.is_variable(y.args[0])&&w.success(D)},"atom/1":function(w,D,y){P.type.is_atom(y.args[0])&&w.success(D)},"atomic/1":function(w,D,y){P.type.is_atomic(y.args[0])&&w.success(D)},"compound/1":function(w,D,y){P.type.is_compound(y.args[0])&&w.success(D)},"integer/1":function(w,D,y){P.type.is_integer(y.args[0])&&w.success(D)},"float/1":function(w,D,y){P.type.is_float(y.args[0])&&w.success(D)},"number/1":function(w,D,y){P.type.is_number(y.args[0])&&w.success(D)},"nonvar/1":function(w,D,y){P.type.is_variable(y.args[0])||w.success(D)},"ground/1":function(w,D,y){y.variables().length===0&&w.success(D)},"acyclic_term/1":function(w,D,y){for(var F=D.substitution.apply(D.substitution),z=y.args[0].variables(),Z=0;Z0?Pt[Pt.length-1]:null,Pt!==null&&(Yt=K(w,Pt,0,w.__get_max_priority(),!1))}if(Yt.type===p&&Yt.len===Pt.length-1&&mn.value==="."){Yt=Yt.value.rename(w);var Pr=new _("=",[z,Yt]);if(se.variables){var Cr=d(s(Ie(Yt.variables()),function(Lr){return new be(Lr)}));Pr=new _(",",[Pr,new _("=",[se.variables,Cr])])}if(se.variable_names){var Cr=d(s(Ie(Yt.variables()),function(on){var ci;for(ci in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ci)&&w.session.renamed_variables[ci]===on)break;return new _("=",[new _(ci,[]),new be(on)])}));Pr=new _(",",[Pr,new _("=",[se.variable_names,Cr])])}if(se.singletons){var Cr=d(s(new je(Yt,null).singleton_variables(),function(on){var ci;for(ci in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ci)&&w.session.renamed_variables[ci]===on)break;return new _("=",[new _(ci,[]),new be(on)])}));Pr=new _(",",[Pr,new _("=",[se.singletons,Cr])])}w.prepend([new Se(D.goal.replace(Pr),D.substitution,D)])}else Yt.type===p?w.throw_error(P.error.syntax(Pt[Yt.len],"unexpected token",!1)):w.throw_error(Yt.value)}}},"write/1":function(w,D,y){var F=y.args[0];w.prepend([new Se(D.goal.replace(new _(",",[new _("current_output",[new be("S")]),new _("write",[new be("S"),F])])),D.substitution,D)])},"write/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _("write_term",[F,z,new _(".",[new _("quoted",[new _("false",[])]),new _(".",[new _("ignore_ops",[new _("false")]),new _(".",[new _("numbervars",[new _("true")]),new _("[]",[])])])])])),D.substitution,D)])},"writeq/1":function(w,D,y){var F=y.args[0];w.prepend([new Se(D.goal.replace(new _(",",[new _("current_output",[new be("S")]),new _("writeq",[new be("S"),F])])),D.substitution,D)])},"writeq/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _("write_term",[F,z,new _(".",[new _("quoted",[new _("true",[])]),new _(".",[new _("ignore_ops",[new _("false")]),new _(".",[new _("numbervars",[new _("true")]),new _("[]",[])])])])])),D.substitution,D)])},"write_canonical/1":function(w,D,y){var F=y.args[0];w.prepend([new Se(D.goal.replace(new _(",",[new _("current_output",[new be("S")]),new _("write_canonical",[new be("S"),F])])),D.substitution,D)])},"write_canonical/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _("write_term",[F,z,new _(".",[new _("quoted",[new _("true",[])]),new _(".",[new _("ignore_ops",[new _("true")]),new _(".",[new _("numbervars",[new _("false")]),new _("[]",[])])])])])),D.substitution,D)])},"write_term/2":function(w,D,y){var F=y.args[0],z=y.args[1];w.prepend([new Se(D.goal.replace(new _(",",[new _("current_output",[new be("S")]),new _("write_term",[new be("S"),F,z])])),D.substitution,D)])},"write_term/3":function(w,D,y){var F=y.args[0],z=y.args[1],Z=y.args[2],ee=P.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(P.type.is_variable(F)||P.type.is_variable(Z))w.throw_error(P.error.instantiation(y.indicator));else if(!P.type.is_list(Z))w.throw_error(P.error.type("list",Z,y.indicator));else if(!P.type.is_stream(F)&&!P.type.is_atom(F))w.throw_error(P.error.domain("stream_or_alias",F,y.indicator));else if(!P.type.is_stream(ee)||ee.stream===null)w.throw_error(P.error.existence("stream",F,y.indicator));else if(ee.input)w.throw_error(P.error.permission("output","stream",F,y.indicator));else if(ee.type==="binary")w.throw_error(P.error.permission("output","binary_stream",F,y.indicator));else if(ee.position==="past_end_of_stream"&&ee.eof_action==="error")w.throw_error(P.error.permission("output","past_end_of_stream",F,y.indicator));else{for(var se={},xe=Z,Ne;P.type.is_term(xe)&&xe.indicator==="./2";){if(Ne=xe.args[0],P.type.is_variable(Ne)){w.throw_error(P.error.instantiation(y.indicator));return}else if(!P.type.is_write_option(Ne)){w.throw_error(P.error.domain("write_option",Ne,y.indicator));return}se[Ne.id]=Ne.args[0].id==="true",xe=xe.args[1]}if(xe.indicator!=="[]/0"){P.type.is_variable(xe)?w.throw_error(P.error.instantiation(y.indicator)):w.throw_error(P.error.type("list",Z,y.indicator));return}else{se.session=w.session;var ut=z.toString(se);ee.stream.put(ut,ee.position),typeof ee.position=="number"&&(ee.position+=ut.length),w.success(D)}}},"halt/0":function(w,D,y){w.points=[]},"halt/1":function(w,D,y){var F=y.args[0];P.type.is_variable(F)?w.throw_error(P.error.instantiation(y.indicator)):P.type.is_integer(F)?w.points=[]:w.throw_error(P.error.type("integer",F,y.indicator))},"current_prolog_flag/2":function(w,D,y){var F=y.args[0],z=y.args[1];if(!P.type.is_variable(F)&&!P.type.is_atom(F))w.throw_error(P.error.type("atom",F,y.indicator));else if(!P.type.is_variable(F)&&!P.type.is_flag(F))w.throw_error(P.error.domain("prolog_flag",F,y.indicator));else{var Z=[];for(var ee in P.flag)if(P.flag.hasOwnProperty(ee)){var se=new _(",",[new _("=",[new _(ee),F]),new _("=",[w.get_flag(ee),z])]);Z.push(new Se(D.goal.replace(se),D.substitution,D))}w.prepend(Z)}},"set_prolog_flag/2":function(w,D,y){var F=y.args[0],z=y.args[1];P.type.is_variable(F)||P.type.is_variable(z)?w.throw_error(P.error.instantiation(y.indicator)):P.type.is_atom(F)?P.type.is_flag(F)?P.type.is_value_flag(F,z)?P.type.is_modifiable_flag(F)?(w.session.flag[F.id]=z,w.success(D)):w.throw_error(P.error.permission("modify","flag",F)):w.throw_error(P.error.domain("flag_value",new _("+",[F,z]),y.indicator)):w.throw_error(P.error.domain("prolog_flag",F,y.indicator)):w.throw_error(P.error.type("atom",F,y.indicator))}},flag:{bounded:{allowed:[new _("true"),new _("false")],value:new _("true"),changeable:!1},max_integer:{allowed:[new ke(Number.MAX_SAFE_INTEGER)],value:new ke(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new ke(Number.MIN_SAFE_INTEGER)],value:new ke(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new _("down"),new _("toward_zero")],value:new _("toward_zero"),changeable:!1},char_conversion:{allowed:[new _("on"),new _("off")],value:new _("on"),changeable:!0},debug:{allowed:[new _("on"),new _("off")],value:new _("off"),changeable:!0},max_arity:{allowed:[new _("unbounded")],value:new _("unbounded"),changeable:!1},unknown:{allowed:[new _("error"),new _("fail"),new _("warning")],value:new _("error"),changeable:!0},double_quotes:{allowed:[new _("chars"),new _("codes"),new _("atom")],value:new _("codes"),changeable:!0},occurs_check:{allowed:[new _("false"),new _("true")],value:new _("false"),changeable:!0},dialect:{allowed:[new _("tau")],value:new _("tau"),changeable:!1},version_data:{allowed:[new _("tau",[new ke(e.major,!1),new ke(e.minor,!1),new ke(e.patch,!1),new _(e.status)])],value:new _("tau",[new ke(e.major,!1),new ke(e.minor,!1),new ke(e.patch,!1),new _(e.status)]),changeable:!1},nodejs:{allowed:[new _("yes"),new _("no")],value:new _(typeof nc<"u"&&nc.exports?"yes":"no"),changeable:!1}},unify:function(w,D,y){y=y===void 0?!1:y;for(var F=[{left:w,right:D}],z={};F.length!==0;){var Z=F.pop();if(w=Z.left,D=Z.right,P.type.is_term(w)&&P.type.is_term(D)){if(w.indicator!==D.indicator)return null;for(var ee=0;eez.value?1:0:z}else return F},operate:function(w,D){if(P.type.is_operator(D)){for(var y=P.type.is_operator(D),F=[],z,Z=!1,ee=0;eew.get_flag("max_integer").value||z0?w.start+w.matches[0].length:w.start,z=y?new _("token_not_found"):new _("found",[new _(w.value.toString())]),Z=new _(".",[new _("line",[new ke(w.line+1)]),new _(".",[new _("column",[new ke(F+1)]),new _(".",[z,new _("[]",[])])])]);return new _("error",[new _("syntax_error",[new _(D)]),Z])},syntax_by_predicate:function(w,D){return new _("error",[new _("syntax_error",[new _(w)]),X(D)])}},warning:{singleton:function(w,D,y){for(var F=new _("[]"),z=w.length-1;z>=0;z--)F=new _(".",[new be(w[z]),F]);return new _("warning",[new _("singleton_variables",[F,X(D)]),new _(".",[new _("line",[new ke(y,!1)]),new _("[]")])])},failed_goal:function(w,D){return new _("warning",[new _("failed_goal",[w]),new _(".",[new _("line",[new ke(D,!1)]),new _("[]")])])}},format_variable:function(w){return"_"+w},format_answer:function(w,D,F){D instanceof Te&&(D=D.thread);var F=F||{};if(F.session=D?D.session:void 0,P.type.is_error(w))return"uncaught exception: "+w.args[0].toString();if(w===!1)return"false.";if(w===null)return"limit exceeded ;";var z=0,Z="";if(P.type.is_substitution(w)){var ee=w.domain(!0);w=w.filter(function(Ne,ut){return!P.type.is_variable(ut)||ee.indexOf(ut.id)!==-1&&Ne!==ut.id})}for(var se in w.links)w.links.hasOwnProperty(se)&&(z++,Z!==""&&(Z+=", "),Z+=se.toString(F)+" = "+w.links[se].toString(F));var xe=typeof D>"u"||D.points.length>0?" ;":".";return z===0?"true"+xe:Z+xe},flatten_error:function(w){if(!P.type.is_error(w))return null;w=w.args[0];var D={};return D.type=w.args[0].id,D.thrown=D.type==="syntax_error"?null:w.args[1].id,D.expected=null,D.found=null,D.representation=null,D.existence=null,D.existence_type=null,D.line=null,D.column=null,D.permission_operation=null,D.permission_type=null,D.evaluation_type=null,D.type==="type_error"||D.type==="domain_error"?(D.expected=w.args[0].args[0].id,D.found=w.args[0].args[1].toString()):D.type==="syntax_error"?w.args[1].indicator==="./2"?(D.expected=w.args[0].args[0].id,D.found=w.args[1].args[1].args[1].args[0],D.found=D.found.id==="token_not_found"?D.found.id:D.found.args[0].id,D.line=w.args[1].args[0].args[0].value,D.column=w.args[1].args[1].args[0].args[0].value):D.thrown=w.args[1].id:D.type==="permission_error"?(D.found=w.args[0].args[2].toString(),D.permission_operation=w.args[0].args[0].id,D.permission_type=w.args[0].args[1].id):D.type==="evaluation_error"?D.evaluation_type=w.args[0].args[0].id:D.type==="representation_error"?D.representation=w.args[0].args[0].id:D.type==="existence_error"&&(D.existence=w.args[0].args[1].toString(),D.existence_type=w.args[0].args[0].id),D},create:function(w){return new P.type.Session(w)}};typeof nc<"u"?nc.exports=P:window.pl=P})()});function wme(e,t,r){e.prepend(r.map(s=>new wl.default.type.State(t.goal.replace(s),t.substitution,t)))}function A9(e){let t=vme.get(e.session);if(t==null)throw new Error("Assertion failed: A project should have been registered for the active session");return t}function Sme(e,t){vme.set(e,t),e.consult(`:- use_module(library(${Rat.id})).`)}var wl,Bme,Jd,Qat,Tat,vme,Rat,bme=Ze(()=>{Ge();Zl();wl=et(f9()),Bme=et(Ce("vm")),{is_atom:Jd,is_variable:Qat,is_instantiated_list:Tat}=wl.default.type;vme=new WeakMap;Rat=new wl.default.type.Module("constraints",{"project_workspaces_by_descriptor/3":(e,t,r)=>{let[s,a,n]=r.args;if(!Jd(s)||!Jd(a)){e.throw_error(wl.default.error.instantiation(r.indicator));return}let c=H.parseIdent(s.id),f=H.makeDescriptor(c,a.id),h=A9(e).tryWorkspaceByDescriptor(f);Qat(n)&&h!==null&&wme(e,t,[new wl.default.type.Term("=",[n,new wl.default.type.Term(String(h.relativeCwd))])]),Jd(n)&&h!==null&&h.relativeCwd===n.id&&e.success(t)},"workspace_field/3":(e,t,r)=>{let[s,a,n]=r.args;if(!Jd(s)||!Jd(a)){e.throw_error(wl.default.error.instantiation(r.indicator));return}let f=A9(e).tryWorkspaceByCwd(s.id);if(f==null)return;let p=xa(f.manifest.raw,a.id);typeof p>"u"||wme(e,t,[new wl.default.type.Term("=",[n,new wl.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},"workspace_field_test/3":(e,t,r)=>{let[s,a,n]=r.args;e.prepend([new wl.default.type.State(t.goal.replace(new wl.default.type.Term("workspace_field_test",[s,a,n,new wl.default.type.Term("[]",[])])),t.substitution,t)])},"workspace_field_test/4":(e,t,r)=>{let[s,a,n,c]=r.args;if(!Jd(s)||!Jd(a)||!Jd(n)||!Tat(c)){e.throw_error(wl.default.error.instantiation(r.indicator));return}let p=A9(e).tryWorkspaceByCwd(s.id);if(p==null)return;let h=xa(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[S,x]of c.toJavaScript().entries())E[`$${S}`]=x;Bme.default.runInNewContext(n.id,E)&&e.success(t)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var AS={};Vt(AS,{Constraints:()=>h9,DependencyType:()=>kme});function Bo(e){if(e instanceof GC.default.type.Num)return e.value;if(e instanceof GC.default.type.Term)switch(e.indicator){case"throw/1":return Bo(e.args[0]);case"error/1":return Bo(e.args[0]);case"error/2":if(e.args[0]instanceof GC.default.type.Term&&e.args[0].indicator==="syntax_error/1")return Object.assign(Bo(e.args[0]),...Bo(e.args[1]));{let t=Bo(e.args[0]);return t.message+=` (in ${Bo(e.args[1])})`,t}case"syntax_error/1":return new Lt(43,`Syntax error: ${Bo(e.args[0])}`);case"existence_error/2":return new Lt(44,`Existence error: ${Bo(e.args[0])} ${Bo(e.args[1])} not found`);case"instantiation_error/0":return new Lt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:Bo(e.args[0])};case"column/1":return{column:Bo(e.args[0])};case"found/1":return{found:Bo(e.args[0])};case"./2":return[Bo(e.args[0])].concat(Bo(e.args[1]));case"//2":return`${Bo(e.args[0])}/${Bo(e.args[1])}`;default:return e.id}throw`couldn't pretty print because of unsupported node ${e}`}function Pme(e){let t;try{t=Bo(e)}catch(r){throw typeof r=="string"?new Lt(42,`Unknown error: ${e} (note: ${r})`):r}return typeof t.line<"u"&&typeof t.column<"u"&&(t.message+=` at line ${t.line}, column ${t.column}`),t}function Fm(e){return e.id==="null"?null:`${e.toJavaScript()}`}function Fat(e){if(e.id==="null")return null;{let t=e.toJavaScript();if(typeof t!="string")return JSON.stringify(t);try{return JSON.stringify(JSON.parse(t))}catch{return JSON.stringify(t)}}}function zd(e){return typeof e=="string"?`'${e}'`:"[]"}var xme,GC,kme,Dme,p9,h9,pS=Ze(()=>{Ge();Ge();bt();xme=et(ome()),GC=et(f9());cS();bme();(0,xme.default)(GC.default);kme=(s=>(s.Dependencies="dependencies",s.DevDependencies="devDependencies",s.PeerDependencies="peerDependencies",s))(kme||{}),Dme=["dependencies","devDependencies","peerDependencies"];p9=class{constructor(t,r){let s=1e3*t.workspaces.length;this.session=GC.default.create(s),Sme(this.session,t),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(t=>{this.session.answer(r=>{t(r)})})}async*makeQuery(t){let r=this.session.query(t);if(r!==!0)throw Pme(r);for(;;){let s=await this.fetchNextAnswer();if(s===null)throw new Lt(79,"Resolution limit exceeded");if(!s)break;if(s.id==="throw")throw Pme(s);yield s}}};h9=class e{constructor(t){this.source="";this.project=t;let r=t.configuration.get("constraintsPath");ae.existsSync(r)&&(this.source=ae.readFileSync(r,"utf8"))}static async find(t){return new e(t)}getProjectDatabase(){let t="";for(let r of Dme)t+=`dependency_type(${r}). +`;for(let r of this.project.workspacesByCwd.values()){let s=r.relativeCwd;t+=`workspace(${zd(s)}). +`,t+=`workspace_ident(${zd(s)}, ${zd(H.stringifyIdent(r.anchoredLocator))}). +`,t+=`workspace_version(${zd(s)}, ${zd(r.manifest.version)}). +`;for(let a of Dme)for(let n of r.manifest[a].values())t+=`workspace_has_dependency(${zd(s)}, ${zd(H.stringifyIdent(n))}, ${zd(n.range)}, ${a}). +`}return t+=`workspace(_) :- false. +`,t+=`workspace_ident(_, _) :- false. +`,t+=`workspace_version(_, _) :- false. +`,t+=`workspace_has_dependency(_, _, _, _) :- false. +`,t}getDeclarations(){let t="";return t+=`gen_enforced_dependency(_, _, _, _) :- false. +`,t+=`gen_enforced_field(_, _, _) :- false. +`,t}get fullSource(){return`${this.getProjectDatabase()} +${this.source} +${this.getDeclarations()}`}createSession(){return new p9(this.project,this.fullSource)}async processClassic(){let t=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(t),enforcedFields:await this.genEnforcedFields(t)}}async process(){let{enforcedDependencies:t,enforcedFields:r}=await this.processClassic(),s=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:c,dependencyType:f}of t){let p=lS([f,H.stringifyIdent(n)]),h=qe.getMapWithDefault(s,a.cwd);qe.getMapWithDefault(h,p).set(c??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:c}of r){let f=lS(n),p=qe.getMapWithDefault(s,a.cwd);qe.getMapWithDefault(p,f).set(JSON.parse(c)??void 0,new Set)}return{manifestUpdates:s,reportedErrors:new Map}}async genEnforcedDependencies(t){let r=[];for await(let s of t.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=Y.resolve(this.project.cwd,Fm(s.links.WorkspaceCwd)),n=Fm(s.links.DependencyIdent),c=Fm(s.links.DependencyRange),f=Fm(s.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=H.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:c,dependencyType:f})}return qe.sortMap(r,[({dependencyRange:s})=>s!==null?"0":"1",({workspace:s})=>H.stringifyIdent(s.anchoredLocator),({dependencyIdent:s})=>H.stringifyIdent(s)])}async genEnforcedFields(t){let r=[];for await(let s of t.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=Y.resolve(this.project.cwd,Fm(s.links.WorkspaceCwd)),n=Fm(s.links.FieldPath),c=Fat(s.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let f=this.project.getWorkspaceByCwd(a);r.push({workspace:f,fieldPath:n,fieldValue:c})}return qe.sortMap(r,[({workspace:s})=>H.stringifyIdent(s.anchoredLocator),({fieldPath:s})=>s])}async*query(t){let r=this.createSession();for await(let s of r.makeQuery(t)){let a={};for(let[n,c]of Object.entries(s.links))n!=="_"&&(a[n]=Fm(c));yield a}}}});var Ume=G(eF=>{"use strict";Object.defineProperty(eF,"__esModule",{value:!0});function PS(e){let t=[...e.caches],r=t.shift();return r===void 0?Mme():{get(s,a,n={miss:()=>Promise.resolve()}){return r.get(s,a,n).catch(()=>PS({caches:t}).get(s,a,n))},set(s,a){return r.set(s,a).catch(()=>PS({caches:t}).set(s,a))},delete(s){return r.delete(s).catch(()=>PS({caches:t}).delete(s))},clear(){return r.clear().catch(()=>PS({caches:t}).clear())}}}function Mme(){return{get(e,t,r={miss:()=>Promise.resolve()}){return t().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(e,t){return Promise.resolve(t)},delete(e){return Promise.resolve()},clear(){return Promise.resolve()}}}eF.createFallbackableCache=PS;eF.createNullCache=Mme});var Hme=G((uVt,_me)=>{_me.exports=Ume()});var jme=G(P9=>{"use strict";Object.defineProperty(P9,"__esModule",{value:!0});function $at(e={serializable:!0}){let t={};return{get(r,s,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in t)return Promise.resolve(e.serializable?JSON.parse(t[n]):t[n]);let c=s(),f=a&&a.miss||(()=>Promise.resolve());return c.then(p=>f(p)).then(()=>c)},set(r,s){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(s):s,Promise.resolve(s)},delete(r){return delete t[JSON.stringify(r)],Promise.resolve()},clear(){return t={},Promise.resolve()}}}P9.createInMemoryCache=$at});var qme=G((AVt,Gme)=>{Gme.exports=jme()});var Wme=G(rf=>{"use strict";Object.defineProperty(rf,"__esModule",{value:!0});function elt(e,t,r){let s={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers(){return e===x9.WithinHeaders?s:{}},queryParameters(){return e===x9.WithinQueryParameters?s:{}}}}function tlt(e){let t=0,r=()=>(t++,new Promise(s=>{setTimeout(()=>{s(e(r))},Math.min(100*t,1e3))}));return e(r)}function Yme(e,t=(r,s)=>Promise.resolve()){return Object.assign(e,{wait(r){return Yme(e.then(s=>Promise.all([t(s,r),s])).then(s=>s[1]))}})}function rlt(e){let t=e.length-1;for(t;t>0;t--){let r=Math.floor(Math.random()*(t+1)),s=e[t];e[t]=e[r],e[r]=s}return e}function nlt(e,t){return t&&Object.keys(t).forEach(r=>{e[r]=t[r](e)}),e}function ilt(e,...t){let r=0;return e.replace(/%s/g,()=>encodeURIComponent(t[r++]))}var slt="4.22.1",olt=e=>()=>e.transporter.requester.destroy(),x9={WithinQueryParameters:0,WithinHeaders:1};rf.AuthMode=x9;rf.addMethods=nlt;rf.createAuth=elt;rf.createRetryablePromise=tlt;rf.createWaitablePromise=Yme;rf.destroy=olt;rf.encode=ilt;rf.shuffle=rlt;rf.version=slt});var xS=G((hVt,Vme)=>{Vme.exports=Wme()});var Kme=G(k9=>{"use strict";Object.defineProperty(k9,"__esModule",{value:!0});var alt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};k9.MethodEnum=alt});var kS=G((gVt,Jme)=>{Jme.exports=Kme()});var uye=G(Wi=>{"use strict";Object.defineProperty(Wi,"__esModule",{value:!0});var Zme=kS();function Q9(e,t){let r=e||{},s=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(s[a]=r[a])}),{data:Object.entries(s).length>0?s:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var QS={Read:1,Write:2,Any:3},$C={Up:1,Down:2,Timeouted:3},Xme=2*60*1e3;function R9(e,t=$C.Up){return{...e,status:t,lastUpdate:Date.now()}}function $me(e){return e.status===$C.Up||Date.now()-e.lastUpdate>Xme}function eye(e){return e.status===$C.Timeouted&&Date.now()-e.lastUpdate<=Xme}function F9(e){return typeof e=="string"?{protocol:"https",url:e,accept:QS.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||QS.Any}}function llt(e,t){return Promise.all(t.map(r=>e.get(r,()=>Promise.resolve(R9(r))))).then(r=>{let s=r.filter(f=>$me(f)),a=r.filter(f=>eye(f)),n=[...s,...a],c=n.length>0?n.map(f=>F9(f)):t;return{getTimeout(f,p){return(a.length===0&&f===0?1:a.length+3+f)*p},statelessHosts:c}})}var clt=({isTimedOut:e,status:t})=>!e&&~~t===0,ult=e=>{let t=e.status;return e.isTimedOut||clt(e)||~~(t/100)!==2&&~~(t/100)!==4},flt=({status:e})=>~~(e/100)===2,Alt=(e,t)=>ult(e)?t.onRetry(e):flt(e)?t.onSuccess(e):t.onFail(e);function zme(e,t,r,s){let a=[],n=sye(r,s),c=oye(e,s),f=r.method,p=r.method!==Zme.MethodEnum.Get?{}:{...r.data,...s.data},h={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...p,...s.queryParameters},E=0,C=(S,x)=>{let I=S.pop();if(I===void 0)throw cye(T9(a));let R={data:n,headers:c,method:f,url:nye(I,r.path,h),connectTimeout:x(E,e.timeouts.connect),responseTimeout:x(E,s.timeout)},N=K=>{let $={request:R,response:K,host:I,triesLeft:S.length};return a.push($),$},U={onSuccess:K=>tye(K),onRetry(K){let $=N(K);return K.isTimedOut&&E++,Promise.all([e.logger.info("Retryable failure",N9($)),e.hostsCache.set(I,R9(I,K.isTimedOut?$C.Timeouted:$C.Down))]).then(()=>C(S,x))},onFail(K){throw N(K),rye(K,T9(a))}};return e.requester.send(R).then(K=>Alt(K,U))};return llt(e.hostsCache,t).then(S=>C([...S.statelessHosts].reverse(),S.getTimeout))}function plt(e){let{hostsCache:t,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,hosts:p,queryParameters:h,headers:E}=e,C={hostsCache:t,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,headers:E,queryParameters:h,hosts:p.map(S=>F9(S)),read(S,x){let I=Q9(x,C.timeouts.read),R=()=>zme(C,C.hosts.filter(K=>(K.accept&QS.Read)!==0),S,I);if((I.cacheable!==void 0?I.cacheable:S.cacheable)!==!0)return R();let U={request:S,mappedRequestOptions:I,transporter:{queryParameters:C.queryParameters,headers:C.headers}};return C.responsesCache.get(U,()=>C.requestsCache.get(U,()=>C.requestsCache.set(U,R()).then(K=>Promise.all([C.requestsCache.delete(U),K]),K=>Promise.all([C.requestsCache.delete(U),Promise.reject(K)])).then(([K,$])=>$)),{miss:K=>C.responsesCache.set(U,K)})},write(S,x){return zme(C,C.hosts.filter(I=>(I.accept&QS.Write)!==0),S,Q9(x,C.timeouts.write))}};return C}function hlt(e){let t={value:`Algolia for JavaScript (${e})`,add(r){let s=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return t.value.indexOf(s)===-1&&(t.value=`${t.value}${s}`),t}};return t}function tye(e){try{return JSON.parse(e.content)}catch(t){throw lye(t.message,e)}}function rye({content:e,status:t},r){let s=e;try{s=JSON.parse(e).message}catch{}return aye(s,t,r)}function dlt(e,...t){let r=0;return e.replace(/%s/g,()=>encodeURIComponent(t[r++]))}function nye(e,t,r){let s=iye(r),a=`${e.protocol}://${e.url}/${t.charAt(0)==="/"?t.substr(1):t}`;return s.length&&(a+=`?${s}`),a}function iye(e){let t=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(e).map(r=>dlt("%s=%s",r,t(e[r])?JSON.stringify(e[r]):e[r])).join("&")}function sye(e,t){if(e.method===Zme.MethodEnum.Get||e.data===void 0&&t.data===void 0)return;let r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}function oye(e,t){let r={...e.headers,...t.headers},s={};return Object.keys(r).forEach(a=>{let n=r[a];s[a.toLowerCase()]=n}),s}function T9(e){return e.map(t=>N9(t))}function N9(e){let t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function aye(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}function lye(e,t){return{name:"DeserializationError",message:e,response:t}}function cye(e){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:e}}Wi.CallEnum=QS;Wi.HostStatusEnum=$C;Wi.createApiError=aye;Wi.createDeserializationError=lye;Wi.createMappedRequestOptions=Q9;Wi.createRetryError=cye;Wi.createStatefulHost=R9;Wi.createStatelessHost=F9;Wi.createTransporter=plt;Wi.createUserAgent=hlt;Wi.deserializeFailure=rye;Wi.deserializeSuccess=tye;Wi.isStatefulHostTimeouted=eye;Wi.isStatefulHostUp=$me;Wi.serializeData=sye;Wi.serializeHeaders=oye;Wi.serializeQueryParameters=iye;Wi.serializeUrl=nye;Wi.stackFrameWithoutCredentials=N9;Wi.stackTraceWithoutCredentials=T9});var TS=G((yVt,fye)=>{fye.exports=uye()});var Aye=G(Xd=>{"use strict";Object.defineProperty(Xd,"__esModule",{value:!0});var ew=xS(),glt=TS(),RS=kS(),mlt=e=>{let t=e.region||"us",r=ew.createAuth(ew.AuthMode.WithinHeaders,e.appId,e.apiKey),s=glt.createTransporter({hosts:[{url:`analytics.${t}.algolia.com`}],...e,headers:{...r.headers(),"content-type":"application/json",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),a=e.appId;return ew.addMethods({appId:a,transporter:s},e.methods)},ylt=e=>(t,r)=>e.transporter.write({method:RS.MethodEnum.Post,path:"2/abtests",data:t},r),Elt=e=>(t,r)=>e.transporter.write({method:RS.MethodEnum.Delete,path:ew.encode("2/abtests/%s",t)},r),Ilt=e=>(t,r)=>e.transporter.read({method:RS.MethodEnum.Get,path:ew.encode("2/abtests/%s",t)},r),Clt=e=>t=>e.transporter.read({method:RS.MethodEnum.Get,path:"2/abtests"},t),wlt=e=>(t,r)=>e.transporter.write({method:RS.MethodEnum.Post,path:ew.encode("2/abtests/%s/stop",t)},r);Xd.addABTest=ylt;Xd.createAnalyticsClient=mlt;Xd.deleteABTest=Elt;Xd.getABTest=Ilt;Xd.getABTests=Clt;Xd.stopABTest=wlt});var hye=G((IVt,pye)=>{pye.exports=Aye()});var gye=G(NS=>{"use strict";Object.defineProperty(NS,"__esModule",{value:!0});var O9=xS(),Blt=TS(),dye=kS(),vlt=e=>{let t=e.region||"us",r=O9.createAuth(O9.AuthMode.WithinHeaders,e.appId,e.apiKey),s=Blt.createTransporter({hosts:[{url:`personalization.${t}.algolia.com`}],...e,headers:{...r.headers(),"content-type":"application/json",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}});return O9.addMethods({appId:e.appId,transporter:s},e.methods)},Slt=e=>t=>e.transporter.read({method:dye.MethodEnum.Get,path:"1/strategies/personalization"},t),blt=e=>(t,r)=>e.transporter.write({method:dye.MethodEnum.Post,path:"1/strategies/personalization",data:t},r);NS.createPersonalizationClient=vlt;NS.getPersonalizationStrategy=Slt;NS.setPersonalizationStrategy=blt});var yye=G((wVt,mye)=>{mye.exports=gye()});var Tye=G(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});var Kt=xS(),Bl=TS(),Dr=kS(),Dlt=Ce("crypto");function tF(e){let t=r=>e.request(r).then(s=>{if(e.batch!==void 0&&e.batch(s.hits),!e.shouldStop(s))return s.cursor?t({cursor:s.cursor}):t({page:(r.page||0)+1})});return t({})}var Plt=e=>{let t=e.appId,r=Kt.createAuth(e.authMode!==void 0?e.authMode:Kt.AuthMode.WithinHeaders,t,e.apiKey),s=Bl.createTransporter({hosts:[{url:`${t}-dsn.algolia.net`,accept:Bl.CallEnum.Read},{url:`${t}.algolia.net`,accept:Bl.CallEnum.Write}].concat(Kt.shuffle([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),a={transporter:s,appId:t,addAlgoliaAgent(n,c){s.userAgent.add({segment:n,version:c})},clearCache(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then(()=>{})}};return Kt.addMethods(a,e.methods)};function Eye(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function Iye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function Cye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var xlt=e=>(t,r)=>{let{queryParameters:s,...a}=r||{},n={acl:t,...s!==void 0?{queryParameters:s}:{}},c=(f,p)=>Kt.createRetryablePromise(h=>OS(e)(f.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:"1/keys",data:n},a),c)},klt=e=>(t,r,s)=>{let a=Bl.createMappedRequestOptions(s);return a.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},Qlt=e=>(t,r,s)=>e.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:t,cluster:r}},s),Tlt=e=>(t,r)=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("/1/dictionaries/%s/batch",t),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(s,a)=>tw(e)(s.taskID,a)),rF=e=>(t,r,s)=>{let a=(n,c)=>LS(e)(t,{methods:{waitTask:ys}}).waitTask(n.taskID,c);return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/operation",t),data:{operation:"copy",destination:r}},s),a)},Rlt=e=>(t,r,s)=>rF(e)(t,r,{...s,scope:[iF.Rules]}),Flt=e=>(t,r,s)=>rF(e)(t,r,{...s,scope:[iF.Settings]}),Nlt=e=>(t,r,s)=>rF(e)(t,r,{...s,scope:[iF.Synonyms]}),Olt=e=>(t,r)=>t.method===Dr.MethodEnum.Get?e.transporter.read(t,r):e.transporter.write(t,r),Llt=e=>(t,r)=>{let s=(a,n)=>Kt.createRetryablePromise(c=>OS(e)(t,n).then(c).catch(f=>{if(f.status!==404)throw f}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Delete,path:Kt.encode("1/keys/%s",t)},r),s)},Mlt=e=>(t,r,s)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("/1/dictionaries/%s/batch",t),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>tw(e)(n.taskID,c))},Ult=()=>(e,t)=>{let r=Bl.serializeQueryParameters(t),s=Dlt.createHmac("sha256",e).update(r).digest("hex");return Buffer.from(s+r).toString("base64")},OS=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/keys/%s",t)},r),wye=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/task/%s",t.toString())},r),_lt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"/1/dictionaries/*/settings"},t),Hlt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/logs"},t),jlt=()=>e=>{let t=Buffer.from(e,"base64").toString("ascii"),r=/validUntil=(\d+)/,s=t.match(r);if(s===null)throw Cye();return parseInt(s[1],10)-Math.round(new Date().getTime()/1e3)},Glt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/top"},t),qlt=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/clusters/mapping/%s",t)},r),Ylt=e=>t=>{let{retrieveMappings:r,...s}=t||{};return r===!0&&(s.getClusters=!0),e.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/pending"},s)},LS=e=>(t,r={})=>{let s={transporter:e.transporter,appId:e.appId,indexName:t};return Kt.addMethods(s,r.methods)},Wlt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/keys"},t),Vlt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters"},t),Klt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/indexes"},t),Jlt=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping"},t),zlt=e=>(t,r,s)=>{let a=(n,c)=>LS(e)(t,{methods:{waitTask:ys}}).waitTask(n.taskID,c);return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/operation",t),data:{operation:"move",destination:r}},s),a)},Zlt=e=>(t,r)=>{let s=(a,n)=>Promise.all(Object.keys(a.taskID).map(c=>LS(e)(c,{methods:{waitTask:ys}}).waitTask(a.taskID[c],n)));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:t}},r),s)},Xlt=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:t}},r),$lt=e=>(t,r)=>{let s=t.map(a=>({...a,params:Bl.serializeQueryParameters(a.params||{})}));return e.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:s},cacheable:!0},r)},ect=e=>(t,r)=>Promise.all(t.map(s=>{let{facetName:a,facetQuery:n,...c}=s.params;return LS(e)(s.indexName,{methods:{searchForFacetValues:xye}}).searchForFacetValues(a,n,{...r,...c})})),tct=e=>(t,r)=>{let s=Bl.createMappedRequestOptions(r);return s.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:Dr.MethodEnum.Delete,path:"1/clusters/mapping"},s)},rct=e=>(t,r,s)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("/1/dictionaries/%s/batch",t),data:{clearExistingDictionaryEntries:!0,requests:a}},s),(n,c)=>tw(e)(n.taskID,c))},nct=e=>(t,r)=>{let s=(a,n)=>Kt.createRetryablePromise(c=>OS(e)(t,n).catch(f=>{if(f.status!==404)throw f;return c()}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/keys/%s/restore",t)},r),s)},ict=e=>(t,r,s)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("/1/dictionaries/%s/batch",t),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>tw(e)(n.taskID,c))},sct=e=>(t,r,s)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("/1/dictionaries/%s/search",t),data:{query:r},cacheable:!0},s),oct=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:t}},r),act=e=>(t,r)=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:t},r),(s,a)=>tw(e)(s.taskID,a)),lct=e=>(t,r)=>{let s=Object.assign({},r),{queryParameters:a,...n}=r||{},c=a?{queryParameters:a}:{},f=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(s).filter(C=>f.indexOf(C)!==-1).every(C=>{if(Array.isArray(E[C])&&Array.isArray(s[C])){let S=E[C];return S.length===s[C].length&&S.every((x,I)=>x===s[C][I])}else return E[C]===s[C]}),h=(E,C)=>Kt.createRetryablePromise(S=>OS(e)(t,C).then(x=>p(x)?Promise.resolve():S()));return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Put,path:Kt.encode("1/keys/%s",t),data:c},n),h)},tw=e=>(t,r)=>Kt.createRetryablePromise(s=>wye(e)(t,r).then(a=>a.status!=="published"?s():void 0)),Bye=e=>(t,r)=>{let s=(a,n)=>ys(e)(a.taskID,n);return Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/batch",e.indexName),data:{requests:t}},r),s)},cct=e=>t=>tF({shouldStop:r=>r.cursor===void 0,...t,request:r=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/browse",e.indexName),data:r},t)}),uct=e=>t=>{let r={hitsPerPage:1e3,...t};return tF({shouldStop:s=>s.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},fct=e=>t=>{let r={hitsPerPage:1e3,...t};return tF({shouldStop:s=>s.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},nF=e=>(t,r,s)=>{let{batchSize:a,...n}=s||{},c={taskIDs:[],objectIDs:[]},f=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:C})),n).then(C=>(c.objectIDs=c.objectIDs.concat(C.objectIDs),c.taskIDs.push(C.taskID),E++,f(E)))};return Kt.createWaitablePromise(f(),(p,h)=>Promise.all(p.taskIDs.map(E=>ys(e)(E,h))))},Act=e=>t=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/clear",e.indexName)},t),(r,s)=>ys(e)(r.taskID,s)),pct=e=>t=>{let{forwardToReplicas:r,...s}=t||{},a=Bl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/rules/clear",e.indexName)},a),(n,c)=>ys(e)(n.taskID,c))},hct=e=>t=>{let{forwardToReplicas:r,...s}=t||{},a=Bl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/synonyms/clear",e.indexName)},a),(n,c)=>ys(e)(n.taskID,c))},dct=e=>(t,r)=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/deleteByQuery",e.indexName),data:t},r),(s,a)=>ys(e)(s.taskID,a)),gct=e=>t=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Delete,path:Kt.encode("1/indexes/%s",e.indexName)},t),(r,s)=>ys(e)(r.taskID,s)),mct=e=>(t,r)=>Kt.createWaitablePromise(vye(e)([t],r).then(s=>({taskID:s.taskIDs[0]})),(s,a)=>ys(e)(s.taskID,a)),vye=e=>(t,r)=>{let s=t.map(a=>({objectID:a}));return nF(e)(s,Om.DeleteObject,r)},yct=e=>(t,r)=>{let{forwardToReplicas:s,...a}=r||{},n=Bl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Delete,path:Kt.encode("1/indexes/%s/rules/%s",e.indexName,t)},n),(c,f)=>ys(e)(c.taskID,f))},Ect=e=>(t,r)=>{let{forwardToReplicas:s,...a}=r||{},n=Bl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Delete,path:Kt.encode("1/indexes/%s/synonyms/%s",e.indexName,t)},n),(c,f)=>ys(e)(c.taskID,f))},Ict=e=>t=>Sye(e)(t).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Cct=e=>(t,r,s)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},s),wct=e=>(t,r)=>{let{query:s,paginate:a,...n}=r||{},c=0,f=()=>Pye(e)(s||"",{...n,page:c}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(t(E))return{object:E,position:parseInt(h,10),page:c};if(c++,a===!1||c>=p.nbPages)throw Iye();return f()});return f()},Bct=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/indexes/%s/%s",e.indexName,t)},r),vct=()=>(e,t)=>{for(let[r,s]of Object.entries(e.hits))if(s.objectID===t)return parseInt(r,10);return-1},Sct=e=>(t,r)=>{let{attributesToRetrieve:s,...a}=r||{},n=t.map(c=>({indexName:e.indexName,objectID:c,...s?{attributesToRetrieve:s}:{}}));return e.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},bct=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/indexes/%s/rules/%s",e.indexName,t)},r),Sye=e=>t=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/indexes/%s/settings",e.indexName),data:{getVersion:2}},t),Dct=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/indexes/%s/synonyms/%s",e.indexName,t)},r),bye=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Get,path:Kt.encode("1/indexes/%s/task/%s",e.indexName,t.toString())},r),Pct=e=>(t,r)=>Kt.createWaitablePromise(Dye(e)([t],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>ys(e)(s.taskID,a)),Dye=e=>(t,r)=>{let{createIfNotExists:s,...a}=r||{},n=s?Om.PartialUpdateObject:Om.PartialUpdateObjectNoCreate;return nF(e)(t,n,a)},xct=e=>(t,r)=>{let{safe:s,autoGenerateObjectIDIfNotExist:a,batchSize:n,...c}=r||{},f=(I,R,N,U)=>Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/operation",I),data:{operation:N,destination:R}},U),(K,$)=>ys(e)(K.taskID,$)),p=Math.random().toString(36).substring(7),h=`${e.indexName}_tmp_${p}`,E=L9({appId:e.appId,transporter:e.transporter,indexName:h}),C=[],S=f(e.indexName,h,"copy",{...c,scope:["settings","synonyms","rules"]});C.push(S);let x=(s?S.wait(c):S).then(()=>{let I=E(t,{...c,autoGenerateObjectIDIfNotExist:a,batchSize:n});return C.push(I),s?I.wait(c):I}).then(()=>{let I=f(h,e.indexName,"move",c);return C.push(I),s?I.wait(c):I}).then(()=>Promise.all(C)).then(([I,R,N])=>({objectIDs:R.objectIDs,taskIDs:[I.taskID,...R.taskIDs,N.taskID]}));return Kt.createWaitablePromise(x,(I,R)=>Promise.all(C.map(N=>N.wait(R))))},kct=e=>(t,r)=>M9(e)(t,{...r,clearExistingRules:!0}),Qct=e=>(t,r)=>U9(e)(t,{...r,clearExistingSynonyms:!0}),Tct=e=>(t,r)=>Kt.createWaitablePromise(L9(e)([t],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>ys(e)(s.taskID,a)),L9=e=>(t,r)=>{let{autoGenerateObjectIDIfNotExist:s,...a}=r||{},n=s?Om.AddObject:Om.UpdateObject;if(n===Om.UpdateObject){for(let c of t)if(c.objectID===void 0)return Kt.createWaitablePromise(Promise.reject(Eye()))}return nF(e)(t,n,a)},Rct=e=>(t,r)=>M9(e)([t],r),M9=e=>(t,r)=>{let{forwardToReplicas:s,clearExistingRules:a,...n}=r||{},c=Bl.createMappedRequestOptions(n);return s&&(c.queryParameters.forwardToReplicas=1),a&&(c.queryParameters.clearExistingRules=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/rules/batch",e.indexName),data:t},c),(f,p)=>ys(e)(f.taskID,p))},Fct=e=>(t,r)=>U9(e)([t],r),U9=e=>(t,r)=>{let{forwardToReplicas:s,clearExistingSynonyms:a,replaceExistingSynonyms:n,...c}=r||{},f=Bl.createMappedRequestOptions(c);return s&&(f.queryParameters.forwardToReplicas=1),(n||a)&&(f.queryParameters.replaceExistingSynonyms=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/synonyms/batch",e.indexName),data:t},f),(p,h)=>ys(e)(p.taskID,h))},Pye=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),xye=e=>(t,r,s)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},s),kye=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/rules/search",e.indexName),data:{query:t}},r),Qye=e=>(t,r)=>e.transporter.read({method:Dr.MethodEnum.Post,path:Kt.encode("1/indexes/%s/synonyms/search",e.indexName),data:{query:t}},r),Nct=e=>(t,r)=>{let{forwardToReplicas:s,...a}=r||{},n=Bl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Kt.createWaitablePromise(e.transporter.write({method:Dr.MethodEnum.Put,path:Kt.encode("1/indexes/%s/settings",e.indexName),data:t},n),(c,f)=>ys(e)(c.taskID,f))},ys=e=>(t,r)=>Kt.createRetryablePromise(s=>bye(e)(t,r).then(a=>a.status!=="published"?s():void 0)),Oct={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",Inference:"inference",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},Om={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},iF={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Lct={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},Mct={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Nt.ApiKeyACLEnum=Oct;Nt.BatchActionEnum=Om;Nt.ScopeEnum=iF;Nt.StrategyEnum=Lct;Nt.SynonymEnum=Mct;Nt.addApiKey=xlt;Nt.assignUserID=klt;Nt.assignUserIDs=Qlt;Nt.batch=Bye;Nt.browseObjects=cct;Nt.browseRules=uct;Nt.browseSynonyms=fct;Nt.chunkedBatch=nF;Nt.clearDictionaryEntries=Tlt;Nt.clearObjects=Act;Nt.clearRules=pct;Nt.clearSynonyms=hct;Nt.copyIndex=rF;Nt.copyRules=Rlt;Nt.copySettings=Flt;Nt.copySynonyms=Nlt;Nt.createBrowsablePromise=tF;Nt.createMissingObjectIDError=Eye;Nt.createObjectNotFoundError=Iye;Nt.createSearchClient=Plt;Nt.createValidUntilNotFoundError=Cye;Nt.customRequest=Olt;Nt.deleteApiKey=Llt;Nt.deleteBy=dct;Nt.deleteDictionaryEntries=Mlt;Nt.deleteIndex=gct;Nt.deleteObject=mct;Nt.deleteObjects=vye;Nt.deleteRule=yct;Nt.deleteSynonym=Ect;Nt.exists=Ict;Nt.findAnswers=Cct;Nt.findObject=wct;Nt.generateSecuredApiKey=Ult;Nt.getApiKey=OS;Nt.getAppTask=wye;Nt.getDictionarySettings=_lt;Nt.getLogs=Hlt;Nt.getObject=Bct;Nt.getObjectPosition=vct;Nt.getObjects=Sct;Nt.getRule=bct;Nt.getSecuredApiKeyRemainingValidity=jlt;Nt.getSettings=Sye;Nt.getSynonym=Dct;Nt.getTask=bye;Nt.getTopUserIDs=Glt;Nt.getUserID=qlt;Nt.hasPendingMappings=Ylt;Nt.initIndex=LS;Nt.listApiKeys=Wlt;Nt.listClusters=Vlt;Nt.listIndices=Klt;Nt.listUserIDs=Jlt;Nt.moveIndex=zlt;Nt.multipleBatch=Zlt;Nt.multipleGetObjects=Xlt;Nt.multipleQueries=$lt;Nt.multipleSearchForFacetValues=ect;Nt.partialUpdateObject=Pct;Nt.partialUpdateObjects=Dye;Nt.removeUserID=tct;Nt.replaceAllObjects=xct;Nt.replaceAllRules=kct;Nt.replaceAllSynonyms=Qct;Nt.replaceDictionaryEntries=rct;Nt.restoreApiKey=nct;Nt.saveDictionaryEntries=ict;Nt.saveObject=Tct;Nt.saveObjects=L9;Nt.saveRule=Rct;Nt.saveRules=M9;Nt.saveSynonym=Fct;Nt.saveSynonyms=U9;Nt.search=Pye;Nt.searchDictionaryEntries=sct;Nt.searchForFacetValues=xye;Nt.searchRules=kye;Nt.searchSynonyms=Qye;Nt.searchUserIDs=oct;Nt.setDictionarySettings=act;Nt.setSettings=Nct;Nt.updateApiKey=lct;Nt.waitAppTask=tw;Nt.waitTask=ys});var Fye=G((vVt,Rye)=>{Rye.exports=Tye()});var Nye=G(sF=>{"use strict";Object.defineProperty(sF,"__esModule",{value:!0});function Uct(){return{debug(e,t){return Promise.resolve()},info(e,t){return Promise.resolve()},error(e,t){return Promise.resolve()}}}var _ct={Debug:1,Info:2,Error:3};sF.LogLevelEnum=_ct;sF.createNullLogger=Uct});var Lye=G((bVt,Oye)=>{Oye.exports=Nye()});var Hye=G(_9=>{"use strict";Object.defineProperty(_9,"__esModule",{value:!0});var Mye=Ce("http"),Uye=Ce("https"),Hct=Ce("url"),_ye={keepAlive:!0},jct=new Mye.Agent(_ye),Gct=new Uye.Agent(_ye);function qct({agent:e,httpAgent:t,httpsAgent:r,requesterOptions:s={}}={}){let a=t||e||jct,n=r||e||Gct;return{send(c){return new Promise(f=>{let p=Hct.parse(c.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...s,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:c.method,headers:{...s&&s.headers?s.headers:{},...c.headers},...p.port!==void 0?{port:p.port||""}:{}},C=(p.protocol==="https:"?Uye:Mye).request(E,R=>{let N=[];R.on("data",U=>{N=N.concat(U)}),R.on("end",()=>{clearTimeout(x),clearTimeout(I),f({status:R.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),S=(R,N)=>setTimeout(()=>{C.abort(),f({status:0,content:N,isTimedOut:!0})},R*1e3),x=S(c.connectTimeout,"Connection timeout"),I;C.on("error",R=>{clearTimeout(x),clearTimeout(I),f({status:0,content:R.message,isTimedOut:!1})}),C.once("response",()=>{clearTimeout(x),I=S(c.responseTimeout,"Socket timeout")}),c.data!==void 0&&C.write(c.data),C.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}_9.createNodeHttpRequester=qct});var Gye=G((PVt,jye)=>{jye.exports=Hye()});var Vye=G((xVt,Wye)=>{"use strict";var qye=Hme(),Yct=qme(),rw=hye(),j9=xS(),H9=yye(),qt=Fye(),Wct=Lye(),Vct=Gye(),Kct=TS();function Yye(e,t,r){let s={appId:e,apiKey:t,timeouts:{connect:2,read:5,write:30},requester:Vct.createNodeHttpRequester(),logger:Wct.createNullLogger(),responsesCache:qye.createNullCache(),requestsCache:qye.createNullCache(),hostsCache:Yct.createInMemoryCache(),userAgent:Kct.createUserAgent(j9.version).add({segment:"Node.js",version:process.versions.node})},a={...s,...r},n=()=>c=>H9.createPersonalizationClient({...s,...c,methods:{getPersonalizationStrategy:H9.getPersonalizationStrategy,setPersonalizationStrategy:H9.setPersonalizationStrategy}});return qt.createSearchClient({...a,methods:{search:qt.multipleQueries,searchForFacetValues:qt.multipleSearchForFacetValues,multipleBatch:qt.multipleBatch,multipleGetObjects:qt.multipleGetObjects,multipleQueries:qt.multipleQueries,copyIndex:qt.copyIndex,copySettings:qt.copySettings,copyRules:qt.copyRules,copySynonyms:qt.copySynonyms,moveIndex:qt.moveIndex,listIndices:qt.listIndices,getLogs:qt.getLogs,listClusters:qt.listClusters,multipleSearchForFacetValues:qt.multipleSearchForFacetValues,getApiKey:qt.getApiKey,addApiKey:qt.addApiKey,listApiKeys:qt.listApiKeys,updateApiKey:qt.updateApiKey,deleteApiKey:qt.deleteApiKey,restoreApiKey:qt.restoreApiKey,assignUserID:qt.assignUserID,assignUserIDs:qt.assignUserIDs,getUserID:qt.getUserID,searchUserIDs:qt.searchUserIDs,listUserIDs:qt.listUserIDs,getTopUserIDs:qt.getTopUserIDs,removeUserID:qt.removeUserID,hasPendingMappings:qt.hasPendingMappings,generateSecuredApiKey:qt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:qt.getSecuredApiKeyRemainingValidity,destroy:j9.destroy,clearDictionaryEntries:qt.clearDictionaryEntries,deleteDictionaryEntries:qt.deleteDictionaryEntries,getDictionarySettings:qt.getDictionarySettings,getAppTask:qt.getAppTask,replaceDictionaryEntries:qt.replaceDictionaryEntries,saveDictionaryEntries:qt.saveDictionaryEntries,searchDictionaryEntries:qt.searchDictionaryEntries,setDictionarySettings:qt.setDictionarySettings,waitAppTask:qt.waitAppTask,customRequest:qt.customRequest,initIndex:c=>f=>qt.initIndex(c)(f,{methods:{batch:qt.batch,delete:qt.deleteIndex,findAnswers:qt.findAnswers,getObject:qt.getObject,getObjects:qt.getObjects,saveObject:qt.saveObject,saveObjects:qt.saveObjects,search:qt.search,searchForFacetValues:qt.searchForFacetValues,waitTask:qt.waitTask,setSettings:qt.setSettings,getSettings:qt.getSettings,partialUpdateObject:qt.partialUpdateObject,partialUpdateObjects:qt.partialUpdateObjects,deleteObject:qt.deleteObject,deleteObjects:qt.deleteObjects,deleteBy:qt.deleteBy,clearObjects:qt.clearObjects,browseObjects:qt.browseObjects,getObjectPosition:qt.getObjectPosition,findObject:qt.findObject,exists:qt.exists,saveSynonym:qt.saveSynonym,saveSynonyms:qt.saveSynonyms,getSynonym:qt.getSynonym,searchSynonyms:qt.searchSynonyms,browseSynonyms:qt.browseSynonyms,deleteSynonym:qt.deleteSynonym,clearSynonyms:qt.clearSynonyms,replaceAllObjects:qt.replaceAllObjects,replaceAllSynonyms:qt.replaceAllSynonyms,searchRules:qt.searchRules,getRule:qt.getRule,deleteRule:qt.deleteRule,saveRule:qt.saveRule,saveRules:qt.saveRules,replaceAllRules:qt.replaceAllRules,browseRules:qt.browseRules,clearRules:qt.clearRules}}),initAnalytics:()=>c=>rw.createAnalyticsClient({...s,...c,methods:{addABTest:rw.addABTest,getABTest:rw.getABTest,getABTests:rw.getABTests,stopABTest:rw.stopABTest,deleteABTest:rw.deleteABTest}}),initPersonalization:n,initRecommendation:()=>c=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(c))}})}Yye.version=j9.version;Wye.exports=Yye});var q9=G((kVt,G9)=>{var Kye=Vye();G9.exports=Kye;G9.exports.default=Kye});var V9=G((TVt,Zye)=>{"use strict";var zye=Object.getOwnPropertySymbols,zct=Object.prototype.hasOwnProperty,Zct=Object.prototype.propertyIsEnumerable;function Xct(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function $ct(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var s=Object.getOwnPropertyNames(t).map(function(n){return t[n]});if(s.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}Zye.exports=$ct()?Object.assign:function(e,t){for(var r,s=Xct(e),a,n=1;n{"use strict";var J9=V9(),nw=60103,eEe=60106;xn.Fragment=60107;xn.StrictMode=60108;xn.Profiler=60114;var tEe=60109,rEe=60110,nEe=60112;xn.Suspense=60113;var iEe=60115,sEe=60116;typeof Symbol=="function"&&Symbol.for&&(Gc=Symbol.for,nw=Gc("react.element"),eEe=Gc("react.portal"),xn.Fragment=Gc("react.fragment"),xn.StrictMode=Gc("react.strict_mode"),xn.Profiler=Gc("react.profiler"),tEe=Gc("react.provider"),rEe=Gc("react.context"),nEe=Gc("react.forward_ref"),xn.Suspense=Gc("react.suspense"),iEe=Gc("react.memo"),sEe=Gc("react.lazy"));var Gc,Xye=typeof Symbol=="function"&&Symbol.iterator;function eut(e){return e===null||typeof e!="object"?null:(e=Xye&&e[Xye]||e["@@iterator"],typeof e=="function"?e:null)}function MS(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r{"use strict";hEe.exports=pEe()});var lF=G((NVt,dEe)=>{function sut(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}dEe.exports=sut});var mEe=G((OVt,gEe)=>{var out=typeof global=="object"&&global&&global.Object===Object&&global;gEe.exports=out});var eq=G((LVt,yEe)=>{var aut=mEe(),lut=typeof self=="object"&&self&&self.Object===Object&&self,cut=aut||lut||Function("return this")();yEe.exports=cut});var IEe=G((MVt,EEe)=>{var uut=eq(),fut=function(){return uut.Date.now()};EEe.exports=fut});var wEe=G((UVt,CEe)=>{var Aut=/\s/;function put(e){for(var t=e.length;t--&&Aut.test(e.charAt(t)););return t}CEe.exports=put});var vEe=G((_Vt,BEe)=>{var hut=wEe(),dut=/^\s+/;function gut(e){return e&&e.slice(0,hut(e)+1).replace(dut,"")}BEe.exports=gut});var tq=G((HVt,SEe)=>{var mut=eq(),yut=mut.Symbol;SEe.exports=yut});var xEe=G((jVt,PEe)=>{var bEe=tq(),DEe=Object.prototype,Eut=DEe.hasOwnProperty,Iut=DEe.toString,US=bEe?bEe.toStringTag:void 0;function Cut(e){var t=Eut.call(e,US),r=e[US];try{e[US]=void 0;var s=!0}catch{}var a=Iut.call(e);return s&&(t?e[US]=r:delete e[US]),a}PEe.exports=Cut});var QEe=G((GVt,kEe)=>{var wut=Object.prototype,But=wut.toString;function vut(e){return But.call(e)}kEe.exports=vut});var NEe=G((qVt,FEe)=>{var TEe=tq(),Sut=xEe(),but=QEe(),Dut="[object Null]",Put="[object Undefined]",REe=TEe?TEe.toStringTag:void 0;function xut(e){return e==null?e===void 0?Put:Dut:REe&&REe in Object(e)?Sut(e):but(e)}FEe.exports=xut});var LEe=G((YVt,OEe)=>{function kut(e){return e!=null&&typeof e=="object"}OEe.exports=kut});var UEe=G((WVt,MEe)=>{var Qut=NEe(),Tut=LEe(),Rut="[object Symbol]";function Fut(e){return typeof e=="symbol"||Tut(e)&&Qut(e)==Rut}MEe.exports=Fut});var GEe=G((VVt,jEe)=>{var Nut=vEe(),_Ee=lF(),Out=UEe(),HEe=NaN,Lut=/^[-+]0x[0-9a-f]+$/i,Mut=/^0b[01]+$/i,Uut=/^0o[0-7]+$/i,_ut=parseInt;function Hut(e){if(typeof e=="number")return e;if(Out(e))return HEe;if(_Ee(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=_Ee(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=Nut(e);var r=Mut.test(e);return r||Uut.test(e)?_ut(e.slice(2),r?2:8):Lut.test(e)?HEe:+e}jEe.exports=Hut});var WEe=G((KVt,YEe)=>{var jut=lF(),rq=IEe(),qEe=GEe(),Gut="Expected a function",qut=Math.max,Yut=Math.min;function Wut(e,t,r){var s,a,n,c,f,p,h=0,E=!1,C=!1,S=!0;if(typeof e!="function")throw new TypeError(Gut);t=qEe(t)||0,jut(r)&&(E=!!r.leading,C="maxWait"in r,n=C?qut(qEe(r.maxWait)||0,t):n,S="trailing"in r?!!r.trailing:S);function x(le){var ge=s,pe=a;return s=a=void 0,h=le,c=e.apply(pe,ge),c}function I(le){return h=le,f=setTimeout(U,t),E?x(le):c}function R(le){var ge=le-p,pe=le-h,De=t-ge;return C?Yut(De,n-pe):De}function N(le){var ge=le-p,pe=le-h;return p===void 0||ge>=t||ge<0||C&&pe>=n}function U(){var le=rq();if(N(le))return K(le);f=setTimeout(U,R(le))}function K(le){return f=void 0,S&&s?x(le):(s=a=void 0,c)}function $(){f!==void 0&&clearTimeout(f),h=0,s=p=a=f=void 0}function ie(){return f===void 0?c:K(rq())}function fe(){var le=rq(),ge=N(le);if(s=arguments,a=this,p=le,ge){if(f===void 0)return I(p);if(C)return clearTimeout(f),f=setTimeout(U,t),x(p)}return f===void 0&&(f=setTimeout(U,t)),c}return fe.cancel=$,fe.flush=ie,fe}YEe.exports=Wut});var KEe=G((JVt,VEe)=>{var Vut=WEe(),Kut=lF(),Jut="Expected a function";function zut(e,t,r){var s=!0,a=!0;if(typeof e!="function")throw new TypeError(Jut);return Kut(r)&&(s="leading"in r?!!r.leading:s,a="trailing"in r?!!r.trailing:a),Vut(e,t,{leading:s,maxWait:t,trailing:a})}VEe.exports=zut});var iq=G((zVt,nq)=>{"use strict";var vn=nq.exports;nq.exports.default=vn;var ei="\x1B[",_S="\x1B]",sw="\x07",cF=";",JEe=process.env.TERM_PROGRAM==="Apple_Terminal";vn.cursorTo=(e,t)=>{if(typeof e!="number")throw new TypeError("The `x` argument is required");return typeof t!="number"?ei+(e+1)+"G":ei+(t+1)+";"+(e+1)+"H"};vn.cursorMove=(e,t)=>{if(typeof e!="number")throw new TypeError("The `x` argument is required");let r="";return e<0?r+=ei+-e+"D":e>0&&(r+=ei+e+"C"),t<0?r+=ei+-t+"A":t>0&&(r+=ei+t+"B"),r};vn.cursorUp=(e=1)=>ei+e+"A";vn.cursorDown=(e=1)=>ei+e+"B";vn.cursorForward=(e=1)=>ei+e+"C";vn.cursorBackward=(e=1)=>ei+e+"D";vn.cursorLeft=ei+"G";vn.cursorSavePosition=JEe?"\x1B7":ei+"s";vn.cursorRestorePosition=JEe?"\x1B8":ei+"u";vn.cursorGetPosition=ei+"6n";vn.cursorNextLine=ei+"E";vn.cursorPrevLine=ei+"F";vn.cursorHide=ei+"?25l";vn.cursorShow=ei+"?25h";vn.eraseLines=e=>{let t="";for(let r=0;r[_S,"8",cF,cF,t,sw,e,_S,"8",cF,cF,sw].join("");vn.image=(e,t={})=>{let r=`${_S}1337;File=inline=1`;return t.width&&(r+=`;width=${t.width}`),t.height&&(r+=`;height=${t.height}`),t.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+e.toString("base64")+sw};vn.iTerm={setCwd:(e=process.cwd())=>`${_S}50;CurrentDir=${e}${sw}`,annotation:(e,t={})=>{let r=`${_S}1337;`,s=typeof t.x<"u",a=typeof t.y<"u";if((s||a)&&!(s&&a&&typeof t.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return e=e.replace(/\|/g,""),r+=t.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",t.length>0?r+=(s?[e,t.length,t.x,t.y]:[t.length,e]).join("|"):r+=e,r+sw}}});var ZEe=G((ZVt,sq)=>{"use strict";var zEe=(e,t)=>{for(let r of Reflect.ownKeys(t))Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r));return e};sq.exports=zEe;sq.exports.default=zEe});var $Ee=G((XVt,fF)=>{"use strict";var Zut=ZEe(),uF=new WeakMap,XEe=(e,t={})=>{if(typeof e!="function")throw new TypeError("Expected a function");let r,s=0,a=e.displayName||e.name||"",n=function(...c){if(uF.set(n,++s),s===1)r=e.apply(this,c),e=null;else if(t.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return Zut(n,e),uF.set(n,s),n};fF.exports=XEe;fF.exports.default=XEe;fF.exports.callCount=e=>{if(!uF.has(e))throw new Error(`The given function \`${e.name}\` is not wrapped by the \`onetime\` package`);return uF.get(e)}});var eIe=G(($Vt,AF)=>{AF.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&AF.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&AF.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var lq=G((e7t,lw)=>{var Ti=global.process,Lm=function(e){return e&&typeof e=="object"&&typeof e.removeListener=="function"&&typeof e.emit=="function"&&typeof e.reallyExit=="function"&&typeof e.listeners=="function"&&typeof e.kill=="function"&&typeof e.pid=="number"&&typeof e.on=="function"};Lm(Ti)?(tIe=Ce("assert"),ow=eIe(),rIe=/^win/i.test(Ti.platform),HS=Ce("events"),typeof HS!="function"&&(HS=HS.EventEmitter),Ti.__signal_exit_emitter__?to=Ti.__signal_exit_emitter__:(to=Ti.__signal_exit_emitter__=new HS,to.count=0,to.emitted={}),to.infinite||(to.setMaxListeners(1/0),to.infinite=!0),lw.exports=function(e,t){if(!Lm(global.process))return function(){};tIe.equal(typeof e,"function","a callback must be provided for exit handler"),aw===!1&&oq();var r="exit";t&&t.alwaysLast&&(r="afterexit");var s=function(){to.removeListener(r,e),to.listeners("exit").length===0&&to.listeners("afterexit").length===0&&pF()};return to.on(r,e),s},pF=function(){!aw||!Lm(global.process)||(aw=!1,ow.forEach(function(t){try{Ti.removeListener(t,hF[t])}catch{}}),Ti.emit=dF,Ti.reallyExit=aq,to.count-=1)},lw.exports.unload=pF,Mm=function(t,r,s){to.emitted[t]||(to.emitted[t]=!0,to.emit(t,r,s))},hF={},ow.forEach(function(e){hF[e]=function(){if(Lm(global.process)){var r=Ti.listeners(e);r.length===to.count&&(pF(),Mm("exit",null,e),Mm("afterexit",null,e),rIe&&e==="SIGHUP"&&(e="SIGINT"),Ti.kill(Ti.pid,e))}}}),lw.exports.signals=function(){return ow},aw=!1,oq=function(){aw||!Lm(global.process)||(aw=!0,to.count+=1,ow=ow.filter(function(t){try{return Ti.on(t,hF[t]),!0}catch{return!1}}),Ti.emit=iIe,Ti.reallyExit=nIe)},lw.exports.load=oq,aq=Ti.reallyExit,nIe=function(t){Lm(global.process)&&(Ti.exitCode=t||0,Mm("exit",Ti.exitCode,null),Mm("afterexit",Ti.exitCode,null),aq.call(Ti,Ti.exitCode))},dF=Ti.emit,iIe=function(t,r){if(t==="exit"&&Lm(global.process)){r!==void 0&&(Ti.exitCode=r);var s=dF.apply(this,arguments);return Mm("exit",Ti.exitCode,null),Mm("afterexit",Ti.exitCode,null),s}else return dF.apply(this,arguments)}):lw.exports=function(){return function(){}};var tIe,ow,rIe,HS,to,pF,Mm,hF,aw,oq,aq,nIe,dF,iIe});var oIe=G((t7t,sIe)=>{"use strict";var Xut=$Ee(),$ut=lq();sIe.exports=Xut(()=>{$ut(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var cq=G(cw=>{"use strict";var eft=oIe(),gF=!1;cw.show=(e=process.stderr)=>{e.isTTY&&(gF=!1,e.write("\x1B[?25h"))};cw.hide=(e=process.stderr)=>{e.isTTY&&(eft(),gF=!0,e.write("\x1B[?25l"))};cw.toggle=(e,t)=>{e!==void 0&&(gF=e),gF?cw.show(t):cw.hide(t)}});var uIe=G(jS=>{"use strict";var cIe=jS&&jS.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(jS,"__esModule",{value:!0});var aIe=cIe(iq()),lIe=cIe(cq()),tft=(e,{showCursor:t=!1}={})=>{let r=0,s="",a=!1,n=c=>{!t&&!a&&(lIe.default.hide(),a=!0);let f=c+` +`;f!==s&&(s=f,e.write(aIe.default.eraseLines(r)+f),r=f.split(` +`).length)};return n.clear=()=>{e.write(aIe.default.eraseLines(r)),s="",r=0},n.done=()=>{s="",r=0,t||(lIe.default.show(),a=!1)},n};jS.default={create:tft}});var fIe=G((i7t,rft)=>{rft.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:"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:"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:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{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_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{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"}}]});var hIe=G(ic=>{"use strict";var pIe=fIe(),pA=process.env;Object.defineProperty(ic,"_vendors",{value:pIe.map(function(e){return e.constant})});ic.name=null;ic.isPR=null;pIe.forEach(function(e){var t=Array.isArray(e.env)?e.env:[e.env],r=t.every(function(s){return AIe(s)});if(ic[e.constant]=r,r)switch(ic.name=e.name,typeof e.pr){case"string":ic.isPR=!!pA[e.pr];break;case"object":"env"in e.pr?ic.isPR=e.pr.env in pA&&pA[e.pr.env]!==e.pr.ne:"any"in e.pr?ic.isPR=e.pr.any.some(function(s){return!!pA[s]}):ic.isPR=AIe(e.pr);break;default:ic.isPR=null}});ic.isCI=!!(pA.CI||pA.CONTINUOUS_INTEGRATION||pA.BUILD_NUMBER||pA.RUN_ID||ic.name);function AIe(e){return typeof e=="string"?!!pA[e]:Object.keys(e).every(function(t){return pA[t]===e[t]})}});var gIe=G((o7t,dIe)=>{"use strict";dIe.exports=hIe().isCI});var yIe=G((a7t,mIe)=>{"use strict";var nft=e=>{let t=new Set;do for(let r of Reflect.ownKeys(e))t.add([e,r]);while((e=Reflect.getPrototypeOf(e))&&e!==Object.prototype);return t};mIe.exports=(e,{include:t,exclude:r}={})=>{let s=a=>{let n=c=>typeof c=="string"?a===c:c.test(a);return t?t.some(n):r?!r.some(n):!0};for(let[a,n]of nft(e.constructor.prototype)){if(n==="constructor"||!s(n))continue;let c=Reflect.getOwnPropertyDescriptor(a,n);c&&typeof c.value=="function"&&(e[n]=e[n].bind(e))}return e}});var vIe=G(zn=>{"use strict";var fw,YS,IF,gq;typeof performance=="object"&&typeof performance.now=="function"?(EIe=performance,zn.unstable_now=function(){return EIe.now()}):(uq=Date,IIe=uq.now(),zn.unstable_now=function(){return uq.now()-IIe});var EIe,uq,IIe;typeof window>"u"||typeof MessageChannel!="function"?(uw=null,fq=null,Aq=function(){if(uw!==null)try{var e=zn.unstable_now();uw(!0,e),uw=null}catch(t){throw setTimeout(Aq,0),t}},fw=function(e){uw!==null?setTimeout(fw,0,e):(uw=e,setTimeout(Aq,0))},YS=function(e,t){fq=setTimeout(e,t)},IF=function(){clearTimeout(fq)},zn.unstable_shouldYield=function(){return!1},gq=zn.unstable_forceFrameRate=function(){}):(CIe=window.setTimeout,wIe=window.clearTimeout,typeof console<"u"&&(BIe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof BIe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")),GS=!1,qS=null,mF=-1,pq=5,hq=0,zn.unstable_shouldYield=function(){return zn.unstable_now()>=hq},gq=function(){},zn.unstable_forceFrameRate=function(e){0>e||125>>1,a=e[s];if(a!==void 0&&0EF(c,r))p!==void 0&&0>EF(p,c)?(e[s]=p,e[f]=r,s=f):(e[s]=c,e[n]=r,s=n);else if(p!==void 0&&0>EF(p,r))e[s]=p,e[f]=r,s=f;else break e}}return t}return null}function EF(e,t){var r=e.sortIndex-t.sortIndex;return r!==0?r:e.id-t.id}var hA=[],$d=[],ift=1,qc=null,sa=3,wF=!1,Um=!1,WS=!1;function yq(e){for(var t=nf($d);t!==null;){if(t.callback===null)CF($d);else if(t.startTime<=e)CF($d),t.sortIndex=t.expirationTime,mq(hA,t);else break;t=nf($d)}}function Eq(e){if(WS=!1,yq(e),!Um)if(nf(hA)!==null)Um=!0,fw(Iq);else{var t=nf($d);t!==null&&YS(Eq,t.startTime-e)}}function Iq(e,t){Um=!1,WS&&(WS=!1,IF()),wF=!0;var r=sa;try{for(yq(t),qc=nf(hA);qc!==null&&(!(qc.expirationTime>t)||e&&!zn.unstable_shouldYield());){var s=qc.callback;if(typeof s=="function"){qc.callback=null,sa=qc.priorityLevel;var a=s(qc.expirationTime<=t);t=zn.unstable_now(),typeof a=="function"?qc.callback=a:qc===nf(hA)&&CF(hA),yq(t)}else CF(hA);qc=nf(hA)}if(qc!==null)var n=!0;else{var c=nf($d);c!==null&&YS(Eq,c.startTime-t),n=!1}return n}finally{qc=null,sa=r,wF=!1}}var sft=gq;zn.unstable_IdlePriority=5;zn.unstable_ImmediatePriority=1;zn.unstable_LowPriority=4;zn.unstable_NormalPriority=3;zn.unstable_Profiling=null;zn.unstable_UserBlockingPriority=2;zn.unstable_cancelCallback=function(e){e.callback=null};zn.unstable_continueExecution=function(){Um||wF||(Um=!0,fw(Iq))};zn.unstable_getCurrentPriorityLevel=function(){return sa};zn.unstable_getFirstCallbackNode=function(){return nf(hA)};zn.unstable_next=function(e){switch(sa){case 1:case 2:case 3:var t=3;break;default:t=sa}var r=sa;sa=t;try{return e()}finally{sa=r}};zn.unstable_pauseExecution=function(){};zn.unstable_requestPaint=sft;zn.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var r=sa;sa=e;try{return t()}finally{sa=r}};zn.unstable_scheduleCallback=function(e,t,r){var s=zn.unstable_now();switch(typeof r=="object"&&r!==null?(r=r.delay,r=typeof r=="number"&&0s?(e.sortIndex=r,mq($d,e),nf(hA)===null&&e===nf($d)&&(WS?IF():WS=!0,YS(Eq,r-s))):(e.sortIndex=a,mq(hA,e),Um||wF||(Um=!0,fw(Iq))),e};zn.unstable_wrapCallback=function(e){var t=sa;return function(){var r=sa;sa=t;try{return e.apply(this,arguments)}finally{sa=r}}}});var Cq=G((c7t,SIe)=>{"use strict";SIe.exports=vIe()});var bIe=G((u7t,VS)=>{VS.exports=function(t){var r={},s=V9(),a=dn(),n=Cq();function c(v){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+v,Q=1;Q_e||V[Be]!==ne[_e])return` +`+V[Be].replace(" at new "," at ");while(1<=Be&&0<=_e);break}}}finally{we=!1,Error.prepareStackTrace=Q}return(v=v?v.displayName||v.name:"")?cc(v):""}var uc=[],Oi=-1;function fo(v){return{current:v}}function Rt(v){0>Oi||(v.current=uc[Oi],uc[Oi]=null,Oi--)}function Tn(v,b){Oi++,uc[Oi]=v.current,v.current=b}var ha={},Gi=fo(ha),Li=fo(!1),Ya=ha;function yn(v,b){var Q=v.type.contextTypes;if(!Q)return ha;var j=v.stateNode;if(j&&j.__reactInternalMemoizedUnmaskedChildContext===b)return j.__reactInternalMemoizedMaskedChildContext;var V={},ne;for(ne in Q)V[ne]=b[ne];return j&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=b,v.__reactInternalMemoizedMaskedChildContext=V),V}function Xn(v){return v=v.childContextTypes,v!=null}function fu(){Rt(Li),Rt(Gi)}function Eh(v,b,Q){if(Gi.current!==ha)throw Error(c(168));Tn(Gi,b),Tn(Li,Q)}function Wa(v,b,Q){var j=v.stateNode;if(v=b.childContextTypes,typeof j.getChildContext!="function")return Q;j=j.getChildContext();for(var V in j)if(!(V in v))throw Error(c(108,d(b)||"Unknown",V));return s({},Q,j)}function Va(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||ha,Ya=Gi.current,Tn(Gi,v),Tn(Li,Li.current),!0}function Ka(v,b,Q){var j=v.stateNode;if(!j)throw Error(c(169));Q?(v=Wa(v,b,Ya),j.__reactInternalMemoizedMergedChildContext=v,Rt(Li),Rt(Gi),Tn(Gi,v)):Rt(Li),Tn(Li,Q)}var $e=null,Ja=null,mf=n.unstable_now;mf();var fc=0,Sn=8;function da(v){if(1&v)return Sn=15,1;if(2&v)return Sn=14,2;if(4&v)return Sn=13,4;var b=24&v;return b!==0?(Sn=12,b):v&32?(Sn=11,32):(b=192&v,b!==0?(Sn=10,b):v&256?(Sn=9,256):(b=3584&v,b!==0?(Sn=8,b):v&4096?(Sn=7,4096):(b=4186112&v,b!==0?(Sn=6,b):(b=62914560&v,b!==0?(Sn=5,b):v&67108864?(Sn=4,67108864):v&134217728?(Sn=3,134217728):(b=805306368&v,b!==0?(Sn=2,b):1073741824&v?(Sn=1,1073741824):(Sn=8,v))))))}function _A(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function HA(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(c(358,v))}}function ga(v,b){var Q=v.pendingLanes;if(Q===0)return Sn=0;var j=0,V=0,ne=v.expiredLanes,Be=v.suspendedLanes,_e=v.pingedLanes;if(ne!==0)j=ne,V=Sn=15;else if(ne=Q&134217727,ne!==0){var ht=ne&~Be;ht!==0?(j=da(ht),V=Sn):(_e&=ne,_e!==0&&(j=da(_e),V=Sn))}else ne=Q&~Be,ne!==0?(j=da(ne),V=Sn):_e!==0&&(j=da(_e),V=Sn);if(j===0)return 0;if(j=31-ss(j),j=Q&((0>j?0:1<Q;Q++)b.push(v);return b}function za(v,b,Q){v.pendingLanes|=b;var j=b-1;v.suspendedLanes&=j,v.pingedLanes&=j,v=v.eventTimes,b=31-ss(b),v[b]=Q}var ss=Math.clz32?Math.clz32:pc,Ac=Math.log,Au=Math.LN2;function pc(v){return v===0?32:31-(Ac(v)/Au|0)|0}var Za=n.unstable_runWithPriority,Mi=n.unstable_scheduleCallback,vs=n.unstable_cancelCallback,Tl=n.unstable_shouldYield,yf=n.unstable_requestPaint,hc=n.unstable_now,vi=n.unstable_getCurrentPriorityLevel,Fn=n.unstable_ImmediatePriority,dc=n.unstable_UserBlockingPriority,ze=n.unstable_NormalPriority,at=n.unstable_LowPriority,St=n.unstable_IdlePriority,lr={},te=yf!==void 0?yf:function(){},Ee=null,Oe=null,mt=!1,Et=hc(),Dt=1e4>Et?hc:function(){return hc()-Et};function tr(){switch(vi()){case Fn:return 99;case dc:return 98;case ze:return 97;case at:return 96;case St:return 95;default:throw Error(c(332))}}function pn(v){switch(v){case 99:return Fn;case 98:return dc;case 97:return ze;case 96:return at;case 95:return St;default:throw Error(c(332))}}function ui(v,b){return v=pn(v),Za(v,b)}function qi(v,b,Q){return v=pn(v),Mi(v,b,Q)}function Nn(){if(Oe!==null){var v=Oe;Oe=null,vs(v)}Xa()}function Xa(){if(!mt&&Ee!==null){mt=!0;var v=0;try{var b=Ee;ui(99,function(){for(;vOn?(jn=Tr,Tr=null):jn=Tr.sibling;var Zr=Xt(rt,Tr,gt[On],Zt);if(Zr===null){Tr===null&&(Tr=jn);break}v&&Tr&&Zr.alternate===null&&b(rt,Tr),Ye=ne(Zr,Ye,On),ri===null?br=Zr:ri.sibling=Zr,ri=Zr,Tr=jn}if(On===gt.length)return Q(rt,Tr),br;if(Tr===null){for(;OnOn?(jn=Tr,Tr=null):jn=Tr.sibling;var fi=Xt(rt,Tr,Zr.value,Zt);if(fi===null){Tr===null&&(Tr=jn);break}v&&Tr&&fi.alternate===null&&b(rt,Tr),Ye=ne(fi,Ye,On),ri===null?br=fi:ri.sibling=fi,ri=fi,Tr=jn}if(Zr.done)return Q(rt,Tr),br;if(Tr===null){for(;!Zr.done;On++,Zr=gt.next())Zr=Mr(rt,Zr.value,Zt),Zr!==null&&(Ye=ne(Zr,Ye,On),ri===null?br=Zr:ri.sibling=Zr,ri=Zr);return br}for(Tr=j(rt,Tr);!Zr.done;On++,Zr=gt.next())Zr=$n(Tr,rt,On,Zr.value,Zt),Zr!==null&&(v&&Zr.alternate!==null&&Tr.delete(Zr.key===null?On:Zr.key),Ye=ne(Zr,Ye,On),ri===null?br=Zr:ri.sibling=Zr,ri=Zr);return v&&Tr.forEach(function(Su){return b(rt,Su)}),br}return function(rt,Ye,gt,Zt){var br=typeof gt=="object"&>!==null&>.type===E&>.key===null;br&&(gt=gt.props.children);var ri=typeof gt=="object"&>!==null;if(ri)switch(gt.$$typeof){case p:e:{for(ri=gt.key,br=Ye;br!==null;){if(br.key===ri){switch(br.tag){case 7:if(gt.type===E){Q(rt,br.sibling),Ye=V(br,gt.props.children),Ye.return=rt,rt=Ye;break e}break;default:if(br.elementType===gt.type){Q(rt,br.sibling),Ye=V(br,gt.props),Ye.ref=yt(rt,br,gt),Ye.return=rt,rt=Ye;break e}}Q(rt,br);break}else b(rt,br);br=br.sibling}gt.type===E?(Ye=Rf(gt.props.children,rt.mode,Zt,gt.key),Ye.return=rt,rt=Ye):(Zt=o0(gt.type,gt.key,gt.props,null,rt.mode,Zt),Zt.ref=yt(rt,Ye,gt),Zt.return=rt,rt=Zt)}return Be(rt);case h:e:{for(br=gt.key;Ye!==null;){if(Ye.key===br)if(Ye.tag===4&&Ye.stateNode.containerInfo===gt.containerInfo&&Ye.stateNode.implementation===gt.implementation){Q(rt,Ye.sibling),Ye=V(Ye,gt.children||[]),Ye.return=rt,rt=Ye;break e}else{Q(rt,Ye);break}else b(rt,Ye);Ye=Ye.sibling}Ye=Mo(gt,rt.mode,Zt),Ye.return=rt,rt=Ye}return Be(rt)}if(typeof gt=="string"||typeof gt=="number")return gt=""+gt,Ye!==null&&Ye.tag===6?(Q(rt,Ye.sibling),Ye=V(Ye,gt),Ye.return=rt,rt=Ye):(Q(rt,Ye),Ye=S2(gt,rt.mode,Zt),Ye.return=rt,rt=Ye),Be(rt);if(If(gt))return Ei(rt,Ye,gt,Zt);if(ye(gt))return sl(rt,Ye,gt,Zt);if(ri&&hu(rt,gt),typeof gt>"u"&&!br)switch(rt.tag){case 1:case 22:case 0:case 11:case 15:throw Error(c(152,d(rt.type)||"Component"))}return Q(rt,Ye)}}var Ug=xy(!0),X1=xy(!1),Sh={},ur=fo(Sh),zi=fo(Sh),Cf=fo(Sh);function $a(v){if(v===Sh)throw Error(c(174));return v}function _g(v,b){Tn(Cf,b),Tn(zi,v),Tn(ur,Sh),v=it(b),Rt(ur),Tn(ur,v)}function du(){Rt(ur),Rt(zi),Rt(Cf)}function wf(v){var b=$a(Cf.current),Q=$a(ur.current);b=_(Q,v.type,b),Q!==b&&(Tn(zi,v),Tn(ur,b))}function Bt(v){zi.current===v&&(Rt(ur),Rt(zi))}var mi=fo(0);function WA(v){for(var b=v;b!==null;){if(b.tag===13){var Q=b.memoizedState;if(Q!==null&&(Q=Q.dehydrated,Q===null||gr(Q)||ko(Q)))return b}else if(b.tag===19&&b.memoizedProps.revealOrder!==void 0){if(b.flags&64)return b}else if(b.child!==null){b.child.return=b,b=b.child;continue}if(b===v)break;for(;b.sibling===null;){if(b.return===null||b.return===v)return null;b=b.return}b.sibling.return=b.return,b=b.sibling}return null}var el=null,ya=null,tl=!1;function Hg(v,b){var Q=il(5,null,null,0);Q.elementType="DELETED",Q.type="DELETED",Q.stateNode=b,Q.return=v,Q.flags=8,v.lastEffect!==null?(v.lastEffect.nextEffect=Q,v.lastEffect=Q):v.firstEffect=v.lastEffect=Q}function bh(v,b){switch(v.tag){case 5:return b=pa(b,v.type,v.pendingProps),b!==null?(v.stateNode=b,!0):!1;case 6:return b=LA(b,v.pendingProps),b!==null?(v.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function jg(v){if(tl){var b=ya;if(b){var Q=b;if(!bh(v,b)){if(b=qa(Q),!b||!bh(v,b)){v.flags=v.flags&-1025|2,tl=!1,el=v;return}Hg(el,Q)}el=v,ya=Ue(b)}else v.flags=v.flags&-1025|2,tl=!1,el=v}}function ky(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;el=v}function VA(v){if(!Z||v!==el)return!1;if(!tl)return ky(v),tl=!0,!1;var b=v.type;if(v.tag!==5||b!=="head"&&b!=="body"&&!ct(b,v.memoizedProps))for(b=ya;b;)Hg(v,b),b=qa(b);if(ky(v),v.tag===13){if(!Z)throw Error(c(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(c(317));ya=MA(v)}else ya=el?qa(v.stateNode):null;return!0}function Gg(){Z&&(ya=el=null,tl=!1)}var gu=[];function mu(){for(var v=0;vne))throw Error(c(301));ne+=1,xi=os=null,b.updateQueue=null,Bf.current=re,v=Q(j,V)}while(vf)}if(Bf.current=kt,b=os!==null&&os.next!==null,yu=0,xi=os=Yn=null,KA=!1,b)throw Error(c(300));return v}function as(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return xi===null?Yn.memoizedState=xi=v:xi=xi.next=v,xi}function Ol(){if(os===null){var v=Yn.alternate;v=v!==null?v.memoizedState:null}else v=os.next;var b=xi===null?Yn.memoizedState:xi.next;if(b!==null)xi=b,os=v;else{if(v===null)throw Error(c(310));os=v,v={memoizedState:os.memoizedState,baseState:os.baseState,baseQueue:os.baseQueue,queue:os.queue,next:null},xi===null?Yn.memoizedState=xi=v:xi=xi.next=v}return xi}function No(v,b){return typeof b=="function"?b(v):b}function Sf(v){var b=Ol(),Q=b.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var j=os,V=j.baseQueue,ne=Q.pending;if(ne!==null){if(V!==null){var Be=V.next;V.next=ne.next,ne.next=Be}j.baseQueue=V=ne,Q.pending=null}if(V!==null){V=V.next,j=j.baseState;var _e=Be=ne=null,ht=V;do{var Wt=ht.lane;if((yu&Wt)===Wt)_e!==null&&(_e=_e.next={lane:0,action:ht.action,eagerReducer:ht.eagerReducer,eagerState:ht.eagerState,next:null}),j=ht.eagerReducer===v?ht.eagerState:v(j,ht.action);else{var Sr={lane:Wt,action:ht.action,eagerReducer:ht.eagerReducer,eagerState:ht.eagerState,next:null};_e===null?(Be=_e=Sr,ne=j):_e=_e.next=Sr,Yn.lanes|=Wt,$g|=Wt}ht=ht.next}while(ht!==null&&ht!==V);_e===null?ne=j:_e.next=Be,Qo(j,b.memoizedState)||(Ke=!0),b.memoizedState=j,b.baseState=ne,b.baseQueue=_e,Q.lastRenderedState=j}return[b.memoizedState,Q.dispatch]}function bf(v){var b=Ol(),Q=b.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var j=Q.dispatch,V=Q.pending,ne=b.memoizedState;if(V!==null){Q.pending=null;var Be=V=V.next;do ne=v(ne,Be.action),Be=Be.next;while(Be!==V);Qo(ne,b.memoizedState)||(Ke=!0),b.memoizedState=ne,b.baseQueue===null&&(b.baseState=ne),Q.lastRenderedState=ne}return[ne,j]}function Ll(v,b,Q){var j=b._getVersion;j=j(b._source);var V=y?b._workInProgressVersionPrimary:b._workInProgressVersionSecondary;if(V!==null?v=V===j:(v=v.mutableReadLanes,(v=(yu&v)===v)&&(y?b._workInProgressVersionPrimary=j:b._workInProgressVersionSecondary=j,gu.push(b))),v)return Q(b._source);throw gu.push(b),Error(c(350))}function In(v,b,Q,j){var V=po;if(V===null)throw Error(c(349));var ne=b._getVersion,Be=ne(b._source),_e=Bf.current,ht=_e.useState(function(){return Ll(V,b,Q)}),Wt=ht[1],Sr=ht[0];ht=xi;var Mr=v.memoizedState,Xt=Mr.refs,$n=Xt.getSnapshot,Ei=Mr.source;Mr=Mr.subscribe;var sl=Yn;return v.memoizedState={refs:Xt,source:b,subscribe:j},_e.useEffect(function(){Xt.getSnapshot=Q,Xt.setSnapshot=Wt;var rt=ne(b._source);if(!Qo(Be,rt)){rt=Q(b._source),Qo(Sr,rt)||(Wt(rt),rt=Ds(sl),V.mutableReadLanes|=rt&V.pendingLanes),rt=V.mutableReadLanes,V.entangledLanes|=rt;for(var Ye=V.entanglements,gt=rt;0Q?98:Q,function(){v(!0)}),ui(97d2&&(b.flags|=64,V=!0,ep(j,!1),b.lanes=33554432)}else{if(!V)if(v=WA(ne),v!==null){if(b.flags|=64,V=!0,v=v.updateQueue,v!==null&&(b.updateQueue=v,b.flags|=4),ep(j,!0),j.tail===null&&j.tailMode==="hidden"&&!ne.alternate&&!tl)return b=b.lastEffect=j.lastEffect,b!==null&&(b.nextEffect=null),null}else 2*Dt()-j.renderingStartTime>d2&&Q!==1073741824&&(b.flags|=64,V=!0,ep(j,!1),b.lanes=33554432);j.isBackwards?(ne.sibling=b.child,b.child=ne):(v=j.last,v!==null?v.sibling=ne:b.child=ne,j.last=ne)}return j.tail!==null?(v=j.tail,j.rendering=v,j.tail=v.sibling,j.lastEffect=b.lastEffect,j.renderingStartTime=Dt(),v.sibling=null,b=mi.current,Tn(mi,V?b&1|2:b&1),v):null;case 23:case 24:return C2(),v!==null&&v.memoizedState!==null!=(b.memoizedState!==null)&&j.mode!=="unstable-defer-without-hiding"&&(b.flags|=4),null}throw Error(c(156,b.tag))}function OL(v){switch(v.tag){case 1:Xn(v.type)&&fu();var b=v.flags;return b&4096?(v.flags=b&-4097|64,v):null;case 3:if(du(),Rt(Li),Rt(Gi),mu(),b=v.flags,b&64)throw Error(c(285));return v.flags=b&-4097|64,v;case 5:return Bt(v),null;case 13:return Rt(mi),b=v.flags,b&4096?(v.flags=b&-4097|64,v):null;case 19:return Rt(mi),null;case 4:return du(),null;case 10:return Lg(v),null;case 23:case 24:return C2(),null;default:return null}}function Vg(v,b){try{var Q="",j=b;do Q+=Z1(j),j=j.return;while(j);var V=Q}catch(ne){V=` +Error generating stack: `+ne.message+` +`+ne.stack}return{value:v,source:b,stack:V}}function Kg(v,b){try{console.error(b.value)}catch(Q){setTimeout(function(){throw Q})}}var LL=typeof WeakMap=="function"?WeakMap:Map;function r2(v,b,Q){Q=Fl(-1,Q),Q.tag=3,Q.payload={element:null};var j=b.value;return Q.callback=function(){Wy||(Wy=!0,g2=j),Kg(v,b)},Q}function Jg(v,b,Q){Q=Fl(-1,Q),Q.tag=3;var j=v.type.getDerivedStateFromError;if(typeof j=="function"){var V=b.value;Q.payload=function(){return Kg(v,b),j(V)}}var ne=v.stateNode;return ne!==null&&typeof ne.componentDidCatch=="function"&&(Q.callback=function(){typeof j!="function"&&(mc===null?mc=new Set([this]):mc.add(this),Kg(v,b));var Be=b.stack;this.componentDidCatch(b.value,{componentStack:Be!==null?Be:""})}),Q}var ML=typeof WeakSet=="function"?WeakSet:Set;function n2(v){var b=v.ref;if(b!==null)if(typeof b=="function")try{b(null)}catch(Q){Tf(v,Q)}else b.current=null}function Ny(v,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.flags&256&&v!==null){var Q=v.memoizedProps,j=v.memoizedState;v=b.stateNode,b=v.getSnapshotBeforeUpdate(b.elementType===b.type?Q:To(b.type,Q),j),v.__reactInternalSnapshotBeforeUpdate=b}return;case 3:F&&b.flags&256&&Ns(b.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(c(163))}function Rh(v,b){if(b=b.updateQueue,b=b!==null?b.lastEffect:null,b!==null){var Q=b=b.next;do{if((Q.tag&v)===v){var j=Q.destroy;Q.destroy=void 0,j!==void 0&&j()}Q=Q.next}while(Q!==b)}}function gP(v,b,Q){switch(Q.tag){case 0:case 11:case 15:case 22:if(b=Q.updateQueue,b=b!==null?b.lastEffect:null,b!==null){v=b=b.next;do{if((v.tag&3)===3){var j=v.create;v.destroy=j()}v=v.next}while(v!==b)}if(b=Q.updateQueue,b=b!==null?b.lastEffect:null,b!==null){v=b=b.next;do{var V=v;j=V.next,V=V.tag,V&4&&V&1&&(kP(Q,v),KL(Q,v)),v=j}while(v!==b)}return;case 1:v=Q.stateNode,Q.flags&4&&(b===null?v.componentDidMount():(j=Q.elementType===Q.type?b.memoizedProps:To(Q.type,b.memoizedProps),v.componentDidUpdate(j,b.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),b=Q.updateQueue,b!==null&&Dy(Q,b,v);return;case 3:if(b=Q.updateQueue,b!==null){if(v=null,Q.child!==null)switch(Q.child.tag){case 5:v=ke(Q.child.stateNode);break;case 1:v=Q.child.stateNode}Dy(Q,b,v)}return;case 5:v=Q.stateNode,b===null&&Q.flags&4&&ao(v,Q.type,Q.memoizedProps,Q);return;case 6:return;case 4:return;case 12:return;case 13:Z&&Q.memoizedState===null&&(Q=Q.alternate,Q!==null&&(Q=Q.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null&&cu(Q))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(c(163))}function mP(v,b){if(F)for(var Q=v;;){if(Q.tag===5){var j=Q.stateNode;b?mh(j):co(Q.stateNode,Q.memoizedProps)}else if(Q.tag===6)j=Q.stateNode,b?yh(j):qn(j,Q.memoizedProps);else if((Q.tag!==23&&Q.tag!==24||Q.memoizedState===null||Q===v)&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===v)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===v)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}}function Oy(v,b){if(Ja&&typeof Ja.onCommitFiberUnmount=="function")try{Ja.onCommitFiberUnmount($e,b)}catch{}switch(b.tag){case 0:case 11:case 14:case 15:case 22:if(v=b.updateQueue,v!==null&&(v=v.lastEffect,v!==null)){var Q=v=v.next;do{var j=Q,V=j.destroy;if(j=j.tag,V!==void 0)if(j&4)kP(b,Q);else{j=b;try{V()}catch(ne){Tf(j,ne)}}Q=Q.next}while(Q!==v)}break;case 1:if(n2(b),v=b.stateNode,typeof v.componentWillUnmount=="function")try{v.props=b.memoizedProps,v.state=b.memoizedState,v.componentWillUnmount()}catch(ne){Tf(b,ne)}break;case 5:n2(b);break;case 4:F?CP(v,b):z&&z&&(b=b.stateNode.containerInfo,v=ou(b),NA(b,v))}}function yP(v,b){for(var Q=b;;)if(Oy(v,Q),Q.child===null||F&&Q.tag===4){if(Q===b)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===b)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}else Q.child.return=Q,Q=Q.child}function Ly(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function EP(v){return v.tag===5||v.tag===3||v.tag===4}function IP(v){if(F){e:{for(var b=v.return;b!==null;){if(EP(b))break e;b=b.return}throw Error(c(160))}var Q=b;switch(b=Q.stateNode,Q.tag){case 5:var j=!1;break;case 3:b=b.containerInfo,j=!0;break;case 4:b=b.containerInfo,j=!0;break;default:throw Error(c(161))}Q.flags&16&&(df(b),Q.flags&=-17);e:t:for(Q=v;;){for(;Q.sibling===null;){if(Q.return===null||EP(Q.return)){Q=null;break e}Q=Q.return}for(Q.sibling.return=Q.return,Q=Q.sibling;Q.tag!==5&&Q.tag!==6&&Q.tag!==18;){if(Q.flags&2||Q.child===null||Q.tag===4)continue t;Q.child.return=Q,Q=Q.child}if(!(Q.flags&2)){Q=Q.stateNode;break e}}j?i2(v,Q,b):s2(v,Q,b)}}function i2(v,b,Q){var j=v.tag,V=j===5||j===6;if(V)v=V?v.stateNode:v.stateNode.instance,b?lo(Q,v,b):Do(Q,v);else if(j!==4&&(v=v.child,v!==null))for(i2(v,b,Q),v=v.sibling;v!==null;)i2(v,b,Q),v=v.sibling}function s2(v,b,Q){var j=v.tag,V=j===5||j===6;if(V)v=V?v.stateNode:v.stateNode.instance,b?ji(Q,v,b):ci(Q,v);else if(j!==4&&(v=v.child,v!==null))for(s2(v,b,Q),v=v.sibling;v!==null;)s2(v,b,Q),v=v.sibling}function CP(v,b){for(var Q=b,j=!1,V,ne;;){if(!j){j=Q.return;e:for(;;){if(j===null)throw Error(c(160));switch(V=j.stateNode,j.tag){case 5:ne=!1;break e;case 3:V=V.containerInfo,ne=!0;break e;case 4:V=V.containerInfo,ne=!0;break e}j=j.return}j=!0}if(Q.tag===5||Q.tag===6)yP(v,Q),ne?FA(V,Q.stateNode):xo(V,Q.stateNode);else if(Q.tag===4){if(Q.child!==null){V=Q.stateNode.containerInfo,ne=!0,Q.child.return=Q,Q=Q.child;continue}}else if(Oy(v,Q),Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===b)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===b)return;Q=Q.return,Q.tag===4&&(j=!1)}Q.sibling.return=Q.return,Q=Q.sibling}}function o2(v,b){if(F){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Rh(3,b);return;case 1:return;case 5:var Q=b.stateNode;if(Q!=null){var j=b.memoizedProps;v=v!==null?v.memoizedProps:j;var V=b.type,ne=b.updateQueue;b.updateQueue=null,ne!==null&&Po(Q,ne,V,v,j,b)}return;case 6:if(b.stateNode===null)throw Error(c(162));Q=b.memoizedProps,is(b.stateNode,v!==null?v.memoizedProps:Q,Q);return;case 3:Z&&(b=b.stateNode,b.hydrate&&(b.hydrate=!1,UA(b.containerInfo)));return;case 12:return;case 13:wP(b),zg(b);return;case 19:zg(b);return;case 17:return;case 23:case 24:mP(b,b.memoizedState!==null);return}throw Error(c(163))}switch(b.tag){case 0:case 11:case 14:case 15:case 22:Rh(3,b);return;case 12:return;case 13:wP(b),zg(b);return;case 19:zg(b);return;case 3:Z&&(Q=b.stateNode,Q.hydrate&&(Q.hydrate=!1,UA(Q.containerInfo)));break;case 23:case 24:return}e:if(z){switch(b.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:b=b.stateNode,NA(b.containerInfo,b.pendingChildren);break e}throw Error(c(163))}}function wP(v){v.memoizedState!==null&&(h2=Dt(),F&&mP(v.child,!0))}function zg(v){var b=v.updateQueue;if(b!==null){v.updateQueue=null;var Q=v.stateNode;Q===null&&(Q=v.stateNode=new ML),b.forEach(function(j){var V=zL.bind(null,v,j);Q.has(j)||(Q.add(j),j.then(V,V))})}}function UL(v,b){return v!==null&&(v=v.memoizedState,v===null||v.dehydrated!==null)?(b=b.memoizedState,b!==null&&b.dehydrated===null):!1}var My=0,Uy=1,_y=2,Zg=3,Hy=4;if(typeof Symbol=="function"&&Symbol.for){var Xg=Symbol.for;My=Xg("selector.component"),Uy=Xg("selector.has_pseudo_class"),_y=Xg("selector.role"),Zg=Xg("selector.test_id"),Hy=Xg("selector.text")}function jy(v){var b=ee(v);if(b!=null){if(typeof b.memoizedProps["data-testname"]!="string")throw Error(c(364));return b}if(v=ir(v),v===null)throw Error(c(362));return v.stateNode.current}function Pf(v,b){switch(b.$$typeof){case My:if(v.type===b.value)return!0;break;case Uy:e:{b=b.value,v=[v,0];for(var Q=0;Q";case Uy:return":has("+(xf(v)||"")+")";case _y:return'[role="'+v.value+'"]';case Hy:return'"'+v.value+'"';case Zg:return'[data-testname="'+v.value+'"]';default:throw Error(c(365,v))}}function a2(v,b){var Q=[];v=[v,0];for(var j=0;jV&&(V=Be),Q&=~ne}if(Q=V,Q=Dt()-Q,Q=(120>Q?120:480>Q?480:1080>Q?1080:1920>Q?1920:3e3>Q?3e3:4320>Q?4320:1960*HL(Q/1960))-Q,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}bs!==5&&(bs=2),ht=Vg(ht,_e),Xt=Be;do{switch(Xt.tag){case 3:ne=ht,Xt.flags|=4096,b&=-b,Xt.lanes|=b;var ri=r2(Xt,ne,b);by(Xt,ri);break e;case 1:ne=ht;var Tr=Xt.type,On=Xt.stateNode;if(!(Xt.flags&64)&&(typeof Tr.getDerivedStateFromError=="function"||On!==null&&typeof On.componentDidCatch=="function"&&(mc===null||!mc.has(On)))){Xt.flags|=4096,b&=-b,Xt.lanes|=b;var jn=Jg(Xt,ne,b);by(Xt,jn);break e}}Xt=Xt.return}while(Xt!==null)}xP(Q)}catch(Zr){b=Zr,Zi===Q&&Q!==null&&(Zi=Q=Q.return);continue}break}while(!0)}function DP(){var v=qy.current;return qy.current=kt,v===null?kt:v}function s0(v,b){var Q=xr;xr|=16;var j=DP();po===v&&Ms===b||Lh(v,b);do try{qL();break}catch(V){bP(v,V)}while(!0);if(Ng(),xr=Q,qy.current=j,Zi!==null)throw Error(c(261));return po=null,Ms=0,bs}function qL(){for(;Zi!==null;)PP(Zi)}function YL(){for(;Zi!==null&&!Tl();)PP(Zi)}function PP(v){var b=RP(v.alternate,v,tp);v.memoizedProps=v.pendingProps,b===null?xP(v):Zi=b,c2.current=null}function xP(v){var b=v;do{var Q=b.alternate;if(v=b.return,b.flags&2048){if(Q=OL(b),Q!==null){Q.flags&=2047,Zi=Q;return}v!==null&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}else{if(Q=NL(Q,b,tp),Q!==null){Zi=Q;return}if(Q=b,Q.tag!==24&&Q.tag!==23||Q.memoizedState===null||tp&1073741824||!(Q.mode&4)){for(var j=0,V=Q.child;V!==null;)j|=V.lanes|V.childLanes,V=V.sibling;Q.childLanes=j}v!==null&&!(v.flags&2048)&&(v.firstEffect===null&&(v.firstEffect=b.firstEffect),b.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=b.firstEffect),v.lastEffect=b.lastEffect),1Dt()-h2?Lh(v,0):A2|=Q),Ca(v,b)}function zL(v,b){var Q=v.stateNode;Q!==null&&Q.delete(b),b=0,b===0&&(b=v.mode,b&2?b&4?(wu===0&&(wu=Fh),b=Rn(62914560&~wu),b===0&&(b=4194304)):b=tr()===99?1:2:b=1),Q=Lo(),v=Jy(v,b),v!==null&&(za(v,b,Q),Ca(v,Q))}var RP;RP=function(v,b,Q){var j=b.lanes;if(v!==null)if(v.memoizedProps!==b.pendingProps||Li.current)Ke=!0;else if(Q&j)Ke=!!(v.flags&16384);else{switch(Ke=!1,b.tag){case 3:Ry(b),Gg();break;case 5:wf(b);break;case 1:Xn(b.type)&&Va(b);break;case 4:_g(b,b.stateNode.containerInfo);break;case 10:Og(b,b.memoizedProps.value);break;case 13:if(b.memoizedState!==null)return Q&b.child.childLanes?e2(v,b,Q):(Tn(mi,mi.current&1),b=Wn(v,b,Q),b!==null?b.sibling:null);Tn(mi,mi.current&1);break;case 19:if(j=(Q&b.childLanes)!==0,v.flags&64){if(j)return dP(v,b,Q);b.flags|=64}var V=b.memoizedState;if(V!==null&&(V.rendering=null,V.tail=null,V.lastEffect=null),Tn(mi,mi.current),j)break;return null;case 23:case 24:return b.lanes=0,yi(v,b,Q)}return Wn(v,b,Q)}else Ke=!1;switch(b.lanes=0,b.tag){case 2:if(j=b.type,v!==null&&(v.alternate=null,b.alternate=null,b.flags|=2),v=b.pendingProps,V=yn(b,Gi.current),Ef(b,Q),V=Yg(null,b,j,v,V,Q),b.flags|=1,typeof V=="object"&&V!==null&&typeof V.render=="function"&&V.$$typeof===void 0){if(b.tag=1,b.memoizedState=null,b.updateQueue=null,Xn(j)){var ne=!0;Va(b)}else ne=!1;b.memoizedState=V.state!==null&&V.state!==void 0?V.state:null,vh(b);var Be=j.getDerivedStateFromProps;typeof Be=="function"&&GA(b,j,Be,v),V.updater=qA,b.stateNode=V,V._reactInternals=b,Fo(b,j,v,Q),b=$1(null,b,j,!0,ne,Q)}else b.tag=0,pt(null,b,V,Q),b=b.child;return b;case 16:V=b.elementType;e:{switch(v!==null&&(v.alternate=null,b.alternate=null,b.flags|=2),v=b.pendingProps,ne=V._init,V=ne(V._payload),b.type=V,ne=b.tag=XL(V),v=To(V,v),ne){case 0:b=ZA(null,b,V,v,Q);break e;case 1:b=hP(null,b,V,v,Q);break e;case 11:b=mr(null,b,V,v,Q);break e;case 14:b=vr(null,b,V,To(V.type,v),j,Q);break e}throw Error(c(306,V,""))}return b;case 0:return j=b.type,V=b.pendingProps,V=b.elementType===j?V:To(j,V),ZA(v,b,j,V,Q);case 1:return j=b.type,V=b.pendingProps,V=b.elementType===j?V:To(j,V),hP(v,b,j,V,Q);case 3:if(Ry(b),j=b.updateQueue,v===null||j===null)throw Error(c(282));if(j=b.pendingProps,V=b.memoizedState,V=V!==null?V.element:null,Mg(v,b),jA(b,j,null,Q),j=b.memoizedState.element,j===V)Gg(),b=Wn(v,b,Q);else{if(V=b.stateNode,(ne=V.hydrate)&&(Z?(ya=Ue(b.stateNode.containerInfo),el=b,ne=tl=!0):ne=!1),ne){if(Z&&(v=V.mutableSourceEagerHydrationData,v!=null))for(V=0;V=Wt&&ne>=Mr&&V<=Sr&&Be<=Xt){v.splice(b,1);break}else if(j!==Wt||Q.width!==ht.width||XtBe){if(!(ne!==Mr||Q.height!==ht.height||SrV)){Wt>j&&(ht.width+=Wt-j,ht.x=j),Srne&&(ht.height+=Mr-ne,ht.y=ne),XtQ&&(Q=Be)),Be ")+` + +No matching component was found for: + `)+v.join(" > ")}return null},r.getPublicRootInstance=function(v){if(v=v.current,!v.child)return null;switch(v.child.tag){case 5:return ke(v.child.stateNode);default:return v.child.stateNode}},r.injectIntoDevTools=function(v){if(v={bundleType:v.bundleType,version:v.version,rendererPackageName:v.rendererPackageName,rendererConfig:v.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:f.ReactCurrentDispatcher,findHostInstanceByFiber:eM,findFiberByHostInstance:v.findFiberByHostInstance||tM,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")v=!1;else{var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!b.isDisabled&&b.supportsFiber)try{$e=b.inject(v),Ja=b}catch{}v=!0}return v},r.observeVisibleRects=function(v,b,Q,j){if(!Yt)throw Error(c(363));v=l2(v,b);var V=on(v,Q,j).disconnect;return{disconnect:function(){V()}}},r.registerMutableSourceForHydration=function(v,b){var Q=b._getVersion;Q=Q(b._source),v.mutableSourceEagerHydrationData==null?v.mutableSourceEagerHydrationData=[b,Q]:v.mutableSourceEagerHydrationData.push(b,Q)},r.runWithPriority=function(v,b){var Q=fc;try{return fc=v,b()}finally{fc=Q}},r.shouldSuspend=function(){return!1},r.unbatchedUpdates=function(v,b){var Q=xr;xr&=-2,xr|=8;try{return v(b)}finally{xr=Q,xr===0&&(kf(),Nn())}},r.updateContainer=function(v,b,Q,j){var V=b.current,ne=Lo(),Be=Ds(V);e:if(Q){Q=Q._reactInternals;t:{if(ve(Q)!==Q||Q.tag!==1)throw Error(c(170));var _e=Q;do{switch(_e.tag){case 3:_e=_e.stateNode.context;break t;case 1:if(Xn(_e.type)){_e=_e.stateNode.__reactInternalMemoizedMergedChildContext;break t}}_e=_e.return}while(_e!==null);throw Error(c(171))}if(Q.tag===1){var ht=Q.type;if(Xn(ht)){Q=Wa(Q,ht,_e);break e}}Q=_e}else Q=ha;return b.context===null?b.context=Q:b.pendingContext=Q,b=Fl(ne,Be),b.payload={element:v},j=j===void 0?null:j,j!==null&&(b.callback=j),Nl(V,b),_l(V,Be,ne),Be},r}});var PIe=G((f7t,DIe)=>{"use strict";DIe.exports=bIe()});var kIe=G((A7t,xIe)=>{"use strict";var oft={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};xIe.exports=oft});var FIe=G((p7t,RIe)=>{"use strict";var aft=Object.assign||function(e){for(var t=1;t"}}]),e}(),QIe=function(){BF(e,null,[{key:"fromJS",value:function(r){var s=r.width,a=r.height;return new e(s,a)}}]);function e(t,r){Bq(this,e),this.width=t,this.height=r}return BF(e,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),e}(),TIe=function(){function e(t,r){Bq(this,e),this.unit=t,this.value=r}return BF(e,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case sf.UNIT_POINT:return String(this.value);case sf.UNIT_PERCENT:return this.value+"%";case sf.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),e}();RIe.exports=function(e,t){function r(c,f,p){var h=c[f];c[f]=function(){for(var E=arguments.length,C=Array(E),S=0;S1?C-1:0),x=1;x1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:sf.DIRECTION_LTR;return c.call(this,f,p,h)}),aft({Config:t.Config,Node:t.Node,Layout:e("Layout",lft),Size:e("Size",QIe),Value:e("Value",TIe),getInstanceCount:function(){return t.getInstanceCount.apply(t,arguments)}},sf)}});var NIe=G((exports,module)=>{(function(e,t){typeof define=="function"&&define.amd?define([],function(){return t}):typeof module=="object"&&module.exports?module.exports=t:(e.nbind=e.nbind||{}).init=t})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(e,t){return function(){e&&e.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){t(r);return}t(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof Ce=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(t,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),t=nodePath.normalize(t);var s=nodeFS.readFileSync(t);return r?s:s.toString()},Module.readBinary=function(t){var r=Module.read(t,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(t){globalEval(read(t))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(t){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(t));var r=read(t,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(e,t){quit(e)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(t){var r=new XMLHttpRequest;return r.open("GET",t,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(t){var r=new XMLHttpRequest;return r.open("GET",t,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(t,r,s){var a=new XMLHttpRequest;a.open("GET",t,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):s()},a.onerror=s,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(t){console.log(t)}),Module.printErr||(Module.printErr=function(t){console.warn(t)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(e){dump(e)}:function(e){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(e){document.title=e})}else throw"Unknown runtime environment. Where are we?";function globalEval(e){eval.call(null,e)}!Module.load&&Module.read&&(Module.load=function(t){globalEval(Module.read(t))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(e,t){throw t}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(e){return tempRet0=e,e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(e[e.length-1]==="*")return Runtime.QUANTUM_SIZE;if(e[0]==="i"){var t=parseInt(e.substr(1));return assert(t%8===0),t/8}else return 0}}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(e,t){return t==="double"||t==="i64"?e&7&&(assert((e&7)===4),e+=4):assert((e&3)===0),e},getAlignSize:function(e,t,r){return!r&&(e=="i64"||e=="double")?8:e?Math.min(t||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(t,8)},dynCall:function(e,t,r){return r&&r.length?Module["dynCall_"+e].apply(null,[t].concat(r)):Module["dynCall_"+e].call(null,t)},functionPointers:[],addFunction:function(e){for(var t=0;t>2],r=(t+e+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var s=enlargeMemory();if(!s)return HEAP32[DYNAMICTOP_PTR>>2]=t,0}return t},alignMemory:function(e,t){var r=e=Math.ceil(e/(t||16))*(t||16);return r},makeBigInt:function(e,t,r){var s=r?+(e>>>0)+ +(t>>>0)*4294967296:+(e>>>0)+ +(t|0)*4294967296;return s},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(e,t){e||abort("Assertion failed: "+t)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var t=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,t),t},stringToC:function(e){var t=0;if(e!=null&&e!==0){var r=(e.length<<2)+1;t=Runtime.stackAlloc(r),stringToUTF8(e,t,r)}return t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(t,r,s,a,n){var c=getCFunc(t),f=[],p=0;if(a)for(var h=0;h>0]=t;break;case"i8":HEAP8[e>>0]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":tempI64=[t>>>0,(tempDouble=t,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(e,t,r){switch(t=t||"i8",t.charAt(t.length-1)==="*"&&(t="i32"),t){case"i1":return HEAP8[e>>0];case"i8":return HEAP8[e>>0];case"i16":return HEAP16[e>>1];case"i32":return HEAP32[e>>2];case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+t)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(e,t,r,s){var a,n;typeof e=="number"?(a=!0,n=e):(a=!1,n=e.length);var c=typeof t=="string"?t:null,f;if(r==ALLOC_NONE?f=s:f=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,c?1:t.length)),a){var s=f,p;for(assert((f&3)==0),p=f+(n&-4);s>2]=0;for(p=f+n;s>0]=0;return f}if(c==="i8")return e.subarray||e.slice?HEAPU8.set(e,f):HEAPU8.set(new Uint8Array(e),f),f;for(var h=0,E,C,S;h>0],r|=s,!(s==0&&!t||(a++,t&&a==t)););t||(t=a);var n="";if(r<128){for(var c=1024,f;t>0;)f=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(t,c))),n=n?n+f:f,e+=c,t-=c;return n}return Module.UTF8ToString(e)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(e){for(var t="";;){var r=HEAP8[e++>>0];if(!r)return t;t+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(e,t){return writeAsciiToMemory(e,t,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(e,t){for(var r=t;e[r];)++r;if(r-t>16&&e.subarray&&UTF8Decoder)return UTF8Decoder.decode(e.subarray(t,r));for(var s,a,n,c,f,p,h="";;){if(s=e[t++],!s)return h;if(!(s&128)){h+=String.fromCharCode(s);continue}if(a=e[t++]&63,(s&224)==192){h+=String.fromCharCode((s&31)<<6|a);continue}if(n=e[t++]&63,(s&240)==224?s=(s&15)<<12|a<<6|n:(c=e[t++]&63,(s&248)==240?s=(s&7)<<18|a<<12|n<<6|c:(f=e[t++]&63,(s&252)==248?s=(s&3)<<24|a<<18|n<<12|c<<6|f:(p=e[t++]&63,s=(s&1)<<30|a<<24|n<<18|c<<12|f<<6|p))),s<65536)h+=String.fromCharCode(s);else{var E=s-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(e){return UTF8ArrayToString(HEAPU8,e)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(e,t,r,s){if(!(s>0))return 0;for(var a=r,n=r+s-1,c=0;c=55296&&f<=57343&&(f=65536+((f&1023)<<10)|e.charCodeAt(++c)&1023),f<=127){if(r>=n)break;t[r++]=f}else if(f<=2047){if(r+1>=n)break;t[r++]=192|f>>6,t[r++]=128|f&63}else if(f<=65535){if(r+2>=n)break;t[r++]=224|f>>12,t[r++]=128|f>>6&63,t[r++]=128|f&63}else if(f<=2097151){if(r+3>=n)break;t[r++]=240|f>>18,t[r++]=128|f>>12&63,t[r++]=128|f>>6&63,t[r++]=128|f&63}else if(f<=67108863){if(r+4>=n)break;t[r++]=248|f>>24,t[r++]=128|f>>18&63,t[r++]=128|f>>12&63,t[r++]=128|f>>6&63,t[r++]=128|f&63}else{if(r+5>=n)break;t[r++]=252|f>>30,t[r++]=128|f>>24&63,t[r++]=128|f>>18&63,t[r++]=128|f>>12&63,t[r++]=128|f>>6&63,t[r++]=128|f&63}}return t[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(e,t,r){return stringToUTF8Array(e,HEAPU8,t,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(e){for(var t=0,r=0;r=55296&&s<=57343&&(s=65536+((s&1023)<<10)|e.charCodeAt(++r)&1023),s<=127?++t:s<=2047?t+=2:s<=65535?t+=3:s<=2097151?t+=4:s<=67108863?t+=5:t+=6}return t}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(e){var t=Module.___cxa_demangle||Module.__cxa_demangle;if(t){try{var r=e.substr(1),s=lengthBytesUTF8(r)+1,a=_malloc(s);stringToUTF8(r,a,s);var n=_malloc(4),c=t(a,0,0,n);if(getValue(n,"i32")===0&&c)return Pointer_stringify(c)}catch{}finally{a&&_free(a),n&&_free(n),c&&_free(c)}return e}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),e}function demangleAll(e){var t=/__Z[\w\d_]+/g;return e.replace(t,function(r){var s=demangle(r);return r===s?r:r+" ["+s+"]"})}function jsStackTrace(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function stackTrace(){var e=jsStackTrace();return Module.extraStackTrace&&(e+=` +`+Module.extraStackTrace()),demangleAll(e)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var t=e.shift();if(typeof t=="function"){t();continue}var r=t.func;typeof r=="number"?t.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,t.arg):r(t.arg===void 0?null:t.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}Module.addOnPreRun=addOnPreRun;function addOnInit(e){__ATINIT__.unshift(e)}Module.addOnInit=addOnInit;function addOnPreMain(e){__ATMAIN__.unshift(e)}Module.addOnPreMain=addOnPreMain;function addOnExit(e){__ATEXIT__.unshift(e)}Module.addOnExit=addOnExit;function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(e,t,r){var s=r>0?r:lengthBytesUTF8(e)+1,a=new Array(s),n=stringToUTF8Array(e,a,0,a.length);return t&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(e){for(var t=[],r=0;r255&&(s&=255),t.push(String.fromCharCode(s))}return t.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(e,t,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var s,a;r&&(a=t+lengthBytesUTF8(e),s=HEAP8[a]),stringToUTF8(e,t,1/0),r&&(HEAP8[a]=s)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(e,t){HEAP8.set(e,t)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(e,t,r){for(var s=0;s>0]=e.charCodeAt(s);r||(HEAP8[t>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function e(t,r){var s=t>>>16,a=t&65535,n=r>>>16,c=r&65535;return a*c+(s*c+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(e){return froundBuffer[0]=e,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(e){e=e>>>0;for(var t=0;t<32;t++)if(e&1<<31-t)return t;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(e){return e}function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var t=dependenciesFulfilled;dependenciesFulfilled=null,t()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(e,t,r,s,a,n,c,f){return _nbind.callbackSignatureList[e].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(e,t,r,s,a,n,c,f){return ASM_CONSTS[e](t,r,s,a,n,c,f)}function _emscripten_asm_const_iiiii(e,t,r,s,a){return ASM_CONSTS[e](t,r,s,a)}function _emscripten_asm_const_iiidddddd(e,t,r,s,a,n,c,f,p){return ASM_CONSTS[e](t,r,s,a,n,c,f,p)}function _emscripten_asm_const_iiididi(e,t,r,s,a,n,c){return ASM_CONSTS[e](t,r,s,a,n,c)}function _emscripten_asm_const_iiii(e,t,r,s){return ASM_CONSTS[e](t,r,s)}function _emscripten_asm_const_iiiid(e,t,r,s,a){return ASM_CONSTS[e](t,r,s,a)}function _emscripten_asm_const_iiiiii(e,t,r,s,a,n){return ASM_CONSTS[e](t,r,s,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(e,t){__ATEXIT__.unshift({func:e,arg:t})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(e,t,r,s){var a=arguments.length,n=a<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,r):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(e,t,r,s);else for(var f=e.length-1;f>=0;f--)(c=e[f])&&(n=(a<3?c(n):a>3?c(t,r,n):c(t,r))||n);return a>3&&n&&Object.defineProperty(t,r,n),n}function _defineHidden(e){return function(t,r){Object.defineProperty(t,r,{configurable:!1,enumerable:!1,value:e,writable:!0})}}var _nbind={};function __nbind_free_external(e){_nbind.externalList[e].dereference(e)}function __nbind_reference_external(e){_nbind.externalList[e].reference()}function _llvm_stackrestore(e){var t=_llvm_stacksave,r=t.LLVM_SAVEDSTACKS[e];t.LLVM_SAVEDSTACKS.splice(e,1),Runtime.stackRestore(r)}function __nbind_register_pool(e,t,r,s){_nbind.Pool.pageSize=e,_nbind.Pool.usedPtr=t/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=s/4,HEAP32[t/4]=16909060,HEAP8[t]==1&&(_nbind.bigEndian=!0),HEAP32[t/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(e,t){if(Browser.mainLoop.timingMode=e,Browser.mainLoop.timingValue=t,!Browser.mainLoop.func)return 1;if(e==0)Browser.mainLoop.scheduler=function(){var c=Math.max(0,Browser.mainLoop.tickStartTime+t-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,c)},Browser.mainLoop.method="timeout";else if(e==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(e==2){if(!window.setImmediate){let n=function(c){c.source===window&&c.data===s&&(c.stopPropagation(),r.shift()())};var a=n,r=[],s="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(f){r.push(f),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(f),window.postMessage({target:s})):window.postMessage(s,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(e,t,r,s,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=e,Browser.mainLoop.arg=s;var n;typeof s<"u"?n=function(){Module.dynCall_vi(e,s)}:n=function(){Module.dynCall_v(e)};var c=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,C=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=C:(C=C+.5,Browser.mainLoop.remainingBlockers=(8*E+C)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),c1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(c0?_emscripten_set_main_loop_timing(0,1e3/t):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var e=Browser.mainLoop.timingMode,t=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(e,t),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var e=Module.statusMessage||"Please wait...",t=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;t?t"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var e={};e.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},e.handle=function(n,c,f,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(c)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(c)}))}catch(x){Runtime.warnOnce("Blob constructor present but fails: "+x+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var C=Browser.URLObject.createObjectURL(h),S=new Image;S.onload=function(){assert(S.complete,"Image "+c+" could not be decoded");var I=document.createElement("canvas");I.width=S.width,I.height=S.height;var R=I.getContext("2d");R.drawImage(S,0,0),Module.preloadedImages[c]=I,Browser.URLObject.revokeObjectURL(C),f&&f(n)},S.onerror=function(I){console.log("Image "+C+" could not be decoded"),p&&p()},S.src=C},Module.preloadPlugins.push(e);var t={};t.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},t.handle=function(n,c,f,p){var h=!1;function E(R){h||(h=!0,Module.preloadedAudios[c]=R,f&&f(n))}function C(){h||(h=!0,Module.preloadedAudios[c]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var S=new Blob([n],{type:Browser.getMimetype(c)})}catch{return C()}var x=Browser.URLObject.createObjectURL(S),I=new Audio;I.addEventListener("canplaythrough",function(){E(I)},!1),I.onerror=function(N){if(h)return;console.log("warning: browser could not fully decode audio "+c+", trying slower base64 approach");function U(K){for(var $="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ie="=",fe="",le=0,ge=0,pe=0;pe=6;){var De=le>>ge-6&63;ge-=6,fe+=$[De]}return ge==2?(fe+=$[(le&3)<<4],fe+=ie+ie):ge==4&&(fe+=$[(le&15)<<2],fe+=ie),fe}I.src="data:audio/x-"+c.substr(-3)+";base64,"+U(n),E(I)},I.src=x,Browser.safeSetTimeout(function(){E(I)},1e4)}else return C()},Module.preloadPlugins.push(t);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var s=Module.canvas;s&&(s.requestPointerLock=s.requestPointerLock||s.mozRequestPointerLock||s.webkitRequestPointerLock||s.msRequestPointerLock||function(){},s.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},s.exitPointerLock=s.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&s.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(e,t,r,s){if(t&&Module.ctx&&e==Module.canvas)return Module.ctx;var a,n;if(t){var c={antialias:!1,alpha:!1};if(s)for(var f in s)c[f]=s[f];n=GL.createContext(e,c),n&&(a=GL.getContext(n).GLctx)}else a=e.getContext("2d");return a?(r&&(t||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,t&&GL.makeContextCurrent(n),Module.useWebGL=t,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(e,t,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(e,t,r){Browser.lockPointer=e,Browser.resizeCanvas=t,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var s=Module.canvas;function a(){Browser.isFullscreen=!1;var c=s.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===c?(s.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},s.exitFullscreen=s.exitFullscreen.bind(document),Browser.lockPointer&&s.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(c.parentNode.insertBefore(s,c),c.parentNode.removeChild(c),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(s)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");s.parentNode.insertBefore(n,s),n.appendChild(s),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(e,t,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(s,a,n){return Browser.requestFullscreen(s,a,n)},Browser.requestFullscreen(e,t,r)},nextRAF:0,fakeRequestAnimationFrame:function(e){var t=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=t+1e3/60;else for(;t+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-t,0);setTimeout(e,r)},requestAnimationFrame:function e(t){typeof window>"u"?Browser.fakeRequestAnimationFrame(t):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(t))},safeCallback:function(e){return function(){if(!ABORT)return e.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var e=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],e.forEach(function(t){t()})}},safeRequestAnimationFrame:function(e){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))})},safeSetTimeout:function(e,t){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))},t)},safeSetInterval:function(e,t){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&e()},t)},getMimetype:function(e){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[e.substr(e.lastIndexOf(".")+1)]},getUserMedia:function(e){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(e)},getMovementX:function(e){return e.movementX||e.mozMovementX||e.webkitMovementX||0},getMovementY:function(e){return e.movementY||e.mozMovementY||e.webkitMovementY||0},getMouseWheelDelta:function(e){var t=0;switch(e.type){case"DOMMouseScroll":t=e.detail;break;case"mousewheel":t=e.wheelDelta;break;case"wheel":t=e.deltaY;break;default:throw"unrecognized mouse wheel event: "+e.type}return t},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(e){if(Browser.pointerLock)e.type!="mousemove"&&"mozMovementX"in e?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(e),Browser.mouseMovementY=Browser.getMovementY(e)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var t=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,s=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(e.type==="touchstart"||e.type==="touchend"||e.type==="touchmove"){var c=e.touch;if(c===void 0)return;var f=c.pageX-(a+t.left),p=c.pageY-(n+t.top);f=f*(r/t.width),p=p*(s/t.height);var h={x:f,y:p};if(e.type==="touchstart")Browser.lastTouches[c.identifier]=h,Browser.touches[c.identifier]=h;else if(e.type==="touchend"||e.type==="touchmove"){var E=Browser.touches[c.identifier];E||(E=h),Browser.lastTouches[c.identifier]=E,Browser.touches[c.identifier]=h}return}var C=e.pageX-(a+t.left),S=e.pageY-(n+t.top);C=C*(r/t.width),S=S*(s/t.height),Browser.mouseMovementX=C-Browser.mouseX,Browser.mouseMovementY=S-Browser.mouseY,Browser.mouseX=C,Browser.mouseY=S}},asyncLoad:function(e,t,r,s){var a=s?"":"al "+e;Module.readAsync(e,function(n){assert(n,'Loading data file "'+e+'" failed (no arrayBuffer).'),t(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+e+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var e=Module.canvas;Browser.resizeListeners.forEach(function(t){t(e.width,e.height)})},setCanvasSize:function(e,t,r){var s=Module.canvas;Browser.updateCanvasDimensions(s,e,t),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var e=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];e=e|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=e}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var e=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];e=e&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=e}Browser.updateResizeListeners()},updateCanvasDimensions:function(e,t,r){t&&r?(e.widthNative=t,e.heightNative=r):(t=e.widthNative,r=e.heightNative);var s=t,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(s/a>2];return t},getStr:function(){var e=Pointer_stringify(SYSCALLS.get());return e},get64:function(){var e=SYSCALLS.get(),t=SYSCALLS.get();return e>=0?assert(t===0):assert(t===-1),e},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(e,t){SYSCALLS.varargs=t;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(s){return(typeof FS>"u"||!(s instanceof FS.ErrnoError))&&abort(s),-s.errno}}function ___syscall54(e,t){SYSCALLS.varargs=t;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(e){var t=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,C,S,x){if(h==1){var I=C&896;(I==128||I==256||I==384)&&(p="X const")}var R;return x?R=E.replace("X",p).replace("Y",S):R=p.replace("X",E).replace("Y",S),R.replace(/([*&]) (?=[*&])/g,"$1")}function s(p,h,E,C,S){throw new Error(p+" type "+E.replace("X",h+"?")+(C?" with flag "+C:"")+" in "+S)}function a(p,h,E,C,S,x,I,R){x===void 0&&(x="X"),R===void 0&&(R=1);var N=E(p);if(N)return N;var U=C(p),K=U.placeholderFlag,$=t[K];I&&$&&(x=r(I[2],I[0],x,$[0],"?",!0));var ie;K==0&&(ie="Unbound"),K>=10&&(ie="Corrupt"),R>20&&(ie="Deeply nested"),ie&&s(ie,p,x,K,S||"?");var fe=U.paramList[0],le=a(fe,h,E,C,S,x,$,R+1),ge,pe={flags:$[0],id:p,name:"",paramList:[le]},De=[],ye="?";switch(U.placeholderFlag){case 1:ge=le.spec;break;case 2:if((le.flags&15360)==1024&&le.spec.ptrSize==1){pe.flags=7168;break}case 3:case 6:case 5:ge=le.spec,le.flags&15360;break;case 8:ye=""+U.paramList[1],pe.paramList.push(U.paramList[1]);break;case 9:for(var d=0,ve=U.paramList[1];d>2]=e),e}function _llvm_stacksave(){var e=_llvm_stacksave;return e.LLVM_SAVEDSTACKS||(e.LLVM_SAVEDSTACKS=[]),e.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),e.LLVM_SAVEDSTACKS.length-1}function ___syscall140(e,t){SYSCALLS.varargs=t;try{var r=SYSCALLS.getStreamFromFD(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),c=SYSCALLS.get(),f=a;return FS.llseek(r,f,c),HEAP32[n>>2]=r.position,r.getdents&&f===0&&c===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(e,t){SYSCALLS.varargs=t;try{var r=SYSCALLS.get(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,C){var S=___syscall146.buffers[E];assert(S),C===0||C===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(S,0)),S.length=0):S.push(C)});for(var c=0;c>2],p=HEAP32[s+(c*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var e=0,t=_nbind.BindClass.list;ee.pageSize/2||t>e.pageSize-r){var s=_nbind.typeNameTbl.NBind.proto;return s.lalloc(t)}else return HEAPU32[e.usedPtr]=r+t,e.rootPtr+r},e.lreset=function(t,r){var s=HEAPU32[e.pagePtr];if(s){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(t,r)}else HEAPU32[e.usedPtr]=t},e}();_nbind.Pool=Pool;function constructType(e,t){var r=e==10240?_nbind.makeTypeNameTbl[t.name]||_nbind.BindType:_nbind.makeTypeKindTbl[e],s=new r(t);return typeIdTbl[t.id]=s,_nbind.typeNameTbl[t.name]=s,s}_nbind.constructType=constructType;function getType(e){return typeIdTbl[e]}_nbind.getType=getType;function queryType(e){var t=HEAPU8[e],r=_nbind.structureList[t][1];e/=4,r<0&&(++e,r=HEAPU32[e]+1);var s=Array.prototype.slice.call(HEAPU32.subarray(e+1,e+1+r));return t==9&&(s=[s[0],s.slice(1)]),{paramList:s,placeholderFlag:t}}_nbind.queryType=queryType;function getTypes(e,t){return e.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,t):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(e,t){return Array.prototype.slice.call(HEAPU32,e/4,e/4+t)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(e){for(var t=e;HEAPU8[t++];);return String.fromCharCode.apply("",HEAPU8.subarray(e,t-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(e){var t={};if(e)for(;;){var r=HEAPU32[e/4];if(!r)break;t[readAsciiString(r)]=!0,e+=4}return t}_nbind.readPolicyList=readPolicyList;function getDynCall(e,t){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},s=e.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+s];if(!a)throw new Error("dynCall_"+s+" not found for "+t+"("+e.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(e,t,r,s){var a=e[t];e.hasOwnProperty(t)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),e[t]=a),a.addMethod(r,s)):(r.arity=s,e[t]=r)}_nbind.addMethod=addMethod;function throwError(e){throw new Error(e)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(e){__extends(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return t.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},t.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},t}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(e){__extends(t,e);function t(r){var s=e.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return s.heap=a[r.ptrSize*8],s.ptrSize=r.ptrSize,s}return t.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},t.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},t}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(e,t){if(e==null){if(t&&t.Nullable)return 0;throw new Error("Type mismatch")}if(t&&t.Strict){if(typeof e!="string")throw new Error("Type mismatch")}else e=e.toString();var r=Module.lengthBytesUTF8(e)+1,s=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(e,HEAPU8,s,r),s}_nbind.pushCString=pushCString;function popCString(e){return e===0?null:Module.Pointer_stringify(e)}_nbind.popCString=popCString;var CStringType=function(e){__extends(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return t.prototype.makeWireWrite=function(r,s){return function(a){return pushCString(a,s)}},t}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(e){__extends(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.wireRead=function(s){return!!s},r}return t.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},t.prototype.makeWireRead=function(r){return"!!("+r+")"},t.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},t}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function e(){}return e.prototype.persist=function(){this.__nbindState|=1},e}();_nbind.Wrapper=Wrapper;function makeBound(e,t){var r=function(s){__extends(a,s);function a(n,c,f,p){var h=s.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=c,C=f,S=p;if(n!==_nbind.ptrMarker){var x=h.__nbindConstructor.apply(h,arguments);E=4608,S=HEAPU32[x/4],C=HEAPU32[x/4+1]}var I={configurable:!0,enumerable:!1,value:null,writable:!1},R={__nbindFlags:E,__nbindPtr:C};S&&(R.__nbindShared=S,_nbind.mark(h));for(var N=0,U=Object.keys(R);N>=1;var r=_nbind.valueList[e];return _nbind.valueList[e]=firstFreeValue,firstFreeValue=e,r}else{if(t)return _nbind.popShared(e,t);throw new Error("Invalid value slot "+e)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(e){return typeof e=="number"?e:pushValue(e)*4096+valueBase}function pop64(e){return e=3?c=Buffer.from(n):c=new Buffer(n),c.copy(s)}else getBuffer(s).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var e=0,t=dirtyList;e>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(e,t,r,s,a,n){try{Module.dynCall_viiiii(e,t,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vif(e,t,r){try{Module.dynCall_vif(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_vid(e,t,r){try{Module.dynCall_vid(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_fiff(e,t,r,s){try{return Module.dynCall_fiff(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(e,t){try{Module.dynCall_vi(e,t)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(e,t,r){try{Module.dynCall_vii(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_ii(e,t){try{return Module.dynCall_ii(e,t)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(e,t,r,s,a){try{Module.dynCall_viddi(e,t,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(e,t,r,s){try{Module.dynCall_vidd(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(e,t,r,s){try{return Module.dynCall_iiii(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(e,t,r,s){try{return Module.dynCall_diii(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(e,t){try{return Module.dynCall_di(e,t)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(e,t,r){try{return Module.dynCall_iid(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_iii(e,t,r){try{return Module.dynCall_iii(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_viiddi(e,t,r,s,a,n){try{Module.dynCall_viiddi(e,t,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiiiii(e,t,r,s,a,n,c){try{Module.dynCall_viiiiii(e,t,r,s,a,n,c)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_dii(e,t,r){try{return Module.dynCall_dii(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_i(e){try{return Module.dynCall_i(e)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_iiiiii(e,t,r,s,a,n){try{return Module.dynCall_iiiiii(e,t,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiid(e,t,r,s,a){try{Module.dynCall_viiid(e,t,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(e,t,r,s,a,n,c){try{Module.dynCall_viififi(e,t,r,s,a,n,c)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viii(e,t,r,s){try{Module.dynCall_viii(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(e){try{Module.dynCall_v(e)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viid(e,t,r,s){try{Module.dynCall_viid(e,t,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(e,t,r){try{return Module.dynCall_idd(e,t,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_viiii(e,t,r,s,a){try{Module.dynCall_viiii(e,t,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(e,t,r){var s=new e.Int8Array(r),a=new e.Int16Array(r),n=new e.Int32Array(r),c=new e.Uint8Array(r),f=new e.Uint16Array(r),p=new e.Uint32Array(r),h=new e.Float32Array(r),E=new e.Float64Array(r),C=t.DYNAMICTOP_PTR|0,S=t.tempDoublePtr|0,x=t.ABORT|0,I=t.STACKTOP|0,R=t.STACK_MAX|0,N=t.cttz_i8|0,U=t.___dso_handle|0,K=0,$=0,ie=0,fe=0,le=e.NaN,ge=e.Infinity,pe=0,De=0,ye=0,d=0,ve=0,Ie=0,me=e.Math.floor,ce=e.Math.abs,X=e.Math.sqrt,be=e.Math.pow,ke=e.Math.cos,it=e.Math.sin,_=e.Math.tan,tt=e.Math.acos,Fe=e.Math.asin,Qe=e.Math.atan,Se=e.Math.atan2,je=e.Math.exp,Te=e.Math.log,ct=e.Math.ceil,Me=e.Math.imul,P=e.Math.min,w=e.Math.max,D=e.Math.clz32,y=e.Math.fround,F=t.abort,z=t.assert,Z=t.enlargeMemory,ee=t.getTotalMemory,se=t.abortOnCannotGrowMemory,xe=t.invoke_viiiii,Ne=t.invoke_vif,ut=t.invoke_vid,Ct=t.invoke_fiff,Yt=t.invoke_vi,ir=t.invoke_vii,Pt=t.invoke_ii,mn=t.invoke_viddi,Pr=t.invoke_vidd,Cr=t.invoke_iiii,Lr=t.invoke_diii,on=t.invoke_di,ci=t.invoke_iid,Do=t.invoke_iii,is=t.invoke_viiddi,ao=t.invoke_viiiiii,Po=t.invoke_dii,ji=t.invoke_i,lo=t.invoke_iiiiii,xo=t.invoke_viiid,FA=t.invoke_viififi,df=t.invoke_viii,mh=t.invoke_v,yh=t.invoke_viid,co=t.invoke_idd,qn=t.invoke_viiii,Ns=t._emscripten_asm_const_iiiii,uo=t._emscripten_asm_const_iiidddddd,ou=t._emscripten_asm_const_iiiid,au=t.__nbind_reference_external,lu=t._emscripten_asm_const_iiiiiiii,NA=t._removeAccessorPrefix,OA=t._typeModule,Aa=t.__nbind_register_pool,pa=t.__decorate,LA=t._llvm_stackrestore,gr=t.___cxa_atexit,ko=t.__extends,qa=t.__nbind_get_value_object,Ue=t.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,wr=t._emscripten_set_main_loop_timing,gf=t.__nbind_register_primitive,MA=t.__nbind_register_type,UA=t._emscripten_memcpy_big,cu=t.__nbind_register_function,uu=t.___setErrNo,cc=t.__nbind_register_class,we=t.__nbind_finish,Ot=t._abort,uc=t._nbind_value,Oi=t._llvm_stacksave,fo=t.___syscall54,Rt=t._defineHidden,Tn=t._emscripten_set_main_loop,ha=t._emscripten_get_now,Gi=t.__nbind_register_callback_signature,Li=t._emscripten_asm_const_iiiiii,Ya=t.__nbind_free_external,yn=t._emscripten_asm_const_iiii,Xn=t._emscripten_asm_const_iiididi,fu=t.___syscall6,Eh=t._atexit,Wa=t.___syscall140,Va=t.___syscall146,Ka=y(0);let $e=y(0);function Ja(o){o=o|0;var l=0;return l=I,I=I+o|0,I=I+15&-16,l|0}function mf(){return I|0}function fc(o){o=o|0,I=o}function Sn(o,l){o=o|0,l=l|0,I=o,R=l}function da(o,l){o=o|0,l=l|0,K||(K=o,$=l)}function _A(o){o=o|0,Ie=o}function HA(){return Ie|0}function ga(){var o=0,l=0;Rr(8104,8,400)|0,Rr(8504,408,540)|0,o=9044,l=o+44|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));s[9088]=0,s[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,gr(17,8104,U|0)|0}function Ql(o){o=o|0,mt(o+948|0)}function Ut(o){return o=y(o),((mP(o)|0)&2147483647)>>>0>2139095040|0}function Rn(o,l,u){o=o|0,l=l|0,u=u|0;e:do if(n[o+(l<<3)+4>>2]|0)o=o+(l<<3)|0;else{if((l|2|0)==3&&n[o+60>>2]|0){o=o+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[o+52>>2]|0){o=o+48|0;break e}break}default:}if(n[o+68>>2]|0){o=o+64|0;break}else{o=(l|1|0)==5?948:u;break}}while(!1);return o|0}function ma(o){o=o|0;var l=0;return l=WP(1e3)|0,za(o,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Rr(l|0,8104,1e3)|0,s[o+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=o,l|0}function za(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;g=I,I=I+16|0,A=g,l||(n[A>>2]=u,Wg(o,5,3197,A)),I=g}function ss(){return ma(956)|0}function Ac(o){o=o|0;var l=0;return l=Jt(1e3)|0,Au(l,o),za(n[o+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function Au(o,l){o=o|0,l=l|0;var u=0;Rr(o|0,l|0,948)|0,Ty(o+948|0,l+948|0),u=o+960|0,o=l+960|0,l=u+40|0;do n[u>>2]=n[o>>2],u=u+4|0,o=o+4|0;while((u|0)<(l|0))}function pc(o){o=o|0;var l=0,u=0,A=0,g=0;if(l=o+944|0,u=n[l>>2]|0,u|0&&(Za(u+948|0,o)|0,n[l>>2]=0),u=Mi(o)|0,u|0){l=0;do n[(vs(o,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(u|0))}u=o+948|0,A=n[u>>2]|0,g=o+952|0,l=n[g>>2]|0,(l|0)!=(A|0)&&(n[g>>2]=l+(~((l+-4-A|0)>>>2)<<2)),Tl(u),VP(o),n[2276]=(n[2276]|0)+-1}function Za(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0;A=n[o>>2]|0,k=o+4|0,u=n[k>>2]|0,m=u;e:do if((A|0)==(u|0))g=A,B=4;else for(o=A;;){if((n[o>>2]|0)==(l|0)){g=o,B=4;break e}if(o=o+4|0,(o|0)==(u|0)){o=0;break}}while(!1);return(B|0)==4&&((g|0)!=(u|0)?(A=g+4|0,o=m-A|0,l=o>>2,l&&(x2(g|0,A|0,o|0)|0,u=n[k>>2]|0),o=g+(l<<2)|0,(u|0)==(o|0)||(n[k>>2]=u+(~((u+-4-o|0)>>>2)<<2)),o=1):o=0),o|0}function Mi(o){return o=o|0,(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2|0}function vs(o,l){o=o|0,l=l|0;var u=0;return u=n[o+948>>2]|0,(n[o+952>>2]|0)-u>>2>>>0>l>>>0?o=n[u+(l<<2)>>2]|0:o=0,o|0}function Tl(o){o=o|0;var l=0,u=0,A=0,g=0;A=I,I=I+32|0,l=A,g=n[o>>2]|0,u=(n[o+4>>2]|0)-g|0,((n[o+8>>2]|0)-g|0)>>>0>u>>>0&&(g=u>>2,Oy(l,g,g,o+8|0),yP(o,l),Ly(l)),I=A}function yf(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0;M=Mi(o)|0;do if(M|0){if((n[(vs(o,0)|0)+944>>2]|0)==(o|0)){if(!(Za(o+948|0,l)|0))break;Rr(l+400|0,8504,540)|0,n[l+944>>2]=0,Oe(o);break}B=n[(n[o+976>>2]|0)+12>>2]|0,k=o+948|0,T=(B|0)==0,u=0,m=0;do A=n[(n[k>>2]|0)+(m<<2)>>2]|0,(A|0)==(l|0)?Oe(o):(g=Ac(A)|0,n[(n[k>>2]|0)+(u<<2)>>2]=g,n[g+944>>2]=o,T||cU[B&15](A,g,o,u),u=u+1|0),m=m+1|0;while((m|0)!=(M|0));if(u>>>0>>0){T=o+948|0,k=o+952|0,B=u,u=n[k>>2]|0;do m=(n[T>>2]|0)+(B<<2)|0,A=m+4|0,g=u-A|0,l=g>>2,l&&(x2(m|0,A|0,g|0)|0,u=n[k>>2]|0),g=u,A=m+(l<<2)|0,(g|0)!=(A|0)&&(u=g+(~((g+-4-A|0)>>>2)<<2)|0,n[k>>2]=u),B=B+1|0;while((B|0)!=(M|0))}}while(!1)}function hc(o){o=o|0;var l=0,u=0,A=0,g=0;vi(o,(Mi(o)|0)==0,2491),vi(o,(n[o+944>>2]|0)==0,2545),l=o+948|0,u=n[l>>2]|0,A=o+952|0,g=n[A>>2]|0,(g|0)!=(u|0)&&(n[A>>2]=g+(~((g+-4-u|0)>>>2)<<2)),Tl(l),l=o+976|0,u=n[l>>2]|0,Rr(o|0,8104,1e3)|0,s[u+2>>0]|0&&(n[o+4>>2]=2,n[o+12>>2]=4),n[l>>2]=u}function vi(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;g=I,I=I+16|0,A=g,l||(n[A>>2]=u,Oo(o,5,3197,A)),I=g}function Fn(){return n[2276]|0}function dc(){var o=0;return o=WP(20)|0,ze((o|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[o>>2]=n[239],n[o+4>>2]=n[240],n[o+8>>2]=n[241],n[o+12>>2]=n[242],n[o+16>>2]=n[243],o|0}function ze(o,l){o=o|0,l=l|0;var u=0,A=0;A=I,I=I+16|0,u=A,o||(n[u>>2]=l,Oo(0,5,3197,u)),I=A}function at(o){o=o|0,VP(o),n[2277]=(n[2277]|0)+-1}function St(o,l){o=o|0,l=l|0;var u=0;l?(vi(o,(Mi(o)|0)==0,2629),u=1):(u=0,l=0),n[o+964>>2]=l,n[o+988>>2]=u}function lr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,m=A+8|0,g=A+4|0,B=A,n[g>>2]=l,vi(o,(n[l+944>>2]|0)==0,2709),vi(o,(n[o+964>>2]|0)==0,2763),te(o),l=o+948|0,n[B>>2]=(n[l>>2]|0)+(u<<2),n[m>>2]=n[B>>2],Ee(l,m,g)|0,n[(n[g>>2]|0)+944>>2]=o,Oe(o),I=A}function te(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0;if(u=Mi(o)|0,u|0&&(n[(vs(o,0)|0)+944>>2]|0)!=(o|0)){A=n[(n[o+976>>2]|0)+12>>2]|0,g=o+948|0,m=(A|0)==0,l=0;do B=n[(n[g>>2]|0)+(l<<2)>>2]|0,k=Ac(B)|0,n[(n[g>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=o,m||cU[A&15](B,k,o,l),l=l+1|0;while((l|0)!=(u|0))}}function Ee(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0;nt=I,I=I+64|0,q=nt+52|0,k=nt+48|0,oe=nt+28|0,Ve=nt+24|0,Le=nt+20|0,Re=nt,A=n[o>>2]|0,m=A,l=A+((n[l>>2]|0)-m>>2<<2)|0,A=o+4|0,g=n[A>>2]|0,B=o+8|0;do if(g>>>0<(n[B>>2]|0)>>>0){if((l|0)==(g|0)){n[l>>2]=n[u>>2],n[A>>2]=(n[A>>2]|0)+4;break}EP(o,l,g,l+4|0),l>>>0<=u>>>0&&(u=(n[A>>2]|0)>>>0>u>>>0?u+4|0:u),n[l>>2]=n[u>>2]}else{A=(g-m>>2)+1|0,g=O(o)|0,g>>>0>>0&&an(o),L=n[o>>2]|0,M=(n[B>>2]|0)-L|0,m=M>>1,Oy(Re,M>>2>>>0>>1>>>0?m>>>0>>0?A:m:g,l-L>>2,o+8|0),L=Re+8|0,A=n[L>>2]|0,m=Re+12|0,M=n[m>>2]|0,B=M,T=A;do if((A|0)==(M|0)){if(M=Re+4|0,A=n[M>>2]|0,Xe=n[Re>>2]|0,g=Xe,A>>>0<=Xe>>>0){A=B-g>>1,A=A|0?A:1,Oy(oe,A,A>>>2,n[Re+16>>2]|0),n[Ve>>2]=n[M>>2],n[Le>>2]=n[L>>2],n[k>>2]=n[Ve>>2],n[q>>2]=n[Le>>2],i2(oe,k,q),A=n[Re>>2]|0,n[Re>>2]=n[oe>>2],n[oe>>2]=A,A=oe+4|0,Xe=n[M>>2]|0,n[M>>2]=n[A>>2],n[A>>2]=Xe,A=oe+8|0,Xe=n[L>>2]|0,n[L>>2]=n[A>>2],n[A>>2]=Xe,A=oe+12|0,Xe=n[m>>2]|0,n[m>>2]=n[A>>2],n[A>>2]=Xe,Ly(oe),A=n[L>>2]|0;break}m=A,B=((m-g>>2)+1|0)/-2|0,k=A+(B<<2)|0,g=T-m|0,m=g>>2,m&&(x2(k|0,A|0,g|0)|0,A=n[M>>2]|0),Xe=k+(m<<2)|0,n[L>>2]=Xe,n[M>>2]=A+(B<<2),A=Xe}while(!1);n[A>>2]=n[u>>2],n[L>>2]=(n[L>>2]|0)+4,l=IP(o,Re,l)|0,Ly(Re)}while(!1);return I=nt,l|0}function Oe(o){o=o|0;var l=0;do{if(l=o+984|0,s[l>>0]|0)break;s[l>>0]=1,h[o+504>>2]=y(le),o=n[o+944>>2]|0}while(o|0)}function mt(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function Et(o){return o=o|0,n[o+944>>2]|0}function Dt(o){o=o|0,vi(o,(n[o+964>>2]|0)!=0,2832),Oe(o)}function tr(o){return o=o|0,(s[o+984>>0]|0)!=0|0}function pn(o,l){o=o|0,l=l|0,dHe(o,l,400)|0&&(Rr(o|0,l|0,400)|0,Oe(o))}function ui(o){o=o|0;var l=$e;return l=y(h[o+44>>2]),o=Ut(l)|0,y(o?y(0):l)}function qi(o){o=o|0;var l=$e;return l=y(h[o+48>>2]),Ut(l)|0&&(l=s[(n[o+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function Nn(o,l){o=o|0,l=l|0,n[o+980>>2]=l}function Xa(o){return o=o|0,n[o+980>>2]|0}function By(o,l){o=o|0,l=l|0;var u=0;u=o+4|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function z1(o){return o=o|0,n[o+4>>2]|0}function Qo(o,l){o=o|0,l=l|0;var u=0;u=o+8|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function vy(o){return o=o|0,n[o+8>>2]|0}function Ih(o,l){o=o|0,l=l|0;var u=0;u=o+12|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Z1(o){return o=o|0,n[o+12>>2]|0}function To(o,l){o=o|0,l=l|0;var u=0;u=o+16|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Ch(o){return o=o|0,n[o+16>>2]|0}function wh(o,l){o=o|0,l=l|0;var u=0;u=o+20|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function pu(o){return o=o|0,n[o+20>>2]|0}function Bh(o,l){o=o|0,l=l|0;var u=0;u=o+24|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Ng(o){return o=o|0,n[o+24>>2]|0}function Og(o,l){o=o|0,l=l|0;var u=0;u=o+28|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Lg(o){return o=o|0,n[o+28>>2]|0}function Sy(o,l){o=o|0,l=l|0;var u=0;u=o+32|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Ef(o){return o=o|0,n[o+32>>2]|0}function Ro(o,l){o=o|0,l=l|0;var u=0;u=o+36|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Rl(o){return o=o|0,n[o+36>>2]|0}function vh(o,l){o=o|0,l=y(l);var u=0;u=o+40|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Mg(o,l){o=o|0,l=y(l);var u=0;u=o+44|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Fl(o,l){o=o|0,l=y(l);var u=0;u=o+48|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Nl(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+52|0,g=o+56|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function by(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+52|0,u=o+56|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Ut(l)|0,n[u>>2]=A?3:2,Oe(o))}function jA(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+52|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Dy(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=(m^1)&1,g=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function Py(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=m?0:2,g=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function GA(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+132+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function qA(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=(m^1)&1,g=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function W(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=m?0:2,g=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function xt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+60+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function YA(o,l){o=o|0,l=l|0;var u=0;u=o+60+(l<<3)+4|0,(n[u>>2]|0)!=3&&(h[o+60+(l<<3)>>2]=y(le),n[u>>2]=3,Oe(o))}function Fo(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=(m^1)&1,g=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function If(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=m?0:2,g=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function yt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+204+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function hu(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0,m=0;m=Ut(u)|0,A=(m^1)&1,g=o+276+(l<<3)|0,l=o+276+(l<<3)+4|0,m|y(h[g>>2])==u&&(n[l>>2]|0)==(A|0)||(h[g>>2]=u,n[l>>2]=A,Oe(o))}function xy(o,l){return o=o|0,l=l|0,y(h[o+276+(l<<3)>>2])}function Ug(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+348|0,g=o+352|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function X1(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+348|0,u=o+352|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Ut(l)|0,n[u>>2]=A?3:2,Oe(o))}function Sh(o){o=o|0;var l=0;l=o+352|0,(n[l>>2]|0)!=3&&(h[o+348>>2]=y(le),n[l>>2]=3,Oe(o))}function ur(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+348|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function zi(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+356|0,g=o+360|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function Cf(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+356|0,u=o+360|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Ut(l)|0,n[u>>2]=A?3:2,Oe(o))}function $a(o){o=o|0;var l=0;l=o+360|0,(n[l>>2]|0)!=3&&(h[o+356>>2]=y(le),n[l>>2]=3,Oe(o))}function _g(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+356|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function du(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+364|0,g=o+368|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function wf(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=m?0:2,A=o+364|0,g=o+368|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function Bt(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+364|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function mi(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+372|0,g=o+376|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function WA(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=m?0:2,A=o+372|0,g=o+376|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function el(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+372|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function ya(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+380|0,g=o+384|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function tl(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=m?0:2,A=o+380|0,g=o+384|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function Hg(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+380|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function bh(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=(m^1)&1,A=o+388|0,g=o+392|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function jg(o,l){o=o|0,l=y(l);var u=0,A=0,g=0,m=0;m=Ut(l)|0,u=m?0:2,A=o+388|0,g=o+392|0,m|y(h[A>>2])==l&&(n[g>>2]|0)==(u|0)||(h[A>>2]=l,n[g>>2]=u,Oe(o))}function ky(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+388|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function VA(o,l){o=o|0,l=y(l);var u=0;u=o+396|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Gg(o){return o=o|0,y(h[o+396>>2])}function gu(o){return o=o|0,y(h[o+400>>2])}function mu(o){return o=o|0,y(h[o+404>>2])}function Bf(o){return o=o|0,y(h[o+408>>2])}function Os(o){return o=o|0,y(h[o+412>>2])}function yu(o){return o=o|0,y(h[o+416>>2])}function Yn(o){return o=o|0,y(h[o+420>>2])}function os(o,l){switch(o=o|0,l=l|0,vi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+424+(l<<2)>>2])}function xi(o,l){switch(o=o|0,l=l|0,vi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+448+(l<<2)>>2])}function KA(o,l){switch(o=o|0,l=l|0,vi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+472+(l<<2)>>2])}function vf(o,l){o=o|0,l=l|0;var u=0,A=$e;return u=n[o+4>>2]|0,(u|0)==(n[l+4>>2]|0)?u?(A=y(h[o>>2]),o=y(ce(y(A-y(h[l>>2]))))>2]=0,n[A+4>>2]=0,n[A+8>>2]=0,Ue(A|0,o|0,l|0,0),Oo(o,3,(s[A+11>>0]|0)<0?n[A>>2]|0:A,u),MHe(A),I=u}function as(o,l,u,A){o=y(o),l=y(l),u=u|0,A=A|0;var g=$e;o=y(o*l),g=y(nU(o,y(1)));do if(En(g,y(0))|0)o=y(o-g);else{if(o=y(o-g),En(g,y(1))|0){o=y(o+y(1));break}if(u){o=y(o+y(1));break}A||(g>y(.5)?g=y(1):(A=En(g,y(.5))|0,g=y(A?1:0)),o=y(o+g))}while(!1);return y(o/l)}function Ol(o,l,u,A,g,m,B,k,T,M,L,q,oe){o=o|0,l=y(l),u=u|0,A=y(A),g=g|0,m=y(m),B=B|0,k=y(k),T=y(T),M=y(M),L=y(L),q=y(q),oe=oe|0;var Ve=0,Le=$e,Re=$e,nt=$e,Xe=$e,At=$e,He=$e;return T>2]),Le!=y(0))?(nt=y(as(l,Le,0,0)),Xe=y(as(A,Le,0,0)),Re=y(as(m,Le,0,0)),Le=y(as(k,Le,0,0))):(Re=m,nt=l,Le=k,Xe=A),(g|0)==(o|0)?Ve=En(Re,nt)|0:Ve=0,(B|0)==(u|0)?oe=En(Le,Xe)|0:oe=0,!Ve&&(At=y(l-L),!(No(o,At,T)|0))&&!(Sf(o,At,g,T)|0)?Ve=bf(o,At,g,m,T)|0:Ve=1,!oe&&(He=y(A-q),!(No(u,He,M)|0))&&!(Sf(u,He,B,M)|0)?oe=bf(u,He,B,k,M)|0:oe=1,oe=Ve&oe),oe|0}function No(o,l,u){return o=o|0,l=y(l),u=y(u),(o|0)==1?o=En(l,u)|0:o=0,o|0}function Sf(o,l,u,A){return o=o|0,l=y(l),u=u|0,A=y(A),(o|0)==2&(u|0)==0?l>=A?o=1:o=En(l,A)|0:o=0,o|0}function bf(o,l,u,A,g){return o=o|0,l=y(l),u=u|0,A=y(A),g=y(g),(o|0)==2&(u|0)==2&A>l?g<=l?o=1:o=En(l,g)|0:o=0,o|0}function Ll(o,l,u,A,g,m,B,k,T,M,L){o=o|0,l=y(l),u=y(u),A=A|0,g=g|0,m=m|0,B=y(B),k=y(k),T=T|0,M=M|0,L=L|0;var q=0,oe=0,Ve=0,Le=0,Re=$e,nt=$e,Xe=0,At=0,He=0,We=0,Mt=0,qr=0,fr=0,$t=0,Fr=0,jr=0,cr=0,Gn=$e,Uo=$e,_o=$e,Ho=0,al=0;cr=I,I=I+160|0,$t=cr+152|0,fr=cr+120|0,qr=cr+104|0,He=cr+72|0,Le=cr+56|0,Mt=cr+8|0,At=cr,We=(n[2279]|0)+1|0,n[2279]=We,Fr=o+984|0,s[Fr>>0]|0&&(n[o+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[o+516>>2]|0)==(A|0)?jr=0:Xe=4,(Xe|0)==4&&(n[o+520>>2]=0,n[o+924>>2]=-1,n[o+928>>2]=-1,h[o+932>>2]=y(-1),h[o+936>>2]=y(-1),jr=1);e:do if(n[o+964>>2]|0)if(Re=y(In(o,2,B)),nt=y(In(o,0,B)),q=o+916|0,_o=y(h[q>>2]),Uo=y(h[o+920>>2]),Gn=y(h[o+932>>2]),Ol(g,l,m,u,n[o+924>>2]|0,_o,n[o+928>>2]|0,Uo,Gn,y(h[o+936>>2]),Re,nt,L)|0)Xe=22;else if(Ve=n[o+520>>2]|0,!Ve)Xe=21;else for(oe=0;;){if(q=o+524+(oe*24|0)|0,Gn=y(h[q>>2]),Uo=y(h[o+524+(oe*24|0)+4>>2]),_o=y(h[o+524+(oe*24|0)+16>>2]),Ol(g,l,m,u,n[o+524+(oe*24|0)+8>>2]|0,Gn,n[o+524+(oe*24|0)+12>>2]|0,Uo,_o,y(h[o+524+(oe*24|0)+20>>2]),Re,nt,L)|0){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=Ve>>>0){Xe=21;break}}else{if(T){if(q=o+916|0,!(En(y(h[q>>2]),l)|0)){Xe=21;break}if(!(En(y(h[o+920>>2]),u)|0)){Xe=21;break}if((n[o+924>>2]|0)!=(g|0)){Xe=21;break}q=(n[o+928>>2]|0)==(m|0)?q:0,Xe=22;break}if(Ve=n[o+520>>2]|0,!Ve)Xe=21;else for(oe=0;;){if(q=o+524+(oe*24|0)|0,En(y(h[q>>2]),l)|0&&En(y(h[o+524+(oe*24|0)+4>>2]),u)|0&&(n[o+524+(oe*24|0)+8>>2]|0)==(g|0)&&(n[o+524+(oe*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=Ve>>>0){Xe=21;break}}}while(!1);do if((Xe|0)==21)s[11697]|0?(q=0,Xe=28):(q=0,Xe=31);else if((Xe|0)==22){if(oe=(s[11697]|0)!=0,!((q|0)!=0&(jr^1)))if(oe){Xe=28;break}else{Xe=31;break}Le=q+16|0,n[o+908>>2]=n[Le>>2],Ve=q+20|0,n[o+912>>2]=n[Ve>>2],(s[11698]|0)==0|oe^1||(n[At>>2]=Eu(We)|0,n[At+4>>2]=We,Oo(o,4,2972,At),oe=n[o+972>>2]|0,oe|0&&ap[oe&127](o),g=Ea(g,T)|0,m=Ea(m,T)|0,al=+y(h[Le>>2]),Ho=+y(h[Ve>>2]),n[Mt>>2]=g,n[Mt+4>>2]=m,E[Mt+8>>3]=+l,E[Mt+16>>3]=+u,E[Mt+24>>3]=al,E[Mt+32>>3]=Ho,n[Mt+40>>2]=M,Oo(o,4,2989,Mt))}while(!1);return(Xe|0)==28&&(oe=Eu(We)|0,n[Le>>2]=oe,n[Le+4>>2]=We,n[Le+8>>2]=jr?3047:11699,Oo(o,4,3038,Le),oe=n[o+972>>2]|0,oe|0&&ap[oe&127](o),Mt=Ea(g,T)|0,Xe=Ea(m,T)|0,n[He>>2]=Mt,n[He+4>>2]=Xe,E[He+8>>3]=+l,E[He+16>>3]=+u,n[He+24>>2]=M,Oo(o,4,3049,He),Xe=31),(Xe|0)==31&&(Ls(o,l,u,A,g,m,B,k,T,L),s[11697]|0&&(oe=n[2279]|0,Mt=Eu(oe)|0,n[qr>>2]=Mt,n[qr+4>>2]=oe,n[qr+8>>2]=jr?3047:11699,Oo(o,4,3083,qr),oe=n[o+972>>2]|0,oe|0&&ap[oe&127](o),Mt=Ea(g,T)|0,qr=Ea(m,T)|0,Ho=+y(h[o+908>>2]),al=+y(h[o+912>>2]),n[fr>>2]=Mt,n[fr+4>>2]=qr,E[fr+8>>3]=Ho,E[fr+16>>3]=al,n[fr+24>>2]=M,Oo(o,4,3092,fr)),n[o+516>>2]=A,q||(oe=o+520|0,q=n[oe>>2]|0,(q|0)==16&&(s[11697]|0&&Oo(o,4,3124,$t),n[oe>>2]=0,q=0),T?q=o+916|0:(n[oe>>2]=q+1,q=o+524+(q*24|0)|0),h[q>>2]=l,h[q+4>>2]=u,n[q+8>>2]=g,n[q+12>>2]=m,n[q+16>>2]=n[o+908>>2],n[q+20>>2]=n[o+912>>2],q=0)),T&&(n[o+416>>2]=n[o+908>>2],n[o+420>>2]=n[o+912>>2],s[o+985>>0]=1,s[Fr>>0]=0),n[2279]=(n[2279]|0)+-1,n[o+512>>2]=n[2278],I=cr,jr|(q|0)==0|0}function In(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(J(o,l,u)),y(A+y(re(o,l,u)))}function Oo(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=I,I=I+16|0,g=m,n[g>>2]=A,o?A=n[o+976>>2]|0:A=0,xh(A,o,l,u,g),I=m}function Eu(o){return o=o|0,(o>>>0>60?3201:3201+(60-o)|0)|0}function Ea(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;return g=I,I=I+32|0,u=g+12|0,A=g,n[u>>2]=n[254],n[u+4>>2]=n[255],n[u+8>>2]=n[256],n[A>>2]=n[257],n[A+4>>2]=n[258],n[A+8>>2]=n[259],(o|0)>2?o=11699:o=n[(l?A:u)+(o<<2)>>2]|0,I=g,o|0}function Ls(o,l,u,A,g,m,B,k,T,M){o=o|0,l=y(l),u=y(u),A=A|0,g=g|0,m=m|0,B=y(B),k=y(k),T=T|0,M=M|0;var L=0,q=0,oe=0,Ve=0,Le=$e,Re=$e,nt=$e,Xe=$e,At=$e,He=$e,We=$e,Mt=0,qr=0,fr=0,$t=$e,Fr=$e,jr=0,cr=$e,Gn=0,Uo=0,_o=0,Ho=0,al=0,Wh=0,Vh=0,yc=0,Kh=0,Of=0,Lf=0,Jh=0,zh=0,Zh=0,ln=0,Ec=0,Xh=0,Du=0,$h=$e,ed=$e,Mf=$e,Uf=$e,Pu=$e,ho=0,Yl=0,Ba=0,Ic=0,cp=0,up=$e,_f=$e,fp=$e,Ap=$e,go=$e,Hs=$e,Cc=0,Vn=$e,pp=$e,jo=$e,xu=$e,Go=$e,ku=$e,hp=0,dp=0,Qu=$e,mo=$e,wc=0,gp=0,mp=0,yp=0,Or=$e,Ai=0,js=0,qo=0,yo=0,Ur=0,Ar=0,Bc=0,zt=$e,Ep=0,Si=0;Bc=I,I=I+16|0,ho=Bc+12|0,Yl=Bc+8|0,Ba=Bc+4|0,Ic=Bc,vi(o,(g|0)==0|(Ut(l)|0)^1,3326),vi(o,(m|0)==0|(Ut(u)|0)^1,3406),js=pt(o,A)|0,n[o+496>>2]=js,Ur=mr(2,js)|0,Ar=mr(0,js)|0,h[o+440>>2]=y(J(o,Ur,B)),h[o+444>>2]=y(re(o,Ur,B)),h[o+428>>2]=y(J(o,Ar,B)),h[o+436>>2]=y(re(o,Ar,B)),h[o+464>>2]=y(vr(o,Ur)),h[o+468>>2]=y(Hn(o,Ur)),h[o+452>>2]=y(vr(o,Ar)),h[o+460>>2]=y(Hn(o,Ar)),h[o+488>>2]=y(yi(o,Ur,B)),h[o+492>>2]=y(Ss(o,Ur,B)),h[o+476>>2]=y(yi(o,Ar,B)),h[o+484>>2]=y(Ss(o,Ar,B));do if(n[o+964>>2]|0)ZA(o,l,u,g,m,B,k);else{if(qo=o+948|0,yo=(n[o+952>>2]|0)-(n[qo>>2]|0)>>2,!yo){hP(o,l,u,g,m,B,k);break}if(!T&&$1(o,l,u,g,m,B,k)|0)break;te(o),Ec=o+508|0,s[Ec>>0]=0,Ur=mr(n[o+4>>2]|0,js)|0,Ar=Ry(Ur,js)|0,Ai=de(Ur)|0,Xh=n[o+8>>2]|0,gp=o+28|0,Du=(n[gp>>2]|0)!=0,Go=Ai?B:k,Qu=Ai?k:B,$h=y(Qh(o,Ur,B)),ed=y(e2(o,Ur,B)),Le=y(Qh(o,Ar,B)),ku=y(rl(o,Ur,B)),mo=y(rl(o,Ar,B)),fr=Ai?g:m,wc=Ai?m:g,Or=Ai?ku:mo,At=Ai?mo:ku,xu=y(In(o,2,B)),Xe=y(In(o,0,B)),Re=y(y($r(o+364|0,B))-Or),nt=y(y($r(o+380|0,B))-Or),He=y(y($r(o+372|0,k))-At),We=y(y($r(o+388|0,k))-At),Mf=Ai?Re:He,Uf=Ai?nt:We,xu=y(l-xu),l=y(xu-Or),Ut(l)|0?Or=l:Or=y(ni(y(h0(l,nt)),Re)),pp=y(u-Xe),l=y(pp-At),Ut(l)|0?jo=l:jo=y(ni(y(h0(l,We)),He)),Re=Ai?Or:jo,Vn=Ai?jo:Or;e:do if((fr|0)==1)for(A=0,q=0;;){if(L=vs(o,q)|0,!A)y(XA(L))>y(0)&&y(Th(L))>y(0)?A=L:A=0;else if(t2(L)|0){Ve=0;break e}if(q=q+1|0,q>>>0>=yo>>>0){Ve=A;break}}else Ve=0;while(!1);Mt=Ve+500|0,qr=Ve+504|0,A=0,L=0,l=y(0),oe=0;do{if(q=n[(n[qo>>2]|0)+(oe<<2)>>2]|0,(n[q+36>>2]|0)==1)Fy(q),s[q+985>>0]=1,s[q+984>>0]=0;else{Df(q),T&&Ph(q,pt(q,js)|0,Re,Vn,Or);do if((n[q+24>>2]|0)!=1)if((q|0)==(Ve|0)){n[Mt>>2]=n[2278],h[qr>>2]=y(0);break}else{dP(o,q,Or,g,jo,Or,jo,m,js,M);break}else L|0&&(n[L+960>>2]=q),n[q+960>>2]=0,L=q,A=A|0?A:q;while(!1);Hs=y(h[q+504>>2]),l=y(l+y(Hs+y(In(q,Ur,Or))))}oe=oe+1|0}while((oe|0)!=(yo|0));for(_o=l>Re,Cc=Du&((fr|0)==2&_o)?1:fr,Gn=(wc|0)==1,al=Gn&(T^1),Wh=(Cc|0)==1,Vh=(Cc|0)==2,yc=976+(Ur<<2)|0,Kh=(wc|2|0)==2,Zh=Gn&(Du^1),Of=1040+(Ar<<2)|0,Lf=1040+(Ur<<2)|0,Jh=976+(Ar<<2)|0,zh=(wc|0)!=1,_o=Du&((fr|0)!=0&_o),Uo=o+976|0,Gn=Gn^1,l=Re,jr=0,Ho=0,Hs=y(0),Pu=y(0);;){e:do if(jr>>>0>>0)for(qr=n[qo>>2]|0,oe=0,We=y(0),He=y(0),nt=y(0),Re=y(0),q=0,L=0,Ve=jr;;){if(Mt=n[qr+(Ve<<2)>>2]|0,(n[Mt+36>>2]|0)!=1&&(n[Mt+940>>2]=Ho,(n[Mt+24>>2]|0)!=1)){if(Xe=y(In(Mt,Ur,Or)),ln=n[yc>>2]|0,u=y($r(Mt+380+(ln<<3)|0,Go)),At=y(h[Mt+504>>2]),u=y(h0(u,At)),u=y(ni(y($r(Mt+364+(ln<<3)|0,Go)),u)),Du&(oe|0)!=0&y(Xe+y(He+u))>l){m=oe,Xe=We,fr=Ve;break e}Xe=y(Xe+u),u=y(He+Xe),Xe=y(We+Xe),t2(Mt)|0&&(nt=y(nt+y(XA(Mt))),Re=y(Re-y(At*y(Th(Mt))))),L|0&&(n[L+960>>2]=Mt),n[Mt+960>>2]=0,oe=oe+1|0,L=Mt,q=q|0?q:Mt}else Xe=We,u=He;if(Ve=Ve+1|0,Ve>>>0>>0)We=Xe,He=u;else{m=oe,fr=Ve;break}}else m=0,Xe=y(0),nt=y(0),Re=y(0),q=0,fr=jr;while(!1);ln=nt>y(0)&nty(0)&ReUf&((Ut(Uf)|0)^1))l=Uf,ln=51;else if(s[(n[Uo>>2]|0)+3>>0]|0)ln=51;else{if($t!=y(0)&&y(XA(o))!=y(0)){ln=53;break}l=Xe,ln=53}while(!1);if((ln|0)==51&&(ln=0,Ut(l)|0?ln=53:(Fr=y(l-Xe),cr=l)),(ln|0)==53&&(ln=0,Xe>2]|0,Ve=Fry(0),He=y(Fr/$t),nt=y(0),Xe=y(0),l=y(0),L=q;do u=y($r(L+380+(oe<<3)|0,Go)),Re=y($r(L+364+(oe<<3)|0,Go)),Re=y(h0(u,y(ni(Re,y(h[L+504>>2]))))),Ve?(u=y(Re*y(Th(L))),u!=y(-0)&&(zt=y(Re-y(At*u)),up=y(Wn(L,Ur,zt,cr,Or)),zt!=up)&&(nt=y(nt-y(up-Re)),l=y(l+u))):Mt&&(_f=y(XA(L)),_f!=y(0))&&(zt=y(Re+y(He*_f)),fp=y(Wn(L,Ur,zt,cr,Or)),zt!=fp)&&(nt=y(nt-y(fp-Re)),Xe=y(Xe-_f)),L=n[L+960>>2]|0;while(L|0);if(l=y(We+l),Re=y(Fr+nt),cp)l=y(0);else{At=y($t+Xe),Ve=n[yc>>2]|0,Mt=Rey(0),At=y(Re/At),l=y(0);do{zt=y($r(q+380+(Ve<<3)|0,Go)),nt=y($r(q+364+(Ve<<3)|0,Go)),nt=y(h0(zt,y(ni(nt,y(h[q+504>>2]))))),Mt?(zt=y(nt*y(Th(q))),Re=y(-zt),zt!=y(-0)?(zt=y(He*Re),Re=y(Wn(q,Ur,y(nt+(qr?Re:zt)),cr,Or))):Re=nt):oe&&(Ap=y(XA(q)),Ap!=y(0))?Re=y(Wn(q,Ur,y(nt+y(At*Ap)),cr,Or)):Re=nt,l=y(l-y(Re-nt)),Xe=y(In(q,Ur,Or)),u=y(In(q,Ar,Or)),Re=y(Re+Xe),h[Yl>>2]=Re,n[Ic>>2]=1,nt=y(h[q+396>>2]);e:do if(Ut(nt)|0){L=Ut(Vn)|0;do if(!L){if(_o|(Ao(q,Ar,Vn)|0|Gn)||(ls(o,q)|0)!=4||(n[(Ml(q,Ar)|0)+4>>2]|0)==3||(n[(Ul(q,Ar)|0)+4>>2]|0)==3)break;h[ho>>2]=Vn,n[Ba>>2]=1;break e}while(!1);if(Ao(q,Ar,Vn)|0){L=n[q+992+(n[Jh>>2]<<2)>>2]|0,zt=y(u+y($r(L,Vn))),h[ho>>2]=zt,L=zh&(n[L+4>>2]|0)==2,n[Ba>>2]=((Ut(zt)|0|L)^1)&1;break}else{h[ho>>2]=Vn,n[Ba>>2]=L?0:2;break}}else zt=y(Re-Xe),$t=y(zt/nt),zt=y(nt*zt),n[Ba>>2]=1,h[ho>>2]=y(u+(Ai?$t:zt));while(!1);Iu(q,Ur,cr,Or,Ic,Yl),Iu(q,Ar,Vn,Or,Ba,ho);do if(!(Ao(q,Ar,Vn)|0)&&(ls(o,q)|0)==4){if((n[(Ml(q,Ar)|0)+4>>2]|0)==3){L=0;break}L=(n[(Ul(q,Ar)|0)+4>>2]|0)!=3}else L=0;while(!1);zt=y(h[Yl>>2]),$t=y(h[ho>>2]),Ep=n[Ic>>2]|0,Si=n[Ba>>2]|0,Ll(q,Ai?zt:$t,Ai?$t:zt,js,Ai?Ep:Si,Ai?Si:Ep,Or,jo,T&(L^1),3488,M)|0,s[Ec>>0]=s[Ec>>0]|s[q+508>>0],q=n[q+960>>2]|0}while(q|0)}}else l=y(0);if(l=y(Fr+l),Si=l>0]=Si|c[Ec>>0],Vh&l>y(0)?(L=n[yc>>2]|0,n[o+364+(L<<3)+4>>2]|0&&(go=y($r(o+364+(L<<3)|0,Go)),go>=y(0))?Re=y(ni(y(0),y(go-y(cr-l)))):Re=y(0)):Re=l,Mt=jr>>>0>>0,Mt){Ve=n[qo>>2]|0,oe=jr,L=0;do q=n[Ve+(oe<<2)>>2]|0,n[q+24>>2]|0||(L=((n[(Ml(q,Ur)|0)+4>>2]|0)==3&1)+L|0,L=L+((n[(Ul(q,Ur)|0)+4>>2]|0)==3&1)|0),oe=oe+1|0;while((oe|0)!=(fr|0));L?(Xe=y(0),u=y(0)):ln=101}else ln=101;e:do if((ln|0)==101)switch(ln=0,Xh|0){case 1:{L=0,Xe=y(Re*y(.5)),u=y(0);break e}case 2:{L=0,Xe=Re,u=y(0);break e}case 3:{if(m>>>0<=1){L=0,Xe=y(0),u=y(0);break e}u=y((m+-1|0)>>>0),L=0,Xe=y(0),u=y(y(ni(Re,y(0)))/u);break e}case 5:{u=y(Re/y((m+1|0)>>>0)),L=0,Xe=u;break e}case 4:{u=y(Re/y(m>>>0)),L=0,Xe=y(u*y(.5));break e}default:{L=0,Xe=y(0),u=y(0);break e}}while(!1);if(l=y($h+Xe),Mt){nt=y(Re/y(L|0)),oe=n[qo>>2]|0,q=jr,Re=y(0);do{L=n[oe+(q<<2)>>2]|0;e:do if((n[L+36>>2]|0)!=1){switch(n[L+24>>2]|0){case 1:{if(Ia(L,Ur)|0){if(!T)break e;zt=y($A(L,Ur,cr)),zt=y(zt+y(vr(o,Ur))),zt=y(zt+y(J(L,Ur,Or))),h[L+400+(n[Lf>>2]<<2)>>2]=zt;break e}break}case 0:if(Si=(n[(Ml(L,Ur)|0)+4>>2]|0)==3,zt=y(nt+l),l=Si?zt:l,T&&(Si=L+400+(n[Lf>>2]<<2)|0,h[Si>>2]=y(l+y(h[Si>>2]))),Si=(n[(Ul(L,Ur)|0)+4>>2]|0)==3,zt=y(nt+l),l=Si?zt:l,al){zt=y(u+y(In(L,Ur,Or))),Re=Vn,l=y(l+y(zt+y(h[L+504>>2])));break e}else{l=y(l+y(u+y(ep(L,Ur,Or)))),Re=y(ni(Re,y(ep(L,Ar,Or))));break e}default:}T&&(zt=y(Xe+y(vr(o,Ur))),Si=L+400+(n[Lf>>2]<<2)|0,h[Si>>2]=y(zt+y(h[Si>>2])))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}else Re=y(0);if(u=y(ed+l),Kh?Xe=y(y(Wn(o,Ar,y(mo+Re),Qu,B))-mo):Xe=Vn,nt=y(y(Wn(o,Ar,y(mo+(Zh?Vn:Re)),Qu,B))-mo),Mt&T){q=jr;do{oe=n[(n[qo>>2]|0)+(q<<2)>>2]|0;do if((n[oe+36>>2]|0)!=1){if((n[oe+24>>2]|0)==1){if(Ia(oe,Ar)|0){if(zt=y($A(oe,Ar,Vn)),zt=y(zt+y(vr(o,Ar))),zt=y(zt+y(J(oe,Ar,Or))),L=n[Of>>2]|0,h[oe+400+(L<<2)>>2]=zt,!(Ut(zt)|0))break}else L=n[Of>>2]|0;zt=y(vr(o,Ar)),h[oe+400+(L<<2)>>2]=y(zt+y(J(oe,Ar,Or)));break}L=ls(o,oe)|0;do if((L|0)==4){if((n[(Ml(oe,Ar)|0)+4>>2]|0)==3){ln=139;break}if((n[(Ul(oe,Ar)|0)+4>>2]|0)==3){ln=139;break}if(Ao(oe,Ar,Vn)|0){l=Le;break}Ep=n[oe+908+(n[yc>>2]<<2)>>2]|0,n[ho>>2]=Ep,l=y(h[oe+396>>2]),Si=Ut(l)|0,Re=(n[S>>2]=Ep,y(h[S>>2])),Si?l=nt:(Fr=y(In(oe,Ar,Or)),zt=y(Re/l),l=y(l*Re),l=y(Fr+(Ai?zt:l))),h[Yl>>2]=l,h[ho>>2]=y(y(In(oe,Ur,Or))+Re),n[Ba>>2]=1,n[Ic>>2]=1,Iu(oe,Ur,cr,Or,Ba,ho),Iu(oe,Ar,Vn,Or,Ic,Yl),l=y(h[ho>>2]),Fr=y(h[Yl>>2]),zt=Ai?l:Fr,l=Ai?Fr:l,Si=((Ut(zt)|0)^1)&1,Ll(oe,zt,l,js,Si,((Ut(l)|0)^1)&1,Or,jo,1,3493,M)|0,l=Le}else ln=139;while(!1);e:do if((ln|0)==139){ln=0,l=y(Xe-y(ep(oe,Ar,Or)));do if((n[(Ml(oe,Ar)|0)+4>>2]|0)==3){if((n[(Ul(oe,Ar)|0)+4>>2]|0)!=3)break;l=y(Le+y(ni(y(0),y(l*y(.5)))));break e}while(!1);if((n[(Ul(oe,Ar)|0)+4>>2]|0)==3){l=Le;break}if((n[(Ml(oe,Ar)|0)+4>>2]|0)==3){l=y(Le+y(ni(y(0),l)));break}switch(L|0){case 1:{l=Le;break e}case 2:{l=y(Le+y(l*y(.5)));break e}default:{l=y(Le+l);break e}}}while(!1);zt=y(Hs+l),Si=oe+400+(n[Of>>2]<<2)|0,h[Si>>2]=y(zt+y(h[Si>>2]))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}if(Hs=y(Hs+nt),Pu=y(ni(Pu,u)),m=Ho+1|0,fr>>>0>=yo>>>0)break;l=cr,jr=fr,Ho=m}do if(T){if(L=m>>>0>1,!L&&!(NL(o)|0))break;if(!(Ut(Vn)|0)){l=y(Vn-Hs);e:do switch(n[o+12>>2]|0){case 3:{Le=y(Le+l),He=y(0);break}case 2:{Le=y(Le+y(l*y(.5))),He=y(0);break}case 4:{Vn>Hs?He=y(l/y(m>>>0)):He=y(0);break}case 7:if(Vn>Hs){Le=y(Le+y(l/y(m<<1>>>0))),He=y(l/y(m>>>0)),He=L?He:y(0);break e}else{Le=y(Le+y(l*y(.5))),He=y(0);break e}case 6:{He=y(l/y(Ho>>>0)),He=Vn>Hs&L?He:y(0);break}default:He=y(0)}while(!1);if(m|0)for(Mt=1040+(Ar<<2)|0,qr=976+(Ar<<2)|0,Ve=0,q=0;;){e:do if(q>>>0>>0)for(Re=y(0),nt=y(0),l=y(0),oe=q;;){L=n[(n[qo>>2]|0)+(oe<<2)>>2]|0;do if((n[L+36>>2]|0)!=1&&!(n[L+24>>2]|0)){if((n[L+940>>2]|0)!=(Ve|0))break e;if(OL(L,Ar)|0&&(zt=y(h[L+908+(n[qr>>2]<<2)>>2]),l=y(ni(l,y(zt+y(In(L,Ar,Or)))))),(ls(o,L)|0)!=5)break;go=y(Vg(L)),go=y(go+y(J(L,0,Or))),zt=y(h[L+912>>2]),zt=y(y(zt+y(In(L,0,Or)))-go),go=y(ni(nt,go)),zt=y(ni(Re,zt)),Re=zt,nt=go,l=y(ni(l,y(go+zt)))}while(!1);if(L=oe+1|0,L>>>0>>0)oe=L;else{oe=L;break}}else nt=y(0),l=y(0),oe=q;while(!1);if(At=y(He+l),u=Le,Le=y(Le+At),q>>>0>>0){Xe=y(u+nt),L=q;do{q=n[(n[qo>>2]|0)+(L<<2)>>2]|0;e:do if((n[q+36>>2]|0)!=1&&!(n[q+24>>2]|0))switch(ls(o,q)|0){case 1:{zt=y(u+y(J(q,Ar,Or))),h[q+400+(n[Mt>>2]<<2)>>2]=zt;break e}case 3:{zt=y(y(Le-y(re(q,Ar,Or)))-y(h[q+908+(n[qr>>2]<<2)>>2])),h[q+400+(n[Mt>>2]<<2)>>2]=zt;break e}case 2:{zt=y(u+y(y(At-y(h[q+908+(n[qr>>2]<<2)>>2]))*y(.5))),h[q+400+(n[Mt>>2]<<2)>>2]=zt;break e}case 4:{if(zt=y(u+y(J(q,Ar,Or))),h[q+400+(n[Mt>>2]<<2)>>2]=zt,Ao(q,Ar,Vn)|0||(Ai?(Re=y(h[q+908>>2]),l=y(Re+y(In(q,Ur,Or))),nt=At):(nt=y(h[q+912>>2]),nt=y(nt+y(In(q,Ar,Or))),l=At,Re=y(h[q+908>>2])),En(l,Re)|0&&En(nt,y(h[q+912>>2]))|0))break e;Ll(q,l,nt,js,1,1,Or,jo,1,3501,M)|0;break e}case 5:{h[q+404>>2]=y(y(Xe-y(Vg(q)))+y($A(q,0,Vn)));break e}default:break e}while(!1);L=L+1|0}while((L|0)!=(oe|0))}if(Ve=Ve+1|0,(Ve|0)==(m|0))break;q=oe}}}while(!1);if(h[o+908>>2]=y(Wn(o,2,xu,B,B)),h[o+912>>2]=y(Wn(o,0,pp,k,B)),Cc|0&&(hp=n[o+32>>2]|0,dp=(Cc|0)==2,!(dp&(hp|0)!=2))?dp&(hp|0)==2&&(l=y(ku+cr),l=y(ni(y(h0(l,y(Kg(o,Ur,Pu,Go)))),ku)),ln=198):(l=y(Wn(o,Ur,Pu,Go,B)),ln=198),(ln|0)==198&&(h[o+908+(n[976+(Ur<<2)>>2]<<2)>>2]=l),wc|0&&(mp=n[o+32>>2]|0,yp=(wc|0)==2,!(yp&(mp|0)!=2))?yp&(mp|0)==2&&(l=y(mo+Vn),l=y(ni(y(h0(l,y(Kg(o,Ar,y(mo+Hs),Qu)))),mo)),ln=204):(l=y(Wn(o,Ar,y(mo+Hs),Qu,B)),ln=204),(ln|0)==204&&(h[o+908+(n[976+(Ar<<2)>>2]<<2)>>2]=l),T){if((n[gp>>2]|0)==2){q=976+(Ar<<2)|0,oe=1040+(Ar<<2)|0,L=0;do Ve=vs(o,L)|0,n[Ve+24>>2]|0||(Ep=n[q>>2]|0,zt=y(h[o+908+(Ep<<2)>>2]),Si=Ve+400+(n[oe>>2]<<2)|0,zt=y(zt-y(h[Si>>2])),h[Si>>2]=y(zt-y(h[Ve+908+(Ep<<2)>>2]))),L=L+1|0;while((L|0)!=(yo|0))}if(A|0){L=Ai?Cc:g;do LL(o,A,Or,L,jo,js,M),A=n[A+960>>2]|0;while(A|0)}if(L=(Ur|2|0)==3,q=(Ar|2|0)==3,L|q){A=0;do oe=n[(n[qo>>2]|0)+(A<<2)>>2]|0,(n[oe+36>>2]|0)!=1&&(L&&r2(o,oe,Ur),q&&r2(o,oe,Ar)),A=A+1|0;while((A|0)!=(yo|0))}}}while(!1);I=Bc}function Dh(o,l){o=o|0,l=y(l);var u=0;za(o,l>=y(0),3147),u=l==y(0),h[o+4>>2]=u?y(0):l}function JA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=A|0;var g=$e,m=$e,B=0,k=0,T=0;n[2278]=(n[2278]|0)+1,Df(o),Ao(o,2,l)|0?(g=y($r(n[o+992>>2]|0,l)),T=1,g=y(g+y(In(o,2,l)))):(g=y($r(o+380|0,l)),g>=y(0)?T=2:(T=((Ut(l)|0)^1)&1,g=l)),Ao(o,0,u)|0?(m=y($r(n[o+996>>2]|0,u)),k=1,m=y(m+y(In(o,0,l)))):(m=y($r(o+388|0,u)),m>=y(0)?k=2:(k=((Ut(u)|0)^1)&1,m=u)),B=o+976|0,Ll(o,g,m,A,T,k,l,u,1,3189,n[B>>2]|0)|0&&(Ph(o,n[o+496>>2]|0,l,u,l),zA(o,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),s[11696]|0)&&qg(o,7)}function Df(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;k=I,I=I+32|0,B=k+24|0,m=k+16|0,A=k+8|0,g=k,u=0;do l=o+380+(u<<3)|0,n[o+380+(u<<3)+4>>2]|0&&(T=l,M=n[T+4>>2]|0,L=A,n[L>>2]=n[T>>2],n[L+4>>2]=M,L=o+364+(u<<3)|0,M=n[L+4>>2]|0,T=g,n[T>>2]=n[L>>2],n[T+4>>2]=M,n[m>>2]=n[A>>2],n[m+4>>2]=n[A+4>>2],n[B>>2]=n[g>>2],n[B+4>>2]=n[g+4>>2],vf(m,B)|0)||(l=o+348+(u<<3)|0),n[o+992+(u<<2)>>2]=l,u=u+1|0;while((u|0)!=2);I=k}function Ao(o,l,u){o=o|0,l=l|0,u=y(u);var A=0;switch(o=n[o+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[o+4>>2]|0){case 0:case 3:{o=0;break}case 1:{y(h[o>>2])>2])>2]|0){case 2:{l=y(y(y(h[o>>2])*l)/y(100));break}case 1:{l=y(h[o>>2]);break}default:l=y(le)}return y(l)}function Ph(o,l,u,A,g){o=o|0,l=l|0,u=y(u),A=y(A),g=y(g);var m=0,B=$e;l=n[o+944>>2]|0?l:1,m=mr(n[o+4>>2]|0,l)|0,l=Ry(m,l)|0,u=y(gP(o,m,u)),A=y(gP(o,l,A)),B=y(u+y(J(o,m,g))),h[o+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,u=y(u+y(re(o,m,g))),h[o+400+(n[1e3+(m<<2)>>2]<<2)>>2]=u,u=y(A+y(J(o,l,g))),h[o+400+(n[1040+(l<<2)>>2]<<2)>>2]=u,g=y(A+y(re(o,l,g))),h[o+400+(n[1e3+(l<<2)>>2]<<2)>>2]=g}function zA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=y(A);var g=0,m=0,B=$e,k=$e,T=0,M=0,L=$e,q=0,oe=$e,Ve=$e,Le=$e,Re=$e;if(l!=y(0)&&(g=o+400|0,Re=y(h[g>>2]),m=o+404|0,Le=y(h[m>>2]),q=o+416|0,Ve=y(h[q>>2]),M=o+420|0,B=y(h[M>>2]),oe=y(Re+u),L=y(Le+A),A=y(oe+Ve),k=y(L+B),T=(n[o+988>>2]|0)==1,h[g>>2]=y(as(Re,l,0,T)),h[m>>2]=y(as(Le,l,0,T)),u=y(nU(y(Ve*l),y(1))),En(u,y(0))|0?m=0:m=(En(u,y(1))|0)^1,u=y(nU(y(B*l),y(1))),En(u,y(0))|0?g=0:g=(En(u,y(1))|0)^1,Re=y(as(A,l,T&m,T&(m^1))),h[q>>2]=y(Re-y(as(oe,l,0,T))),Re=y(as(k,l,T&g,T&(g^1))),h[M>>2]=y(Re-y(as(L,l,0,T))),m=(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2,m|0)){g=0;do zA(vs(o,g)|0,l,oe,L),g=g+1|0;while((g|0)!=(m|0))}}function Qy(o,l,u,A,g){switch(o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,u|0){case 5:case 0:{o=eX(n[489]|0,A,g)|0;break}default:o=FHe(A,g)|0}return o|0}function Wg(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;g=I,I=I+16|0,m=g,n[m>>2]=A,xh(o,0,l,u,m),I=g}function xh(o,l,u,A,g){if(o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,o=o|0?o:956,CX[n[o+8>>2]&1](o,l,u,A,g)|0,(u|0)==5)Ot();else return}function gc(o,l,u){o=o|0,l=l|0,u=u|0,s[o+l>>0]=u&1}function Ty(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(kh(o,A),kt(o,n[l>>2]|0,n[u>>2]|0,A))}function kh(o,l){o=o|0,l=l|0;var u=0;if((O(o)|0)>>>0>>0&&an(o),l>>>0>1073741823)Ot();else{u=Jt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function kt(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Rr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function O(o){return o=o|0,1073741823}function J(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+96>>2]|0?o=o+92|0:o=Rn(o+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Ke(o,u))}function re(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+104>>2]|0?o=o+100|0:o=Rn(o+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Ke(o,u))}function de(o){return o=o|0,(o|1|0)==3|0}function Ke(o,l){return o=o|0,l=y(l),(n[o+4>>2]|0)==3?l=y(0):l=y($r(o,l)),y(l)}function pt(o,l){return o=o|0,l=l|0,o=n[o>>2]|0,(o|0?o:(l|0)>1?l:1)|0}function mr(o,l){o=o|0,l=l|0;var u=0;e:do if((l|0)==2){switch(o|0){case 2:{o=3;break e}case 3:break;default:{u=4;break e}}o=2}else u=4;while(!1);return o|0}function vr(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+312>>2]|0&&(u=y(h[o+308>>2]),u>=y(0))||(u=y(ni(y(h[(Rn(o+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function Hn(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+320>>2]|0&&(u=y(h[o+316>>2]),u>=y(0))||(u=y(ni(y(h[(Rn(o+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function yi(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+240>>2]|0&&(A=y($r(o+236|0,u)),A>=y(0))||(A=y(ni(y($r(Rn(o+204|0,n[1040+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function Ss(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+248>>2]|0&&(A=y($r(o+244|0,u)),A>=y(0))||(A=y(ni(y($r(Rn(o+204|0,n[1e3+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function ZA(o,l,u,A,g,m,B){o=o|0,l=y(l),u=y(u),A=A|0,g=g|0,m=y(m),B=y(B);var k=$e,T=$e,M=$e,L=$e,q=$e,oe=$e,Ve=0,Le=0,Re=0;Re=I,I=I+16|0,Ve=Re,Le=o+964|0,vi(o,(n[Le>>2]|0)!=0,3519),k=y(rl(o,2,l)),T=y(rl(o,0,l)),M=y(In(o,2,l)),L=y(In(o,0,l)),Ut(l)|0?q=l:q=y(ni(y(0),y(y(l-M)-k))),Ut(u)|0?oe=u:oe=y(ni(y(0),y(y(u-L)-T))),(A|0)==1&(g|0)==1?(h[o+908>>2]=y(Wn(o,2,y(l-M),m,m)),l=y(Wn(o,0,y(u-L),B,m))):(wX[n[Le>>2]&1](Ve,o,q,A,oe,g),q=y(k+y(h[Ve>>2])),oe=y(l-M),h[o+908>>2]=y(Wn(o,2,(A|2|0)==2?q:oe,m,m)),oe=y(T+y(h[Ve+4>>2])),l=y(u-L),l=y(Wn(o,0,(g|2|0)==2?oe:l,B,m))),h[o+912>>2]=l,I=Re}function hP(o,l,u,A,g,m,B){o=o|0,l=y(l),u=y(u),A=A|0,g=g|0,m=y(m),B=y(B);var k=$e,T=$e,M=$e,L=$e;M=y(rl(o,2,m)),k=y(rl(o,0,m)),L=y(In(o,2,m)),T=y(In(o,0,m)),l=y(l-L),h[o+908>>2]=y(Wn(o,2,(A|2|0)==2?M:l,m,m)),u=y(u-T),h[o+912>>2]=y(Wn(o,0,(g|2|0)==2?k:u,B,m))}function $1(o,l,u,A,g,m,B){o=o|0,l=y(l),u=y(u),A=A|0,g=g|0,m=y(m),B=y(B);var k=0,T=$e,M=$e;return k=(A|0)==2,!(l<=y(0)&k)&&!(u<=y(0)&(g|0)==2)&&!((A|0)==1&(g|0)==1)?o=0:(T=y(In(o,0,m)),M=y(In(o,2,m)),k=l>2]=y(Wn(o,2,k?y(0):l,m,m)),l=y(u-T),k=u>2]=y(Wn(o,0,k?y(0):l,B,m)),o=1),o|0}function Ry(o,l){return o=o|0,l=l|0,Jg(o)|0?o=mr(2,l)|0:o=0,o|0}function Qh(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(yi(o,l,u)),y(u+y(vr(o,l)))}function e2(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(Ss(o,l,u)),y(u+y(Hn(o,l)))}function rl(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(Qh(o,l,u)),y(A+y(e2(o,l,u)))}function t2(o){return o=o|0,n[o+24>>2]|0?o=0:y(XA(o))!=y(0)?o=1:o=y(Th(o))!=y(0),o|0}function XA(o){o=o|0;var l=$e;if(n[o+944>>2]|0){if(l=y(h[o+44>>2]),Ut(l)|0)return l=y(h[o+40>>2]),o=l>y(0)&((Ut(l)|0)^1),y(o?l:y(0))}else l=y(0);return y(l)}function Th(o){o=o|0;var l=$e,u=0,A=$e;do if(n[o+944>>2]|0){if(l=y(h[o+48>>2]),Ut(l)|0){if(u=s[(n[o+976>>2]|0)+2>>0]|0,!(u<<24>>24)&&(A=y(h[o+40>>2]),A>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function Fy(o){o=o|0;var l=0,u=0;if(oE(o+400|0,0,540)|0,s[o+985>>0]=1,te(o),u=Mi(o)|0,u|0){l=o+948|0,o=0;do Fy(n[(n[l>>2]|0)+(o<<2)>>2]|0),o=o+1|0;while((o|0)!=(u|0))}}function dP(o,l,u,A,g,m,B,k,T,M){o=o|0,l=l|0,u=y(u),A=A|0,g=y(g),m=y(m),B=y(B),k=k|0,T=T|0,M=M|0;var L=0,q=$e,oe=0,Ve=0,Le=$e,Re=$e,nt=0,Xe=$e,At=0,He=$e,We=0,Mt=0,qr=0,fr=0,$t=0,Fr=0,jr=0,cr=0,Gn=0,Uo=0;Gn=I,I=I+16|0,qr=Gn+12|0,fr=Gn+8|0,$t=Gn+4|0,Fr=Gn,cr=mr(n[o+4>>2]|0,T)|0,We=de(cr)|0,q=y($r(ML(l)|0,We?m:B)),Mt=Ao(l,2,m)|0,jr=Ao(l,0,B)|0;do if(!(Ut(q)|0)&&!(Ut(We?u:g)|0)){if(L=l+504|0,!(Ut(y(h[L>>2]))|0)&&(!(n2(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[L>>2]=y(ni(q,y(rl(l,cr,m))))}else oe=7;while(!1);do if((oe|0)==7){if(At=We^1,!(At|Mt^1)){B=y($r(n[l+992>>2]|0,m)),h[l+504>>2]=y(ni(B,y(rl(l,2,m))));break}if(!(We|jr^1)){B=y($r(n[l+996>>2]|0,B)),h[l+504>>2]=y(ni(B,y(rl(l,0,m))));break}h[qr>>2]=y(le),h[fr>>2]=y(le),n[$t>>2]=0,n[Fr>>2]=0,Xe=y(In(l,2,m)),He=y(In(l,0,m)),Mt?(Le=y(Xe+y($r(n[l+992>>2]|0,m))),h[qr>>2]=Le,n[$t>>2]=1,Ve=1):(Ve=0,Le=y(le)),jr?(q=y(He+y($r(n[l+996>>2]|0,B))),h[fr>>2]=q,n[Fr>>2]=1,L=1):(L=0,q=y(le)),oe=n[o+32>>2]|0,We&(oe|0)==2?oe=2:Ut(Le)|0&&!(Ut(u)|0)&&(h[qr>>2]=u,n[$t>>2]=2,Ve=2,Le=u),!((oe|0)==2&At)&&Ut(q)|0&&!(Ut(g)|0)&&(h[fr>>2]=g,n[Fr>>2]=2,L=2,q=g),Re=y(h[l+396>>2]),nt=Ut(Re)|0;do if(nt)oe=Ve;else{if((Ve|0)==1&At){h[fr>>2]=y(y(Le-Xe)/Re),n[Fr>>2]=1,L=1,oe=1;break}We&(L|0)==1?(h[qr>>2]=y(Re*y(q-He)),n[$t>>2]=1,L=1,oe=1):oe=Ve}while(!1);Uo=Ut(u)|0,Ve=(ls(o,l)|0)!=4,!(We|Mt|((A|0)!=1|Uo)|(Ve|(oe|0)==1))&&(h[qr>>2]=u,n[$t>>2]=1,!nt)&&(h[fr>>2]=y(y(u-Xe)/Re),n[Fr>>2]=1,L=1),!(jr|At|((k|0)!=1|(Ut(g)|0))|(Ve|(L|0)==1))&&(h[fr>>2]=g,n[Fr>>2]=1,!nt)&&(h[qr>>2]=y(Re*y(g-He)),n[$t>>2]=1),Iu(l,2,m,m,$t,qr),Iu(l,0,B,m,Fr,fr),u=y(h[qr>>2]),g=y(h[fr>>2]),Ll(l,u,g,T,n[$t>>2]|0,n[Fr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(cr<<2)>>2]<<2)>>2]),h[l+504>>2]=y(ni(B,y(rl(l,cr,m))))}while(!1);n[l+500>>2]=n[2278],I=Gn}function Wn(o,l,u,A,g){return o=o|0,l=l|0,u=y(u),A=y(A),g=y(g),A=y(Kg(o,l,u,A)),y(ni(A,y(rl(o,l,g))))}function ls(o,l){return o=o|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:o+16|0)>>2]|0,(l|0)==5&&Jg(n[o+4>>2]|0)|0&&(l=1),l|0}function Ml(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,o+60+(l<<3)|0}function Ul(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,o+60+(l<<3)|0}function Iu(o,l,u,A,g,m){switch(o=o|0,l=l|0,u=y(u),A=y(A),g=g|0,m=m|0,u=y($r(o+380+(n[976+(l<<2)>>2]<<3)|0,u)),u=y(u+y(In(o,l,A))),n[g>>2]|0){case 2:case 1:{g=Ut(u)|0,A=y(h[m>>2]),h[m>>2]=g|A>2]=2,h[m>>2]=u);break}default:}}function Ia(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(Rn(o,4,948)|0)+4>>2]|0?o=1:o=(n[(Rn(o,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function $A(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0;return o=o+132|0,de(l)|0&&(A=Rn(o,4,948)|0,(n[A+4>>2]|0)!=0)?g=4:(A=Rn(o,n[1040+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?g=4:u=y(0)),(g|0)==4&&(u=y($r(A,u))),y(u)}function ep(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),A=y(A+y(J(o,l,u))),y(A+y(re(o,l,u)))}function NL(o){o=o|0;var l=0,u=0,A=0;e:do if(Jg(n[o+4>>2]|0)|0)l=0;else if((n[o+16>>2]|0)!=5)if(u=Mi(o)|0,!u)l=0;else for(l=0;;){if(A=vs(o,l)|0,!(n[A+24>>2]|0)&&(n[A+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=u>>>0){l=0;break}}else l=1;while(!1);return l|0}function OL(o,l){o=o|0,l=l|0;var u=$e;return u=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),u>=y(0)&((Ut(u)|0)^1)|0}function Vg(o){o=o|0;var l=$e,u=0,A=0,g=0,m=0,B=0,k=0,T=$e;if(u=n[o+968>>2]|0,u)T=y(h[o+908>>2]),l=y(h[o+912>>2]),l=y(mX[u&0](o,T,l)),vi(o,(Ut(l)|0)^1,3573);else{m=Mi(o)|0;do if(m|0){for(u=0,g=0;;){if(A=vs(o,g)|0,n[A+940>>2]|0){B=8;break}if((n[A+24>>2]|0)!=1)if(k=(ls(o,A)|0)==5,k){u=A;break}else u=u|0?u:A;if(g=g+1|0,g>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!u)break;return l=y(Vg(u)),y(l+y(h[u+404>>2]))}while(!1);l=y(h[o+912>>2])}return y(l)}function Kg(o,l,u,A){o=o|0,l=l|0,u=y(u),A=y(A);var g=$e,m=0;return Jg(l)|0?(l=1,m=3):de(l)|0?(l=0,m=3):(A=y(le),g=y(le)),(m|0)==3&&(g=y($r(o+364+(l<<3)|0,A)),A=y($r(o+380+(l<<3)|0,A))),m=A=y(0)&((Ut(A)|0)^1)),u=m?A:u,m=g>=y(0)&((Ut(g)|0)^1)&u>2]|0,m)|0,Le=Ry(nt,m)|0,Re=de(nt)|0,q=y(In(l,2,u)),oe=y(In(l,0,u)),Ao(l,2,u)|0?k=y(q+y($r(n[l+992>>2]|0,u))):Ia(l,2)|0&&Ny(l,2)|0?(k=y(h[o+908>>2]),T=y(vr(o,2)),T=y(k-y(T+y(Hn(o,2)))),k=y($A(l,2,u)),k=y(Wn(l,2,y(T-y(k+y(Rh(l,2,u)))),u,u))):k=y(le),Ao(l,0,g)|0?T=y(oe+y($r(n[l+996>>2]|0,g))):Ia(l,0)|0&&Ny(l,0)|0?(T=y(h[o+912>>2]),At=y(vr(o,0)),At=y(T-y(At+y(Hn(o,0)))),T=y($A(l,0,g)),T=y(Wn(l,0,y(At-y(T+y(Rh(l,0,g)))),g,u))):T=y(le),M=Ut(k)|0,L=Ut(T)|0;do if(M^L&&(Ve=y(h[l+396>>2]),!(Ut(Ve)|0)))if(M){k=y(q+y(y(T-oe)*Ve));break}else{At=y(oe+y(y(k-q)/Ve)),T=L?At:T;break}while(!1);L=Ut(k)|0,M=Ut(T)|0,L|M&&(He=(L^1)&1,A=u>y(0)&((A|0)!=0&L),k=Re?k:A?u:k,Ll(l,k,T,m,Re?He:A?2:He,L&(M^1)&1,k,T,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(In(l,2,u))),T=y(h[l+912>>2]),T=y(T+y(In(l,0,u)))),Ll(l,k,T,m,1,1,k,T,1,3635,B)|0,Ny(l,nt)|0&&!(Ia(l,nt)|0)?(He=n[976+(nt<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(At-y(h[l+908+(He<<2)>>2])),At=y(At-y(Hn(o,nt))),At=y(At-y(re(l,nt,u))),At=y(At-y(Rh(l,nt,Re?u:g))),h[l+400+(n[1040+(nt<<2)>>2]<<2)>>2]=At):Xe=21;do if((Xe|0)==21){if(!(Ia(l,nt)|0)&&(n[o+8>>2]|0)==1){He=n[976+(nt<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(y(At-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(nt<<2)>>2]<<2)>>2]=At;break}!(Ia(l,nt)|0)&&(n[o+8>>2]|0)==2&&(He=n[976+(nt<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(At-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(nt<<2)>>2]<<2)>>2]=At)}while(!1);Ny(l,Le)|0&&!(Ia(l,Le)|0)?(He=n[976+(Le<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(At-y(h[l+908+(He<<2)>>2])),At=y(At-y(Hn(o,Le))),At=y(At-y(re(l,Le,u))),At=y(At-y(Rh(l,Le,Re?g:u))),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=At):Xe=30;do if((Xe|0)==30&&!(Ia(l,Le)|0)){if((ls(o,l)|0)==2){He=n[976+(Le<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(y(At-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=At;break}He=(ls(o,l)|0)==3,He^(n[o+28>>2]|0)==2&&(He=n[976+(Le<<2)>>2]|0,At=y(h[o+908+(He<<2)>>2]),At=y(At-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=At)}while(!1)}function r2(o,l,u){o=o|0,l=l|0,u=u|0;var A=$e,g=0;g=n[976+(u<<2)>>2]|0,A=y(h[l+908+(g<<2)>>2]),A=y(y(h[o+908+(g<<2)>>2])-A),A=y(A-y(h[l+400+(n[1040+(u<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(u<<2)>>2]<<2)>>2]=A}function Jg(o){return o=o|0,(o|1|0)==1|0}function ML(o){o=o|0;var l=$e;switch(n[o+56>>2]|0){case 0:case 3:{l=y(h[o+40>>2]),l>y(0)&((Ut(l)|0)^1)?o=s[(n[o+976>>2]|0)+2>>0]|0?1056:992:o=1056;break}default:o=o+52|0}return o|0}function n2(o,l){return o=o|0,l=l|0,(s[o+l>>0]|0)!=0|0}function Ny(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(Rn(o,5,948)|0)+4>>2]|0?o=1:o=(n[(Rn(o,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function Rh(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,g=0;return o=o+132|0,de(l)|0&&(A=Rn(o,5,948)|0,(n[A+4>>2]|0)!=0)?g=4:(A=Rn(o,n[1e3+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?g=4:u=y(0)),(g|0)==4&&(u=y($r(A,u))),y(u)}function gP(o,l,u){return o=o|0,l=l|0,u=y(u),Ia(o,l)|0?u=y($A(o,l,u)):u=y(-y(Rh(o,l,u))),y(u)}function mP(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function Oy(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Ot();else{g=Jt(l<<2)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<2)}function yP(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>2)<<2)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Ly(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function EP(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;if(B=o+4|0,k=n[B>>2]|0,g=k-A|0,m=g>>2,o=l+(m<<2)|0,o>>>0>>0){A=k;do n[A>>2]=n[o>>2],o=o+4|0,A=(n[B>>2]|0)+4|0,n[B>>2]=A;while(o>>>0>>0)}m|0&&x2(k+(0-m<<2)|0,l|0,g|0)|0}function IP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0;return k=l+4|0,T=n[k>>2]|0,g=n[o>>2]|0,B=u,m=B-g|0,A=T+(0-(m>>2)<<2)|0,n[k>>2]=A,(m|0)>0&&Rr(A|0,g|0,m|0)|0,g=o+4|0,m=l+8|0,A=(n[g>>2]|0)-B|0,(A|0)>0&&(Rr(n[m>>2]|0,u|0,A|0)|0,n[m>>2]=(n[m>>2]|0)+(A>>>2<<2)),B=n[o>>2]|0,n[o>>2]=n[k>>2],n[k>>2]=B,B=n[g>>2]|0,n[g>>2]=n[m>>2],n[m>>2]=B,B=o+8|0,u=l+12|0,o=n[B>>2]|0,n[B>>2]=n[u>>2],n[u>>2]=o,n[l>>2]=n[k>>2],T|0}function i2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;if(B=n[l>>2]|0,m=n[u>>2]|0,(B|0)!=(m|0)){g=o+8|0,u=((m+-4-B|0)>>>2)+1|0,o=B,A=n[g>>2]|0;do n[A>>2]=n[o>>2],A=(n[g>>2]|0)+4|0,n[g>>2]=A,o=o+4|0;while((o|0)!=(m|0));n[l>>2]=B+(u<<2)}}function s2(){ga()}function CP(){var o=0;return o=Jt(4)|0,o2(o),o|0}function o2(o){o=o|0,n[o>>2]=dc()|0}function wP(o){o=o|0,o|0&&(zg(o),It(o))}function zg(o){o=o|0,at(n[o>>2]|0)}function UL(o,l,u){o=o|0,l=l|0,u=u|0,gc(n[o>>2]|0,l,u)}function My(o,l){o=o|0,l=y(l),Dh(n[o>>2]|0,l)}function Uy(o,l){return o=o|0,l=l|0,n2(n[o>>2]|0,l)|0}function _y(){var o=0;return o=Jt(8)|0,Zg(o,0),o|0}function Zg(o,l){o=o|0,l=l|0,l?l=ma(n[l>>2]|0)|0:l=ss()|0,n[o>>2]=l,n[o+4>>2]=0,Nn(l,o)}function Hy(o){o=o|0;var l=0;return l=Jt(8)|0,Zg(l,o),l|0}function Xg(o){o=o|0,o|0&&(jy(o),It(o))}function jy(o){o=o|0;var l=0;pc(n[o>>2]|0),l=o+4|0,o=n[l>>2]|0,n[l>>2]=0,o|0&&(Pf(o),It(o))}function Pf(o){o=o|0,xf(o)}function xf(o){o=o|0,o=n[o>>2]|0,o|0&&Ya(o|0)}function a2(o){return o=o|0,Xa(o)|0}function l2(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Pf(l),It(l)),hc(n[o>>2]|0)}function Gy(o,l){o=o|0,l=l|0,pn(n[o>>2]|0,n[l>>2]|0)}function _L(o,l){o=o|0,l=l|0,Bh(n[o>>2]|0,l)}function HL(o,l,u){o=o|0,l=l|0,u=+u,Dy(n[o>>2]|0,l,y(u))}function qy(o,l,u){o=o|0,l=l|0,u=+u,Py(n[o>>2]|0,l,y(u))}function c2(o,l){o=o|0,l=l|0,Ih(n[o>>2]|0,l)}function u2(o,l){o=o|0,l=l|0,To(n[o>>2]|0,l)}function xr(o,l){o=o|0,l=l|0,wh(n[o>>2]|0,l)}function po(o,l){o=o|0,l=l|0,By(n[o>>2]|0,l)}function Zi(o,l){o=o|0,l=l|0,Og(n[o>>2]|0,l)}function Ms(o,l){o=o|0,l=l|0,Qo(n[o>>2]|0,l)}function tp(o,l,u){o=o|0,l=l|0,u=+u,qA(n[o>>2]|0,l,y(u))}function f2(o,l,u){o=o|0,l=l|0,u=+u,W(n[o>>2]|0,l,y(u))}function bs(o,l){o=o|0,l=l|0,YA(n[o>>2]|0,l)}function Yy(o,l){o=o|0,l=l|0,Sy(n[o>>2]|0,l)}function Fh(o,l){o=o|0,l=l|0,Ro(n[o>>2]|0,l)}function $g(o,l){o=o|0,l=+l,vh(n[o>>2]|0,y(l))}function Nh(o,l){o=o|0,l=+l,Nl(n[o>>2]|0,y(l))}function A2(o,l){o=o|0,l=+l,by(n[o>>2]|0,y(l))}function p2(o,l){o=o|0,l=+l,Mg(n[o>>2]|0,y(l))}function h2(o,l){o=o|0,l=+l,Fl(n[o>>2]|0,y(l))}function d2(o,l){o=o|0,l=+l,Ug(n[o>>2]|0,y(l))}function kf(o,l){o=o|0,l=+l,X1(n[o>>2]|0,y(l))}function sr(o){o=o|0,Sh(n[o>>2]|0)}function Wy(o,l){o=o|0,l=+l,zi(n[o>>2]|0,y(l))}function g2(o,l){o=o|0,l=+l,Cf(n[o>>2]|0,y(l))}function mc(o){o=o|0,$a(n[o>>2]|0)}function Qf(o,l){o=o|0,l=+l,du(n[o>>2]|0,y(l))}function e0(o,l){o=o|0,l=+l,wf(n[o>>2]|0,y(l))}function t0(o,l){o=o|0,l=+l,mi(n[o>>2]|0,y(l))}function m2(o,l){o=o|0,l=+l,WA(n[o>>2]|0,y(l))}function y2(o,l){o=o|0,l=+l,ya(n[o>>2]|0,y(l))}function Cu(o,l){o=o|0,l=+l,tl(n[o>>2]|0,y(l))}function r0(o,l){o=o|0,l=+l,bh(n[o>>2]|0,y(l))}function E2(o,l){o=o|0,l=+l,jg(n[o>>2]|0,y(l))}function Vy(o,l){o=o|0,l=+l,VA(n[o>>2]|0,y(l))}function wu(o,l,u){o=o|0,l=l|0,u=+u,hu(n[o>>2]|0,l,y(u))}function Ky(o,l,u){o=o|0,l=l|0,u=+u,Fo(n[o>>2]|0,l,y(u))}function n0(o,l,u){o=o|0,l=l|0,u=+u,If(n[o>>2]|0,l,y(u))}function i0(o){return o=o|0,Ng(n[o>>2]|0)|0}function Lo(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;A=I,I=I+16|0,g=A,GA(g,n[l>>2]|0,u),Ds(o,g),I=A}function Ds(o,l){o=o|0,l=l|0,_l(o,n[l+4>>2]|0,+y(h[l>>2]))}function _l(o,l,u){o=o|0,l=l|0,u=+u,n[o>>2]=l,E[o+8>>3]=u}function Jy(o){return o=o|0,Z1(n[o>>2]|0)|0}function Ca(o){return o=o|0,Ch(n[o>>2]|0)|0}function BP(o){return o=o|0,pu(n[o>>2]|0)|0}function Oh(o){return o=o|0,z1(n[o>>2]|0)|0}function I2(o){return o=o|0,Lg(n[o>>2]|0)|0}function jL(o){return o=o|0,vy(n[o>>2]|0)|0}function vP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;A=I,I=I+16|0,g=A,xt(g,n[l>>2]|0,u),Ds(o,g),I=A}function SP(o){return o=o|0,Ef(n[o>>2]|0)|0}function zy(o){return o=o|0,Rl(n[o>>2]|0)|0}function C2(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,jA(A,n[l>>2]|0),Ds(o,A),I=u}function Lh(o){return o=o|0,+ +y(ui(n[o>>2]|0))}function bP(o){return o=o|0,+ +y(qi(n[o>>2]|0))}function DP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,ur(A,n[l>>2]|0),Ds(o,A),I=u}function s0(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,_g(A,n[l>>2]|0),Ds(o,A),I=u}function qL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Bt(A,n[l>>2]|0),Ds(o,A),I=u}function YL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,el(A,n[l>>2]|0),Ds(o,A),I=u}function PP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Hg(A,n[l>>2]|0),Ds(o,A),I=u}function xP(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,ky(A,n[l>>2]|0),Ds(o,A),I=u}function rp(o){return o=o|0,+ +y(Gg(n[o>>2]|0))}function WL(o,l){return o=o|0,l=l|0,+ +y(xy(n[o>>2]|0,l))}function VL(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;A=I,I=I+16|0,g=A,yt(g,n[l>>2]|0,u),Ds(o,g),I=A}function Bu(o,l,u){o=o|0,l=l|0,u=u|0,lr(n[o>>2]|0,n[l>>2]|0,u)}function KL(o,l){o=o|0,l=l|0,yf(n[o>>2]|0,n[l>>2]|0)}function kP(o){return o=o|0,Mi(n[o>>2]|0)|0}function JL(o){return o=o|0,o=Et(n[o>>2]|0)|0,o?o=a2(o)|0:o=0,o|0}function QP(o,l){return o=o|0,l=l|0,o=vs(n[o>>2]|0,l)|0,o?o=a2(o)|0:o=0,o|0}function Tf(o,l){o=o|0,l=l|0;var u=0,A=0;A=Jt(4)|0,TP(A,l),u=o+4|0,l=n[u>>2]|0,n[u>>2]=A,l|0&&(Pf(l),It(l)),St(n[o>>2]|0,1)}function TP(o,l){o=o|0,l=l|0,$L(o,l)}function zL(o,l,u,A,g,m){o=o|0,l=l|0,u=y(u),A=A|0,g=y(g),m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,RP(k,Xa(l)|0,+u,A,+g,m),h[o>>2]=y(+E[k>>3]),h[o+4>>2]=y(+E[k+8>>3]),I=B}function RP(o,l,u,A,g,m){o=o|0,l=l|0,u=+u,A=A|0,g=+g,m=m|0;var B=0,k=0,T=0,M=0,L=0;B=I,I=I+32|0,L=B+8|0,M=B+20|0,T=B,k=B+16|0,E[L>>3]=u,n[M>>2]=A,E[T>>3]=g,n[k>>2]=m,Zy(o,n[l+4>>2]|0,L,M,T,k),I=B}function Zy(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,jl(k),l=Us(l)|0,FP(o,l,+E[u>>3],n[A>>2]|0,+E[g>>3],n[m>>2]|0),Gl(k),I=B}function Us(o){return o=o|0,n[o>>2]|0}function FP(o,l,u,A,g,m){o=o|0,l=l|0,u=+u,A=A|0,g=+g,m=m|0;var B=0;B=wa(w2()|0)|0,u=+nl(u),A=Xy(A)|0,g=+nl(g),ZL(o,Xn(0,B|0,l|0,+u,A|0,+g,Xy(m)|0)|0)}function w2(){var o=0;return s[7608]|0||(v2(9120),o=7608,n[o>>2]=1,n[o+4>>2]=0),9120}function wa(o){return o=o|0,n[o+8>>2]|0}function nl(o){return o=+o,+ +Rf(o)}function Xy(o){return o=o|0,o0(o)|0}function ZL(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;g=I,I=I+32|0,u=g,A=l,A&1?(il(u,0),qa(A|0,u|0)|0,B2(o,u),XL(u)):(n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]),I=g}function il(o,l){o=o|0,l=l|0,vu(o,l),n[o+8>>2]=0,s[o+24>>0]=0}function B2(o,l){o=o|0,l=l|0,l=l+8|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]}function XL(o){o=o|0,s[o+24>>0]=0}function vu(o,l){o=o|0,l=l|0,n[o>>2]=l}function o0(o){return o=o|0,o|0}function Rf(o){return o=+o,+o}function v2(o){o=o|0,Mo(o,S2()|0,4)}function S2(){return 1064}function Mo(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=Gi(l|0,u+1|0)|0}function $L(o,l){o=o|0,l=l|0,l=n[l>>2]|0,n[o>>2]=l,au(l|0)}function NP(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Pf(l),It(l)),St(n[o>>2]|0,0)}function OP(o){o=o|0,Dt(n[o>>2]|0)}function $y(o){return o=o|0,tr(n[o>>2]|0)|0}function eM(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,JA(n[o>>2]|0,y(l),y(u),A)}function tM(o){return o=o|0,+ +y(gu(n[o>>2]|0))}function v(o){return o=o|0,+ +y(Bf(n[o>>2]|0))}function b(o){return o=o|0,+ +y(mu(n[o>>2]|0))}function Q(o){return o=o|0,+ +y(Os(n[o>>2]|0))}function j(o){return o=o|0,+ +y(yu(n[o>>2]|0))}function V(o){return o=o|0,+ +y(Yn(n[o>>2]|0))}function ne(o,l){o=o|0,l=l|0,E[o>>3]=+y(gu(n[l>>2]|0)),E[o+8>>3]=+y(Bf(n[l>>2]|0)),E[o+16>>3]=+y(mu(n[l>>2]|0)),E[o+24>>3]=+y(Os(n[l>>2]|0)),E[o+32>>3]=+y(yu(n[l>>2]|0)),E[o+40>>3]=+y(Yn(n[l>>2]|0))}function Be(o,l){return o=o|0,l=l|0,+ +y(os(n[o>>2]|0,l))}function _e(o,l){return o=o|0,l=l|0,+ +y(xi(n[o>>2]|0,l))}function ht(o,l){return o=o|0,l=l|0,+ +y(KA(n[o>>2]|0,l))}function Wt(){return Fn()|0}function Sr(){Mr(),Xt(),$n(),Ei(),sl(),rt()}function Mr(){IUe(11713,4938,1)}function Xt(){UMe(10448)}function $n(){IMe(10408)}function Ei(){GLe(10324)}function sl(){ZNe(10096)}function rt(){Ye(9132)}function Ye(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0,At=0,He=0,We=0,Mt=0,qr=0,fr=0,$t=0,Fr=0,jr=0,cr=0,Gn=0,Uo=0,_o=0,Ho=0,al=0,Wh=0,Vh=0,yc=0,Kh=0,Of=0,Lf=0,Jh=0,zh=0,Zh=0,ln=0,Ec=0,Xh=0,Du=0,$h=0,ed=0,Mf=0,Uf=0,Pu=0,ho=0,Yl=0,Ba=0,Ic=0,cp=0,up=0,_f=0,fp=0,Ap=0,go=0,Hs=0,Cc=0,Vn=0,pp=0,jo=0,xu=0,Go=0,ku=0,hp=0,dp=0,Qu=0,mo=0,wc=0,gp=0,mp=0,yp=0,Or=0,Ai=0,js=0,qo=0,yo=0,Ur=0,Ar=0,Bc=0;l=I,I=I+672|0,u=l+656|0,Bc=l+648|0,Ar=l+640|0,Ur=l+632|0,yo=l+624|0,qo=l+616|0,js=l+608|0,Ai=l+600|0,Or=l+592|0,yp=l+584|0,mp=l+576|0,gp=l+568|0,wc=l+560|0,mo=l+552|0,Qu=l+544|0,dp=l+536|0,hp=l+528|0,ku=l+520|0,Go=l+512|0,xu=l+504|0,jo=l+496|0,pp=l+488|0,Vn=l+480|0,Cc=l+472|0,Hs=l+464|0,go=l+456|0,Ap=l+448|0,fp=l+440|0,_f=l+432|0,up=l+424|0,cp=l+416|0,Ic=l+408|0,Ba=l+400|0,Yl=l+392|0,ho=l+384|0,Pu=l+376|0,Uf=l+368|0,Mf=l+360|0,ed=l+352|0,$h=l+344|0,Du=l+336|0,Xh=l+328|0,Ec=l+320|0,ln=l+312|0,Zh=l+304|0,zh=l+296|0,Jh=l+288|0,Lf=l+280|0,Of=l+272|0,Kh=l+264|0,yc=l+256|0,Vh=l+248|0,Wh=l+240|0,al=l+232|0,Ho=l+224|0,_o=l+216|0,Uo=l+208|0,Gn=l+200|0,cr=l+192|0,jr=l+184|0,Fr=l+176|0,$t=l+168|0,fr=l+160|0,qr=l+152|0,Mt=l+144|0,We=l+136|0,He=l+128|0,At=l+120|0,Xe=l+112|0,nt=l+104|0,Re=l+96|0,Le=l+88|0,Ve=l+80|0,oe=l+72|0,q=l+64|0,L=l+56|0,M=l+48|0,T=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,g=l+8|0,A=l,gt(o,3646),Zt(o,3651,2)|0,br(o,3665,2)|0,ri(o,3682,18)|0,n[Bc>>2]=19,n[Bc+4>>2]=0,n[u>>2]=n[Bc>>2],n[u+4>>2]=n[Bc+4>>2],Tr(o,3690,u)|0,n[Ar>>2]=1,n[Ar+4>>2]=0,n[u>>2]=n[Ar>>2],n[u+4>>2]=n[Ar+4>>2],On(o,3696,u)|0,n[Ur>>2]=2,n[Ur+4>>2]=0,n[u>>2]=n[Ur>>2],n[u+4>>2]=n[Ur+4>>2],jn(o,3706,u)|0,n[yo>>2]=1,n[yo+4>>2]=0,n[u>>2]=n[yo>>2],n[u+4>>2]=n[yo+4>>2],Zr(o,3722,u)|0,n[qo>>2]=2,n[qo+4>>2]=0,n[u>>2]=n[qo>>2],n[u+4>>2]=n[qo+4>>2],Zr(o,3734,u)|0,n[js>>2]=3,n[js+4>>2]=0,n[u>>2]=n[js>>2],n[u+4>>2]=n[js+4>>2],jn(o,3753,u)|0,n[Ai>>2]=4,n[Ai+4>>2]=0,n[u>>2]=n[Ai>>2],n[u+4>>2]=n[Ai+4>>2],jn(o,3769,u)|0,n[Or>>2]=5,n[Or+4>>2]=0,n[u>>2]=n[Or>>2],n[u+4>>2]=n[Or+4>>2],jn(o,3783,u)|0,n[yp>>2]=6,n[yp+4>>2]=0,n[u>>2]=n[yp>>2],n[u+4>>2]=n[yp+4>>2],jn(o,3796,u)|0,n[mp>>2]=7,n[mp+4>>2]=0,n[u>>2]=n[mp>>2],n[u+4>>2]=n[mp+4>>2],jn(o,3813,u)|0,n[gp>>2]=8,n[gp+4>>2]=0,n[u>>2]=n[gp>>2],n[u+4>>2]=n[gp+4>>2],jn(o,3825,u)|0,n[wc>>2]=3,n[wc+4>>2]=0,n[u>>2]=n[wc>>2],n[u+4>>2]=n[wc+4>>2],Zr(o,3843,u)|0,n[mo>>2]=4,n[mo+4>>2]=0,n[u>>2]=n[mo>>2],n[u+4>>2]=n[mo+4>>2],Zr(o,3853,u)|0,n[Qu>>2]=9,n[Qu+4>>2]=0,n[u>>2]=n[Qu>>2],n[u+4>>2]=n[Qu+4>>2],jn(o,3870,u)|0,n[dp>>2]=10,n[dp+4>>2]=0,n[u>>2]=n[dp>>2],n[u+4>>2]=n[dp+4>>2],jn(o,3884,u)|0,n[hp>>2]=11,n[hp+4>>2]=0,n[u>>2]=n[hp>>2],n[u+4>>2]=n[hp+4>>2],jn(o,3896,u)|0,n[ku>>2]=1,n[ku+4>>2]=0,n[u>>2]=n[ku>>2],n[u+4>>2]=n[ku+4>>2],fi(o,3907,u)|0,n[Go>>2]=2,n[Go+4>>2]=0,n[u>>2]=n[Go>>2],n[u+4>>2]=n[Go+4>>2],fi(o,3915,u)|0,n[xu>>2]=3,n[xu+4>>2]=0,n[u>>2]=n[xu>>2],n[u+4>>2]=n[xu+4>>2],fi(o,3928,u)|0,n[jo>>2]=4,n[jo+4>>2]=0,n[u>>2]=n[jo>>2],n[u+4>>2]=n[jo+4>>2],fi(o,3948,u)|0,n[pp>>2]=5,n[pp+4>>2]=0,n[u>>2]=n[pp>>2],n[u+4>>2]=n[pp+4>>2],fi(o,3960,u)|0,n[Vn>>2]=6,n[Vn+4>>2]=0,n[u>>2]=n[Vn>>2],n[u+4>>2]=n[Vn+4>>2],fi(o,3974,u)|0,n[Cc>>2]=7,n[Cc+4>>2]=0,n[u>>2]=n[Cc>>2],n[u+4>>2]=n[Cc+4>>2],fi(o,3983,u)|0,n[Hs>>2]=20,n[Hs+4>>2]=0,n[u>>2]=n[Hs>>2],n[u+4>>2]=n[Hs+4>>2],Tr(o,3999,u)|0,n[go>>2]=8,n[go+4>>2]=0,n[u>>2]=n[go>>2],n[u+4>>2]=n[go+4>>2],fi(o,4012,u)|0,n[Ap>>2]=9,n[Ap+4>>2]=0,n[u>>2]=n[Ap>>2],n[u+4>>2]=n[Ap+4>>2],fi(o,4022,u)|0,n[fp>>2]=21,n[fp+4>>2]=0,n[u>>2]=n[fp>>2],n[u+4>>2]=n[fp+4>>2],Tr(o,4039,u)|0,n[_f>>2]=10,n[_f+4>>2]=0,n[u>>2]=n[_f>>2],n[u+4>>2]=n[_f+4>>2],fi(o,4053,u)|0,n[up>>2]=11,n[up+4>>2]=0,n[u>>2]=n[up>>2],n[u+4>>2]=n[up+4>>2],fi(o,4065,u)|0,n[cp>>2]=12,n[cp+4>>2]=0,n[u>>2]=n[cp>>2],n[u+4>>2]=n[cp+4>>2],fi(o,4084,u)|0,n[Ic>>2]=13,n[Ic+4>>2]=0,n[u>>2]=n[Ic>>2],n[u+4>>2]=n[Ic+4>>2],fi(o,4097,u)|0,n[Ba>>2]=14,n[Ba+4>>2]=0,n[u>>2]=n[Ba>>2],n[u+4>>2]=n[Ba+4>>2],fi(o,4117,u)|0,n[Yl>>2]=15,n[Yl+4>>2]=0,n[u>>2]=n[Yl>>2],n[u+4>>2]=n[Yl+4>>2],fi(o,4129,u)|0,n[ho>>2]=16,n[ho+4>>2]=0,n[u>>2]=n[ho>>2],n[u+4>>2]=n[ho+4>>2],fi(o,4148,u)|0,n[Pu>>2]=17,n[Pu+4>>2]=0,n[u>>2]=n[Pu>>2],n[u+4>>2]=n[Pu+4>>2],fi(o,4161,u)|0,n[Uf>>2]=18,n[Uf+4>>2]=0,n[u>>2]=n[Uf>>2],n[u+4>>2]=n[Uf+4>>2],fi(o,4181,u)|0,n[Mf>>2]=5,n[Mf+4>>2]=0,n[u>>2]=n[Mf>>2],n[u+4>>2]=n[Mf+4>>2],Zr(o,4196,u)|0,n[ed>>2]=6,n[ed+4>>2]=0,n[u>>2]=n[ed>>2],n[u+4>>2]=n[ed+4>>2],Zr(o,4206,u)|0,n[$h>>2]=7,n[$h+4>>2]=0,n[u>>2]=n[$h>>2],n[u+4>>2]=n[$h+4>>2],Zr(o,4217,u)|0,n[Du>>2]=3,n[Du+4>>2]=0,n[u>>2]=n[Du>>2],n[u+4>>2]=n[Du+4>>2],Su(o,4235,u)|0,n[Xh>>2]=1,n[Xh+4>>2]=0,n[u>>2]=n[Xh>>2],n[u+4>>2]=n[Xh+4>>2],rM(o,4251,u)|0,n[Ec>>2]=4,n[Ec+4>>2]=0,n[u>>2]=n[Ec>>2],n[u+4>>2]=n[Ec+4>>2],Su(o,4263,u)|0,n[ln>>2]=5,n[ln+4>>2]=0,n[u>>2]=n[ln>>2],n[u+4>>2]=n[ln+4>>2],Su(o,4279,u)|0,n[Zh>>2]=6,n[Zh+4>>2]=0,n[u>>2]=n[Zh>>2],n[u+4>>2]=n[Zh+4>>2],Su(o,4293,u)|0,n[zh>>2]=7,n[zh+4>>2]=0,n[u>>2]=n[zh>>2],n[u+4>>2]=n[zh+4>>2],Su(o,4306,u)|0,n[Jh>>2]=8,n[Jh+4>>2]=0,n[u>>2]=n[Jh>>2],n[u+4>>2]=n[Jh+4>>2],Su(o,4323,u)|0,n[Lf>>2]=9,n[Lf+4>>2]=0,n[u>>2]=n[Lf>>2],n[u+4>>2]=n[Lf+4>>2],Su(o,4335,u)|0,n[Of>>2]=2,n[Of+4>>2]=0,n[u>>2]=n[Of>>2],n[u+4>>2]=n[Of+4>>2],rM(o,4353,u)|0,n[Kh>>2]=12,n[Kh+4>>2]=0,n[u>>2]=n[Kh>>2],n[u+4>>2]=n[Kh+4>>2],a0(o,4363,u)|0,n[yc>>2]=1,n[yc+4>>2]=0,n[u>>2]=n[yc>>2],n[u+4>>2]=n[yc+4>>2],np(o,4376,u)|0,n[Vh>>2]=2,n[Vh+4>>2]=0,n[u>>2]=n[Vh>>2],n[u+4>>2]=n[Vh+4>>2],np(o,4388,u)|0,n[Wh>>2]=13,n[Wh+4>>2]=0,n[u>>2]=n[Wh>>2],n[u+4>>2]=n[Wh+4>>2],a0(o,4402,u)|0,n[al>>2]=14,n[al+4>>2]=0,n[u>>2]=n[al>>2],n[u+4>>2]=n[al+4>>2],a0(o,4411,u)|0,n[Ho>>2]=15,n[Ho+4>>2]=0,n[u>>2]=n[Ho>>2],n[u+4>>2]=n[Ho+4>>2],a0(o,4421,u)|0,n[_o>>2]=16,n[_o+4>>2]=0,n[u>>2]=n[_o>>2],n[u+4>>2]=n[_o+4>>2],a0(o,4433,u)|0,n[Uo>>2]=17,n[Uo+4>>2]=0,n[u>>2]=n[Uo>>2],n[u+4>>2]=n[Uo+4>>2],a0(o,4446,u)|0,n[Gn>>2]=18,n[Gn+4>>2]=0,n[u>>2]=n[Gn>>2],n[u+4>>2]=n[Gn+4>>2],a0(o,4458,u)|0,n[cr>>2]=3,n[cr+4>>2]=0,n[u>>2]=n[cr>>2],n[u+4>>2]=n[cr+4>>2],np(o,4471,u)|0,n[jr>>2]=1,n[jr+4>>2]=0,n[u>>2]=n[jr>>2],n[u+4>>2]=n[jr+4>>2],LP(o,4486,u)|0,n[Fr>>2]=10,n[Fr+4>>2]=0,n[u>>2]=n[Fr>>2],n[u+4>>2]=n[Fr+4>>2],Su(o,4496,u)|0,n[$t>>2]=11,n[$t+4>>2]=0,n[u>>2]=n[$t>>2],n[u+4>>2]=n[$t+4>>2],Su(o,4508,u)|0,n[fr>>2]=3,n[fr+4>>2]=0,n[u>>2]=n[fr>>2],n[u+4>>2]=n[fr+4>>2],rM(o,4519,u)|0,n[qr>>2]=4,n[qr+4>>2]=0,n[u>>2]=n[qr>>2],n[u+4>>2]=n[qr+4>>2],PPe(o,4530,u)|0,n[Mt>>2]=19,n[Mt+4>>2]=0,n[u>>2]=n[Mt>>2],n[u+4>>2]=n[Mt+4>>2],xPe(o,4542,u)|0,n[We>>2]=12,n[We+4>>2]=0,n[u>>2]=n[We>>2],n[u+4>>2]=n[We+4>>2],kPe(o,4554,u)|0,n[He>>2]=13,n[He+4>>2]=0,n[u>>2]=n[He>>2],n[u+4>>2]=n[He+4>>2],QPe(o,4568,u)|0,n[At>>2]=2,n[At+4>>2]=0,n[u>>2]=n[At>>2],n[u+4>>2]=n[At+4>>2],TPe(o,4578,u)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[u>>2]=n[Xe>>2],n[u+4>>2]=n[Xe+4>>2],RPe(o,4587,u)|0,n[nt>>2]=22,n[nt+4>>2]=0,n[u>>2]=n[nt>>2],n[u+4>>2]=n[nt+4>>2],Tr(o,4602,u)|0,n[Re>>2]=23,n[Re+4>>2]=0,n[u>>2]=n[Re>>2],n[u+4>>2]=n[Re+4>>2],Tr(o,4619,u)|0,n[Le>>2]=14,n[Le+4>>2]=0,n[u>>2]=n[Le>>2],n[u+4>>2]=n[Le+4>>2],FPe(o,4629,u)|0,n[Ve>>2]=1,n[Ve+4>>2]=0,n[u>>2]=n[Ve>>2],n[u+4>>2]=n[Ve+4>>2],NPe(o,4637,u)|0,n[oe>>2]=4,n[oe+4>>2]=0,n[u>>2]=n[oe>>2],n[u+4>>2]=n[oe+4>>2],np(o,4653,u)|0,n[q>>2]=5,n[q+4>>2]=0,n[u>>2]=n[q>>2],n[u+4>>2]=n[q+4>>2],np(o,4669,u)|0,n[L>>2]=6,n[L+4>>2]=0,n[u>>2]=n[L>>2],n[u+4>>2]=n[L+4>>2],np(o,4686,u)|0,n[M>>2]=7,n[M+4>>2]=0,n[u>>2]=n[M>>2],n[u+4>>2]=n[M+4>>2],np(o,4701,u)|0,n[T>>2]=8,n[T+4>>2]=0,n[u>>2]=n[T>>2],n[u+4>>2]=n[T+4>>2],np(o,4719,u)|0,n[k>>2]=9,n[k+4>>2]=0,n[u>>2]=n[k>>2],n[u+4>>2]=n[k+4>>2],np(o,4736,u)|0,n[B>>2]=21,n[B+4>>2]=0,n[u>>2]=n[B>>2],n[u+4>>2]=n[B+4>>2],OPe(o,4754,u)|0,n[m>>2]=2,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],LP(o,4772,u)|0,n[g>>2]=3,n[g+4>>2]=0,n[u>>2]=n[g>>2],n[u+4>>2]=n[g+4>>2],LP(o,4790,u)|0,n[A>>2]=4,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],LP(o,4808,u)|0,I=l}function gt(o,l){o=o|0,l=l|0;var u=0;u=jNe()|0,n[o>>2]=u,GNe(u,l),Gh(n[o>>2]|0)}function Zt(o,l,u){return o=o|0,l=l|0,u=u|0,PNe(o,bn(l)|0,u,0),o|0}function br(o,l,u){return o=o|0,l=l|0,u=u|0,ANe(o,bn(l)|0,u,0),o|0}function ri(o,l,u){return o=o|0,l=l|0,u=u|0,XFe(o,bn(l)|0,u,0),o|0}function Tr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],OFe(o,l,g),I=A,o|0}function On(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],mFe(o,l,g),I=A,o|0}function jn(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],tFe(o,l,g),I=A,o|0}function Zr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],URe(o,l,g),I=A,o|0}function fi(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],BRe(o,l,g),I=A,o|0}function Su(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],aRe(o,l,g),I=A,o|0}function rM(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],YTe(o,l,g),I=A,o|0}function a0(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],mTe(o,l,g),I=A,o|0}function np(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],tTe(o,l,g),I=A,o|0}function LP(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],UQe(o,l,g),I=A,o|0}function PPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],BQe(o,l,g),I=A,o|0}function xPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],aQe(o,l,g),I=A,o|0}function kPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Wke(o,l,g),I=A,o|0}function QPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Qke(o,l,g),I=A,o|0}function TPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],hke(o,l,g),I=A,o|0}function RPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Zxe(o,l,g),I=A,o|0}function FPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Nxe(o,l,g),I=A,o|0}function NPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],mxe(o,l,g),I=A,o|0}function OPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],LPe(o,l,g),I=A,o|0}function LPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],MPe(o,u,g,1),I=A}function bn(o){return o=o|0,o|0}function MPe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=nM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=UPe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,_Pe(m,A)|0,A),I=g}function nM(){var o=0,l=0;if(s[7616]|0||(ZJ(9136),gr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9136)|0)){o=9136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));ZJ(9136)}return 9136}function UPe(o){return o=o|0,0}function _Pe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=nM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],zJ(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(GPe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Dn(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0;B=I,I=I+32|0,oe=B+24|0,q=B+20|0,T=B+16|0,L=B+12|0,M=B+8|0,k=B+4|0,Ve=B,n[q>>2]=l,n[T>>2]=u,n[L>>2]=A,n[M>>2]=g,n[k>>2]=m,m=o+28|0,n[Ve>>2]=n[m>>2],n[oe>>2]=n[Ve>>2],HPe(o+24|0,oe,q,L,M,T,k)|0,n[m>>2]=n[n[m>>2]>>2],I=B}function HPe(o,l,u,A,g,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,B=B|0,o=jPe(l)|0,l=Jt(24)|0,JJ(l+4|0,n[u>>2]|0,n[A>>2]|0,n[g>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[o>>2],n[o>>2]=l,l|0}function jPe(o){return o=o|0,n[o>>2]|0}function JJ(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=g,n[o+16>>2]=m}function Ir(o,l){return o=o|0,l=l|0,l|o|0}function zJ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function GPe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=qPe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,YPe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],zJ(m,A,u),n[T>>2]=(n[T>>2]|0)+12,WPe(o,k),VPe(k),I=M;return}}function qPe(o){return o=o|0,357913941}function YPe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function WPe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VPe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function ZJ(o){o=o|0,zPe(o)}function KPe(o){o=o|0,JPe(o+24|0)}function Hr(o){return o=o|0,n[o>>2]|0}function JPe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function zPe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,3,l,ZPe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function tn(){return 9228}function ZPe(){return 1140}function XPe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=$Pe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=exe(l,A)|0,I=u,l|0}function rn(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=g,n[o+16>>2]=m}function $Pe(o){return o=o|0,(n[(nM()|0)+24>>2]|0)+(o*12|0)|0}function exe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;return g=I,I=I+48|0,A=g,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),lp[u&31](A,o),A=txe(A)|0,I=g,A|0}function txe(o){o=o|0;var l=0,u=0,A=0,g=0;return g=I,I=I+32|0,l=g+12|0,u=g,A=iM(XJ()|0)|0,A?(sM(l,A),oM(u,l),rxe(o,u),o=aM(l)|0):o=nxe(o)|0,I=g,o|0}function XJ(){var o=0;return s[7632]|0||(pxe(9184),gr(25,9184,U|0)|0,o=7632,n[o>>2]=1,n[o+4>>2]=0),9184}function iM(o){return o=o|0,n[o+36>>2]|0}function sM(o,l){o=o|0,l=l|0,n[o>>2]=l,n[o+4>>2]=o,n[o+8>>2]=0}function oM(o,l){o=o|0,l=l|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=0}function rxe(o,l){o=o|0,l=l|0,axe(l,o,o+8|0,o+16|0,o+24|0,o+32|0,o+40|0)|0}function aM(o){return o=o|0,n[(n[o+4>>2]|0)+8>>2]|0}function nxe(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0;T=I,I=I+16|0,u=T+4|0,A=T,g=Hl(8)|0,m=g,B=Jt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[o>>2],k=k+4|0,o=o+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Jt(8)|0,B=n[l>>2]|0,n[A>>2]=0,n[u>>2]=n[A>>2],$J(k,B,u),n[g>>2]=k,I=T,m|0}function $J(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Jt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1092,n[u+12>>2]=l,n[o+4>>2]=u}function ixe(o){o=o|0,sE(o),It(o)}function sxe(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function oxe(o){o=o|0,It(o)}function axe(o,l,u,A,g,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,B=B|0,m=lxe(n[o>>2]|0,l,u,A,g,m,B)|0,B=o+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function lxe(o,l,u,A,g,m,B){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,B=B|0;var k=0,T=0;return k=I,I=I+16|0,T=k,jl(T),o=Us(o)|0,B=cxe(o,+E[l>>3],+E[u>>3],+E[A>>3],+E[g>>3],+E[m>>3],+E[B>>3])|0,Gl(T),I=k,B|0}function cxe(o,l,u,A,g,m,B){o=o|0,l=+l,u=+u,A=+A,g=+g,m=+m,B=+B;var k=0;return k=wa(uxe()|0)|0,l=+nl(l),u=+nl(u),A=+nl(A),g=+nl(g),m=+nl(m),uo(0,k|0,o|0,+l,+u,+A,+g,+m,+ +nl(B))|0}function uxe(){var o=0;return s[7624]|0||(fxe(9172),o=7624,n[o>>2]=1,n[o+4>>2]=0),9172}function fxe(o){o=o|0,Mo(o,Axe()|0,6)}function Axe(){return 1112}function pxe(o){o=o|0,Mh(o)}function hxe(o){o=o|0,ez(o+24|0),tz(o+16|0)}function ez(o){o=o|0,gxe(o)}function tz(o){o=o|0,dxe(o)}function dxe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function gxe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function Mh(o){o=o|0;var l=0;n[o+16>>2]=0,n[o+20>>2]=0,l=o+24|0,n[l>>2]=0,n[o+28>>2]=l,n[o+36>>2]=0,s[o+40>>0]=0,s[o+41>>0]=0}function mxe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],yxe(o,u,g,0),I=A}function yxe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=lM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=Exe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,Ixe(m,A)|0,A),I=g}function lM(){var o=0,l=0;if(s[7640]|0||(nz(9232),gr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9232)|0)){o=9232,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));nz(9232)}return 9232}function Exe(o){return o=o|0,0}function Ixe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=lM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],rz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(Cxe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function rz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function Cxe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=wxe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,Bxe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],rz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,vxe(o,k),Sxe(k),I=M;return}}function wxe(o){return o=o|0,357913941}function Bxe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function vxe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Sxe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function nz(o){o=o|0,Pxe(o)}function bxe(o){o=o|0,Dxe(o+24|0)}function Dxe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function Pxe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,xxe()|0,3),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function xxe(){return 1144}function kxe(o,l,u,A,g){o=o|0,l=l|0,u=+u,A=+A,g=g|0;var m=0,B=0,k=0,T=0;m=I,I=I+16|0,B=m+8|0,k=m,T=Qxe(o)|0,o=n[T+4>>2]|0,n[k>>2]=n[T>>2],n[k+4>>2]=o,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],Txe(l,B,u,A,g),I=m}function Qxe(o){return o=o|0,(n[(lM()|0)+24>>2]|0)+(o*12|0)|0}function Txe(o,l,u,A,g){o=o|0,l=l|0,u=+u,A=+A,g=g|0;var m=0,B=0,k=0,T=0,M=0;M=I,I=I+16|0,B=M+2|0,k=M+1|0,T=M,m=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(m=n[(n[o>>2]|0)+m>>2]|0),Ff(B,u),u=+Nf(B,u),Ff(k,A),A=+Nf(k,A),ip(T,g),T=sp(T,g)|0,yX[m&1](o,u,A,T),I=M}function Ff(o,l){o=o|0,l=+l}function Nf(o,l){return o=o|0,l=+l,+ +Fxe(l)}function ip(o,l){o=o|0,l=l|0}function sp(o,l){return o=o|0,l=l|0,Rxe(l)|0}function Rxe(o){return o=o|0,o|0}function Fxe(o){return o=+o,+o}function Nxe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Oxe(o,u,g,1),I=A}function Oxe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=cM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=Lxe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,Mxe(m,A)|0,A),I=g}function cM(){var o=0,l=0;if(s[7648]|0||(sz(9268),gr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9268)|0)){o=9268,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));sz(9268)}return 9268}function Lxe(o){return o=o|0,0}function Mxe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=cM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],iz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(Uxe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function iz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function Uxe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=_xe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,Hxe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],iz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,jxe(o,k),Gxe(k),I=M;return}}function _xe(o){return o=o|0,357913941}function Hxe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function jxe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Gxe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function sz(o){o=o|0,Wxe(o)}function qxe(o){o=o|0,Yxe(o+24|0)}function Yxe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function Wxe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,4,l,Vxe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Vxe(){return 1160}function Kxe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=Jxe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=zxe(l,A)|0,I=u,l|0}function Jxe(o){return o=o|0,(n[(cM()|0)+24>>2]|0)+(o*12|0)|0}function zxe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),oz(g0[u&31](o)|0)|0}function oz(o){return o=o|0,o&1|0}function Zxe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Xxe(o,u,g,0),I=A}function Xxe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=uM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=$xe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,eke(m,A)|0,A),I=g}function uM(){var o=0,l=0;if(s[7656]|0||(lz(9304),gr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9304)|0)){o=9304,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));lz(9304)}return 9304}function $xe(o){return o=o|0,0}function eke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=uM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],az(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(tke(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function az(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function tke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=rke(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,nke(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],az(m,A,u),n[T>>2]=(n[T>>2]|0)+12,ike(o,k),ske(k),I=M;return}}function rke(o){return o=o|0,357913941}function nke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function ike(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ske(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function lz(o){o=o|0,lke(o)}function oke(o){o=o|0,ake(o+24|0)}function ake(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function lke(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,cke()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function cke(){return 1164}function uke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=fke(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Ake(l,g,u),I=A}function fke(o){return o=o|0,(n[(uM()|0)+24>>2]|0)+(o*12|0)|0}function Ake(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Uh(g,u),u=_h(g,u)|0,lp[A&31](o,u),Hh(g),I=m}function Uh(o,l){o=o|0,l=l|0,pke(o,l)}function _h(o,l){return o=o|0,l=l|0,o|0}function Hh(o){o=o|0,Pf(o)}function pke(o,l){o=o|0,l=l|0,fM(o,l)}function fM(o,l){o=o|0,l=l|0,n[o>>2]=l}function hke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],dke(o,u,g,0),I=A}function dke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=AM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=gke(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,mke(m,A)|0,A),I=g}function AM(){var o=0,l=0;if(s[7664]|0||(uz(9340),gr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9340)|0)){o=9340,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));uz(9340)}return 9340}function gke(o){return o=o|0,0}function mke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=AM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],cz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(yke(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function cz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function yke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=Eke(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,Ike(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],cz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,Cke(o,k),wke(k),I=M;return}}function Eke(o){return o=o|0,357913941}function Ike(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function Cke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function wke(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function uz(o){o=o|0,Ske(o)}function Bke(o){o=o|0,vke(o+24|0)}function vke(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function Ske(o){o=o|0;var l=0;l=tn()|0,rn(o,2,4,l,bke()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function bke(){return 1180}function Dke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=Pke(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],u=xke(l,g,u)|0,I=A,u|0}function Pke(o){return o=o|0,(n[(AM()|0)+24>>2]|0)+(o*12|0)|0}function xke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;return m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),l0(g,u),g=c0(g,u)|0,g=MP(lU[A&15](o,g)|0)|0,I=m,g|0}function l0(o,l){o=o|0,l=l|0}function c0(o,l){return o=o|0,l=l|0,kke(l)|0}function MP(o){return o=o|0,o|0}function kke(o){return o=o|0,o|0}function Qke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Tke(o,u,g,0),I=A}function Tke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=pM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=Rke(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,Fke(m,A)|0,A),I=g}function pM(){var o=0,l=0;if(s[7672]|0||(Az(9376),gr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9376)|0)){o=9376,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Az(9376)}return 9376}function Rke(o){return o=o|0,0}function Fke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=pM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],fz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(Nke(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function fz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function Nke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=Oke(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,Lke(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],fz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,Mke(o,k),Uke(k),I=M;return}}function Oke(o){return o=o|0,357913941}function Lke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function Mke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Uke(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Az(o){o=o|0,jke(o)}function _ke(o){o=o|0,Hke(o+24|0)}function Hke(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function jke(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,pz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function pz(){return 1196}function Gke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=qke(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=Yke(l,A)|0,I=u,l|0}function qke(o){return o=o|0,(n[(pM()|0)+24>>2]|0)+(o*12|0)|0}function Yke(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),MP(g0[u&31](o)|0)|0}function Wke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],Vke(o,u,g,1),I=A}function Vke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=hM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=Kke(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,Jke(m,A)|0,A),I=g}function hM(){var o=0,l=0;if(s[7680]|0||(dz(9412),gr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9412)|0)){o=9412,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));dz(9412)}return 9412}function Kke(o){return o=o|0,0}function Jke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=hM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],hz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(zke(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function hz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function zke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=Zke(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,Xke(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],hz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,$ke(o,k),eQe(k),I=M;return}}function Zke(o){return o=o|0,357913941}function Xke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function $ke(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function eQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function dz(o){o=o|0,nQe(o)}function tQe(o){o=o|0,rQe(o+24|0)}function rQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function nQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,gz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function gz(){return 1200}function iQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=sQe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=oQe(l,A)|0,I=u,l|0}function sQe(o){return o=o|0,(n[(hM()|0)+24>>2]|0)+(o*12|0)|0}function oQe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),UP(g0[u&31](o)|0)|0}function UP(o){return o=o|0,o|0}function aQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],lQe(o,u,g,0),I=A}function lQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=dM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,uQe(m,A)|0,A),I=g}function dM(){var o=0,l=0;if(s[7688]|0||(yz(9448),gr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9448)|0)){o=9448,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));yz(9448)}return 9448}function cQe(o){return o=o|0,0}function uQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=dM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],mz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function mz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=AQe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,pQe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],mz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,hQe(o,k),dQe(k),I=M;return}}function AQe(o){return o=o|0,357913941}function pQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function hQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function dQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function yz(o){o=o|0,yQe(o)}function gQe(o){o=o|0,mQe(o+24|0)}function mQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,Ez()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Ez(){return 1204}function EQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=IQe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],CQe(l,g,u),I=A}function IQe(o){return o=o|0,(n[(dM()|0)+24>>2]|0)+(o*12|0)|0}function CQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),gM(g,u),g=mM(g,u)|0,lp[A&31](o,g),I=m}function gM(o,l){o=o|0,l=l|0}function mM(o,l){return o=o|0,l=l|0,wQe(l)|0}function wQe(o){return o=o|0,o|0}function BQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],vQe(o,u,g,0),I=A}function vQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=yM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=SQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,bQe(m,A)|0,A),I=g}function yM(){var o=0,l=0;if(s[7696]|0||(Cz(9484),gr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9484)|0)){o=9484,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Cz(9484)}return 9484}function SQe(o){return o=o|0,0}function bQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=yM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Iz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(DQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Iz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function DQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=PQe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,xQe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Iz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,kQe(o,k),QQe(k),I=M;return}}function PQe(o){return o=o|0,357913941}function xQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function kQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function QQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Cz(o){o=o|0,FQe(o)}function TQe(o){o=o|0,RQe(o+24|0)}function RQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function FQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,NQe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function NQe(){return 1212}function OQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+16|0,m=g+8|0,B=g,k=LQe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],MQe(l,m,u,A),I=g}function LQe(o){return o=o|0,(n[(yM()|0)+24>>2]|0)+(o*12|0)|0}function MQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,g=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(g=n[(n[o>>2]|0)+g>>2]|0),gM(m,u),m=mM(m,u)|0,l0(B,A),B=c0(B,A)|0,T2[g&15](o,m,B),I=k}function UQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],_Qe(o,u,g,1),I=A}function _Qe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=EM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=HQe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,jQe(m,A)|0,A),I=g}function EM(){var o=0,l=0;if(s[7704]|0||(Bz(9520),gr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9520)|0)){o=9520,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Bz(9520)}return 9520}function HQe(o){return o=o|0,0}function jQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=EM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],wz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(GQe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function wz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function GQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=qQe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,YQe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],wz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,WQe(o,k),VQe(k),I=M;return}}function qQe(o){return o=o|0,357913941}function YQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function WQe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Bz(o){o=o|0,zQe(o)}function KQe(o){o=o|0,JQe(o+24|0)}function JQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function zQe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,ZQe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ZQe(){return 1224}function XQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;return g=I,I=I+16|0,m=g+8|0,B=g,k=$Qe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],A=+eTe(l,m,u),I=g,+A}function $Qe(o){return o=o|0,(n[(EM()|0)+24>>2]|0)+(o*12|0)|0}function eTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ip(g,u),g=sp(g,u)|0,B=+Rf(+IX[A&7](o,g)),I=m,+B}function tTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],rTe(o,u,g,1),I=A}function rTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=IM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=nTe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,iTe(m,A)|0,A),I=g}function IM(){var o=0,l=0;if(s[7712]|0||(Sz(9556),gr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9556)|0)){o=9556,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Sz(9556)}return 9556}function nTe(o){return o=o|0,0}function iTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=IM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],vz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(sTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function vz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function sTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=oTe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,aTe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],vz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,lTe(o,k),cTe(k),I=M;return}}function oTe(o){return o=o|0,357913941}function aTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function lTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function cTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Sz(o){o=o|0,ATe(o)}function uTe(o){o=o|0,fTe(o+24|0)}function fTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function ATe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,pTe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function pTe(){return 1232}function hTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=dTe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],u=+gTe(l,g),I=A,+u}function dTe(o){return o=o|0,(n[(IM()|0)+24>>2]|0)+(o*12|0)|0}function gTe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),+ +Rf(+EX[u&15](o))}function mTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],yTe(o,u,g,1),I=A}function yTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=CM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=ETe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,ITe(m,A)|0,A),I=g}function CM(){var o=0,l=0;if(s[7720]|0||(Dz(9592),gr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9592)|0)){o=9592,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Dz(9592)}return 9592}function ETe(o){return o=o|0,0}function ITe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=CM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],bz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(CTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function bz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function CTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=wTe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,BTe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],bz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,vTe(o,k),STe(k),I=M;return}}function wTe(o){return o=o|0,357913941}function BTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function vTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function STe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Dz(o){o=o|0,PTe(o)}function bTe(o){o=o|0,DTe(o+24|0)}function DTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function PTe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,7,l,xTe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function xTe(){return 1276}function kTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=QTe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=TTe(l,A)|0,I=u,l|0}function QTe(o){return o=o|0,(n[(CM()|0)+24>>2]|0)+(o*12|0)|0}function TTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;return g=I,I=I+16|0,A=g,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),lp[u&31](A,o),A=Pz(A)|0,I=g,A|0}function Pz(o){o=o|0;var l=0,u=0,A=0,g=0;return g=I,I=I+32|0,l=g+12|0,u=g,A=iM(xz()|0)|0,A?(sM(l,A),oM(u,l),RTe(o,u),o=aM(l)|0):o=FTe(o)|0,I=g,o|0}function xz(){var o=0;return s[7736]|0||(qTe(9640),gr(25,9640,U|0)|0,o=7736,n[o>>2]=1,n[o+4>>2]=0),9640}function RTe(o,l){o=o|0,l=l|0,MTe(l,o,o+8|0)|0}function FTe(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0;return u=I,I=I+16|0,g=u+4|0,B=u,A=Hl(8)|0,l=A,k=Jt(16)|0,n[k>>2]=n[o>>2],n[k+4>>2]=n[o+4>>2],n[k+8>>2]=n[o+8>>2],n[k+12>>2]=n[o+12>>2],m=l+4|0,n[m>>2]=k,o=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],wM(o,m,g),n[A>>2]=o,I=u,l|0}function wM(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Jt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1244,n[u+12>>2]=l,n[o+4>>2]=u}function NTe(o){o=o|0,sE(o),It(o)}function OTe(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function LTe(o){o=o|0,It(o)}function MTe(o,l,u){return o=o|0,l=l|0,u=u|0,l=UTe(n[o>>2]|0,l,u)|0,u=o+4|0,n[(n[u>>2]|0)+8>>2]=l,n[(n[u>>2]|0)+8>>2]|0}function UTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;return A=I,I=I+16|0,g=A,jl(g),o=Us(o)|0,u=_Te(o,n[l>>2]|0,+E[u>>3])|0,Gl(g),I=A,u|0}function _Te(o,l,u){o=o|0,l=l|0,u=+u;var A=0;return A=wa(HTe()|0)|0,l=Xy(l)|0,ou(0,A|0,o|0,l|0,+ +nl(u))|0}function HTe(){var o=0;return s[7728]|0||(jTe(9628),o=7728,n[o>>2]=1,n[o+4>>2]=0),9628}function jTe(o){o=o|0,Mo(o,GTe()|0,2)}function GTe(){return 1264}function qTe(o){o=o|0,Mh(o)}function YTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],WTe(o,u,g,1),I=A}function WTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=BM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=VTe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,KTe(m,A)|0,A),I=g}function BM(){var o=0,l=0;if(s[7744]|0||(Qz(9684),gr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9684)|0)){o=9684,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Qz(9684)}return 9684}function VTe(o){return o=o|0,0}function KTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=BM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],kz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(JTe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function kz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function JTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=zTe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,ZTe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],kz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,XTe(o,k),$Te(k),I=M;return}}function zTe(o){return o=o|0,357913941}function ZTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function XTe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function $Te(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Qz(o){o=o|0,rRe(o)}function eRe(o){o=o|0,tRe(o+24|0)}function tRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function rRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,5,l,nRe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function nRe(){return 1280}function iRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=sRe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],u=oRe(l,g,u)|0,I=A,u|0}function sRe(o){return o=o|0,(n[(BM()|0)+24>>2]|0)+(o*12|0)|0}function oRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return B=I,I=I+32|0,g=B,m=B+16|0,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ip(m,u),m=sp(m,u)|0,T2[A&15](g,o,m),m=Pz(g)|0,I=B,m|0}function aRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],lRe(o,u,g,1),I=A}function lRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=vM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,uRe(m,A)|0,A),I=g}function vM(){var o=0,l=0;if(s[7752]|0||(Rz(9720),gr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9720)|0)){o=9720,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Rz(9720)}return 9720}function cRe(o){return o=o|0,0}function uRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=vM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Tz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Tz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=ARe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,pRe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Tz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,hRe(o,k),dRe(k),I=M;return}}function ARe(o){return o=o|0,357913941}function pRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function hRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function dRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Rz(o){o=o|0,yRe(o)}function gRe(o){o=o|0,mRe(o+24|0)}function mRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,ERe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ERe(){return 1288}function IRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;return u=I,I=I+16|0,A=u+8|0,g=u,m=CRe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],l=wRe(l,A)|0,I=u,l|0}function CRe(o){return o=o|0,(n[(vM()|0)+24>>2]|0)+(o*12|0)|0}function wRe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),o0(g0[u&31](o)|0)|0}function BRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],vRe(o,u,g,0),I=A}function vRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=SM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=SRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,bRe(m,A)|0,A),I=g}function SM(){var o=0,l=0;if(s[7760]|0||(Nz(9756),gr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9756)|0)){o=9756,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Nz(9756)}return 9756}function SRe(o){return o=o|0,0}function bRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=SM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Fz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(DRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Fz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function DRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=PRe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,xRe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Fz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,kRe(o,k),QRe(k),I=M;return}}function PRe(o){return o=o|0,357913941}function xRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function kRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function QRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Nz(o){o=o|0,FRe(o)}function TRe(o){o=o|0,RRe(o+24|0)}function RRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function FRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,NRe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function NRe(){return 1292}function ORe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=LRe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],MRe(l,g,u),I=A}function LRe(o){return o=o|0,(n[(SM()|0)+24>>2]|0)+(o*12|0)|0}function MRe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,g=0,m=0;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Ff(g,u),u=+Nf(g,u),gX[A&31](o,u),I=m}function URe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],_Re(o,u,g,0),I=A}function _Re(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=bM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=HRe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,jRe(m,A)|0,A),I=g}function bM(){var o=0,l=0;if(s[7768]|0||(Lz(9792),gr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9792)|0)){o=9792,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Lz(9792)}return 9792}function HRe(o){return o=o|0,0}function jRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=bM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Oz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(GRe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Oz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function GRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=qRe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,YRe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Oz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,WRe(o,k),VRe(k),I=M;return}}function qRe(o){return o=o|0,357913941}function YRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function WRe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Lz(o){o=o|0,zRe(o)}function KRe(o){o=o|0,JRe(o+24|0)}function JRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function zRe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,1,l,ZRe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ZRe(){return 1300}function XRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var g=0,m=0,B=0,k=0;g=I,I=I+16|0,m=g+8|0,B=g,k=$Re(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],eFe(l,m,u,A),I=g}function $Re(o){return o=o|0,(n[(bM()|0)+24>>2]|0)+(o*12|0)|0}function eFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var g=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,g=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(g=n[(n[o>>2]|0)+g>>2]|0),ip(m,u),m=sp(m,u)|0,Ff(B,A),A=+Nf(B,A),vX[g&15](o,m,A),I=k}function tFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],rFe(o,u,g,0),I=A}function rFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=DM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=nFe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,iFe(m,A)|0,A),I=g}function DM(){var o=0,l=0;if(s[7776]|0||(Uz(9828),gr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9828)|0)){o=9828,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Uz(9828)}return 9828}function nFe(o){return o=o|0,0}function iFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=DM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Mz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(sFe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Mz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function sFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=oFe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,aFe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Mz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,lFe(o,k),cFe(k),I=M;return}}function oFe(o){return o=o|0,357913941}function aFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function lFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function cFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Uz(o){o=o|0,AFe(o)}function uFe(o){o=o|0,fFe(o+24|0)}function fFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function AFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,7,l,pFe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function pFe(){return 1312}function hFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=dFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],gFe(l,g,u),I=A}function dFe(o){return o=o|0,(n[(DM()|0)+24>>2]|0)+(o*12|0)|0}function gFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ip(g,u),g=sp(g,u)|0,lp[A&31](o,g),I=m}function mFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],yFe(o,u,g,0),I=A}function yFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=PM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=EFe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,IFe(m,A)|0,A),I=g}function PM(){var o=0,l=0;if(s[7784]|0||(Hz(9864),gr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9864)|0)){o=9864,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Hz(9864)}return 9864}function EFe(o){return o=o|0,0}function IFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=PM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],_z(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(CFe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function _z(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function CFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=wFe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,BFe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],_z(m,A,u),n[T>>2]=(n[T>>2]|0)+12,vFe(o,k),SFe(k),I=M;return}}function wFe(o){return o=o|0,357913941}function BFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function vFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function SFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Hz(o){o=o|0,PFe(o)}function bFe(o){o=o|0,DFe(o+24|0)}function DFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function PFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,8,l,xFe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function xFe(){return 1320}function kFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=QFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],TFe(l,g,u),I=A}function QFe(o){return o=o|0,(n[(PM()|0)+24>>2]|0)+(o*12|0)|0}function TFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),RFe(g,u),g=FFe(g,u)|0,lp[A&31](o,g),I=m}function RFe(o,l){o=o|0,l=l|0}function FFe(o,l){return o=o|0,l=l|0,NFe(l)|0}function NFe(o){return o=o|0,o|0}function OFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],LFe(o,u,g,0),I=A}function LFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=xM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=MFe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,UFe(m,A)|0,A),I=g}function xM(){var o=0,l=0;if(s[7792]|0||(Gz(9900),gr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9900)|0)){o=9900,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Gz(9900)}return 9900}function MFe(o){return o=o|0,0}function UFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=xM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],jz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(_Fe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function jz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function _Fe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=HFe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,jFe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],jz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,GFe(o,k),qFe(k),I=M;return}}function HFe(o){return o=o|0,357913941}function jFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function GFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function qFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Gz(o){o=o|0,VFe(o)}function YFe(o){o=o|0,WFe(o+24|0)}function WFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function VFe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,22,l,KFe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function KFe(){return 1344}function JFe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0;u=I,I=I+16|0,A=u+8|0,g=u,m=zFe(o)|0,o=n[m+4>>2]|0,n[g>>2]=n[m>>2],n[g+4>>2]=o,n[A>>2]=n[g>>2],n[A+4>>2]=n[g+4>>2],ZFe(l,A),I=u}function zFe(o){return o=o|0,(n[(xM()|0)+24>>2]|0)+(o*12|0)|0}function ZFe(o,l){o=o|0,l=l|0;var u=0;u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),ap[u&127](o)}function XFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=kM()|0,o=$Fe(u)|0,Dn(m,l,g,o,eNe(u,A)|0,A)}function kM(){var o=0,l=0;if(s[7800]|0||(Yz(9936),gr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9936)|0)){o=9936,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Yz(9936)}return 9936}function $Fe(o){return o=o|0,o|0}function eNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=kM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(qz(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(tNe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function qz(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function tNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=rNe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,nNe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,qz(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,iNe(o,g),sNe(g),I=k;return}}function rNe(o){return o=o|0,536870911}function nNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function iNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function sNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function Yz(o){o=o|0,lNe(o)}function oNe(o){o=o|0,aNe(o+24|0)}function aNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function lNe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,23,l,Ez()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function cNe(o,l){o=o|0,l=l|0,fNe(n[(uNe(o)|0)>>2]|0,l)}function uNe(o){return o=o|0,(n[(kM()|0)+24>>2]|0)+(o<<3)|0}function fNe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,gM(A,l),l=mM(A,l)|0,ap[o&127](l),I=u}function ANe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=QM()|0,o=pNe(u)|0,Dn(m,l,g,o,hNe(u,A)|0,A)}function QM(){var o=0,l=0;if(s[7808]|0||(Vz(9972),gr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Hr(9972)|0)){o=9972,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Vz(9972)}return 9972}function pNe(o){return o=o|0,o|0}function hNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=QM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(Wz(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(dNe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function Wz(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function dNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=gNe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,mNe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,Wz(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,yNe(o,g),ENe(g),I=k;return}}function gNe(o){return o=o|0,536870911}function mNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function yNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ENe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function Vz(o){o=o|0,wNe(o)}function INe(o){o=o|0,CNe(o+24|0)}function CNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function wNe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,9,l,BNe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function BNe(){return 1348}function vNe(o,l){return o=o|0,l=l|0,bNe(n[(SNe(o)|0)>>2]|0,l)|0}function SNe(o){return o=o|0,(n[(QM()|0)+24>>2]|0)+(o<<3)|0}function bNe(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,Kz(A,l),l=Jz(A,l)|0,l=MP(g0[o&31](l)|0)|0,I=u,l|0}function Kz(o,l){o=o|0,l=l|0}function Jz(o,l){return o=o|0,l=l|0,DNe(l)|0}function DNe(o){return o=o|0,o|0}function PNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=TM()|0,o=xNe(u)|0,Dn(m,l,g,o,kNe(u,A)|0,A)}function TM(){var o=0,l=0;if(s[7816]|0||(Zz(10008),gr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10008)|0)){o=10008,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Zz(10008)}return 10008}function xNe(o){return o=o|0,o|0}function kNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=TM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(zz(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(QNe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function zz(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function QNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=TNe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,RNe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,zz(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,FNe(o,g),NNe(g),I=k;return}}function TNe(o){return o=o|0,536870911}function RNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function FNe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function NNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function Zz(o){o=o|0,MNe(o)}function ONe(o){o=o|0,LNe(o+24|0)}function LNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function MNe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,15,l,pz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function UNe(o){return o=o|0,HNe(n[(_Ne(o)|0)>>2]|0)|0}function _Ne(o){return o=o|0,(n[(TM()|0)+24>>2]|0)+(o<<3)|0}function HNe(o){return o=o|0,MP($P[o&7]()|0)|0}function jNe(){var o=0;return s[7832]|0||(zNe(10052),gr(25,10052,U|0)|0,o=7832,n[o>>2]=1,n[o+4>>2]=0),10052}function GNe(o,l){o=o|0,l=l|0,n[o>>2]=qNe()|0,n[o+4>>2]=YNe()|0,n[o+12>>2]=l,n[o+8>>2]=WNe()|0,n[o+32>>2]=2}function qNe(){return 11709}function YNe(){return 1188}function WNe(){return _P()|0}function VNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(KNe(u),It(u)):l|0&&(jy(l),It(l))}function jh(o,l){return o=o|0,l=l|0,l&o|0}function KNe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function _P(){var o=0;return s[7824]|0||(n[2511]=JNe()|0,n[2512]=0,o=7824,n[o>>2]=1,n[o+4>>2]=0),10044}function JNe(){return 0}function zNe(o){o=o|0,Mh(o)}function ZNe(o){o=o|0;var l=0,u=0,A=0,g=0,m=0;l=I,I=I+32|0,u=l+24|0,m=l+16|0,g=l+8|0,A=l,XNe(o,4827),$Ne(o,4834,3)|0,eOe(o,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],tOe(o,4841,u)|0,n[g>>2]=1,n[g+4>>2]=0,n[u>>2]=n[g>>2],n[u+4>>2]=n[g+4>>2],rOe(o,4871,u)|0,n[A>>2]=10,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],nOe(o,4891,u)|0,I=l}function XNe(o,l){o=o|0,l=l|0;var u=0;u=NLe()|0,n[o>>2]=u,OLe(u,l),Gh(n[o>>2]|0)}function $Ne(o,l,u){return o=o|0,l=l|0,u=u|0,ELe(o,bn(l)|0,u,0),o|0}function eOe(o,l,u){return o=o|0,l=l|0,u=u|0,iLe(o,bn(l)|0,u,0),o|0}function tOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],UOe(o,l,g),I=A,o|0}function rOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],IOe(o,l,g),I=A,o|0}function nOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],iOe(o,l,g),I=A,o|0}function iOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],sOe(o,u,g,1),I=A}function sOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=RM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=oOe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,aOe(m,A)|0,A),I=g}function RM(){var o=0,l=0;if(s[7840]|0||($z(10100),gr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10100)|0)){o=10100,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));$z(10100)}return 10100}function oOe(o){return o=o|0,0}function aOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=RM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],Xz(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(lOe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Xz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function lOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=cOe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,uOe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Xz(m,A,u),n[T>>2]=(n[T>>2]|0)+12,fOe(o,k),AOe(k),I=M;return}}function cOe(o){return o=o|0,357913941}function uOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function fOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function AOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function $z(o){o=o|0,dOe(o)}function pOe(o){o=o|0,hOe(o+24|0)}function hOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function dOe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,6,l,gOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function gOe(){return 1364}function mOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;return A=I,I=I+16|0,g=A+8|0,m=A,B=yOe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],u=EOe(l,g,u)|0,I=A,u|0}function yOe(o){return o=o|0,(n[(RM()|0)+24>>2]|0)+(o*12|0)|0}function EOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;return m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ip(g,u),g=sp(g,u)|0,g=oz(lU[A&15](o,g)|0)|0,I=m,g|0}function IOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],COe(o,u,g,0),I=A}function COe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=FM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=wOe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,BOe(m,A)|0,A),I=g}function FM(){var o=0,l=0;if(s[7848]|0||(tZ(10136),gr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10136)|0)){o=10136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));tZ(10136)}return 10136}function wOe(o){return o=o|0,0}function BOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=FM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],eZ(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(vOe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function eZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function vOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=SOe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,bOe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],eZ(m,A,u),n[T>>2]=(n[T>>2]|0)+12,DOe(o,k),POe(k),I=M;return}}function SOe(o){return o=o|0,357913941}function bOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function DOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function POe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function tZ(o){o=o|0,QOe(o)}function xOe(o){o=o|0,kOe(o+24|0)}function kOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function QOe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,9,l,TOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function TOe(){return 1372}function ROe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,g=A+8|0,m=A,B=FOe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],NOe(l,g,u),I=A}function FOe(o){return o=o|0,(n[(FM()|0)+24>>2]|0)+(o*12|0)|0}function NOe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,g=0,m=0,B=$e;m=I,I=I+16|0,g=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),OOe(g,u),B=y(LOe(g,u)),dX[A&1](o,B),I=m}function OOe(o,l){o=o|0,l=+l}function LOe(o,l){return o=o|0,l=+l,y(MOe(l))}function MOe(o){return o=+o,y(o)}function UOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,g=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[g>>2]=n[m>>2],n[g+4>>2]=n[m+4>>2],_Oe(o,u,g,0),I=A}function _Oe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0,T=0,M=0,L=0;g=I,I=I+32|0,m=g+16|0,L=g+8|0,k=g,M=n[u>>2]|0,T=n[u+4>>2]|0,B=n[o>>2]|0,o=NM()|0,n[L>>2]=M,n[L+4>>2]=T,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=HOe(m)|0,n[k>>2]=M,n[k+4>>2]=T,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],Dn(B,l,o,u,jOe(m,A)|0,A),I=g}function NM(){var o=0,l=0;if(s[7856]|0||(nZ(10172),gr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10172)|0)){o=10172,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));nZ(10172)}return 10172}function HOe(o){return o=o|0,0}function jOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0;return L=I,I=I+32|0,g=L+24|0,B=L+16|0,k=L,T=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=NM()|0,M=q+24|0,o=Ir(l,4)|0,n[T>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[g>>2]=n[B>>2],n[g+4>>2]=n[B+4>>2],rZ(u,g,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(GOe(M,k,T),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function rZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function GOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,T=o+4|0,g=(((n[T>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=qOe(o)|0,m>>>0>>0)an(o);else{L=n[o>>2]|0,oe=((n[o+8>>2]|0)-L|0)/12|0,q=oe<<1,YOe(k,oe>>>0>>1>>>0?q>>>0>>0?g:q:m,((n[T>>2]|0)-L|0)/12|0,o+8|0),T=k+8|0,m=n[T>>2]|0,g=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=g,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],rZ(m,A,u),n[T>>2]=(n[T>>2]|0)+12,WOe(o,k),VOe(k),I=M;return}}function qOe(o){return o=o|0,357913941}function YOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Ot();else{g=Jt(l*12|0)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l*12|0)}function WOe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((g|0)/-12|0)*12|0)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function nZ(o){o=o|0,zOe(o)}function KOe(o){o=o|0,JOe(o+24|0)}function JOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function zOe(o){o=o|0;var l=0;l=tn()|0,rn(o,2,3,l,ZOe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ZOe(){return 1380}function XOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+16|0,m=g+8|0,B=g,k=$Oe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],eLe(l,m,u,A),I=g}function $Oe(o){return o=o|0,(n[(NM()|0)+24>>2]|0)+(o*12|0)|0}function eLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,g=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(g=n[(n[o>>2]|0)+g>>2]|0),ip(m,u),m=sp(m,u)|0,tLe(B,A),B=rLe(B,A)|0,T2[g&15](o,m,B),I=k}function tLe(o,l){o=o|0,l=l|0}function rLe(o,l){return o=o|0,l=l|0,nLe(l)|0}function nLe(o){return o=o|0,(o|0)!=0|0}function iLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=OM()|0,o=sLe(u)|0,Dn(m,l,g,o,oLe(u,A)|0,A)}function OM(){var o=0,l=0;if(s[7864]|0||(sZ(10208),gr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10208)|0)){o=10208,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));sZ(10208)}return 10208}function sLe(o){return o=o|0,o|0}function oLe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=OM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(iZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(aLe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function iZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function aLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=lLe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,cLe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,iZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,uLe(o,g),fLe(g),I=k;return}}function lLe(o){return o=o|0,536870911}function cLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function uLe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function fLe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function sZ(o){o=o|0,hLe(o)}function ALe(o){o=o|0,pLe(o+24|0)}function pLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function hLe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,24,l,dLe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function dLe(){return 1392}function gLe(o,l){o=o|0,l=l|0,yLe(n[(mLe(o)|0)>>2]|0,l)}function mLe(o){return o=o|0,(n[(OM()|0)+24>>2]|0)+(o<<3)|0}function yLe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Kz(A,l),l=Jz(A,l)|0,ap[o&127](l),I=u}function ELe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=LM()|0,o=ILe(u)|0,Dn(m,l,g,o,CLe(u,A)|0,A)}function LM(){var o=0,l=0;if(s[7872]|0||(aZ(10244),gr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10244)|0)){o=10244,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));aZ(10244)}return 10244}function ILe(o){return o=o|0,o|0}function CLe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=LM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(oZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(wLe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function oZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function wLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=BLe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,vLe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,oZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,SLe(o,g),bLe(g),I=k;return}}function BLe(o){return o=o|0,536870911}function vLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function SLe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function bLe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function aZ(o){o=o|0,xLe(o)}function DLe(o){o=o|0,PLe(o+24|0)}function PLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function xLe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,16,l,kLe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function kLe(){return 1400}function QLe(o){return o=o|0,RLe(n[(TLe(o)|0)>>2]|0)|0}function TLe(o){return o=o|0,(n[(LM()|0)+24>>2]|0)+(o<<3)|0}function RLe(o){return o=o|0,FLe($P[o&7]()|0)|0}function FLe(o){return o=o|0,o|0}function NLe(){var o=0;return s[7880]|0||(jLe(10280),gr(25,10280,U|0)|0,o=7880,n[o>>2]=1,n[o+4>>2]=0),10280}function OLe(o,l){o=o|0,l=l|0,n[o>>2]=LLe()|0,n[o+4>>2]=MLe()|0,n[o+12>>2]=l,n[o+8>>2]=ULe()|0,n[o+32>>2]=4}function LLe(){return 11711}function MLe(){return 1356}function ULe(){return _P()|0}function _Le(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(HLe(u),It(u)):l|0&&(zg(l),It(l))}function HLe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function jLe(o){o=o|0,Mh(o)}function GLe(o){o=o|0,qLe(o,4920),YLe(o)|0,WLe(o)|0}function qLe(o,l){o=o|0,l=l|0;var u=0;u=xz()|0,n[o>>2]=u,pMe(u,l),Gh(n[o>>2]|0)}function YLe(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,nMe()|0),o|0}function WLe(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,VLe()|0),o|0}function VLe(){var o=0;return s[7888]|0||(lZ(10328),gr(53,10328,U|0)|0,o=7888,n[o>>2]=1,n[o+4>>2]=0),Hr(10328)|0||lZ(10328),10328}function u0(o,l){o=o|0,l=l|0,Dn(o,0,l,0,0,0)}function lZ(o){o=o|0,zLe(o),f0(o,10)}function KLe(o){o=o|0,JLe(o+24|0)}function JLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function zLe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,1,l,eMe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ZLe(o,l,u){o=o|0,l=l|0,u=+u,XLe(o,l,u)}function f0(o,l){o=o|0,l=l|0,n[o+20>>2]=l}function XLe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+16|0,m=A+8|0,k=A+13|0,g=A,B=A+12|0,ip(k,l),n[m>>2]=sp(k,l)|0,Ff(B,u),E[g>>3]=+Nf(B,u),$Le(o,m,g),I=A}function $Le(o,l,u){o=o|0,l=l|0,u=u|0,_l(o+8|0,n[l>>2]|0,+E[u>>3]),s[o+24>>0]=1}function eMe(){return 1404}function tMe(o,l){return o=o|0,l=+l,rMe(o,l)|0}function rMe(o,l){o=o|0,l=+l;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return A=I,I=I+16|0,m=A+4|0,B=A+8|0,k=A,g=Hl(8)|0,u=g,T=Jt(16)|0,ip(m,o),o=sp(m,o)|0,Ff(B,l),_l(T,o,+Nf(B,l)),B=u+4|0,n[B>>2]=T,o=Jt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],wM(o,B,m),n[g>>2]=o,I=A,u|0}function nMe(){var o=0;return s[7896]|0||(cZ(10364),gr(54,10364,U|0)|0,o=7896,n[o>>2]=1,n[o+4>>2]=0),Hr(10364)|0||cZ(10364),10364}function cZ(o){o=o|0,oMe(o),f0(o,55)}function iMe(o){o=o|0,sMe(o+24|0)}function sMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function oMe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,4,l,uMe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function aMe(o){o=o|0,lMe(o)}function lMe(o){o=o|0,cMe(o)}function cMe(o){o=o|0,uZ(o+8|0),s[o+24>>0]=1}function uZ(o){o=o|0,n[o>>2]=0,E[o+8>>3]=0}function uMe(){return 1424}function fMe(){return AMe()|0}function AMe(){var o=0,l=0,u=0,A=0,g=0,m=0,B=0;return l=I,I=I+16|0,g=l+4|0,B=l,u=Hl(8)|0,o=u,A=Jt(16)|0,uZ(A),m=o+4|0,n[m>>2]=A,A=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],wM(A,m,g),n[u>>2]=A,I=l,o|0}function pMe(o,l){o=o|0,l=l|0,n[o>>2]=hMe()|0,n[o+4>>2]=dMe()|0,n[o+12>>2]=l,n[o+8>>2]=gMe()|0,n[o+32>>2]=5}function hMe(){return 11710}function dMe(){return 1416}function gMe(){return HP()|0}function mMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(yMe(u),It(u)):l|0&&It(l)}function yMe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function HP(){var o=0;return s[7904]|0||(n[2600]=EMe()|0,n[2601]=0,o=7904,n[o>>2]=1,n[o+4>>2]=0),10400}function EMe(){return n[357]|0}function IMe(o){o=o|0,CMe(o,4926),wMe(o)|0}function CMe(o,l){o=o|0,l=l|0;var u=0;u=XJ()|0,n[o>>2]=u,RMe(u,l),Gh(n[o>>2]|0)}function wMe(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,BMe()|0),o|0}function BMe(){var o=0;return s[7912]|0||(fZ(10412),gr(56,10412,U|0)|0,o=7912,n[o>>2]=1,n[o+4>>2]=0),Hr(10412)|0||fZ(10412),10412}function fZ(o){o=o|0,bMe(o),f0(o,57)}function vMe(o){o=o|0,SMe(o+24|0)}function SMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function bMe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,5,l,kMe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function DMe(o){o=o|0,PMe(o)}function PMe(o){o=o|0,xMe(o)}function xMe(o){o=o|0;var l=0,u=0;l=o+8|0,u=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(u|0));s[o+56>>0]=1}function kMe(){return 1432}function QMe(){return TMe()|0}function TMe(){var o=0,l=0,u=0,A=0,g=0,m=0,B=0,k=0;B=I,I=I+16|0,o=B+4|0,l=B,u=Hl(8)|0,A=u,g=Jt(48)|0,m=g,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=A+4|0,n[m>>2]=g,k=Jt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[o>>2]=n[l>>2],$J(k,m,o),n[u>>2]=k,I=B,A|0}function RMe(o,l){o=o|0,l=l|0,n[o>>2]=FMe()|0,n[o+4>>2]=NMe()|0,n[o+12>>2]=l,n[o+8>>2]=OMe()|0,n[o+32>>2]=6}function FMe(){return 11704}function NMe(){return 1436}function OMe(){return HP()|0}function LMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(MMe(u),It(u)):l|0&&It(l)}function MMe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function UMe(o){o=o|0,_Me(o,4933),HMe(o)|0,jMe(o)|0}function _Me(o,l){o=o|0,l=l|0;var u=0;u=AUe()|0,n[o>>2]=u,pUe(u,l),Gh(n[o>>2]|0)}function HMe(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,rUe()|0),o|0}function jMe(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,GMe()|0),o|0}function GMe(){var o=0;return s[7920]|0||(AZ(10452),gr(58,10452,U|0)|0,o=7920,n[o>>2]=1,n[o+4>>2]=0),Hr(10452)|0||AZ(10452),10452}function AZ(o){o=o|0,WMe(o),f0(o,1)}function qMe(o){o=o|0,YMe(o+24|0)}function YMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function WMe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,1,l,zMe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function VMe(o,l,u){o=o|0,l=+l,u=+u,KMe(o,l,u)}function KMe(o,l,u){o=o|0,l=+l,u=+u;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+32|0,m=A+8|0,k=A+17|0,g=A,B=A+16|0,Ff(k,l),E[m>>3]=+Nf(k,l),Ff(B,u),E[g>>3]=+Nf(B,u),JMe(o,m,g),I=A}function JMe(o,l,u){o=o|0,l=l|0,u=u|0,pZ(o+8|0,+E[l>>3],+E[u>>3]),s[o+24>>0]=1}function pZ(o,l,u){o=o|0,l=+l,u=+u,E[o>>3]=l,E[o+8>>3]=u}function zMe(){return 1472}function ZMe(o,l){return o=+o,l=+l,XMe(o,l)|0}function XMe(o,l){o=+o,l=+l;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return A=I,I=I+16|0,B=A+4|0,k=A+8|0,T=A,g=Hl(8)|0,u=g,m=Jt(16)|0,Ff(B,o),o=+Nf(B,o),Ff(k,l),pZ(m,o,+Nf(k,l)),k=u+4|0,n[k>>2]=m,m=Jt(8)|0,k=n[k>>2]|0,n[T>>2]=0,n[B>>2]=n[T>>2],hZ(m,k,B),n[g>>2]=m,I=A,u|0}function hZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Jt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1452,n[u+12>>2]=l,n[o+4>>2]=u}function $Me(o){o=o|0,sE(o),It(o)}function eUe(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function tUe(o){o=o|0,It(o)}function rUe(){var o=0;return s[7928]|0||(dZ(10488),gr(59,10488,U|0)|0,o=7928,n[o>>2]=1,n[o+4>>2]=0),Hr(10488)|0||dZ(10488),10488}function dZ(o){o=o|0,sUe(o),f0(o,60)}function nUe(o){o=o|0,iUe(o+24|0)}function iUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function sUe(o){o=o|0;var l=0;l=tn()|0,rn(o,5,6,l,cUe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function oUe(o){o=o|0,aUe(o)}function aUe(o){o=o|0,lUe(o)}function lUe(o){o=o|0,gZ(o+8|0),s[o+24>>0]=1}function gZ(o){o=o|0,n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,n[o+12>>2]=0}function cUe(){return 1492}function uUe(){return fUe()|0}function fUe(){var o=0,l=0,u=0,A=0,g=0,m=0,B=0;return l=I,I=I+16|0,g=l+4|0,B=l,u=Hl(8)|0,o=u,A=Jt(16)|0,gZ(A),m=o+4|0,n[m>>2]=A,A=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],hZ(A,m,g),n[u>>2]=A,I=l,o|0}function AUe(){var o=0;return s[7936]|0||(EUe(10524),gr(25,10524,U|0)|0,o=7936,n[o>>2]=1,n[o+4>>2]=0),10524}function pUe(o,l){o=o|0,l=l|0,n[o>>2]=hUe()|0,n[o+4>>2]=dUe()|0,n[o+12>>2]=l,n[o+8>>2]=gUe()|0,n[o+32>>2]=7}function hUe(){return 11700}function dUe(){return 1484}function gUe(){return HP()|0}function mUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(yUe(u),It(u)):l|0&&It(l)}function yUe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function EUe(o){o=o|0,Mh(o)}function IUe(o,l,u){o=o|0,l=l|0,u=u|0,o=bn(l)|0,l=CUe(u)|0,u=wUe(u,0)|0,XUe(o,l,u,MM()|0,0)}function CUe(o){return o=o|0,o|0}function wUe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=MM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(yZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(xUe(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function MM(){var o=0,l=0;if(s[7944]|0||(mZ(10568),gr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10568)|0)){o=10568,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));mZ(10568)}return 10568}function mZ(o){o=o|0,SUe(o)}function BUe(o){o=o|0,vUe(o+24|0)}function vUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function SUe(o){o=o|0;var l=0;l=tn()|0,rn(o,1,17,l,gz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function bUe(o){return o=o|0,PUe(n[(DUe(o)|0)>>2]|0)|0}function DUe(o){return o=o|0,(n[(MM()|0)+24>>2]|0)+(o<<3)|0}function PUe(o){return o=o|0,UP($P[o&7]()|0)|0}function yZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function xUe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=kUe(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,QUe(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,yZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,TUe(o,g),RUe(g),I=k;return}}function kUe(o){return o=o|0,536870911}function QUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function TUe(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function RUe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function FUe(){NUe()}function NUe(){OUe(10604)}function OUe(o){o=o|0,LUe(o,4955)}function LUe(o,l){o=o|0,l=l|0;var u=0;u=MUe()|0,n[o>>2]=u,UUe(u,l),Gh(n[o>>2]|0)}function MUe(){var o=0;return s[7952]|0||(KUe(10612),gr(25,10612,U|0)|0,o=7952,n[o>>2]=1,n[o+4>>2]=0),10612}function UUe(o,l){o=o|0,l=l|0,n[o>>2]=GUe()|0,n[o+4>>2]=qUe()|0,n[o+12>>2]=l,n[o+8>>2]=YUe()|0,n[o+32>>2]=8}function Gh(o){o=o|0;var l=0,u=0;l=I,I=I+16|0,u=l,eE()|0,n[u>>2]=o,_Ue(10608,u),I=l}function eE(){return s[11714]|0||(n[2652]=0,gr(62,10608,U|0)|0,s[11714]=1),10608}function _Ue(o,l){o=o|0,l=l|0;var u=0;u=Jt(8)|0,n[u+4>>2]=n[l>>2],n[u>>2]=n[o>>2],n[o>>2]=u}function HUe(o){o=o|0,jUe(o)}function jUe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function GUe(){return 11715}function qUe(){return 1496}function YUe(){return _P()|0}function WUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(VUe(u),It(u)):l|0&&It(l)}function VUe(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function KUe(o){o=o|0,Mh(o)}function JUe(o,l){o=o|0,l=l|0;var u=0,A=0;eE()|0,u=n[2652]|0;e:do if(u|0){for(;A=n[u+4>>2]|0,!(A|0&&!($Z(UM(A)|0,o)|0));)if(u=n[u>>2]|0,!u)break e;zUe(A,l)}while(!1)}function UM(o){return o=o|0,n[o+12>>2]|0}function zUe(o,l){o=o|0,l=l|0;var u=0;o=o+36|0,u=n[o>>2]|0,u|0&&(Pf(u),It(u)),u=Jt(4)|0,TP(u,l),n[o>>2]=u}function _M(){return s[11716]|0||(n[2664]=0,gr(63,10656,U|0)|0,s[11716]=1),10656}function EZ(){var o=0;return s[11717]|0?o=n[2665]|0:(ZUe(),n[2665]=1504,s[11717]=1,o=1504),o|0}function ZUe(){s[11740]|0||(s[11718]=Ir(Ir(8,0)|0,0)|0,s[11719]=Ir(Ir(0,0)|0,0)|0,s[11720]=Ir(Ir(0,16)|0,0)|0,s[11721]=Ir(Ir(8,0)|0,0)|0,s[11722]=Ir(Ir(0,0)|0,0)|0,s[11723]=Ir(Ir(8,0)|0,0)|0,s[11724]=Ir(Ir(0,0)|0,0)|0,s[11725]=Ir(Ir(8,0)|0,0)|0,s[11726]=Ir(Ir(0,0)|0,0)|0,s[11727]=Ir(Ir(8,0)|0,0)|0,s[11728]=Ir(Ir(0,0)|0,0)|0,s[11729]=Ir(Ir(0,0)|0,32)|0,s[11730]=Ir(Ir(0,0)|0,32)|0,s[11740]=1)}function IZ(){return 1572}function XUe(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0,L=0;m=I,I=I+32|0,L=m+16|0,M=m+12|0,T=m+8|0,k=m+4|0,B=m,n[L>>2]=o,n[M>>2]=l,n[T>>2]=u,n[k>>2]=A,n[B>>2]=g,_M()|0,$Ue(10656,L,M,T,k,B),I=m}function $Ue(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0;B=Jt(24)|0,JJ(B+4|0,n[l>>2]|0,n[u>>2]|0,n[A>>2]|0,n[g>>2]|0,n[m>>2]|0),n[B>>2]=n[o>>2],n[o>>2]=B}function CZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0,At=0;if(At=I,I=I+32|0,Le=At+20|0,Re=At+8|0,nt=At+4|0,Xe=At,l=n[l>>2]|0,l|0){Ve=Le+4|0,T=Le+8|0,M=Re+4|0,L=Re+8|0,q=Re+8|0,oe=Le+8|0;do{if(B=l+4|0,k=HM(B)|0,k|0){if(g=b2(k)|0,n[Le>>2]=0,n[Ve>>2]=0,n[T>>2]=0,A=(D2(k)|0)+1|0,e_e(Le,A),A|0)for(;A=A+-1|0,bu(Re,n[g>>2]|0),m=n[Ve>>2]|0,m>>>0<(n[oe>>2]|0)>>>0?(n[m>>2]=n[Re>>2],n[Ve>>2]=(n[Ve>>2]|0)+4):jM(Le,Re),A;)g=g+4|0;A=P2(k)|0,n[Re>>2]=0,n[M>>2]=0,n[L>>2]=0;e:do if(n[A>>2]|0)for(g=0,m=0;;){if((g|0)==(m|0)?t_e(Re,A):(n[g>>2]=n[A>>2],n[M>>2]=(n[M>>2]|0)+4),A=A+4|0,!(n[A>>2]|0))break e;g=n[M>>2]|0,m=n[q>>2]|0}while(!1);n[nt>>2]=jP(B)|0,n[Xe>>2]=Hr(k)|0,r_e(u,o,nt,Xe,Le,Re),GM(Re),op(Le)}l=n[l>>2]|0}while(l|0)}I=At}function HM(o){return o=o|0,n[o+12>>2]|0}function b2(o){return o=o|0,n[o+12>>2]|0}function D2(o){return o=o|0,n[o+16>>2]|0}function e_e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;g=I,I=I+32|0,u=g,A=n[o>>2]|0,(n[o+8>>2]|0)-A>>2>>>0>>0&&(xZ(u,l,(n[o+4>>2]|0)-A>>2,o+8|0),kZ(o,u),QZ(u)),I=g}function jM(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,g=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=PZ(o)|0,m>>>0>>0)an(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,T=M>>1,xZ(u,M>>2>>>0>>1>>>0?T>>>0>>0?g:T:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,kZ(o,u),QZ(u),I=B;return}}function P2(o){return o=o|0,n[o+8>>2]|0}function t_e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,g=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=DZ(o)|0,m>>>0>>0)an(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,T=M>>1,C_e(u,M>>2>>>0>>1>>>0?T>>>0>>0?g:T:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,w_e(o,u),B_e(u),I=B;return}}function jP(o){return o=o|0,n[o>>2]|0}function r_e(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,n_e(o,l,u,A,g,m)}function GM(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function op(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function n_e(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+48|0,L=B+40|0,k=B+32|0,q=B+24|0,T=B+12|0,M=B,jl(k),o=Us(o)|0,n[q>>2]=n[l>>2],u=n[u>>2]|0,A=n[A>>2]|0,qM(T,g),i_e(M,m),n[L>>2]=n[q>>2],s_e(o,L,u,A,T,M),GM(M),op(T),Gl(k),I=B}function qM(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(E_e(o,A),I_e(o,n[l>>2]|0,n[u>>2]|0,A))}function i_e(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(m_e(o,A),y_e(o,n[l>>2]|0,n[u>>2]|0,A))}function s_e(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+32|0,L=B+28|0,q=B+24|0,k=B+12|0,T=B,M=wa(o_e()|0)|0,n[q>>2]=n[l>>2],n[L>>2]=n[q>>2],l=A0(L)|0,u=wZ(u)|0,A=YM(A)|0,n[k>>2]=n[g>>2],L=g+4|0,n[k+4>>2]=n[L>>2],q=g+8|0,n[k+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[g>>2]=0,g=WM(k)|0,n[T>>2]=n[m>>2],L=m+4|0,n[T+4>>2]=n[L>>2],q=m+8|0,n[T+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[m>>2]=0,lu(0,M|0,o|0,l|0,u|0,A|0,g|0,a_e(T)|0)|0,GM(T),op(k),I=B}function o_e(){var o=0;return s[7968]|0||(d_e(10708),o=7968,n[o>>2]=1,n[o+4>>2]=0),10708}function A0(o){return o=o|0,vZ(o)|0}function wZ(o){return o=o|0,BZ(o)|0}function YM(o){return o=o|0,UP(o)|0}function WM(o){return o=o|0,c_e(o)|0}function a_e(o){return o=o|0,l_e(o)|0}function l_e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Hl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=BZ(n[(n[o>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function BZ(o){return o=o|0,o|0}function c_e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Hl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=vZ((n[o>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function vZ(o){o=o|0;var l=0,u=0,A=0,g=0;return g=I,I=I+32|0,l=g+12|0,u=g,A=iM(SZ()|0)|0,A?(sM(l,A),oM(u,l),Y8e(o,u),o=aM(l)|0):o=u_e(o)|0,I=g,o|0}function SZ(){var o=0;return s[7960]|0||(h_e(10664),gr(25,10664,U|0)|0,o=7960,n[o>>2]=1,n[o+4>>2]=0),10664}function u_e(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0;return u=I,I=I+16|0,g=u+4|0,B=u,A=Hl(8)|0,l=A,k=Jt(4)|0,n[k>>2]=n[o>>2],m=l+4|0,n[m>>2]=k,o=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],bZ(o,m,g),n[A>>2]=o,I=u,l|0}function bZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Jt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1656,n[u+12>>2]=l,n[o+4>>2]=u}function f_e(o){o=o|0,sE(o),It(o)}function A_e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function p_e(o){o=o|0,It(o)}function h_e(o){o=o|0,Mh(o)}function d_e(o){o=o|0,Mo(o,g_e()|0,5)}function g_e(){return 1676}function m_e(o,l){o=o|0,l=l|0;var u=0;if((DZ(o)|0)>>>0>>0&&an(o),l>>>0>1073741823)Ot();else{u=Jt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function y_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Rr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function DZ(o){return o=o|0,1073741823}function E_e(o,l){o=o|0,l=l|0;var u=0;if((PZ(o)|0)>>>0>>0&&an(o),l>>>0>1073741823)Ot();else{u=Jt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function I_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Rr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function PZ(o){return o=o|0,1073741823}function C_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Ot();else{g=Jt(l<<2)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<2)}function w_e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>2)<<2)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function B_e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function xZ(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Ot();else{g=Jt(l<<2)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<2)}function kZ(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>2)<<2)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function QZ(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function v_e(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0;if(Re=I,I=I+32|0,L=Re+20|0,q=Re+12|0,M=Re+16|0,oe=Re+4|0,Ve=Re,Le=Re+8|0,k=EZ()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(T=n[k+8>>2]|0,k=n[k+4>>2]|0;bu(L,B),S_e(o,L,k,T),m=m+4|0,B=n[m>>2]|0,B;)T=T+1|0,k=k+1|0;if(m=IZ()|0,B=n[m>>2]|0,B|0)do bu(L,B),n[q>>2]=n[m+4>>2],b_e(l,L,q),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[(eE()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,bu(L,n[(tE(l)|0)>>2]|0),n[q>>2]=UM(l)|0,D_e(u,L,q),m=n[m>>2]|0;while(m|0);if(bu(M,0),m=_M()|0,n[L>>2]=n[M>>2],CZ(L,m,g),m=n[(eE()|0)>>2]|0,m|0){o=L+4|0,l=L+8|0,u=L+8|0;do{if(T=n[m+4>>2]|0,bu(q,n[(tE(T)|0)>>2]|0),P_e(oe,TZ(T)|0),B=n[oe>>2]|0,B|0){n[L>>2]=0,n[o>>2]=0,n[l>>2]=0;do bu(Ve,n[(tE(n[B+4>>2]|0)|0)>>2]|0),k=n[o>>2]|0,k>>>0<(n[u>>2]|0)>>>0?(n[k>>2]=n[Ve>>2],n[o>>2]=(n[o>>2]|0)+4):jM(L,Ve),B=n[B>>2]|0;while(B|0);x_e(A,q,L),op(L)}n[Le>>2]=n[q>>2],M=RZ(T)|0,n[L>>2]=n[Le>>2],CZ(L,M,g),tz(oe),m=n[m>>2]|0}while(m|0)}I=Re}function S_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,H_e(o,l,u,A)}function b_e(o,l,u){o=o|0,l=l|0,u=u|0,__e(o,l,u)}function tE(o){return o=o|0,o|0}function D_e(o,l,u){o=o|0,l=l|0,u=u|0,O_e(o,l,u)}function TZ(o){return o=o|0,o+16|0}function P_e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;if(m=I,I=I+16|0,g=m+8|0,u=m,n[o>>2]=0,A=n[l>>2]|0,n[g>>2]=A,n[u>>2]=o,u=N_e(u)|0,A|0){if(A=Jt(12)|0,B=(FZ(g)|0)+4|0,o=n[B+4>>2]|0,l=A+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=o,l=n[n[g>>2]>>2]|0,n[g>>2]=l,!l)o=A;else for(l=A;o=Jt(12)|0,T=(FZ(g)|0)+4|0,k=n[T+4>>2]|0,B=o+4|0,n[B>>2]=n[T>>2],n[B+4>>2]=k,n[l>>2]=o,B=n[n[g>>2]>>2]|0,n[g>>2]=B,B;)l=o;n[o>>2]=n[u>>2],n[u>>2]=A}I=m}function x_e(o,l,u){o=o|0,l=l|0,u=u|0,k_e(o,l,u)}function RZ(o){return o=o|0,o+24|0}function k_e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+24|0,g=A+16|0,k=A+12|0,m=A,jl(g),o=Us(o)|0,n[k>>2]=n[l>>2],qM(m,u),n[B>>2]=n[k>>2],Q_e(o,B,m),op(m),Gl(g),I=A}function Q_e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+16|0,k=A+12|0,g=A,m=wa(T_e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=A0(B)|0,n[g>>2]=n[u>>2],B=u+4|0,n[g+4>>2]=n[B>>2],k=u+8|0,n[g+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[u>>2]=0,Ns(0,m|0,o|0,l|0,WM(g)|0)|0,op(g),I=A}function T_e(){var o=0;return s[7976]|0||(R_e(10720),o=7976,n[o>>2]=1,n[o+4>>2]=0),10720}function R_e(o){o=o|0,Mo(o,F_e()|0,2)}function F_e(){return 1732}function N_e(o){return o=o|0,n[o>>2]|0}function FZ(o){return o=o|0,n[o>>2]|0}function O_e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,g=A+8|0,B=A,jl(g),o=Us(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],NZ(o,m,u),Gl(g),I=A}function NZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+16|0,m=A+4|0,B=A,g=wa(L_e()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=A0(m)|0,Ns(0,g|0,o|0,l|0,wZ(u)|0)|0,I=A}function L_e(){var o=0;return s[7984]|0||(M_e(10732),o=7984,n[o>>2]=1,n[o+4>>2]=0),10732}function M_e(o){o=o|0,Mo(o,U_e()|0,2)}function U_e(){return 1744}function __e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,g=A+8|0,B=A,jl(g),o=Us(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],NZ(o,m,u),Gl(g),I=A}function H_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+32|0,B=g+16|0,m=g+8|0,k=g,jl(m),o=Us(o)|0,n[k>>2]=n[l>>2],u=s[u>>0]|0,A=s[A>>0]|0,n[B>>2]=n[k>>2],j_e(o,B,u,A),Gl(m),I=g}function j_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+16|0,B=g+4|0,k=g,m=wa(G_e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=A0(B)|0,u=rE(u)|0,Li(0,m|0,o|0,l|0,u|0,rE(A)|0)|0,I=g}function G_e(){var o=0;return s[7992]|0||(Y_e(10744),o=7992,n[o>>2]=1,n[o+4>>2]=0),10744}function rE(o){return o=o|0,q_e(o)|0}function q_e(o){return o=o|0,o&255|0}function Y_e(o){o=o|0,Mo(o,W_e()|0,3)}function W_e(){return 1756}function V_e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;switch(oe=I,I=I+32|0,k=oe+8|0,T=oe+4|0,M=oe+20|0,L=oe,fM(o,0),A=q8e(l)|0,n[k>>2]=0,q=k+4|0,n[q>>2]=0,n[k+8>>2]=0,A<<24>>24){case 0:{s[M>>0]=0,K_e(T,u,M),GP(o,T)|0,xf(T);break}case 8:{q=XM(l)|0,s[M>>0]=8,bu(L,n[q+4>>2]|0),J_e(T,u,M,L,q+8|0),GP(o,T)|0,xf(T);break}case 9:{if(m=XM(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,g=m+12|0;l=l+-1|0,bu(T,n[g>>2]|0),A=n[q>>2]|0,A>>>0<(n[B>>2]|0)>>>0?(n[A>>2]=n[T>>2],n[q>>2]=(n[q>>2]|0)+4):jM(k,T),l;)g=g+4|0;s[M>>0]=9,bu(L,n[m+8>>2]|0),z_e(T,u,M,L,k),GP(o,T)|0,xf(T);break}default:q=XM(l)|0,s[M>>0]=A,bu(L,n[q+4>>2]|0),Z_e(T,u,M,L),GP(o,T)|0,xf(T)}op(k),I=oe}function K_e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;A=I,I=I+16|0,g=A,jl(g),l=Us(l)|0,u4e(o,l,s[u>>0]|0),Gl(g),I=A}function GP(o,l){o=o|0,l=l|0;var u=0;return u=n[o>>2]|0,u|0&&Ya(u|0),n[o>>2]=n[l>>2],n[l>>2]=0,o|0}function J_e(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0;m=I,I=I+32|0,k=m+16|0,B=m+8|0,T=m,jl(B),l=Us(l)|0,u=s[u>>0]|0,n[T>>2]=n[A>>2],g=n[g>>2]|0,n[k>>2]=n[T>>2],o4e(o,l,u,k,g),Gl(B),I=m}function z_e(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0;m=I,I=I+32|0,T=m+24|0,B=m+16|0,M=m+12|0,k=m,jl(B),l=Us(l)|0,u=s[u>>0]|0,n[M>>2]=n[A>>2],qM(k,g),n[T>>2]=n[M>>2],r4e(o,l,u,T,k),op(k),Gl(B),I=m}function Z_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+32|0,B=g+16|0,m=g+8|0,k=g,jl(m),l=Us(l)|0,u=s[u>>0]|0,n[k>>2]=n[A>>2],n[B>>2]=n[k>>2],X_e(o,l,u,B),Gl(m),I=g}function X_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0,B=0,k=0;g=I,I=I+16|0,m=g+4|0,k=g,B=wa($_e()|0)|0,u=rE(u)|0,n[k>>2]=n[A>>2],n[m>>2]=n[k>>2],qP(o,Ns(0,B|0,l|0,u|0,A0(m)|0)|0),I=g}function $_e(){var o=0;return s[8e3]|0||(e4e(10756),o=8e3,n[o>>2]=1,n[o+4>>2]=0),10756}function qP(o,l){o=o|0,l=l|0,fM(o,l)}function e4e(o){o=o|0,Mo(o,t4e()|0,2)}function t4e(){return 1772}function r4e(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0;m=I,I=I+32|0,T=m+16|0,M=m+12|0,B=m,k=wa(n4e()|0)|0,u=rE(u)|0,n[M>>2]=n[A>>2],n[T>>2]=n[M>>2],A=A0(T)|0,n[B>>2]=n[g>>2],T=g+4|0,n[B+4>>2]=n[T>>2],M=g+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[T>>2]=0,n[g>>2]=0,qP(o,Li(0,k|0,l|0,u|0,A|0,WM(B)|0)|0),op(B),I=m}function n4e(){var o=0;return s[8008]|0||(i4e(10768),o=8008,n[o>>2]=1,n[o+4>>2]=0),10768}function i4e(o){o=o|0,Mo(o,s4e()|0,3)}function s4e(){return 1784}function o4e(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0;m=I,I=I+16|0,k=m+4|0,T=m,B=wa(a4e()|0)|0,u=rE(u)|0,n[T>>2]=n[A>>2],n[k>>2]=n[T>>2],A=A0(k)|0,qP(o,Li(0,B|0,l|0,u|0,A|0,YM(g)|0)|0),I=m}function a4e(){var o=0;return s[8016]|0||(l4e(10780),o=8016,n[o>>2]=1,n[o+4>>2]=0),10780}function l4e(o){o=o|0,Mo(o,c4e()|0,3)}function c4e(){return 1800}function u4e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=wa(f4e()|0)|0,qP(o,yn(0,A|0,l|0,rE(u)|0)|0)}function f4e(){var o=0;return s[8024]|0||(A4e(10792),o=8024,n[o>>2]=1,n[o+4>>2]=0),10792}function A4e(o){o=o|0,Mo(o,p4e()|0,1)}function p4e(){return 1816}function h4e(){d4e(),g4e(),m4e()}function d4e(){n[2702]=cX(65536)|0}function g4e(){L4e(10856)}function m4e(){y4e(10816)}function y4e(o){o=o|0,E4e(o,5044),I4e(o)|0}function E4e(o,l){o=o|0,l=l|0;var u=0;u=SZ()|0,n[o>>2]=u,Q4e(u,l),Gh(n[o>>2]|0)}function I4e(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,C4e()|0),o|0}function C4e(){var o=0;return s[8032]|0||(OZ(10820),gr(64,10820,U|0)|0,o=8032,n[o>>2]=1,n[o+4>>2]=0),Hr(10820)|0||OZ(10820),10820}function OZ(o){o=o|0,v4e(o),f0(o,25)}function w4e(o){o=o|0,B4e(o+24|0)}function B4e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function v4e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,18,l,P4e()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function S4e(o,l){o=o|0,l=l|0,b4e(o,l)}function b4e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;u=I,I=I+16|0,A=u,g=u+4|0,l0(g,l),n[A>>2]=c0(g,l)|0,D4e(o,A),I=u}function D4e(o,l){o=o|0,l=l|0,LZ(o+4|0,n[l>>2]|0),s[o+8>>0]=1}function LZ(o,l){o=o|0,l=l|0,n[o>>2]=l}function P4e(){return 1824}function x4e(o){return o=o|0,k4e(o)|0}function k4e(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0;return u=I,I=I+16|0,g=u+4|0,B=u,A=Hl(8)|0,l=A,k=Jt(4)|0,l0(g,o),LZ(k,c0(g,o)|0),m=l+4|0,n[m>>2]=k,o=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],bZ(o,m,g),n[A>>2]=o,I=u,l|0}function Hl(o){o=o|0;var l=0,u=0;return o=o+7&-8,o>>>0<=32768&&(l=n[2701]|0,o>>>0<=(65536-l|0)>>>0)?(u=(n[2702]|0)+l|0,n[2701]=l+o,o=u):(o=cX(o+8|0)|0,n[o>>2]=n[2703],n[2703]=o,o=o+8|0),o|0}function Q4e(o,l){o=o|0,l=l|0,n[o>>2]=T4e()|0,n[o+4>>2]=R4e()|0,n[o+12>>2]=l,n[o+8>>2]=F4e()|0,n[o+32>>2]=9}function T4e(){return 11744}function R4e(){return 1832}function F4e(){return HP()|0}function N4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(O4e(u),It(u)):l|0&&It(l)}function O4e(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function L4e(o){o=o|0,M4e(o,5052),U4e(o)|0,_4e(o,5058,26)|0,H4e(o,5069,1)|0,j4e(o,5077,10)|0,G4e(o,5087,19)|0,q4e(o,5094,27)|0}function M4e(o,l){o=o|0,l=l|0;var u=0;u=O8e()|0,n[o>>2]=u,L8e(u,l),Gh(n[o>>2]|0)}function U4e(o){o=o|0;var l=0;return l=n[o>>2]|0,u0(l,w8e()|0),o|0}function _4e(o,l,u){return o=o|0,l=l|0,u=u|0,i8e(o,bn(l)|0,u,0),o|0}function H4e(o,l,u){return o=o|0,l=l|0,u=u|0,G3e(o,bn(l)|0,u,0),o|0}function j4e(o,l,u){return o=o|0,l=l|0,u=u|0,C3e(o,bn(l)|0,u,0),o|0}function G4e(o,l,u){return o=o|0,l=l|0,u=u|0,o3e(o,bn(l)|0,u,0),o|0}function MZ(o,l){o=o|0,l=l|0;var u=0,A=0;e:for(;;){for(u=n[2703]|0;;){if((u|0)==(l|0))break e;if(A=n[u>>2]|0,n[2703]=A,!u)u=A;else break}It(u)}n[2701]=o}function q4e(o,l,u){return o=o|0,l=l|0,u=u|0,Y4e(o,bn(l)|0,u,0),o|0}function Y4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=VM()|0,o=W4e(u)|0,Dn(m,l,g,o,V4e(u,A)|0,A)}function VM(){var o=0,l=0;if(s[8040]|0||(_Z(10860),gr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10860)|0)){o=10860,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));_Z(10860)}return 10860}function W4e(o){return o=o|0,o|0}function V4e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=VM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(UZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(K4e(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function UZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function K4e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=J4e(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,z4e(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,UZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,Z4e(o,g),X4e(g),I=k;return}}function J4e(o){return o=o|0,536870911}function z4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function Z4e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function X4e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function _Z(o){o=o|0,t3e(o)}function $4e(o){o=o|0,e3e(o+24|0)}function e3e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function t3e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,11,l,r3e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function r3e(){return 1840}function n3e(o,l,u){o=o|0,l=l|0,u=u|0,s3e(n[(i3e(o)|0)>>2]|0,l,u)}function i3e(o){return o=o|0,(n[(VM()|0)+24>>2]|0)+(o<<3)|0}function s3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;A=I,I=I+16|0,m=A+1|0,g=A,l0(m,l),l=c0(m,l)|0,l0(g,u),u=c0(g,u)|0,lp[o&31](l,u),I=A}function o3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=KM()|0,o=a3e(u)|0,Dn(m,l,g,o,l3e(u,A)|0,A)}function KM(){var o=0,l=0;if(s[8048]|0||(jZ(10896),gr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10896)|0)){o=10896,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));jZ(10896)}return 10896}function a3e(o){return o=o|0,o|0}function l3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=KM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(HZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(c3e(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function HZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function c3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=u3e(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,f3e(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,HZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,A3e(o,g),p3e(g),I=k;return}}function u3e(o){return o=o|0,536870911}function f3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function A3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function p3e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function jZ(o){o=o|0,g3e(o)}function h3e(o){o=o|0,d3e(o+24|0)}function d3e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function g3e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,11,l,m3e()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function m3e(){return 1852}function y3e(o,l){return o=o|0,l=l|0,I3e(n[(E3e(o)|0)>>2]|0,l)|0}function E3e(o){return o=o|0,(n[(KM()|0)+24>>2]|0)+(o<<3)|0}function I3e(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,l0(A,l),l=c0(A,l)|0,l=UP(g0[o&31](l)|0)|0,I=u,l|0}function C3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=JM()|0,o=w3e(u)|0,Dn(m,l,g,o,B3e(u,A)|0,A)}function JM(){var o=0,l=0;if(s[8056]|0||(qZ(10932),gr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10932)|0)){o=10932,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));qZ(10932)}return 10932}function w3e(o){return o=o|0,o|0}function B3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=JM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(GZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(v3e(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function GZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function v3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=S3e(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,b3e(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,GZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,D3e(o,g),P3e(g),I=k;return}}function S3e(o){return o=o|0,536870911}function b3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function D3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function P3e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function qZ(o){o=o|0,Q3e(o)}function x3e(o){o=o|0,k3e(o+24|0)}function k3e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function Q3e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,7,l,T3e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function T3e(){return 1860}function R3e(o,l,u){return o=o|0,l=l|0,u=u|0,N3e(n[(F3e(o)|0)>>2]|0,l,u)|0}function F3e(o){return o=o|0,(n[(JM()|0)+24>>2]|0)+(o<<3)|0}function N3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0;return A=I,I=I+32|0,B=A+12|0,m=A+8|0,k=A,T=A+16|0,g=A+4|0,O3e(T,l),L3e(k,T,l),Uh(g,u),u=_h(g,u)|0,n[B>>2]=n[k>>2],T2[o&15](m,B,u),u=M3e(m)|0,xf(m),Hh(g),I=A,u|0}function O3e(o,l){o=o|0,l=l|0}function L3e(o,l,u){o=o|0,l=l|0,u=u|0,U3e(o,u)}function M3e(o){return o=o|0,Us(o)|0}function U3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0;g=I,I=I+16|0,u=g,A=l,A&1?(_3e(u,0),qa(A|0,u|0)|0,H3e(o,u),j3e(u)):n[o>>2]=n[l>>2],I=g}function _3e(o,l){o=o|0,l=l|0,vu(o,l),n[o+4>>2]=0,s[o+8>>0]=0}function H3e(o,l){o=o|0,l=l|0,n[o>>2]=n[l+4>>2]}function j3e(o){o=o|0,s[o+8>>0]=0}function G3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=zM()|0,o=q3e(u)|0,Dn(m,l,g,o,Y3e(u,A)|0,A)}function zM(){var o=0,l=0;if(s[8064]|0||(WZ(10968),gr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Hr(10968)|0)){o=10968,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));WZ(10968)}return 10968}function q3e(o){return o=o|0,o|0}function Y3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=zM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(YZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(W3e(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function YZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function W3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=V3e(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,K3e(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,YZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,J3e(o,g),z3e(g),I=k;return}}function V3e(o){return o=o|0,536870911}function K3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function J3e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function z3e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function WZ(o){o=o|0,$3e(o)}function Z3e(o){o=o|0,X3e(o+24|0)}function X3e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function $3e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,1,l,e8e()|0,5),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function e8e(){return 1872}function t8e(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,n8e(n[(r8e(o)|0)>>2]|0,l,u,A,g,m)}function r8e(o){return o=o|0,(n[(zM()|0)+24>>2]|0)+(o<<3)|0}function n8e(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0;B=I,I=I+32|0,k=B+16|0,T=B+12|0,M=B+8|0,L=B+4|0,q=B,Uh(k,l),l=_h(k,l)|0,Uh(T,u),u=_h(T,u)|0,Uh(M,A),A=_h(M,A)|0,Uh(L,g),g=_h(L,g)|0,Uh(q,m),m=_h(q,m)|0,hX[o&1](l,u,A,g,m),Hh(q),Hh(L),Hh(M),Hh(T),Hh(k),I=B}function i8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;m=n[o>>2]|0,g=ZM()|0,o=s8e(u)|0,Dn(m,l,g,o,o8e(u,A)|0,A)}function ZM(){var o=0,l=0;if(s[8072]|0||(KZ(11004),gr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Hr(11004)|0)){o=11004,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));KZ(11004)}return 11004}function s8e(o){return o=o|0,o|0}function o8e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0,k=0,T=0;return k=I,I=I+16|0,g=k,m=k+4|0,n[g>>2]=o,T=ZM()|0,B=T+24|0,l=Ir(l,4)|0,n[m>>2]=l,u=T+28|0,A=n[u>>2]|0,A>>>0<(n[T+32>>2]|0)>>>0?(VZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(a8e(B,g,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function VZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function a8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0;if(k=I,I=I+32|0,g=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=l8e(o)|0,A>>>0>>0)an(o);else{T=n[o>>2]|0,L=(n[o+8>>2]|0)-T|0,M=L>>2,c8e(g,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-T>>3,o+8|0),B=g+8|0,VZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,u8e(o,g),f8e(g),I=k;return}}function l8e(o){return o=o|0,536870911}function c8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Ot();else{g=Jt(l<<3)|0;break}else g=0;while(!1);n[o>>2]=g,A=g+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=g+(l<<3)}function u8e(o,l){o=o|0,l=l|0;var u=0,A=0,g=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,g=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(g>>3)<<3)|0,n[m>>2]=u,(g|0)>0?(Rr(u|0,A|0,g|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,g=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=g,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function f8e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function KZ(o){o=o|0,h8e(o)}function A8e(o){o=o|0,p8e(o+24|0)}function p8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function h8e(o){o=o|0;var l=0;l=tn()|0,rn(o,1,12,l,d8e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function d8e(){return 1896}function g8e(o,l,u){o=o|0,l=l|0,u=u|0,y8e(n[(m8e(o)|0)>>2]|0,l,u)}function m8e(o){return o=o|0,(n[(ZM()|0)+24>>2]|0)+(o<<3)|0}function y8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;A=I,I=I+16|0,m=A+4|0,g=A,E8e(m,l),l=I8e(m,l)|0,Uh(g,u),u=_h(g,u)|0,lp[o&31](l,u),Hh(g),I=A}function E8e(o,l){o=o|0,l=l|0}function I8e(o,l){return o=o|0,l=l|0,C8e(l)|0}function C8e(o){return o=o|0,o|0}function w8e(){var o=0;return s[8080]|0||(JZ(11040),gr(70,11040,U|0)|0,o=8080,n[o>>2]=1,n[o+4>>2]=0),Hr(11040)|0||JZ(11040),11040}function JZ(o){o=o|0,S8e(o),f0(o,71)}function B8e(o){o=o|0,v8e(o+24|0)}function v8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function S8e(o){o=o|0;var l=0;l=tn()|0,rn(o,5,7,l,x8e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function b8e(o){o=o|0,D8e(o)}function D8e(o){o=o|0,P8e(o)}function P8e(o){o=o|0,s[o+8>>0]=1}function x8e(){return 1936}function k8e(){return Q8e()|0}function Q8e(){var o=0,l=0,u=0,A=0,g=0,m=0,B=0;return l=I,I=I+16|0,g=l+4|0,B=l,u=Hl(8)|0,o=u,m=o+4|0,n[m>>2]=Jt(1)|0,A=Jt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[g>>2]=n[B>>2],T8e(A,m,g),n[u>>2]=A,I=l,o|0}function T8e(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Jt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1916,n[u+12>>2]=l,n[o+4>>2]=u}function R8e(o){o=o|0,sE(o),It(o)}function F8e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function N8e(o){o=o|0,It(o)}function O8e(){var o=0;return s[8088]|0||(G8e(11076),gr(25,11076,U|0)|0,o=8088,n[o>>2]=1,n[o+4>>2]=0),11076}function L8e(o,l){o=o|0,l=l|0,n[o>>2]=M8e()|0,n[o+4>>2]=U8e()|0,n[o+12>>2]=l,n[o+8>>2]=_8e()|0,n[o+32>>2]=10}function M8e(){return 11745}function U8e(){return 1940}function _8e(){return _P()|0}function H8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(jh(A,896)|0)==512?u|0&&(j8e(u),It(u)):l|0&&It(l)}function j8e(o){o=o|0,o=n[o+4>>2]|0,o|0&&qh(o)}function G8e(o){o=o|0,Mh(o)}function bu(o,l){o=o|0,l=l|0,n[o>>2]=l}function XM(o){return o=o|0,n[o>>2]|0}function q8e(o){return o=o|0,s[n[o>>2]>>0]|0}function Y8e(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,n[A>>2]=n[o>>2],W8e(l,A)|0,I=u}function W8e(o,l){o=o|0,l=l|0;var u=0;return u=V8e(n[o>>2]|0,l)|0,l=o+4|0,n[(n[l>>2]|0)+8>>2]=u,n[(n[l>>2]|0)+8>>2]|0}function V8e(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,jl(A),o=Us(o)|0,l=K8e(o,n[l>>2]|0)|0,Gl(A),I=u,l|0}function jl(o){o=o|0,n[o>>2]=n[2701],n[o+4>>2]=n[2703]}function K8e(o,l){o=o|0,l=l|0;var u=0;return u=wa(J8e()|0)|0,yn(0,u|0,o|0,YM(l)|0)|0}function Gl(o){o=o|0,MZ(n[o>>2]|0,n[o+4>>2]|0)}function J8e(){var o=0;return s[8096]|0||(z8e(11120),o=8096,n[o>>2]=1,n[o+4>>2]=0),11120}function z8e(o){o=o|0,Mo(o,Z8e()|0,1)}function Z8e(){return 1948}function X8e(){$8e()}function $8e(){var o=0,l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0;if(Le=I,I=I+16|0,L=Le+4|0,q=Le,Aa(65536,10804,n[2702]|0,10812),u=EZ()|0,l=n[u>>2]|0,o=n[l>>2]|0,o|0)for(A=n[u+8>>2]|0,u=n[u+4>>2]|0;gf(o|0,c[u>>0]|0|0,s[A>>0]|0),l=l+4|0,o=n[l>>2]|0,o;)A=A+1|0,u=u+1|0;if(o=IZ()|0,l=n[o>>2]|0,l|0)do MA(l|0,n[o+4>>2]|0),o=o+8|0,l=n[o>>2]|0;while(l|0);MA(eHe()|0,5167),M=eE()|0,o=n[M>>2]|0;e:do if(o|0){do tHe(n[o+4>>2]|0),o=n[o>>2]|0;while(o|0);if(o=n[M>>2]|0,o|0){T=M;do{for(;g=o,o=n[o>>2]|0,g=n[g+4>>2]|0,!!(rHe(g)|0);)if(n[q>>2]=T,n[L>>2]=n[q>>2],nHe(M,L)|0,!o)break e;if(iHe(g),T=n[T>>2]|0,l=zZ(g)|0,m=Oi()|0,B=I,I=I+((1*(l<<2)|0)+15&-16)|0,k=I,I=I+((1*(l<<2)|0)+15&-16)|0,l=n[(TZ(g)|0)>>2]|0,l|0)for(u=B,A=k;n[u>>2]=n[(tE(n[l+4>>2]|0)|0)>>2],n[A>>2]=n[l+8>>2],l=n[l>>2]|0,l;)u=u+4|0,A=A+4|0;Re=tE(g)|0,l=sHe(g)|0,u=zZ(g)|0,A=oHe(g)|0,cc(Re|0,l|0,B|0,k|0,u|0,A|0,UM(g)|0),LA(m|0)}while(o|0)}}while(!1);if(o=n[(_M()|0)>>2]|0,o|0)do Re=o+4|0,M=HM(Re)|0,g=P2(M)|0,m=b2(M)|0,B=(D2(M)|0)+1|0,k=YP(M)|0,T=ZZ(Re)|0,M=Hr(M)|0,L=jP(Re)|0,q=$M(Re)|0,cu(0,g|0,m|0,B|0,k|0,T|0,M|0,L|0,q|0,eU(Re)|0),o=n[o>>2]|0;while(o|0);o=n[(eE()|0)>>2]|0;e:do if(o|0){t:for(;;){if(l=n[o+4>>2]|0,l|0&&(oe=n[(tE(l)|0)>>2]|0,Ve=n[(RZ(l)|0)>>2]|0,Ve|0)){u=Ve;do{l=u+4|0,A=HM(l)|0;r:do if(A|0)switch(Hr(A)|0){case 0:break t;case 4:case 3:case 2:{k=P2(A)|0,T=b2(A)|0,M=(D2(A)|0)+1|0,L=YP(A)|0,q=Hr(A)|0,Re=jP(l)|0,cu(oe|0,k|0,T|0,M|0,L|0,0,q|0,Re|0,$M(l)|0,eU(l)|0);break r}case 1:{B=P2(A)|0,k=b2(A)|0,T=(D2(A)|0)+1|0,M=YP(A)|0,L=ZZ(l)|0,q=Hr(A)|0,Re=jP(l)|0,cu(oe|0,B|0,k|0,T|0,M|0,L|0,q|0,Re|0,$M(l)|0,eU(l)|0);break r}case 5:{M=P2(A)|0,L=b2(A)|0,q=(D2(A)|0)+1|0,Re=YP(A)|0,cu(oe|0,M|0,L|0,q|0,Re|0,aHe(A)|0,Hr(A)|0,0,0,0);break r}default:break r}while(!1);u=n[u>>2]|0}while(u|0)}if(o=n[o>>2]|0,!o)break e}Ot()}while(!1);we(),I=Le}function eHe(){return 11703}function tHe(o){o=o|0,s[o+40>>0]=0}function rHe(o){return o=o|0,(s[o+40>>0]|0)!=0|0}function nHe(o,l){return o=o|0,l=l|0,l=lHe(l)|0,o=n[l>>2]|0,n[l>>2]=n[o>>2],It(o),n[l>>2]|0}function iHe(o){o=o|0,s[o+40>>0]=1}function zZ(o){return o=o|0,n[o+20>>2]|0}function sHe(o){return o=o|0,n[o+8>>2]|0}function oHe(o){return o=o|0,n[o+32>>2]|0}function YP(o){return o=o|0,n[o+4>>2]|0}function ZZ(o){return o=o|0,n[o+4>>2]|0}function $M(o){return o=o|0,n[o+8>>2]|0}function eU(o){return o=o|0,n[o+16>>2]|0}function aHe(o){return o=o|0,n[o+20>>2]|0}function lHe(o){return o=o|0,n[o>>2]|0}function WP(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0,At=0,He=0,We=0,Mt=0;Mt=I,I=I+16|0,oe=Mt;do if(o>>>0<245){if(M=o>>>0<11?16:o+11&-8,o=M>>>3,q=n[2783]|0,u=q>>>o,u&3|0)return l=(u&1^1)+o|0,o=11172+(l<<1<<2)|0,u=o+8|0,A=n[u>>2]|0,g=A+8|0,m=n[g>>2]|0,(o|0)==(m|0)?n[2783]=q&~(1<>2]=o,n[u>>2]=m),We=l<<3,n[A+4>>2]=We|3,We=A+We+4|0,n[We>>2]=n[We>>2]|1,We=g,I=Mt,We|0;if(L=n[2785]|0,M>>>0>L>>>0){if(u|0)return l=2<>>12&16,l=l>>>B,u=l>>>5&8,l=l>>>u,g=l>>>2&4,l=l>>>g,o=l>>>1&2,l=l>>>o,A=l>>>1&1,A=(u|B|g|o|A)+(l>>>A)|0,l=11172+(A<<1<<2)|0,o=l+8|0,g=n[o>>2]|0,B=g+8|0,u=n[B>>2]|0,(l|0)==(u|0)?(o=q&~(1<>2]=l,n[o>>2]=u,o=q),m=(A<<3)-M|0,n[g+4>>2]=M|3,A=g+M|0,n[A+4>>2]=m|1,n[A+m>>2]=m,L|0&&(g=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=g,n[l+12>>2]=g,n[g+8>>2]=l,n[g+12>>2]=u),n[2785]=m,n[2788]=A,We=B,I=Mt,We|0;if(k=n[2784]|0,k){if(u=(k&0-k)+-1|0,B=u>>>12&16,u=u>>>B,m=u>>>5&8,u=u>>>m,T=u>>>2&4,u=u>>>T,A=u>>>1&2,u=u>>>A,o=u>>>1&1,o=n[11436+((m|B|T|A|o)+(u>>>o)<<2)>>2]|0,u=(n[o+4>>2]&-8)-M|0,A=n[o+16+(((n[o+16>>2]|0)==0&1)<<2)>>2]|0,!A)T=o,m=u;else{do B=(n[A+4>>2]&-8)-M|0,T=B>>>0>>0,u=T?B:u,o=T?A:o,A=n[A+16+(((n[A+16>>2]|0)==0&1)<<2)>>2]|0;while(A|0);T=o,m=u}if(B=T+M|0,T>>>0>>0){g=n[T+24>>2]|0,l=n[T+12>>2]|0;do if((l|0)==(T|0)){if(o=T+20|0,l=n[o>>2]|0,!l&&(o=T+16|0,l=n[o>>2]|0,!l)){u=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0,u=l}else u=n[T+8>>2]|0,n[u+12>>2]=l,n[l+8>>2]=u,u=l;while(!1);do if(g|0){if(l=n[T+28>>2]|0,o=11436+(l<<2)|0,(T|0)==(n[o>>2]|0)){if(n[o>>2]=u,!u){n[2784]=k&~(1<>2]|0)!=(T|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=g,l=n[T+16>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),l=n[T+20>>2]|0,l|0&&(n[u+20>>2]=l,n[l+24>>2]=u)}while(!1);return m>>>0<16?(We=m+M|0,n[T+4>>2]=We|3,We=T+We+4|0,n[We>>2]=n[We>>2]|1):(n[T+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,L|0&&(A=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=q|l,l=u,o=u+8|0),n[o>>2]=A,n[l+12>>2]=A,n[A+8>>2]=l,n[A+12>>2]=u),n[2785]=m,n[2788]=B),We=T+8|0,I=Mt,We|0}else q=M}else q=M}else q=M}else if(o>>>0<=4294967231)if(o=o+11|0,M=o&-8,T=n[2784]|0,T){A=0-M|0,o=o>>>8,o?M>>>0>16777215?k=31:(q=(o+1048320|0)>>>16&8,He=o<>>16&4,He=He<>>16&2,k=14-(L|q|k)+(He<>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,u=n[11436+(k<<2)>>2]|0;e:do if(!u)u=0,o=0,He=57;else for(o=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(g=(n[u+4>>2]&-8)-M|0,g>>>0>>0)if(g)o=u,A=g;else{o=u,A=0,g=u,He=61;break e}if(g=n[u+20>>2]|0,u=n[u+16+(B>>>31<<2)>>2]|0,m=(g|0)==0|(g|0)==(u|0)?m:g,g=(u|0)==0,g){u=m,He=57;break}else B=B<<((g^1)&1)}while(!1);if((He|0)==57){if((u|0)==0&(o|0)==0){if(o=2<>>12&16,q=q>>>B,m=q>>>5&8,q=q>>>m,k=q>>>2&4,q=q>>>k,L=q>>>1&2,q=q>>>L,u=q>>>1&1,o=0,u=n[11436+((m|B|k|L|u)+(q>>>u)<<2)>>2]|0}u?(g=u,He=61):(k=o,B=A)}if((He|0)==61)for(;;)if(He=0,u=(n[g+4>>2]&-8)-M|0,q=u>>>0>>0,u=q?u:A,o=q?g:o,g=n[g+16+(((n[g+16>>2]|0)==0&1)<<2)>>2]|0,g)A=u,He=61;else{k=o,B=u;break}if(k|0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return We=0,I=Mt,We|0;g=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(o=k+20|0,l=n[o>>2]|0,!l&&(o=k+16|0,l=n[o>>2]|0,!l)){l=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0}else We=n[k+8>>2]|0,n[We+12>>2]=l,n[l+8>>2]=We;while(!1);do if(g){if(o=n[k+28>>2]|0,u=11436+(o<<2)|0,(k|0)==(n[u>>2]|0)){if(n[u>>2]=l,!l){A=T&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){A=T;break}n[l+24>>2]=g,o=n[k+16>>2]|0,o|0&&(n[l+16>>2]=o,n[o+24>>2]=l),o=n[k+20>>2]|0,o&&(n[l+20>>2]=o,n[o+24>>2]=l),A=T}else A=T;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=u;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,l=14-(At|He|l)+(We<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,u=11436+(l<<2)|0,n[m+28>>2]=l,o=m+16|0,n[o+4>>2]=0,n[o>>2]=0,o=1<>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}for(o=B<<((l|0)==31?0:25-(l>>>1)|0),u=n[u>>2]|0;;){if((n[u+4>>2]&-8|0)==(B|0)){He=97;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=96;break}}if((He|0)==96){n[A>>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((He|0)==97){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=m,n[He>>2]=m,n[m+8>>2]=We,n[m+12>>2]=u,n[m+24>>2]=0;break}}else We=B+M|0,n[k+4>>2]=We|3,We=k+We+4|0,n[We>>2]=n[We>>2]|1;while(!1);return We=k+8|0,I=Mt,We|0}else q=M}else q=M;else q=-1;while(!1);if(u=n[2785]|0,u>>>0>=q>>>0)return l=u-q|0,o=n[2788]|0,l>>>0>15?(We=o+q|0,n[2788]=We,n[2785]=l,n[We+4>>2]=l|1,n[We+l>>2]=l,n[o+4>>2]=q|3):(n[2785]=0,n[2788]=0,n[o+4>>2]=u|3,We=o+u+4|0,n[We>>2]=n[We>>2]|1),We=o+8|0,I=Mt,We|0;if(B=n[2786]|0,B>>>0>q>>>0)return At=B-q|0,n[2786]=At,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=At|1,n[We+4>>2]=q|3,We=We+8|0,I=Mt,We|0;if(n[2901]|0?o=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,o=oe&-16^1431655768,n[oe>>2]=o,n[2901]=o,o=4096),k=q+48|0,T=q+47|0,m=o+T|0,g=0-o|0,M=m&g,M>>>0<=q>>>0||(o=n[2893]|0,o|0&&(L=n[2891]|0,oe=L+M|0,oe>>>0<=L>>>0|oe>>>0>o>>>0)))return We=0,I=Mt,We|0;e:do if(n[2894]&4)l=0,He=133;else{u=n[2789]|0;t:do if(u){for(A=11580;o=n[A>>2]|0,!(o>>>0<=u>>>0&&(Re=A+4|0,(o+(n[Re>>2]|0)|0)>>>0>u>>>0));)if(o=n[A+8>>2]|0,o)A=o;else{He=118;break t}if(l=m-B&g,l>>>0<2147483647)if(o=Yh(l|0)|0,(o|0)==((n[A>>2]|0)+(n[Re>>2]|0)|0)){if((o|0)!=-1){B=l,m=o,He=135;break e}}else A=o,He=126;else l=0}else He=118;while(!1);do if((He|0)==118)if(u=Yh(0)|0,(u|0)!=-1&&(l=u,Ve=n[2902]|0,Le=Ve+-1|0,l=(Le&l|0?(Le+l&0-Ve)-l|0:0)+M|0,Ve=n[2891]|0,Le=l+Ve|0,l>>>0>q>>>0&l>>>0<2147483647)){if(Re=n[2893]|0,Re|0&&Le>>>0<=Ve>>>0|Le>>>0>Re>>>0){l=0;break}if(o=Yh(l|0)|0,(o|0)==(u|0)){B=l,m=u,He=135;break e}else A=o,He=126}else l=0;while(!1);do if((He|0)==126){if(u=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(A|0)!=-1)))if((A|0)==-1){l=0;break}else{B=l,m=A,He=135;break e}if(o=n[2903]|0,o=T-l+o&0-o,o>>>0>=2147483647){B=l,m=A,He=135;break e}if((Yh(o|0)|0)==-1){Yh(u|0)|0,l=0;break}else{B=o+l|0,m=A,He=135;break e}}while(!1);n[2894]=n[2894]|4,He=133}while(!1);if((He|0)==133&&M>>>0<2147483647&&(At=Yh(M|0)|0,Re=Yh(0)|0,nt=Re-At|0,Xe=nt>>>0>(q+40|0)>>>0,!((At|0)==-1|Xe^1|At>>>0>>0&((At|0)!=-1&(Re|0)!=-1)^1))&&(B=Xe?nt:l,m=At,He=135),(He|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),T=n[2789]|0;do if(T){for(l=11580;;){if(o=n[l>>2]|0,u=l+4|0,A=n[u>>2]|0,(m|0)==(o+A|0)){He=145;break}if(g=n[l+8>>2]|0,g)l=g;else break}if((He|0)==145&&!(n[l+12>>2]&8|0)&&T>>>0>>0&T>>>0>=o>>>0){n[u>>2]=A+B,We=T+8|0,We=We&7|0?0-We&7:0,He=T+We|0,We=(n[2786]|0)+(B-We)|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),u=m+B|0,l=11580;;){if((n[l>>2]|0)==(u|0)){He=153;break}if(o=n[l+8>>2]|0,o)l=o;else break}if((He|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,L=l+4|0,n[L>>2]=(n[L>>2]|0)+B,L=m+8|0,L=m+(L&7|0?0-L&7:0)|0,l=u+8|0,l=u+(l&7|0?0-l&7:0)|0,M=L+q|0,k=l-L-q|0,n[L+4>>2]=q|3;do if((l|0)!=(T|0)){if((l|0)==(n[2788]|0)){We=(n[2785]|0)+k|0,n[2785]=We,n[2788]=M,n[M+4>>2]=We|1,n[M+We>>2]=We;break}if(o=n[l+4>>2]|0,(o&3|0)==1){B=o&-8,A=o>>>3;e:do if(o>>>0<256)if(o=n[l+8>>2]|0,u=n[l+12>>2]|0,(u|0)==(o|0)){n[2783]=n[2783]&~(1<>2]=u,n[u+8>>2]=o;break}else{m=n[l+24>>2]|0,o=n[l+12>>2]|0;do if((o|0)==(l|0)){if(A=l+16|0,u=A+4|0,o=n[u>>2]|0,!o)if(o=n[A>>2]|0,o)u=A;else{o=0;break}for(;;){if(A=o+20|0,g=n[A>>2]|0,g|0){o=g,u=A;continue}if(A=o+16|0,g=n[A>>2]|0,g)o=g,u=A;else break}n[u>>2]=0}else We=n[l+8>>2]|0,n[We+12>>2]=o,n[o+8>>2]=We;while(!1);if(!m)break;u=n[l+28>>2]|0,A=11436+(u<<2)|0;do if((l|0)!=(n[A>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=o,!o)break e}else{if(n[A>>2]=o,o|0)break;n[2784]=n[2784]&~(1<>2]=m,u=l+16|0,A=n[u>>2]|0,A|0&&(n[o+16>>2]=A,n[A+24>>2]=o),u=n[u+4>>2]|0,!u)break;n[o+20>>2]=u,n[u+24>>2]=o}while(!1);l=l+B|0,g=B+k|0}else g=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=g|1,n[M+g>>2]=g,l=g>>>3,g>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=u;break}l=g>>>8;do if(!l)l=0;else{if(g>>>0>16777215){l=31;break}He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,l=14-(At|He|l)+(We<>>15)|0,l=g>>>(l+7|0)&1|l<<1}while(!1);if(A=11436+(l<<2)|0,n[M+28>>2]=l,o=M+16|0,n[o+4>>2]=0,n[o>>2]=0,o=n[2784]|0,u=1<>2]=M,n[M+24>>2]=A,n[M+12>>2]=M,n[M+8>>2]=M;break}for(o=g<<((l|0)==31?0:25-(l>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(g|0)){He=194;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=193;break}}if((He|0)==193){n[A>>2]=M,n[M+24>>2]=u,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((He|0)==194){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=M,n[He>>2]=M,n[M+8>>2]=We,n[M+12>>2]=u,n[M+24>>2]=0;break}}else We=(n[2786]|0)+k|0,n[2786]=We,n[2789]=M,n[M+4>>2]=We|1;while(!1);return We=L+8|0,I=Mt,We|0}for(l=11580;o=n[l>>2]|0,!(o>>>0<=T>>>0&&(We=o+(n[l+4>>2]|0)|0,We>>>0>T>>>0));)l=n[l+8>>2]|0;g=We+-47|0,o=g+8|0,o=g+(o&7|0?0-o&7:0)|0,g=T+16|0,o=o>>>0>>0?T:o,l=o+8|0,u=m+8|0,u=u&7|0?0-u&7:0,He=m+u|0,u=B+-40-u|0,n[2789]=He,n[2786]=u,n[He+4>>2]=u|1,n[He+u+4>>2]=40,n[2790]=n[2905],u=o+4|0,n[u>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=o+24|0;do He=l,l=l+4|0,n[l>>2]=7;while((He+8|0)>>>0>>0);if((o|0)!=(T|0)){if(m=o-T|0,n[u>>2]=n[u>>2]&-2,n[T+4>>2]=m|1,n[o>>2]=m,l=m>>>3,m>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=T,n[l+12>>2]=T,n[T+8>>2]=l,n[T+12>>2]=u;break}if(l=m>>>8,l?m>>>0>16777215?u=31:(He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,u=14-(At|He|u)+(We<>>15)|0,u=m>>>(u+7|0)&1|u<<1):u=0,A=11436+(u<<2)|0,n[T+28>>2]=u,n[T+20>>2]=0,n[g>>2]=0,l=n[2784]|0,o=1<>2]=T,n[T+24>>2]=A,n[T+12>>2]=T,n[T+8>>2]=T;break}for(o=m<<((u|0)==31?0:25-(u>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(m|0)){He=216;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=215;break}}if((He|0)==215){n[A>>2]=T,n[T+24>>2]=u,n[T+12>>2]=T,n[T+8>>2]=T;break}else if((He|0)==216){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=T,n[He>>2]=T,n[T+8>>2]=We,n[T+12>>2]=u,n[T+24>>2]=0;break}}}else{We=n[2787]|0,(We|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do We=11172+(l<<1<<2)|0,n[We+12>>2]=We,n[We+8>>2]=We,l=l+1|0;while((l|0)!=32);We=m+8|0,We=We&7|0?0-We&7:0,He=m+We|0,We=B+-40-We|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>q>>>0)return At=l-q|0,n[2786]=At,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=At|1,n[We+4>>2]=q|3,We=We+8|0,I=Mt,We|0}return n[(nE()|0)>>2]=12,We=0,I=Mt,We|0}function VP(o){o=o|0;var l=0,u=0,A=0,g=0,m=0,B=0,k=0,T=0;if(o){u=o+-8|0,g=n[2787]|0,o=n[o+-4>>2]|0,l=o&-8,T=u+l|0;do if(o&1)k=u,B=u;else{if(A=n[u>>2]|0,!(o&3)||(B=u+(0-A)|0,m=A+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(o=T+4|0,l=n[o>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[o>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(u=A>>>3,A>>>0<256)if(o=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(o|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=o,k=B,l=m;break}g=n[B+24>>2]|0,o=n[B+12>>2]|0;do if((o|0)==(B|0)){if(u=B+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{o=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=o,n[o+8>>2]=k;while(!1);if(g){if(l=n[B+28>>2]|0,u=11436+(l<<2)|0,(B|0)==(n[u>>2]|0)){if(n[u>>2]=o,!o){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=o,!o){k=B,l=m;break}n[o+24>>2]=g,l=B+16|0,u=n[l>>2]|0,u|0&&(n[o+16>>2]=u,n[u+24>>2]=o),l=n[l+4>>2]|0,l?(n[o+20>>2]=l,n[l+24>>2]=o,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=T>>>0)&&(o=T+4|0,A=n[o>>2]|0,!!(A&1))){if(A&2)n[o>>2]=A&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,g=l;else{if(o=n[2788]|0,(T|0)==(n[2789]|0)){if(T=(n[2786]|0)+l|0,n[2786]=T,n[2789]=k,n[k+4>>2]=T|1,(k|0)!=(o|0))return;n[2788]=0,n[2785]=0;return}if((T|0)==(o|0)){T=(n[2785]|0)+l|0,n[2785]=T,n[2788]=B,n[k+4>>2]=T|1,n[B+T>>2]=T;return}g=(A&-8)+l|0,u=A>>>3;do if(A>>>0<256)if(l=n[T+8>>2]|0,o=n[T+12>>2]|0,(o|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=o,n[o+8>>2]=l;break}else{m=n[T+24>>2]|0,o=n[T+12>>2]|0;do if((o|0)==(T|0)){if(u=T+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{u=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0,u=o}else u=n[T+8>>2]|0,n[u+12>>2]=o,n[o+8>>2]=u,u=o;while(!1);if(m|0){if(o=n[T+28>>2]|0,l=11436+(o<<2)|0,(T|0)==(n[l>>2]|0)){if(n[l>>2]=u,!u){n[2784]=n[2784]&~(1<>2]|0)!=(T|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=m,o=T+16|0,l=n[o>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),o=n[o+4>>2]|0,o|0&&(n[u+20>>2]=o,n[o+24>>2]=u)}}while(!1);if(n[k+4>>2]=g|1,n[B+g>>2]=g,(k|0)==(n[2788]|0)){n[2785]=g;return}}if(o=g>>>3,g>>>0<256){u=11172+(o<<1<<2)|0,l=n[2783]|0,o=1<>2]|0):(n[2783]=l|o,o=u,l=u+8|0),n[l>>2]=k,n[o+12>>2]=k,n[k+8>>2]=o,n[k+12>>2]=u;return}o=g>>>8,o?g>>>0>16777215?o=31:(B=(o+1048320|0)>>>16&8,T=o<>>16&4,T=T<>>16&2,o=14-(m|B|o)+(T<>>15)|0,o=g>>>(o+7|0)&1|o<<1):o=0,A=11436+(o<<2)|0,n[k+28>>2]=o,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,u=1<>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(g|0)){o=73;break}if(A=u+16+(l>>>31<<2)|0,o=n[A>>2]|0,o)l=l<<1,u=o;else{o=72;break}}if((o|0)==72){n[A>>2]=k,n[k+24>>2]=u,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((o|0)==73){B=u+8|0,T=n[B>>2]|0,n[T+12>>2]=k,n[B>>2]=k,n[k+8>>2]=T,n[k+12>>2]=u,n[k+24>>2]=0;break}}else n[2784]=l|u,n[A>>2]=k,n[k+24>>2]=A,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(T=(n[2791]|0)+-1|0,n[2791]=T,!T)o=11588;else return;for(;o=n[o>>2]|0,o;)o=o+8|0;n[2791]=-1}}}function cHe(){return 11628}function uHe(o){o=o|0;var l=0,u=0;return l=I,I=I+16|0,u=l,n[u>>2]=pHe(n[o+60>>2]|0)|0,o=KP(fu(6,u|0)|0)|0,I=l,o|0}function XZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0;q=I,I=I+48|0,M=q+16|0,m=q,g=q+32|0,k=o+28|0,A=n[k>>2]|0,n[g>>2]=A,T=o+20|0,A=(n[T>>2]|0)-A|0,n[g+4>>2]=A,n[g+8>>2]=l,n[g+12>>2]=u,A=A+u|0,B=o+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=g,n[m+8>>2]=2,m=KP(Va(146,m|0)|0)|0;e:do if((A|0)!=(m|0)){for(l=2;!((m|0)<0);)if(A=A-m|0,Ve=n[g+4>>2]|0,oe=m>>>0>Ve>>>0,g=oe?g+8|0:g,l=(oe<<31>>31)+l|0,Ve=m-(oe?Ve:0)|0,n[g>>2]=(n[g>>2]|0)+Ve,oe=g+4|0,n[oe>>2]=(n[oe>>2]|0)-Ve,n[M>>2]=n[B>>2],n[M+4>>2]=g,n[M+8>>2]=l,m=KP(Va(146,M|0)|0)|0,(A|0)==(m|0)){L=3;break e}n[o+16>>2]=0,n[k>>2]=0,n[T>>2]=0,n[o>>2]=n[o>>2]|32,(l|0)==2?u=0:u=u-(n[g+4>>2]|0)|0}else L=3;while(!1);return(L|0)==3&&(Ve=n[o+44>>2]|0,n[o+16>>2]=Ve+(n[o+48>>2]|0),n[k>>2]=Ve,n[T>>2]=Ve),I=q,u|0}function fHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;return g=I,I=I+32|0,m=g,A=g+20|0,n[m>>2]=n[o+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=A,n[m+16>>2]=u,(KP(Wa(140,m|0)|0)|0)<0?(n[A>>2]=-1,o=-1):o=n[A>>2]|0,I=g,o|0}function KP(o){return o=o|0,o>>>0>4294963200&&(n[(nE()|0)>>2]=0-o,o=-1),o|0}function nE(){return(AHe()|0)+64|0}function AHe(){return tU()|0}function tU(){return 2084}function pHe(o){return o=o|0,o|0}function hHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;return g=I,I=I+32|0,A=g,n[o+36>>2]=1,!(n[o>>2]&64|0)&&(n[A>>2]=n[o+60>>2],n[A+4>>2]=21523,n[A+8>>2]=g+16,fo(54,A|0)|0)&&(s[o+75>>0]=-1),A=XZ(o,l,u)|0,I=g,A|0}function $Z(o,l){o=o|0,l=l|0;var u=0,A=0;if(u=s[o>>0]|0,A=s[l>>0]|0,!(u<<24>>24)||u<<24>>24!=A<<24>>24)o=A;else{do o=o+1|0,l=l+1|0,u=s[o>>0]|0,A=s[l>>0]|0;while(!(!(u<<24>>24)||u<<24>>24!=A<<24>>24));o=A}return(u&255)-(o&255)|0}function dHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0;e:do if(!u)o=0;else{for(;A=s[o>>0]|0,g=s[l>>0]|0,A<<24>>24==g<<24>>24;)if(u=u+-1|0,u)o=o+1|0,l=l+1|0;else{o=0;break e}o=(A&255)-(g&255)|0}while(!1);return o|0}function eX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0;Re=I,I=I+224|0,L=Re+120|0,q=Re+80|0,Ve=Re,Le=Re+136|0,A=q,g=A+40|0;do n[A>>2]=0,A=A+4|0;while((A|0)<(g|0));return n[L>>2]=n[u>>2],(rU(0,l,L,Ve,q)|0)<0?u=-1:((n[o+76>>2]|0)>-1?oe=gHe(o)|0:oe=0,u=n[o>>2]|0,M=u&32,(s[o+74>>0]|0)<1&&(n[o>>2]=u&-33),A=o+48|0,n[A>>2]|0?u=rU(o,l,L,Ve,q)|0:(g=o+44|0,m=n[g>>2]|0,n[g>>2]=Le,B=o+28|0,n[B>>2]=Le,k=o+20|0,n[k>>2]=Le,n[A>>2]=80,T=o+16|0,n[T>>2]=Le+80,u=rU(o,l,L,Ve,q)|0,m&&(XP[n[o+36>>2]&7](o,0,0)|0,u=n[k>>2]|0?u:-1,n[g>>2]=m,n[A>>2]=0,n[T>>2]=0,n[B>>2]=0,n[k>>2]=0)),A=n[o>>2]|0,n[o>>2]=A|M,oe|0&&mHe(o),u=A&32|0?-1:u),I=Re,u|0}function rU(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0,At=0,He=0,We=0,Mt=0,qr=0,fr=0,$t=0,Fr=0,jr=0,cr=0;cr=I,I=I+64|0,fr=cr+16|0,$t=cr,Mt=cr+24|0,Fr=cr+8|0,jr=cr+20|0,n[fr>>2]=l,At=(o|0)!=0,He=Mt+40|0,We=He,Mt=Mt+39|0,qr=Fr+4|0,B=0,m=0,L=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(nE()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=s[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}nt=k+1|0,n[fr>>2]=nt,B=s[nt>>0]|0,k=nt}t:do if((Xe|0)==9)for(;;){if(Xe=0,(s[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[fr>>2]=k,(s[k>>0]|0)==37)Xe=9;else break}while(!1);if(B=B-l|0,At&&Ps(o,l,B),B|0){l=k;continue}T=k+1|0,B=(s[T>>0]|0)+-48|0,B>>>0<10?(nt=(s[k+2>>0]|0)==36,Re=nt?B:-1,L=nt?1:L,T=nt?k+3|0:T):Re=-1,n[fr>>2]=T,B=s[T>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,q=B;;){if(B=1<>2]=T,B=s[T>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;q=B}else M=0;while(!1);if(B<<24>>24==42){if(k=T+1|0,B=(s[k>>0]|0)+-48|0,B>>>0<10&&(s[T+2>>0]|0)==36)n[g+(B<<2)>>2]=10,B=n[A+((s[k>>0]|0)+-48<<3)>>2]|0,L=1,T=T+3|0;else{if(L|0){m=-1;break}At?(L=(n[u>>2]|0)+3&-4,B=n[L>>2]|0,n[u>>2]=L+4,L=0,T=k):(B=0,L=0,T=k)}n[fr>>2]=T,nt=(B|0)<0,B=nt?0-B|0:B,M=nt?M|8192:M}else{if(B=tX(fr)|0,(B|0)<0){m=-1;break}T=n[fr>>2]|0}do if((s[T>>0]|0)==46){if((s[T+1>>0]|0)!=42){n[fr>>2]=T+1,k=tX(fr)|0,T=n[fr>>2]|0;break}if(q=T+2|0,k=(s[q>>0]|0)+-48|0,k>>>0<10&&(s[T+3>>0]|0)==36){n[g+(k<<2)>>2]=10,k=n[A+((s[q>>0]|0)+-48<<3)>>2]|0,T=T+4|0,n[fr>>2]=T;break}if(L|0){m=-1;break e}At?(nt=(n[u>>2]|0)+3&-4,k=n[nt>>2]|0,n[u>>2]=nt+4):k=0,n[fr>>2]=q,T=q}else k=-1;while(!1);for(Le=0;;){if(((s[T>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(nt=T+1|0,n[fr>>2]=nt,q=s[(s[T>>0]|0)+-65+(5178+(Le*58|0))>>0]|0,oe=q&255,(oe+-1|0)>>>0<8)Le=oe,T=nt;else break}if(!(q<<24>>24)){m=-1;break}Ve=(Re|0)>-1;do if(q<<24>>24==19)if(Ve){m=-1;break e}else Xe=49;else{if(Ve){n[g+(Re<<2)>>2]=oe,Ve=A+(Re<<3)|0,Re=n[Ve+4>>2]|0,Xe=$t,n[Xe>>2]=n[Ve>>2],n[Xe+4>>2]=Re,Xe=49;break}if(!At){m=0;break e}rX($t,oe,u)}while(!1);if((Xe|0)==49&&(Xe=0,!At)){B=0,l=nt;continue}T=s[T>>0]|0,T=(Le|0)!=0&(T&15|0)==3?T&-33:T,Ve=M&-65537,Re=M&8192|0?Ve:M;t:do switch(T|0){case 110:switch((Le&255)<<24>>24){case 0:{n[n[$t>>2]>>2]=m,B=0,l=nt;continue e}case 1:{n[n[$t>>2]>>2]=m,B=0,l=nt;continue e}case 2:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=nt;continue e}case 3:{a[n[$t>>2]>>1]=m,B=0,l=nt;continue e}case 4:{s[n[$t>>2]>>0]=m,B=0,l=nt;continue e}case 6:{n[n[$t>>2]>>2]=m,B=0,l=nt;continue e}case 7:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=nt;continue e}default:{B=0,l=nt;continue e}}case 112:{T=120,k=k>>>0>8?k:8,l=Re|8,Xe=61;break}case 88:case 120:{l=Re,Xe=61;break}case 111:{T=$t,l=n[T>>2]|0,T=n[T+4>>2]|0,oe=EHe(l,T,He)|0,Ve=We-oe|0,M=0,q=5642,k=(Re&8|0)==0|(k|0)>(Ve|0)?k:Ve+1|0,Ve=Re,Xe=67;break}case 105:case 100:if(T=$t,l=n[T>>2]|0,T=n[T+4>>2]|0,(T|0)<0){l=JP(0,0,l|0,T|0)|0,T=Ie,M=$t,n[M>>2]=l,n[M+4>>2]=T,M=1,q=5642,Xe=66;break t}else{M=(Re&2049|0)!=0&1,q=Re&2048|0?5643:Re&1|0?5644:5642,Xe=66;break t}case 117:{T=$t,M=0,q=5642,l=n[T>>2]|0,T=n[T+4>>2]|0,Xe=66;break}case 99:{s[Mt>>0]=n[$t>>2],l=Mt,M=0,q=5642,oe=He,T=1,k=Ve;break}case 109:{T=IHe(n[(nE()|0)>>2]|0)|0,Xe=71;break}case 115:{T=n[$t>>2]|0,T=T|0?T:5652,Xe=71;break}case 67:{n[Fr>>2]=n[$t>>2],n[qr>>2]=0,n[$t>>2]=Fr,oe=-1,T=Fr,Xe=75;break}case 83:{l=n[$t>>2]|0,k?(oe=k,T=l,Xe=75):(_s(o,32,B,0,Re),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=wHe(o,+E[$t>>3],B,k,Re,T)|0,l=nt;continue e}default:M=0,q=5642,oe=He,T=k,k=Re}while(!1);t:do if((Xe|0)==61)Re=$t,Le=n[Re>>2]|0,Re=n[Re+4>>2]|0,oe=yHe(Le,Re,He,T&32)|0,q=(l&8|0)==0|(Le|0)==0&(Re|0)==0,M=q?0:2,q=q?5642:5642+(T>>4)|0,Ve=l,l=Le,T=Re,Xe=67;else if((Xe|0)==66)oe=iE(l,T,He)|0,Ve=Re,Xe=67;else if((Xe|0)==71)Xe=0,Re=CHe(T,0,k)|0,Le=(Re|0)==0,l=T,M=0,q=5642,oe=Le?T+k|0:Re,T=Le?k:Re-T|0,k=Ve;else if((Xe|0)==75){for(Xe=0,q=T,l=0,k=0;M=n[q>>2]|0,!(!M||(k=nX(jr,M)|0,(k|0)<0|k>>>0>(oe-l|0)>>>0));)if(l=k+l|0,oe>>>0>l>>>0)q=q+4|0;else break;if((k|0)<0){m=-1;break e}if(_s(o,32,B,l,Re),!l)l=0,Xe=84;else for(M=0;;){if(k=n[T>>2]|0,!k){Xe=84;break t}if(k=nX(jr,k)|0,M=k+M|0,(M|0)>(l|0)){Xe=84;break t}if(Ps(o,jr,k),M>>>0>=l>>>0){Xe=84;break}else T=T+4|0}}while(!1);if((Xe|0)==67)Xe=0,T=(l|0)!=0|(T|0)!=0,Re=(k|0)!=0|T,T=((T^1)&1)+(We-oe)|0,l=Re?oe:He,oe=He,T=Re?(k|0)>(T|0)?k:T:k,k=(k|0)>-1?Ve&-65537:Ve;else if((Xe|0)==84){Xe=0,_s(o,32,B,l,Re^8192),B=(B|0)>(l|0)?B:l,l=nt;continue}Le=oe-l|0,Ve=(T|0)<(Le|0)?Le:T,Re=Ve+M|0,B=(B|0)<(Re|0)?Re:B,_s(o,32,B,Re,k),Ps(o,q,M),_s(o,48,B,Re,k^65536),_s(o,48,Ve,Le,0),Ps(o,l,Le),_s(o,32,B,Re,k^8192),l=nt}e:do if((Xe|0)==87&&!o)if(!L)m=0;else{for(m=1;l=n[g+(m<<2)>>2]|0,!!l;)if(rX(A+(m<<3)|0,l,u),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[g+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return I=cr,m|0}function gHe(o){return o=o|0,0}function mHe(o){o=o|0}function Ps(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]&32||QHe(l,u,o)|0}function tX(o){o=o|0;var l=0,u=0,A=0;if(u=n[o>>2]|0,A=(s[u>>0]|0)+-48|0,A>>>0<10){l=0;do l=A+(l*10|0)|0,u=u+1|0,n[o>>2]=u,A=(s[u>>0]|0)+-48|0;while(A>>>0<10)}else l=0;return l|0}function rX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,n[o>>2]=l;break e}case 10:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=0;break e}case 12:{A=(n[u>>2]|0)+7&-8,l=A,g=n[l>>2]|0,l=n[l+4>>2]|0,n[u>>2]=A+8,A=o,n[A>>2]=g,n[A+4>>2]=l;break e}case 13:{g=(n[u>>2]|0)+3&-4,A=n[g>>2]|0,n[u>>2]=g+4,A=(A&65535)<<16>>16,g=o,n[g>>2]=A,n[g+4>>2]=((A|0)<0)<<31>>31;break e}case 14:{g=(n[u>>2]|0)+3&-4,A=n[g>>2]|0,n[u>>2]=g+4,g=o,n[g>>2]=A&65535,n[g+4>>2]=0;break e}case 15:{g=(n[u>>2]|0)+3&-4,A=n[g>>2]|0,n[u>>2]=g+4,A=(A&255)<<24>>24,g=o,n[g>>2]=A,n[g+4>>2]=((A|0)<0)<<31>>31;break e}case 16:{g=(n[u>>2]|0)+3&-4,A=n[g>>2]|0,n[u>>2]=g+4,g=o,n[g>>2]=A&255,n[g+4>>2]=0;break e}case 17:{g=(n[u>>2]|0)+7&-8,m=+E[g>>3],n[u>>2]=g+8,E[o>>3]=m;break e}case 18:{g=(n[u>>2]|0)+7&-8,m=+E[g>>3],n[u>>2]=g+8,E[o>>3]=m;break e}default:break e}while(!1);while(!1)}function yHe(o,l,u,A){if(o=o|0,l=l|0,u=u|0,A=A|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=c[5694+(o&15)>>0]|0|A,o=zP(o|0,l|0,4)|0,l=Ie;while(!((o|0)==0&(l|0)==0));return u|0}function EHe(o,l,u){if(o=o|0,l=l|0,u=u|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=o&7|48,o=zP(o|0,l|0,3)|0,l=Ie;while(!((o|0)==0&(l|0)==0));return u|0}function iE(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if(l>>>0>0|(l|0)==0&o>>>0>4294967295){for(;A=oU(o|0,l|0,10,0)|0,u=u+-1|0,s[u>>0]=A&255|48,A=o,o=sU(o|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&A>>>0>4294967295;)l=Ie;l=o}else l=o;if(l)for(;u=u+-1|0,s[u>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return u|0}function IHe(o){return o=o|0,DHe(o,n[(bHe()|0)+188>>2]|0)|0}function CHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;m=l&255,A=(u|0)!=0;e:do if(A&(o&3|0)!=0)for(g=l&255;;){if((s[o>>0]|0)==g<<24>>24){B=6;break e}if(o=o+1|0,u=u+-1|0,A=(u|0)!=0,!(A&(o&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(A?B=6:u=0);e:do if((B|0)==6&&(g=l&255,(s[o>>0]|0)!=g<<24>>24)){A=Me(m,16843009)|0;t:do if(u>>>0>3){for(;m=n[o>>2]^A,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(o=o+4|0,u=u+-4|0,u>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!u){u=0;break}for(;;){if((s[o>>0]|0)==g<<24>>24)break e;if(o=o+1|0,u=u+-1|0,!u){u=0;break}}}while(!1);return(u|0?o:0)|0}function _s(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0;if(B=I,I=I+256|0,m=B,(u|0)>(A|0)&(g&73728|0)==0){if(g=u-A|0,oE(m|0,l|0,(g>>>0<256?g:256)|0)|0,g>>>0>255){l=u-A|0;do Ps(o,m,256),g=g+-256|0;while(g>>>0>255);g=l&255}Ps(o,m,g)}I=B}function nX(o,l){return o=o|0,l=l|0,o?o=vHe(o,l,0)|0:o=0,o|0}function wHe(o,l,u,A,g,m){o=o|0,l=+l,u=u|0,A=A|0,g=g|0,m=m|0;var B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0,Re=0,nt=0,Xe=0,At=0,He=0,We=0,Mt=0,qr=0,fr=0,$t=0,Fr=0,jr=0,cr=0,Gn=0;Gn=I,I=I+560|0,T=Gn+8|0,nt=Gn,cr=Gn+524|0,jr=cr,M=Gn+512|0,n[nt>>2]=0,Fr=M+12|0,iX(l)|0,(Ie|0)<0?(l=-l,fr=1,qr=5659):(fr=(g&2049|0)!=0&1,qr=g&2048|0?5662:g&1|0?5665:5660),iX(l)|0,$t=Ie&2146435072;do if($t>>>0<2146435072|($t|0)==2146435072&!1){if(Ve=+BHe(l,nt)*2,B=Ve!=0,B&&(n[nt>>2]=(n[nt>>2]|0)+-1),At=m|32,(At|0)==97){Le=m&32,oe=Le|0?qr+9|0:qr,q=fr|2,B=12-A|0;do if(A>>>0>11|(B|0)==0)l=Ve;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((s[oe>>0]|0)==45){l=-(l+(-Ve-l));break}else{l=Ve+l-l;break}}while(!1);k=n[nt>>2]|0,B=(k|0)<0?0-k|0:k,B=iE(B,((B|0)<0)<<31>>31,Fr)|0,(B|0)==(Fr|0)&&(B=M+11|0,s[B>>0]=48),s[B+-1>>0]=(k>>31&2)+43,L=B+-2|0,s[L>>0]=m+15,M=(A|0)<1,T=(g&8|0)==0,B=cr;do $t=~~l,k=B+1|0,s[B>>0]=c[5694+$t>>0]|Le,l=(l-+($t|0))*16,(k-jr|0)==1&&!(T&(M&l==0))?(s[k>>0]=46,B=B+2|0):B=k;while(l!=0);$t=B-jr|0,jr=Fr-L|0,Fr=(A|0)!=0&($t+-2|0)<(A|0)?A+2|0:$t,B=jr+q+Fr|0,_s(o,32,u,B,g),Ps(o,oe,q),_s(o,48,u,B,g^65536),Ps(o,cr,$t),_s(o,48,Fr-$t|0,0,0),Ps(o,L,jr),_s(o,32,u,B,g^8192);break}k=(A|0)<0?6:A,B?(B=(n[nt>>2]|0)+-28|0,n[nt>>2]=B,l=Ve*268435456):(l=Ve,B=n[nt>>2]|0),$t=(B|0)<0?T:T+288|0,T=$t;do We=~~l>>>0,n[T>>2]=We,T=T+4|0,l=(l-+(We>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=$t,q=T;;){if(L=(B|0)<29?B:29,B=q+-4|0,B>>>0>=M>>>0){T=0;do He=uX(n[B>>2]|0,0,L|0)|0,He=iU(He|0,Ie|0,T|0,0)|0,We=Ie,Xe=oU(He|0,We|0,1e9,0)|0,n[B>>2]=Xe,T=sU(He|0,We|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);T&&(M=M+-4|0,n[M>>2]=T)}for(T=q;!(T>>>0<=M>>>0);)if(B=T+-4|0,!(n[B>>2]|0))T=B;else break;if(B=(n[nt>>2]|0)-L|0,n[nt>>2]=B,(B|0)>0)q=T;else break}else M=$t;if((B|0)<0){A=((k+25|0)/9|0)+1|0,Re=(At|0)==102;do{if(Le=0-B|0,Le=(Le|0)<9?Le:9,M>>>0>>0){L=(1<>>Le,oe=0,B=M;do We=n[B>>2]|0,n[B>>2]=(We>>>Le)+oe,oe=Me(We&L,q)|0,B=B+4|0;while(B>>>0>>0);B=n[M>>2]|0?M:M+4|0,oe?(n[T>>2]=oe,M=B,B=T+4|0):(M=B,B=T)}else M=n[M>>2]|0?M:M+4|0,B=T;T=Re?$t:M,T=(B-T>>2|0)>(A|0)?T+(A<<2)|0:B,B=(n[nt>>2]|0)+Le|0,n[nt>>2]=B}while((B|0)<0);B=M,A=T}else B=M,A=T;if(We=$t,B>>>0>>0){if(T=(We-B>>2)*9|0,L=n[B>>2]|0,L>>>0>=10){M=10;do M=M*10|0,T=T+1|0;while(L>>>0>=M>>>0)}}else T=0;if(Re=(At|0)==103,Xe=(k|0)!=0,M=k-((At|0)!=102?T:0)+((Xe&Re)<<31>>31)|0,(M|0)<(((A-We>>2)*9|0)+-9|0)){if(M=M+9216|0,Le=$t+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){L=10;do L=L*10|0,M=M+1|0;while((M|0)!=9)}else L=10;if(q=n[Le>>2]|0,oe=(q>>>0)%(L>>>0)|0,M=(Le+4|0)==(A|0),M&(oe|0)==0)M=Le;else if(Ve=((q>>>0)/(L>>>0)|0)&1|0?9007199254740994:9007199254740992,He=(L|0)/2|0,l=oe>>>0>>0?.5:M&(oe|0)==(He|0)?1:1.5,fr&&(He=(s[qr>>0]|0)==45,l=He?-l:l,Ve=He?-Ve:Ve),M=q-oe|0,n[Le>>2]=M,Ve+l!=Ve){if(He=M+L|0,n[Le>>2]=He,He>>>0>999999999)for(T=Le;M=T+-4|0,n[T>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),He=(n[M>>2]|0)+1|0,n[M>>2]=He,He>>>0>999999999;)T=M;else M=Le;if(T=(We-B>>2)*9|0,q=n[B>>2]|0,q>>>0>=10){L=10;do L=L*10|0,T=T+1|0;while(q>>>0>=L>>>0)}}else M=Le;M=M+4|0,M=A>>>0>M>>>0?M:A,He=B}else M=A,He=B;for(At=M;;){if(At>>>0<=He>>>0){nt=0;break}if(B=At+-4|0,!(n[B>>2]|0))At=B;else{nt=1;break}}A=0-T|0;do if(Re)if(B=((Xe^1)&1)+k|0,(B|0)>(T|0)&(T|0)>-5?(L=m+-1|0,k=B+-1-T|0):(L=m+-2|0,k=B+-1|0),B=g&8,B)Le=B;else{if(nt&&(Mt=n[At+-4>>2]|0,(Mt|0)!=0))if((Mt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Mt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((At-We>>2)*9|0)+-9|0,(L|32|0)==102){Le=B-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}else{Le=B+T-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}}else L=m,Le=g&8;while(!1);if(Re=k|Le,q=(Re|0)!=0&1,oe=(L|32|0)==102,oe)Xe=0,B=(T|0)>0?T:0;else{if(B=(T|0)<0?A:T,B=iE(B,((B|0)<0)<<31>>31,Fr)|0,M=Fr,(M-B|0)<2)do B=B+-1|0,s[B>>0]=48;while((M-B|0)<2);s[B+-1>>0]=(T>>31&2)+43,B=B+-2|0,s[B>>0]=L,Xe=B,B=M-B|0}if(B=fr+1+k+q+B|0,_s(o,32,u,B,g),Ps(o,qr,fr),_s(o,48,u,B,g^65536),oe){L=He>>>0>$t>>>0?$t:He,Le=cr+9|0,q=Le,oe=cr+8|0,M=L;do{if(T=iE(n[M>>2]|0,0,Le)|0,(M|0)==(L|0))(T|0)==(Le|0)&&(s[oe>>0]=48,T=oe);else if(T>>>0>cr>>>0){oE(cr|0,48,T-jr|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}Ps(o,T,q-T|0),M=M+4|0}while(M>>>0<=$t>>>0);if(Re|0&&Ps(o,5710,1),M>>>0>>0&(k|0)>0)for(;;){if(T=iE(n[M>>2]|0,0,Le)|0,T>>>0>cr>>>0){oE(cr|0,48,T-jr|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}if(Ps(o,T,(k|0)<9?k:9),M=M+4|0,T=k+-9|0,M>>>0>>0&(k|0)>9)k=T;else{k=T;break}}_s(o,48,k+9|0,9,0)}else{if(Re=nt?At:He+4|0,(k|0)>-1){nt=cr+9|0,Le=(Le|0)==0,A=nt,q=0-jr|0,oe=cr+8|0,L=He;do{T=iE(n[L>>2]|0,0,nt)|0,(T|0)==(nt|0)&&(s[oe>>0]=48,T=oe);do if((L|0)==(He|0)){if(M=T+1|0,Ps(o,T,1),Le&(k|0)<1){T=M;break}Ps(o,5710,1),T=M}else{if(T>>>0<=cr>>>0)break;oE(cr|0,48,T+q|0)|0;do T=T+-1|0;while(T>>>0>cr>>>0)}while(!1);jr=A-T|0,Ps(o,T,(k|0)>(jr|0)?jr:k),k=k-jr|0,L=L+4|0}while(L>>>0>>0&(k|0)>-1)}_s(o,48,k+18|0,18,0),Ps(o,Xe,Fr-Xe|0)}_s(o,32,u,B,g^8192)}else cr=(m&32|0)!=0,B=fr+3|0,_s(o,32,u,B,g&-65537),Ps(o,qr,fr),Ps(o,l!=l|!1?cr?5686:5690:cr?5678:5682,3),_s(o,32,u,B,g^8192);while(!1);return I=Gn,((B|0)<(u|0)?u:B)|0}function iX(o){o=+o;var l=0;return E[S>>3]=o,l=n[S>>2]|0,Ie=n[S+4>>2]|0,l|0}function BHe(o,l){return o=+o,l=l|0,+ +sX(o,l)}function sX(o,l){o=+o,l=l|0;var u=0,A=0,g=0;switch(E[S>>3]=o,u=n[S>>2]|0,A=n[S+4>>2]|0,g=zP(u|0,A|0,52)|0,g&2047){case 0:{o!=0?(o=+sX(o*18446744073709552e3,l),u=(n[l>>2]|0)+-64|0):u=0,n[l>>2]=u;break}case 2047:break;default:n[l>>2]=(g&2047)+-1022,n[S>>2]=u,n[S+4>>2]=A&-2146435073|1071644672,o=+E[S>>3]}return+o}function vHe(o,l,u){o=o|0,l=l|0,u=u|0;do if(o){if(l>>>0<128){s[o>>0]=l,o=1;break}if(!(n[n[(SHe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){s[o>>0]=l,o=1;break}else{n[(nE()|0)>>2]=84,o=-1;break}if(l>>>0<2048){s[o>>0]=l>>>6|192,s[o+1>>0]=l&63|128,o=2;break}if(l>>>0<55296|(l&-8192|0)==57344){s[o>>0]=l>>>12|224,s[o+1>>0]=l>>>6&63|128,s[o+2>>0]=l&63|128,o=3;break}if((l+-65536|0)>>>0<1048576){s[o>>0]=l>>>18|240,s[o+1>>0]=l>>>12&63|128,s[o+2>>0]=l>>>6&63|128,s[o+3>>0]=l&63|128,o=4;break}else{n[(nE()|0)>>2]=84,o=-1;break}}else o=1;while(!1);return o|0}function SHe(){return tU()|0}function bHe(){return tU()|0}function DHe(o,l){o=o|0,l=l|0;var u=0,A=0;for(A=0;;){if((c[5712+A>>0]|0)==(o|0)){o=2;break}if(u=A+1|0,(u|0)==87){u=5800,A=87,o=5;break}else A=u}if((o|0)==2&&(A?(u=5800,o=5):u=5800),(o|0)==5)for(;;){do o=u,u=u+1|0;while(s[o>>0]|0);if(A=A+-1|0,A)o=5;else break}return PHe(u,n[l+20>>2]|0)|0}function PHe(o,l){return o=o|0,l=l|0,xHe(o,l)|0}function xHe(o,l){return o=o|0,l=l|0,l?l=kHe(n[l>>2]|0,n[l+4>>2]|0,o)|0:l=0,(l|0?l:o)|0}function kHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0;oe=(n[o>>2]|0)+1794895138|0,m=p0(n[o+8>>2]|0,oe)|0,A=p0(n[o+12>>2]|0,oe)|0,g=p0(n[o+16>>2]|0,oe)|0;e:do if(m>>>0>>2>>>0&&(q=l-(m<<2)|0,A>>>0>>0&g>>>0>>0)&&!((g|A)&3|0)){for(q=A>>>2,L=g>>>2,M=0;;){if(k=m>>>1,T=M+k|0,B=T<<1,g=B+q|0,A=p0(n[o+(g<<2)>>2]|0,oe)|0,g=p0(n[o+(g+1<<2)>>2]|0,oe)|0,!(g>>>0>>0&A>>>0<(l-g|0)>>>0)){A=0;break e}if(s[o+(g+A)>>0]|0){A=0;break e}if(A=$Z(u,o+g|0)|0,!A)break;if(A=(A|0)<0,(m|0)==1){A=0;break e}else M=A?M:T,m=A?k:m-k|0}A=B+L|0,g=p0(n[o+(A<<2)>>2]|0,oe)|0,A=p0(n[o+(A+1<<2)>>2]|0,oe)|0,A>>>0>>0&g>>>0<(l-A|0)>>>0?A=s[o+(A+g)>>0]|0?0:o+A|0:A=0}else A=0;while(!1);return A|0}function p0(o,l){o=o|0,l=l|0;var u=0;return u=pX(o|0)|0,(l|0?u:o)|0}function QHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0,k=0;A=u+16|0,g=n[A>>2]|0,g?m=5:THe(u)|0?A=0:(g=n[A>>2]|0,m=5);e:do if((m|0)==5){if(k=u+20|0,B=n[k>>2]|0,A=B,(g-B|0)>>>0>>0){A=XP[n[u+36>>2]&7](u,o,l)|0;break}t:do if((s[u+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,g=o;break t}if(g=B+-1|0,(s[o+g>>0]|0)==10)break;B=g}if(A=XP[n[u+36>>2]&7](u,o,B)|0,A>>>0>>0)break e;m=B,g=o+B|0,l=l-B|0,A=n[k>>2]|0}else m=0,g=o;while(!1);Rr(A|0,g|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,A=m+l|0}while(!1);return A|0}function THe(o){o=o|0;var l=0,u=0;return l=o+74|0,u=s[l>>0]|0,s[l>>0]=u+255|u,l=n[o>>2]|0,l&8?(n[o>>2]=l|32,o=-1):(n[o+8>>2]=0,n[o+4>>2]=0,u=n[o+44>>2]|0,n[o+28>>2]=u,n[o+20>>2]=u,n[o+16>>2]=u+(n[o+48>>2]|0),o=0),o|0}function ni(o,l){o=y(o),l=y(l);var u=0,A=0;u=oX(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=oX(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?l:o;break}else{o=o>2]=o,n[S>>2]|0|0}function h0(o,l){o=y(o),l=y(l);var u=0,A=0;u=aX(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=aX(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?o:l;break}else{o=o>2]=o,n[S>>2]|0|0}function nU(o,l){o=y(o),l=y(l);var u=0,A=0,g=0,m=0,B=0,k=0,T=0,M=0;m=(h[S>>2]=o,n[S>>2]|0),k=(h[S>>2]=l,n[S>>2]|0),u=m>>>23&255,B=k>>>23&255,T=m&-2147483648,g=k<<1;e:do if(g|0&&!((u|0)==255|((RHe(l)|0)&2147483647)>>>0>2139095040)){if(A=m<<1,A>>>0<=g>>>0)return l=y(o*y(0)),y((A|0)==(g|0)?l:o);if(u)A=m&8388607|8388608;else{if(u=m<<9,(u|0)>-1){A=u,u=0;do u=u+-1|0,A=A<<1;while((A|0)>-1)}else u=0;A=m<<1-u}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){g=0;do g=g+-1|0,m=m<<1;while((m|0)>-1)}else g=0;B=g,k=k<<1-g}g=A-k|0,m=(g|0)>-1;t:do if((u|0)>(B|0)){for(;;){if(m)if(g)A=g;else break;if(A=A<<1,u=u+-1|0,g=A-k|0,m=(g|0)>-1,(u|0)<=(B|0))break t}l=y(o*y(0));break e}while(!1);if(m)if(g)A=g;else{l=y(o*y(0));break}if(A>>>0<8388608)do A=A<<1,u=u+-1|0;while(A>>>0<8388608);(u|0)>0?u=A+-8388608|u<<23:u=A>>>(1-u|0),l=(n[S>>2]=u|T,y(h[S>>2]))}else M=3;while(!1);return(M|0)==3&&(l=y(o*l),l=y(l/l)),y(l)}function RHe(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function FHe(o,l){return o=o|0,l=l|0,eX(n[582]|0,o,l)|0}function an(o){o=o|0,Ot()}function sE(o){o=o|0}function NHe(o,l){return o=o|0,l=l|0,0}function OHe(o){return o=o|0,(lX(o+4|0)|0)==-1?(ap[n[(n[o>>2]|0)+8>>2]&127](o),o=1):o=0,o|0}function lX(o){o=o|0;var l=0;return l=n[o>>2]|0,n[o>>2]=l+-1,l+-1|0}function qh(o){o=o|0,OHe(o)|0&&LHe(o)}function LHe(o){o=o|0;var l=0;l=o+8|0,n[l>>2]|0&&(lX(l)|0)!=-1||ap[n[(n[o>>2]|0)+16>>2]&127](o)}function Jt(o){o=o|0;var l=0;for(l=o|0?o:1;o=WP(l)|0,!(o|0);){if(o=UHe()|0,!o){o=0;break}BX[o&0]()}return o|0}function cX(o){return o=o|0,Jt(o)|0}function It(o){o=o|0,VP(o)}function MHe(o){o=o|0,(s[o+11>>0]|0)<0&&It(n[o>>2]|0)}function UHe(){var o=0;return o=n[2923]|0,n[2923]=o+0,o|0}function _He(){}function JP(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,A=l-A-(u>>>0>o>>>0|0)>>>0,Ie=A,o-u>>>0|0|0}function iU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,u=o+u>>>0,Ie=l+A+(u>>>0>>0|0)>>>0,u|0|0}function oE(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0,B=0;if(m=o+u|0,l=l&255,(u|0)>=67){for(;o&3;)s[o>>0]=l,o=o+1|0;for(A=m&-4|0,g=A-64|0,B=l|l<<8|l<<16|l<<24;(o|0)<=(g|0);)n[o>>2]=B,n[o+4>>2]=B,n[o+8>>2]=B,n[o+12>>2]=B,n[o+16>>2]=B,n[o+20>>2]=B,n[o+24>>2]=B,n[o+28>>2]=B,n[o+32>>2]=B,n[o+36>>2]=B,n[o+40>>2]=B,n[o+44>>2]=B,n[o+48>>2]=B,n[o+52>>2]=B,n[o+56>>2]=B,n[o+60>>2]=B,o=o+64|0;for(;(o|0)<(A|0);)n[o>>2]=B,o=o+4|0}for(;(o|0)<(m|0);)s[o>>0]=l,o=o+1|0;return m-u|0}function uX(o,l,u){return o=o|0,l=l|0,u=u|0,(u|0)<32?(Ie=l<>>32-u,o<>>u,o>>>u|(l&(1<>>u-32|0)}function Rr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,g=0,m=0;if((u|0)>=8192)return UA(o|0,l|0,u|0)|0;if(m=o|0,g=o+u|0,(o&3)==(l&3)){for(;o&3;){if(!u)return m|0;s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0,u=u-1|0}for(u=g&-4|0,A=u-64|0;(o|0)<=(A|0);)n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2],n[o+16>>2]=n[l+16>>2],n[o+20>>2]=n[l+20>>2],n[o+24>>2]=n[l+24>>2],n[o+28>>2]=n[l+28>>2],n[o+32>>2]=n[l+32>>2],n[o+36>>2]=n[l+36>>2],n[o+40>>2]=n[l+40>>2],n[o+44>>2]=n[l+44>>2],n[o+48>>2]=n[l+48>>2],n[o+52>>2]=n[l+52>>2],n[o+56>>2]=n[l+56>>2],n[o+60>>2]=n[l+60>>2],o=o+64|0,l=l+64|0;for(;(o|0)<(u|0);)n[o>>2]=n[l>>2],o=o+4|0,l=l+4|0}else for(u=g-4|0;(o|0)<(u|0);)s[o>>0]=s[l>>0]|0,s[o+1>>0]=s[l+1>>0]|0,s[o+2>>0]=s[l+2>>0]|0,s[o+3>>0]=s[l+3>>0]|0,o=o+4|0,l=l+4|0;for(;(o|0)<(g|0);)s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0;return m|0}function fX(o){o=o|0;var l=0;return l=s[N+(o&255)>>0]|0,(l|0)<8?l|0:(l=s[N+(o>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=s[N+(o>>16&255)>>0]|0,(l|0)<8?l+16|0:(s[N+(o>>>24)>>0]|0)+24|0))}function AX(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0;var m=0,B=0,k=0,T=0,M=0,L=0,q=0,oe=0,Ve=0,Le=0;if(L=o,T=l,M=T,B=u,oe=A,k=oe,!M)return m=(g|0)!=0,k?m?(n[g>>2]=o|0,n[g+4>>2]=l&0,oe=0,g=0,Ie=oe,g|0):(oe=0,g=0,Ie=oe,g|0):(m&&(n[g>>2]=(L>>>0)%(B>>>0),n[g+4>>2]=0),oe=0,g=(L>>>0)/(B>>>0)>>>0,Ie=oe,g|0);m=(k|0)==0;do if(B){if(!m){if(m=(D(k|0)|0)-(D(M|0)|0)|0,m>>>0<=31){q=m+1|0,k=31-m|0,l=m-31>>31,B=q,o=L>>>(q>>>0)&l|M<>>(q>>>0)&l,m=0,k=L<>2]=o|0,n[g+4>>2]=T|l&0,oe=0,g=0,Ie=oe,g|0):(oe=0,g=0,Ie=oe,g|0)}if(m=B-1|0,m&B|0){k=(D(B|0)|0)+33-(D(M|0)|0)|0,Le=64-k|0,q=32-k|0,T=q>>31,Ve=k-32|0,l=Ve>>31,B=k,o=q-1>>31&M>>>(Ve>>>0)|(M<>>(k>>>0))&l,l=l&M>>>(k>>>0),m=L<>>(Ve>>>0))&T|L<>31;break}return g|0&&(n[g>>2]=m&L,n[g+4>>2]=0),(B|0)==1?(Ve=T|l&0,Le=o|0|0,Ie=Ve,Le|0):(Le=fX(B|0)|0,Ve=M>>>(Le>>>0)|0,Le=M<<32-Le|L>>>(Le>>>0)|0,Ie=Ve,Le|0)}else{if(m)return g|0&&(n[g>>2]=(M>>>0)%(B>>>0),n[g+4>>2]=0),Ve=0,Le=(M>>>0)/(B>>>0)>>>0,Ie=Ve,Le|0;if(!L)return g|0&&(n[g>>2]=0,n[g+4>>2]=(M>>>0)%(k>>>0)),Ve=0,Le=(M>>>0)/(k>>>0)>>>0,Ie=Ve,Le|0;if(m=k-1|0,!(m&k))return g|0&&(n[g>>2]=o|0,n[g+4>>2]=m&M|l&0),Ve=0,Le=M>>>((fX(k|0)|0)>>>0),Ie=Ve,Le|0;if(m=(D(k|0)|0)-(D(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,o=M<>>(l>>>0),l=M>>>(l>>>0),m=0,k=L<>2]=o|0,n[g+4>>2]=T|l&0,Ve=0,Le=0,Ie=Ve,Le|0):(Ve=0,Le=0,Ie=Ve,Le|0)}while(!1);if(!B)M=k,T=0,k=0;else{q=u|0|0,L=oe|A&0,M=iU(q|0,L|0,-1,-1)|0,u=Ie,T=k,k=0;do A=T,T=m>>>31|T<<1,m=k|m<<1,A=o<<1|A>>>31|0,oe=o>>>31|l<<1|0,JP(M|0,u|0,A|0,oe|0)|0,Le=Ie,Ve=Le>>31|((Le|0)<0?-1:0)<<1,k=Ve&1,o=JP(A|0,oe|0,Ve&q|0,(((Le|0)<0?-1:0)>>31|((Le|0)<0?-1:0)<<1)&L|0)|0,l=Ie,B=B-1|0;while(B|0);M=T,T=0}return B=0,g|0&&(n[g>>2]=o,n[g+4>>2]=l),Ve=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|T,Le=(m<<1|0)&-2|k,Ie=Ve,Le|0}function sU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,AX(o,l,u,A,0)|0}function Yh(o){o=o|0;var l=0,u=0;return u=o+15&-16|0,l=n[C>>2]|0,o=l+u|0,(u|0)>0&(o|0)<(l|0)|(o|0)<0?(se()|0,uu(12),-1):(n[C>>2]=o,(o|0)>(ee()|0)&&!(Z()|0)?(n[C>>2]=l,uu(12),-1):l|0)}function x2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if((l|0)<(o|0)&(o|0)<(l+u|0)){for(A=o,l=l+u|0,o=o+u|0;(u|0)>0;)o=o-1|0,l=l-1|0,u=u-1|0,s[o>>0]=s[l>>0]|0;o=A}else Rr(o,l,u)|0;return o|0}function oU(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var g=0,m=0;return m=I,I=I+16|0,g=m|0,AX(o,l,u,A,g)|0,I=m,Ie=n[g+4>>2]|0,n[g>>2]|0|0}function pX(o){return o=o|0,(o&255)<<24|(o>>8&255)<<16|(o>>16&255)<<8|o>>>24|0}function HHe(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,hX[o&1](l|0,u|0,A|0,g|0,m|0)}function jHe(o,l,u){o=o|0,l=l|0,u=y(u),dX[o&1](l|0,y(u))}function GHe(o,l,u){o=o|0,l=l|0,u=+u,gX[o&31](l|0,+u)}function qHe(o,l,u,A){return o=o|0,l=l|0,u=y(u),A=y(A),y(mX[o&0](l|0,y(u),y(A)))}function YHe(o,l){o=o|0,l=l|0,ap[o&127](l|0)}function WHe(o,l,u){o=o|0,l=l|0,u=u|0,lp[o&31](l|0,u|0)}function VHe(o,l){return o=o|0,l=l|0,g0[o&31](l|0)|0}function KHe(o,l,u,A,g){o=o|0,l=l|0,u=+u,A=+A,g=g|0,yX[o&1](l|0,+u,+A,g|0)}function JHe(o,l,u,A){o=o|0,l=l|0,u=+u,A=+A,xje[o&1](l|0,+u,+A)}function zHe(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,XP[o&7](l|0,u|0,A|0)|0}function ZHe(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,+kje[o&1](l|0,u|0,A|0)}function XHe(o,l){return o=o|0,l=l|0,+EX[o&15](l|0)}function $He(o,l,u){return o=o|0,l=l|0,u=+u,Qje[o&1](l|0,+u)|0}function eje(o,l,u){return o=o|0,l=l|0,u=u|0,lU[o&15](l|0,u|0)|0}function tje(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=+A,g=+g,m=m|0,Tje[o&1](l|0,u|0,+A,+g,m|0)}function rje(o,l,u,A,g,m,B){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,B=B|0,Rje[o&1](l|0,u|0,A|0,g|0,m|0,B|0)}function nje(o,l,u){return o=o|0,l=l|0,u=u|0,+IX[o&7](l|0,u|0)}function ije(o){return o=o|0,$P[o&7]()|0}function sje(o,l,u,A,g,m){return o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,CX[o&1](l|0,u|0,A|0,g|0,m|0)|0}function oje(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=+g,Fje[o&1](l|0,u|0,A|0,+g)}function aje(o,l,u,A,g,m,B){o=o|0,l=l|0,u=u|0,A=y(A),g=g|0,m=y(m),B=B|0,wX[o&1](l|0,u|0,y(A),g|0,y(m),B|0)}function lje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,T2[o&15](l|0,u|0,A|0)}function cje(o){o=o|0,BX[o&0]()}function uje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,vX[o&15](l|0,u|0,+A)}function fje(o,l,u){return o=o|0,l=+l,u=+u,Nje[o&1](+l,+u)|0}function Aje(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,cU[o&15](l|0,u|0,A|0,g|0)}function pje(o,l,u,A,g){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,F(0)}function hje(o,l){o=o|0,l=y(l),F(1)}function ol(o,l){o=o|0,l=+l,F(2)}function dje(o,l,u){return o=o|0,l=y(l),u=y(u),F(3),$e}function Br(o){o=o|0,F(4)}function k2(o,l){o=o|0,l=l|0,F(5)}function ql(o){return o=o|0,F(6),0}function gje(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,F(7)}function mje(o,l,u){o=o|0,l=+l,u=+u,F(8)}function yje(o,l,u){return o=o|0,l=l|0,u=u|0,F(9),0}function Eje(o,l,u){return o=o|0,l=l|0,u=u|0,F(10),0}function d0(o){return o=o|0,F(11),0}function Ije(o,l){return o=o|0,l=+l,F(12),0}function Q2(o,l){return o=o|0,l=l|0,F(13),0}function Cje(o,l,u,A,g){o=o|0,l=l|0,u=+u,A=+A,g=g|0,F(14)}function wje(o,l,u,A,g,m){o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,m=m|0,F(15)}function aU(o,l){return o=o|0,l=l|0,F(16),0}function Bje(){return F(17),0}function vje(o,l,u,A,g){return o=o|0,l=l|0,u=u|0,A=A|0,g=g|0,F(18),0}function Sje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,F(19)}function bje(o,l,u,A,g,m){o=o|0,l=l|0,u=y(u),A=A|0,g=y(g),m=m|0,F(20)}function ZP(o,l,u){o=o|0,l=l|0,u=u|0,F(21)}function Dje(){F(22)}function aE(o,l,u){o=o|0,l=l|0,u=+u,F(23)}function Pje(o,l){return o=+o,l=+l,F(24),0}function lE(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F(25)}var hX=[pje,v_e],dX=[hje,My],gX=[ol,$g,Nh,A2,p2,h2,d2,kf,Wy,g2,Qf,e0,t0,m2,y2,Cu,r0,E2,Vy,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol,ol],mX=[dje],ap=[Br,sE,ixe,sxe,oxe,NTe,OTe,LTe,$Me,eUe,tUe,f_e,A_e,p_e,R8e,F8e,N8e,Ql,Xg,l2,sr,mc,NP,OP,KPe,hxe,bxe,qxe,oke,Bke,_ke,tQe,gQe,TQe,KQe,uTe,bTe,eRe,gRe,TRe,KRe,uFe,bFe,YFe,oNe,INe,ONe,wP,pOe,xOe,KOe,ALe,DLe,KLe,iMe,aMe,vMe,DMe,qMe,nUe,oUe,BUe,HUe,ez,w4e,$4e,h3e,x3e,Z3e,A8e,B8e,b8e,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br,Br],lp=[k2,Gy,_L,c2,u2,xr,po,Zi,Ms,bs,Yy,Fh,C2,DP,s0,qL,YL,PP,xP,KL,Tf,ne,JFe,cNe,gLe,S4e,JUe,MZ,k2,k2,k2,k2],g0=[ql,uHe,Hy,i0,Jy,Ca,BP,Oh,I2,jL,SP,zy,kP,JL,$y,UNe,QLe,bUe,x4e,Hl,ql,ql,ql,ql,ql,ql,ql,ql,ql,ql,ql,ql],yX=[gje,eM],xje=[mje,VMe],XP=[yje,XZ,fHe,hHe,Dke,iRe,mOe,R3e],kje=[Eje,XQe],EX=[d0,Lh,bP,rp,tM,v,b,Q,j,V,d0,d0,d0,d0,d0,d0],Qje=[Ije,tMe],lU=[Q2,NHe,QP,XPe,Kxe,Gke,iQe,kTe,IRe,vNe,Uy,y3e,Q2,Q2,Q2,Q2],Tje=[Cje,kxe],Rje=[wje,t8e],IX=[aU,WL,Be,_e,ht,hTe,aU,aU],$P=[Bje,Wt,_y,CP,fMe,QMe,uUe,k8e],CX=[vje,Qy],Fje=[Sje,XRe],wX=[bje,zL],T2=[ZP,Lo,vP,VL,Bu,uke,EQe,hFe,kFe,UL,V_e,n3e,g8e,ZP,ZP,ZP],BX=[Dje],vX=[aE,HL,qy,tp,f2,wu,Ky,n0,ORe,ROe,ZLe,aE,aE,aE,aE,aE],Nje=[Pje,ZMe],cU=[lE,OQe,VNe,XOe,_Le,mMe,LMe,mUe,WUe,N4e,H8e,lE,lE,lE,lE,lE];return{_llvm_bswap_i32:pX,dynCall_idd:fje,dynCall_i:ije,_i64Subtract:JP,___udivdi3:sU,dynCall_vif:jHe,setThrew:da,dynCall_viii:lje,_bitshift64Lshr:zP,_bitshift64Shl:uX,dynCall_vi:YHe,dynCall_viiddi:tje,dynCall_diii:ZHe,dynCall_iii:eje,_memset:oE,_sbrk:Yh,_memcpy:Rr,__GLOBAL__sub_I_Yoga_cpp:s2,dynCall_vii:WHe,___uremdi3:oU,dynCall_vid:GHe,stackAlloc:Ja,_nbind_init:X8e,getTempRet0:HA,dynCall_di:XHe,dynCall_iid:$He,setTempRet0:_A,_i64Add:iU,dynCall_fiff:qHe,dynCall_iiii:zHe,_emscripten_get_global_libc:cHe,dynCall_viid:uje,dynCall_viiid:oje,dynCall_viififi:aje,dynCall_ii:VHe,__GLOBAL__sub_I_Binding_cc:h4e,dynCall_viiii:Aje,dynCall_iiiiii:sje,stackSave:mf,dynCall_viiiii:HHe,__GLOBAL__sub_I_nbind_cc:Sr,dynCall_vidd:JHe,_free:VP,runPostSets:_He,dynCall_viiiiii:rje,establishStackSpace:Sn,_memmove:x2,stackRestore:fc,_malloc:WP,__GLOBAL__sub_I_common_cc:FUe,dynCall_viddi:KHe,dynCall_dii:nje,dynCall_v:cje}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function e(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function e(t){t=t||[],ensureInitRuntime();var r=t.length+1;function s(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];s();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function t(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),t()},1)):t()}Module.run=Module.run=run;function exit(e,t){t&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=e,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(e)),ENVIRONMENT_IS_NODE&&process.exit(e),Module.quit(e,new ExitStatus(e)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(e){Module.onAbort&&Module.onAbort(e),e!==void 0?(Module.print(e),Module.printErr(e),e=JSON.stringify(e)):e="",ABORT=!0,EXITSTATUS=1;var t=` +If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+e+") at "+stackTrace()+t;throw abortDecorators&&abortDecorators.forEach(function(s){r=s(r,e)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var _m=G((d7t,OIe)=>{"use strict";var cft=FIe(),uft=NIe(),vq=!1,Sq=null;uft({},function(e,t){if(!vq){if(vq=!0,e)throw e;Sq=t}});if(!vq)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");OIe.exports=cft(Sq.bind,Sq.lib)});var Dq=G((g7t,bq)=>{"use strict";var LIe=e=>Number.isNaN(e)?!1:e>=4352&&(e<=4447||e===9001||e===9002||11904<=e&&e<=12871&&e!==12351||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141);bq.exports=LIe;bq.exports.default=LIe});var UIe=G((m7t,MIe)=>{"use strict";MIe.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var KS=G((y7t,Pq)=>{"use strict";var fft=Ik(),Aft=Dq(),pft=UIe(),_Ie=e=>{if(typeof e!="string"||e.length===0||(e=fft(e),e.length===0))return 0;e=e.replace(pft()," ");let t=0;for(let r=0;r=127&&s<=159||s>=768&&s<=879||(s>65535&&r++,t+=Aft(s)?2:1)}return t};Pq.exports=_Ie;Pq.exports.default=_Ie});var kq=G((E7t,xq)=>{"use strict";var hft=KS(),HIe=e=>{let t=0;for(let r of e.split(` +`))t=Math.max(t,hft(r));return t};xq.exports=HIe;xq.exports.default=HIe});var jIe=G(JS=>{"use strict";var dft=JS&&JS.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(JS,"__esModule",{value:!0});var gft=dft(kq()),Qq={};JS.default=e=>{if(e.length===0)return{width:0,height:0};if(Qq[e])return Qq[e];let t=gft.default(e),r=e.split(` +`).length;return Qq[e]={width:t,height:r},{width:t,height:r}}});var GIe=G(zS=>{"use strict";var mft=zS&&zS.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(zS,"__esModule",{value:!0});var kn=mft(_m()),yft=(e,t)=>{"position"in t&&e.setPositionType(t.position==="absolute"?kn.default.POSITION_TYPE_ABSOLUTE:kn.default.POSITION_TYPE_RELATIVE)},Eft=(e,t)=>{"marginLeft"in t&&e.setMargin(kn.default.EDGE_START,t.marginLeft||0),"marginRight"in t&&e.setMargin(kn.default.EDGE_END,t.marginRight||0),"marginTop"in t&&e.setMargin(kn.default.EDGE_TOP,t.marginTop||0),"marginBottom"in t&&e.setMargin(kn.default.EDGE_BOTTOM,t.marginBottom||0)},Ift=(e,t)=>{"paddingLeft"in t&&e.setPadding(kn.default.EDGE_LEFT,t.paddingLeft||0),"paddingRight"in t&&e.setPadding(kn.default.EDGE_RIGHT,t.paddingRight||0),"paddingTop"in t&&e.setPadding(kn.default.EDGE_TOP,t.paddingTop||0),"paddingBottom"in t&&e.setPadding(kn.default.EDGE_BOTTOM,t.paddingBottom||0)},Cft=(e,t)=>{var r;"flexGrow"in t&&e.setFlexGrow((r=t.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in t&&e.setFlexShrink(typeof t.flexShrink=="number"?t.flexShrink:1),"flexDirection"in t&&(t.flexDirection==="row"&&e.setFlexDirection(kn.default.FLEX_DIRECTION_ROW),t.flexDirection==="row-reverse"&&e.setFlexDirection(kn.default.FLEX_DIRECTION_ROW_REVERSE),t.flexDirection==="column"&&e.setFlexDirection(kn.default.FLEX_DIRECTION_COLUMN),t.flexDirection==="column-reverse"&&e.setFlexDirection(kn.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in t&&(typeof t.flexBasis=="number"?e.setFlexBasis(t.flexBasis):typeof t.flexBasis=="string"?e.setFlexBasisPercent(Number.parseInt(t.flexBasis,10)):e.setFlexBasis(NaN)),"alignItems"in t&&((t.alignItems==="stretch"||!t.alignItems)&&e.setAlignItems(kn.default.ALIGN_STRETCH),t.alignItems==="flex-start"&&e.setAlignItems(kn.default.ALIGN_FLEX_START),t.alignItems==="center"&&e.setAlignItems(kn.default.ALIGN_CENTER),t.alignItems==="flex-end"&&e.setAlignItems(kn.default.ALIGN_FLEX_END)),"alignSelf"in t&&((t.alignSelf==="auto"||!t.alignSelf)&&e.setAlignSelf(kn.default.ALIGN_AUTO),t.alignSelf==="flex-start"&&e.setAlignSelf(kn.default.ALIGN_FLEX_START),t.alignSelf==="center"&&e.setAlignSelf(kn.default.ALIGN_CENTER),t.alignSelf==="flex-end"&&e.setAlignSelf(kn.default.ALIGN_FLEX_END)),"justifyContent"in t&&((t.justifyContent==="flex-start"||!t.justifyContent)&&e.setJustifyContent(kn.default.JUSTIFY_FLEX_START),t.justifyContent==="center"&&e.setJustifyContent(kn.default.JUSTIFY_CENTER),t.justifyContent==="flex-end"&&e.setJustifyContent(kn.default.JUSTIFY_FLEX_END),t.justifyContent==="space-between"&&e.setJustifyContent(kn.default.JUSTIFY_SPACE_BETWEEN),t.justifyContent==="space-around"&&e.setJustifyContent(kn.default.JUSTIFY_SPACE_AROUND))},wft=(e,t)=>{var r,s;"width"in t&&(typeof t.width=="number"?e.setWidth(t.width):typeof t.width=="string"?e.setWidthPercent(Number.parseInt(t.width,10)):e.setWidthAuto()),"height"in t&&(typeof t.height=="number"?e.setHeight(t.height):typeof t.height=="string"?e.setHeightPercent(Number.parseInt(t.height,10)):e.setHeightAuto()),"minWidth"in t&&(typeof t.minWidth=="string"?e.setMinWidthPercent(Number.parseInt(t.minWidth,10)):e.setMinWidth((r=t.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in t&&(typeof t.minHeight=="string"?e.setMinHeightPercent(Number.parseInt(t.minHeight,10)):e.setMinHeight((s=t.minHeight)!==null&&s!==void 0?s:0))},Bft=(e,t)=>{"display"in t&&e.setDisplay(t.display==="flex"?kn.default.DISPLAY_FLEX:kn.default.DISPLAY_NONE)},vft=(e,t)=>{if("borderStyle"in t){let r=typeof t.borderStyle=="string"?1:0;e.setBorder(kn.default.EDGE_TOP,r),e.setBorder(kn.default.EDGE_BOTTOM,r),e.setBorder(kn.default.EDGE_LEFT,r),e.setBorder(kn.default.EDGE_RIGHT,r)}};zS.default=(e,t={})=>{yft(e,t),Eft(e,t),Ift(e,t),Cft(e,t),wft(e,t),Bft(e,t),vft(e,t)}});var WIe=G((w7t,YIe)=>{"use strict";var ZS=KS(),Sft=Ik(),bft=ck(),Rq=new Set(["\x1B","\x9B"]),Dft=39,qIe=e=>`${Rq.values().next().value}[${e}m`,Pft=e=>e.split(" ").map(t=>ZS(t)),Tq=(e,t,r)=>{let s=[...t],a=!1,n=ZS(Sft(e[e.length-1]));for(let[c,f]of s.entries()){let p=ZS(f);if(n+p<=r?e[e.length-1]+=f:(e.push(f),n=0),Rq.has(f))a=!0;else if(a&&f==="m"){a=!1;continue}a||(n+=p,n===r&&c0&&e.length>1&&(e[e.length-2]+=e.pop())},xft=e=>{let t=e.split(" "),r=t.length;for(;r>0&&!(ZS(t[r-1])>0);)r--;return r===t.length?e:t.slice(0,r).join(" ")+t.slice(r).join("")},kft=(e,t,r={})=>{if(r.trim!==!1&&e.trim()==="")return"";let s="",a="",n,c=Pft(e),f=[""];for(let[p,h]of e.split(" ").entries()){r.trim!==!1&&(f[f.length-1]=f[f.length-1].trimLeft());let E=ZS(f[f.length-1]);if(p!==0&&(E>=t&&(r.wordWrap===!1||r.trim===!1)&&(f.push(""),E=0),(E>0||r.trim===!1)&&(f[f.length-1]+=" ",E++)),r.hard&&c[p]>t){let C=t-E,S=1+Math.floor((c[p]-C-1)/t);Math.floor((c[p]-1)/t)t&&E>0&&c[p]>0){if(r.wordWrap===!1&&Et&&r.wordWrap===!1){Tq(f,h,t);continue}f[f.length-1]+=h}r.trim!==!1&&(f=f.map(xft)),s=f.join(` +`);for(let[p,h]of[...s].entries()){if(a+=h,Rq.has(h)){let C=parseFloat(/\d[^m]*/.exec(s.slice(p,p+4)));n=C===Dft?null:C}let E=bft.codes.get(Number(n));n&&E&&(s[p+1]===` +`?a+=qIe(E):h===` +`&&(a+=qIe(n)))}return a};YIe.exports=(e,t,r)=>String(e).normalize().replace(/\r\n/g,` +`).split(` +`).map(s=>kft(s,t,r)).join(` +`)});var JIe=G((B7t,KIe)=>{"use strict";var VIe="[\uD800-\uDBFF][\uDC00-\uDFFF]",Qft=e=>e&&e.exact?new RegExp(`^${VIe}$`):new RegExp(VIe,"g");KIe.exports=Qft});var Fq=G((v7t,$Ie)=>{"use strict";var Tft=Dq(),Rft=JIe(),zIe=ck(),XIe=["\x1B","\x9B"],vF=e=>`${XIe[0]}[${e}m`,ZIe=(e,t,r)=>{let s=[];e=[...e];for(let a of e){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let c=zIe.codes.get(parseInt(a,10));if(c){let f=e.indexOf(c.toString());f>=0?e.splice(f,1):s.push(vF(t?c:n))}else if(t){s.push(vF(0));break}else s.push(vF(n))}if(t&&(s=s.filter((a,n)=>s.indexOf(a)===n),r!==void 0)){let a=vF(zIe.codes.get(parseInt(r,10)));s=s.reduce((n,c)=>c===a?[c,...n]:[...n,c],[])}return s.join("")};$Ie.exports=(e,t,r)=>{let s=[...e.normalize()],a=[];r=typeof r=="number"?r:s.length;let n=!1,c,f=0,p="";for(let[h,E]of s.entries()){let C=!1;if(XIe.includes(E)){let S=/\d[^m]*/.exec(e.slice(h,h+18));c=S&&S.length>0?S[0]:void 0,ft&&f<=r)p+=E;else if(f===t&&!n&&c!==void 0)p=ZIe(a);else if(f>=r){p+=ZIe(a,!0,c);break}}return p}});var tCe=G((S7t,eCe)=>{"use strict";var eg=Fq(),Fft=KS();function SF(e,t,r){if(e.charAt(t)===" ")return t;for(let s=1;s<=3;s++)if(r){if(e.charAt(t+s)===" ")return t+s}else if(e.charAt(t-s)===" ")return t-s;return t}eCe.exports=(e,t,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:s,space:a,preferTruncationOnSpace:n}=r,c="\u2026",f=1;if(typeof e!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof e}`);if(typeof t!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof t}`);if(t<1)return"";if(t===1)return c;let p=Fft(e);if(p<=t)return e;if(s==="start"){if(n){let h=SF(e,p-t+1,!0);return c+eg(e,h,p).trim()}return a===!0&&(c+=" ",f=2),c+eg(e,p-t+f,p)}if(s==="middle"){a===!0&&(c=" "+c+" ",f=3);let h=Math.floor(t/2);if(n){let E=SF(e,h),C=SF(e,p-(t-h)+1,!0);return eg(e,0,E)+c+eg(e,C,p).trim()}return eg(e,0,h)+c+eg(e,p-(t-h)+f,p)}if(s==="end"){if(n){let h=SF(e,t-1);return eg(e,0,h)+c}return a===!0&&(c=" "+c,f=2),eg(e,0,t-f)+c}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${s}`)}});var Oq=G(XS=>{"use strict";var rCe=XS&&XS.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(XS,"__esModule",{value:!0});var Nft=rCe(WIe()),Oft=rCe(tCe()),Nq={};XS.default=(e,t,r)=>{let s=e+String(t)+String(r);if(Nq[s])return Nq[s];let a=e;if(r==="wrap"&&(a=Nft.default(e,t,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=Oft.default(e,t,{position:n})}return Nq[s]=a,a}});var Mq=G(Lq=>{"use strict";Object.defineProperty(Lq,"__esModule",{value:!0});var nCe=e=>{let t="";if(e.childNodes.length>0)for(let r of e.childNodes){let s="";r.nodeName==="#text"?s=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(s=nCe(r)),s.length>0&&typeof r.internal_transform=="function"&&(s=r.internal_transform(s))),t+=s}return t};Lq.default=nCe});var Uq=G(Pi=>{"use strict";var $S=Pi&&Pi.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Pi,"__esModule",{value:!0});Pi.setTextNodeValue=Pi.createTextNode=Pi.setStyle=Pi.setAttribute=Pi.removeChildNode=Pi.insertBeforeNode=Pi.appendChildNode=Pi.createNode=Pi.TEXT_NAME=void 0;var Lft=$S(_m()),iCe=$S(jIe()),Mft=$S(GIe()),Uft=$S(Oq()),_ft=$S(Mq());Pi.TEXT_NAME="#text";Pi.createNode=e=>{var t;let r={nodeName:e,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:e==="ink-virtual-text"?void 0:Lft.default.Node.create()};return e==="ink-text"&&((t=r.yogaNode)===null||t===void 0||t.setMeasureFunc(Hft.bind(null,r))),r};Pi.appendChildNode=(e,t)=>{var r;t.parentNode&&Pi.removeChildNode(t.parentNode,t),t.parentNode=e,e.childNodes.push(t),t.yogaNode&&((r=e.yogaNode)===null||r===void 0||r.insertChild(t.yogaNode,e.yogaNode.getChildCount())),(e.nodeName==="ink-text"||e.nodeName==="ink-virtual-text")&&bF(e)};Pi.insertBeforeNode=(e,t,r)=>{var s,a;t.parentNode&&Pi.removeChildNode(t.parentNode,t),t.parentNode=e;let n=e.childNodes.indexOf(r);if(n>=0){e.childNodes.splice(n,0,t),t.yogaNode&&((s=e.yogaNode)===null||s===void 0||s.insertChild(t.yogaNode,n));return}e.childNodes.push(t),t.yogaNode&&((a=e.yogaNode)===null||a===void 0||a.insertChild(t.yogaNode,e.yogaNode.getChildCount())),(e.nodeName==="ink-text"||e.nodeName==="ink-virtual-text")&&bF(e)};Pi.removeChildNode=(e,t)=>{var r,s;t.yogaNode&&((s=(r=t.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||s===void 0||s.removeChild(t.yogaNode)),t.parentNode=null;let a=e.childNodes.indexOf(t);a>=0&&e.childNodes.splice(a,1),(e.nodeName==="ink-text"||e.nodeName==="ink-virtual-text")&&bF(e)};Pi.setAttribute=(e,t,r)=>{e.attributes[t]=r};Pi.setStyle=(e,t)=>{e.style=t,e.yogaNode&&Mft.default(e.yogaNode,t)};Pi.createTextNode=e=>{let t={nodeName:"#text",nodeValue:e,yogaNode:void 0,parentNode:null,style:{}};return Pi.setTextNodeValue(t,e),t};var Hft=function(e,t){var r,s;let a=e.nodeName==="#text"?e.nodeValue:_ft.default(e),n=iCe.default(a);if(n.width<=t||n.width>=1&&t>0&&t<1)return n;let c=(s=(r=e.style)===null||r===void 0?void 0:r.textWrap)!==null&&s!==void 0?s:"wrap",f=Uft.default(a,t,c);return iCe.default(f)},sCe=e=>{var t;if(!(!e||!e.parentNode))return(t=e.yogaNode)!==null&&t!==void 0?t:sCe(e.parentNode)},bF=e=>{let t=sCe(e);t?.markDirty()};Pi.setTextNodeValue=(e,t)=>{typeof t!="string"&&(t=String(t)),e.nodeValue=t,bF(e)}});var uCe=G(eb=>{"use strict";var cCe=eb&&eb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(eb,"__esModule",{value:!0});var oCe=Cq(),jft=cCe(PIe()),aCe=cCe(_m()),oa=Uq(),lCe=e=>{e?.unsetMeasureFunc(),e?.freeRecursive()};eb.default=jft.default({schedulePassiveEffects:oCe.unstable_scheduleCallback,cancelPassiveEffects:oCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>!1,shouldDeprioritizeSubtree:()=>!1,resetAfterCommit:e=>{if(e.isStaticDirty){e.isStaticDirty=!1,typeof e.onImmediateRender=="function"&&e.onImmediateRender();return}typeof e.onRender=="function"&&e.onRender()},getChildHostContext:(e,t)=>{let r=e.isInsideText,s=t==="ink-text"||t==="ink-virtual-text";return r===s?e:{isInsideText:s}},shouldSetTextContent:()=>!1,createInstance:(e,t,r,s)=>{if(s.isInsideText&&e==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=e==="ink-text"&&s.isInsideText?"ink-virtual-text":e,n=oa.createNode(a);for(let[c,f]of Object.entries(t))c!=="children"&&(c==="style"?oa.setStyle(n,f):c==="internal_transform"?n.internal_transform=f:c==="internal_static"?n.internal_static=!0:oa.setAttribute(n,c,f));return n},createTextInstance:(e,t,r)=>{if(!r.isInsideText)throw new Error(`Text string "${e}" must be rendered inside component`);return oa.createTextNode(e)},resetTextContent:()=>{},hideTextInstance:e=>{oa.setTextNodeValue(e,"")},unhideTextInstance:(e,t)=>{oa.setTextNodeValue(e,t)},getPublicInstance:e=>e,hideInstance:e=>{var t;(t=e.yogaNode)===null||t===void 0||t.setDisplay(aCe.default.DISPLAY_NONE)},unhideInstance:e=>{var t;(t=e.yogaNode)===null||t===void 0||t.setDisplay(aCe.default.DISPLAY_FLEX)},appendInitialChild:oa.appendChildNode,appendChild:oa.appendChildNode,insertBefore:oa.insertBeforeNode,finalizeInitialChildren:(e,t,r,s)=>(e.internal_static&&(s.isStaticDirty=!0,s.staticNode=e),!1),supportsMutation:!0,appendChildToContainer:oa.appendChildNode,insertInContainerBefore:oa.insertBeforeNode,removeChildFromContainer:(e,t)=>{oa.removeChildNode(e,t),lCe(t.yogaNode)},prepareUpdate:(e,t,r,s,a)=>{e.internal_static&&(a.isStaticDirty=!0);let n={},c=Object.keys(s);for(let f of c)if(s[f]!==r[f]){if(f==="style"&&typeof s.style=="object"&&typeof r.style=="object"){let h=s.style,E=r.style,C=Object.keys(h);for(let S of C){if(S==="borderStyle"||S==="borderColor"){if(typeof n.style!="object"){let x={};n.style=x}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[S]!==E[S]){if(typeof n.style!="object"){let x={};n.style=x}n.style[S]=h[S]}}continue}n[f]=s[f]}return n},commitUpdate:(e,t)=>{for(let[r,s]of Object.entries(t))r!=="children"&&(r==="style"?oa.setStyle(e,s):r==="internal_transform"?e.internal_transform=s:r==="internal_static"?e.internal_static=!0:oa.setAttribute(e,r,s))},commitTextUpdate:(e,t,r)=>{oa.setTextNodeValue(e,r)},removeChild:(e,t)=>{oa.removeChildNode(e,t),lCe(t.yogaNode)}})});var ACe=G((k7t,fCe)=>{"use strict";fCe.exports=(e,t=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof e!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof e}\``);if(typeof t!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof t}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(t===0)return e;let s=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return e.replace(s,r.indent.repeat(t))}});var pCe=G(tb=>{"use strict";var Gft=tb&&tb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(tb,"__esModule",{value:!0});var DF=Gft(_m());tb.default=e=>e.getComputedWidth()-e.getComputedPadding(DF.default.EDGE_LEFT)-e.getComputedPadding(DF.default.EDGE_RIGHT)-e.getComputedBorder(DF.default.EDGE_LEFT)-e.getComputedBorder(DF.default.EDGE_RIGHT)});var hCe=G((T7t,qft)=>{qft.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var gCe=G((R7t,_q)=>{"use strict";var dCe=hCe();_q.exports=dCe;_q.exports.default=dCe});var Hq=G(nb=>{"use strict";var Yft=nb&&nb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(nb,"__esModule",{value:!0});var rb=Yft(LE()),Wft=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,Vft=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,PF=(e,t)=>t==="foreground"?e:"bg"+e[0].toUpperCase()+e.slice(1);nb.default=(e,t,r)=>{if(!t)return e;if(t in rb.default){let a=PF(t,r);return rb.default[a](e)}if(t.startsWith("#")){let a=PF("hex",r);return rb.default[a](t)(e)}if(t.startsWith("ansi")){let a=Vft.exec(t);if(!a)return e;let n=PF(a[1],r),c=Number(a[2]);return rb.default[n](c)(e)}if(t.startsWith("rgb")||t.startsWith("hsl")||t.startsWith("hsv")||t.startsWith("hwb")){let a=Wft.exec(t);if(!a)return e;let n=PF(a[1],r),c=Number(a[2]),f=Number(a[3]),p=Number(a[4]);return rb.default[n](c,f,p)(e)}return e}});var yCe=G(ib=>{"use strict";var mCe=ib&&ib.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ib,"__esModule",{value:!0});var Kft=mCe(gCe()),jq=mCe(Hq());ib.default=(e,t,r,s)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),c=r.style.borderColor,f=Kft.default[r.style.borderStyle],p=jq.default(f.topLeft+f.horizontal.repeat(a-2)+f.topRight,c,"foreground"),h=(jq.default(f.vertical,c,"foreground")+` +`).repeat(n-2),E=jq.default(f.bottomLeft+f.horizontal.repeat(a-2)+f.bottomRight,c,"foreground");s.write(e,t,p,{transformers:[]}),s.write(e,t+1,h,{transformers:[]}),s.write(e+a-1,t+1,h,{transformers:[]}),s.write(e,t+n-1,E,{transformers:[]})}}});var ICe=G(sb=>{"use strict";var Hm=sb&&sb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(sb,"__esModule",{value:!0});var Jft=Hm(_m()),zft=Hm(kq()),Zft=Hm(ACe()),Xft=Hm(Oq()),$ft=Hm(pCe()),eAt=Hm(Mq()),tAt=Hm(yCe()),rAt=(e,t)=>{var r;let s=(r=e.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(s){let a=s.getComputedLeft(),n=s.getComputedTop();t=` +`.repeat(n)+Zft.default(t,a)}return t},ECe=(e,t,r)=>{var s;let{offsetX:a=0,offsetY:n=0,transformers:c=[],skipStaticElements:f}=r;if(f&&e.internal_static)return;let{yogaNode:p}=e;if(p){if(p.getDisplay()===Jft.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),C=c;if(typeof e.internal_transform=="function"&&(C=[e.internal_transform,...c]),e.nodeName==="ink-text"){let S=eAt.default(e);if(S.length>0){let x=zft.default(S),I=$ft.default(p);if(x>I){let R=(s=e.style.textWrap)!==null&&s!==void 0?s:"wrap";S=Xft.default(S,I,R)}S=rAt(e,S),t.write(h,E,S,{transformers:C})}return}if(e.nodeName==="ink-box"&&tAt.default(h,E,e,t),e.nodeName==="ink-root"||e.nodeName==="ink-box")for(let S of e.childNodes)ECe(S,t,{offsetX:h,offsetY:E,transformers:C,skipStaticElements:f})}};sb.default=ECe});var BCe=G(ob=>{"use strict";var wCe=ob&&ob.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ob,"__esModule",{value:!0});var CCe=wCe(Fq()),nAt=wCe(KS()),Gq=class{constructor(t){this.writes=[];let{width:r,height:s}=t;this.width=r,this.height=s}write(t,r,s,a){let{transformers:n}=a;s&&this.writes.push({x:t,y:r,text:s,transformers:n})}get(){let t=[];for(let s=0;ss.trimRight()).join(` +`),height:t.length}}};ob.default=Gq});var bCe=G(ab=>{"use strict";var qq=ab&&ab.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ab,"__esModule",{value:!0});var iAt=qq(_m()),vCe=qq(ICe()),SCe=qq(BCe());ab.default=(e,t)=>{var r;if(e.yogaNode.setWidth(t),e.yogaNode){e.yogaNode.calculateLayout(void 0,void 0,iAt.default.DIRECTION_LTR);let s=new SCe.default({width:e.yogaNode.getComputedWidth(),height:e.yogaNode.getComputedHeight()});vCe.default(e,s,{skipStaticElements:!0});let a;!((r=e.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new SCe.default({width:e.staticNode.yogaNode.getComputedWidth(),height:e.staticNode.yogaNode.getComputedHeight()}),vCe.default(e.staticNode,a,{skipStaticElements:!1}));let{output:n,height:c}=s.get();return{output:n,outputHeight:c,staticOutput:a?`${a.get().output} +`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var kCe=G((U7t,xCe)=>{"use strict";var DCe=Ce("stream"),PCe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],Yq={},sAt=e=>{let t=new DCe.PassThrough,r=new DCe.PassThrough;t.write=a=>e("stdout",a),r.write=a=>e("stderr",a);let s=new console.Console(t,r);for(let a of PCe)Yq[a]=console[a],console[a]=s[a];return()=>{for(let a of PCe)console[a]=Yq[a];Yq={}}};xCe.exports=sAt});var Vq=G(Wq=>{"use strict";Object.defineProperty(Wq,"__esModule",{value:!0});Wq.default=new WeakMap});var Jq=G(Kq=>{"use strict";Object.defineProperty(Kq,"__esModule",{value:!0});var oAt=dn(),QCe=oAt.createContext({exit:()=>{}});QCe.displayName="InternalAppContext";Kq.default=QCe});var Zq=G(zq=>{"use strict";Object.defineProperty(zq,"__esModule",{value:!0});var aAt=dn(),TCe=aAt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});TCe.displayName="InternalStdinContext";zq.default=TCe});var $q=G(Xq=>{"use strict";Object.defineProperty(Xq,"__esModule",{value:!0});var lAt=dn(),RCe=lAt.createContext({stdout:void 0,write:()=>{}});RCe.displayName="InternalStdoutContext";Xq.default=RCe});var tY=G(eY=>{"use strict";Object.defineProperty(eY,"__esModule",{value:!0});var cAt=dn(),FCe=cAt.createContext({stderr:void 0,write:()=>{}});FCe.displayName="InternalStderrContext";eY.default=FCe});var xF=G(rY=>{"use strict";Object.defineProperty(rY,"__esModule",{value:!0});var uAt=dn(),NCe=uAt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{},focus:()=>{}});NCe.displayName="InternalFocusContext";rY.default=NCe});var LCe=G((W7t,OCe)=>{"use strict";var fAt=/[|\\{}()[\]^$+*?.-]/g;OCe.exports=e=>{if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(fAt,"\\$&")}});var HCe=G((V7t,_Ce)=>{"use strict";var AAt=LCe(),pAt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",UCe=[].concat(Ce("module").builtinModules,"bootstrap_node","node").map(e=>new RegExp(`(?:\\((?:node:)?${e}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${e}(?:\\.js)?:\\d+:\\d+$)`));UCe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var nY=class e{constructor(t){t={ignoredPackages:[],...t},"internals"in t||(t.internals=e.nodeInternals()),"cwd"in t||(t.cwd=pAt),this._cwd=t.cwd.replace(/\\/g,"/"),this._internals=[].concat(t.internals,hAt(t.ignoredPackages)),this._wrapCallSite=t.wrapCallSite||!1}static nodeInternals(){return[...UCe]}clean(t,r=0){r=" ".repeat(r),Array.isArray(t)||(t=t.split(` +`)),!/^\s*at /.test(t[0])&&/^\s*at /.test(t[1])&&(t=t.slice(1));let s=!1,a=null,n=[];return t.forEach(c=>{if(c=c.replace(/\\/g,"/"),this._internals.some(p=>p.test(c)))return;let f=/^\s*at /.test(c);s?c=c.trimEnd().replace(/^(\s+)at /,"$1"):(c=c.trim(),f&&(c=c.slice(3))),c=c.replace(`${this._cwd}/`,""),c&&(f?(a&&(n.push(a),a=null),n.push(c)):(s=!0,a=c))}),n.map(c=>`${r}${c} +`).join("")}captureString(t,r=this.captureString){typeof t=="function"&&(r=t,t=1/0);let{stackTraceLimit:s}=Error;t&&(Error.stackTraceLimit=t);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=s,this.clean(n)}capture(t,r=this.capture){typeof t=="function"&&(r=t,t=1/0);let{prepareStackTrace:s,stackTraceLimit:a}=Error;Error.prepareStackTrace=(f,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,t&&(Error.stackTraceLimit=t);let n={};Error.captureStackTrace(n,r);let{stack:c}=n;return Object.assign(Error,{prepareStackTrace:s,stackTraceLimit:a}),c}at(t=this.at){let[r]=this.capture(1,t);if(!r)return{};let s={line:r.getLineNumber(),column:r.getColumnNumber()};MCe(s,r.getFileName(),this._cwd),r.isConstructor()&&(s.constructor=!0),r.isEval()&&(s.evalOrigin=r.getEvalOrigin()),r.isNative()&&(s.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(s.type=a);let n=r.getFunctionName();n&&(s.function=n);let c=r.getMethodName();return c&&n!==c&&(s.method=c),s}parseLine(t){let r=t&&t.match(dAt);if(!r)return null;let s=r[1]==="new",a=r[2],n=r[3],c=r[4],f=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],C=r[9],S=r[10]==="native",x=r[11]===")",I,R={};if(E&&(R.line=Number(E)),C&&(R.column=Number(C)),x&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")N++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(N--,N===-1&&h.charAt(U-1)===" ")){let K=h.slice(0,U-1);h=h.slice(U+1),a+=` (${K}`;break}}if(a){let N=a.match(gAt);N&&(a=N[1],I=N[2])}return MCe(R,h,this._cwd),s&&(R.constructor=!0),n&&(R.evalOrigin=n,R.evalLine=f,R.evalColumn=p,R.evalFile=c&&c.replace(/\\/g,"/")),S&&(R.native=!0),a&&(R.function=a),I&&a!==I&&(R.method=I),R}};function MCe(e,t,r){t&&(t=t.replace(/\\/g,"/"),t.startsWith(`${r}/`)&&(t=t.slice(r.length+1)),e.file=t)}function hAt(e){if(e.length===0)return[];let t=e.map(r=>AAt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${t.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var dAt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),gAt=/^(.*?) \[as (.*?)\]$/;_Ce.exports=nY});var GCe=G((K7t,jCe)=>{"use strict";jCe.exports=(e,t)=>e.replace(/^\t+/gm,r=>" ".repeat(r.length*(t||2)))});var YCe=G((J7t,qCe)=>{"use strict";var mAt=GCe(),yAt=(e,t)=>{let r=[],s=e-t,a=e+t;for(let n=s;n<=a;n++)r.push(n);return r};qCe.exports=(e,t,r)=>{if(typeof e!="string")throw new TypeError("Source code is missing.");if(!t||t<1)throw new TypeError("Line number must start from `1`.");if(e=mAt(e).split(/\r?\n/),!(t>e.length))return r={around:3,...r},yAt(t,r.around).filter(s=>e[s-1]!==void 0).map(s=>({line:s,value:e[s-1]}))}});var kF=G(of=>{"use strict";var EAt=of&&of.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),IAt=of&&of.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),CAt=of&&of.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.hasOwnProperty.call(e,r)&&EAt(t,e,r);return IAt(t,e),t},wAt=of&&of.__rest||function(e,t){var r={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,s=Object.getOwnPropertySymbols(e);a{var{children:r}=e,s=wAt(e,["children"]);let a=Object.assign(Object.assign({},s),{marginLeft:s.marginLeft||s.marginX||s.margin||0,marginRight:s.marginRight||s.marginX||s.margin||0,marginTop:s.marginTop||s.marginY||s.margin||0,marginBottom:s.marginBottom||s.marginY||s.margin||0,paddingLeft:s.paddingLeft||s.paddingX||s.padding||0,paddingRight:s.paddingRight||s.paddingX||s.padding||0,paddingTop:s.paddingTop||s.paddingY||s.padding||0,paddingBottom:s.paddingBottom||s.paddingY||s.padding||0});return WCe.default.createElement("ink-box",{ref:t,style:a},r)});iY.displayName="Box";iY.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};of.default=iY});var aY=G(lb=>{"use strict";var sY=lb&&lb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(lb,"__esModule",{value:!0});var BAt=sY(dn()),Aw=sY(LE()),VCe=sY(Hq()),oY=({color:e,backgroundColor:t,dimColor:r,bold:s,italic:a,underline:n,strikethrough:c,inverse:f,wrap:p,children:h})=>{if(h==null)return null;let E=C=>(r&&(C=Aw.default.dim(C)),e&&(C=VCe.default(C,e,"foreground")),t&&(C=VCe.default(C,t,"background")),s&&(C=Aw.default.bold(C)),a&&(C=Aw.default.italic(C)),n&&(C=Aw.default.underline(C)),c&&(C=Aw.default.strikethrough(C)),f&&(C=Aw.default.inverse(C)),C);return BAt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};oY.displayName="Text";oY.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};lb.default=oY});var ZCe=G(af=>{"use strict";var vAt=af&&af.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),SAt=af&&af.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),bAt=af&&af.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.hasOwnProperty.call(e,r)&&vAt(t,e,r);return SAt(t,e),t},ub=af&&af.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(af,"__esModule",{value:!0});var KCe=bAt(Ce("fs")),Fs=ub(dn()),JCe=ub(HCe()),DAt=ub(YCe()),th=ub(kF()),dA=ub(aY()),zCe=new JCe.default({cwd:process.cwd(),internals:JCe.default.nodeInternals()}),PAt=({error:e})=>{let t=e.stack?e.stack.split(` +`).slice(1):void 0,r=t?zCe.parseLine(t[0]):void 0,s,a=0;if(r?.file&&r?.line&&KCe.existsSync(r.file)){let n=KCe.readFileSync(r.file,"utf8");if(s=DAt.default(n,r.line),s)for(let{line:c}of s)a=Math.max(a,String(c).length)}return Fs.default.createElement(th.default,{flexDirection:"column",padding:1},Fs.default.createElement(th.default,null,Fs.default.createElement(dA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),Fs.default.createElement(dA.default,null," ",e.message)),r&&Fs.default.createElement(th.default,{marginTop:1},Fs.default.createElement(dA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&s&&Fs.default.createElement(th.default,{marginTop:1,flexDirection:"column"},s.map(({line:n,value:c})=>Fs.default.createElement(th.default,{key:n},Fs.default.createElement(th.default,{width:a+1},Fs.default.createElement(dA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),Fs.default.createElement(dA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+c)))),e.stack&&Fs.default.createElement(th.default,{marginTop:1,flexDirection:"column"},e.stack.split(` +`).slice(1).map(n=>{let c=zCe.parseLine(n);return c?Fs.default.createElement(th.default,{key:n},Fs.default.createElement(dA.default,{dimColor:!0},"- "),Fs.default.createElement(dA.default,{dimColor:!0,bold:!0},c.function),Fs.default.createElement(dA.default,{dimColor:!0,color:"gray"}," ","(",c.file,":",c.line,":",c.column,")")):Fs.default.createElement(th.default,{key:n},Fs.default.createElement(dA.default,{dimColor:!0},"- "),Fs.default.createElement(dA.default,{dimColor:!0,bold:!0},n))})))};af.default=PAt});var $Ce=G(lf=>{"use strict";var xAt=lf&&lf.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),kAt=lf&&lf.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),QAt=lf&&lf.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.hasOwnProperty.call(e,r)&&xAt(t,e,r);return kAt(t,e),t},Gm=lf&&lf.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(lf,"__esModule",{value:!0});var jm=QAt(dn()),XCe=Gm(cq()),TAt=Gm(Jq()),RAt=Gm(Zq()),FAt=Gm($q()),NAt=Gm(tY()),OAt=Gm(xF()),LAt=Gm(ZCe()),MAt=" ",UAt="\x1B[Z",_At="\x1B",QF=class extends jm.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=t=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),t){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=t=>{t===""&&this.props.exitOnCtrlC&&this.handleExit(),t===_At&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(t===MAt&&this.focusNext(),t===UAt&&this.focusPrevious())},this.handleExit=t=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(t)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focus=t=>{this.setState(r=>r.focusables.some(a=>a?.id===t)?{activeFocusId:t}:r)},this.focusNext=()=>{this.setState(t=>{var r;let s=(r=t.focusables[0])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findNextFocusable(t)||s}})},this.focusPrevious=()=>{this.setState(t=>{var r;let s=(r=t.focusables[t.focusables.length-1])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findPreviousFocusable(t)||s}})},this.addFocusable=(t,{autoFocus:r})=>{this.setState(s=>{let a=s.activeFocusId;return!a&&r&&(a=t),{activeFocusId:a,focusables:[...s.focusables,{id:t,isActive:!0}]}})},this.removeFocusable=t=>{this.setState(r=>({activeFocusId:r.activeFocusId===t?void 0:r.activeFocusId,focusables:r.focusables.filter(s=>s.id!==t)}))},this.activateFocusable=t=>{this.setState(r=>({focusables:r.focusables.map(s=>s.id!==t?s:{id:t,isActive:!0})}))},this.deactivateFocusable=t=>{this.setState(r=>({activeFocusId:r.activeFocusId===t?void 0:r.activeFocusId,focusables:r.focusables.map(s=>s.id!==t?s:{id:t,isActive:!1})}))},this.findNextFocusable=t=>{var r;let s=t.focusables.findIndex(a=>a.id===t.activeFocusId);for(let a=s+1;a{var r;let s=t.focusables.findIndex(a=>a.id===t.activeFocusId);for(let a=s-1;a>=0;a--)if(!((r=t.focusables[a])===null||r===void 0)&&r.isActive)return t.focusables[a].id}}static getDerivedStateFromError(t){return{error:t}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return jm.default.createElement(TAt.default.Provider,{value:{exit:this.handleExit}},jm.default.createElement(RAt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},jm.default.createElement(FAt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},jm.default.createElement(NAt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},jm.default.createElement(OAt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?jm.default.createElement(LAt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){XCe.default.hide(this.props.stdout)}componentWillUnmount(){XCe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(t){this.handleExit(t)}};lf.default=QF;QF.displayName="InternalApp"});var rwe=G(cf=>{"use strict";var HAt=cf&&cf.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),jAt=cf&&cf.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),GAt=cf&&cf.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.hasOwnProperty.call(e,r)&&HAt(t,e,r);return jAt(t,e),t},uf=cf&&cf.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(cf,"__esModule",{value:!0});var qAt=uf(dn()),ewe=KEe(),YAt=uf(uIe()),WAt=uf(iq()),VAt=uf(gIe()),KAt=uf(yIe()),lY=uf(uCe()),JAt=uf(bCe()),zAt=uf(lq()),ZAt=uf(kCe()),XAt=GAt(Uq()),$At=uf(Vq()),ept=uf($Ce()),pw=process.env.CI==="false"?!1:VAt.default,twe=()=>{},cY=class{constructor(t){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:s,staticOutput:a}=JAt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` +`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(pw){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),s>=this.options.stdout.rows){this.options.stdout.write(WAt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},KAt.default(this),this.options=t,this.rootNode=XAt.createNode("ink-root"),this.rootNode.onRender=t.debug?this.onRender:ewe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=YAt.default.create(t.stdout),this.throttledLog=t.debug?this.log:ewe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=lY.default.createContainer(this.rootNode,0,!1,null),this.unsubscribeExit=zAt.default(this.unmount,{alwaysLast:!1}),t.patchConsole&&this.patchConsole(),pw||(t.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{t.stdout.off("resize",this.onRender)})}render(t){let r=qAt.default.createElement(ept.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},t);lY.default.updateContainer(r,this.container,null,twe)}writeToStdout(t){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(t+this.fullStaticOutput+this.lastOutput);return}if(pw){this.options.stdout.write(t);return}this.log.clear(),this.options.stdout.write(t),this.log(this.lastOutput)}}writeToStderr(t){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(t),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(pw){this.options.stderr.write(t);return}this.log.clear(),this.options.stderr.write(t),this.log(this.lastOutput)}}unmount(t){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),pw?this.options.stdout.write(this.lastOutput+` +`):this.options.debug||this.log.done(),this.isUnmounted=!0,lY.default.updateContainer(null,this.container,null,twe),$At.default.delete(this.options.stdout),t instanceof Error?this.rejectExitPromise(t):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((t,r)=>{this.resolveExitPromise=t,this.rejectExitPromise=r})),this.exitPromise}clear(){!pw&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=ZAt.default((t,r)=>{t==="stdout"&&this.writeToStdout(r),t==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};cf.default=cY});var iwe=G(fb=>{"use strict";var nwe=fb&&fb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(fb,"__esModule",{value:!0});var tpt=nwe(rwe()),TF=nwe(Vq()),rpt=Ce("stream"),npt=(e,t)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},ipt(t)),s=spt(r.stdout,()=>new tpt.default(r));return s.render(e),{rerender:s.render,unmount:()=>s.unmount(),waitUntilExit:s.waitUntilExit,cleanup:()=>TF.default.delete(r.stdout),clear:s.clear}};fb.default=npt;var ipt=(e={})=>e instanceof rpt.Stream?{stdout:e,stdin:process.stdin}:e,spt=(e,t)=>{let r;return TF.default.has(e)?r=TF.default.get(e):(r=t(),TF.default.set(e,r)),r}});var owe=G(rh=>{"use strict";var opt=rh&&rh.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),apt=rh&&rh.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),lpt=rh&&rh.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.hasOwnProperty.call(e,r)&&opt(t,e,r);return apt(t,e),t};Object.defineProperty(rh,"__esModule",{value:!0});var Ab=lpt(dn()),swe=e=>{let{items:t,children:r,style:s}=e,[a,n]=Ab.useState(0),c=Ab.useMemo(()=>t.slice(a),[t,a]);Ab.useLayoutEffect(()=>{n(t.length)},[t.length]);let f=c.map((h,E)=>r(h,a+E)),p=Ab.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},s),[s]);return Ab.default.createElement("ink-box",{internal_static:!0,style:p},f)};swe.displayName="Static";rh.default=swe});var lwe=G(pb=>{"use strict";var cpt=pb&&pb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(pb,"__esModule",{value:!0});var upt=cpt(dn()),awe=({children:e,transform:t})=>e==null?null:upt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:t},e);awe.displayName="Transform";pb.default=awe});var uwe=G(hb=>{"use strict";var fpt=hb&&hb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(hb,"__esModule",{value:!0});var Apt=fpt(dn()),cwe=({count:e=1})=>Apt.default.createElement("ink-text",null,` +`.repeat(e));cwe.displayName="Newline";hb.default=cwe});var pwe=G(db=>{"use strict";var fwe=db&&db.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(db,"__esModule",{value:!0});var ppt=fwe(dn()),hpt=fwe(kF()),Awe=()=>ppt.default.createElement(hpt.default,{flexGrow:1});Awe.displayName="Spacer";db.default=Awe});var RF=G(gb=>{"use strict";var dpt=gb&&gb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(gb,"__esModule",{value:!0});var gpt=dn(),mpt=dpt(Zq()),ypt=()=>gpt.useContext(mpt.default);gb.default=ypt});var dwe=G(mb=>{"use strict";var Ept=mb&&mb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(mb,"__esModule",{value:!0});var hwe=dn(),Ipt=Ept(RF()),Cpt=(e,t={})=>{let{stdin:r,setRawMode:s,internal_exitOnCtrlC:a}=Ipt.default();hwe.useEffect(()=>{if(t.isActive!==!1)return s(!0),()=>{s(!1)}},[t.isActive,s]),hwe.useEffect(()=>{if(t.isActive===!1)return;let n=c=>{let f=String(c),p={upArrow:f==="\x1B[A",downArrow:f==="\x1B[B",leftArrow:f==="\x1B[D",rightArrow:f==="\x1B[C",pageDown:f==="\x1B[6~",pageUp:f==="\x1B[5~",return:f==="\r",escape:f==="\x1B",ctrl:!1,shift:!1,tab:f===" "||f==="\x1B[Z",backspace:f==="\b",delete:f==="\x7F"||f==="\x1B[3~",meta:!1};f<=""&&!p.return&&(f=String.fromCharCode(f.charCodeAt(0)+97-1),p.ctrl=!0),f.startsWith("\x1B")&&(f=f.slice(1),p.meta=!0);let h=f>="A"&&f<="Z",E=f>="\u0410"&&f<="\u042F";f.length===1&&(h||E)&&(p.shift=!0),p.tab&&f==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(f=""),(!(f==="c"&&p.ctrl)||!a)&&e(f,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[t.isActive,r,a,e])};mb.default=Cpt});var gwe=G(yb=>{"use strict";var wpt=yb&&yb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(yb,"__esModule",{value:!0});var Bpt=dn(),vpt=wpt(Jq()),Spt=()=>Bpt.useContext(vpt.default);yb.default=Spt});var mwe=G(Eb=>{"use strict";var bpt=Eb&&Eb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Eb,"__esModule",{value:!0});var Dpt=dn(),Ppt=bpt($q()),xpt=()=>Dpt.useContext(Ppt.default);Eb.default=xpt});var ywe=G(Ib=>{"use strict";var kpt=Ib&&Ib.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ib,"__esModule",{value:!0});var Qpt=dn(),Tpt=kpt(tY()),Rpt=()=>Qpt.useContext(Tpt.default);Ib.default=Rpt});var Iwe=G(wb=>{"use strict";var Ewe=wb&&wb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(wb,"__esModule",{value:!0});var Cb=dn(),Fpt=Ewe(xF()),Npt=Ewe(RF()),Opt=({isActive:e=!0,autoFocus:t=!1,id:r}={})=>{let{isRawModeSupported:s,setRawMode:a}=Npt.default(),{activeId:n,add:c,remove:f,activate:p,deactivate:h,focus:E}=Cb.useContext(Fpt.default),C=Cb.useMemo(()=>r??Math.random().toString().slice(2,7),[r]);return Cb.useEffect(()=>(c(C,{autoFocus:t}),()=>{f(C)}),[C,t]),Cb.useEffect(()=>{e?p(C):h(C)},[e,C]),Cb.useEffect(()=>{if(!(!s||!e))return a(!0),()=>{a(!1)}},[e]),{isFocused:!!C&&n===C,focus:E}};wb.default=Opt});var Cwe=G(Bb=>{"use strict";var Lpt=Bb&&Bb.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Bb,"__esModule",{value:!0});var Mpt=dn(),Upt=Lpt(xF()),_pt=()=>{let e=Mpt.useContext(Upt.default);return{enableFocus:e.enableFocus,disableFocus:e.disableFocus,focusNext:e.focusNext,focusPrevious:e.focusPrevious,focus:e.focus}};Bb.default=_pt});var wwe=G(uY=>{"use strict";Object.defineProperty(uY,"__esModule",{value:!0});uY.default=e=>{var t,r,s,a;return{width:(r=(t=e.yogaNode)===null||t===void 0?void 0:t.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(s=e.yogaNode)===null||s===void 0?void 0:s.getComputedHeight())!==null&&a!==void 0?a:0}}});var Yc=G(vo=>{"use strict";Object.defineProperty(vo,"__esModule",{value:!0});var Hpt=iwe();Object.defineProperty(vo,"render",{enumerable:!0,get:function(){return Hpt.default}});var jpt=kF();Object.defineProperty(vo,"Box",{enumerable:!0,get:function(){return jpt.default}});var Gpt=aY();Object.defineProperty(vo,"Text",{enumerable:!0,get:function(){return Gpt.default}});var qpt=owe();Object.defineProperty(vo,"Static",{enumerable:!0,get:function(){return qpt.default}});var Ypt=lwe();Object.defineProperty(vo,"Transform",{enumerable:!0,get:function(){return Ypt.default}});var Wpt=uwe();Object.defineProperty(vo,"Newline",{enumerable:!0,get:function(){return Wpt.default}});var Vpt=pwe();Object.defineProperty(vo,"Spacer",{enumerable:!0,get:function(){return Vpt.default}});var Kpt=dwe();Object.defineProperty(vo,"useInput",{enumerable:!0,get:function(){return Kpt.default}});var Jpt=gwe();Object.defineProperty(vo,"useApp",{enumerable:!0,get:function(){return Jpt.default}});var zpt=RF();Object.defineProperty(vo,"useStdin",{enumerable:!0,get:function(){return zpt.default}});var Zpt=mwe();Object.defineProperty(vo,"useStdout",{enumerable:!0,get:function(){return Zpt.default}});var Xpt=ywe();Object.defineProperty(vo,"useStderr",{enumerable:!0,get:function(){return Xpt.default}});var $pt=Iwe();Object.defineProperty(vo,"useFocus",{enumerable:!0,get:function(){return $pt.default}});var eht=Cwe();Object.defineProperty(vo,"useFocusManager",{enumerable:!0,get:function(){return eht.default}});var tht=wwe();Object.defineProperty(vo,"measureElement",{enumerable:!0,get:function(){return tht.default}})});var AY={};Vt(AY,{Gem:()=>fY});var Bwe,qm,fY,FF=Ze(()=>{Bwe=et(Yc()),qm=et(dn()),fY=(0,qm.memo)(({active:e})=>{let t=(0,qm.useMemo)(()=>e?"\u25C9":"\u25EF",[e]),r=(0,qm.useMemo)(()=>e?"green":"yellow",[e]);return qm.default.createElement(Bwe.Text,{color:r},t)})});var pY={};Vt(pY,{useKeypress:()=>Ym});function Ym({active:e},t,r){let{stdin:s}=(0,vwe.useStdin)(),a=(0,NF.useCallback)((n,c)=>t(n,c),r);(0,NF.useEffect)(()=>{if(!(!e||!s))return s.on("keypress",a),()=>{s.off("keypress",a)}},[e,a,s])}var vwe,NF,hw=Ze(()=>{vwe=et(Yc()),NF=et(dn())});var bwe={};Vt(bwe,{FocusRequest:()=>Swe,useFocusRequest:()=>hY});var Swe,hY,dY=Ze(()=>{hw();Swe=(r=>(r.BEFORE="before",r.AFTER="after",r))(Swe||{}),hY=function({active:e},t,r){Ym({active:e},(s,a)=>{a.name==="tab"&&(a.shift?t("before"):t("after"))},r)}});var Dwe={};Vt(Dwe,{useListInput:()=>vb});var vb,OF=Ze(()=>{hw();vb=function(e,t,{active:r,minus:s,plus:a,set:n,loop:c=!0}){Ym({active:r},(f,p)=>{let h=t.indexOf(e);switch(p.name){case s:{let E=h-1;if(c){n(t[(t.length+E)%t.length]);return}if(E<0)return;n(t[E])}break;case a:{let E=h+1;if(c){n(t[E%t.length]);return}if(E>=t.length)return;n(t[E])}break}},[t,e,a,n,c])}});var LF={};Vt(LF,{ScrollableItems:()=>rht});var tg,vl,rht,MF=Ze(()=>{tg=et(Yc()),vl=et(dn());dY();OF();rht=({active:e=!0,children:t=[],radius:r=10,size:s=1,loop:a=!0,onFocusRequest:n,willReachEnd:c})=>{let f=N=>{if(N.key===null)throw new Error("Expected all children to have a key");return N.key},p=vl.default.Children.map(t,N=>f(N)),h=p[0],[E,C]=(0,vl.useState)(h),S=p.indexOf(E);(0,vl.useEffect)(()=>{p.includes(E)||C(h)},[t]),(0,vl.useEffect)(()=>{c&&S>=p.length-2&&c()},[S]),hY({active:e&&!!n},N=>{n?.(N)},[n]),vb(E,p,{active:e,minus:"up",plus:"down",set:C,loop:a});let x=S-r,I=S+r;I>p.length&&(x-=I-p.length,I=p.length),x<0&&(I+=-x,x=0),I>=p.length&&(I=p.length-1);let R=[];for(let N=x;N<=I;++N){let U=p[N],K=e&&U===E;R.push(vl.default.createElement(tg.Box,{key:U,height:s},vl.default.createElement(tg.Box,{marginLeft:1,marginRight:1},vl.default.createElement(tg.Text,null,K?vl.default.createElement(tg.Text,{color:"cyan",bold:!0},">"):" ")),vl.default.createElement(tg.Box,null,vl.default.cloneElement(t[N],{active:K}))))}return vl.default.createElement(tg.Box,{flexDirection:"column",width:"100%"},R)}});var Pwe,nh,xwe,UF,kwe,gY=Ze(()=>{Pwe=et(Yc()),nh=et(dn()),xwe=Ce("readline"),UF=nh.default.createContext(null),kwe=({children:e})=>{let{stdin:t,setRawMode:r}=(0,Pwe.useStdin)();(0,nh.useEffect)(()=>{r&&r(!0),t&&(0,xwe.emitKeypressEvents)(t)},[t,r]);let[s,a]=(0,nh.useState)(new Map),n=(0,nh.useMemo)(()=>({getAll:()=>s,get:c=>s.get(c),set:(c,f)=>a(p=>new Map([...p,[c,f]])),setAll:c=>a(f=>new Map([...f,...c]))}),[s,a]);return nh.default.createElement(UF.Provider,{value:n,children:e})}});var mY={};Vt(mY,{useMinistore:()=>nht,useMinistoreSetAll:()=>iht});function nht(e,t){let r=(0,Sb.useContext)(UF);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof e>"u")return r.getAll();let s=(0,Sb.useCallback)(n=>{r.set(e,n)},[e,r.set]),a=r.get(e);return typeof a>"u"&&(a=t),[a,s]}function iht(){let e=(0,Sb.useContext)(UF);if(e===null)throw new Error("Expected this hook to run with a ministore context attached");return e.setAll}var Sb,yY=Ze(()=>{Sb=et(dn());gY()});var HF={};Vt(HF,{renderForm:()=>sht});async function sht(e,t,{stdin:r,stdout:s,stderr:a}){let n,c=p=>{let{exit:h}=(0,_F.useApp)();Ym({active:!0},(E,C)=>{C.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:f}=(0,_F.render)(EY.default.createElement(kwe,null,EY.default.createElement(e,{...t,useSubmit:c})),{stdin:r,stdout:s,stderr:a});return await f(),n}var _F,EY,jF=Ze(()=>{_F=et(Yc()),EY=et(dn());gY();hw()});var Fwe=G(bb=>{"use strict";Object.defineProperty(bb,"__esModule",{value:!0});bb.UncontrolledTextInput=void 0;var Twe=dn(),IY=dn(),Qwe=Yc(),Wm=LE(),Rwe=({value:e,placeholder:t="",focus:r=!0,mask:s,highlightPastedText:a=!1,showCursor:n=!0,onChange:c,onSubmit:f})=>{let[{cursorOffset:p,cursorWidth:h},E]=IY.useState({cursorOffset:(e||"").length,cursorWidth:0});IY.useEffect(()=>{E(R=>{if(!r||!n)return R;let N=e||"";return R.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:R})},[e,r,n]);let C=a?h:0,S=s?s.repeat(e.length):e,x=S,I=t?Wm.grey(t):void 0;if(n&&r){I=t.length>0?Wm.inverse(t[0])+Wm.grey(t.slice(1)):Wm.inverse(" "),x=S.length>0?"":Wm.inverse(" ");let R=0;for(let N of S)R>=p-C&&R<=p?x+=Wm.inverse(N):x+=N,R++;S.length>0&&p===S.length&&(x+=Wm.inverse(" "))}return Qwe.useInput((R,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&R==="c"||N.tab||N.shift&&N.tab)return;if(N.return){f&&f(e);return}let U=p,K=e,$=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(K=e.slice(0,p-1)+e.slice(p,e.length),U--):(K=e.slice(0,p)+R+e.slice(p,e.length),U+=R.length,R.length>1&&($=R.length)),p<0&&(U=0),p>e.length&&(U=e.length),E({cursorOffset:U,cursorWidth:$}),K!==e&&c(K)},{isActive:r}),Twe.createElement(Qwe.Text,null,t?S.length>0?x:I:x)};bb.default=Rwe;bb.UncontrolledTextInput=({initialValue:e="",...t})=>{let[r,s]=IY.useState(e);return Twe.createElement(Rwe,Object.assign({},t,{value:r,onChange:s}))}});var Lwe={};Vt(Lwe,{Pad:()=>CY});var Nwe,Owe,CY,wY=Ze(()=>{Nwe=et(Yc()),Owe=et(dn()),CY=({length:e,active:t})=>{if(e===0)return null;let r=e>1?` ${"-".repeat(e-1)}`:" ";return Owe.default.createElement(Nwe.Text,{dimColor:!t},r)}});var Mwe={};Vt(Mwe,{ItemOptions:()=>oht});var Pb,rg,oht,Uwe=Ze(()=>{Pb=et(Yc()),rg=et(dn());OF();FF();wY();oht=function({active:e,skewer:t,options:r,value:s,onChange:a,sizes:n=[]}){let c=r.filter(({label:p})=>!!p).map(({value:p})=>p),f=r.findIndex(p=>p.value===s&&p.label!="");return vb(s,c,{active:e,minus:"left",plus:"right",set:a}),rg.default.createElement(rg.default.Fragment,null,r.map(({label:p},h)=>{let E=h===f,C=n[h]-1||0,S=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),x=Math.max(0,C-S.length-2);return p?rg.default.createElement(Pb.Box,{key:p,width:C,marginLeft:1},rg.default.createElement(Pb.Text,{wrap:"truncate"},rg.default.createElement(fY,{active:E})," ",p),t?rg.default.createElement(CY,{active:e,length:x}):null):rg.default.createElement(Pb.Box,{key:`spacer-${h}`,width:C,marginLeft:1})}))}});var t1e=G((izt,e1e)=>{var OY;e1e.exports=()=>(typeof OY>"u"&&(OY=Ce("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),OY)});var w1e=G((xzt,C1e)=>{var YY=Symbol("arg flag"),Wc=class e extends Error{constructor(t,r){super(t),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,e.prototype)}};function Yb(e,{argv:t=process.argv.slice(2),permissive:r=!1,stopAtPositional:s=!1}={}){if(!e)throw new Wc("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},c={};for(let f of Object.keys(e)){if(!f)throw new Wc("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(f[0]!=="-")throw new Wc(`argument key must start with '-' but found: '${f}'`,"ARG_CONFIG_NONOPT_KEY");if(f.length===1)throw new Wc(`argument key must have a name; singular '-' keys are not allowed: ${f}`,"ARG_CONFIG_NONAME_KEY");if(typeof e[f]=="string"){n[f]=e[f];continue}let p=e[f],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(C,S,x=[])=>(x.push(E(C,S,x[x.length-1])),x),h=E===Boolean||E[YY]===!0}else if(typeof p=="function")h=p===Boolean||p[YY]===!0;else throw new Wc(`type missing or not a function or valid array type: ${f}`,"ARG_CONFIG_VAD_TYPE");if(f[1]!=="-"&&f.length>2)throw new Wc(`short argument keys (with a single hyphen) must have only one character: ${f}`,"ARG_CONFIG_SHORTOPT_TOOLONG");c[f]=[p,h]}for(let f=0,p=t.length;f0){a._=a._.concat(t.slice(f));break}if(h==="--"){a._=a._.concat(t.slice(f+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(C=>`-${C}`);for(let C=0;C1&&t[f+1][0]==="-"&&!(t[f+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(N===Number||typeof BigInt<"u"&&N===BigInt))){let K=x===R?"":` (alias for ${R})`;throw new Wc(`option requires argument: ${x}${K}`,"ARG_MISSING_REQUIRED_LONGARG")}a[R]=N(t[f+1],R,a[R]),++f}else a[R]=N(I,R,a[R])}}else a._.push(h)}return a}Yb.flag=e=>(e[YY]=!0,e);Yb.COUNT=Yb.flag((e,t,r)=>(r||0)+1);Yb.ArgError=Wc;C1e.exports=Yb});var x1e=G((sZt,P1e)=>{var zY;P1e.exports=()=>(typeof zY>"u"&&(zY=Ce("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),zY)});var F1e=G((nW,iW)=>{(function(e){nW&&typeof nW=="object"&&typeof iW<"u"?iW.exports=e():typeof define=="function"&&define.amd?define([],e):typeof window<"u"?window.isWindows=e():typeof global<"u"?global.isWindows=e():typeof self<"u"?self.isWindows=e():this.isWindows=e()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var M1e=G((nXt,L1e)=>{"use strict";sW.ifExists=gdt;var Cw=Ce("util"),Vc=Ce("path"),N1e=F1e(),pdt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,hdt={createPwshFile:!0,createCmdFile:N1e(),fs:Ce("fs")},ddt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function O1e(e){let t={...hdt,...e},r=t.fs;return t.fs_={chmod:r.chmod?Cw.promisify(r.chmod):async()=>{},mkdir:Cw.promisify(r.mkdir),readFile:Cw.promisify(r.readFile),stat:Cw.promisify(r.stat),unlink:Cw.promisify(r.unlink),writeFile:Cw.promisify(r.writeFile)},t}async function sW(e,t,r){let s=O1e(r);await s.fs_.stat(e),await ydt(e,t,s)}function gdt(e,t,r){return sW(e,t,r).catch(()=>{})}function mdt(e,t){return t.fs_.unlink(e).catch(()=>{})}async function ydt(e,t,r){let s=await Bdt(e,r);return await Edt(t,r),Idt(e,t,s,r)}function Edt(e,t){return t.fs_.mkdir(Vc.dirname(e),{recursive:!0})}function Idt(e,t,r,s){let a=O1e(s),n=[{generator:bdt,extension:""}];return a.createCmdFile&&n.push({generator:Sdt,extension:".cmd"}),a.createPwshFile&&n.push({generator:Ddt,extension:".ps1"}),Promise.all(n.map(c=>vdt(e,t+c.extension,r,c.generator,a)))}function Cdt(e,t){return mdt(e,t)}function wdt(e,t){return Pdt(e,t)}async function Bdt(e,t){let a=(await t.fs_.readFile(e,"utf8")).trim().split(/\r*\n/)[0].match(pdt);if(!a){let n=Vc.extname(e).toLowerCase();return{program:ddt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function vdt(e,t,r,s,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",c=[r.additionalArgs,n].filter(f=>f).join(" ");return a=Object.assign({},a,{prog:r.program,args:c}),await Cdt(t,a),await a.fs_.writeFile(t,s(e,t,a),"utf8"),wdt(t,a)}function Sdt(e,t,r){let a=Vc.relative(Vc.dirname(t),e).split("/").join("\\"),n=Vc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,c,f=r.prog,p=r.args||"",h=oW(r.nodePath).win32;f?(c=`"%~dp0\\${f}.exe"`,a=n):(f=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",C=h?`@SET NODE_PATH=${h}\r +`:"";return c?C+=`@IF EXIST ${c} (\r + ${c} ${p} ${a} ${E}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${f} ${p} ${a} ${E}%*\r +)\r +`:C+=`@${f} ${p} ${a} ${E}%*\r +`,C}function bdt(e,t,r){let s=Vc.relative(Vc.dirname(t),e),a=r.prog&&r.prog.split("\\").join("/"),n;s=s.split("\\").join("/");let c=Vc.isAbsolute(s)?`"${s}"`:`"$basedir/${s}"`,f=r.args||"",p=oW(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,s=c):(a=c,f="",s="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,C=r.nodePath?`export NODE_PATH="${p}" +`:"";return n?E+=`${C}if [ -x ${n} ]; then + exec ${n} ${f} ${s} ${h}"$@" +else + exec ${a} ${f} ${s} ${h}"$@" +fi +`:E+=`${C}${a} ${f} ${s} ${h}"$@" +exit $? +`,E}function Ddt(e,t,r){let s=Vc.relative(Vc.dirname(t),e),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,c;s=s.split("\\").join("/");let f=Vc.isAbsolute(s)?`"${s}"`:`"$basedir/${s}"`,p=r.args||"",h=oW(r.nodePath),E=h.win32,C=h.posix;n?(c=`"$basedir/${r.prog}$exe"`,s=f):(n=f,p="",s="");let S=r.progArgs?`${r.progArgs.join(" ")} `:"",x=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${E}" +`:""}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&&(x+=` else { + $env:NODE_PATH="${C}" +}`),c?x+=` +$ret=0 +if (Test-Path ${c}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${c} ${p} ${s} ${S}$args + } else { + & ${c} ${p} ${s} ${S}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${s} ${S}$args + } else { + & ${n} ${p} ${s} ${S}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:x+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${s} ${S}$args +} else { + & ${n} ${p} ${s} ${S}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,x}function Pdt(e,t){return t.fs_.chmod(e,493)}function oW(e){if(!e)return{win32:"",posix:""};let t=typeof e=="string"?e.split(Vc.delimiter):Array.from(e),r={};for(let s=0;s`/mnt/${f.toLowerCase()}`):t[s];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[s]={win32:a,posix:n}}return r}L1e.exports=sW});var IW=G((Q$t,i2e)=>{i2e.exports=Ce("stream")});var l2e=G((T$t,a2e)=>{"use strict";function s2e(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,s)}return r}function fgt(e){for(var t=1;t0?this.tail.next=s:this.head=s,this.tail=s,++this.length}},{key:"unshift",value:function(r){var s={data:r,next:this.head};this.length===0&&(this.tail=s),this.head=s,++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 s=this.head,a=""+s.data;s=s.next;)a+=r+s.data;return a}},{key:"concat",value:function(r){if(this.length===0)return sN.alloc(0);for(var s=sN.allocUnsafe(r>>>0),a=this.head,n=0;a;)ygt(a.data,s,n),n+=a.data.length,a=a.next;return s}},{key:"consume",value:function(r,s){var a;return rc.length?c.length:r;if(f===c.length?n+=c:n+=c.slice(0,r),r-=f,r===0){f===c.length?(++a,s.next?this.head=s.next:this.head=this.tail=null):(this.head=s,s.data=c.slice(f));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var s=sN.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(s),r-=a.data.length;a=a.next;){var c=a.data,f=r>c.length?c.length:r;if(c.copy(s,s.length-r,0,f),r-=f,r===0){f===c.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=c.slice(f));break}++n}return this.length-=n,s}},{key:mgt,value:function(r,s){return CW(this,fgt({},s,{depth:0,customInspect:!1}))}}]),e}()});var BW=G((R$t,u2e)=>{"use strict";function Egt(e,t){var r=this,s=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return s||a?(t?t(e):e&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(wW,this,e)):process.nextTick(wW,this,e)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(e||null,function(n){!t&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(oN,r):(r._writableState.errorEmitted=!0,process.nextTick(c2e,r,n)):process.nextTick(c2e,r,n):t?(process.nextTick(oN,r),t(n)):process.nextTick(oN,r)}),this)}function c2e(e,t){wW(e,t),oN(e)}function oN(e){e._writableState&&!e._writableState.emitClose||e._readableState&&!e._readableState.emitClose||e.emit("close")}function Igt(){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 wW(e,t){e.emit("error",t)}function Cgt(e,t){var r=e._readableState,s=e._writableState;r&&r.autoDestroy||s&&s.autoDestroy?e.destroy(t):e.emit("error",t)}u2e.exports={destroy:Egt,undestroy:Igt,errorOrDestroy:Cgt}});var cg=G((F$t,p2e)=>{"use strict";var A2e={};function Jc(e,t,r){r||(r=Error);function s(n,c,f){return typeof t=="string"?t:t(n,c,f)}class a extends r{constructor(c,f,p){super(s(c,f,p))}}a.prototype.name=r.name,a.prototype.code=e,A2e[e]=a}function f2e(e,t){if(Array.isArray(e)){let r=e.length;return e=e.map(s=>String(s)),r>2?`one of ${t} ${e.slice(0,r-1).join(", ")}, or `+e[r-1]:r===2?`one of ${t} ${e[0]} or ${e[1]}`:`of ${t} ${e[0]}`}else return`of ${t} ${String(e)}`}function wgt(e,t,r){return e.substr(!r||r<0?0:+r,t.length)===t}function Bgt(e,t,r){return(r===void 0||r>e.length)&&(r=e.length),e.substring(r-t.length,r)===t}function vgt(e,t,r){return typeof r!="number"&&(r=0),r+t.length>e.length?!1:e.indexOf(t,r)!==-1}Jc("ERR_INVALID_OPT_VALUE",function(e,t){return'The value "'+t+'" is invalid for option "'+e+'"'},TypeError);Jc("ERR_INVALID_ARG_TYPE",function(e,t,r){let s;typeof t=="string"&&wgt(t,"not ")?(s="must not be",t=t.replace(/^not /,"")):s="must be";let a;if(Bgt(e," argument"))a=`The ${e} ${s} ${f2e(t,"type")}`;else{let n=vgt(e,".")?"property":"argument";a=`The "${e}" ${n} ${s} ${f2e(t,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Jc("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Jc("ERR_METHOD_NOT_IMPLEMENTED",function(e){return"The "+e+" method is not implemented"});Jc("ERR_STREAM_PREMATURE_CLOSE","Premature close");Jc("ERR_STREAM_DESTROYED",function(e){return"Cannot call "+e+" after a stream was destroyed"});Jc("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Jc("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Jc("ERR_STREAM_WRITE_AFTER_END","write after end");Jc("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Jc("ERR_UNKNOWN_ENCODING",function(e){return"Unknown encoding: "+e},TypeError);Jc("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");p2e.exports.codes=A2e});var vW=G((N$t,h2e)=>{"use strict";var Sgt=cg().codes.ERR_INVALID_OPT_VALUE;function bgt(e,t,r){return e.highWaterMark!=null?e.highWaterMark:t?e[r]:null}function Dgt(e,t,r,s){var a=bgt(t,s,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=s?r:"highWaterMark";throw new Sgt(n,a)}return Math.floor(a)}return e.objectMode?16:16*1024}h2e.exports={getHighWaterMark:Dgt}});var d2e=G((O$t,SW)=>{typeof Object.create=="function"?SW.exports=function(t,r){r&&(t.super_=r,t.prototype=Object.create(r.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:SW.exports=function(t,r){if(r){t.super_=r;var s=function(){};s.prototype=r.prototype,t.prototype=new s,t.prototype.constructor=t}}});var ug=G((L$t,DW)=>{try{if(bW=Ce("util"),typeof bW.inherits!="function")throw"";DW.exports=bW.inherits}catch{DW.exports=d2e()}var bW});var m2e=G((M$t,g2e)=>{g2e.exports=Ce("util").deprecate});var kW=G((U$t,B2e)=>{"use strict";B2e.exports=Vi;function E2e(e){var t=this;this.next=null,this.entry=null,this.finish=function(){e0t(t,e)}}var Dw;Vi.WritableState=iD;var Pgt={deprecate:m2e()},I2e=IW(),lN=Ce("buffer").Buffer,xgt=global.Uint8Array||function(){};function kgt(e){return lN.from(e)}function Qgt(e){return lN.isBuffer(e)||e instanceof xgt}var xW=BW(),Tgt=vW(),Rgt=Tgt.getHighWaterMark,fg=cg().codes,Fgt=fg.ERR_INVALID_ARG_TYPE,Ngt=fg.ERR_METHOD_NOT_IMPLEMENTED,Ogt=fg.ERR_MULTIPLE_CALLBACK,Lgt=fg.ERR_STREAM_CANNOT_PIPE,Mgt=fg.ERR_STREAM_DESTROYED,Ugt=fg.ERR_STREAM_NULL_VALUES,_gt=fg.ERR_STREAM_WRITE_AFTER_END,Hgt=fg.ERR_UNKNOWN_ENCODING,Pw=xW.errorOrDestroy;ug()(Vi,I2e);function jgt(){}function iD(e,t,r){Dw=Dw||Xm(),e=e||{},typeof r!="boolean"&&(r=t instanceof Dw),this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.writableObjectMode),this.highWaterMark=Rgt(this,e,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var s=e.decodeStrings===!1;this.decodeStrings=!s,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){Jgt(t,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=e.emitClose!==!1,this.autoDestroy=!!e.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new E2e(this)}iD.prototype.getBuffer=function(){for(var t=this.bufferedRequest,r=[];t;)r.push(t),t=t.next;return r};(function(){try{Object.defineProperty(iD.prototype,"buffer",{get:Pgt.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var aN;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(aN=Function.prototype[Symbol.hasInstance],Object.defineProperty(Vi,Symbol.hasInstance,{value:function(t){return aN.call(this,t)?!0:this!==Vi?!1:t&&t._writableState instanceof iD}})):aN=function(t){return t instanceof this};function Vi(e){Dw=Dw||Xm();var t=this instanceof Dw;if(!t&&!aN.call(Vi,this))return new Vi(e);this._writableState=new iD(e,this,t),this.writable=!0,e&&(typeof e.write=="function"&&(this._write=e.write),typeof e.writev=="function"&&(this._writev=e.writev),typeof e.destroy=="function"&&(this._destroy=e.destroy),typeof e.final=="function"&&(this._final=e.final)),I2e.call(this)}Vi.prototype.pipe=function(){Pw(this,new Lgt)};function Ggt(e,t){var r=new _gt;Pw(e,r),process.nextTick(t,r)}function qgt(e,t,r,s){var a;return r===null?a=new Ugt:typeof r!="string"&&!t.objectMode&&(a=new Fgt("chunk",["string","Buffer"],r)),a?(Pw(e,a),process.nextTick(s,a),!1):!0}Vi.prototype.write=function(e,t,r){var s=this._writableState,a=!1,n=!s.objectMode&&Qgt(e);return n&&!lN.isBuffer(e)&&(e=kgt(e)),typeof t=="function"&&(r=t,t=null),n?t="buffer":t||(t=s.defaultEncoding),typeof r!="function"&&(r=jgt),s.ending?Ggt(this,r):(n||qgt(this,s,e,r))&&(s.pendingcb++,a=Wgt(this,s,n,e,t,r)),a};Vi.prototype.cork=function(){this._writableState.corked++};Vi.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,!e.writing&&!e.corked&&!e.bufferProcessing&&e.bufferedRequest&&C2e(this,e))};Vi.prototype.setDefaultEncoding=function(t){if(typeof t=="string"&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new Hgt(t);return this._writableState.defaultEncoding=t,this};Object.defineProperty(Vi.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Ygt(e,t,r){return!e.objectMode&&e.decodeStrings!==!1&&typeof t=="string"&&(t=lN.from(t,r)),t}Object.defineProperty(Vi.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Wgt(e,t,r,s,a,n){if(!r){var c=Ygt(t,s,a);s!==c&&(r=!0,a="buffer",s=c)}var f=t.objectMode?1:s.length;t.length+=f;var p=t.length{"use strict";var t0t=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};S2e.exports=EA;var v2e=RW(),TW=kW();ug()(EA,v2e);for(QW=t0t(TW.prototype),cN=0;cN{var fN=Ce("buffer"),lh=fN.Buffer;function b2e(e,t){for(var r in e)t[r]=e[r]}lh.from&&lh.alloc&&lh.allocUnsafe&&lh.allocUnsafeSlow?D2e.exports=fN:(b2e(fN,FW),FW.Buffer=xw);function xw(e,t,r){return lh(e,t,r)}b2e(lh,xw);xw.from=function(e,t,r){if(typeof e=="number")throw new TypeError("Argument must not be a number");return lh(e,t,r)};xw.alloc=function(e,t,r){if(typeof e!="number")throw new TypeError("Argument must be a number");var s=lh(e);return t!==void 0?typeof r=="string"?s.fill(t,r):s.fill(t):s.fill(0),s};xw.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return lh(e)};xw.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return fN.SlowBuffer(e)}});var LW=G(k2e=>{"use strict";var OW=P2e().Buffer,x2e=OW.isEncoding||function(e){switch(e=""+e,e&&e.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 i0t(e){if(!e)return"utf8";for(var t;;)switch(e){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 e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}function s0t(e){var t=i0t(e);if(typeof t!="string"&&(OW.isEncoding===x2e||!x2e(e)))throw new Error("Unknown encoding: "+e);return t||e}k2e.StringDecoder=sD;function sD(e){this.encoding=s0t(e);var t;switch(this.encoding){case"utf16le":this.text=f0t,this.end=A0t,t=4;break;case"utf8":this.fillLast=l0t,t=4;break;case"base64":this.text=p0t,this.end=h0t,t=3;break;default:this.write=d0t,this.end=g0t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=OW.allocUnsafe(t)}sD.prototype.write=function(e){if(e.length===0)return"";var t,r;if(this.lastNeed){if(t=this.fillLast(e),t===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:e>>4===14?3:e>>3===30?4:e>>6===2?-1:-2}function o0t(e,t,r){var s=t.length-1;if(s=0?(a>0&&(e.lastNeed=a-1),a):--s=0?(a>0&&(e.lastNeed=a-2),a):--s=0?(a>0&&(a===2?a=0:e.lastNeed=a-3),a):0))}function a0t(e,t,r){if((t[0]&192)!==128)return e.lastNeed=0,"\uFFFD";if(e.lastNeed>1&&t.length>1){if((t[1]&192)!==128)return e.lastNeed=1,"\uFFFD";if(e.lastNeed>2&&t.length>2&&(t[2]&192)!==128)return e.lastNeed=2,"\uFFFD"}}function l0t(e){var t=this.lastTotal-this.lastNeed,r=a0t(this,e,t);if(r!==void 0)return r;if(this.lastNeed<=e.length)return e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,t,0,e.length),this.lastNeed-=e.length}function c0t(e,t){var r=o0t(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var s=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,s),e.toString("utf8",t,s)}function u0t(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+"\uFFFD":t}function f0t(e,t){if((e.length-t)%2===0){var r=e.toString("utf16le",t);if(r){var s=r.charCodeAt(r.length-1);if(s>=55296&&s<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function A0t(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function p0t(e,t){var r=(e.length-t)%3;return r===0?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function h0t(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function d0t(e){return e.toString(this.encoding)}function g0t(e){return e&&e.length?this.write(e):""}});var AN=G((j$t,R2e)=>{"use strict";var Q2e=cg().codes.ERR_STREAM_PREMATURE_CLOSE;function m0t(e){var t=!1;return function(){if(!t){t=!0;for(var r=arguments.length,s=new Array(r),a=0;a{"use strict";var pN;function Ag(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var I0t=AN(),pg=Symbol("lastResolve"),$m=Symbol("lastReject"),oD=Symbol("error"),hN=Symbol("ended"),ey=Symbol("lastPromise"),MW=Symbol("handlePromise"),ty=Symbol("stream");function hg(e,t){return{value:e,done:t}}function C0t(e){var t=e[pg];if(t!==null){var r=e[ty].read();r!==null&&(e[ey]=null,e[pg]=null,e[$m]=null,t(hg(r,!1)))}}function w0t(e){process.nextTick(C0t,e)}function B0t(e,t){return function(r,s){e.then(function(){if(t[hN]){r(hg(void 0,!0));return}t[MW](r,s)},s)}}var v0t=Object.getPrototypeOf(function(){}),S0t=Object.setPrototypeOf((pN={get stream(){return this[ty]},next:function(){var t=this,r=this[oD];if(r!==null)return Promise.reject(r);if(this[hN])return Promise.resolve(hg(void 0,!0));if(this[ty].destroyed)return new Promise(function(c,f){process.nextTick(function(){t[oD]?f(t[oD]):c(hg(void 0,!0))})});var s=this[ey],a;if(s)a=new Promise(B0t(s,this));else{var n=this[ty].read();if(n!==null)return Promise.resolve(hg(n,!1));a=new Promise(this[MW])}return this[ey]=a,a}},Ag(pN,Symbol.asyncIterator,function(){return this}),Ag(pN,"return",function(){var t=this;return new Promise(function(r,s){t[ty].destroy(null,function(a){if(a){s(a);return}r(hg(void 0,!0))})})}),pN),v0t),b0t=function(t){var r,s=Object.create(S0t,(r={},Ag(r,ty,{value:t,writable:!0}),Ag(r,pg,{value:null,writable:!0}),Ag(r,$m,{value:null,writable:!0}),Ag(r,oD,{value:null,writable:!0}),Ag(r,hN,{value:t._readableState.endEmitted,writable:!0}),Ag(r,MW,{value:function(n,c){var f=s[ty].read();f?(s[ey]=null,s[pg]=null,s[$m]=null,n(hg(f,!1))):(s[pg]=n,s[$m]=c)},writable:!0}),r));return s[ey]=null,I0t(t,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=s[$m];n!==null&&(s[ey]=null,s[pg]=null,s[$m]=null,n(a)),s[oD]=a;return}var c=s[pg];c!==null&&(s[ey]=null,s[pg]=null,s[$m]=null,c(hg(void 0,!0))),s[hN]=!0}),t.on("readable",w0t.bind(null,s)),s};F2e.exports=b0t});var U2e=G((q$t,M2e)=>{"use strict";function O2e(e,t,r,s,a,n,c){try{var f=e[n](c),p=f.value}catch(h){r(h);return}f.done?t(p):Promise.resolve(p).then(s,a)}function D0t(e){return function(){var t=this,r=arguments;return new Promise(function(s,a){var n=e.apply(t,r);function c(p){O2e(n,s,a,c,f,"next",p)}function f(p){O2e(n,s,a,c,f,"throw",p)}c(void 0)})}}function L2e(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,s)}return r}function P0t(e){for(var t=1;t{"use strict";J2e.exports=Qn;var kw;Qn.ReadableState=G2e;var Y$t=Ce("events").EventEmitter,j2e=function(t,r){return t.listeners(r).length},lD=IW(),dN=Ce("buffer").Buffer,T0t=global.Uint8Array||function(){};function R0t(e){return dN.from(e)}function F0t(e){return dN.isBuffer(e)||e instanceof T0t}var UW=Ce("util"),un;UW&&UW.debuglog?un=UW.debuglog("stream"):un=function(){};var N0t=l2e(),WW=BW(),O0t=vW(),L0t=O0t.getHighWaterMark,gN=cg().codes,M0t=gN.ERR_INVALID_ARG_TYPE,U0t=gN.ERR_STREAM_PUSH_AFTER_EOF,_0t=gN.ERR_METHOD_NOT_IMPLEMENTED,H0t=gN.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Qw,_W,HW;ug()(Qn,lD);var aD=WW.errorOrDestroy,jW=["error","close","destroy","pause","resume"];function j0t(e,t,r){if(typeof e.prependListener=="function")return e.prependListener(t,r);!e._events||!e._events[t]?e.on(t,r):Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]}function G2e(e,t,r){kw=kw||Xm(),e=e||{},typeof r!="boolean"&&(r=t instanceof kw),this.objectMode=!!e.objectMode,r&&(this.objectMode=this.objectMode||!!e.readableObjectMode),this.highWaterMark=L0t(this,e,"readableHighWaterMark",r),this.buffer=new N0t,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=e.emitClose!==!1,this.autoDestroy=!!e.autoDestroy,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(Qw||(Qw=LW().StringDecoder),this.decoder=new Qw(e.encoding),this.encoding=e.encoding)}function Qn(e){if(kw=kw||Xm(),!(this instanceof Qn))return new Qn(e);var t=this instanceof kw;this._readableState=new G2e(e,this,t),this.readable=!0,e&&(typeof e.read=="function"&&(this._read=e.read),typeof e.destroy=="function"&&(this._destroy=e.destroy)),lD.call(this)}Object.defineProperty(Qn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(t){this._readableState&&(this._readableState.destroyed=t)}});Qn.prototype.destroy=WW.destroy;Qn.prototype._undestroy=WW.undestroy;Qn.prototype._destroy=function(e,t){t(e)};Qn.prototype.push=function(e,t){var r=this._readableState,s;return r.objectMode?s=!0:typeof e=="string"&&(t=t||r.defaultEncoding,t!==r.encoding&&(e=dN.from(e,t),t=""),s=!0),q2e(this,e,t,!1,s)};Qn.prototype.unshift=function(e){return q2e(this,e,null,!0,!1)};function q2e(e,t,r,s,a){un("readableAddChunk",t);var n=e._readableState;if(t===null)n.reading=!1,Y0t(e,n);else{var c;if(a||(c=G0t(n,t)),c)aD(e,c);else if(n.objectMode||t&&t.length>0)if(typeof t!="string"&&!n.objectMode&&Object.getPrototypeOf(t)!==dN.prototype&&(t=R0t(t)),s)n.endEmitted?aD(e,new H0t):GW(e,n,t,!0);else if(n.ended)aD(e,new U0t);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(t=n.decoder.write(t),n.objectMode||t.length!==0?GW(e,n,t,!1):YW(e,n)):GW(e,n,t,!1)}else s||(n.reading=!1,YW(e,n))}return!n.ended&&(n.length=_2e?e=_2e:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function H2e(e,t){return e<=0||t.length===0&&t.ended?0:t.objectMode?1:e!==e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=q0t(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}Qn.prototype.read=function(e){un("read",e),e=parseInt(e,10);var t=this._readableState,r=e;if(e!==0&&(t.emittedReadable=!1),e===0&&t.needReadable&&((t.highWaterMark!==0?t.length>=t.highWaterMark:t.length>0)||t.ended))return un("read: emitReadable",t.length,t.ended),t.length===0&&t.ended?qW(this):mN(this),null;if(e=H2e(e,t),e===0&&t.ended)return t.length===0&&qW(this),null;var s=t.needReadable;un("need readable",s),(t.length===0||t.length-e0?a=V2e(e,t):a=null,a===null?(t.needReadable=t.length<=t.highWaterMark,e=0):(t.length-=e,t.awaitDrain=0),t.length===0&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&qW(this)),a!==null&&this.emit("data",a),a};function Y0t(e,t){if(un("onEofChunk"),!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,t.sync?mN(e):(t.needReadable=!1,t.emittedReadable||(t.emittedReadable=!0,Y2e(e)))}}function mN(e){var t=e._readableState;un("emitReadable",t.needReadable,t.emittedReadable),t.needReadable=!1,t.emittedReadable||(un("emitReadable",t.flowing),t.emittedReadable=!0,process.nextTick(Y2e,e))}function Y2e(e){var t=e._readableState;un("emitReadable_",t.destroyed,t.length,t.ended),!t.destroyed&&(t.length||t.ended)&&(e.emit("readable"),t.emittedReadable=!1),t.needReadable=!t.flowing&&!t.ended&&t.length<=t.highWaterMark,VW(e)}function YW(e,t){t.readingMore||(t.readingMore=!0,process.nextTick(W0t,e,t))}function W0t(e,t){for(;!t.reading&&!t.ended&&(t.length1&&K2e(s.pipes,e)!==-1)&&!h&&(un("false write response, pause",s.awaitDrain),s.awaitDrain++),r.pause())}function S(N){un("onerror",N),R(),e.removeListener("error",S),j2e(e,"error")===0&&aD(e,N)}j0t(e,"error",S);function x(){e.removeListener("finish",I),R()}e.once("close",x);function I(){un("onfinish"),e.removeListener("close",x),R()}e.once("finish",I);function R(){un("unpipe"),r.unpipe(e)}return e.emit("pipe",r),s.flowing||(un("pipe resume"),r.resume()),e};function V0t(e){return function(){var r=e._readableState;un("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&j2e(e,"data")&&(r.flowing=!0,VW(e))}}Qn.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(t.pipesCount===0)return this;if(t.pipesCount===1)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var s=t.pipes,a=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var n=0;n0,s.flowing!==!1&&this.resume()):e==="readable"&&!s.endEmitted&&!s.readableListening&&(s.readableListening=s.needReadable=!0,s.flowing=!1,s.emittedReadable=!1,un("on readable",s.length,s.reading),s.length?mN(this):s.reading||process.nextTick(K0t,this)),r};Qn.prototype.addListener=Qn.prototype.on;Qn.prototype.removeListener=function(e,t){var r=lD.prototype.removeListener.call(this,e,t);return e==="readable"&&process.nextTick(W2e,this),r};Qn.prototype.removeAllListeners=function(e){var t=lD.prototype.removeAllListeners.apply(this,arguments);return(e==="readable"||e===void 0)&&process.nextTick(W2e,this),t};function W2e(e){var t=e._readableState;t.readableListening=e.listenerCount("readable")>0,t.resumeScheduled&&!t.paused?t.flowing=!0:e.listenerCount("data")>0&&e.resume()}function K0t(e){un("readable nexttick read 0"),e.read(0)}Qn.prototype.resume=function(){var e=this._readableState;return e.flowing||(un("resume"),e.flowing=!e.readableListening,J0t(this,e)),e.paused=!1,this};function J0t(e,t){t.resumeScheduled||(t.resumeScheduled=!0,process.nextTick(z0t,e,t))}function z0t(e,t){un("resume",t.reading),t.reading||e.read(0),t.resumeScheduled=!1,e.emit("resume"),VW(e),t.flowing&&!t.reading&&e.read(0)}Qn.prototype.pause=function(){return un("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(un("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function VW(e){var t=e._readableState;for(un("flow",t.flowing);t.flowing&&e.read()!==null;);}Qn.prototype.wrap=function(e){var t=this,r=this._readableState,s=!1;e.on("end",function(){if(un("wrapped end"),r.decoder&&!r.ended){var c=r.decoder.end();c&&c.length&&t.push(c)}t.push(null)}),e.on("data",function(c){if(un("wrapped data"),r.decoder&&(c=r.decoder.write(c)),!(r.objectMode&&c==null)&&!(!r.objectMode&&(!c||!c.length))){var f=t.push(c);f||(s=!0,e.pause())}});for(var a in e)this[a]===void 0&&typeof e[a]=="function"&&(this[a]=function(f){return function(){return e[f].apply(e,arguments)}}(a));for(var n=0;n=t.length?(t.decoder?r=t.buffer.join(""):t.buffer.length===1?r=t.buffer.first():r=t.buffer.concat(t.length),t.buffer.clear()):r=t.buffer.consume(e,t.decoder),r}function qW(e){var t=e._readableState;un("endReadable",t.endEmitted),t.endEmitted||(t.ended=!0,process.nextTick(Z0t,t,e))}function Z0t(e,t){if(un("endReadableNT",e.endEmitted,e.length),!e.endEmitted&&e.length===0&&(e.endEmitted=!0,t.readable=!1,t.emit("end"),e.autoDestroy)){var r=t._writableState;(!r||r.autoDestroy&&r.finished)&&t.destroy()}}typeof Symbol=="function"&&(Qn.from=function(e,t){return HW===void 0&&(HW=U2e()),HW(Qn,e,t)});function K2e(e,t){for(var r=0,s=e.length;r{"use strict";Z2e.exports=ch;var yN=cg().codes,X0t=yN.ERR_METHOD_NOT_IMPLEMENTED,$0t=yN.ERR_MULTIPLE_CALLBACK,emt=yN.ERR_TRANSFORM_ALREADY_TRANSFORMING,tmt=yN.ERR_TRANSFORM_WITH_LENGTH_0,EN=Xm();ug()(ch,EN);function rmt(e,t){var r=this._transformState;r.transforming=!1;var s=r.writecb;if(s===null)return this.emit("error",new $0t);r.writechunk=null,r.writecb=null,t!=null&&this.push(t),s(e);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";$2e.exports=cD;var X2e=KW();ug()(cD,X2e);function cD(e){if(!(this instanceof cD))return new cD(e);X2e.call(this,e)}cD.prototype._transform=function(e,t,r){r(null,e)}});var sBe=G((J$t,iBe)=>{"use strict";var JW;function imt(e){var t=!1;return function(){t||(t=!0,e.apply(void 0,arguments))}}var nBe=cg().codes,smt=nBe.ERR_MISSING_ARGS,omt=nBe.ERR_STREAM_DESTROYED;function tBe(e){if(e)throw e}function amt(e){return e.setHeader&&typeof e.abort=="function"}function lmt(e,t,r,s){s=imt(s);var a=!1;e.on("close",function(){a=!0}),JW===void 0&&(JW=AN()),JW(e,{readable:t,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,amt(e))return e.abort();if(typeof e.destroy=="function")return e.destroy();s(c||new omt("pipe"))}}}function rBe(e){e()}function cmt(e,t){return e.pipe(t)}function umt(e){return!e.length||typeof e[e.length-1]!="function"?tBe:e.pop()}function fmt(){for(var e=arguments.length,t=new Array(e),r=0;r0;return lmt(c,p,h,function(E){a||(a=E),E&&n.forEach(rBe),!p&&(n.forEach(rBe),s(a))})});return t.reduce(cmt)}iBe.exports=fmt});var Tw=G((zc,fD)=>{var uD=Ce("stream");process.env.READABLE_STREAM==="disable"&&uD?(fD.exports=uD.Readable,Object.assign(fD.exports,uD),fD.exports.Stream=uD):(zc=fD.exports=RW(),zc.Stream=uD||zc,zc.Readable=zc,zc.Writable=kW(),zc.Duplex=Xm(),zc.Transform=KW(),zc.PassThrough=eBe(),zc.finished=AN(),zc.pipeline=sBe())});var lBe=G((z$t,aBe)=>{"use strict";var{Buffer:Af}=Ce("buffer"),oBe=Symbol.for("BufferList");function Bi(e){if(!(this instanceof Bi))return new Bi(e);Bi._init.call(this,e)}Bi._init=function(t){Object.defineProperty(this,oBe,{value:!0}),this._bufs=[],this.length=0,t&&this.append(t)};Bi.prototype._new=function(t){return new Bi(t)};Bi.prototype._offset=function(t){if(t===0)return[0,0];let r=0;for(let s=0;sthis.length||t<0)return;let r=this._offset(t);return this._bufs[r[0]][r[1]]};Bi.prototype.slice=function(t,r){return typeof t=="number"&&t<0&&(t+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,t,r)};Bi.prototype.copy=function(t,r,s,a){if((typeof s!="number"||s<0)&&(s=0),(typeof a!="number"||a>this.length)&&(a=this.length),s>=this.length||a<=0)return t||Af.alloc(0);let n=!!t,c=this._offset(s),f=a-s,p=f,h=n&&r||0,E=c[1];if(s===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:Af.concat(this._bufs,this.length);for(let C=0;CS)this._bufs[C].copy(t,h,E),h+=S;else{this._bufs[C].copy(t,h,E,E+p),h+=S;break}p-=S,E&&(E=0)}return t.length>h?t.slice(0,h):t};Bi.prototype.shallowSlice=function(t,r){if(t=t||0,r=typeof r!="number"?this.length:r,t<0&&(t+=this.length),r<0&&(r+=this.length),t===r)return this._new();let s=this._offset(t),a=this._offset(r),n=this._bufs.slice(s[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),s[1]!==0&&(n[0]=n[0].slice(s[1])),this._new(n)};Bi.prototype.toString=function(t,r,s){return this.slice(r,s).toString(t)};Bi.prototype.consume=function(t){if(t=Math.trunc(t),Number.isNaN(t)||t<=0)return this;for(;this._bufs.length;)if(t>=this._bufs[0].length)t-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(t),this.length-=t;break}return this};Bi.prototype.duplicate=function(){let t=this._new();for(let r=0;rthis.length?this.length:t;let s=this._offset(t),a=s[0],n=s[1];for(;a=e.length){let p=c.indexOf(e,n);if(p!==-1)return this._reverseOffset([a,p]);n=c.length-e.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,e))return p;n++}n=0}return-1};Bi.prototype._match=function(e,t){if(this.length-e{"use strict";var zW=Tw().Duplex,Amt=ug(),AD=lBe();function la(e){if(!(this instanceof la))return new la(e);if(typeof e=="function"){this._callback=e;let t=function(s){this._callback&&(this._callback(s),this._callback=null)}.bind(this);this.on("pipe",function(s){s.on("error",t)}),this.on("unpipe",function(s){s.removeListener("error",t)}),e=null}AD._init.call(this,e),zW.call(this)}Amt(la,zW);Object.assign(la.prototype,AD.prototype);la.prototype._new=function(t){return new la(t)};la.prototype._write=function(t,r,s){this._appendBuffer(t),typeof s=="function"&&s()};la.prototype._read=function(t){if(!this.length)return this.push(null);t=Math.min(t,this.length),this.push(this.slice(0,t)),this.consume(t)};la.prototype.end=function(t){zW.prototype.end.call(this,t),this._callback&&(this._callback(null,this.slice()),this._callback=null)};la.prototype._destroy=function(t,r){this._bufs.length=0,this.length=0,r(t)};la.prototype._isBufferList=function(t){return t instanceof la||t instanceof AD||la.isBufferList(t)};la.isBufferList=AD.isBufferList;IN.exports=la;IN.exports.BufferListStream=la;IN.exports.BufferList=AD});var $W=G(Fw=>{var pmt=Buffer.alloc,hmt="0000000000000000000",dmt="7777777777777777777",uBe=48,fBe=Buffer.from("ustar\0","binary"),gmt=Buffer.from("00","binary"),mmt=Buffer.from("ustar ","binary"),ymt=Buffer.from(" \0","binary"),Emt=parseInt("7777",8),pD=257,XW=263,Imt=function(e,t,r){return typeof e!="number"?r:(e=~~e,e>=t?t:e>=0||(e+=t,e>=0)?e:0)},Cmt=function(e){switch(e){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},wmt=function(e){switch(e){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},ABe=function(e,t,r,s){for(;rt?dmt.slice(0,t)+" ":hmt.slice(0,t-e.length)+e+" "};function Bmt(e){var t;if(e[0]===128)t=!0;else if(e[0]===255)t=!1;else return null;for(var r=[],s=e.length-1;s>0;s--){var a=e[s];t?r.push(a):r.push(255-a)}var n=0,c=r.length;for(s=0;s=Math.pow(10,r)&&r++,t+r+e};Fw.decodeLongPath=function(e,t){return Rw(e,0,e.length,t)};Fw.encodePax=function(e){var t="";e.name&&(t+=ZW(" path="+e.name+` +`)),e.linkname&&(t+=ZW(" linkpath="+e.linkname+` +`));var r=e.pax;if(r)for(var s in r)t+=ZW(" "+s+"="+r[s]+` +`);return Buffer.from(t)};Fw.decodePax=function(e){for(var t={};e.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;s+=s?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(s)>155||e.linkname&&Buffer.byteLength(e.linkname)>100?null:(t.write(r),t.write(dg(e.mode&Emt,6),100),t.write(dg(e.uid,6),108),t.write(dg(e.gid,6),116),t.write(dg(e.size,11),124),t.write(dg(e.mtime.getTime()/1e3|0,11),136),t[156]=uBe+wmt(e.type),e.linkname&&t.write(e.linkname,157),fBe.copy(t,pD),gmt.copy(t,XW),e.uname&&t.write(e.uname,265),e.gname&&t.write(e.gname,297),t.write(dg(e.devmajor||0,6),329),t.write(dg(e.devminor||0,6),337),s&&t.write(s,345),t.write(dg(pBe(t),6),148),t)};Fw.decode=function(e,t,r){var s=e[156]===0?0:e[156]-uBe,a=Rw(e,0,100,t),n=gg(e,100,8),c=gg(e,108,8),f=gg(e,116,8),p=gg(e,124,12),h=gg(e,136,12),E=Cmt(s),C=e[157]===0?null:Rw(e,157,100,t),S=Rw(e,265,32),x=Rw(e,297,32),I=gg(e,329,8),R=gg(e,337,8),N=pBe(e);if(N===8*32)return null;if(N!==gg(e,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(fBe.compare(e,pD,pD+6)===0)e[345]&&(a=Rw(e,345,155,t)+"/"+a);else if(!(mmt.compare(e,pD,pD+6)===0&&ymt.compare(e,XW,XW+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return s===0&&a&&a[a.length-1]==="/"&&(s=5),{name:a,mode:n,uid:c,gid:f,size:p,mtime:new Date(1e3*h),type:E,linkname:C,uname:S,gname:x,devmajor:I,devminor:R}}});var IBe=G(($$t,EBe)=>{var dBe=Ce("util"),vmt=cBe(),hD=$W(),gBe=Tw().Writable,mBe=Tw().PassThrough,yBe=function(){},hBe=function(e){return e&=511,e&&512-e},Smt=function(e,t){var r=new CN(e,t);return r.end(),r},bmt=function(e,t){return t.path&&(e.name=t.path),t.linkpath&&(e.linkname=t.linkpath),t.size&&(e.size=parseInt(t.size,10)),e.pax=t,e},CN=function(e,t){this._parent=e,this.offset=t,mBe.call(this,{autoDestroy:!1})};dBe.inherits(CN,mBe);CN.prototype.destroy=function(e){this._parent.destroy(e)};var uh=function(e){if(!(this instanceof uh))return new uh(e);gBe.call(this,e),e=e||{},this._offset=0,this._buffer=vmt(),this._missing=0,this._partial=!1,this._onparse=yBe,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 t=this,r=t._buffer,s=function(){t._continue()},a=function(S){if(t._locked=!1,S)return t.destroy(S);t._stream||s()},n=function(){t._stream=null;var S=hBe(t._header.size);S?t._parse(S,c):t._parse(512,C),t._locked||s()},c=function(){t._buffer.consume(hBe(t._header.size)),t._parse(512,C),s()},f=function(){var S=t._header.size;t._paxGlobal=hD.decodePax(r.slice(0,S)),r.consume(S),n()},p=function(){var S=t._header.size;t._pax=hD.decodePax(r.slice(0,S)),t._paxGlobal&&(t._pax=Object.assign({},t._paxGlobal,t._pax)),r.consume(S),n()},h=function(){var S=t._header.size;this._gnuLongPath=hD.decodeLongPath(r.slice(0,S),e.filenameEncoding),r.consume(S),n()},E=function(){var S=t._header.size;this._gnuLongLinkPath=hD.decodeLongPath(r.slice(0,S),e.filenameEncoding),r.consume(S),n()},C=function(){var S=t._offset,x;try{x=t._header=hD.decode(r.slice(0,512),e.filenameEncoding,e.allowUnknownFormat)}catch(I){t.emit("error",I)}if(r.consume(512),!x){t._parse(512,C),s();return}if(x.type==="gnu-long-path"){t._parse(x.size,h),s();return}if(x.type==="gnu-long-link-path"){t._parse(x.size,E),s();return}if(x.type==="pax-global-header"){t._parse(x.size,f),s();return}if(x.type==="pax-header"){t._parse(x.size,p),s();return}if(t._gnuLongPath&&(x.name=t._gnuLongPath,t._gnuLongPath=null),t._gnuLongLinkPath&&(x.linkname=t._gnuLongLinkPath,t._gnuLongLinkPath=null),t._pax&&(t._header=x=bmt(x,t._pax),t._pax=null),t._locked=!0,!x.size||x.type==="directory"){t._parse(512,C),t.emit("entry",x,Smt(t,S),a);return}t._stream=new CN(t,S),t.emit("entry",x,t._stream,a),t._parse(x.size,n),s()};this._onheader=C,this._parse(512,C)};dBe.inherits(uh,gBe);uh.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.emit("close"))};uh.prototype._parse=function(e,t){this._destroyed||(this._offset+=e,this._missing=e,t===this._onheader&&(this._partial=!1),this._onparse=t)};uh.prototype._continue=function(){if(!this._destroyed){var e=this._cb;this._cb=yBe,this._overflow?this._write(this._overflow,void 0,e):e()}};uh.prototype._write=function(e,t,r){if(!this._destroyed){var s=this._stream,a=this._buffer,n=this._missing;if(e.length&&(this._partial=!0),e.lengthn&&(c=e.slice(n),e=e.slice(0,n)),s?s.end(e):a.append(e),this._overflow=c,this._onparse()}};uh.prototype._final=function(e){if(this._partial)return this.destroy(new Error("Unexpected end of data"));e()};EBe.exports=uh});var wBe=G((eer,CBe)=>{CBe.exports=Ce("fs").constants||Ce("constants")});var DBe=G((ter,bBe)=>{var Nw=wBe(),BBe=iH(),BN=ug(),Dmt=Buffer.alloc,vBe=Tw().Readable,Ow=Tw().Writable,Pmt=Ce("string_decoder").StringDecoder,wN=$W(),xmt=parseInt("755",8),kmt=parseInt("644",8),SBe=Dmt(1024),tV=function(){},eV=function(e,t){t&=511,t&&e.push(SBe.slice(0,512-t))};function Qmt(e){switch(e&Nw.S_IFMT){case Nw.S_IFBLK:return"block-device";case Nw.S_IFCHR:return"character-device";case Nw.S_IFDIR:return"directory";case Nw.S_IFIFO:return"fifo";case Nw.S_IFLNK:return"symlink"}return"file"}var vN=function(e){Ow.call(this),this.written=0,this._to=e,this._destroyed=!1};BN(vN,Ow);vN.prototype._write=function(e,t,r){if(this.written+=e.length,this._to.push(e))return r();this._to._drain=r};vN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var SN=function(){Ow.call(this),this.linkname="",this._decoder=new Pmt("utf-8"),this._destroyed=!1};BN(SN,Ow);SN.prototype._write=function(e,t,r){this.linkname+=this._decoder.write(e),r()};SN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var dD=function(){Ow.call(this),this._destroyed=!1};BN(dD,Ow);dD.prototype._write=function(e,t,r){r(new Error("No body allowed for this entry"))};dD.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var IA=function(e){if(!(this instanceof IA))return new IA(e);vBe.call(this,e),this._drain=tV,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};BN(IA,vBe);IA.prototype.entry=function(e,t,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof t=="function"&&(r=t,t=null),r||(r=tV);var s=this;if((!e.size||e.type==="symlink")&&(e.size=0),e.type||(e.type=Qmt(e.mode)),e.mode||(e.mode=e.type==="directory"?xmt:kmt),e.uid||(e.uid=0),e.gid||(e.gid=0),e.mtime||(e.mtime=new Date),typeof t=="string"&&(t=Buffer.from(t)),Buffer.isBuffer(t)){e.size=t.length,this._encode(e);var a=this.push(t);return eV(s,e.size),a?process.nextTick(r):this._drain=r,new dD}if(e.type==="symlink"&&!e.linkname){var n=new SN;return BBe(n,function(f){if(f)return s.destroy(),r(f);e.linkname=n.linkname,s._encode(e),r()}),n}if(this._encode(e),e.type!=="file"&&e.type!=="contiguous-file")return process.nextTick(r),new dD;var c=new vN(this);return this._stream=c,BBe(c,function(f){if(s._stream=null,f)return s.destroy(),r(f);if(c.written!==e.size)return s.destroy(),r(new Error("size mismatch"));eV(s,e.size),s._finalizing&&s.finalize(),r()}),c}};IA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(SBe),this.push(null))};IA.prototype.destroy=function(e){this._destroyed||(this._destroyed=!0,e&&this.emit("error",e),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};IA.prototype._encode=function(e){if(!e.pax){var t=wN.encode(e);if(t){this.push(t);return}}this._encodePax(e)};IA.prototype._encodePax=function(e){var t=wN.encodePax({name:e.name,linkname:e.linkname,pax:e.pax}),r={name:"PaxHeader",mode:e.mode,uid:e.uid,gid:e.gid,size:t.length,mtime:e.mtime,type:"pax-header",linkname:e.linkname&&"PaxHeader",uname:e.uname,gname:e.gname,devmajor:e.devmajor,devminor:e.devminor};this.push(wN.encode(r)),this.push(t),eV(this,t.length),r.size=e.size,r.type=e.type,this.push(wN.encode(r))};IA.prototype._read=function(e){var t=this._drain;this._drain=tV,t()};bBe.exports=IA});var PBe=G(rV=>{rV.extract=IBe();rV.pack=DBe()});var HBe=G(Ha=>{"use strict";var qmt=Ha&&Ha.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ha,"__esModule",{value:!0});Ha.Minipass=Ha.isWritable=Ha.isReadable=Ha.isStream=void 0;var OBe=typeof process=="object"&&process?process:{stdout:null,stderr:null},hV=Ce("node:events"),_Be=qmt(Ce("node:stream")),Ymt=Ce("node:string_decoder"),Wmt=e=>!!e&&typeof e=="object"&&(e instanceof FN||e instanceof _Be.default||(0,Ha.isReadable)(e)||(0,Ha.isWritable)(e));Ha.isStream=Wmt;var Vmt=e=>!!e&&typeof e=="object"&&e instanceof hV.EventEmitter&&typeof e.pipe=="function"&&e.pipe!==_Be.default.Writable.prototype.pipe;Ha.isReadable=Vmt;var Kmt=e=>!!e&&typeof e=="object"&&e instanceof hV.EventEmitter&&typeof e.write=="function"&&typeof e.end=="function";Ha.isWritable=Kmt;var fh=Symbol("EOF"),Ah=Symbol("maybeEmitEnd"),mg=Symbol("emittedEnd"),PN=Symbol("emittingEnd"),gD=Symbol("emittedError"),xN=Symbol("closed"),LBe=Symbol("read"),kN=Symbol("flush"),MBe=Symbol("flushChunk"),pf=Symbol("encoding"),Mw=Symbol("decoder"),no=Symbol("flowing"),mD=Symbol("paused"),Uw=Symbol("resume"),io=Symbol("buffer"),Ua=Symbol("pipes"),so=Symbol("bufferLength"),lV=Symbol("bufferPush"),QN=Symbol("bufferShift"),ca=Symbol("objectMode"),ns=Symbol("destroyed"),cV=Symbol("error"),uV=Symbol("emitData"),UBe=Symbol("emitEnd"),fV=Symbol("emitEnd2"),wA=Symbol("async"),AV=Symbol("abort"),TN=Symbol("aborted"),yD=Symbol("signal"),ry=Symbol("dataListeners"),sc=Symbol("discarded"),ED=e=>Promise.resolve().then(e),Jmt=e=>e(),zmt=e=>e==="end"||e==="finish"||e==="prefinish",Zmt=e=>e instanceof ArrayBuffer||!!e&&typeof e=="object"&&e.constructor&&e.constructor.name==="ArrayBuffer"&&e.byteLength>=0,Xmt=e=>!Buffer.isBuffer(e)&&ArrayBuffer.isView(e),RN=class{src;dest;opts;ondrain;constructor(t,r,s){this.src=t,this.dest=r,this.opts=s,this.ondrain=()=>t[Uw](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},pV=class extends RN{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(t,r,s){super(t,r,s),this.proxyErrors=a=>r.emit("error",a),t.on("error",this.proxyErrors)}},$mt=e=>!!e.objectMode,eyt=e=>!e.objectMode&&!!e.encoding&&e.encoding!=="buffer",FN=class extends hV.EventEmitter{[no]=!1;[mD]=!1;[Ua]=[];[io]=[];[ca];[pf];[wA];[Mw];[fh]=!1;[mg]=!1;[PN]=!1;[xN]=!1;[gD]=null;[so]=0;[ns]=!1;[yD];[TN]=!1;[ry]=0;[sc]=!1;writable=!0;readable=!0;constructor(...t){let r=t[0]||{};if(super(),r.objectMode&&typeof r.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");$mt(r)?(this[ca]=!0,this[pf]=null):eyt(r)?(this[pf]=r.encoding,this[ca]=!1):(this[ca]=!1,this[pf]=null),this[wA]=!!r.async,this[Mw]=this[pf]?new Ymt.StringDecoder(this[pf]):null,r&&r.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[io]}),r&&r.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[Ua]});let{signal:s}=r;s&&(this[yD]=s,s.aborted?this[AV]():s.addEventListener("abort",()=>this[AV]()))}get bufferLength(){return this[so]}get encoding(){return this[pf]}set encoding(t){throw new Error("Encoding must be set at instantiation time")}setEncoding(t){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[ca]}set objectMode(t){throw new Error("objectMode must be set at instantiation time")}get async(){return this[wA]}set async(t){this[wA]=this[wA]||!!t}[AV](){this[TN]=!0,this.emit("abort",this[yD]?.reason),this.destroy(this[yD]?.reason)}get aborted(){return this[TN]}set aborted(t){}write(t,r,s){if(this[TN])return!1;if(this[fh])throw new Error("write after end");if(this[ns])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(s=r,r="utf8"),r||(r="utf8");let a=this[wA]?ED:Jmt;if(!this[ca]&&!Buffer.isBuffer(t)){if(Xmt(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(Zmt(t))t=Buffer.from(t);else if(typeof t!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[ca]?(this[no]&&this[so]!==0&&this[kN](!0),this[no]?this.emit("data",t):this[lV](t),this[so]!==0&&this.emit("readable"),s&&a(s),this[no]):t.length?(typeof t=="string"&&!(r===this[pf]&&!this[Mw]?.lastNeed)&&(t=Buffer.from(t,r)),Buffer.isBuffer(t)&&this[pf]&&(t=this[Mw].write(t)),this[no]&&this[so]!==0&&this[kN](!0),this[no]?this.emit("data",t):this[lV](t),this[so]!==0&&this.emit("readable"),s&&a(s),this[no]):(this[so]!==0&&this.emit("readable"),s&&a(s),this[no])}read(t){if(this[ns])return null;if(this[sc]=!1,this[so]===0||t===0||t&&t>this[so])return this[Ah](),null;this[ca]&&(t=null),this[io].length>1&&!this[ca]&&(this[io]=[this[pf]?this[io].join(""):Buffer.concat(this[io],this[so])]);let r=this[LBe](t||null,this[io][0]);return this[Ah](),r}[LBe](t,r){if(this[ca])this[QN]();else{let s=r;t===s.length||t===null?this[QN]():typeof s=="string"?(this[io][0]=s.slice(t),r=s.slice(0,t),this[so]-=t):(this[io][0]=s.subarray(t),r=s.subarray(0,t),this[so]-=t)}return this.emit("data",r),!this[io].length&&!this[fh]&&this.emit("drain"),r}end(t,r,s){return typeof t=="function"&&(s=t,t=void 0),typeof r=="function"&&(s=r,r="utf8"),t!==void 0&&this.write(t,r),s&&this.once("end",s),this[fh]=!0,this.writable=!1,(this[no]||!this[mD])&&this[Ah](),this}[Uw](){this[ns]||(!this[ry]&&!this[Ua].length&&(this[sc]=!0),this[mD]=!1,this[no]=!0,this.emit("resume"),this[io].length?this[kN]():this[fh]?this[Ah]():this.emit("drain"))}resume(){return this[Uw]()}pause(){this[no]=!1,this[mD]=!0,this[sc]=!1}get destroyed(){return this[ns]}get flowing(){return this[no]}get paused(){return this[mD]}[lV](t){this[ca]?this[so]+=1:this[so]+=t.length,this[io].push(t)}[QN](){return this[ca]?this[so]-=1:this[so]-=this[io][0].length,this[io].shift()}[kN](t=!1){do;while(this[MBe](this[QN]())&&this[io].length);!t&&!this[io].length&&!this[fh]&&this.emit("drain")}[MBe](t){return this.emit("data",t),this[no]}pipe(t,r){if(this[ns])return t;this[sc]=!1;let s=this[mg];return r=r||{},t===OBe.stdout||t===OBe.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,s?r.end&&t.end():(this[Ua].push(r.proxyErrors?new pV(this,t,r):new RN(this,t,r)),this[wA]?ED(()=>this[Uw]()):this[Uw]()),t}unpipe(t){let r=this[Ua].find(s=>s.dest===t);r&&(this[Ua].length===1?(this[no]&&this[ry]===0&&(this[no]=!1),this[Ua]=[]):this[Ua].splice(this[Ua].indexOf(r),1),r.unpipe())}addListener(t,r){return this.on(t,r)}on(t,r){let s=super.on(t,r);if(t==="data")this[sc]=!1,this[ry]++,!this[Ua].length&&!this[no]&&this[Uw]();else if(t==="readable"&&this[so]!==0)super.emit("readable");else if(zmt(t)&&this[mg])super.emit(t),this.removeAllListeners(t);else if(t==="error"&&this[gD]){let a=r;this[wA]?ED(()=>a.call(this,this[gD])):a.call(this,this[gD])}return s}removeListener(t,r){return this.off(t,r)}off(t,r){let s=super.off(t,r);return t==="data"&&(this[ry]=this.listeners("data").length,this[ry]===0&&!this[sc]&&!this[Ua].length&&(this[no]=!1)),s}removeAllListeners(t){let r=super.removeAllListeners(t);return(t==="data"||t===void 0)&&(this[ry]=0,!this[sc]&&!this[Ua].length&&(this[no]=!1)),r}get emittedEnd(){return this[mg]}[Ah](){!this[PN]&&!this[mg]&&!this[ns]&&this[io].length===0&&this[fh]&&(this[PN]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[xN]&&this.emit("close"),this[PN]=!1)}emit(t,...r){let s=r[0];if(t!=="error"&&t!=="close"&&t!==ns&&this[ns])return!1;if(t==="data")return!this[ca]&&!s?!1:this[wA]?(ED(()=>this[uV](s)),!0):this[uV](s);if(t==="end")return this[UBe]();if(t==="close"){if(this[xN]=!0,!this[mg]&&!this[ns])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(t==="error"){this[gD]=s,super.emit(cV,s);let n=!this[yD]||this.listeners("error").length?super.emit("error",s):!1;return this[Ah](),n}else if(t==="resume"){let n=super.emit("resume");return this[Ah](),n}else if(t==="finish"||t==="prefinish"){let n=super.emit(t);return this.removeAllListeners(t),n}let a=super.emit(t,...r);return this[Ah](),a}[uV](t){for(let s of this[Ua])s.dest.write(t)===!1&&this.pause();let r=this[sc]?!1:super.emit("data",t);return this[Ah](),r}[UBe](){return this[mg]?!1:(this[mg]=!0,this.readable=!1,this[wA]?(ED(()=>this[fV]()),!0):this[fV]())}[fV](){if(this[Mw]){let r=this[Mw].end();if(r){for(let s of this[Ua])s.dest.write(r);this[sc]||super.emit("data",r)}}for(let r of this[Ua])r.end();let t=super.emit("end");return this.removeAllListeners("end"),t}async collect(){let t=Object.assign([],{dataLength:0});this[ca]||(t.dataLength=0);let r=this.promise();return this.on("data",s=>{t.push(s),this[ca]||(t.dataLength+=s.length)}),await r,t}async concat(){if(this[ca])throw new Error("cannot concat in objectMode");let t=await this.collect();return this[pf]?t.join(""):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,r)=>{this.on(ns,()=>r(new Error("stream destroyed"))),this.on("error",s=>r(s)),this.on("end",()=>t())})}[Symbol.asyncIterator](){this[sc]=!1;let t=!1,r=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return r();let a=this.read();if(a!==null)return Promise.resolve({done:!1,value:a});if(this[fh])return r();let n,c,f=C=>{this.off("data",p),this.off("end",h),this.off(ns,E),r(),c(C)},p=C=>{this.off("error",f),this.off("end",h),this.off(ns,E),this.pause(),n({value:C,done:!!this[fh]})},h=()=>{this.off("error",f),this.off("data",p),this.off(ns,E),r(),n({done:!0,value:void 0})},E=()=>f(new Error("stream destroyed"));return new Promise((C,S)=>{c=S,n=C,this.once(ns,E),this.once("error",f),this.once("end",h),this.once("data",p)})},throw:r,return:r,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[sc]=!1;let t=!1,r=()=>(this.pause(),this.off(cV,r),this.off(ns,r),this.off("end",r),t=!0,{done:!0,value:void 0}),s=()=>{if(t)return r();let a=this.read();return a===null?r():{done:!1,value:a}};return this.once("end",r),this.once(cV,r),this.once(ns,r),{next:s,throw:r,return:r,[Symbol.iterator](){return this}}}destroy(t){if(this[ns])return t?this.emit("error",t):this.emit(ns),this;this[ns]=!0,this[sc]=!0,this[io].length=0,this[so]=0;let r=this;return typeof r.close=="function"&&!this[xN]&&r.close(),t?this.emit("error",t):this.emit(ns),this}static get isStream(){return Ha.isStream}};Ha.Minipass=FN});var qBe=G((wer,BA)=>{"use strict";var CD=Ce("crypto"),{Minipass:tyt}=HBe(),gV=["sha512","sha384","sha256"],yV=["sha512"],ryt=/^[a-z0-9+/]+(?:=?=?)$/i,nyt=/^([a-z0-9]+)-([^?]+)([?\S*]*)$/,iyt=/^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/,syt=/^[\x21-\x7E]+$/,wD=e=>e?.length?`?${e.join("?")}`:"",mV=class extends tyt{#e;#t;#s;constructor(t){super(),this.size=0,this.opts=t,this.#r(),t?.algorithms?this.algorithms=[...t.algorithms]:this.algorithms=[...yV],this.algorithm!==null&&!this.algorithms.includes(this.algorithm)&&this.algorithms.push(this.algorithm),this.hashes=this.algorithms.map(CD.createHash)}#r(){this.sri=this.opts?.integrity?oc(this.opts?.integrity,this.opts):null,this.expectedSize=this.opts?.size,this.sri?this.sri.isHash?(this.goodSri=!0,this.algorithm=this.sri.algorithm):(this.goodSri=!this.sri.isEmpty(),this.algorithm=this.sri.pickAlgorithm(this.opts)):this.algorithm=null,this.digests=this.goodSri?this.sri[this.algorithm]:null,this.optString=wD(this.opts?.options)}on(t,r){return t==="size"&&this.#t?r(this.#t):t==="integrity"&&this.#e?r(this.#e):t==="verified"&&this.#s?r(this.#s):super.on(t,r)}emit(t,r){return t==="end"&&this.#i(),super.emit(t,r)}write(t){return this.size+=t.length,this.hashes.forEach(r=>r.update(t)),super.write(t)}#i(){this.goodSri||this.#r();let t=oc(this.hashes.map((s,a)=>`${this.algorithms[a]}-${s.digest("base64")}${this.optString}`).join(" "),this.opts),r=this.goodSri&&t.match(this.sri,this.opts);if(typeof this.expectedSize=="number"&&this.size!==this.expectedSize){let s=new Error(`stream size mismatch when checking ${this.sri}. + Wanted: ${this.expectedSize} + Found: ${this.size}`);s.code="EBADSIZE",s.found=this.size,s.expected=this.expectedSize,s.sri=this.sri,this.emit("error",s)}else if(this.sri&&!r){let s=new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${t}. (${this.size} bytes)`);s.code="EINTEGRITY",s.found=t,s.expected=this.digests,s.algorithm=this.algorithm,s.sri=this.sri,this.emit("error",s)}else this.#t=this.size,this.emit("size",this.size),this.#e=t,this.emit("integrity",t),r&&(this.#s=r,this.emit("verified",r))}},ph=class{get isHash(){return!0}constructor(t,r){let s=r?.strict;this.source=t.trim(),this.digest="",this.algorithm="",this.options=[];let a=this.source.match(s?iyt:nyt);if(!a||s&&!gV.includes(a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];n&&(this.options=n.slice(1).split("?"))}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}match(t,r){let s=oc(t,r);if(!s)return!1;if(s.isIntegrity){let a=s.pickAlgorithm(r,[this.algorithm]);if(!a)return!1;let n=s[a].find(c=>c.digest===this.digest);return n||!1}return s.digest===this.digest?s:!1}toString(t){return t?.strict&&!(gV.includes(this.algorithm)&&this.digest.match(ryt)&&this.options.every(r=>r.match(syt)))?"":`${this.algorithm}-${this.digest}${wD(this.options)}`}};function jBe(e,t,r,s){let a=e!=="",n=!1,c="",f=s.length-1;for(let h=0;hs[a].find(c=>n.digest===c.digest)))throw new Error("hashes do not match, cannot update integrity")}else this[a]=s[a]}match(t,r){let s=oc(t,r);if(!s)return!1;let a=s.pickAlgorithm(r,Object.keys(this));return!!a&&this[a]&&s[a]&&this[a].find(n=>s[a].find(c=>n.digest===c.digest))||!1}pickAlgorithm(t,r){let s=t?.pickAlgorithm||pyt,a=Object.keys(this).filter(n=>r?.length?r.includes(n):!0);return a.length?a.reduce((n,c)=>s(n,c)||n):null}};BA.exports.parse=oc;function oc(e,t){if(!e)return null;if(typeof e=="string")return dV(e,t);if(e.algorithm&&e.digest){let r=new ny;return r[e.algorithm]=[e],dV(ID(r,t),t)}else return dV(ID(e,t),t)}function dV(e,t){if(t?.single)return new ph(e,t);let r=e.trim().split(/\s+/).reduce((s,a)=>{let n=new ph(a,t);if(n.algorithm&&n.digest){let c=n.algorithm;s[c]||(s[c]=[]),s[c].push(n)}return s},new ny);return r.isEmpty()?null:r}BA.exports.stringify=ID;function ID(e,t){return e.algorithm&&e.digest?ph.prototype.toString.call(e,t):typeof e=="string"?ID(oc(e,t),t):ny.prototype.toString.call(e,t)}BA.exports.fromHex=oyt;function oyt(e,t,r){let s=wD(r?.options);return oc(`${t}-${Buffer.from(e,"hex").toString("base64")}${s}`,r)}BA.exports.fromData=ayt;function ayt(e,t){let r=t?.algorithms||[...yV],s=wD(t?.options);return r.reduce((a,n)=>{let c=CD.createHash(n).update(e).digest("base64"),f=new ph(`${n}-${c}${s}`,t);if(f.algorithm&&f.digest){let p=f.algorithm;a[p]||(a[p]=[]),a[p].push(f)}return a},new ny)}BA.exports.fromStream=lyt;function lyt(e,t){let r=EV(t);return new Promise((s,a)=>{e.pipe(r),e.on("error",a),r.on("error",a);let n;r.on("integrity",c=>{n=c}),r.on("end",()=>s(n)),r.resume()})}BA.exports.checkData=cyt;function cyt(e,t,r){if(t=oc(t,r),!t||!Object.keys(t).length){if(r?.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let s=t.pickAlgorithm(r),a=CD.createHash(s).update(e).digest("base64"),n=oc({algorithm:s,digest:a}),c=n.match(t,r);if(r=r||{},c||!r.error)return c;if(typeof r.size=="number"&&e.length!==r.size){let f=new Error(`data size mismatch when checking ${t}. + Wanted: ${r.size} + Found: ${e.length}`);throw f.code="EBADSIZE",f.found=e.length,f.expected=r.size,f.sri=t,f}else{let f=new Error(`Integrity checksum failed when using ${s}: Wanted ${t}, but got ${n}. (${e.length} bytes)`);throw f.code="EINTEGRITY",f.found=n,f.expected=t,f.algorithm=s,f.sri=t,f}}BA.exports.checkStream=uyt;function uyt(e,t,r){if(r=r||Object.create(null),r.integrity=t,t=oc(t,r),!t||!Object.keys(t).length)return Promise.reject(Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"}));let s=EV(r);return new Promise((a,n)=>{e.pipe(s),e.on("error",n),s.on("error",n);let c;s.on("verified",f=>{c=f}),s.on("end",()=>a(c)),s.resume()})}BA.exports.integrityStream=EV;function EV(e=Object.create(null)){return new mV(e)}BA.exports.create=fyt;function fyt(e){let t=e?.algorithms||[...yV],r=wD(e?.options),s=t.map(CD.createHash);return{update:function(a,n){return s.forEach(c=>c.update(a,n)),this},digest:function(){return t.reduce((n,c)=>{let f=s.shift().digest("base64"),p=new ph(`${c}-${f}${r}`,e);if(p.algorithm&&p.digest){let h=p.algorithm;n[h]||(n[h]=[]),n[h].push(p)}return n},new ny)}}}var Ayt=CD.getHashes(),GBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(e=>Ayt.includes(e));function pyt(e,t){return GBe.indexOf(e.toLowerCase())>=GBe.indexOf(t.toLowerCase())?e:t}});var IV=G(yg=>{"use strict";Object.defineProperty(yg,"__esModule",{value:!0});yg.Signature=yg.Envelope=void 0;yg.Envelope={fromJSON(e){return{payload:NN(e.payload)?Buffer.from(YBe(e.payload)):Buffer.alloc(0),payloadType:NN(e.payloadType)?globalThis.String(e.payloadType):"",signatures:globalThis.Array.isArray(e?.signatures)?e.signatures.map(t=>yg.Signature.fromJSON(t)):[]}},toJSON(e){let t={};return e.payload.length!==0&&(t.payload=WBe(e.payload)),e.payloadType!==""&&(t.payloadType=e.payloadType),e.signatures?.length&&(t.signatures=e.signatures.map(r=>yg.Signature.toJSON(r))),t}};yg.Signature={fromJSON(e){return{sig:NN(e.sig)?Buffer.from(YBe(e.sig)):Buffer.alloc(0),keyid:NN(e.keyid)?globalThis.String(e.keyid):""}},toJSON(e){let t={};return e.sig.length!==0&&(t.sig=WBe(e.sig)),e.keyid!==""&&(t.keyid=e.keyid),t}};function YBe(e){return Uint8Array.from(globalThis.Buffer.from(e,"base64"))}function WBe(e){return globalThis.Buffer.from(e).toString("base64")}function NN(e){return e!=null}});var KBe=G(ON=>{"use strict";Object.defineProperty(ON,"__esModule",{value:!0});ON.Timestamp=void 0;ON.Timestamp={fromJSON(e){return{seconds:VBe(e.seconds)?globalThis.String(e.seconds):"0",nanos:VBe(e.nanos)?globalThis.Number(e.nanos):0}},toJSON(e){let t={};return e.seconds!=="0"&&(t.seconds=e.seconds),e.nanos!==0&&(t.nanos=Math.round(e.nanos)),t}};function VBe(e){return e!=null}});var _w=G(_r=>{"use strict";Object.defineProperty(_r,"__esModule",{value:!0});_r.TimeRange=_r.X509CertificateChain=_r.SubjectAlternativeName=_r.X509Certificate=_r.DistinguishedName=_r.ObjectIdentifierValuePair=_r.ObjectIdentifier=_r.PublicKeyIdentifier=_r.PublicKey=_r.RFC3161SignedTimestamp=_r.LogId=_r.MessageSignature=_r.HashOutput=_r.SubjectAlternativeNameType=_r.PublicKeyDetails=_r.HashAlgorithm=void 0;_r.hashAlgorithmFromJSON=zBe;_r.hashAlgorithmToJSON=ZBe;_r.publicKeyDetailsFromJSON=XBe;_r.publicKeyDetailsToJSON=$Be;_r.subjectAlternativeNameTypeFromJSON=eve;_r.subjectAlternativeNameTypeToJSON=tve;var hyt=KBe(),bl;(function(e){e[e.HASH_ALGORITHM_UNSPECIFIED=0]="HASH_ALGORITHM_UNSPECIFIED",e[e.SHA2_256=1]="SHA2_256",e[e.SHA2_384=2]="SHA2_384",e[e.SHA2_512=3]="SHA2_512",e[e.SHA3_256=4]="SHA3_256",e[e.SHA3_384=5]="SHA3_384"})(bl||(_r.HashAlgorithm=bl={}));function zBe(e){switch(e){case 0:case"HASH_ALGORITHM_UNSPECIFIED":return bl.HASH_ALGORITHM_UNSPECIFIED;case 1:case"SHA2_256":return bl.SHA2_256;case 2:case"SHA2_384":return bl.SHA2_384;case 3:case"SHA2_512":return bl.SHA2_512;case 4:case"SHA3_256":return bl.SHA3_256;case 5:case"SHA3_384":return bl.SHA3_384;default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum HashAlgorithm")}}function ZBe(e){switch(e){case bl.HASH_ALGORITHM_UNSPECIFIED:return"HASH_ALGORITHM_UNSPECIFIED";case bl.SHA2_256:return"SHA2_256";case bl.SHA2_384:return"SHA2_384";case bl.SHA2_512:return"SHA2_512";case bl.SHA3_256:return"SHA3_256";case bl.SHA3_384:return"SHA3_384";default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum HashAlgorithm")}}var sn;(function(e){e[e.PUBLIC_KEY_DETAILS_UNSPECIFIED=0]="PUBLIC_KEY_DETAILS_UNSPECIFIED",e[e.PKCS1_RSA_PKCS1V5=1]="PKCS1_RSA_PKCS1V5",e[e.PKCS1_RSA_PSS=2]="PKCS1_RSA_PSS",e[e.PKIX_RSA_PKCS1V5=3]="PKIX_RSA_PKCS1V5",e[e.PKIX_RSA_PSS=4]="PKIX_RSA_PSS",e[e.PKIX_RSA_PKCS1V15_2048_SHA256=9]="PKIX_RSA_PKCS1V15_2048_SHA256",e[e.PKIX_RSA_PKCS1V15_3072_SHA256=10]="PKIX_RSA_PKCS1V15_3072_SHA256",e[e.PKIX_RSA_PKCS1V15_4096_SHA256=11]="PKIX_RSA_PKCS1V15_4096_SHA256",e[e.PKIX_RSA_PSS_2048_SHA256=16]="PKIX_RSA_PSS_2048_SHA256",e[e.PKIX_RSA_PSS_3072_SHA256=17]="PKIX_RSA_PSS_3072_SHA256",e[e.PKIX_RSA_PSS_4096_SHA256=18]="PKIX_RSA_PSS_4096_SHA256",e[e.PKIX_ECDSA_P256_HMAC_SHA_256=6]="PKIX_ECDSA_P256_HMAC_SHA_256",e[e.PKIX_ECDSA_P256_SHA_256=5]="PKIX_ECDSA_P256_SHA_256",e[e.PKIX_ECDSA_P384_SHA_384=12]="PKIX_ECDSA_P384_SHA_384",e[e.PKIX_ECDSA_P521_SHA_512=13]="PKIX_ECDSA_P521_SHA_512",e[e.PKIX_ED25519=7]="PKIX_ED25519",e[e.PKIX_ED25519_PH=8]="PKIX_ED25519_PH",e[e.LMS_SHA256=14]="LMS_SHA256",e[e.LMOTS_SHA256=15]="LMOTS_SHA256"})(sn||(_r.PublicKeyDetails=sn={}));function XBe(e){switch(e){case 0:case"PUBLIC_KEY_DETAILS_UNSPECIFIED":return sn.PUBLIC_KEY_DETAILS_UNSPECIFIED;case 1:case"PKCS1_RSA_PKCS1V5":return sn.PKCS1_RSA_PKCS1V5;case 2:case"PKCS1_RSA_PSS":return sn.PKCS1_RSA_PSS;case 3:case"PKIX_RSA_PKCS1V5":return sn.PKIX_RSA_PKCS1V5;case 4:case"PKIX_RSA_PSS":return sn.PKIX_RSA_PSS;case 9:case"PKIX_RSA_PKCS1V15_2048_SHA256":return sn.PKIX_RSA_PKCS1V15_2048_SHA256;case 10:case"PKIX_RSA_PKCS1V15_3072_SHA256":return sn.PKIX_RSA_PKCS1V15_3072_SHA256;case 11:case"PKIX_RSA_PKCS1V15_4096_SHA256":return sn.PKIX_RSA_PKCS1V15_4096_SHA256;case 16:case"PKIX_RSA_PSS_2048_SHA256":return sn.PKIX_RSA_PSS_2048_SHA256;case 17:case"PKIX_RSA_PSS_3072_SHA256":return sn.PKIX_RSA_PSS_3072_SHA256;case 18:case"PKIX_RSA_PSS_4096_SHA256":return sn.PKIX_RSA_PSS_4096_SHA256;case 6:case"PKIX_ECDSA_P256_HMAC_SHA_256":return sn.PKIX_ECDSA_P256_HMAC_SHA_256;case 5:case"PKIX_ECDSA_P256_SHA_256":return sn.PKIX_ECDSA_P256_SHA_256;case 12:case"PKIX_ECDSA_P384_SHA_384":return sn.PKIX_ECDSA_P384_SHA_384;case 13:case"PKIX_ECDSA_P521_SHA_512":return sn.PKIX_ECDSA_P521_SHA_512;case 7:case"PKIX_ED25519":return sn.PKIX_ED25519;case 8:case"PKIX_ED25519_PH":return sn.PKIX_ED25519_PH;case 14:case"LMS_SHA256":return sn.LMS_SHA256;case 15:case"LMOTS_SHA256":return sn.LMOTS_SHA256;default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum PublicKeyDetails")}}function $Be(e){switch(e){case sn.PUBLIC_KEY_DETAILS_UNSPECIFIED:return"PUBLIC_KEY_DETAILS_UNSPECIFIED";case sn.PKCS1_RSA_PKCS1V5:return"PKCS1_RSA_PKCS1V5";case sn.PKCS1_RSA_PSS:return"PKCS1_RSA_PSS";case sn.PKIX_RSA_PKCS1V5:return"PKIX_RSA_PKCS1V5";case sn.PKIX_RSA_PSS:return"PKIX_RSA_PSS";case sn.PKIX_RSA_PKCS1V15_2048_SHA256:return"PKIX_RSA_PKCS1V15_2048_SHA256";case sn.PKIX_RSA_PKCS1V15_3072_SHA256:return"PKIX_RSA_PKCS1V15_3072_SHA256";case sn.PKIX_RSA_PKCS1V15_4096_SHA256:return"PKIX_RSA_PKCS1V15_4096_SHA256";case sn.PKIX_RSA_PSS_2048_SHA256:return"PKIX_RSA_PSS_2048_SHA256";case sn.PKIX_RSA_PSS_3072_SHA256:return"PKIX_RSA_PSS_3072_SHA256";case sn.PKIX_RSA_PSS_4096_SHA256:return"PKIX_RSA_PSS_4096_SHA256";case sn.PKIX_ECDSA_P256_HMAC_SHA_256:return"PKIX_ECDSA_P256_HMAC_SHA_256";case sn.PKIX_ECDSA_P256_SHA_256:return"PKIX_ECDSA_P256_SHA_256";case sn.PKIX_ECDSA_P384_SHA_384:return"PKIX_ECDSA_P384_SHA_384";case sn.PKIX_ECDSA_P521_SHA_512:return"PKIX_ECDSA_P521_SHA_512";case sn.PKIX_ED25519:return"PKIX_ED25519";case sn.PKIX_ED25519_PH:return"PKIX_ED25519_PH";case sn.LMS_SHA256:return"LMS_SHA256";case sn.LMOTS_SHA256:return"LMOTS_SHA256";default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum PublicKeyDetails")}}var vA;(function(e){e[e.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED=0]="SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED",e[e.EMAIL=1]="EMAIL",e[e.URI=2]="URI",e[e.OTHER_NAME=3]="OTHER_NAME"})(vA||(_r.SubjectAlternativeNameType=vA={}));function eve(e){switch(e){case 0:case"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED":return vA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED;case 1:case"EMAIL":return vA.EMAIL;case 2:case"URI":return vA.URI;case 3:case"OTHER_NAME":return vA.OTHER_NAME;default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum SubjectAlternativeNameType")}}function tve(e){switch(e){case vA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED:return"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED";case vA.EMAIL:return"EMAIL";case vA.URI:return"URI";case vA.OTHER_NAME:return"OTHER_NAME";default:throw new globalThis.Error("Unrecognized enum value "+e+" for enum SubjectAlternativeNameType")}}_r.HashOutput={fromJSON(e){return{algorithm:Is(e.algorithm)?zBe(e.algorithm):0,digest:Is(e.digest)?Buffer.from(iy(e.digest)):Buffer.alloc(0)}},toJSON(e){let t={};return e.algorithm!==0&&(t.algorithm=ZBe(e.algorithm)),e.digest.length!==0&&(t.digest=sy(e.digest)),t}};_r.MessageSignature={fromJSON(e){return{messageDigest:Is(e.messageDigest)?_r.HashOutput.fromJSON(e.messageDigest):void 0,signature:Is(e.signature)?Buffer.from(iy(e.signature)):Buffer.alloc(0)}},toJSON(e){let t={};return e.messageDigest!==void 0&&(t.messageDigest=_r.HashOutput.toJSON(e.messageDigest)),e.signature.length!==0&&(t.signature=sy(e.signature)),t}};_r.LogId={fromJSON(e){return{keyId:Is(e.keyId)?Buffer.from(iy(e.keyId)):Buffer.alloc(0)}},toJSON(e){let t={};return e.keyId.length!==0&&(t.keyId=sy(e.keyId)),t}};_r.RFC3161SignedTimestamp={fromJSON(e){return{signedTimestamp:Is(e.signedTimestamp)?Buffer.from(iy(e.signedTimestamp)):Buffer.alloc(0)}},toJSON(e){let t={};return e.signedTimestamp.length!==0&&(t.signedTimestamp=sy(e.signedTimestamp)),t}};_r.PublicKey={fromJSON(e){return{rawBytes:Is(e.rawBytes)?Buffer.from(iy(e.rawBytes)):void 0,keyDetails:Is(e.keyDetails)?XBe(e.keyDetails):0,validFor:Is(e.validFor)?_r.TimeRange.fromJSON(e.validFor):void 0}},toJSON(e){let t={};return e.rawBytes!==void 0&&(t.rawBytes=sy(e.rawBytes)),e.keyDetails!==0&&(t.keyDetails=$Be(e.keyDetails)),e.validFor!==void 0&&(t.validFor=_r.TimeRange.toJSON(e.validFor)),t}};_r.PublicKeyIdentifier={fromJSON(e){return{hint:Is(e.hint)?globalThis.String(e.hint):""}},toJSON(e){let t={};return e.hint!==""&&(t.hint=e.hint),t}};_r.ObjectIdentifier={fromJSON(e){return{id:globalThis.Array.isArray(e?.id)?e.id.map(t=>globalThis.Number(t)):[]}},toJSON(e){let t={};return e.id?.length&&(t.id=e.id.map(r=>Math.round(r))),t}};_r.ObjectIdentifierValuePair={fromJSON(e){return{oid:Is(e.oid)?_r.ObjectIdentifier.fromJSON(e.oid):void 0,value:Is(e.value)?Buffer.from(iy(e.value)):Buffer.alloc(0)}},toJSON(e){let t={};return e.oid!==void 0&&(t.oid=_r.ObjectIdentifier.toJSON(e.oid)),e.value.length!==0&&(t.value=sy(e.value)),t}};_r.DistinguishedName={fromJSON(e){return{organization:Is(e.organization)?globalThis.String(e.organization):"",commonName:Is(e.commonName)?globalThis.String(e.commonName):""}},toJSON(e){let t={};return e.organization!==""&&(t.organization=e.organization),e.commonName!==""&&(t.commonName=e.commonName),t}};_r.X509Certificate={fromJSON(e){return{rawBytes:Is(e.rawBytes)?Buffer.from(iy(e.rawBytes)):Buffer.alloc(0)}},toJSON(e){let t={};return e.rawBytes.length!==0&&(t.rawBytes=sy(e.rawBytes)),t}};_r.SubjectAlternativeName={fromJSON(e){return{type:Is(e.type)?eve(e.type):0,identity:Is(e.regexp)?{$case:"regexp",regexp:globalThis.String(e.regexp)}:Is(e.value)?{$case:"value",value:globalThis.String(e.value)}:void 0}},toJSON(e){let t={};return e.type!==0&&(t.type=tve(e.type)),e.identity?.$case==="regexp"?t.regexp=e.identity.regexp:e.identity?.$case==="value"&&(t.value=e.identity.value),t}};_r.X509CertificateChain={fromJSON(e){return{certificates:globalThis.Array.isArray(e?.certificates)?e.certificates.map(t=>_r.X509Certificate.fromJSON(t)):[]}},toJSON(e){let t={};return e.certificates?.length&&(t.certificates=e.certificates.map(r=>_r.X509Certificate.toJSON(r))),t}};_r.TimeRange={fromJSON(e){return{start:Is(e.start)?JBe(e.start):void 0,end:Is(e.end)?JBe(e.end):void 0}},toJSON(e){let t={};return e.start!==void 0&&(t.start=e.start.toISOString()),e.end!==void 0&&(t.end=e.end.toISOString()),t}};function iy(e){return Uint8Array.from(globalThis.Buffer.from(e,"base64"))}function sy(e){return globalThis.Buffer.from(e).toString("base64")}function dyt(e){let t=(globalThis.Number(e.seconds)||0)*1e3;return t+=(e.nanos||0)/1e6,new globalThis.Date(t)}function JBe(e){return e instanceof globalThis.Date?e:typeof e=="string"?new globalThis.Date(e):dyt(hyt.Timestamp.fromJSON(e))}function Is(e){return e!=null}});var CV=G(Cs=>{"use strict";Object.defineProperty(Cs,"__esModule",{value:!0});Cs.TransparencyLogEntry=Cs.InclusionPromise=Cs.InclusionProof=Cs.Checkpoint=Cs.KindVersion=void 0;var rve=_w();Cs.KindVersion={fromJSON(e){return{kind:ja(e.kind)?globalThis.String(e.kind):"",version:ja(e.version)?globalThis.String(e.version):""}},toJSON(e){let t={};return e.kind!==""&&(t.kind=e.kind),e.version!==""&&(t.version=e.version),t}};Cs.Checkpoint={fromJSON(e){return{envelope:ja(e.envelope)?globalThis.String(e.envelope):""}},toJSON(e){let t={};return e.envelope!==""&&(t.envelope=e.envelope),t}};Cs.InclusionProof={fromJSON(e){return{logIndex:ja(e.logIndex)?globalThis.String(e.logIndex):"0",rootHash:ja(e.rootHash)?Buffer.from(LN(e.rootHash)):Buffer.alloc(0),treeSize:ja(e.treeSize)?globalThis.String(e.treeSize):"0",hashes:globalThis.Array.isArray(e?.hashes)?e.hashes.map(t=>Buffer.from(LN(t))):[],checkpoint:ja(e.checkpoint)?Cs.Checkpoint.fromJSON(e.checkpoint):void 0}},toJSON(e){let t={};return e.logIndex!=="0"&&(t.logIndex=e.logIndex),e.rootHash.length!==0&&(t.rootHash=MN(e.rootHash)),e.treeSize!=="0"&&(t.treeSize=e.treeSize),e.hashes?.length&&(t.hashes=e.hashes.map(r=>MN(r))),e.checkpoint!==void 0&&(t.checkpoint=Cs.Checkpoint.toJSON(e.checkpoint)),t}};Cs.InclusionPromise={fromJSON(e){return{signedEntryTimestamp:ja(e.signedEntryTimestamp)?Buffer.from(LN(e.signedEntryTimestamp)):Buffer.alloc(0)}},toJSON(e){let t={};return e.signedEntryTimestamp.length!==0&&(t.signedEntryTimestamp=MN(e.signedEntryTimestamp)),t}};Cs.TransparencyLogEntry={fromJSON(e){return{logIndex:ja(e.logIndex)?globalThis.String(e.logIndex):"0",logId:ja(e.logId)?rve.LogId.fromJSON(e.logId):void 0,kindVersion:ja(e.kindVersion)?Cs.KindVersion.fromJSON(e.kindVersion):void 0,integratedTime:ja(e.integratedTime)?globalThis.String(e.integratedTime):"0",inclusionPromise:ja(e.inclusionPromise)?Cs.InclusionPromise.fromJSON(e.inclusionPromise):void 0,inclusionProof:ja(e.inclusionProof)?Cs.InclusionProof.fromJSON(e.inclusionProof):void 0,canonicalizedBody:ja(e.canonicalizedBody)?Buffer.from(LN(e.canonicalizedBody)):Buffer.alloc(0)}},toJSON(e){let t={};return e.logIndex!=="0"&&(t.logIndex=e.logIndex),e.logId!==void 0&&(t.logId=rve.LogId.toJSON(e.logId)),e.kindVersion!==void 0&&(t.kindVersion=Cs.KindVersion.toJSON(e.kindVersion)),e.integratedTime!=="0"&&(t.integratedTime=e.integratedTime),e.inclusionPromise!==void 0&&(t.inclusionPromise=Cs.InclusionPromise.toJSON(e.inclusionPromise)),e.inclusionProof!==void 0&&(t.inclusionProof=Cs.InclusionProof.toJSON(e.inclusionProof)),e.canonicalizedBody.length!==0&&(t.canonicalizedBody=MN(e.canonicalizedBody)),t}};function LN(e){return Uint8Array.from(globalThis.Buffer.from(e,"base64"))}function MN(e){return globalThis.Buffer.from(e).toString("base64")}function ja(e){return e!=null}});var wV=G(Zc=>{"use strict";Object.defineProperty(Zc,"__esModule",{value:!0});Zc.Bundle=Zc.VerificationMaterial=Zc.TimestampVerificationData=void 0;var nve=IV(),SA=_w(),ive=CV();Zc.TimestampVerificationData={fromJSON(e){return{rfc3161Timestamps:globalThis.Array.isArray(e?.rfc3161Timestamps)?e.rfc3161Timestamps.map(t=>SA.RFC3161SignedTimestamp.fromJSON(t)):[]}},toJSON(e){let t={};return e.rfc3161Timestamps?.length&&(t.rfc3161Timestamps=e.rfc3161Timestamps.map(r=>SA.RFC3161SignedTimestamp.toJSON(r))),t}};Zc.VerificationMaterial={fromJSON(e){return{content:Eg(e.publicKey)?{$case:"publicKey",publicKey:SA.PublicKeyIdentifier.fromJSON(e.publicKey)}:Eg(e.x509CertificateChain)?{$case:"x509CertificateChain",x509CertificateChain:SA.X509CertificateChain.fromJSON(e.x509CertificateChain)}:Eg(e.certificate)?{$case:"certificate",certificate:SA.X509Certificate.fromJSON(e.certificate)}:void 0,tlogEntries:globalThis.Array.isArray(e?.tlogEntries)?e.tlogEntries.map(t=>ive.TransparencyLogEntry.fromJSON(t)):[],timestampVerificationData:Eg(e.timestampVerificationData)?Zc.TimestampVerificationData.fromJSON(e.timestampVerificationData):void 0}},toJSON(e){let t={};return e.content?.$case==="publicKey"?t.publicKey=SA.PublicKeyIdentifier.toJSON(e.content.publicKey):e.content?.$case==="x509CertificateChain"?t.x509CertificateChain=SA.X509CertificateChain.toJSON(e.content.x509CertificateChain):e.content?.$case==="certificate"&&(t.certificate=SA.X509Certificate.toJSON(e.content.certificate)),e.tlogEntries?.length&&(t.tlogEntries=e.tlogEntries.map(r=>ive.TransparencyLogEntry.toJSON(r))),e.timestampVerificationData!==void 0&&(t.timestampVerificationData=Zc.TimestampVerificationData.toJSON(e.timestampVerificationData)),t}};Zc.Bundle={fromJSON(e){return{mediaType:Eg(e.mediaType)?globalThis.String(e.mediaType):"",verificationMaterial:Eg(e.verificationMaterial)?Zc.VerificationMaterial.fromJSON(e.verificationMaterial):void 0,content:Eg(e.messageSignature)?{$case:"messageSignature",messageSignature:SA.MessageSignature.fromJSON(e.messageSignature)}:Eg(e.dsseEnvelope)?{$case:"dsseEnvelope",dsseEnvelope:nve.Envelope.fromJSON(e.dsseEnvelope)}:void 0}},toJSON(e){let t={};return e.mediaType!==""&&(t.mediaType=e.mediaType),e.verificationMaterial!==void 0&&(t.verificationMaterial=Zc.VerificationMaterial.toJSON(e.verificationMaterial)),e.content?.$case==="messageSignature"?t.messageSignature=SA.MessageSignature.toJSON(e.content.messageSignature):e.content?.$case==="dsseEnvelope"&&(t.dsseEnvelope=nve.Envelope.toJSON(e.content.dsseEnvelope)),t}};function Eg(e){return e!=null}});var BV=G(Ri=>{"use strict";Object.defineProperty(Ri,"__esModule",{value:!0});Ri.ClientTrustConfig=Ri.SigningConfig=Ri.TrustedRoot=Ri.CertificateAuthority=Ri.TransparencyLogInstance=void 0;var Dl=_w();Ri.TransparencyLogInstance={fromJSON(e){return{baseUrl:ua(e.baseUrl)?globalThis.String(e.baseUrl):"",hashAlgorithm:ua(e.hashAlgorithm)?(0,Dl.hashAlgorithmFromJSON)(e.hashAlgorithm):0,publicKey:ua(e.publicKey)?Dl.PublicKey.fromJSON(e.publicKey):void 0,logId:ua(e.logId)?Dl.LogId.fromJSON(e.logId):void 0,checkpointKeyId:ua(e.checkpointKeyId)?Dl.LogId.fromJSON(e.checkpointKeyId):void 0}},toJSON(e){let t={};return e.baseUrl!==""&&(t.baseUrl=e.baseUrl),e.hashAlgorithm!==0&&(t.hashAlgorithm=(0,Dl.hashAlgorithmToJSON)(e.hashAlgorithm)),e.publicKey!==void 0&&(t.publicKey=Dl.PublicKey.toJSON(e.publicKey)),e.logId!==void 0&&(t.logId=Dl.LogId.toJSON(e.logId)),e.checkpointKeyId!==void 0&&(t.checkpointKeyId=Dl.LogId.toJSON(e.checkpointKeyId)),t}};Ri.CertificateAuthority={fromJSON(e){return{subject:ua(e.subject)?Dl.DistinguishedName.fromJSON(e.subject):void 0,uri:ua(e.uri)?globalThis.String(e.uri):"",certChain:ua(e.certChain)?Dl.X509CertificateChain.fromJSON(e.certChain):void 0,validFor:ua(e.validFor)?Dl.TimeRange.fromJSON(e.validFor):void 0}},toJSON(e){let t={};return e.subject!==void 0&&(t.subject=Dl.DistinguishedName.toJSON(e.subject)),e.uri!==""&&(t.uri=e.uri),e.certChain!==void 0&&(t.certChain=Dl.X509CertificateChain.toJSON(e.certChain)),e.validFor!==void 0&&(t.validFor=Dl.TimeRange.toJSON(e.validFor)),t}};Ri.TrustedRoot={fromJSON(e){return{mediaType:ua(e.mediaType)?globalThis.String(e.mediaType):"",tlogs:globalThis.Array.isArray(e?.tlogs)?e.tlogs.map(t=>Ri.TransparencyLogInstance.fromJSON(t)):[],certificateAuthorities:globalThis.Array.isArray(e?.certificateAuthorities)?e.certificateAuthorities.map(t=>Ri.CertificateAuthority.fromJSON(t)):[],ctlogs:globalThis.Array.isArray(e?.ctlogs)?e.ctlogs.map(t=>Ri.TransparencyLogInstance.fromJSON(t)):[],timestampAuthorities:globalThis.Array.isArray(e?.timestampAuthorities)?e.timestampAuthorities.map(t=>Ri.CertificateAuthority.fromJSON(t)):[]}},toJSON(e){let t={};return e.mediaType!==""&&(t.mediaType=e.mediaType),e.tlogs?.length&&(t.tlogs=e.tlogs.map(r=>Ri.TransparencyLogInstance.toJSON(r))),e.certificateAuthorities?.length&&(t.certificateAuthorities=e.certificateAuthorities.map(r=>Ri.CertificateAuthority.toJSON(r))),e.ctlogs?.length&&(t.ctlogs=e.ctlogs.map(r=>Ri.TransparencyLogInstance.toJSON(r))),e.timestampAuthorities?.length&&(t.timestampAuthorities=e.timestampAuthorities.map(r=>Ri.CertificateAuthority.toJSON(r))),t}};Ri.SigningConfig={fromJSON(e){return{mediaType:ua(e.mediaType)?globalThis.String(e.mediaType):"",caUrl:ua(e.caUrl)?globalThis.String(e.caUrl):"",oidcUrl:ua(e.oidcUrl)?globalThis.String(e.oidcUrl):"",tlogUrls:globalThis.Array.isArray(e?.tlogUrls)?e.tlogUrls.map(t=>globalThis.String(t)):[],tsaUrls:globalThis.Array.isArray(e?.tsaUrls)?e.tsaUrls.map(t=>globalThis.String(t)):[]}},toJSON(e){let t={};return e.mediaType!==""&&(t.mediaType=e.mediaType),e.caUrl!==""&&(t.caUrl=e.caUrl),e.oidcUrl!==""&&(t.oidcUrl=e.oidcUrl),e.tlogUrls?.length&&(t.tlogUrls=e.tlogUrls),e.tsaUrls?.length&&(t.tsaUrls=e.tsaUrls),t}};Ri.ClientTrustConfig={fromJSON(e){return{mediaType:ua(e.mediaType)?globalThis.String(e.mediaType):"",trustedRoot:ua(e.trustedRoot)?Ri.TrustedRoot.fromJSON(e.trustedRoot):void 0,signingConfig:ua(e.signingConfig)?Ri.SigningConfig.fromJSON(e.signingConfig):void 0}},toJSON(e){let t={};return e.mediaType!==""&&(t.mediaType=e.mediaType),e.trustedRoot!==void 0&&(t.trustedRoot=Ri.TrustedRoot.toJSON(e.trustedRoot)),e.signingConfig!==void 0&&(t.signingConfig=Ri.SigningConfig.toJSON(e.signingConfig)),t}};function ua(e){return e!=null}});var ave=G(Kr=>{"use strict";Object.defineProperty(Kr,"__esModule",{value:!0});Kr.Input=Kr.Artifact=Kr.ArtifactVerificationOptions_ObserverTimestampOptions=Kr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions=Kr.ArtifactVerificationOptions_TimestampAuthorityOptions=Kr.ArtifactVerificationOptions_CtlogOptions=Kr.ArtifactVerificationOptions_TlogOptions=Kr.ArtifactVerificationOptions=Kr.PublicKeyIdentities=Kr.CertificateIdentities=Kr.CertificateIdentity=void 0;var sve=wV(),Ig=_w(),ove=BV();Kr.CertificateIdentity={fromJSON(e){return{issuer:gi(e.issuer)?globalThis.String(e.issuer):"",san:gi(e.san)?Ig.SubjectAlternativeName.fromJSON(e.san):void 0,oids:globalThis.Array.isArray(e?.oids)?e.oids.map(t=>Ig.ObjectIdentifierValuePair.fromJSON(t)):[]}},toJSON(e){let t={};return e.issuer!==""&&(t.issuer=e.issuer),e.san!==void 0&&(t.san=Ig.SubjectAlternativeName.toJSON(e.san)),e.oids?.length&&(t.oids=e.oids.map(r=>Ig.ObjectIdentifierValuePair.toJSON(r))),t}};Kr.CertificateIdentities={fromJSON(e){return{identities:globalThis.Array.isArray(e?.identities)?e.identities.map(t=>Kr.CertificateIdentity.fromJSON(t)):[]}},toJSON(e){let t={};return e.identities?.length&&(t.identities=e.identities.map(r=>Kr.CertificateIdentity.toJSON(r))),t}};Kr.PublicKeyIdentities={fromJSON(e){return{publicKeys:globalThis.Array.isArray(e?.publicKeys)?e.publicKeys.map(t=>Ig.PublicKey.fromJSON(t)):[]}},toJSON(e){let t={};return e.publicKeys?.length&&(t.publicKeys=e.publicKeys.map(r=>Ig.PublicKey.toJSON(r))),t}};Kr.ArtifactVerificationOptions={fromJSON(e){return{signers:gi(e.certificateIdentities)?{$case:"certificateIdentities",certificateIdentities:Kr.CertificateIdentities.fromJSON(e.certificateIdentities)}:gi(e.publicKeys)?{$case:"publicKeys",publicKeys:Kr.PublicKeyIdentities.fromJSON(e.publicKeys)}:void 0,tlogOptions:gi(e.tlogOptions)?Kr.ArtifactVerificationOptions_TlogOptions.fromJSON(e.tlogOptions):void 0,ctlogOptions:gi(e.ctlogOptions)?Kr.ArtifactVerificationOptions_CtlogOptions.fromJSON(e.ctlogOptions):void 0,tsaOptions:gi(e.tsaOptions)?Kr.ArtifactVerificationOptions_TimestampAuthorityOptions.fromJSON(e.tsaOptions):void 0,integratedTsOptions:gi(e.integratedTsOptions)?Kr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.fromJSON(e.integratedTsOptions):void 0,observerOptions:gi(e.observerOptions)?Kr.ArtifactVerificationOptions_ObserverTimestampOptions.fromJSON(e.observerOptions):void 0}},toJSON(e){let t={};return e.signers?.$case==="certificateIdentities"?t.certificateIdentities=Kr.CertificateIdentities.toJSON(e.signers.certificateIdentities):e.signers?.$case==="publicKeys"&&(t.publicKeys=Kr.PublicKeyIdentities.toJSON(e.signers.publicKeys)),e.tlogOptions!==void 0&&(t.tlogOptions=Kr.ArtifactVerificationOptions_TlogOptions.toJSON(e.tlogOptions)),e.ctlogOptions!==void 0&&(t.ctlogOptions=Kr.ArtifactVerificationOptions_CtlogOptions.toJSON(e.ctlogOptions)),e.tsaOptions!==void 0&&(t.tsaOptions=Kr.ArtifactVerificationOptions_TimestampAuthorityOptions.toJSON(e.tsaOptions)),e.integratedTsOptions!==void 0&&(t.integratedTsOptions=Kr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.toJSON(e.integratedTsOptions)),e.observerOptions!==void 0&&(t.observerOptions=Kr.ArtifactVerificationOptions_ObserverTimestampOptions.toJSON(e.observerOptions)),t}};Kr.ArtifactVerificationOptions_TlogOptions={fromJSON(e){return{threshold:gi(e.threshold)?globalThis.Number(e.threshold):0,performOnlineVerification:gi(e.performOnlineVerification)?globalThis.Boolean(e.performOnlineVerification):!1,disable:gi(e.disable)?globalThis.Boolean(e.disable):!1}},toJSON(e){let t={};return e.threshold!==0&&(t.threshold=Math.round(e.threshold)),e.performOnlineVerification!==!1&&(t.performOnlineVerification=e.performOnlineVerification),e.disable!==!1&&(t.disable=e.disable),t}};Kr.ArtifactVerificationOptions_CtlogOptions={fromJSON(e){return{threshold:gi(e.threshold)?globalThis.Number(e.threshold):0,disable:gi(e.disable)?globalThis.Boolean(e.disable):!1}},toJSON(e){let t={};return e.threshold!==0&&(t.threshold=Math.round(e.threshold)),e.disable!==!1&&(t.disable=e.disable),t}};Kr.ArtifactVerificationOptions_TimestampAuthorityOptions={fromJSON(e){return{threshold:gi(e.threshold)?globalThis.Number(e.threshold):0,disable:gi(e.disable)?globalThis.Boolean(e.disable):!1}},toJSON(e){let t={};return e.threshold!==0&&(t.threshold=Math.round(e.threshold)),e.disable!==!1&&(t.disable=e.disable),t}};Kr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions={fromJSON(e){return{threshold:gi(e.threshold)?globalThis.Number(e.threshold):0,disable:gi(e.disable)?globalThis.Boolean(e.disable):!1}},toJSON(e){let t={};return e.threshold!==0&&(t.threshold=Math.round(e.threshold)),e.disable!==!1&&(t.disable=e.disable),t}};Kr.ArtifactVerificationOptions_ObserverTimestampOptions={fromJSON(e){return{threshold:gi(e.threshold)?globalThis.Number(e.threshold):0,disable:gi(e.disable)?globalThis.Boolean(e.disable):!1}},toJSON(e){let t={};return e.threshold!==0&&(t.threshold=Math.round(e.threshold)),e.disable!==!1&&(t.disable=e.disable),t}};Kr.Artifact={fromJSON(e){return{data:gi(e.artifactUri)?{$case:"artifactUri",artifactUri:globalThis.String(e.artifactUri)}:gi(e.artifact)?{$case:"artifact",artifact:Buffer.from(gyt(e.artifact))}:gi(e.artifactDigest)?{$case:"artifactDigest",artifactDigest:Ig.HashOutput.fromJSON(e.artifactDigest)}:void 0}},toJSON(e){let t={};return e.data?.$case==="artifactUri"?t.artifactUri=e.data.artifactUri:e.data?.$case==="artifact"?t.artifact=myt(e.data.artifact):e.data?.$case==="artifactDigest"&&(t.artifactDigest=Ig.HashOutput.toJSON(e.data.artifactDigest)),t}};Kr.Input={fromJSON(e){return{artifactTrustRoot:gi(e.artifactTrustRoot)?ove.TrustedRoot.fromJSON(e.artifactTrustRoot):void 0,artifactVerificationOptions:gi(e.artifactVerificationOptions)?Kr.ArtifactVerificationOptions.fromJSON(e.artifactVerificationOptions):void 0,bundle:gi(e.bundle)?sve.Bundle.fromJSON(e.bundle):void 0,artifact:gi(e.artifact)?Kr.Artifact.fromJSON(e.artifact):void 0}},toJSON(e){let t={};return e.artifactTrustRoot!==void 0&&(t.artifactTrustRoot=ove.TrustedRoot.toJSON(e.artifactTrustRoot)),e.artifactVerificationOptions!==void 0&&(t.artifactVerificationOptions=Kr.ArtifactVerificationOptions.toJSON(e.artifactVerificationOptions)),e.bundle!==void 0&&(t.bundle=sve.Bundle.toJSON(e.bundle)),e.artifact!==void 0&&(t.artifact=Kr.Artifact.toJSON(e.artifact)),t}};function gyt(e){return Uint8Array.from(globalThis.Buffer.from(e,"base64"))}function myt(e){return globalThis.Buffer.from(e).toString("base64")}function gi(e){return e!=null}});var BD=G(Xc=>{"use strict";var yyt=Xc&&Xc.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),Hw=Xc&&Xc.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&yyt(t,e,r)};Object.defineProperty(Xc,"__esModule",{value:!0});Hw(IV(),Xc);Hw(wV(),Xc);Hw(_w(),Xc);Hw(CV(),Xc);Hw(BV(),Xc);Hw(ave(),Xc)});var UN=G(Pl=>{"use strict";Object.defineProperty(Pl,"__esModule",{value:!0});Pl.BUNDLE_V03_MEDIA_TYPE=Pl.BUNDLE_V03_LEGACY_MEDIA_TYPE=Pl.BUNDLE_V02_MEDIA_TYPE=Pl.BUNDLE_V01_MEDIA_TYPE=void 0;Pl.isBundleWithCertificateChain=Eyt;Pl.isBundleWithPublicKey=Iyt;Pl.isBundleWithMessageSignature=Cyt;Pl.isBundleWithDsseEnvelope=wyt;Pl.BUNDLE_V01_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.1";Pl.BUNDLE_V02_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.2";Pl.BUNDLE_V03_LEGACY_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.3";Pl.BUNDLE_V03_MEDIA_TYPE="application/vnd.dev.sigstore.bundle.v0.3+json";function Eyt(e){return e.verificationMaterial.content.$case==="x509CertificateChain"}function Iyt(e){return e.verificationMaterial.content.$case==="publicKey"}function Cyt(e){return e.content.$case==="messageSignature"}function wyt(e){return e.content.$case==="dsseEnvelope"}});var cve=G(HN=>{"use strict";Object.defineProperty(HN,"__esModule",{value:!0});HN.toMessageSignatureBundle=vyt;HN.toDSSEBundle=Syt;var Byt=BD(),_N=UN();function vyt(e){return{mediaType:e.certificateChain?_N.BUNDLE_V02_MEDIA_TYPE:_N.BUNDLE_V03_MEDIA_TYPE,content:{$case:"messageSignature",messageSignature:{messageDigest:{algorithm:Byt.HashAlgorithm.SHA2_256,digest:e.digest},signature:e.signature}},verificationMaterial:lve(e)}}function Syt(e){return{mediaType:e.certificateChain?_N.BUNDLE_V02_MEDIA_TYPE:_N.BUNDLE_V03_MEDIA_TYPE,content:{$case:"dsseEnvelope",dsseEnvelope:byt(e)},verificationMaterial:lve(e)}}function byt(e){return{payloadType:e.artifactType,payload:e.artifact,signatures:[Dyt(e)]}}function Dyt(e){return{keyid:e.keyHint||"",sig:e.signature}}function lve(e){return{content:Pyt(e),tlogEntries:[],timestampVerificationData:{rfc3161Timestamps:[]}}}function Pyt(e){return e.certificate?e.certificateChain?{$case:"x509CertificateChain",x509CertificateChain:{certificates:[{rawBytes:e.certificate}]}}:{$case:"certificate",certificate:{rawBytes:e.certificate}}:{$case:"publicKey",publicKey:{hint:e.keyHint||""}}}});var SV=G(jN=>{"use strict";Object.defineProperty(jN,"__esModule",{value:!0});jN.ValidationError=void 0;var vV=class extends Error{constructor(t,r){super(t),this.fields=r}};jN.ValidationError=vV});var bV=G(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.assertBundle=xyt;oy.assertBundleV01=uve;oy.isBundleV01=kyt;oy.assertBundleV02=Qyt;oy.assertBundleLatest=Tyt;var GN=SV();function xyt(e){let t=qN(e);if(t.length>0)throw new GN.ValidationError("invalid bundle",t)}function uve(e){let t=[];if(t.push(...qN(e)),t.push(...Ryt(e)),t.length>0)throw new GN.ValidationError("invalid v0.1 bundle",t)}function kyt(e){try{return uve(e),!0}catch{return!1}}function Qyt(e){let t=[];if(t.push(...qN(e)),t.push(...fve(e)),t.length>0)throw new GN.ValidationError("invalid v0.2 bundle",t)}function Tyt(e){let t=[];if(t.push(...qN(e)),t.push(...fve(e)),t.push(...Fyt(e)),t.length>0)throw new GN.ValidationError("invalid bundle",t)}function qN(e){let t=[];if((e.mediaType===void 0||!e.mediaType.match(/^application\/vnd\.dev\.sigstore\.bundle\+json;version=\d\.\d/)&&!e.mediaType.match(/^application\/vnd\.dev\.sigstore\.bundle\.v\d\.\d\+json/))&&t.push("mediaType"),e.content===void 0)t.push("content");else switch(e.content.$case){case"messageSignature":e.content.messageSignature.messageDigest===void 0?t.push("content.messageSignature.messageDigest"):e.content.messageSignature.messageDigest.digest.length===0&&t.push("content.messageSignature.messageDigest.digest"),e.content.messageSignature.signature.length===0&&t.push("content.messageSignature.signature");break;case"dsseEnvelope":e.content.dsseEnvelope.payload.length===0&&t.push("content.dsseEnvelope.payload"),e.content.dsseEnvelope.signatures.length!==1?t.push("content.dsseEnvelope.signatures"):e.content.dsseEnvelope.signatures[0].sig.length===0&&t.push("content.dsseEnvelope.signatures[0].sig");break}if(e.verificationMaterial===void 0)t.push("verificationMaterial");else{if(e.verificationMaterial.content===void 0)t.push("verificationMaterial.content");else switch(e.verificationMaterial.content.$case){case"x509CertificateChain":e.verificationMaterial.content.x509CertificateChain.certificates.length===0&&t.push("verificationMaterial.content.x509CertificateChain.certificates"),e.verificationMaterial.content.x509CertificateChain.certificates.forEach((r,s)=>{r.rawBytes.length===0&&t.push(`verificationMaterial.content.x509CertificateChain.certificates[${s}].rawBytes`)});break;case"certificate":e.verificationMaterial.content.certificate.rawBytes.length===0&&t.push("verificationMaterial.content.certificate.rawBytes");break}e.verificationMaterial.tlogEntries===void 0?t.push("verificationMaterial.tlogEntries"):e.verificationMaterial.tlogEntries.length>0&&e.verificationMaterial.tlogEntries.forEach((r,s)=>{r.logId===void 0&&t.push(`verificationMaterial.tlogEntries[${s}].logId`),r.kindVersion===void 0&&t.push(`verificationMaterial.tlogEntries[${s}].kindVersion`)})}return t}function Ryt(e){let t=[];return e.verificationMaterial&&e.verificationMaterial.tlogEntries?.length>0&&e.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionPromise===void 0&&t.push(`verificationMaterial.tlogEntries[${s}].inclusionPromise`)}),t}function fve(e){let t=[];return e.verificationMaterial&&e.verificationMaterial.tlogEntries?.length>0&&e.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionProof===void 0?t.push(`verificationMaterial.tlogEntries[${s}].inclusionProof`):r.inclusionProof.checkpoint===void 0&&t.push(`verificationMaterial.tlogEntries[${s}].inclusionProof.checkpoint`)}),t}function Fyt(e){let t=[];return e.verificationMaterial?.content?.$case==="x509CertificateChain"&&t.push("verificationMaterial.content.$case"),t}});var pve=G(bA=>{"use strict";Object.defineProperty(bA,"__esModule",{value:!0});bA.envelopeToJSON=bA.envelopeFromJSON=bA.bundleToJSON=bA.bundleFromJSON=void 0;var YN=BD(),Ave=UN(),DV=bV(),Nyt=e=>{let t=YN.Bundle.fromJSON(e);switch(t.mediaType){case Ave.BUNDLE_V01_MEDIA_TYPE:(0,DV.assertBundleV01)(t);break;case Ave.BUNDLE_V02_MEDIA_TYPE:(0,DV.assertBundleV02)(t);break;default:(0,DV.assertBundleLatest)(t);break}return t};bA.bundleFromJSON=Nyt;var Oyt=e=>YN.Bundle.toJSON(e);bA.bundleToJSON=Oyt;var Lyt=e=>YN.Envelope.fromJSON(e);bA.envelopeFromJSON=Lyt;var Myt=e=>YN.Envelope.toJSON(e);bA.envelopeToJSON=Myt});var SD=G(Xr=>{"use strict";Object.defineProperty(Xr,"__esModule",{value:!0});Xr.isBundleV01=Xr.assertBundleV02=Xr.assertBundleV01=Xr.assertBundleLatest=Xr.assertBundle=Xr.envelopeToJSON=Xr.envelopeFromJSON=Xr.bundleToJSON=Xr.bundleFromJSON=Xr.ValidationError=Xr.isBundleWithPublicKey=Xr.isBundleWithMessageSignature=Xr.isBundleWithDsseEnvelope=Xr.isBundleWithCertificateChain=Xr.BUNDLE_V03_MEDIA_TYPE=Xr.BUNDLE_V03_LEGACY_MEDIA_TYPE=Xr.BUNDLE_V02_MEDIA_TYPE=Xr.BUNDLE_V01_MEDIA_TYPE=Xr.toMessageSignatureBundle=Xr.toDSSEBundle=void 0;var hve=cve();Object.defineProperty(Xr,"toDSSEBundle",{enumerable:!0,get:function(){return hve.toDSSEBundle}});Object.defineProperty(Xr,"toMessageSignatureBundle",{enumerable:!0,get:function(){return hve.toMessageSignatureBundle}});var Cg=UN();Object.defineProperty(Xr,"BUNDLE_V01_MEDIA_TYPE",{enumerable:!0,get:function(){return Cg.BUNDLE_V01_MEDIA_TYPE}});Object.defineProperty(Xr,"BUNDLE_V02_MEDIA_TYPE",{enumerable:!0,get:function(){return Cg.BUNDLE_V02_MEDIA_TYPE}});Object.defineProperty(Xr,"BUNDLE_V03_LEGACY_MEDIA_TYPE",{enumerable:!0,get:function(){return Cg.BUNDLE_V03_LEGACY_MEDIA_TYPE}});Object.defineProperty(Xr,"BUNDLE_V03_MEDIA_TYPE",{enumerable:!0,get:function(){return Cg.BUNDLE_V03_MEDIA_TYPE}});Object.defineProperty(Xr,"isBundleWithCertificateChain",{enumerable:!0,get:function(){return Cg.isBundleWithCertificateChain}});Object.defineProperty(Xr,"isBundleWithDsseEnvelope",{enumerable:!0,get:function(){return Cg.isBundleWithDsseEnvelope}});Object.defineProperty(Xr,"isBundleWithMessageSignature",{enumerable:!0,get:function(){return Cg.isBundleWithMessageSignature}});Object.defineProperty(Xr,"isBundleWithPublicKey",{enumerable:!0,get:function(){return Cg.isBundleWithPublicKey}});var Uyt=SV();Object.defineProperty(Xr,"ValidationError",{enumerable:!0,get:function(){return Uyt.ValidationError}});var WN=pve();Object.defineProperty(Xr,"bundleFromJSON",{enumerable:!0,get:function(){return WN.bundleFromJSON}});Object.defineProperty(Xr,"bundleToJSON",{enumerable:!0,get:function(){return WN.bundleToJSON}});Object.defineProperty(Xr,"envelopeFromJSON",{enumerable:!0,get:function(){return WN.envelopeFromJSON}});Object.defineProperty(Xr,"envelopeToJSON",{enumerable:!0,get:function(){return WN.envelopeToJSON}});var vD=bV();Object.defineProperty(Xr,"assertBundle",{enumerable:!0,get:function(){return vD.assertBundle}});Object.defineProperty(Xr,"assertBundleLatest",{enumerable:!0,get:function(){return vD.assertBundleLatest}});Object.defineProperty(Xr,"assertBundleV01",{enumerable:!0,get:function(){return vD.assertBundleV01}});Object.defineProperty(Xr,"assertBundleV02",{enumerable:!0,get:function(){return vD.assertBundleV02}});Object.defineProperty(Xr,"isBundleV01",{enumerable:!0,get:function(){return vD.isBundleV01}})});var bD=G(KN=>{"use strict";Object.defineProperty(KN,"__esModule",{value:!0});KN.ByteStream=void 0;var PV=class extends Error{},VN=class e{constructor(t){this.start=0,t?(this.buf=t,this.view=Buffer.from(t)):(this.buf=new ArrayBuffer(0),this.view=Buffer.from(this.buf))}get buffer(){return this.view.subarray(0,this.start)}get length(){return this.view.byteLength}get position(){return this.start}seek(t){this.start=t}slice(t,r){let s=t+r;if(s>this.length)throw new PV("request past end of buffer");return this.view.subarray(t,s)}appendChar(t){this.ensureCapacity(1),this.view[this.start]=t,this.start+=1}appendUint16(t){this.ensureCapacity(2);let r=new Uint16Array([t]),s=new Uint8Array(r.buffer);this.view[this.start]=s[1],this.view[this.start+1]=s[0],this.start+=2}appendUint24(t){this.ensureCapacity(3);let r=new Uint32Array([t]),s=new Uint8Array(r.buffer);this.view[this.start]=s[2],this.view[this.start+1]=s[1],this.view[this.start+2]=s[0],this.start+=3}appendView(t){this.ensureCapacity(t.length),this.view.set(t,this.start),this.start+=t.length}getBlock(t){if(t<=0)return Buffer.alloc(0);if(this.start+t>this.view.length)throw new Error("request past end of buffer");let r=this.view.subarray(this.start,this.start+t);return this.start+=t,r}getUint8(){return this.getBlock(1)[0]}getUint16(){let t=this.getBlock(2);return t[0]<<8|t[1]}ensureCapacity(t){if(this.start+t>this.view.byteLength){let r=e.BLOCK_SIZE+(t>e.BLOCK_SIZE?t:0);this.realloc(this.view.byteLength+r)}}realloc(t){let r=new ArrayBuffer(t),s=Buffer.from(r);s.set(this.view),this.buf=r,this.view=s}};KN.ByteStream=VN;VN.BLOCK_SIZE=1024});var JN=G(jw=>{"use strict";Object.defineProperty(jw,"__esModule",{value:!0});jw.ASN1TypeError=jw.ASN1ParseError=void 0;var xV=class extends Error{};jw.ASN1ParseError=xV;var kV=class extends Error{};jw.ASN1TypeError=kV});var gve=G(zN=>{"use strict";Object.defineProperty(zN,"__esModule",{value:!0});zN.decodeLength=_yt;zN.encodeLength=Hyt;var dve=JN();function _yt(e){let t=e.getUint8();if(!(t&128))return t;let r=t&127;if(r>6)throw new dve.ASN1ParseError("length exceeds 6 byte limit");let s=0;for(let a=0;a0n;)r.unshift(Number(t&255n)),t=t>>8n;return Buffer.from([128|r.length,...r])}});var yve=G(wg=>{"use strict";Object.defineProperty(wg,"__esModule",{value:!0});wg.parseInteger=qyt;wg.parseStringASCII=mve;wg.parseTime=Yyt;wg.parseOID=Wyt;wg.parseBoolean=Vyt;wg.parseBitString=Kyt;var jyt=/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/,Gyt=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/;function qyt(e){let t=0,r=e.length,s=e[t],a=s>127,n=a?255:0;for(;s==n&&++t=50?1900:2e3,s[1]=a.toString()}return new Date(`${s[1]}-${s[2]}-${s[3]}T${s[4]}:${s[5]}:${s[6]}Z`)}function Wyt(e){let t=0,r=e.length,s=e[t++],a=Math.floor(s/40),n=s%40,c=`${a}.${n}`,f=0;for(;t=f;--p)a.push(c>>p&1)}return a}});var Ive=G(ZN=>{"use strict";Object.defineProperty(ZN,"__esModule",{value:!0});ZN.ASN1Tag=void 0;var Eve=JN(),ay={BOOLEAN:1,INTEGER:2,BIT_STRING:3,OCTET_STRING:4,OBJECT_IDENTIFIER:6,SEQUENCE:16,SET:17,PRINTABLE_STRING:19,UTC_TIME:23,GENERALIZED_TIME:24},QV={UNIVERSAL:0,APPLICATION:1,CONTEXT_SPECIFIC:2,PRIVATE:3},TV=class{constructor(t){if(this.number=t&31,this.constructed=(t&32)===32,this.class=t>>6,this.number===31)throw new Eve.ASN1ParseError("long form tags not supported");if(this.class===QV.UNIVERSAL&&this.number===0)throw new Eve.ASN1ParseError("unsupported tag 0x00")}isUniversal(){return this.class===QV.UNIVERSAL}isContextSpecific(t){let r=this.class===QV.CONTEXT_SPECIFIC;return t!==void 0?r&&this.number===t:r}isBoolean(){return this.isUniversal()&&this.number===ay.BOOLEAN}isInteger(){return this.isUniversal()&&this.number===ay.INTEGER}isBitString(){return this.isUniversal()&&this.number===ay.BIT_STRING}isOctetString(){return this.isUniversal()&&this.number===ay.OCTET_STRING}isOID(){return this.isUniversal()&&this.number===ay.OBJECT_IDENTIFIER}isUTCTime(){return this.isUniversal()&&this.number===ay.UTC_TIME}isGeneralizedTime(){return this.isUniversal()&&this.number===ay.GENERALIZED_TIME}toDER(){return this.number|(this.constructed?32:0)|this.class<<6}};ZN.ASN1Tag=TV});var vve=G($N=>{"use strict";Object.defineProperty($N,"__esModule",{value:!0});$N.ASN1Obj=void 0;var RV=bD(),ly=JN(),wve=gve(),Gw=yve(),Jyt=Ive(),XN=class{constructor(t,r,s){this.tag=t,this.value=r,this.subs=s}static parseBuffer(t){return Bve(new RV.ByteStream(t))}toDER(){let t=new RV.ByteStream;if(this.subs.length>0)for(let a of this.subs)t.appendView(a.toDER());else t.appendView(this.value);let r=t.buffer,s=new RV.ByteStream;return s.appendChar(this.tag.toDER()),s.appendView((0,wve.encodeLength)(r.length)),s.appendView(r),s.buffer}toBoolean(){if(!this.tag.isBoolean())throw new ly.ASN1TypeError("not a boolean");return(0,Gw.parseBoolean)(this.value)}toInteger(){if(!this.tag.isInteger())throw new ly.ASN1TypeError("not an integer");return(0,Gw.parseInteger)(this.value)}toOID(){if(!this.tag.isOID())throw new ly.ASN1TypeError("not an OID");return(0,Gw.parseOID)(this.value)}toDate(){switch(!0){case this.tag.isUTCTime():return(0,Gw.parseTime)(this.value,!0);case this.tag.isGeneralizedTime():return(0,Gw.parseTime)(this.value,!1);default:throw new ly.ASN1TypeError("not a date")}}toBitString(){if(!this.tag.isBitString())throw new ly.ASN1TypeError("not a bit string");return(0,Gw.parseBitString)(this.value)}};$N.ASN1Obj=XN;function Bve(e){let t=new Jyt.ASN1Tag(e.getUint8()),r=(0,wve.decodeLength)(e),s=e.slice(e.position,r),a=e.position,n=[];if(t.constructed)n=Cve(e,r);else if(t.isOctetString())try{n=Cve(e,r)}catch{}return n.length===0&&e.seek(a+r),new XN(t,s,n)}function Cve(e,t){let r=e.position+t;if(r>e.length)throw new ly.ASN1ParseError("invalid length");let s=[];for(;e.position{"use strict";Object.defineProperty(eO,"__esModule",{value:!0});eO.ASN1Obj=void 0;var zyt=vve();Object.defineProperty(eO,"ASN1Obj",{enumerable:!0,get:function(){return zyt.ASN1Obj}})});var qw=G(Bg=>{"use strict";var Zyt=Bg&&Bg.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Bg,"__esModule",{value:!0});Bg.createPublicKey=Xyt;Bg.digest=$yt;Bg.verify=eEt;Bg.bufferEqual=tEt;var DD=Zyt(Ce("crypto"));function Xyt(e,t="spki"){return typeof e=="string"?DD.default.createPublicKey(e):DD.default.createPublicKey({key:e,format:"der",type:t})}function $yt(e,...t){let r=DD.default.createHash(e);for(let s of t)r.update(s);return r.digest()}function eEt(e,t,r,s){try{return DD.default.verify(s,e,t,r)}catch{return!1}}function tEt(e,t){try{return DD.default.timingSafeEqual(e,t)}catch{return!1}}});var Sve=G(FV=>{"use strict";Object.defineProperty(FV,"__esModule",{value:!0});FV.preAuthEncoding=nEt;var rEt="DSSEv1";function nEt(e,t){let r=[rEt,e.length,e,t.length,""].join(" ");return Buffer.concat([Buffer.from(r,"ascii"),t])}});var Pve=G(rO=>{"use strict";Object.defineProperty(rO,"__esModule",{value:!0});rO.base64Encode=iEt;rO.base64Decode=sEt;var bve="base64",Dve="utf-8";function iEt(e){return Buffer.from(e,Dve).toString(bve)}function sEt(e){return Buffer.from(e,bve).toString(Dve)}});var xve=G(OV=>{"use strict";Object.defineProperty(OV,"__esModule",{value:!0});OV.canonicalize=NV;function NV(e){let t="";if(e===null||typeof e!="object"||e.toJSON!=null)t+=JSON.stringify(e);else if(Array.isArray(e)){t+="[";let r=!0;e.forEach(s=>{r||(t+=","),r=!1,t+=NV(s)}),t+="]"}else{t+="{";let r=!0;Object.keys(e).sort().forEach(s=>{r||(t+=","),r=!1,t+=JSON.stringify(s),t+=":",t+=NV(e[s])}),t+="}"}return t}});var LV=G(nO=>{"use strict";Object.defineProperty(nO,"__esModule",{value:!0});nO.toDER=lEt;nO.fromDER=cEt;var oEt=/-----BEGIN (.*)-----/,aEt=/-----END (.*)-----/;function lEt(e){let t="";return e.split(` +`).forEach(r=>{r.match(oEt)||r.match(aEt)||(t+=r)}),Buffer.from(t,"base64")}function cEt(e,t="CERTIFICATE"){let s=e.toString("base64").match(/.{1,64}/g)||"";return[`-----BEGIN ${t}-----`,...s,`-----END ${t}-----`].join(` +`).concat(` +`)}});var iO=G(Yw=>{"use strict";Object.defineProperty(Yw,"__esModule",{value:!0});Yw.SHA2_HASH_ALGOS=Yw.ECDSA_SIGNATURE_ALGOS=void 0;Yw.ECDSA_SIGNATURE_ALGOS={"1.2.840.10045.4.3.1":"sha224","1.2.840.10045.4.3.2":"sha256","1.2.840.10045.4.3.3":"sha384","1.2.840.10045.4.3.4":"sha512"};Yw.SHA2_HASH_ALGOS={"2.16.840.1.101.3.4.2.1":"sha256","2.16.840.1.101.3.4.2.2":"sha384","2.16.840.1.101.3.4.2.3":"sha512"}});var UV=G(sO=>{"use strict";Object.defineProperty(sO,"__esModule",{value:!0});sO.RFC3161TimestampVerificationError=void 0;var MV=class extends Error{};sO.RFC3161TimestampVerificationError=MV});var Qve=G(DA=>{"use strict";var uEt=DA&&DA.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),fEt=DA&&DA.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),AEt=DA&&DA.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&uEt(t,e,r);return fEt(t,e),t};Object.defineProperty(DA,"__esModule",{value:!0});DA.TSTInfo=void 0;var kve=AEt(qw()),pEt=iO(),hEt=UV(),_V=class{constructor(t){this.root=t}get version(){return this.root.subs[0].toInteger()}get genTime(){return this.root.subs[4].toDate()}get messageImprintHashAlgorithm(){let t=this.messageImprintObj.subs[0].subs[0].toOID();return pEt.SHA2_HASH_ALGOS[t]}get messageImprintHashedMessage(){return this.messageImprintObj.subs[1].value}get raw(){return this.root.toDER()}verify(t){let r=kve.digest(this.messageImprintHashAlgorithm,t);if(!kve.bufferEqual(r,this.messageImprintHashedMessage))throw new hEt.RFC3161TimestampVerificationError("message imprint does not match artifact")}get messageImprintObj(){return this.root.subs[2]}};DA.TSTInfo=_V});var Rve=G(PA=>{"use strict";var dEt=PA&&PA.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),gEt=PA&&PA.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),mEt=PA&&PA.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&dEt(t,e,r);return gEt(t,e),t};Object.defineProperty(PA,"__esModule",{value:!0});PA.RFC3161Timestamp=void 0;var yEt=tO(),HV=mEt(qw()),Tve=iO(),PD=UV(),EEt=Qve(),IEt="1.2.840.113549.1.7.2",CEt="1.2.840.113549.1.9.16.1.4",wEt="1.2.840.113549.1.9.4",jV=class e{constructor(t){this.root=t}static parse(t){let r=yEt.ASN1Obj.parseBuffer(t);return new e(r)}get status(){return this.pkiStatusInfoObj.subs[0].toInteger()}get contentType(){return this.contentTypeObj.toOID()}get eContentType(){return this.eContentTypeObj.toOID()}get signingTime(){return this.tstInfo.genTime}get signerIssuer(){return this.signerSidObj.subs[0].value}get signerSerialNumber(){return this.signerSidObj.subs[1].value}get signerDigestAlgorithm(){let t=this.signerDigestAlgorithmObj.subs[0].toOID();return Tve.SHA2_HASH_ALGOS[t]}get signatureAlgorithm(){let t=this.signatureAlgorithmObj.subs[0].toOID();return Tve.ECDSA_SIGNATURE_ALGOS[t]}get signatureValue(){return this.signatureValueObj.value}get tstInfo(){return new EEt.TSTInfo(this.eContentObj.subs[0].subs[0])}verify(t,r){if(!this.timeStampTokenObj)throw new PD.RFC3161TimestampVerificationError("timeStampToken is missing");if(this.contentType!==IEt)throw new PD.RFC3161TimestampVerificationError(`incorrect content type: ${this.contentType}`);if(this.eContentType!==CEt)throw new PD.RFC3161TimestampVerificationError(`incorrect encapsulated content type: ${this.eContentType}`);this.tstInfo.verify(t),this.verifyMessageDigest(),this.verifySignature(r)}verifyMessageDigest(){let t=HV.digest(this.signerDigestAlgorithm,this.tstInfo.raw),r=this.messageDigestAttributeObj.subs[1].subs[0].value;if(!HV.bufferEqual(t,r))throw new PD.RFC3161TimestampVerificationError("signed data does not match tstInfo")}verifySignature(t){let r=this.signedAttrsObj.toDER();if(r[0]=49,!HV.verify(r,t,this.signatureValue,this.signatureAlgorithm))throw new PD.RFC3161TimestampVerificationError("signature verification failed")}get pkiStatusInfoObj(){return this.root.subs[0]}get timeStampTokenObj(){return this.root.subs[1]}get contentTypeObj(){return this.timeStampTokenObj.subs[0]}get signedDataObj(){return this.timeStampTokenObj.subs.find(r=>r.tag.isContextSpecific(0)).subs[0]}get encapContentInfoObj(){return this.signedDataObj.subs[2]}get signerInfosObj(){let t=this.signedDataObj;return t.subs[t.subs.length-1]}get signerInfoObj(){return this.signerInfosObj.subs[0]}get eContentTypeObj(){return this.encapContentInfoObj.subs[0]}get eContentObj(){return this.encapContentInfoObj.subs[1]}get signedAttrsObj(){return this.signerInfoObj.subs.find(r=>r.tag.isContextSpecific(0))}get messageDigestAttributeObj(){return this.signedAttrsObj.subs.find(r=>r.subs[0].tag.isOID()&&r.subs[0].toOID()===wEt)}get signerSidObj(){return this.signerInfoObj.subs[1]}get signerDigestAlgorithmObj(){return this.signerInfoObj.subs[2]}get signatureAlgorithmObj(){return this.signerInfoObj.subs[4]}get signatureValueObj(){return this.signerInfoObj.subs[5]}};PA.RFC3161Timestamp=jV});var Fve=G(oO=>{"use strict";Object.defineProperty(oO,"__esModule",{value:!0});oO.RFC3161Timestamp=void 0;var BEt=Rve();Object.defineProperty(oO,"RFC3161Timestamp",{enumerable:!0,get:function(){return BEt.RFC3161Timestamp}})});var Ove=G(xA=>{"use strict";var vEt=xA&&xA.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),SEt=xA&&xA.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),bEt=xA&&xA.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&vEt(t,e,r);return SEt(t,e),t};Object.defineProperty(xA,"__esModule",{value:!0});xA.SignedCertificateTimestamp=void 0;var DEt=bEt(qw()),Nve=bD(),GV=class e{constructor(t){this.version=t.version,this.logID=t.logID,this.timestamp=t.timestamp,this.extensions=t.extensions,this.hashAlgorithm=t.hashAlgorithm,this.signatureAlgorithm=t.signatureAlgorithm,this.signature=t.signature}get datetime(){return new Date(Number(this.timestamp.readBigInt64BE()))}get algorithm(){switch(this.hashAlgorithm){case 0:return"none";case 1:return"md5";case 2:return"sha1";case 3:return"sha224";case 4:return"sha256";case 5:return"sha384";case 6:return"sha512";default:return"unknown"}}verify(t,r){let s=new Nve.ByteStream;return s.appendChar(this.version),s.appendChar(0),s.appendView(this.timestamp),s.appendUint16(1),s.appendView(t),s.appendUint16(this.extensions.byteLength),this.extensions.byteLength>0&&s.appendView(this.extensions),DEt.verify(s.buffer,r,this.signature,this.algorithm)}static parse(t){let r=new Nve.ByteStream(t),s=r.getUint8(),a=r.getBlock(32),n=r.getBlock(8),c=r.getUint16(),f=r.getBlock(c),p=r.getUint8(),h=r.getUint8(),E=r.getUint16(),C=r.getBlock(E);if(r.position!==t.length)throw new Error("SCT buffer length mismatch");return new e({version:s,logID:a,timestamp:n,extensions:f,hashAlgorithm:p,signatureAlgorithm:h,signature:C})}};xA.SignedCertificateTimestamp=GV});var zV=G(fa=>{"use strict";Object.defineProperty(fa,"__esModule",{value:!0});fa.X509SCTExtension=fa.X509SubjectKeyIDExtension=fa.X509AuthorityKeyIDExtension=fa.X509SubjectAlternativeNameExtension=fa.X509KeyUsageExtension=fa.X509BasicConstraintsExtension=fa.X509Extension=void 0;var PEt=bD(),xEt=Ove(),hh=class{constructor(t){this.root=t}get oid(){return this.root.subs[0].toOID()}get critical(){return this.root.subs.length===3?this.root.subs[1].toBoolean():!1}get value(){return this.extnValueObj.value}get valueObj(){return this.extnValueObj}get extnValueObj(){return this.root.subs[this.root.subs.length-1]}};fa.X509Extension=hh;var qV=class extends hh{get isCA(){return this.sequence.subs[0]?.toBoolean()??!1}get pathLenConstraint(){return this.sequence.subs.length>1?this.sequence.subs[1].toInteger():void 0}get sequence(){return this.extnValueObj.subs[0]}};fa.X509BasicConstraintsExtension=qV;var YV=class extends hh{get digitalSignature(){return this.bitString[0]===1}get keyCertSign(){return this.bitString[5]===1}get crlSign(){return this.bitString[6]===1}get bitString(){return this.extnValueObj.subs[0].toBitString()}};fa.X509KeyUsageExtension=YV;var WV=class extends hh{get rfc822Name(){return this.findGeneralName(1)?.value.toString("ascii")}get uri(){return this.findGeneralName(6)?.value.toString("ascii")}otherName(t){let r=this.findGeneralName(0);return r===void 0||r.subs[0].toOID()!==t?void 0:r.subs[1].subs[0].value.toString("ascii")}findGeneralName(t){return this.generalNames.find(r=>r.tag.isContextSpecific(t))}get generalNames(){return this.extnValueObj.subs[0].subs}};fa.X509SubjectAlternativeNameExtension=WV;var VV=class extends hh{get keyIdentifier(){return this.findSequenceMember(0)?.value}findSequenceMember(t){return this.sequence.subs.find(r=>r.tag.isContextSpecific(t))}get sequence(){return this.extnValueObj.subs[0]}};fa.X509AuthorityKeyIDExtension=VV;var KV=class extends hh{get keyIdentifier(){return this.extnValueObj.subs[0].value}};fa.X509SubjectKeyIDExtension=KV;var JV=class extends hh{constructor(t){super(t)}get signedCertificateTimestamps(){let t=this.extnValueObj.subs[0].value,r=new PEt.ByteStream(t),s=r.getUint16()+2,a=[];for(;r.position{"use strict";var kEt=ac&&ac.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),QEt=ac&&ac.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Mve=ac&&ac.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&kEt(t,e,r);return QEt(t,e),t};Object.defineProperty(ac,"__esModule",{value:!0});ac.X509Certificate=ac.EXTENSION_OID_SCT=void 0;var TEt=tO(),Lve=Mve(qw()),REt=iO(),FEt=Mve(LV()),cy=zV(),NEt="2.5.29.14",OEt="2.5.29.15",LEt="2.5.29.17",MEt="2.5.29.19",UEt="2.5.29.35";ac.EXTENSION_OID_SCT="1.3.6.1.4.1.11129.2.4.2";var ZV=class e{constructor(t){this.root=t}static parse(t){let r=typeof t=="string"?FEt.toDER(t):t,s=TEt.ASN1Obj.parseBuffer(r);return new e(s)}get tbsCertificate(){return this.tbsCertificateObj}get version(){return`v${(this.versionObj.subs[0].toInteger()+BigInt(1)).toString()}`}get serialNumber(){return this.serialNumberObj.value}get notBefore(){return this.validityObj.subs[0].toDate()}get notAfter(){return this.validityObj.subs[1].toDate()}get issuer(){return this.issuerObj.value}get subject(){return this.subjectObj.value}get publicKey(){return this.subjectPublicKeyInfoObj.toDER()}get signatureAlgorithm(){let t=this.signatureAlgorithmObj.subs[0].toOID();return REt.ECDSA_SIGNATURE_ALGOS[t]}get signatureValue(){return this.signatureValueObj.value.subarray(1)}get subjectAltName(){let t=this.extSubjectAltName;return t?.uri||t?.rfc822Name}get extensions(){return this.extensionsObj?.subs[0]?.subs||[]}get extKeyUsage(){let t=this.findExtension(OEt);return t?new cy.X509KeyUsageExtension(t):void 0}get extBasicConstraints(){let t=this.findExtension(MEt);return t?new cy.X509BasicConstraintsExtension(t):void 0}get extSubjectAltName(){let t=this.findExtension(LEt);return t?new cy.X509SubjectAlternativeNameExtension(t):void 0}get extAuthorityKeyID(){let t=this.findExtension(UEt);return t?new cy.X509AuthorityKeyIDExtension(t):void 0}get extSubjectKeyID(){let t=this.findExtension(NEt);return t?new cy.X509SubjectKeyIDExtension(t):void 0}get extSCT(){let t=this.findExtension(ac.EXTENSION_OID_SCT);return t?new cy.X509SCTExtension(t):void 0}get isCA(){let t=this.extBasicConstraints?.isCA||!1;return this.extKeyUsage?t&&this.extKeyUsage.keyCertSign:t}extension(t){let r=this.findExtension(t);return r?new cy.X509Extension(r):void 0}verify(t){let r=t?.publicKey||this.publicKey,s=Lve.createPublicKey(r);return Lve.verify(this.tbsCertificate.toDER(),s,this.signatureValue,this.signatureAlgorithm)}validForDate(t){return this.notBefore<=t&&t<=this.notAfter}equals(t){return this.root.toDER().equals(t.root.toDER())}clone(){let t=this.root.toDER(),r=Buffer.alloc(t.length);return t.copy(r),e.parse(r)}findExtension(t){return this.extensions.find(r=>r.subs[0].toOID()===t)}get tbsCertificateObj(){return this.root.subs[0]}get signatureAlgorithmObj(){return this.root.subs[1]}get signatureValueObj(){return this.root.subs[2]}get versionObj(){return this.tbsCertificateObj.subs[0]}get serialNumberObj(){return this.tbsCertificateObj.subs[1]}get issuerObj(){return this.tbsCertificateObj.subs[3]}get validityObj(){return this.tbsCertificateObj.subs[4]}get subjectObj(){return this.tbsCertificateObj.subs[5]}get subjectPublicKeyInfoObj(){return this.tbsCertificateObj.subs[6]}get extensionsObj(){return this.tbsCertificateObj.subs.find(t=>t.tag.isContextSpecific(3))}};ac.X509Certificate=ZV});var Hve=G(vg=>{"use strict";Object.defineProperty(vg,"__esModule",{value:!0});vg.X509SCTExtension=vg.X509Certificate=vg.EXTENSION_OID_SCT=void 0;var _ve=Uve();Object.defineProperty(vg,"EXTENSION_OID_SCT",{enumerable:!0,get:function(){return _ve.EXTENSION_OID_SCT}});Object.defineProperty(vg,"X509Certificate",{enumerable:!0,get:function(){return _ve.X509Certificate}});var _Et=zV();Object.defineProperty(vg,"X509SCTExtension",{enumerable:!0,get:function(){return _Et.X509SCTExtension}})});var xl=G(Zn=>{"use strict";var HEt=Zn&&Zn.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),jEt=Zn&&Zn.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),xD=Zn&&Zn.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&HEt(t,e,r);return jEt(t,e),t};Object.defineProperty(Zn,"__esModule",{value:!0});Zn.X509SCTExtension=Zn.X509Certificate=Zn.EXTENSION_OID_SCT=Zn.ByteStream=Zn.RFC3161Timestamp=Zn.pem=Zn.json=Zn.encoding=Zn.dsse=Zn.crypto=Zn.ASN1Obj=void 0;var GEt=tO();Object.defineProperty(Zn,"ASN1Obj",{enumerable:!0,get:function(){return GEt.ASN1Obj}});Zn.crypto=xD(qw());Zn.dsse=xD(Sve());Zn.encoding=xD(Pve());Zn.json=xD(xve());Zn.pem=xD(LV());var qEt=Fve();Object.defineProperty(Zn,"RFC3161Timestamp",{enumerable:!0,get:function(){return qEt.RFC3161Timestamp}});var YEt=bD();Object.defineProperty(Zn,"ByteStream",{enumerable:!0,get:function(){return YEt.ByteStream}});var XV=Hve();Object.defineProperty(Zn,"EXTENSION_OID_SCT",{enumerable:!0,get:function(){return XV.EXTENSION_OID_SCT}});Object.defineProperty(Zn,"X509Certificate",{enumerable:!0,get:function(){return XV.X509Certificate}});Object.defineProperty(Zn,"X509SCTExtension",{enumerable:!0,get:function(){return XV.X509SCTExtension}})});var jve=G($V=>{"use strict";Object.defineProperty($V,"__esModule",{value:!0});$V.extractJWTSubject=VEt;var WEt=xl();function VEt(e){let t=e.split(".",3),r=JSON.parse(WEt.encoding.base64Decode(t[1]));switch(r.iss){case"https://accounts.google.com":case"https://oauth2.sigstore.dev/auth":return r.email;default:return r.sub}}});var Gve=G((otr,KEt)=>{KEt.exports={name:"@sigstore/sign",version:"3.1.0",description:"Sigstore signing library",main:"dist/index.js",types:"dist/index.d.ts",scripts:{clean:"shx rm -rf dist *.tsbuildinfo",build:"tsc --build",test:"jest"},files:["dist"],author:"bdehamer@github.com",license:"Apache-2.0",repository:{type:"git",url:"git+https://github.com/sigstore/sigstore-js.git"},bugs:{url:"https://github.com/sigstore/sigstore-js/issues"},homepage:"https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme",publishConfig:{provenance:!0},devDependencies:{"@sigstore/jest":"^0.0.0","@sigstore/mock":"^0.10.0","@sigstore/rekor-types":"^3.0.0","@types/make-fetch-happen":"^10.0.4","@types/promise-retry":"^1.1.6"},dependencies:{"@sigstore/bundle":"^3.1.0","@sigstore/core":"^2.0.0","@sigstore/protobuf-specs":"^0.4.0","make-fetch-happen":"^14.0.2","proc-log":"^5.0.0","promise-retry":"^2.0.1"},engines:{node:"^18.17.0 || >=20.5.0"}}});var Yve=G(Ww=>{"use strict";var JEt=Ww&&Ww.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ww,"__esModule",{value:!0});Ww.getUserAgent=void 0;var qve=JEt(Ce("os")),zEt=()=>{let e=Gve().version,t=process.version,r=qve.default.platform(),s=qve.default.arch();return`sigstore-js/${e} (Node ${t}) (${r}/${s})`};Ww.getUserAgent=zEt});var Sg=G(Ki=>{"use strict";var ZEt=Ki&&Ki.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),XEt=Ki&&Ki.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Wve=Ki&&Ki.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var s=e(t),a=0;a{"use strict";Object.defineProperty(aO,"__esModule",{value:!0});aO.BaseBundleBuilder=void 0;var e7=class{constructor(t){this.signer=t.signer,this.witnesses=t.witnesses}async create(t){let r=await this.prepare(t).then(f=>this.signer.sign(f)),s=await this.package(t,r),a=await Promise.all(this.witnesses.map(f=>f.testify(s.content,$Et(r.key)))),n=[],c=[];return a.forEach(({tlogEntries:f,rfc3161Timestamps:p})=>{n.push(...f??[]),c.push(...p??[])}),s.verificationMaterial.tlogEntries=n,s.verificationMaterial.timestampVerificationData={rfc3161Timestamps:c},s}async prepare(t){return t.data}};aO.BaseBundleBuilder=e7;function $Et(e){switch(e.$case){case"publicKey":return e.publicKey;case"x509Certificate":return e.certificate}}});var n7=G(kA=>{"use strict";var eIt=kA&&kA.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),tIt=kA&&kA.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),rIt=kA&&kA.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var s=e(t),a=0;a{"use strict";Object.defineProperty(lO,"__esModule",{value:!0});lO.DSSEBundleBuilder=void 0;var sIt=Sg(),oIt=t7(),aIt=n7(),i7=class extends oIt.BaseBundleBuilder{constructor(t){super(t),this.certificateChain=t.certificateChain??!1}async prepare(t){let r=Kve(t);return sIt.dsse.preAuthEncoding(r.type,r.data)}async package(t,r){return(0,aIt.toDSSEBundle)(Kve(t),r,this.certificateChain)}};lO.DSSEBundleBuilder=i7;function Kve(e){return{...e,type:e.type??""}}});var zve=G(cO=>{"use strict";Object.defineProperty(cO,"__esModule",{value:!0});cO.MessageSignatureBundleBuilder=void 0;var lIt=t7(),cIt=n7(),s7=class extends lIt.BaseBundleBuilder{constructor(t){super(t)}async package(t,r){return(0,cIt.toMessageSignatureBundle)(t,r)}};cO.MessageSignatureBundleBuilder=s7});var Zve=G(Vw=>{"use strict";Object.defineProperty(Vw,"__esModule",{value:!0});Vw.MessageSignatureBundleBuilder=Vw.DSSEBundleBuilder=void 0;var uIt=Jve();Object.defineProperty(Vw,"DSSEBundleBuilder",{enumerable:!0,get:function(){return uIt.DSSEBundleBuilder}});var fIt=zve();Object.defineProperty(Vw,"MessageSignatureBundleBuilder",{enumerable:!0,get:function(){return fIt.MessageSignatureBundleBuilder}})});var fO=G(uO=>{"use strict";Object.defineProperty(uO,"__esModule",{value:!0});uO.HTTPError=void 0;var o7=class extends Error{constructor({status:t,message:r,location:s}){super(`(${t}) ${r}`),this.statusCode=t,this.location=s}};uO.HTTPError=o7});var Kw=G(QD=>{"use strict";Object.defineProperty(QD,"__esModule",{value:!0});QD.InternalError=void 0;QD.internalError=pIt;var AIt=fO(),AO=class extends Error{constructor({code:t,message:r,cause:s}){super(r),this.name=this.constructor.name,this.cause=s,this.code=t}};QD.InternalError=AO;function pIt(e,t,r){throw e instanceof AIt.HTTPError&&(r+=` - ${e.message}`),new AO({code:t,message:r,cause:e})}});var pO=G((mtr,Xve)=>{Xve.exports=fetch});var $ve=G(Jw=>{"use strict";var hIt=Jw&&Jw.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Jw,"__esModule",{value:!0});Jw.CIContextProvider=void 0;var dIt=hIt(pO()),gIt=[mIt,yIt],a7=class{constructor(t="sigstore"){this.audience=t}async getToken(){return Promise.any(gIt.map(t=>t(this.audience))).catch(()=>Promise.reject("CI: no tokens available"))}};Jw.CIContextProvider=a7;async function mIt(e){if(!process.env.ACTIONS_ID_TOKEN_REQUEST_URL||!process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN)return Promise.reject("no token available");let t=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);return t.searchParams.append("audience",e),(await(0,dIt.default)(t.href,{retry:2,headers:{Accept:"application/json",Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).json().then(s=>s.value)}async function yIt(){return process.env.SIGSTORE_ID_TOKEN?process.env.SIGSTORE_ID_TOKEN:Promise.reject("no token available")}});var eSe=G(hO=>{"use strict";Object.defineProperty(hO,"__esModule",{value:!0});hO.CIContextProvider=void 0;var EIt=$ve();Object.defineProperty(hO,"CIContextProvider",{enumerable:!0,get:function(){return EIt.CIContextProvider}})});var rSe=G((Itr,tSe)=>{var IIt=Symbol("proc-log.meta");tSe.exports={META:IIt,output:{LEVELS:["standard","error","buffer","flush"],KEYS:{standard:"standard",error:"error",buffer:"buffer",flush:"flush"},standard:function(...e){return process.emit("output","standard",...e)},error:function(...e){return process.emit("output","error",...e)},buffer:function(...e){return process.emit("output","buffer",...e)},flush:function(...e){return process.emit("output","flush",...e)}},log:{LEVELS:["notice","error","warn","info","verbose","http","silly","timing","pause","resume"],KEYS:{notice:"notice",error:"error",warn:"warn",info:"info",verbose:"verbose",http:"http",silly:"silly",timing:"timing",pause:"pause",resume:"resume"},error:function(...e){return process.emit("log","error",...e)},notice:function(...e){return process.emit("log","notice",...e)},warn:function(...e){return process.emit("log","warn",...e)},info:function(...e){return process.emit("log","info",...e)},verbose:function(...e){return process.emit("log","verbose",...e)},http:function(...e){return process.emit("log","http",...e)},silly:function(...e){return process.emit("log","silly",...e)},timing:function(...e){return process.emit("log","timing",...e)},pause:function(){return process.emit("log","pause")},resume:function(){return process.emit("log","resume")}},time:{LEVELS:["start","end"],KEYS:{start:"start",end:"end"},start:function(e,t){process.emit("time","start",e);function r(){return process.emit("time","end",e)}if(typeof t=="function"){let s=t();return s&&s.finally?s.finally(r):(r(),s)}return r},end:function(e){return process.emit("time","end",e)}},input:{LEVELS:["start","end","read"],KEYS:{start:"start",end:"end",read:"read"},start:function(e){process.emit("input","start");function t(){return process.emit("input","end")}if(typeof e=="function"){let r=e();return r&&r.finally?r.finally(t):(t(),r)}return t},end:function(){return process.emit("input","end")},read:function(...e){let t,r,s=new Promise((a,n)=>{t=a,r=n});return process.emit("input","read",t,r,...e),s}}}});var sSe=G((Ctr,iSe)=>{"use strict";function nSe(e,t){for(let r in t)Object.defineProperty(e,r,{value:t[r],enumerable:!0,configurable:!0});return e}function CIt(e,t,r){if(!e||typeof e=="string")throw new TypeError("Please pass an Error to err-code");r||(r={}),typeof t=="object"&&(r=t,t=void 0),t!=null&&(r.code=t);try{return nSe(e,r)}catch{r.message=e.message,r.stack=e.stack;let a=function(){};return a.prototype=Object.create(Object.getPrototypeOf(e)),nSe(new a,r)}}iSe.exports=CIt});var aSe=G((wtr,oSe)=>{function $c(e,t){typeof t=="boolean"&&(t={forever:t}),this._originalTimeouts=JSON.parse(JSON.stringify(e)),this._timeouts=e,this._options=t||{},this._maxRetryTime=t&&t.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}oSe.exports=$c;$c.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};$c.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timeouts=[],this._cachedTimeouts=null};$c.prototype.retry=function(e){if(this._timeout&&clearTimeout(this._timeout),!e)return!1;var t=new Date().getTime();if(e&&t-this._operationStart>=this._maxRetryTime)return this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(e);var r=this._timeouts.shift();if(r===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),r=this._timeouts.shift();else return!1;var s=this,a=setTimeout(function(){s._attempts++,s._operationTimeoutCb&&(s._timeout=setTimeout(function(){s._operationTimeoutCb(s._attempts)},s._operationTimeout),s._options.unref&&s._timeout.unref()),s._fn(s._attempts)},r);return this._options.unref&&a.unref(),!0};$c.prototype.attempt=function(e,t){this._fn=e,t&&(t.timeout&&(this._operationTimeout=t.timeout),t.cb&&(this._operationTimeoutCb=t.cb));var r=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){r._operationTimeoutCb()},r._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};$c.prototype.try=function(e){console.log("Using RetryOperation.try() is deprecated"),this.attempt(e)};$c.prototype.start=function(e){console.log("Using RetryOperation.start() is deprecated"),this.attempt(e)};$c.prototype.start=$c.prototype.try;$c.prototype.errors=function(){return this._errors};$c.prototype.attempts=function(){return this._attempts};$c.prototype.mainError=function(){if(this._errors.length===0)return null;for(var e={},t=null,r=0,s=0;s=r&&(t=a,r=c)}return t}});var lSe=G(uy=>{var wIt=aSe();uy.operation=function(e){var t=uy.timeouts(e);return new wIt(t,{forever:e&&e.forever,unref:e&&e.unref,maxRetryTime:e&&e.maxRetryTime})};uy.timeouts=function(e){if(e instanceof Array)return[].concat(e);var t={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var r in e)t[r]=e[r];if(t.minTimeout>t.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var s=[],a=0;a{cSe.exports=lSe()});var pSe=G((Str,ASe)=>{"use strict";var BIt=sSe(),vIt=uSe(),SIt=Object.prototype.hasOwnProperty;function fSe(e){return e&&e.code==="EPROMISERETRY"&&SIt.call(e,"retried")}function bIt(e,t){var r,s;return typeof e=="object"&&typeof t=="function"&&(r=t,t=e,e=r),s=vIt.operation(t),new Promise(function(a,n){s.attempt(function(c){Promise.resolve().then(function(){return e(function(f){throw fSe(f)&&(f=f.retried),BIt(new Error("Retrying"),"EPROMISERETRY",{retried:f})},c)}).then(a,function(f){fSe(f)&&(f=f.retried,s.retry(f||new Error))||n(f)})})})}ASe.exports=bIt});var dO=G(TD=>{"use strict";var dSe=TD&&TD.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(TD,"__esModule",{value:!0});TD.fetchWithRetry=MIt;var DIt=Ce("http2"),PIt=dSe(pO()),hSe=rSe(),xIt=dSe(pSe()),kIt=Sg(),QIt=fO(),{HTTP2_HEADER_LOCATION:TIt,HTTP2_HEADER_CONTENT_TYPE:RIt,HTTP2_HEADER_USER_AGENT:FIt,HTTP_STATUS_INTERNAL_SERVER_ERROR:NIt,HTTP_STATUS_TOO_MANY_REQUESTS:OIt,HTTP_STATUS_REQUEST_TIMEOUT:LIt}=DIt.constants;async function MIt(e,t){return(0,xIt.default)(async(r,s)=>{let a=t.method||"POST",n={[FIt]:kIt.ua.getUserAgent(),...t.headers},c=await(0,PIt.default)(e,{method:a,headers:n,body:t.body,timeout:t.timeout,retry:!1}).catch(f=>(hSe.log.http("fetch",`${a} ${e} attempt ${s} failed with ${f}`),r(f)));if(c.ok)return c;{let f=await UIt(c);if(hSe.log.http("fetch",`${a} ${e} attempt ${s} failed with ${c.status}`),_It(c.status))return r(f);throw f}},HIt(t.retry))}var UIt=async e=>{let t=e.statusText,r=e.headers.get(TIt)||void 0;if(e.headers.get(RIt)?.includes("application/json"))try{t=(await e.json()).message||t}catch{}return new QIt.HTTPError({status:e.status,message:t,location:r})},_It=e=>[LIt,OIt].includes(e)||e>=NIt,HIt=e=>typeof e=="boolean"?{retries:e?1:0}:typeof e=="number"?{retries:e}:{retries:0,...e}});var gSe=G(gO=>{"use strict";Object.defineProperty(gO,"__esModule",{value:!0});gO.Fulcio=void 0;var jIt=dO(),l7=class{constructor(t){this.options=t}async createSigningCertificate(t){let{baseURL:r,retry:s,timeout:a}=this.options,n=`${r}/api/v2/signingCert`;return(await(0,jIt.fetchWithRetry)(n,{headers:{"Content-Type":"application/json"},body:JSON.stringify(t),timeout:a,retry:s})).json()}};gO.Fulcio=l7});var mSe=G(mO=>{"use strict";Object.defineProperty(mO,"__esModule",{value:!0});mO.CAClient=void 0;var GIt=Kw(),qIt=gSe(),c7=class{constructor(t){this.fulcio=new qIt.Fulcio({baseURL:t.fulcioBaseURL,retry:t.retry,timeout:t.timeout})}async createSigningCertificate(t,r,s){let a=YIt(t,r,s);try{let n=await this.fulcio.createSigningCertificate(a);return(n.signedCertificateEmbeddedSct?n.signedCertificateEmbeddedSct:n.signedCertificateDetachedSct).chain.certificates}catch(n){(0,GIt.internalError)(n,"CA_CREATE_SIGNING_CERTIFICATE_ERROR","error creating signing certificate")}}};mO.CAClient=c7;function YIt(e,t,r){return{credentials:{oidcIdentityToken:e},publicKeyRequest:{publicKey:{algorithm:"ECDSA",content:t},proofOfPossession:r.toString("base64")}}}});var ESe=G(zw=>{"use strict";var WIt=zw&&zw.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(zw,"__esModule",{value:!0});zw.EphemeralSigner=void 0;var ySe=WIt(Ce("crypto")),VIt="ec",KIt="P-256",u7=class{constructor(){this.keypair=ySe.default.generateKeyPairSync(VIt,{namedCurve:KIt})}async sign(t){let r=ySe.default.sign(null,t,this.keypair.privateKey),s=this.keypair.publicKey.export({format:"pem",type:"spki"}).toString("ascii");return{signature:r,key:{$case:"publicKey",publicKey:s}}}};zw.EphemeralSigner=u7});var ISe=G(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.FulcioSigner=fy.DEFAULT_FULCIO_URL=void 0;var f7=Kw(),JIt=Sg(),zIt=mSe(),ZIt=ESe();fy.DEFAULT_FULCIO_URL="https://fulcio.sigstore.dev";var A7=class{constructor(t){this.ca=new zIt.CAClient({...t,fulcioBaseURL:t.fulcioBaseURL||fy.DEFAULT_FULCIO_URL}),this.identityProvider=t.identityProvider,this.keyHolder=t.keyHolder||new ZIt.EphemeralSigner}async sign(t){let r=await this.getIdentityToken(),s;try{s=JIt.oidc.extractJWTSubject(r)}catch(f){throw new f7.InternalError({code:"IDENTITY_TOKEN_PARSE_ERROR",message:`invalid identity token: ${r}`,cause:f})}let a=await this.keyHolder.sign(Buffer.from(s));if(a.key.$case!=="publicKey")throw new f7.InternalError({code:"CA_CREATE_SIGNING_CERTIFICATE_ERROR",message:"unexpected format for signing key"});let n=await this.ca.createSigningCertificate(r,a.key.publicKey,a.signature);return{signature:(await this.keyHolder.sign(t)).signature,key:{$case:"x509Certificate",certificate:n[0]}}}async getIdentityToken(){try{return await this.identityProvider.getToken()}catch(t){throw new f7.InternalError({code:"IDENTITY_TOKEN_READ_ERROR",message:"error retrieving identity token",cause:t})}}};fy.FulcioSigner=A7});var wSe=G(Zw=>{"use strict";Object.defineProperty(Zw,"__esModule",{value:!0});Zw.FulcioSigner=Zw.DEFAULT_FULCIO_URL=void 0;var CSe=ISe();Object.defineProperty(Zw,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return CSe.DEFAULT_FULCIO_URL}});Object.defineProperty(Zw,"FulcioSigner",{enumerable:!0,get:function(){return CSe.FulcioSigner}})});var SSe=G(yO=>{"use strict";Object.defineProperty(yO,"__esModule",{value:!0});yO.Rekor=void 0;var BSe=dO(),p7=class{constructor(t){this.options=t}async createEntry(t){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries`,f=await(await(0,BSe.fetchWithRetry)(n,{headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t),timeout:s,retry:a})).json();return vSe(f)}async getEntry(t){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries/${t}`,f=await(await(0,BSe.fetchWithRetry)(n,{method:"GET",headers:{Accept:"application/json"},timeout:s,retry:a})).json();return vSe(f)}};yO.Rekor=p7;function vSe(e){let t=Object.entries(e);if(t.length!=1)throw new Error("Received multiple entries in Rekor response");let[r,s]=t[0];return{...s,uuid:r}}});var DSe=G(EO=>{"use strict";Object.defineProperty(EO,"__esModule",{value:!0});EO.TLogClient=void 0;var bSe=Kw(),XIt=fO(),$It=SSe(),h7=class{constructor(t){this.fetchOnConflict=t.fetchOnConflict??!1,this.rekor=new $It.Rekor({baseURL:t.rekorBaseURL,retry:t.retry,timeout:t.timeout})}async createEntry(t){let r;try{r=await this.rekor.createEntry(t)}catch(s){if(eCt(s)&&this.fetchOnConflict){let a=s.location.split("/").pop()||"";try{r=await this.rekor.getEntry(a)}catch(n){(0,bSe.internalError)(n,"TLOG_FETCH_ENTRY_ERROR","error fetching tlog entry")}}else(0,bSe.internalError)(s,"TLOG_CREATE_ENTRY_ERROR","error creating tlog entry")}return r}};EO.TLogClient=h7;function eCt(e){return e instanceof XIt.HTTPError&&e.statusCode===409&&e.location!==void 0}});var PSe=G(d7=>{"use strict";Object.defineProperty(d7,"__esModule",{value:!0});d7.toProposedEntry=rCt;var tCt=SD(),bg=Sg(),RD="sha256";function rCt(e,t,r="dsse"){switch(e.$case){case"dsseEnvelope":return r==="intoto"?sCt(e.dsseEnvelope,t):iCt(e.dsseEnvelope,t);case"messageSignature":return nCt(e.messageSignature,t)}}function nCt(e,t){let r=e.messageDigest.digest.toString("hex"),s=e.signature.toString("base64"),a=bg.encoding.base64Encode(t);return{apiVersion:"0.0.1",kind:"hashedrekord",spec:{data:{hash:{algorithm:RD,value:r}},signature:{content:s,publicKey:{content:a}}}}}function iCt(e,t){let r=JSON.stringify((0,tCt.envelopeToJSON)(e)),s=bg.encoding.base64Encode(t);return{apiVersion:"0.0.1",kind:"dsse",spec:{proposedContent:{envelope:r,verifiers:[s]}}}}function sCt(e,t){let r=bg.crypto.digest(RD,e.payload).toString("hex"),s=oCt(e,t),a=bg.encoding.base64Encode(e.payload.toString("base64")),n=bg.encoding.base64Encode(e.signatures[0].sig.toString("base64")),c=e.signatures[0].keyid,f=bg.encoding.base64Encode(t),p={payloadType:e.payloadType,payload:a,signatures:[{sig:n,publicKey:f}]};return c.length>0&&(p.signatures[0].keyid=c),{apiVersion:"0.0.2",kind:"intoto",spec:{content:{envelope:p,hash:{algorithm:RD,value:s},payloadHash:{algorithm:RD,value:r}}}}}function oCt(e,t){let r={payloadType:e.payloadType,payload:e.payload.toString("base64"),signatures:[{sig:e.signatures[0].sig.toString("base64"),publicKey:t}]};return e.signatures[0].keyid.length>0&&(r.signatures[0].keyid=e.signatures[0].keyid),bg.crypto.digest(RD,bg.json.canonicalize(r)).toString("hex")}});var xSe=G(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.RekorWitness=Ay.DEFAULT_REKOR_URL=void 0;var aCt=Sg(),lCt=DSe(),cCt=PSe();Ay.DEFAULT_REKOR_URL="https://rekor.sigstore.dev";var g7=class{constructor(t){this.entryType=t.entryType,this.tlog=new lCt.TLogClient({...t,rekorBaseURL:t.rekorBaseURL||Ay.DEFAULT_REKOR_URL})}async testify(t,r){let s=(0,cCt.toProposedEntry)(t,r,this.entryType),a=await this.tlog.createEntry(s);return uCt(a)}};Ay.RekorWitness=g7;function uCt(e){let t=Buffer.from(e.logID,"hex"),r=aCt.encoding.base64Decode(e.body),s=JSON.parse(r),a=e?.verification?.signedEntryTimestamp?fCt(e.verification.signedEntryTimestamp):void 0,n=e?.verification?.inclusionProof?ACt(e.verification.inclusionProof):void 0;return{tlogEntries:[{logIndex:e.logIndex.toString(),logId:{keyId:t},integratedTime:e.integratedTime.toString(),kindVersion:{kind:s.kind,version:s.apiVersion},inclusionPromise:a,inclusionProof:n,canonicalizedBody:Buffer.from(e.body,"base64")}]}}function fCt(e){return{signedEntryTimestamp:Buffer.from(e,"base64")}}function ACt(e){return{logIndex:e.logIndex.toString(),treeSize:e.treeSize.toString(),rootHash:Buffer.from(e.rootHash,"hex"),hashes:e.hashes.map(t=>Buffer.from(t,"hex")),checkpoint:{envelope:e.checkpoint}}}});var kSe=G(IO=>{"use strict";Object.defineProperty(IO,"__esModule",{value:!0});IO.TimestampAuthority=void 0;var pCt=dO(),m7=class{constructor(t){this.options=t}async createTimestamp(t){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/timestamp`;return(await(0,pCt.fetchWithRetry)(n,{headers:{"Content-Type":"application/json"},body:JSON.stringify(t),timeout:s,retry:a})).buffer()}};IO.TimestampAuthority=m7});var TSe=G(CO=>{"use strict";Object.defineProperty(CO,"__esModule",{value:!0});CO.TSAClient=void 0;var hCt=Kw(),dCt=kSe(),gCt=Sg(),QSe="sha256",y7=class{constructor(t){this.tsa=new dCt.TimestampAuthority({baseURL:t.tsaBaseURL,retry:t.retry,timeout:t.timeout})}async createTimestamp(t){let r={artifactHash:gCt.crypto.digest(QSe,t).toString("base64"),hashAlgorithm:QSe};try{return await this.tsa.createTimestamp(r)}catch(s){(0,hCt.internalError)(s,"TSA_CREATE_TIMESTAMP_ERROR","error creating timestamp")}}};CO.TSAClient=y7});var RSe=G(wO=>{"use strict";Object.defineProperty(wO,"__esModule",{value:!0});wO.TSAWitness=void 0;var mCt=TSe(),E7=class{constructor(t){this.tsa=new mCt.TSAClient({tsaBaseURL:t.tsaBaseURL,retry:t.retry,timeout:t.timeout})}async testify(t){let r=yCt(t);return{rfc3161Timestamps:[{signedTimestamp:await this.tsa.createTimestamp(r)}]}}};wO.TSAWitness=E7;function yCt(e){switch(e.$case){case"dsseEnvelope":return e.dsseEnvelope.signatures[0].sig;case"messageSignature":return e.messageSignature.signature}}});var NSe=G(Dg=>{"use strict";Object.defineProperty(Dg,"__esModule",{value:!0});Dg.TSAWitness=Dg.RekorWitness=Dg.DEFAULT_REKOR_URL=void 0;var FSe=xSe();Object.defineProperty(Dg,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return FSe.DEFAULT_REKOR_URL}});Object.defineProperty(Dg,"RekorWitness",{enumerable:!0,get:function(){return FSe.RekorWitness}});var ECt=RSe();Object.defineProperty(Dg,"TSAWitness",{enumerable:!0,get:function(){return ECt.TSAWitness}})});var C7=G(ws=>{"use strict";Object.defineProperty(ws,"__esModule",{value:!0});ws.TSAWitness=ws.RekorWitness=ws.DEFAULT_REKOR_URL=ws.FulcioSigner=ws.DEFAULT_FULCIO_URL=ws.CIContextProvider=ws.InternalError=ws.MessageSignatureBundleBuilder=ws.DSSEBundleBuilder=void 0;var OSe=Zve();Object.defineProperty(ws,"DSSEBundleBuilder",{enumerable:!0,get:function(){return OSe.DSSEBundleBuilder}});Object.defineProperty(ws,"MessageSignatureBundleBuilder",{enumerable:!0,get:function(){return OSe.MessageSignatureBundleBuilder}});var ICt=Kw();Object.defineProperty(ws,"InternalError",{enumerable:!0,get:function(){return ICt.InternalError}});var CCt=eSe();Object.defineProperty(ws,"CIContextProvider",{enumerable:!0,get:function(){return CCt.CIContextProvider}});var LSe=wSe();Object.defineProperty(ws,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return LSe.DEFAULT_FULCIO_URL}});Object.defineProperty(ws,"FulcioSigner",{enumerable:!0,get:function(){return LSe.FulcioSigner}});var I7=NSe();Object.defineProperty(ws,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return I7.DEFAULT_REKOR_URL}});Object.defineProperty(ws,"RekorWitness",{enumerable:!0,get:function(){return I7.RekorWitness}});Object.defineProperty(ws,"TSAWitness",{enumerable:!0,get:function(){return I7.TSAWitness}})});var USe=G(FD=>{"use strict";var MSe=FD&&FD.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(FD,"__esModule",{value:!0});FD.appDataPath=BCt;var wCt=MSe(Ce("os")),Xw=MSe(Ce("path"));function BCt(e){let t=wCt.default.homedir();switch(process.platform){case"darwin":{let r=Xw.default.join(t,"Library","Application Support");return Xw.default.join(r,e)}case"win32":{let r=process.env.LOCALAPPDATA||Xw.default.join(t,"AppData","Local");return Xw.default.join(r,e,"Data")}default:{let r=process.env.XDG_DATA_HOME||Xw.default.join(t,".local","share");return Xw.default.join(r,e)}}}});var QA=G(kl=>{"use strict";Object.defineProperty(kl,"__esModule",{value:!0});kl.UnsupportedAlgorithmError=kl.CryptoError=kl.LengthOrHashMismatchError=kl.UnsignedMetadataError=kl.RepositoryError=kl.ValueError=void 0;var w7=class extends Error{};kl.ValueError=w7;var ND=class extends Error{};kl.RepositoryError=ND;var B7=class extends ND{};kl.UnsignedMetadataError=B7;var v7=class extends ND{};kl.LengthOrHashMismatchError=v7;var BO=class extends Error{};kl.CryptoError=BO;var S7=class extends BO{};kl.UnsupportedAlgorithmError=S7});var HSe=G(Pg=>{"use strict";Object.defineProperty(Pg,"__esModule",{value:!0});Pg.isDefined=vCt;Pg.isObject=_Se;Pg.isStringArray=SCt;Pg.isObjectArray=bCt;Pg.isStringRecord=DCt;Pg.isObjectRecord=PCt;function vCt(e){return e!==void 0}function _Se(e){return typeof e=="object"&&e!==null}function SCt(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function bCt(e){return Array.isArray(e)&&e.every(_Se)}function DCt(e){return typeof e=="object"&&e!==null&&Object.keys(e).every(t=>typeof t=="string")&&Object.values(e).every(t=>typeof t=="string")}function PCt(e){return typeof e=="object"&&e!==null&&Object.keys(e).every(t=>typeof t=="string")&&Object.values(e).every(t=>typeof t=="object"&&t!==null)}});var D7=G((qtr,qSe)=>{var jSe=",",xCt=":",kCt="[",QCt="]",TCt="{",RCt="}";function b7(e){let t=[];if(typeof e=="string")t.push(GSe(e));else if(typeof e=="boolean")t.push(JSON.stringify(e));else if(Number.isInteger(e))t.push(JSON.stringify(e));else if(e===null)t.push(JSON.stringify(e));else if(Array.isArray(e)){t.push(kCt);let r=!0;e.forEach(s=>{r||t.push(jSe),r=!1,t.push(b7(s))}),t.push(QCt)}else if(typeof e=="object"){t.push(TCt);let r=!0;Object.keys(e).sort().forEach(s=>{r||t.push(jSe),r=!1,t.push(GSe(s)),t.push(xCt),t.push(b7(e[s]))}),t.push(RCt)}else throw new TypeError("cannot encode "+e.toString());return t.join("")}function GSe(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}qSe.exports={canonicalize:b7}});var YSe=G($w=>{"use strict";var FCt=$w&&$w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($w,"__esModule",{value:!0});$w.verifySignature=void 0;var NCt=D7(),OCt=FCt(Ce("crypto")),LCt=(e,t,r)=>{let s=Buffer.from((0,NCt.canonicalize)(e));return OCt.default.verify(void 0,s,t,Buffer.from(r,"hex"))};$w.verifySignature=LCt});var hf=G(eu=>{"use strict";var MCt=eu&&eu.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),UCt=eu&&eu.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),WSe=eu&&eu.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&MCt(t,e,r);return UCt(t,e),t};Object.defineProperty(eu,"__esModule",{value:!0});eu.crypto=eu.guard=void 0;eu.guard=WSe(HSe());eu.crypto=WSe(YSe())});var py=G(dh=>{"use strict";var _Ct=dh&&dh.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(dh,"__esModule",{value:!0});dh.Signed=dh.MetadataKind=void 0;dh.isMetadataKind=jCt;var HCt=_Ct(Ce("util")),OD=QA(),P7=hf(),VSe=["1","0","31"],x7;(function(e){e.Root="root",e.Timestamp="timestamp",e.Snapshot="snapshot",e.Targets="targets"})(x7||(dh.MetadataKind=x7={}));function jCt(e){return typeof e=="string"&&Object.values(x7).includes(e)}var k7=class e{constructor(t){this.specVersion=t.specVersion||VSe.join(".");let r=this.specVersion.split(".");if(!(r.length===2||r.length===3)||!r.every(s=>GCt(s)))throw new OD.ValueError("Failed to parse specVersion");if(r[0]!=VSe[0])throw new OD.ValueError("Unsupported specVersion");this.expires=t.expires,this.version=t.version,this.unrecognizedFields=t.unrecognizedFields||{}}equals(t){return t instanceof e?this.specVersion===t.specVersion&&this.expires===t.expires&&this.version===t.version&&HCt.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields):!1}isExpired(t){return t||(t=new Date),t>=new Date(this.expires)}static commonFieldsFromJSON(t){let{spec_version:r,expires:s,version:a,...n}=t;if(P7.guard.isDefined(r)){if(typeof r!="string")throw new TypeError("spec_version must be a string")}else throw new OD.ValueError("spec_version is not defined");if(P7.guard.isDefined(s)){if(typeof s!="string")throw new TypeError("expires must be a string")}else throw new OD.ValueError("expires is not defined");if(P7.guard.isDefined(a)){if(typeof a!="number")throw new TypeError("version must be a number")}else throw new OD.ValueError("version is not defined");return{specVersion:r,expires:s,version:a,unrecognizedFields:n}}};dh.Signed=k7;function GCt(e){return!isNaN(Number(e))}});var LD=G(kg=>{"use strict";var KSe=kg&&kg.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(kg,"__esModule",{value:!0});kg.TargetFile=kg.MetaFile=void 0;var JSe=KSe(Ce("crypto")),SO=KSe(Ce("util")),xg=QA(),vO=hf(),Q7=class e{constructor(t){if(t.version<=0)throw new xg.ValueError("Metafile version must be at least 1");t.length!==void 0&&zSe(t.length),this.version=t.version,this.length=t.length,this.hashes=t.hashes,this.unrecognizedFields=t.unrecognizedFields||{}}equals(t){return t instanceof e?this.version===t.version&&this.length===t.length&&SO.default.isDeepStrictEqual(this.hashes,t.hashes)&&SO.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields):!1}verify(t){if(this.length!==void 0&&t.length!==this.length)throw new xg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${t.length}`);this.hashes&&Object.entries(this.hashes).forEach(([r,s])=>{let a;try{a=JSe.default.createHash(r)}catch{throw new xg.LengthOrHashMismatchError(`Hash algorithm ${r} not supported`)}let n=a.update(t).digest("hex");if(n!==s)throw new xg.LengthOrHashMismatchError(`Expected hash ${s} but got ${n}`)})}toJSON(){let t={version:this.version,...this.unrecognizedFields};return this.length!==void 0&&(t.length=this.length),this.hashes&&(t.hashes=this.hashes),t}static fromJSON(t){let{version:r,length:s,hashes:a,...n}=t;if(typeof r!="number")throw new TypeError("version must be a number");if(vO.guard.isDefined(s)&&typeof s!="number")throw new TypeError("length must be a number");if(vO.guard.isDefined(a)&&!vO.guard.isStringRecord(a))throw new TypeError("hashes must be string keys and values");return new e({version:r,length:s,hashes:a,unrecognizedFields:n})}};kg.MetaFile=Q7;var T7=class e{constructor(t){zSe(t.length),this.length=t.length,this.path=t.path,this.hashes=t.hashes,this.unrecognizedFields=t.unrecognizedFields||{}}get custom(){let t=this.unrecognizedFields.custom;return!t||Array.isArray(t)||typeof t!="object"?{}:t}equals(t){return t instanceof e?this.length===t.length&&this.path===t.path&&SO.default.isDeepStrictEqual(this.hashes,t.hashes)&&SO.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields):!1}async verify(t){let r=0,s=Object.keys(this.hashes).reduce((a,n)=>{try{a[n]=JSe.default.createHash(n)}catch{throw new xg.LengthOrHashMismatchError(`Hash algorithm ${n} not supported`)}return a},{});for await(let a of t)r+=a.length,Object.values(s).forEach(n=>{n.update(a)});if(r!==this.length)throw new xg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${r}`);Object.entries(s).forEach(([a,n])=>{let c=this.hashes[a],f=n.digest("hex");if(f!==c)throw new xg.LengthOrHashMismatchError(`Expected hash ${c} but got ${f}`)})}toJSON(){return{length:this.length,hashes:this.hashes,...this.unrecognizedFields}}static fromJSON(t,r){let{length:s,hashes:a,...n}=r;if(typeof s!="number")throw new TypeError("length must be a number");if(!vO.guard.isStringRecord(a))throw new TypeError("hashes must have string keys and values");return new e({length:s,path:t,hashes:a,unrecognizedFields:n})}};kg.TargetFile=T7;function zSe(e){if(e<0)throw new xg.ValueError("Length must be at least 0")}});var ZSe=G(R7=>{"use strict";Object.defineProperty(R7,"__esModule",{value:!0});R7.encodeOIDString=YCt;var qCt=6;function YCt(e){let t=e.split("."),r=parseInt(t[0],10)*40+parseInt(t[1],10),s=[];t.slice(2).forEach(n=>{let c=WCt(parseInt(n,10));s.push(...c)});let a=Buffer.from([r,...s]);return Buffer.from([qCt,a.length,...a])}function WCt(e){let t=[],r=0;for(;e>0;)t.unshift(e&127|r),e>>=7,r=128;return t}});var tbe=G(UD=>{"use strict";var VCt=UD&&UD.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(UD,"__esModule",{value:!0});UD.getPublicKey=ZCt;var e1=VCt(Ce("crypto")),MD=QA(),F7=ZSe(),bO=48,XSe=3,$Se=0,KCt="1.3.101.112",JCt="1.2.840.10045.2.1",zCt="1.2.840.10045.3.1.7",N7="-----BEGIN PUBLIC KEY-----";function ZCt(e){switch(e.keyType){case"rsa":return XCt(e);case"ed25519":return $Ct(e);case"ecdsa":case"ecdsa-sha2-nistp256":case"ecdsa-sha2-nistp384":return ewt(e);default:throw new MD.UnsupportedAlgorithmError(`Unsupported key type: ${e.keyType}`)}}function XCt(e){if(!e.keyVal.startsWith(N7))throw new MD.CryptoError("Invalid key format");let t=e1.default.createPublicKey(e.keyVal);switch(e.scheme){case"rsassa-pss-sha256":return{key:t,padding:e1.default.constants.RSA_PKCS1_PSS_PADDING};default:throw new MD.UnsupportedAlgorithmError(`Unsupported RSA scheme: ${e.scheme}`)}}function $Ct(e){let t;if(e.keyVal.startsWith(N7))t=e1.default.createPublicKey(e.keyVal);else{if(!ebe(e.keyVal))throw new MD.CryptoError("Invalid key format");t=e1.default.createPublicKey({key:twt.hexToDER(e.keyVal),format:"der",type:"spki"})}return{key:t}}function ewt(e){let t;if(e.keyVal.startsWith(N7))t=e1.default.createPublicKey(e.keyVal);else{if(!ebe(e.keyVal))throw new MD.CryptoError("Invalid key format");t=e1.default.createPublicKey({key:rwt.hexToDER(e.keyVal),format:"der",type:"spki"})}return{key:t}}var twt={hexToDER:e=>{let t=Buffer.from(e,"hex"),r=(0,F7.encodeOIDString)(KCt),s=Buffer.concat([Buffer.concat([Buffer.from([bO]),Buffer.from([r.length]),r]),Buffer.concat([Buffer.from([XSe]),Buffer.from([t.length+1]),Buffer.from([$Se]),t])]);return Buffer.concat([Buffer.from([bO]),Buffer.from([s.length]),s])}},rwt={hexToDER:e=>{let t=Buffer.from(e,"hex"),r=Buffer.concat([Buffer.from([XSe]),Buffer.from([t.length+1]),Buffer.from([$Se]),t]),s=Buffer.concat([(0,F7.encodeOIDString)(JCt),(0,F7.encodeOIDString)(zCt)]),a=Buffer.concat([Buffer.from([bO]),Buffer.from([s.length]),s]);return Buffer.concat([Buffer.from([bO]),Buffer.from([a.length+r.length]),a,r])}},ebe=e=>/^[0-9a-fA-F]+$/.test(e)});var DO=G(t1=>{"use strict";var nwt=t1&&t1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t1,"__esModule",{value:!0});t1.Key=void 0;var rbe=nwt(Ce("util")),_D=QA(),nbe=hf(),iwt=tbe(),O7=class e{constructor(t){let{keyID:r,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c}=t;this.keyID=r,this.keyType=s,this.scheme=a,this.keyVal=n,this.unrecognizedFields=c||{}}verifySignature(t){let r=t.signatures[this.keyID];if(!r)throw new _D.UnsignedMetadataError("no signature for key found in metadata");if(!this.keyVal.public)throw new _D.UnsignedMetadataError("no public key found");let s=(0,iwt.getPublicKey)({keyType:this.keyType,scheme:this.scheme,keyVal:this.keyVal.public}),a=t.signed.toJSON();try{if(!nbe.crypto.verifySignature(a,s,r.sig))throw new _D.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}catch(n){throw n instanceof _D.UnsignedMetadataError?n:new _D.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}}equals(t){return t instanceof e?this.keyID===t.keyID&&this.keyType===t.keyType&&this.scheme===t.scheme&&rbe.default.isDeepStrictEqual(this.keyVal,t.keyVal)&&rbe.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields):!1}toJSON(){return{keytype:this.keyType,scheme:this.scheme,keyval:this.keyVal,...this.unrecognizedFields}}static fromJSON(t,r){let{keytype:s,scheme:a,keyval:n,...c}=r;if(typeof s!="string")throw new TypeError("keytype must be a string");if(typeof a!="string")throw new TypeError("scheme must be a string");if(!nbe.guard.isStringRecord(n))throw new TypeError("keyval must be a string record");return new e({keyID:t,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c})}};t1.Key=O7});var lbe=G((Xtr,abe)=>{"use strict";abe.exports=sbe;function sbe(e,t,r){e instanceof RegExp&&(e=ibe(e,r)),t instanceof RegExp&&(t=ibe(t,r));var s=obe(e,t,r);return s&&{start:s[0],end:s[1],pre:r.slice(0,s[0]),body:r.slice(s[0]+e.length,s[1]),post:r.slice(s[1]+t.length)}}function ibe(e,t){var r=t.match(e);return r?r[0]:null}sbe.range=obe;function obe(e,t,r){var s,a,n,c,f,p=r.indexOf(e),h=r.indexOf(t,p+1),E=p;if(p>=0&&h>0){for(s=[],n=r.length;E>=0&&!f;)E==p?(s.push(E),p=r.indexOf(e,E+1)):s.length==1?f=[s.pop(),h]:(a=s.pop(),a=0?p:h;s.length&&(f=[n,c])}return f}});var gbe=G(($tr,dbe)=>{var cbe=lbe();dbe.exports=awt;var ube="\0SLASH"+Math.random()+"\0",fbe="\0OPEN"+Math.random()+"\0",M7="\0CLOSE"+Math.random()+"\0",Abe="\0COMMA"+Math.random()+"\0",pbe="\0PERIOD"+Math.random()+"\0";function L7(e){return parseInt(e,10)==e?parseInt(e,10):e.charCodeAt(0)}function swt(e){return e.split("\\\\").join(ube).split("\\{").join(fbe).split("\\}").join(M7).split("\\,").join(Abe).split("\\.").join(pbe)}function owt(e){return e.split(ube).join("\\").split(fbe).join("{").split(M7).join("}").split(Abe).join(",").split(pbe).join(".")}function hbe(e){if(!e)return[""];var t=[],r=cbe("{","}",e);if(!r)return e.split(",");var s=r.pre,a=r.body,n=r.post,c=s.split(",");c[c.length-1]+="{"+a+"}";var f=hbe(n);return n.length&&(c[c.length-1]+=f.shift(),c.push.apply(c,f)),t.push.apply(t,c),t}function awt(e){return e?(e.substr(0,2)==="{}"&&(e="\\{\\}"+e.substr(2)),HD(swt(e),!0).map(owt)):[]}function lwt(e){return"{"+e+"}"}function cwt(e){return/^-?0\d/.test(e)}function uwt(e,t){return e<=t}function fwt(e,t){return e>=t}function HD(e,t){var r=[],s=cbe("{","}",e);if(!s)return[e];var a=s.pre,n=s.post.length?HD(s.post,!1):[""];if(/\$$/.test(s.pre))for(var c=0;c=0;if(!E&&!C)return s.post.match(/,.*\}/)?(e=s.pre+"{"+s.body+M7+s.post,HD(e)):[e];var S;if(E)S=s.body.split(/\.\./);else if(S=hbe(s.body),S.length===1&&(S=HD(S[0],!1).map(lwt),S.length===1))return n.map(function(ye){return s.pre+S[0]+ye});var x;if(E){var I=L7(S[0]),R=L7(S[1]),N=Math.max(S[0].length,S[1].length),U=S.length==3?Math.abs(L7(S[2])):1,K=uwt,$=R0){var pe=new Array(ge+1).join("0");fe<0?le="-"+pe+le.slice(1):le=pe+le}}x.push(le)}}else{x=[];for(var De=0;De{"use strict";Object.defineProperty(PO,"__esModule",{value:!0});PO.assertValidPattern=void 0;var Awt=1024*64,pwt=e=>{if(typeof e!="string")throw new TypeError("invalid pattern");if(e.length>Awt)throw new TypeError("pattern is too long")};PO.assertValidPattern=pwt});var Ebe=G(xO=>{"use strict";Object.defineProperty(xO,"__esModule",{value:!0});xO.parseClass=void 0;var hwt={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},jD=e=>e.replace(/[[\]\\-]/g,"\\$&"),dwt=e=>e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),ybe=e=>e.join(""),gwt=(e,t)=>{let r=t;if(e.charAt(r)!=="[")throw new Error("not in a brace expression");let s=[],a=[],n=r+1,c=!1,f=!1,p=!1,h=!1,E=r,C="";e:for(;nC?s.push(jD(C)+"-"+jD(R)):R===C&&s.push(jD(R)),C="",n++;continue}if(e.startsWith("-]",n+1)){s.push(jD(R+"-")),n+=2;continue}if(e.startsWith("-",n+1)){C=R,n+=2;continue}s.push(jD(R)),n++}if(E{"use strict";Object.defineProperty(kO,"__esModule",{value:!0});kO.unescape=void 0;var mwt=(e,{windowsPathsNoEscape:t=!1}={})=>t?e.replace(/\[([^\/\\])\]/g,"$1"):e.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");kO.unescape=mwt});var H7=G(FO=>{"use strict";Object.defineProperty(FO,"__esModule",{value:!0});FO.AST=void 0;var ywt=Ebe(),TO=QO(),Ewt=new Set(["!","?","+","*","@"]),Ibe=e=>Ewt.has(e),Iwt="(?!(?:^|/)\\.\\.?(?:$|/))",RO="(?!\\.)",Cwt=new Set(["[","."]),wwt=new Set(["..","."]),Bwt=new Set("().*{}+?[]^$\\!"),vwt=e=>e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),_7="[^/]",Cbe=_7+"*?",wbe=_7+"+?",U7=class e{type;#e;#t;#s=!1;#r=[];#i;#n;#o;#l=!1;#a;#c;#f=!1;constructor(t,r,s={}){this.type=t,t&&(this.#t=!0),this.#i=r,this.#e=this.#i?this.#i.#e:this,this.#a=this.#e===this?s:this.#e.#a,this.#o=this.#e===this?[]:this.#e.#o,t==="!"&&!this.#e.#l&&this.#o.push(this),this.#n=this.#i?this.#i.#r.length:0}get hasMagic(){if(this.#t!==void 0)return this.#t;for(let t of this.#r)if(typeof t!="string"&&(t.type||t.hasMagic))return this.#t=!0;return this.#t}toString(){return this.#c!==void 0?this.#c:this.type?this.#c=this.type+"("+this.#r.map(t=>String(t)).join("|")+")":this.#c=this.#r.map(t=>String(t)).join("")}#p(){if(this!==this.#e)throw new Error("should only call on root");if(this.#l)return this;this.toString(),this.#l=!0;let t;for(;t=this.#o.pop();){if(t.type!=="!")continue;let r=t,s=r.#i;for(;s;){for(let a=r.#n+1;!s.type&&atypeof r=="string"?r:r.toJSON()):[this.type,...this.#r.map(r=>r.toJSON())];return this.isStart()&&!this.type&&t.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#l&&this.#i?.type==="!")&&t.push({}),t}isStart(){if(this.#e===this)return!0;if(!this.#i?.isStart())return!1;if(this.#n===0)return!0;let t=this.#i;for(let r=0;r{let[I,R,N,U]=typeof x=="string"?e.#h(x,this.#t,p):x.toRegExpSource(t);return this.#t=this.#t||N,this.#s=this.#s||U,I}).join(""),E="";if(this.isStart()&&typeof this.#r[0]=="string"&&!(this.#r.length===1&&wwt.has(this.#r[0]))){let I=Cwt,R=r&&I.has(h.charAt(0))||h.startsWith("\\.")&&I.has(h.charAt(2))||h.startsWith("\\.\\.")&&I.has(h.charAt(4)),N=!r&&!t&&I.has(h.charAt(0));E=R?Iwt:N?RO:""}let C="";return this.isEnd()&&this.#e.#l&&this.#i?.type==="!"&&(C="(?:$|\\/)"),[E+h+C,(0,TO.unescape)(h),this.#t=!!this.#t,this.#s]}let s=this.type==="*"||this.type==="+",a=this.type==="!"?"(?:(?!(?:":"(?:",n=this.#A(r);if(this.isStart()&&this.isEnd()&&!n&&this.type!=="!"){let p=this.toString();return this.#r=[p],this.type=null,this.#t=void 0,[p,(0,TO.unescape)(this.toString()),!1,!1]}let c=!s||t||r||!RO?"":this.#A(!0);c===n&&(c=""),c&&(n=`(?:${n})(?:${c})*?`);let f="";if(this.type==="!"&&this.#f)f=(this.isStart()&&!r?RO:"")+wbe;else{let p=this.type==="!"?"))"+(this.isStart()&&!r&&!t?RO:"")+Cbe+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&c?")":this.type==="*"&&c?")?":`)${this.type}`;f=a+n+p}return[f,(0,TO.unescape)(n),this.#t=!!this.#t,this.#s]}#A(t){return this.#r.map(r=>{if(typeof r=="string")throw new Error("string type in extglob ast??");let[s,a,n,c]=r.toRegExpSource(t);return this.#s=this.#s||c,s}).filter(r=>!(this.isStart()&&this.isEnd())||!!r).join("|")}static#h(t,r,s=!1){let a=!1,n="",c=!1;for(let f=0;f{"use strict";Object.defineProperty(NO,"__esModule",{value:!0});NO.escape=void 0;var Swt=(e,{windowsPathsNoEscape:t=!1}={})=>t?e.replace(/[?*()[\]]/g,"[$&]"):e.replace(/[?*()[\]\\]/g,"\\$&");NO.escape=Swt});var xbe=G(hr=>{"use strict";var bwt=hr&&hr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(hr,"__esModule",{value:!0});hr.unescape=hr.escape=hr.AST=hr.Minimatch=hr.match=hr.makeRe=hr.braceExpand=hr.defaults=hr.filter=hr.GLOBSTAR=hr.sep=hr.minimatch=void 0;var Dwt=bwt(gbe()),OO=mbe(),Sbe=H7(),Pwt=j7(),xwt=QO(),kwt=(e,t,r={})=>((0,OO.assertValidPattern)(t),!r.nocomment&&t.charAt(0)==="#"?!1:new hy(t,r).match(e));hr.minimatch=kwt;var Qwt=/^\*+([^+@!?\*\[\(]*)$/,Twt=e=>t=>!t.startsWith(".")&&t.endsWith(e),Rwt=e=>t=>t.endsWith(e),Fwt=e=>(e=e.toLowerCase(),t=>!t.startsWith(".")&&t.toLowerCase().endsWith(e)),Nwt=e=>(e=e.toLowerCase(),t=>t.toLowerCase().endsWith(e)),Owt=/^\*+\.\*+$/,Lwt=e=>!e.startsWith(".")&&e.includes("."),Mwt=e=>e!=="."&&e!==".."&&e.includes("."),Uwt=/^\.\*+$/,_wt=e=>e!=="."&&e!==".."&&e.startsWith("."),Hwt=/^\*+$/,jwt=e=>e.length!==0&&!e.startsWith("."),Gwt=e=>e.length!==0&&e!=="."&&e!=="..",qwt=/^\?+([^+@!?\*\[\(]*)?$/,Ywt=([e,t=""])=>{let r=bbe([e]);return t?(t=t.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(t)):r},Wwt=([e,t=""])=>{let r=Dbe([e]);return t?(t=t.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(t)):r},Vwt=([e,t=""])=>{let r=Dbe([e]);return t?s=>r(s)&&s.endsWith(t):r},Kwt=([e,t=""])=>{let r=bbe([e]);return t?s=>r(s)&&s.endsWith(t):r},bbe=([e])=>{let t=e.length;return r=>r.length===t&&!r.startsWith(".")},Dbe=([e])=>{let t=e.length;return r=>r.length===t&&r!=="."&&r!==".."},Pbe=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",Bbe={win32:{sep:"\\"},posix:{sep:"/"}};hr.sep=Pbe==="win32"?Bbe.win32.sep:Bbe.posix.sep;hr.minimatch.sep=hr.sep;hr.GLOBSTAR=Symbol("globstar **");hr.minimatch.GLOBSTAR=hr.GLOBSTAR;var Jwt="[^/]",zwt=Jwt+"*?",Zwt="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",Xwt="(?:(?!(?:\\/|^)\\.).)*?",$wt=(e,t={})=>r=>(0,hr.minimatch)(r,e,t);hr.filter=$wt;hr.minimatch.filter=hr.filter;var tu=(e,t={})=>Object.assign({},e,t),e1t=e=>{if(!e||typeof e!="object"||!Object.keys(e).length)return hr.minimatch;let t=hr.minimatch;return Object.assign((s,a,n={})=>t(s,a,tu(e,n)),{Minimatch:class extends t.Minimatch{constructor(a,n={}){super(a,tu(e,n))}static defaults(a){return t.defaults(tu(e,a)).Minimatch}},AST:class extends t.AST{constructor(a,n,c={}){super(a,n,tu(e,c))}static fromGlob(a,n={}){return t.AST.fromGlob(a,tu(e,n))}},unescape:(s,a={})=>t.unescape(s,tu(e,a)),escape:(s,a={})=>t.escape(s,tu(e,a)),filter:(s,a={})=>t.filter(s,tu(e,a)),defaults:s=>t.defaults(tu(e,s)),makeRe:(s,a={})=>t.makeRe(s,tu(e,a)),braceExpand:(s,a={})=>t.braceExpand(s,tu(e,a)),match:(s,a,n={})=>t.match(s,a,tu(e,n)),sep:t.sep,GLOBSTAR:hr.GLOBSTAR})};hr.defaults=e1t;hr.minimatch.defaults=hr.defaults;var t1t=(e,t={})=>((0,OO.assertValidPattern)(e),t.nobrace||!/\{(?:(?!\{).)*\}/.test(e)?[e]:(0,Dwt.default)(e));hr.braceExpand=t1t;hr.minimatch.braceExpand=hr.braceExpand;var r1t=(e,t={})=>new hy(e,t).makeRe();hr.makeRe=r1t;hr.minimatch.makeRe=hr.makeRe;var n1t=(e,t,r={})=>{let s=new hy(t,r);return e=e.filter(a=>s.match(a)),s.options.nonull&&!e.length&&e.push(t),e};hr.match=n1t;hr.minimatch.match=hr.match;var vbe=/[?*]|[+@!]\(.*?\)|\[|\]/,i1t=e=>e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),hy=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(t,r={}){(0,OO.assertValidPattern)(t),r=r||{},this.options=r,this.pattern=t,this.platform=r.platform||Pbe,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!r.windowsPathsNoEscape||r.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!r.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!r.nonegate,this.comment=!1,this.empty=!1,this.partial=!!r.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=r.windowsNoMagicRoot!==void 0?r.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let t of this.set)for(let r of t)if(typeof r!="string")return!0;return!1}debug(...t){}make(){let t=this.pattern,r=this.options;if(!r.nocomment&&t.charAt(0)==="#"){this.comment=!0;return}if(!t){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],r.debug&&(this.debug=(...n)=>console.error(...n)),this.debug(this.pattern,this.globSet);let s=this.globSet.map(n=>this.slashSplit(n));this.globParts=this.preprocess(s),this.debug(this.pattern,this.globParts);let a=this.globParts.map((n,c,f)=>{if(this.isWindows&&this.windowsNoMagicRoot){let p=n[0]===""&&n[1]===""&&(n[2]==="?"||!vbe.test(n[2]))&&!vbe.test(n[3]),h=/^[a-z]:/i.test(n[0]);if(p)return[...n.slice(0,4),...n.slice(4).map(E=>this.parse(E))];if(h)return[n[0],...n.slice(1).map(E=>this.parse(E))]}return n.map(p=>this.parse(p))});if(this.debug(this.pattern,a),this.set=a.filter(n=>n.indexOf(!1)===-1),this.isWindows)for(let n=0;n=2?(t=this.firstPhasePreProcess(t),t=this.secondPhasePreProcess(t)):r>=1?t=this.levelOneOptimize(t):t=this.adjascentGlobstarOptimize(t),t}adjascentGlobstarOptimize(t){return t.map(r=>{let s=-1;for(;(s=r.indexOf("**",s+1))!==-1;){let a=s;for(;r[a+1]==="**";)a++;a!==s&&r.splice(s,a-s)}return r})}levelOneOptimize(t){return t.map(r=>(r=r.reduce((s,a)=>{let n=s[s.length-1];return a==="**"&&n==="**"?s:a===".."&&n&&n!==".."&&n!=="."&&n!=="**"?(s.pop(),s):(s.push(a),s)},[]),r.length===0?[""]:r))}levelTwoFileOptimize(t){Array.isArray(t)||(t=this.slashSplit(t));let r=!1;do{if(r=!1,!this.preserveMultipleSlashes){for(let a=1;aa&&s.splice(a+1,c-a);let f=s[a+1],p=s[a+2],h=s[a+3];if(f!==".."||!p||p==="."||p===".."||!h||h==="."||h==="..")continue;r=!0,s.splice(a,1);let E=s.slice(0);E[a]="**",t.push(E),a--}if(!this.preserveMultipleSlashes){for(let c=1;cr.length)}partsMatch(t,r,s=!1){let a=0,n=0,c=[],f="";for(;a$?r=r.slice(ie):$>ie&&(t=t.slice($)))}}let{optimizationLevel:n=1}=this.options;n>=2&&(t=this.levelTwoFileOptimize(t)),this.debug("matchOne",this,{file:t,pattern:r}),this.debug("matchOne",t.length,r.length);for(var c=0,f=0,p=t.length,h=r.length;c>> no match, partial?`,t,S,r,x),S===p))}let R;if(typeof E=="string"?(R=C===E,this.debug("string match",E,C,R)):(R=E.test(C),this.debug("pattern match",E,C,R)),!R)return!1}if(c===p&&f===h)return!0;if(c===p)return s;if(f===h)return c===p-1&&t[c]==="";throw new Error("wtf?")}braceExpand(){return(0,hr.braceExpand)(this.pattern,this.options)}parse(t){(0,OO.assertValidPattern)(t);let r=this.options;if(t==="**")return hr.GLOBSTAR;if(t==="")return"";let s,a=null;(s=t.match(Hwt))?a=r.dot?Gwt:jwt:(s=t.match(Qwt))?a=(r.nocase?r.dot?Nwt:Fwt:r.dot?Rwt:Twt)(s[1]):(s=t.match(qwt))?a=(r.nocase?r.dot?Wwt:Ywt:r.dot?Vwt:Kwt)(s):(s=t.match(Owt))?a=r.dot?Mwt:Lwt:(s=t.match(Uwt))&&(a=_wt);let n=Sbe.AST.fromGlob(t,this.options).toMMPattern();return a&&typeof n=="object"&&Reflect.defineProperty(n,"test",{value:a}),n}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let t=this.set;if(!t.length)return this.regexp=!1,this.regexp;let r=this.options,s=r.noglobstar?zwt:r.dot?Zwt:Xwt,a=new Set(r.nocase?["i"]:[]),n=t.map(p=>{let h=p.map(E=>{if(E instanceof RegExp)for(let C of E.flags.split(""))a.add(C);return typeof E=="string"?i1t(E):E===hr.GLOBSTAR?hr.GLOBSTAR:E._src});return h.forEach((E,C)=>{let S=h[C+1],x=h[C-1];E!==hr.GLOBSTAR||x===hr.GLOBSTAR||(x===void 0?S!==void 0&&S!==hr.GLOBSTAR?h[C+1]="(?:\\/|"+s+"\\/)?"+S:h[C]=s:S===void 0?h[C-1]=x+"(?:\\/|"+s+")?":S!==hr.GLOBSTAR&&(h[C-1]=x+"(?:\\/|\\/"+s+"\\/)"+S,h[C+1]=hr.GLOBSTAR))}),h.filter(E=>E!==hr.GLOBSTAR).join("/")}).join("|"),[c,f]=t.length>1?["(?:",")"]:["",""];n="^"+c+n+f+"$",this.negate&&(n="^(?!"+n+").+$");try{this.regexp=new RegExp(n,[...a].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(t){return this.preserveMultipleSlashes?t.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(t)?["",...t.split(/\/+/)]:t.split(/\/+/)}match(t,r=this.partial){if(this.debug("match",t,this.pattern),this.comment)return!1;if(this.empty)return t==="";if(t==="/"&&r)return!0;let s=this.options;this.isWindows&&(t=t.split("\\").join("/"));let a=this.slashSplit(t);this.debug(this.pattern,"split",a);let n=this.set;this.debug(this.pattern,"set",n);let c=a[a.length-1];if(!c)for(let f=a.length-2;!c&&f>=0;f--)c=a[f];for(let f=0;f{"use strict";var kbe=ru&&ru.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ru,"__esModule",{value:!0});ru.SuccinctRoles=ru.DelegatedRole=ru.Role=ru.TOP_LEVEL_ROLE_NAMES=void 0;var Qbe=kbe(Ce("crypto")),l1t=xbe(),LO=kbe(Ce("util")),MO=QA(),dy=hf();ru.TOP_LEVEL_ROLE_NAMES=["root","targets","snapshot","timestamp"];var GD=class e{constructor(t){let{keyIDs:r,threshold:s,unrecognizedFields:a}=t;if(c1t(r))throw new MO.ValueError("duplicate key IDs found");if(s<1)throw new MO.ValueError("threshold must be at least 1");this.keyIDs=r,this.threshold=s,this.unrecognizedFields=a||{}}equals(t){return t instanceof e?this.threshold===t.threshold&&LO.default.isDeepStrictEqual(this.keyIDs,t.keyIDs)&&LO.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields):!1}toJSON(){return{keyids:this.keyIDs,threshold:this.threshold,...this.unrecognizedFields}}static fromJSON(t){let{keyids:r,threshold:s,...a}=t;if(!dy.guard.isStringArray(r))throw new TypeError("keyids must be an array");if(typeof s!="number")throw new TypeError("threshold must be a number");return new e({keyIDs:r,threshold:s,unrecognizedFields:a})}};ru.Role=GD;function c1t(e){return new Set(e).size!==e.length}var G7=class e extends GD{constructor(t){super(t);let{name:r,terminating:s,paths:a,pathHashPrefixes:n}=t;if(this.name=r,this.terminating=s,t.paths&&t.pathHashPrefixes)throw new MO.ValueError("paths and pathHashPrefixes are mutually exclusive");this.paths=a,this.pathHashPrefixes=n}equals(t){return t instanceof e?super.equals(t)&&this.name===t.name&&this.terminating===t.terminating&&LO.default.isDeepStrictEqual(this.paths,t.paths)&&LO.default.isDeepStrictEqual(this.pathHashPrefixes,t.pathHashPrefixes):!1}isDelegatedPath(t){if(this.paths)return this.paths.some(r=>f1t(t,r));if(this.pathHashPrefixes){let s=Qbe.default.createHash("sha256").update(t).digest("hex");return this.pathHashPrefixes.some(a=>s.startsWith(a))}return!1}toJSON(){let t={...super.toJSON(),name:this.name,terminating:this.terminating};return this.paths&&(t.paths=this.paths),this.pathHashPrefixes&&(t.path_hash_prefixes=this.pathHashPrefixes),t}static fromJSON(t){let{keyids:r,threshold:s,name:a,terminating:n,paths:c,path_hash_prefixes:f,...p}=t;if(!dy.guard.isStringArray(r))throw new TypeError("keyids must be an array of strings");if(typeof s!="number")throw new TypeError("threshold must be a number");if(typeof a!="string")throw new TypeError("name must be a string");if(typeof n!="boolean")throw new TypeError("terminating must be a boolean");if(dy.guard.isDefined(c)&&!dy.guard.isStringArray(c))throw new TypeError("paths must be an array of strings");if(dy.guard.isDefined(f)&&!dy.guard.isStringArray(f))throw new TypeError("path_hash_prefixes must be an array of strings");return new e({keyIDs:r,threshold:s,name:a,terminating:n,paths:c,pathHashPrefixes:f,unrecognizedFields:p})}};ru.DelegatedRole=G7;var u1t=(e,t)=>e.map((r,s)=>[r,t[s]]);function f1t(e,t){let r=e.split("/"),s=t.split("/");return s.length!=r.length?!1:u1t(r,s).every(([a,n])=>(0,l1t.minimatch)(a,n))}var q7=class e extends GD{constructor(t){super(t);let{bitLength:r,namePrefix:s}=t;if(r<=0||r>32)throw new MO.ValueError("bitLength must be between 1 and 32");this.bitLength=r,this.namePrefix=s,this.numberOfBins=Math.pow(2,r),this.suffixLen=(this.numberOfBins-1).toString(16).length}equals(t){return t instanceof e?super.equals(t)&&this.bitLength===t.bitLength&&this.namePrefix===t.namePrefix:!1}getRoleForTarget(t){let a=Qbe.default.createHash("sha256").update(t).digest().subarray(0,4),n=32-this.bitLength,f=(a.readUInt32BE()>>>n).toString(16).padStart(this.suffixLen,"0");return`${this.namePrefix}-${f}`}*getRoles(){for(let t=0;t{"use strict";var A1t=r1&&r1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r1,"__esModule",{value:!0});r1.Root=void 0;var Tbe=A1t(Ce("util")),W7=py(),Rbe=QA(),p1t=DO(),UO=Y7(),_O=hf(),V7=class e extends W7.Signed{constructor(t){if(super(t),this.type=W7.MetadataKind.Root,this.keys=t.keys||{},this.consistentSnapshot=t.consistentSnapshot??!0,!t.roles)this.roles=UO.TOP_LEVEL_ROLE_NAMES.reduce((r,s)=>({...r,[s]:new UO.Role({keyIDs:[],threshold:1})}),{});else{let r=new Set(Object.keys(t.roles));if(!UO.TOP_LEVEL_ROLE_NAMES.every(s=>r.has(s)))throw new Rbe.ValueError("missing top-level role");this.roles=t.roles}}addKey(t,r){if(!this.roles[r])throw new Rbe.ValueError(`role ${r} does not exist`);this.roles[r].keyIDs.includes(t.keyID)||this.roles[r].keyIDs.push(t.keyID),this.keys[t.keyID]=t}equals(t){return t instanceof e?super.equals(t)&&this.consistentSnapshot===t.consistentSnapshot&&Tbe.default.isDeepStrictEqual(this.keys,t.keys)&&Tbe.default.isDeepStrictEqual(this.roles,t.roles):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,keys:h1t(this.keys),roles:d1t(this.roles),consistent_snapshot:this.consistentSnapshot,...this.unrecognizedFields}}static fromJSON(t){let{unrecognizedFields:r,...s}=W7.Signed.commonFieldsFromJSON(t),{keys:a,roles:n,consistent_snapshot:c,...f}=r;if(typeof c!="boolean")throw new TypeError("consistent_snapshot must be a boolean");return new e({...s,keys:g1t(a),roles:m1t(n),consistentSnapshot:c,unrecognizedFields:f})}};r1.Root=V7;function h1t(e){return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:s.toJSON()}),{})}function d1t(e){return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:s.toJSON()}),{})}function g1t(e){let t;if(_O.guard.isDefined(e)){if(!_O.guard.isObjectRecord(e))throw new TypeError("keys must be an object");t=Object.entries(e).reduce((r,[s,a])=>({...r,[s]:p1t.Key.fromJSON(s,a)}),{})}return t}function m1t(e){let t;if(_O.guard.isDefined(e)){if(!_O.guard.isObjectRecord(e))throw new TypeError("roles must be an object");t=Object.entries(e).reduce((r,[s,a])=>({...r,[s]:UO.Role.fromJSON(a)}),{})}return t}});var z7=G(HO=>{"use strict";Object.defineProperty(HO,"__esModule",{value:!0});HO.Signature=void 0;var J7=class e{constructor(t){let{keyID:r,sig:s}=t;this.keyID=r,this.sig=s}toJSON(){return{keyid:this.keyID,sig:this.sig}}static fromJSON(t){let{keyid:r,sig:s}=t;if(typeof r!="string")throw new TypeError("keyid must be a string");if(typeof s!="string")throw new TypeError("sig must be a string");return new e({keyID:r,sig:s})}};HO.Signature=J7});var $7=G(n1=>{"use strict";var y1t=n1&&n1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(n1,"__esModule",{value:!0});n1.Snapshot=void 0;var E1t=y1t(Ce("util")),Z7=py(),Nbe=LD(),Fbe=hf(),X7=class e extends Z7.Signed{constructor(t){super(t),this.type=Z7.MetadataKind.Snapshot,this.meta=t.meta||{"targets.json":new Nbe.MetaFile({version:1})}}equals(t){return t instanceof e?super.equals(t)&&E1t.default.isDeepStrictEqual(this.meta,t.meta):!1}toJSON(){return{_type:this.type,meta:I1t(this.meta),spec_version:this.specVersion,version:this.version,expires:this.expires,...this.unrecognizedFields}}static fromJSON(t){let{unrecognizedFields:r,...s}=Z7.Signed.commonFieldsFromJSON(t),{meta:a,...n}=r;return new e({...s,meta:C1t(a),unrecognizedFields:n})}};n1.Snapshot=X7;function I1t(e){return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:s.toJSON()}),{})}function C1t(e){let t;if(Fbe.guard.isDefined(e))if(Fbe.guard.isObjectRecord(e))t=Object.entries(e).reduce((r,[s,a])=>({...r,[s]:Nbe.MetaFile.fromJSON(a)}),{});else throw new TypeError("meta field is malformed");return t}});var Obe=G(i1=>{"use strict";var w1t=i1&&i1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(i1,"__esModule",{value:!0});i1.Delegations=void 0;var jO=w1t(Ce("util")),B1t=QA(),v1t=DO(),eK=Y7(),GO=hf(),tK=class e{constructor(t){if(this.keys=t.keys,this.unrecognizedFields=t.unrecognizedFields||{},t.roles&&Object.keys(t.roles).some(r=>eK.TOP_LEVEL_ROLE_NAMES.includes(r)))throw new B1t.ValueError("Delegated role name conflicts with top-level role name");this.succinctRoles=t.succinctRoles,this.roles=t.roles}equals(t){return t instanceof e?jO.default.isDeepStrictEqual(this.keys,t.keys)&&jO.default.isDeepStrictEqual(this.roles,t.roles)&&jO.default.isDeepStrictEqual(this.unrecognizedFields,t.unrecognizedFields)&&jO.default.isDeepStrictEqual(this.succinctRoles,t.succinctRoles):!1}*rolesForTarget(t){if(this.roles)for(let r of Object.values(this.roles))r.isDelegatedPath(t)&&(yield{role:r.name,terminating:r.terminating});else this.succinctRoles&&(yield{role:this.succinctRoles.getRoleForTarget(t),terminating:!0})}toJSON(){let t={keys:S1t(this.keys),...this.unrecognizedFields};return this.roles?t.roles=b1t(this.roles):this.succinctRoles&&(t.succinct_roles=this.succinctRoles.toJSON()),t}static fromJSON(t){let{keys:r,roles:s,succinct_roles:a,...n}=t,c;return GO.guard.isObject(a)&&(c=eK.SuccinctRoles.fromJSON(a)),new e({keys:D1t(r),roles:P1t(s),unrecognizedFields:n,succinctRoles:c})}};i1.Delegations=tK;function S1t(e){return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:s.toJSON()}),{})}function b1t(e){return Object.values(e).map(t=>t.toJSON())}function D1t(e){if(!GO.guard.isObjectRecord(e))throw new TypeError("keys is malformed");return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:v1t.Key.fromJSON(r,s)}),{})}function P1t(e){let t;if(GO.guard.isDefined(e)){if(!GO.guard.isObjectArray(e))throw new TypeError("roles is malformed");t=e.reduce((r,s)=>{let a=eK.DelegatedRole.fromJSON(s);return{...r,[a.name]:a}},{})}return t}});var iK=G(s1=>{"use strict";var x1t=s1&&s1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(s1,"__esModule",{value:!0});s1.Targets=void 0;var Lbe=x1t(Ce("util")),rK=py(),k1t=Obe(),Q1t=LD(),qO=hf(),nK=class e extends rK.Signed{constructor(t){super(t),this.type=rK.MetadataKind.Targets,this.targets=t.targets||{},this.delegations=t.delegations}addTarget(t){this.targets[t.path]=t}equals(t){return t instanceof e?super.equals(t)&&Lbe.default.isDeepStrictEqual(this.targets,t.targets)&&Lbe.default.isDeepStrictEqual(this.delegations,t.delegations):!1}toJSON(){let t={_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,targets:T1t(this.targets),...this.unrecognizedFields};return this.delegations&&(t.delegations=this.delegations.toJSON()),t}static fromJSON(t){let{unrecognizedFields:r,...s}=rK.Signed.commonFieldsFromJSON(t),{targets:a,delegations:n,...c}=r;return new e({...s,targets:R1t(a),delegations:F1t(n),unrecognizedFields:c})}};s1.Targets=nK;function T1t(e){return Object.entries(e).reduce((t,[r,s])=>({...t,[r]:s.toJSON()}),{})}function R1t(e){let t;if(qO.guard.isDefined(e))if(qO.guard.isObjectRecord(e))t=Object.entries(e).reduce((r,[s,a])=>({...r,[s]:Q1t.TargetFile.fromJSON(s,a)}),{});else throw new TypeError("targets must be an object");return t}function F1t(e){let t;if(qO.guard.isDefined(e))if(qO.guard.isObject(e))t=k1t.Delegations.fromJSON(e);else throw new TypeError("delegations must be an object");return t}});var lK=G(YO=>{"use strict";Object.defineProperty(YO,"__esModule",{value:!0});YO.Timestamp=void 0;var sK=py(),Mbe=LD(),oK=hf(),aK=class e extends sK.Signed{constructor(t){super(t),this.type=sK.MetadataKind.Timestamp,this.snapshotMeta=t.snapshotMeta||new Mbe.MetaFile({version:1})}equals(t){return t instanceof e?super.equals(t)&&this.snapshotMeta.equals(t.snapshotMeta):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,meta:{"snapshot.json":this.snapshotMeta.toJSON()},...this.unrecognizedFields}}static fromJSON(t){let{unrecognizedFields:r,...s}=sK.Signed.commonFieldsFromJSON(t),{meta:a,...n}=r;return new e({...s,snapshotMeta:N1t(a),unrecognizedFields:n})}};YO.Timestamp=aK;function N1t(e){let t;if(oK.guard.isDefined(e)){let r=e["snapshot.json"];if(!oK.guard.isDefined(r)||!oK.guard.isObject(r))throw new TypeError("missing snapshot.json in meta");t=Mbe.MetaFile.fromJSON(r)}return t}});var _be=G(a1=>{"use strict";var O1t=a1&&a1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a1,"__esModule",{value:!0});a1.Metadata=void 0;var L1t=D7(),Ube=O1t(Ce("util")),o1=py(),qD=QA(),M1t=K7(),U1t=z7(),_1t=$7(),H1t=iK(),j1t=lK(),cK=hf(),uK=class e{constructor(t,r,s){this.signed=t,this.signatures=r||{},this.unrecognizedFields=s||{}}sign(t,r=!0){let s=Buffer.from((0,L1t.canonicalize)(this.signed.toJSON())),a=t(s);r||(this.signatures={}),this.signatures[a.keyID]=a}verifyDelegate(t,r){let s,a={};switch(this.signed.type){case o1.MetadataKind.Root:a=this.signed.keys,s=this.signed.roles[t];break;case o1.MetadataKind.Targets:if(!this.signed.delegations)throw new qD.ValueError(`No delegations found for ${t}`);a=this.signed.delegations.keys,this.signed.delegations.roles?s=this.signed.delegations.roles[t]:this.signed.delegations.succinctRoles&&this.signed.delegations.succinctRoles.isDelegatedRole(t)&&(s=this.signed.delegations.succinctRoles);break;default:throw new TypeError("invalid metadata type")}if(!s)throw new qD.ValueError(`no delegation found for ${t}`);let n=new Set;if(s.keyIDs.forEach(c=>{let f=a[c];if(f)try{f.verifySignature(r),n.add(f.keyID)}catch{}}),n.sizer.toJSON()),signed:this.signed.toJSON(),...this.unrecognizedFields}}static fromJSON(t,r){let{signed:s,signatures:a,...n}=r;if(!cK.guard.isDefined(s)||!cK.guard.isObject(s))throw new TypeError("signed is not defined");if(t!==s._type)throw new qD.ValueError(`expected '${t}', got ${s._type}`);if(!cK.guard.isObjectArray(a))throw new TypeError("signatures is not an array");let c;switch(t){case o1.MetadataKind.Root:c=M1t.Root.fromJSON(s);break;case o1.MetadataKind.Timestamp:c=j1t.Timestamp.fromJSON(s);break;case o1.MetadataKind.Snapshot:c=_1t.Snapshot.fromJSON(s);break;case o1.MetadataKind.Targets:c=H1t.Targets.fromJSON(s);break;default:throw new TypeError("invalid metadata type")}let f={};return a.forEach(p=>{let h=U1t.Signature.fromJSON(p);if(f[h.keyID])throw new qD.ValueError(`multiple signatures found for keyid: ${h.keyID}`);f[h.keyID]=h}),new e(c,f,n)}};a1.Metadata=uK});var WO=G(Fi=>{"use strict";Object.defineProperty(Fi,"__esModule",{value:!0});Fi.Timestamp=Fi.Targets=Fi.Snapshot=Fi.Signature=Fi.Root=Fi.Metadata=Fi.Key=Fi.TargetFile=Fi.MetaFile=Fi.ValueError=Fi.MetadataKind=void 0;var G1t=py();Object.defineProperty(Fi,"MetadataKind",{enumerable:!0,get:function(){return G1t.MetadataKind}});var q1t=QA();Object.defineProperty(Fi,"ValueError",{enumerable:!0,get:function(){return q1t.ValueError}});var Hbe=LD();Object.defineProperty(Fi,"MetaFile",{enumerable:!0,get:function(){return Hbe.MetaFile}});Object.defineProperty(Fi,"TargetFile",{enumerable:!0,get:function(){return Hbe.TargetFile}});var Y1t=DO();Object.defineProperty(Fi,"Key",{enumerable:!0,get:function(){return Y1t.Key}});var W1t=_be();Object.defineProperty(Fi,"Metadata",{enumerable:!0,get:function(){return W1t.Metadata}});var V1t=K7();Object.defineProperty(Fi,"Root",{enumerable:!0,get:function(){return V1t.Root}});var K1t=z7();Object.defineProperty(Fi,"Signature",{enumerable:!0,get:function(){return K1t.Signature}});var J1t=$7();Object.defineProperty(Fi,"Snapshot",{enumerable:!0,get:function(){return J1t.Snapshot}});var z1t=iK();Object.defineProperty(Fi,"Targets",{enumerable:!0,get:function(){return z1t.Targets}});var Z1t=lK();Object.defineProperty(Fi,"Timestamp",{enumerable:!0,get:function(){return Z1t.Timestamp}})});var Gbe=G((yrr,jbe)=>{var l1=1e3,c1=l1*60,u1=c1*60,gy=u1*24,X1t=gy*7,$1t=gy*365.25;jbe.exports=function(e,t){t=t||{};var r=typeof e;if(r==="string"&&e.length>0)return e2t(e);if(r==="number"&&isFinite(e))return t.long?r2t(e):t2t(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function e2t(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var r=parseFloat(t[1]),s=(t[2]||"ms").toLowerCase();switch(s){case"years":case"year":case"yrs":case"yr":case"y":return r*$1t;case"weeks":case"week":case"w":return r*X1t;case"days":case"day":case"d":return r*gy;case"hours":case"hour":case"hrs":case"hr":case"h":return r*u1;case"minutes":case"minute":case"mins":case"min":case"m":return r*c1;case"seconds":case"second":case"secs":case"sec":case"s":return r*l1;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function t2t(e){var t=Math.abs(e);return t>=gy?Math.round(e/gy)+"d":t>=u1?Math.round(e/u1)+"h":t>=c1?Math.round(e/c1)+"m":t>=l1?Math.round(e/l1)+"s":e+"ms"}function r2t(e){var t=Math.abs(e);return t>=gy?VO(e,t,gy,"day"):t>=u1?VO(e,t,u1,"hour"):t>=c1?VO(e,t,c1,"minute"):t>=l1?VO(e,t,l1,"second"):e+" ms"}function VO(e,t,r,s){var a=t>=r*1.5;return Math.round(e/r)+" "+s+(a?"s":"")}});var fK=G((Err,qbe)=>{function n2t(e){r.debug=r,r.default=r,r.coerce=p,r.disable=c,r.enable=a,r.enabled=f,r.humanize=Gbe(),r.destroy=h,Object.keys(e).forEach(E=>{r[E]=e[E]}),r.names=[],r.skips=[],r.formatters={};function t(E){let C=0;for(let S=0;S{if(le==="%%")return"%";ie++;let pe=r.formatters[ge];if(typeof pe=="function"){let De=N[ie];le=pe.call(U,De),N.splice(ie,1),ie--}return le}),r.formatArgs.call(U,N),(U.log||r.log).apply(U,N)}return R.namespace=E,R.useColors=r.useColors(),R.color=r.selectColor(E),R.extend=s,R.destroy=r.destroy,Object.defineProperty(R,"enabled",{enumerable:!0,configurable:!1,get:()=>S!==null?S:(x!==r.namespaces&&(x=r.namespaces,I=r.enabled(E)),I),set:N=>{S=N}}),typeof r.init=="function"&&r.init(R),R}function s(E,C){let S=r(this.namespace+(typeof C>"u"?":":C)+E);return S.log=this.log,S}function a(E){r.save(E),r.namespaces=E,r.names=[],r.skips=[];let C=(typeof E=="string"?E:"").trim().replace(" ",",").split(",").filter(Boolean);for(let S of C)S[0]==="-"?r.skips.push(S.slice(1)):r.names.push(S)}function n(E,C){let S=0,x=0,I=-1,R=0;for(;S"-"+C)].join(",");return r.enable(""),E}function f(E){for(let C of r.skips)if(n(E,C))return!1;for(let C of r.names)if(n(E,C))return!0;return!1}function p(E){return E instanceof Error?E.stack||E.message:E}function h(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}qbe.exports=n2t});var Ybe=G((lc,KO)=>{lc.formatArgs=s2t;lc.save=o2t;lc.load=a2t;lc.useColors=i2t;lc.storage=l2t();lc.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();lc.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function i2t(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function s2t(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+KO.exports.humanize(this.diff),!this.useColors)return;let t="color: "+this.color;e.splice(1,0,t,"color: inherit");let r=0,s=0;e[0].replace(/%[a-zA-Z%]/g,a=>{a!=="%%"&&(r++,a==="%c"&&(s=r))}),e.splice(s,0,t)}lc.log=console.debug||console.log||(()=>{});function o2t(e){try{e?lc.storage.setItem("debug",e):lc.storage.removeItem("debug")}catch{}}function a2t(){let e;try{e=lc.storage.getItem("debug")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function l2t(){try{return localStorage}catch{}}KO.exports=fK()(lc);var{formatters:c2t}=KO.exports;c2t.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var Vbe=G((oo,zO)=>{var u2t=Ce("tty"),JO=Ce("util");oo.init=m2t;oo.log=h2t;oo.formatArgs=A2t;oo.save=d2t;oo.load=g2t;oo.useColors=f2t;oo.destroy=JO.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");oo.colors=[6,2,3,4,5,1];try{let e=Ce("supports-color");e&&(e.stderr||e).level>=2&&(oo.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}oo.inspectOpts=Object.keys(process.env).filter(e=>/^debug_/i.test(e)).reduce((e,t)=>{let r=t.substring(6).toLowerCase().replace(/_([a-z])/g,(a,n)=>n.toUpperCase()),s=process.env[t];return/^(yes|on|true|enabled)$/i.test(s)?s=!0:/^(no|off|false|disabled)$/i.test(s)?s=!1:s==="null"?s=null:s=Number(s),e[r]=s,e},{});function f2t(){return"colors"in oo.inspectOpts?!!oo.inspectOpts.colors:u2t.isatty(process.stderr.fd)}function A2t(e){let{namespace:t,useColors:r}=this;if(r){let s=this.color,a="\x1B[3"+(s<8?s:"8;5;"+s),n=` ${a};1m${t} \x1B[0m`;e[0]=n+e[0].split(` +`).join(` +`+n),e.push(a+"m+"+zO.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=p2t()+t+" "+e[0]}function p2t(){return oo.inspectOpts.hideDate?"":new Date().toISOString()+" "}function h2t(...e){return process.stderr.write(JO.formatWithOptions(oo.inspectOpts,...e)+` +`)}function d2t(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function g2t(){return process.env.DEBUG}function m2t(e){e.inspectOpts={};let t=Object.keys(oo.inspectOpts);for(let r=0;rt.trim()).join(" ")};Wbe.O=function(e){return this.inspectOpts.colors=this.useColors,JO.inspect(e,this.inspectOpts)}});var pK=G((Irr,AK)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?AK.exports=Ybe():AK.exports=Vbe()});var XO=G(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.DownloadHTTPError=Ji.DownloadLengthMismatchError=Ji.DownloadError=Ji.ExpiredMetadataError=Ji.EqualVersionError=Ji.BadVersionError=Ji.RepositoryError=Ji.PersistError=Ji.RuntimeError=Ji.ValueError=void 0;var hK=class extends Error{};Ji.ValueError=hK;var dK=class extends Error{};Ji.RuntimeError=dK;var gK=class extends Error{};Ji.PersistError=gK;var YD=class extends Error{};Ji.RepositoryError=YD;var ZO=class extends YD{};Ji.BadVersionError=ZO;var mK=class extends ZO{};Ji.EqualVersionError=mK;var yK=class extends YD{};Ji.ExpiredMetadataError=yK;var WD=class extends Error{};Ji.DownloadError=WD;var EK=class extends WD{};Ji.DownloadLengthMismatchError=EK;var IK=class extends WD{constructor(t,r){super(t),this.statusCode=r}};Ji.DownloadHTTPError=IK});var Jbe=G(f1=>{"use strict";var wK=f1&&f1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(f1,"__esModule",{value:!0});f1.withTempFile=void 0;var CK=wK(Ce("fs/promises")),y2t=wK(Ce("os")),Kbe=wK(Ce("path")),E2t=async e=>I2t(async t=>e(Kbe.default.join(t,"tempfile")));f1.withTempFile=E2t;var I2t=async e=>{let t=await CK.default.realpath(y2t.default.tmpdir()),r=await CK.default.mkdtemp(t+Kbe.default.sep);try{return await e(r)}finally{await CK.default.rm(r,{force:!0,recursive:!0,maxRetries:3})}}});var vK=G(Qg=>{"use strict";var eL=Qg&&Qg.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Qg,"__esModule",{value:!0});Qg.DefaultFetcher=Qg.BaseFetcher=void 0;var C2t=eL(pK()),zbe=eL(Ce("fs")),w2t=eL(pO()),B2t=eL(Ce("util")),Zbe=XO(),v2t=Jbe(),S2t=(0,C2t.default)("tuf:fetch"),$O=class{async downloadFile(t,r,s){return(0,v2t.withTempFile)(async a=>{let n=await this.fetch(t),c=0,f=zbe.default.createWriteStream(a);try{for await(let p of n){let h=Buffer.from(p);if(c+=h.length,c>r)throw new Zbe.DownloadLengthMismatchError("Max length reached");await b2t(f,h)}}finally{await B2t.default.promisify(f.close).bind(f)()}return s(a)})}async downloadBytes(t,r){return this.downloadFile(t,r,async s=>{let a=zbe.default.createReadStream(s),n=[];for await(let c of a)n.push(c);return Buffer.concat(n)})}};Qg.BaseFetcher=$O;var BK=class extends $O{constructor(t={}){super(),this.timeout=t.timeout,this.retry=t.retry}async fetch(t){S2t("GET %s",t);let r=await(0,w2t.default)(t,{timeout:this.timeout,retry:this.retry});if(!r.ok||!r?.body)throw new Zbe.DownloadHTTPError("Failed to download",r.status);return r.body}};Qg.DefaultFetcher=BK;var b2t=async(e,t)=>new Promise((r,s)=>{e.write(t,a=>{a&&s(a),r(!0)})})});var Xbe=G(tL=>{"use strict";Object.defineProperty(tL,"__esModule",{value:!0});tL.defaultConfig=void 0;tL.defaultConfig={maxRootRotations:256,maxDelegations:32,rootMaxLength:512e3,timestampMaxLength:16384,snapshotMaxLength:2e6,targetsMaxLength:5e6,prefixTargetsWithHash:!0,fetchTimeout:1e5,fetchRetries:void 0,fetchRetry:2}});var $be=G(rL=>{"use strict";Object.defineProperty(rL,"__esModule",{value:!0});rL.TrustedMetadataStore=void 0;var Bs=WO(),Hi=XO(),SK=class{constructor(t){this.trustedSet={},this.referenceTime=new Date,this.loadTrustedRoot(t)}get root(){if(!this.trustedSet.root)throw new ReferenceError("No trusted root metadata");return this.trustedSet.root}get timestamp(){return this.trustedSet.timestamp}get snapshot(){return this.trustedSet.snapshot}get targets(){return this.trustedSet.targets}getRole(t){return this.trustedSet[t]}updateRoot(t){let r=JSON.parse(t.toString("utf8")),s=Bs.Metadata.fromJSON(Bs.MetadataKind.Root,r);if(s.signed.type!=Bs.MetadataKind.Root)throw new Hi.RepositoryError(`Expected 'root', got ${s.signed.type}`);if(this.root.verifyDelegate(Bs.MetadataKind.Root,s),s.signed.version!=this.root.signed.version+1)throw new Hi.BadVersionError(`Expected version ${this.root.signed.version+1}, got ${s.signed.version}`);return s.verifyDelegate(Bs.MetadataKind.Root,s),this.trustedSet.root=s,s}updateTimestamp(t){if(this.snapshot)throw new Hi.RuntimeError("Cannot update timestamp after snapshot");if(this.root.signed.isExpired(this.referenceTime))throw new Hi.ExpiredMetadataError("Final root.json is expired");let r=JSON.parse(t.toString("utf8")),s=Bs.Metadata.fromJSON(Bs.MetadataKind.Timestamp,r);if(s.signed.type!=Bs.MetadataKind.Timestamp)throw new Hi.RepositoryError(`Expected 'timestamp', got ${s.signed.type}`);if(this.root.verifyDelegate(Bs.MetadataKind.Timestamp,s),this.timestamp){if(s.signed.version{let p=n.signed.meta[c];if(!p)throw new Hi.RepositoryError(`Missing file ${c} in new snapshot`);if(p.version{"use strict";Object.defineProperty(bK,"__esModule",{value:!0});bK.join=P2t;var D2t=Ce("url");function P2t(e,t){return new D2t.URL(x2t(e)+k2t(t)).toString()}function x2t(e){return e.endsWith("/")?e:e+"/"}function k2t(e){return e.startsWith("/")?e.slice(1):e}});var tDe=G(nu=>{"use strict";var Q2t=nu&&nu.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),T2t=nu&&nu.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),xK=nu&&nu.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)r!=="default"&&Object.prototype.hasOwnProperty.call(e,r)&&Q2t(t,e,r);return T2t(t,e),t},R2t=nu&&nu.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(nu,"__esModule",{value:!0});nu.Updater=void 0;var TA=WO(),F2t=R2t(pK()),A1=xK(Ce("fs")),nL=xK(Ce("path")),N2t=Xbe(),my=XO(),O2t=vK(),L2t=$be(),VD=xK(eDe()),DK=(0,F2t.default)("tuf:cache"),PK=class{constructor(t){let{metadataDir:r,metadataBaseUrl:s,targetDir:a,targetBaseUrl:n,fetcher:c,config:f}=t;this.dir=r,this.metadataBaseUrl=s,this.targetDir=a,this.targetBaseUrl=n,this.forceCache=t.forceCache??!1;let p=this.loadLocalMetadata(TA.MetadataKind.Root);this.trustedSet=new L2t.TrustedMetadataStore(p),this.config={...N2t.defaultConfig,...f},this.fetcher=c||new O2t.DefaultFetcher({timeout:this.config.fetchTimeout,retry:this.config.fetchRetries??this.config.fetchRetry})}async refresh(){if(this.forceCache)try{await this.loadTimestamp({checkRemote:!1})}catch{await this.loadRoot(),await this.loadTimestamp()}else await this.loadRoot(),await this.loadTimestamp();await this.loadSnapshot(),await this.loadTargets(TA.MetadataKind.Targets,TA.MetadataKind.Root)}async getTargetInfo(t){return this.trustedSet.targets||await this.refresh(),this.preorderDepthFirstWalk(t)}async downloadTarget(t,r,s){let a=r||this.generateTargetPath(t);if(!s){if(!this.targetBaseUrl)throw new my.ValueError("Target base URL not set");s=this.targetBaseUrl}let n=t.path;if(this.trustedSet.root.signed.consistentSnapshot&&this.config.prefixTargetsWithHash){let p=Object.values(t.hashes),{dir:h,base:E}=nL.parse(n),C=`${p[0]}.${E}`;n=h?`${h}/${C}`:C}let f=VD.join(s,n);return await this.fetcher.downloadFile(f,t.length,async p=>{await t.verify(A1.createReadStream(p)),DK("WRITE %s",a),A1.copyFileSync(p,a)}),a}async findCachedTarget(t,r){r||(r=this.generateTargetPath(t));try{if(A1.existsSync(r))return await t.verify(A1.createReadStream(r)),r}catch{return}}loadLocalMetadata(t){let r=nL.join(this.dir,`${t}.json`);return DK("READ %s",r),A1.readFileSync(r)}async loadRoot(){let r=this.trustedSet.root.signed.version+1,s=r+this.config.maxRootRotations;for(let a=r;a0;){let{roleName:a,parentRoleName:n}=r.pop();if(s.has(a))continue;let c=(await this.loadTargets(a,n))?.signed;if(!c)continue;let f=c.targets?.[t];if(f)return f;if(s.add(a),c.delegations){let p=[],h=c.delegations.rolesForTarget(t);for(let{role:E,terminating:C}of h)if(p.push({roleName:E,parentRoleName:a}),C){r.splice(0);break}p.reverse(),r.push(...p)}}}generateTargetPath(t){if(!this.targetDir)throw new my.ValueError("Target directory not set");let r=encodeURIComponent(t.path);return nL.join(this.targetDir,r)}persistMetadata(t,r){let s=encodeURIComponent(t);try{let a=nL.join(this.dir,`${s}.json`);DK("WRITE %s",a),A1.writeFileSync(a,r.toString("utf8"))}catch(a){throw new my.PersistError(`Failed to persist metadata ${s} error: ${a}`)}}};nu.Updater=PK});var rDe=G(Tg=>{"use strict";Object.defineProperty(Tg,"__esModule",{value:!0});Tg.Updater=Tg.BaseFetcher=Tg.TargetFile=void 0;var M2t=WO();Object.defineProperty(Tg,"TargetFile",{enumerable:!0,get:function(){return M2t.TargetFile}});var U2t=vK();Object.defineProperty(Tg,"BaseFetcher",{enumerable:!0,get:function(){return U2t.BaseFetcher}});var _2t=tDe();Object.defineProperty(Tg,"Updater",{enumerable:!0,get:function(){return _2t.Updater}})});var QK=G(iL=>{"use strict";Object.defineProperty(iL,"__esModule",{value:!0});iL.TUFError=void 0;var kK=class extends Error{constructor({code:t,message:r,cause:s}){super(r),this.code=t,this.cause=s,this.name=this.constructor.name}};iL.TUFError=kK});var nDe=G(KD=>{"use strict";var H2t=KD&&KD.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(KD,"__esModule",{value:!0});KD.readTarget=G2t;var j2t=H2t(Ce("fs")),sL=QK();async function G2t(e,t){let r=await q2t(e,t);return new Promise((s,a)=>{j2t.default.readFile(r,"utf-8",(n,c)=>{n?a(new sL.TUFError({code:"TUF_READ_TARGET_ERROR",message:`error reading target ${r}`,cause:n})):s(c)})})}async function q2t(e,t){let r;try{r=await e.getTargetInfo(t)}catch(a){throw new sL.TUFError({code:"TUF_REFRESH_METADATA_ERROR",message:"error refreshing TUF metadata",cause:a})}if(!r)throw new sL.TUFError({code:"TUF_FIND_TARGET_ERROR",message:`target ${t} not found`});let s=await e.findCachedTarget(r);if(!s)try{s=await e.downloadTarget(r)}catch(a){throw new sL.TUFError({code:"TUF_DOWNLOAD_TARGET_ERROR",message:`error downloading target ${s}`,cause:a})}return s}});var iDe=G((Qrr,Y2t)=>{Y2t.exports={"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiMzA0NjAyMjEwMDhhYjFmNmYxN2Q0ZjllNmQ3ZGNmMWM4ODkxMmI2YjUzY2MxMDM4ODY0NGFlMWYwOWJjMzdhMDgyY2QwNjAwM2UwMjIxMDBlMTQ1ZWY0YzdiNzgyZDRlODEwN2I1MzQzN2U2NjlkMDQ3Njg5MmNlOTk5OTAzYWUzM2QxNDQ0ODM2Njk5NmU3IgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGM3NjhiMmY4NmRhOTk1NjkwMTljMTYwYTA4MWRhNTRhZTM2YzM0YzBhMzEyMGQzY2I2OWI1M2I3ZDExMzc1OGUwMjIwNGY2NzE1MThmNjE3YjIwZDQ2NTM3ZmFlNmMzYjYzYmFlODkxM2Y0ZjE5NjIxNTYxMDVjYzRmMDE5YWMzNWM2YSIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDUwMjIxMDBiNDQzNGU2OTk1ZDM2OGQyM2U3NDc1OWFjZDBjYjkwMTNjODNhNWQzNTExZjBmOTk3ZWM1NGM0NTZhZTQzNTBhMDIyMDE1YjBlMjY1ZDE4MmQyYjYxZGM3NGUxNTVkOThiM2MzZmJlNTY0YmEwNTI4NmFhMTRjOGRmMDJjOWI3NTY1MTYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgInNpZyI6ICIzMDQ1MDIyMTAwODJjNTg0MTFkOTg5ZWI5Zjg2MTQxMDg1N2Q0MjM4MTU5MGVjOTQyNGRiZGFhNTFlNzhlZDEzNTE1NDMxOTA0ZTAyMjAxMTgxODVkYTZhNmMyOTQ3MTMxYzE3Nzk3ZTJiYjc2MjBjZTI2ZTVmMzAxZDFjZWFjNWYyYTdlNThmOWRjZjJlIgogIH0sCiAgewogICAia2V5aWQiOiAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGM3ODUxMzg1NGNhZTljMzJlYWE2Yjg4ZTE4OTEyZjQ4MDA2YzI3NTdhMjU4ZjkxNzMxMmNhYmE3NTk0OGViOWUwMjIxMDBkOWUxYjRjZTBhZGZlOWZkMmUyMTQ4ZDdmYTI3YTJmNDBiYTExMjJiZDY5ZGE3NjEyZDhkMTc3NmIwMTNjOTFkIgogIH0sCiAgewogICAia2V5aWQiOiAiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIsCiAgICJzaWciOiAiMzA0NTAyMjA1NjQ4M2EyZDVkOWVhOWNlYzZlMTFlYWRmYjMzYzQ4NGI2MTQyOThmYWNhMTVhY2YxYzQzMWIxMWVkN2Y3MzRjMDIyMTAwZDBjMWQ3MjZhZjkyYTg3ZTRlNjY0NTljYTVhZGYzOGEwNWI0NGUxZjk0MzE4NDIzZjk1NGJhZThiY2E1YmIyZSIKICB9LAogIHsKICAgImtleWlkIjogImUyZjU5YWNiOTQ4ODUxOTQwN2UxOGNiZmM5MzI5NTEwYmUwM2MwNGFjYTk5MjlkMmYwMzAxMzQzZmVjODU1MjMiLAogICAic2lnIjogIjMwNDYwMjIxMDBkMDA0ZGU4ODAyNGMzMmRjNTY1M2E5ZjQ4NDNjZmM1MjE1NDI3MDQ4YWQ5NjAwZDJjZjljOTY5ZTZlZGZmM2QyMDIyMTAwZDllYmI3OThmNWZjNjZhZjEwODk5ZGVjZTAxNGE4NjI4Y2NmM2M1NDAyY2Q0YTQyNzAyMDc0NzJmOGY2ZTcxMiIKICB9LAogIHsKICAgImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiN2IwOTk5NmM0NWNhMmQ0YjA1NjAzZTU2YmFlZmEyOTcxOGEwYjcxMTQ3Y2Y4YzZlNjYzNDliYWE2MTQ3N2RmMDIyMTAwYzRkYTgwYzcxN2I0ZmE3YmJhMGZkNWM3MmRhOGEwNDk5MzU4YjAxMzU4YjIzMDlmNDFkMTQ1NmVhMWU3ZTFkOSIKICB9LAogIHsKICAgImtleWlkIjogImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiZTk3ODJjMzA3NDRlNDExYTgyZmE4NWI1MTM4ZDYwMWNlMTQ4YmMxOTI1OGFlYzY0ZTdlYzI0NDc4ZjM4ODEyMDIyMTAwY2FlZjYzZGNhZjFhNGI5YTUwMGQzYmQwZTNmMTY0ZWMxOGYxYjYzZDdhOTQ2MGQ5YWNhYjEwNjZkYjBmMDE2ZCIKICB9LAogIHsKICAgImtleWlkIjogIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAogICAic2lnIjogIjMwNDUwMjIwNzQ2ZWMzZjg1MzRjZTU1NTMxZDBkMDFmZjY0OTY0ZWY0NDBkMWU3ZDJjNGMxNDI0MDliOGU5NzY5ZjFhZGE2ZjAyMjEwMGUzYjkyOWZjZDkzZWExOGZlYWEwODI1ODg3YTcyMTA0ODk4NzlhNjY3ODBjMDdhODNmNGJkNDZlMmYwOWFiM2IiCiAgfQogXSwKICJzaWduZWQiOiB7CiAgIl90eXBlIjogInJvb3QiLAogICJjb25zaXN0ZW50X3NuYXBzaG90IjogdHJ1ZSwKICAiZXhwaXJlcyI6ICIyMDI1LTAyLTE5VDA4OjA0OjMyWiIsCiAgImtleXMiOiB7CiAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFekJ6Vk9tSENQb2pNVkxTSTM2NFdpaVY4TlByRFxuNklnUnhWbGlza3ovdit5M0pFUjVtY1ZHY09ObGlEY1dNQzVKMmxmSG1qUE5QaGI0SDd4bThMemZTQT09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBzYW50aWFnb3RvcnJlcyIKICAgfSwKICAgIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpbmlrU3NBUW1Za05lSDVlWXEvQ25JekxhYWNPXG54bFNhYXdRRE93cUt5L3RDcXhxNXh4UFNKYzIxSzRXSWhzOUd5T2tLZnp1ZVkzR0lMemNNSlo0Y1d3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGJvYmNhbGxhd2F5IgogICB9LAogICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAZGxvcmVuYyIKICAgfSwKICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXUmlHcjUraiszSjVTc0grWnRyNW5FMkgyd083XG5CVituTzNzOTNnTGNhMThxVE96SFkxb1d5QUdEeWtNU3NHVFVCU3Q5RCtBbjBLZktzRDJtZlNNNDJRPT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2ktb25saW5lLXVyaSI6ICJnY3BrbXM6Ly9wcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wIgogICB9LAogICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAam9zaHVhZ2wiCiAgIH0sCiAgICJlNzFhNTRkNTQzODM1YmE4NmFkYWQ5NDYwMzc5Yzc2NDFmYjg3MjZkMTY0ZWE3NjY4MDFhMWM1MjJhYmE3ZWEyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhzejNTWlhGYjhqTVY0Mmo2cEpseWpialI4S1xuTjNCd29jZXhxNkxNSWI1cXNXS09RdkxOMTZOVWVmTGM0SHN3T291bVJzVlZhYWpTcFFTNmZvYmtSdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBtbm02NzgiCiAgIH0KICB9LAogICJyb2xlcyI6IHsKICAgInJvb3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI2ZjI2MDA4OWQ1OTIzZGFmMjAxNjZjYTY1N2M1NDNhZjYxODM0NmFiOTcxODg0YTk5OTYyYjAxOTg4YmJlMGMzIiwKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMwogICB9LAogICAic25hcHNob3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI3MjQ3ZjBkYmFkODViMTQ3ZTE4NjNiYWRlNzYxMjQzY2M3ODVkY2I3YWE0MTBlNzEwNWRkM2QyYjYxYTM2ZDJjIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiAzNjUwLAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogMzY1CiAgIH0sCiAgICJ0YXJnZXRzIjogewogICAgImtleWlkcyI6IFsKICAgICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInRpbWVzdGFtcCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDEsCiAgICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDcsCiAgICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0CiAgIH0KICB9LAogICJzcGVjX3ZlcnNpb24iOiAiMS4wIiwKICAidmVyc2lvbiI6IDEwLAogICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMTgyLAogICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDMxCiB9Cn0=",targets:{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}}});var oDe=G(p1=>{"use strict";var sDe=p1&&p1.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(p1,"__esModule",{value:!0});p1.TUFClient=void 0;var Rg=sDe(Ce("fs")),JD=sDe(Ce("path")),W2t=rDe(),V2t=oL(),K2t=nDe(),RK="targets",TK=class{constructor(t){let r=new URL(t.mirrorURL),s=encodeURIComponent(r.host+r.pathname.replace(/\/$/,"")),a=JD.default.join(t.cachePath,s);J2t(a),z2t({cachePath:a,mirrorURL:t.mirrorURL,tufRootPath:t.rootPath,forceInit:t.forceInit}),this.updater=Z2t({mirrorURL:t.mirrorURL,cachePath:a,forceCache:t.forceCache,retry:t.retry,timeout:t.timeout})}async refresh(){return this.updater.refresh()}getTarget(t){return(0,K2t.readTarget)(this.updater,t)}};p1.TUFClient=TK;function J2t(e){let t=JD.default.join(e,RK);Rg.default.existsSync(e)||Rg.default.mkdirSync(e,{recursive:!0}),Rg.default.existsSync(t)||Rg.default.mkdirSync(t)}function z2t({cachePath:e,mirrorURL:t,tufRootPath:r,forceInit:s}){let a=JD.default.join(e,"root.json");if(!Rg.default.existsSync(a)||s)if(r)Rg.default.copyFileSync(r,a);else{let c=iDe()[t];if(!c)throw new V2t.TUFError({code:"TUF_INIT_CACHE_ERROR",message:`No root.json found for mirror: ${t}`});Rg.default.writeFileSync(a,Buffer.from(c["root.json"],"base64")),Object.entries(c.targets).forEach(([f,p])=>{Rg.default.writeFileSync(JD.default.join(e,RK,f),Buffer.from(p,"base64"))})}}function Z2t(e){let t={fetchTimeout:e.timeout,fetchRetry:e.retry};return new W2t.Updater({metadataBaseUrl:e.mirrorURL,targetBaseUrl:`${e.mirrorURL}/targets`,metadataDir:e.cachePath,targetDir:JD.default.join(e.cachePath,RK),forceCache:e.forceCache,config:t})}});var oL=G(gh=>{"use strict";Object.defineProperty(gh,"__esModule",{value:!0});gh.TUFError=gh.DEFAULT_MIRROR_URL=void 0;gh.getTrustedRoot=sBt;gh.initTUF=oBt;var X2t=BD(),$2t=USe(),eBt=oDe();gh.DEFAULT_MIRROR_URL="https://tuf-repo-cdn.sigstore.dev";var tBt="sigstore-js",rBt={retries:2},nBt=5e3,iBt="trusted_root.json";async function sBt(e={}){let r=await aDe(e).getTarget(iBt);return X2t.TrustedRoot.fromJSON(JSON.parse(r))}async function oBt(e={}){let t=aDe(e);return t.refresh().then(()=>t)}function aDe(e){return new eBt.TUFClient({cachePath:e.cachePath||(0,$2t.appDataPath)(tBt),rootPath:e.rootPath,mirrorURL:e.mirrorURL||gh.DEFAULT_MIRROR_URL,retry:e.retry??rBt,timeout:e.timeout??nBt,forceCache:e.forceCache??!1,forceInit:e.forceInit??e.force??!1})}var aBt=QK();Object.defineProperty(gh,"TUFError",{enumerable:!0,get:function(){return aBt.TUFError}})});var lDe=G(aL=>{"use strict";Object.defineProperty(aL,"__esModule",{value:!0});aL.DSSESignatureContent=void 0;var zD=xl(),FK=class{constructor(t){this.env=t}compareDigest(t){return zD.crypto.bufferEqual(t,zD.crypto.digest("sha256",this.env.payload))}compareSignature(t){return zD.crypto.bufferEqual(t,this.signature)}verifySignature(t){return zD.crypto.verify(this.preAuthEncoding,t,this.signature)}get signature(){return this.env.signatures.length>0?this.env.signatures[0].sig:Buffer.from("")}get preAuthEncoding(){return zD.dsse.preAuthEncoding(this.env.payloadType,this.env.payload)}};aL.DSSESignatureContent=FK});var cDe=G(lL=>{"use strict";Object.defineProperty(lL,"__esModule",{value:!0});lL.MessageSignatureContent=void 0;var NK=xl(),OK=class{constructor(t,r){this.signature=t.signature,this.messageDigest=t.messageDigest.digest,this.artifact=r}compareSignature(t){return NK.crypto.bufferEqual(t,this.signature)}compareDigest(t){return NK.crypto.bufferEqual(t,this.messageDigest)}verifySignature(t){return NK.crypto.verify(this.artifact,t,this.signature)}};lL.MessageSignatureContent=OK});var fDe=G(cL=>{"use strict";Object.defineProperty(cL,"__esModule",{value:!0});cL.toSignedEntity=uBt;cL.signatureContent=uDe;var LK=xl(),lBt=lDe(),cBt=cDe();function uBt(e,t){let{tlogEntries:r,timestampVerificationData:s}=e.verificationMaterial,a=[];for(let n of r)a.push({$case:"transparency-log",tlogEntry:n});for(let n of s?.rfc3161Timestamps??[])a.push({$case:"timestamp-authority",timestamp:LK.RFC3161Timestamp.parse(n.signedTimestamp)});return{signature:uDe(e,t),key:fBt(e),tlogEntries:r,timestamps:a}}function uDe(e,t){switch(e.content.$case){case"dsseEnvelope":return new lBt.DSSESignatureContent(e.content.dsseEnvelope);case"messageSignature":return new cBt.MessageSignatureContent(e.content.messageSignature,t)}}function fBt(e){switch(e.verificationMaterial.content.$case){case"publicKey":return{$case:"public-key",hint:e.verificationMaterial.content.publicKey.hint};case"x509CertificateChain":return{$case:"certificate",certificate:LK.X509Certificate.parse(e.verificationMaterial.content.x509CertificateChain.certificates[0].rawBytes)};case"certificate":return{$case:"certificate",certificate:LK.X509Certificate.parse(e.verificationMaterial.content.certificate.rawBytes)}}}});var bo=G(h1=>{"use strict";Object.defineProperty(h1,"__esModule",{value:!0});h1.PolicyError=h1.VerificationError=void 0;var uL=class extends Error{constructor({code:t,message:r,cause:s}){super(r),this.code=t,this.cause=s,this.name=this.constructor.name}},MK=class extends uL{};h1.VerificationError=MK;var UK=class extends uL{};h1.PolicyError=UK});var ADe=G(fL=>{"use strict";Object.defineProperty(fL,"__esModule",{value:!0});fL.filterCertAuthorities=ABt;fL.filterTLogAuthorities=pBt;function ABt(e,t){return e.filter(r=>r.validFor.start<=t.start&&r.validFor.end>=t.end)}function pBt(e,t){return e.filter(r=>t.logID&&!r.logID.equals(t.logID)?!1:r.validFor.start<=t.targetDate&&t.targetDate<=r.validFor.end)}});var Ey=G(yy=>{"use strict";Object.defineProperty(yy,"__esModule",{value:!0});yy.filterTLogAuthorities=yy.filterCertAuthorities=void 0;yy.toTrustMaterial=dBt;var _K=xl(),ZD=BD(),hBt=bo(),HK=new Date(0),jK=new Date(864e13),dDe=ADe();Object.defineProperty(yy,"filterCertAuthorities",{enumerable:!0,get:function(){return dDe.filterCertAuthorities}});Object.defineProperty(yy,"filterTLogAuthorities",{enumerable:!0,get:function(){return dDe.filterTLogAuthorities}});function dBt(e,t){let r=typeof t=="function"?t:gBt(t);return{certificateAuthorities:e.certificateAuthorities.map(hDe),timestampAuthorities:e.timestampAuthorities.map(hDe),tlogs:e.tlogs.map(pDe),ctlogs:e.ctlogs.map(pDe),publicKey:r}}function pDe(e){let t=e.publicKey.keyDetails,r=t===ZD.PublicKeyDetails.PKCS1_RSA_PKCS1V5||t===ZD.PublicKeyDetails.PKIX_RSA_PKCS1V5||t===ZD.PublicKeyDetails.PKIX_RSA_PKCS1V15_2048_SHA256||t===ZD.PublicKeyDetails.PKIX_RSA_PKCS1V15_3072_SHA256||t===ZD.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256?"pkcs1":"spki";return{logID:e.logId.keyId,publicKey:_K.crypto.createPublicKey(e.publicKey.rawBytes,r),validFor:{start:e.publicKey.validFor?.start||HK,end:e.publicKey.validFor?.end||jK}}}function hDe(e){return{certChain:e.certChain.certificates.map(t=>_K.X509Certificate.parse(t.rawBytes)),validFor:{start:e.validFor?.start||HK,end:e.validFor?.end||jK}}}function gBt(e){return t=>{let r=(e||{})[t];if(!r)throw new hBt.VerificationError({code:"PUBLIC_KEY_ERROR",message:`key not found: ${t}`});return{publicKey:_K.crypto.createPublicKey(r.rawBytes),validFor:s=>(r.validFor?.start||HK)<=s&&(r.validFor?.end||jK)>=s}}}});var GK=G(XD=>{"use strict";Object.defineProperty(XD,"__esModule",{value:!0});XD.CertificateChainVerifier=void 0;XD.verifyCertificateChain=yBt;var Iy=bo(),mBt=Ey();function yBt(e,t){let r=(0,mBt.filterCertAuthorities)(t,{start:e.notBefore,end:e.notAfter}),s;for(let a of r)try{return new AL({trustedCerts:a.certChain,untrustedCert:e}).verify()}catch(n){s=n}throw new Iy.VerificationError({code:"CERTIFICATE_ERROR",message:"Failed to verify certificate chain",cause:s})}var AL=class{constructor(t){this.untrustedCert=t.untrustedCert,this.trustedCerts=t.trustedCerts,this.localCerts=EBt([...t.trustedCerts,t.untrustedCert])}verify(){let t=this.sort();return this.checkPath(t),t}sort(){let t=this.untrustedCert,r=this.buildPaths(t);if(r=r.filter(a=>a.some(n=>this.trustedCerts.includes(n))),r.length===0)throw new Iy.VerificationError({code:"CERTIFICATE_ERROR",message:"no trusted certificate path found"});let s=r.reduce((a,n)=>a.length{if(s&&a.extSubjectKeyID){a.extSubjectKeyID.keyIdentifier.equals(s)&&r.push(a);return}a.subject.equals(t.issuer)&&r.push(a)}),r=r.filter(a=>{try{return t.verify(a)}catch{return!1}}),r)}checkPath(t){if(t.length<1)throw new Iy.VerificationError({code:"CERTIFICATE_ERROR",message:"certificate chain must contain at least one certificate"});if(!t.slice(1).every(s=>s.isCA))throw new Iy.VerificationError({code:"CERTIFICATE_ERROR",message:"intermediate certificate is not a CA"});for(let s=t.length-2;s>=0;s--)if(!t[s].issuer.equals(t[s+1].subject))throw new Iy.VerificationError({code:"CERTIFICATE_ERROR",message:"incorrect certificate name chaining"});for(let s=0;s{"use strict";Object.defineProperty(qK,"__esModule",{value:!0});qK.verifySCTs=wBt;var pL=xl(),IBt=bo(),CBt=Ey();function wBt(e,t,r){let s,a=e.clone();for(let p=0;p{if(!(0,CBt.filterTLogAuthorities)(r,{logID:p.logID,targetDate:p.datetime}).some(C=>p.verify(n.buffer,C.publicKey)))throw new IBt.VerificationError({code:"CERTIFICATE_ERROR",message:"SCT verification failed"});return p.logID})}});var yDe=G(hL=>{"use strict";Object.defineProperty(hL,"__esModule",{value:!0});hL.verifyPublicKey=PBt;hL.verifyCertificate=xBt;var BBt=xl(),mDe=bo(),vBt=GK(),SBt=gDe(),bBt="1.3.6.1.4.1.57264.1.1",DBt="1.3.6.1.4.1.57264.1.8";function PBt(e,t,r){let s=r.publicKey(e);return t.forEach(a=>{if(!s.validFor(a))throw new mDe.VerificationError({code:"PUBLIC_KEY_ERROR",message:`Public key is not valid for timestamp: ${a.toISOString()}`})}),{key:s.publicKey}}function xBt(e,t,r){let s=(0,vBt.verifyCertificateChain)(e,r.certificateAuthorities);if(!t.every(n=>s.every(c=>c.validForDate(n))))throw new mDe.VerificationError({code:"CERTIFICATE_ERROR",message:"certificate is not valid or expired at the specified date"});return{scts:(0,SBt.verifySCTs)(s[0],s[1],r.ctlogs),signer:kBt(s[0])}}function kBt(e){let t,r=e.extension(DBt);r?t=r.valueObj.subs?.[0]?.value.toString("ascii"):t=e.extension(bBt)?.value.toString("ascii");let s={extensions:{issuer:t},subjectAlternativeName:e.subjectAltName};return{key:BBt.crypto.createPublicKey(e.publicKey),identity:s}}});var IDe=G(dL=>{"use strict";Object.defineProperty(dL,"__esModule",{value:!0});dL.verifySubjectAlternativeName=QBt;dL.verifyExtensions=TBt;var EDe=bo();function QBt(e,t){if(t===void 0||!t.match(e))throw new EDe.PolicyError({code:"UNTRUSTED_SIGNER_ERROR",message:`certificate identity error - expected ${e}, got ${t}`})}function TBt(e,t={}){let r;for(r in e)if(t[r]!==e[r])throw new EDe.PolicyError({code:"UNTRUSTED_SIGNER_ERROR",message:`invalid certificate extension - expected ${r}=${e[r]}, got ${r}=${t[r]}`})}});var CDe=G(JK=>{"use strict";Object.defineProperty(JK,"__esModule",{value:!0});JK.verifyCheckpoint=NBt;var WK=xl(),d1=bo(),RBt=Ey(),YK=` + +`,FBt=/\u2014 (\S+) (\S+)\n/g;function NBt(e,t){let r=(0,RBt.filterTLogAuthorities)(t,{targetDate:new Date(Number(e.integratedTime)*1e3)}),s=e.inclusionProof,a=VK.fromString(s.checkpoint.envelope),n=KK.fromString(a.note);if(!OBt(a,r))throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"invalid checkpoint signature"});if(!WK.crypto.bufferEqual(n.logHash,s.rootHash))throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"root hash mismatch"})}function OBt(e,t){let r=Buffer.from(e.note,"utf-8");return e.signatures.every(s=>{let a=t.find(n=>WK.crypto.bufferEqual(n.logID.subarray(0,4),s.keyHint));return a?WK.crypto.verify(r,a.publicKey,s.signature):!1})}var VK=class e{constructor(t,r){this.note=t,this.signatures=r}static fromString(t){if(!t.includes(YK))throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"missing checkpoint separator"});let r=t.indexOf(YK),s=t.slice(0,r+1),n=t.slice(r+YK.length).matchAll(FBt),c=Array.from(n,f=>{let[,p,h]=f,E=Buffer.from(h,"base64");if(E.length<5)throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"malformed checkpoint signature"});return{name:p,keyHint:E.subarray(0,4),signature:E.subarray(4)}});if(c.length===0)throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"no signatures found in checkpoint"});return new e(s,c)}},KK=class e{constructor(t,r,s,a){this.origin=t,this.logSize=r,this.logHash=s,this.rest=a}static fromString(t){let r=t.trimEnd().split(` +`);if(r.length<3)throw new d1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"too few lines in checkpoint header"});let s=r[0],a=BigInt(r[1]),n=Buffer.from(r[2],"base64"),c=r.slice(3);return new e(s,a,n,c)}}});var wDe=G($K=>{"use strict";Object.defineProperty($K,"__esModule",{value:!0});$K.verifyMerkleInclusion=UBt;var XK=xl(),zK=bo(),LBt=Buffer.from([0]),MBt=Buffer.from([1]);function UBt(e){let t=e.inclusionProof,r=BigInt(t.logIndex),s=BigInt(t.treeSize);if(r<0n||r>=s)throw new zK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:`invalid index: ${r}`});let{inner:a,border:n}=_Bt(r,s);if(t.hashes.length!==a+n)throw new zK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"invalid hash count"});let c=t.hashes.slice(0,a),f=t.hashes.slice(a),p=WBt(e.canonicalizedBody),h=jBt(HBt(p,c,r),f);if(!XK.crypto.bufferEqual(h,t.rootHash))throw new zK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"calculated root hash does not match inclusion proof"})}function _Bt(e,t){let r=GBt(e,t),s=qBt(e>>BigInt(r));return{inner:r,border:s}}function HBt(e,t,r){return t.reduce((s,a,n)=>r>>BigInt(n)&BigInt(1)?ZK(a,s):ZK(s,a),e)}function jBt(e,t){return t.reduce((r,s)=>ZK(s,r),e)}function GBt(e,t){return YBt(e^t-BigInt(1))}function qBt(e){return e.toString(2).split("1").length-1}function YBt(e){return e===0n?0:e.toString(2).length}function ZK(e,t){return XK.crypto.digest("sha256",MBt,e,t)}function WBt(e){return XK.crypto.digest("sha256",LBt,e)}});var vDe=G(eJ=>{"use strict";Object.defineProperty(eJ,"__esModule",{value:!0});eJ.verifyTLogSET=JBt;var BDe=xl(),VBt=bo(),KBt=Ey();function JBt(e,t){if(!(0,KBt.filterTLogAuthorities)(t,{logID:e.logId.keyId,targetDate:new Date(Number(e.integratedTime)*1e3)}).some(a=>{let n=zBt(e),c=Buffer.from(BDe.json.canonicalize(n),"utf8"),f=e.inclusionPromise.signedEntryTimestamp;return BDe.crypto.verify(c,a.publicKey,f)}))throw new VBt.VerificationError({code:"TLOG_INCLUSION_PROMISE_ERROR",message:"inclusion promise could not be verified"})}function zBt(e){let{integratedTime:t,logIndex:r,logId:s,canonicalizedBody:a}=e;return{body:a.toString("base64"),integratedTime:Number(t),logIndex:Number(r),logID:s.keyId.toString("hex")}}});var SDe=G(nJ=>{"use strict";Object.defineProperty(nJ,"__esModule",{value:!0});nJ.verifyRFC3161Timestamp=$Bt;var tJ=xl(),rJ=bo(),ZBt=GK(),XBt=Ey();function $Bt(e,t,r){let s=e.signingTime;if(r=(0,XBt.filterCertAuthorities)(r,{start:s,end:s}),r=tvt(r,{serialNumber:e.signerSerialNumber,issuer:e.signerIssuer}),!r.some(n=>{try{return evt(e,t,n),!0}catch{return!1}}))throw new rJ.VerificationError({code:"TIMESTAMP_ERROR",message:"timestamp could not be verified"})}function evt(e,t,r){let[s,...a]=r.certChain,n=tJ.crypto.createPublicKey(s.publicKey),c=e.signingTime;try{new ZBt.CertificateChainVerifier({untrustedCert:s,trustedCerts:a}).verify()}catch{throw new rJ.VerificationError({code:"TIMESTAMP_ERROR",message:"invalid certificate chain"})}if(!r.certChain.every(p=>p.validForDate(c)))throw new rJ.VerificationError({code:"TIMESTAMP_ERROR",message:"timestamp was signed with an expired certificate"});e.verify(t,n)}function tvt(e,t){return e.filter(r=>r.certChain.length>0&&tJ.crypto.bufferEqual(r.certChain[0].serialNumber,t.serialNumber)&&tJ.crypto.bufferEqual(r.certChain[0].issuer,t.issuer))}});var bDe=G(gL=>{"use strict";Object.defineProperty(gL,"__esModule",{value:!0});gL.verifyTSATimestamp=avt;gL.verifyTLogTimestamp=lvt;var rvt=bo(),nvt=CDe(),ivt=wDe(),svt=vDe(),ovt=SDe();function avt(e,t,r){return(0,ovt.verifyRFC3161Timestamp)(e,t,r),{type:"timestamp-authority",logID:e.signerSerialNumber,timestamp:e.signingTime}}function lvt(e,t){let r=!1;if(cvt(e)&&((0,svt.verifyTLogSET)(e,t),r=!0),uvt(e)&&((0,ivt.verifyMerkleInclusion)(e),(0,nvt.verifyCheckpoint)(e,t),r=!0),!r)throw new rvt.VerificationError({code:"TLOG_MISSING_INCLUSION_ERROR",message:"inclusion could not be verified"});return{type:"transparency-log",logID:e.logId.keyId,timestamp:new Date(Number(e.integratedTime)*1e3)}}function cvt(e){return e.inclusionPromise!==void 0}function uvt(e){return e.inclusionProof!==void 0}});var DDe=G(iJ=>{"use strict";Object.defineProperty(iJ,"__esModule",{value:!0});iJ.verifyDSSETLogBody=fvt;var mL=bo();function fvt(e,t){switch(e.apiVersion){case"0.0.1":return Avt(e,t);default:throw new mL.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported dsse version: ${e.apiVersion}`})}}function Avt(e,t){if(e.spec.signatures?.length!==1)throw new mL.VerificationError({code:"TLOG_BODY_ERROR",message:"signature count mismatch"});let r=e.spec.signatures[0].signature;if(!t.compareSignature(Buffer.from(r,"base64")))throw new mL.VerificationError({code:"TLOG_BODY_ERROR",message:"tlog entry signature mismatch"});let s=e.spec.payloadHash?.value||"";if(!t.compareDigest(Buffer.from(s,"hex")))throw new mL.VerificationError({code:"TLOG_BODY_ERROR",message:"DSSE payload hash mismatch"})}});var PDe=G(oJ=>{"use strict";Object.defineProperty(oJ,"__esModule",{value:!0});oJ.verifyHashedRekordTLogBody=pvt;var sJ=bo();function pvt(e,t){switch(e.apiVersion){case"0.0.1":return hvt(e,t);default:throw new sJ.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported hashedrekord version: ${e.apiVersion}`})}}function hvt(e,t){let r=e.spec.signature.content||"";if(!t.compareSignature(Buffer.from(r,"base64")))throw new sJ.VerificationError({code:"TLOG_BODY_ERROR",message:"signature mismatch"});let s=e.spec.data.hash?.value||"";if(!t.compareDigest(Buffer.from(s,"hex")))throw new sJ.VerificationError({code:"TLOG_BODY_ERROR",message:"digest mismatch"})}});var xDe=G(aJ=>{"use strict";Object.defineProperty(aJ,"__esModule",{value:!0});aJ.verifyIntotoTLogBody=dvt;var yL=bo();function dvt(e,t){switch(e.apiVersion){case"0.0.2":return gvt(e,t);default:throw new yL.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported intoto version: ${e.apiVersion}`})}}function gvt(e,t){if(e.spec.content.envelope.signatures?.length!==1)throw new yL.VerificationError({code:"TLOG_BODY_ERROR",message:"signature count mismatch"});let r=mvt(e.spec.content.envelope.signatures[0].sig);if(!t.compareSignature(Buffer.from(r,"base64")))throw new yL.VerificationError({code:"TLOG_BODY_ERROR",message:"tlog entry signature mismatch"});let s=e.spec.content.payloadHash?.value||"";if(!t.compareDigest(Buffer.from(s,"hex")))throw new yL.VerificationError({code:"TLOG_BODY_ERROR",message:"DSSE payload hash mismatch"})}function mvt(e){return Buffer.from(e,"base64").toString("utf-8")}});var QDe=G(lJ=>{"use strict";Object.defineProperty(lJ,"__esModule",{value:!0});lJ.verifyTLogBody=Cvt;var kDe=bo(),yvt=DDe(),Evt=PDe(),Ivt=xDe();function Cvt(e,t){let{kind:r,version:s}=e.kindVersion,a=JSON.parse(e.canonicalizedBody.toString("utf8"));if(r!==a.kind||s!==a.apiVersion)throw new kDe.VerificationError({code:"TLOG_BODY_ERROR",message:`kind/version mismatch - expected: ${r}/${s}, received: ${a.kind}/${a.apiVersion}`});switch(a.kind){case"dsse":return(0,yvt.verifyDSSETLogBody)(a,t);case"intoto":return(0,Ivt.verifyIntotoTLogBody)(a,t);case"hashedrekord":return(0,Evt.verifyHashedRekordTLogBody)(a,t);default:throw new kDe.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported kind: ${r}`})}}});var ODe=G(EL=>{"use strict";Object.defineProperty(EL,"__esModule",{value:!0});EL.Verifier=void 0;var wvt=Ce("util"),g1=bo(),TDe=yDe(),RDe=IDe(),FDe=bDe(),Bvt=QDe(),cJ=class{constructor(t,r={}){this.trustMaterial=t,this.options={ctlogThreshold:r.ctlogThreshold??1,tlogThreshold:r.tlogThreshold??1,tsaThreshold:r.tsaThreshold??0}}verify(t,r){let s=this.verifyTimestamps(t),a=this.verifySigningKey(t,s);return this.verifyTLogs(t),this.verifySignature(t,a),r&&this.verifyPolicy(r,a.identity||{}),a}verifyTimestamps(t){let r=0,s=0,a=t.timestamps.map(n=>{switch(n.$case){case"timestamp-authority":return s++,(0,FDe.verifyTSATimestamp)(n.timestamp,t.signature.signature,this.trustMaterial.timestampAuthorities);case"transparency-log":return r++,(0,FDe.verifyTLogTimestamp)(n.tlogEntry,this.trustMaterial.tlogs)}});if(NDe(a))throw new g1.VerificationError({code:"TIMESTAMP_ERROR",message:"duplicate timestamp"});if(rn.timestamp)}verifySigningKey({key:t},r){switch(t.$case){case"public-key":return(0,TDe.verifyPublicKey)(t.hint,r,this.trustMaterial);case"certificate":{let s=(0,TDe.verifyCertificate)(t.certificate,r,this.trustMaterial);if(NDe(s.scts))throw new g1.VerificationError({code:"CERTIFICATE_ERROR",message:"duplicate SCT"});if(s.scts.length(0,Bvt.verifyTLogBody)(s,t))}verifySignature(t,r){if(!t.signature.verifySignature(r.key))throw new g1.VerificationError({code:"SIGNATURE_ERROR",message:"signature verification failed"})}verifyPolicy(t,r){t.subjectAlternativeName&&(0,RDe.verifySubjectAlternativeName)(t.subjectAlternativeName,r.subjectAlternativeName),t.extensions&&(0,RDe.verifyExtensions)(t.extensions,r.extensions)}};EL.Verifier=cJ;function NDe(e){for(let t=0;t{"use strict";Object.defineProperty(iu,"__esModule",{value:!0});iu.Verifier=iu.toTrustMaterial=iu.VerificationError=iu.PolicyError=iu.toSignedEntity=void 0;var vvt=fDe();Object.defineProperty(iu,"toSignedEntity",{enumerable:!0,get:function(){return vvt.toSignedEntity}});var LDe=bo();Object.defineProperty(iu,"PolicyError",{enumerable:!0,get:function(){return LDe.PolicyError}});Object.defineProperty(iu,"VerificationError",{enumerable:!0,get:function(){return LDe.VerificationError}});var Svt=Ey();Object.defineProperty(iu,"toTrustMaterial",{enumerable:!0,get:function(){return Svt.toTrustMaterial}});var bvt=ODe();Object.defineProperty(iu,"Verifier",{enumerable:!0,get:function(){return bvt.Verifier}})});var MDe=G(Ga=>{"use strict";Object.defineProperty(Ga,"__esModule",{value:!0});Ga.DEFAULT_TIMEOUT=Ga.DEFAULT_RETRY=void 0;Ga.createBundleBuilder=xvt;Ga.createKeyFinder=kvt;Ga.createVerificationPolicy=Qvt;var Dvt=xl(),m1=C7(),Pvt=IL();Ga.DEFAULT_RETRY={retries:2};Ga.DEFAULT_TIMEOUT=5e3;function xvt(e,t){let r={signer:Tvt(t),witnesses:Fvt(t)};switch(e){case"messageSignature":return new m1.MessageSignatureBundleBuilder(r);case"dsseEnvelope":return new m1.DSSEBundleBuilder({...r,certificateChain:t.legacyCompatibility})}}function kvt(e){return t=>{let r=e(t);if(!r)throw new Pvt.VerificationError({code:"PUBLIC_KEY_ERROR",message:`key not found: ${t}`});return{publicKey:Dvt.crypto.createPublicKey(r),validFor:()=>!0}}}function Qvt(e){let t={},r=e.certificateIdentityEmail||e.certificateIdentityURI;return r&&(t.subjectAlternativeName=r),e.certificateIssuer&&(t.extensions={issuer:e.certificateIssuer}),t}function Tvt(e){return new m1.FulcioSigner({fulcioBaseURL:e.fulcioURL,identityProvider:e.identityProvider||Rvt(e),retry:e.retry??Ga.DEFAULT_RETRY,timeout:e.timeout??Ga.DEFAULT_TIMEOUT})}function Rvt(e){let t=e.identityToken;return t?{getToken:()=>Promise.resolve(t)}:new m1.CIContextProvider("sigstore")}function Fvt(e){let t=[];return Nvt(e)&&t.push(new m1.RekorWitness({rekorBaseURL:e.rekorURL,entryType:e.legacyCompatibility?"intoto":"dsse",fetchOnConflict:!1,retry:e.retry??Ga.DEFAULT_RETRY,timeout:e.timeout??Ga.DEFAULT_TIMEOUT})),Ovt(e)&&t.push(new m1.TSAWitness({tsaBaseURL:e.tsaServerURL,retry:e.retry??Ga.DEFAULT_RETRY,timeout:e.timeout??Ga.DEFAULT_TIMEOUT})),t}function Nvt(e){return e.tlogUpload!==!1}function Ovt(e){return e.tsaServerURL!==void 0}});var HDe=G(su=>{"use strict";var Lvt=su&&su.__createBinding||(Object.create?function(e,t,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,a)}:function(e,t,r,s){s===void 0&&(s=r),e[s]=t[r]}),Mvt=su&&su.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),UDe=su&&su.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var s=e(t),a=0;aa.verify(e,s))}async function _De(e={}){let t=await Uvt.getTrustedRoot({mirrorURL:e.tufMirrorURL,rootPath:e.tufRootPath,cachePath:e.tufCachePath,forceCache:e.tufForceCache,retry:e.retry??y1.DEFAULT_RETRY,timeout:e.timeout??y1.DEFAULT_TIMEOUT}),r=e.keySelector?y1.createKeyFinder(e.keySelector):void 0,s=(0,uJ.toTrustMaterial)(t,r),a={ctlogThreshold:e.ctLogThreshold,tlogThreshold:e.tlogThreshold},n=new uJ.Verifier(s,a),c=y1.createVerificationPolicy(e);return{verify:(f,p)=>{let h=(0,fJ.bundleFromJSON)(f),E=(0,uJ.toSignedEntity)(h,p);n.verify(E,c)}}}});var GDe=G(Ni=>{"use strict";Object.defineProperty(Ni,"__esModule",{value:!0});Ni.verify=Ni.sign=Ni.createVerifier=Ni.attest=Ni.VerificationError=Ni.PolicyError=Ni.TUFError=Ni.InternalError=Ni.DEFAULT_REKOR_URL=Ni.DEFAULT_FULCIO_URL=Ni.ValidationError=void 0;var Gvt=SD();Object.defineProperty(Ni,"ValidationError",{enumerable:!0,get:function(){return Gvt.ValidationError}});var AJ=C7();Object.defineProperty(Ni,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return AJ.DEFAULT_FULCIO_URL}});Object.defineProperty(Ni,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return AJ.DEFAULT_REKOR_URL}});Object.defineProperty(Ni,"InternalError",{enumerable:!0,get:function(){return AJ.InternalError}});var qvt=oL();Object.defineProperty(Ni,"TUFError",{enumerable:!0,get:function(){return qvt.TUFError}});var jDe=IL();Object.defineProperty(Ni,"PolicyError",{enumerable:!0,get:function(){return jDe.PolicyError}});Object.defineProperty(Ni,"VerificationError",{enumerable:!0,get:function(){return jDe.VerificationError}});var CL=HDe();Object.defineProperty(Ni,"attest",{enumerable:!0,get:function(){return CL.attest}});Object.defineProperty(Ni,"createVerifier",{enumerable:!0,get:function(){return CL.createVerifier}});Object.defineProperty(Ni,"sign",{enumerable:!0,get:function(){return CL.sign}});Object.defineProperty(Ni,"verify",{enumerable:!0,get:function(){return CL.verify}})});bt();Ge();bt();var BPe=Ce("child_process"),vPe=et(N0());jt();var WI=new Map([]);var Kv={};Vt(Kv,{BaseCommand:()=>ft,WorkspaceRequiredError:()=>ar,getCli:()=>kde,getDynamicLibs:()=>xde,getPluginConfiguration:()=>KI,openWorkspace:()=>VI,pluginCommands:()=>WI,runExit:()=>OR});jt();var ft=class extends st{constructor(){super(...arguments);this.cwd=he.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new ot("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ge();bt();jt();var ar=class extends ot{constructor(t,r){let s=Y.relative(t,r),a=Y.join(t,_t.fileName);super(`This command can only be run from within a workspace of your project (${s} isn't a workspace of ${a}).`)}};Ge();bt();iA();Sc();uv();jt();var $it=et(hi());Jo();var xde=()=>new Map([["@yarnpkg/cli",Kv],["@yarnpkg/core",Vv],["@yarnpkg/fslib",M2],["@yarnpkg/libzip",lv],["@yarnpkg/parsers",W2],["@yarnpkg/shell",hv],["clipanion",nB],["semver",$it],["typanion",qs]]);Ge();async function VI(e,t){let{project:r,workspace:s}=await Tt.find(e,t);if(!s)throw new ar(r.cwd,t);return s}Ge();bt();iA();Sc();uv();jt();var mbt=et(hi());Jo();var G5={};Vt(G5,{AddCommand:()=>$I,BinCommand:()=>eC,CacheCleanCommand:()=>tC,ClipanionCommand:()=>aC,ConfigCommand:()=>sC,ConfigGetCommand:()=>rC,ConfigSetCommand:()=>nC,ConfigUnsetCommand:()=>iC,DedupeCommand:()=>oC,EntryCommand:()=>cC,ExecCommand:()=>fC,ExplainCommand:()=>hC,ExplainPeerRequirementsCommand:()=>AC,HelpCommand:()=>lC,InfoCommand:()=>dC,LinkCommand:()=>mC,NodeCommand:()=>yC,PluginCheckCommand:()=>EC,PluginImportCommand:()=>wC,PluginImportSourcesCommand:()=>BC,PluginListCommand:()=>IC,PluginRemoveCommand:()=>vC,PluginRuntimeCommand:()=>SC,RebuildCommand:()=>bC,RemoveCommand:()=>DC,RunCommand:()=>xC,RunIndexCommand:()=>PC,SetResolutionCommand:()=>kC,SetVersionCommand:()=>pC,SetVersionSourcesCommand:()=>CC,UnlinkCommand:()=>QC,UpCommand:()=>TC,VersionCommand:()=>uC,WhyCommand:()=>RC,WorkspaceCommand:()=>MC,WorkspacesListCommand:()=>LC,YarnCommand:()=>gC,dedupeUtils:()=>YR,default:()=>pat,suggestUtils:()=>ef});var $0e=et(N0());Ge();Ge();Ge();jt();var m0e=et(Xv());Jo();var ef={};Vt(ef,{Modifier:()=>E5,Strategy:()=>GR,Target:()=>$v,WorkspaceModifier:()=>A0e,applyModifier:()=>Eot,disableTimeGate:()=>XI,extractDescriptorFromPath:()=>I5,extractRangeModifier:()=>p0e,fetchDescriptorFrom:()=>C5,findProjectDescriptors:()=>g0e,getModifier:()=>eS,getSuggestedDescriptors:()=>tS,makeWorkspaceDescriptor:()=>d0e,toWorkspaceModifier:()=>h0e});Ge();Ge();bt();var y5=et(hi()),mot="workspace:",$v=(s=>(s.REGULAR="dependencies",s.DEVELOPMENT="devDependencies",s.PEER="peerDependencies",s))($v||{}),E5=(s=>(s.CARET="^",s.TILDE="~",s.EXACT="",s))(E5||{}),A0e=(s=>(s.CARET="^",s.TILDE="~",s.EXACT="*",s))(A0e||{}),GR=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(GR||{});function XI(e){e.useWithSource("",{npmMinimalAgeGate:"0"},e.startingCwd,{overwrite:!0});let t=e.get("npmScopes");for(let r of t.values())r.delete("npmMinimalAgeGate")}function eS(e,t){return e.exact?"":e.caret?"^":e.tilde?"~":t.configuration.get("defaultSemverRangePrefix")}var yot=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function p0e(e,{project:t}){let r=e.match(yot);return r?r[1]:t.configuration.get("defaultSemverRangePrefix")}function Eot(e,t){let{protocol:r,source:s,params:a,selector:n}=H.parseRange(e.range);return y5.default.valid(n)&&(n=`${t}${e.range}`),H.makeDescriptor(e,H.makeRange({protocol:r,source:s,params:a,selector:n}))}function h0e(e){switch(e){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${e}"`)}}function d0e(e,t){return H.makeDescriptor(e.anchoredDescriptor,`${mot}${h0e(t)}`)}async function g0e(e,{project:t,target:r}){let s=new Map,a=n=>{let c=s.get(n.descriptorHash);return c||s.set(n.descriptorHash,c={descriptor:n,locators:[]}),c};for(let n of t.workspaces)if(r==="peerDependencies"){let c=n.manifest.peerDependencies.get(e.identHash);c!==void 0&&a(c).locators.push(n.anchoredLocator)}else{let c=n.manifest.dependencies.get(e.identHash),f=n.manifest.devDependencies.get(e.identHash);r==="devDependencies"?f!==void 0?a(f).locators.push(n.anchoredLocator):c!==void 0&&a(c).locators.push(n.anchoredLocator):c!==void 0?a(c).locators.push(n.anchoredLocator):f!==void 0&&a(f).locators.push(n.anchoredLocator)}return s}async function I5(e,{cwd:t,workspace:r}){return await Cot(async s=>{Y.isAbsolute(e)||(e=Y.relative(r.cwd,Y.resolve(t,e)),e.match(/^\.{0,2}\//)||(e=`./${e}`));let{project:a}=r,n=await C5(H.makeIdent(null,"archive"),e,{project:r.project,cache:s,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let c=new Qi,f=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:s,fetcher:p,report:c,resolver:f},E=f.bindDescriptor(n,r.anchoredLocator,h),C=H.convertDescriptorToLocator(E),S=await p.fetch(C,h),x=await _t.find(S.prefixPath,{baseFs:S.packageFs});if(!x.name)throw new Error("Target path doesn't have a name");return H.makeDescriptor(x.name,e)})}function Iot(e){if(e.range==="unknown")return{type:"resolve",range:"latest"};if(kr.validRange(e.range))return{type:"fixed",range:e.range};if(jp.test(e.range))return{type:"resolve",range:e.range};let t=e.range.match(/^(?:jsr:|npm:)(.*)/);if(!t)return{type:"fixed",range:e.range};let[,r]=t,s=`${H.stringifyIdent(e)}@`;return r.startsWith(s)&&(r=r.slice(s.length)),kr.validRange(r)?{type:"fixed",range:e.range}:jp.test(r)?{type:"resolve",range:e.range}:{type:"fixed",range:e.range}}async function tS(e,{project:t,workspace:r,cache:s,target:a,fixed:n,modifier:c,strategies:f,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let h=!n||e.range==="unknown"?Iot(e):{type:"fixed",range:e.range};if(h.type==="fixed")return{suggestions:[{descriptor:e,name:`Use ${H.prettyDescriptor(t.configuration,e)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let E=typeof r<"u"&&r!==null&&r.manifest[a].get(e.identHash)||null,C=[],S=[],x=async I=>{try{await I()}catch(R){S.push(R)}};for(let I of f){if(C.length>=p)break;switch(I){case"keep":await x(async()=>{E&&C.push({descriptor:E,name:`Keep ${H.prettyDescriptor(t.configuration,E)}`,reason:"(no changes)"})});break;case"reuse":await x(async()=>{for(let{descriptor:R,locators:N}of(await g0e(e,{project:t,target:a})).values()){if(N.length===1&&N[0].locatorHash===r.anchoredLocator.locatorHash&&f.includes("keep"))continue;let U=`(originally used by ${H.prettyLocator(t.configuration,N[0])}`;U+=N.length>1?` and ${N.length-1} other${N.length>2?"s":""})`:")",C.push({descriptor:R,name:`Reuse ${H.prettyDescriptor(t.configuration,R)}`,reason:U})}});break;case"cache":await x(async()=>{for(let R of t.storedDescriptors.values())R.identHash===e.identHash&&C.push({descriptor:R,name:`Reuse ${H.prettyDescriptor(t.configuration,R)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await x(async()=>{if(r.manifest.name!==null&&e.identHash===r.manifest.name.identHash)return;let R=t.tryWorkspaceByIdent(e);if(R===null)return;let N=d0e(R,c);C.push({descriptor:N,name:`Attach ${H.prettyDescriptor(t.configuration,N)}`,reason:`(local workspace at ${ue.pretty(t.configuration,R.relativeCwd,ue.Type.PATH)})`})});break;case"latest":{let R=t.configuration.get("enableNetwork"),N=t.configuration.get("enableOfflineMode");await x(async()=>{if(a==="peerDependencies")C.push({descriptor:H.makeDescriptor(e,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!R&&!N)C.push({descriptor:null,name:"Resolve from latest",reason:ue.pretty(t.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let U=await C5(e,h.range,{project:t,cache:s,workspace:r,modifier:c});U&&C.push({descriptor:U,name:`Use ${H.prettyDescriptor(t.configuration,U)}`,reason:`(resolved from ${N?"the cache":"latest"})`})}})}break}}return{suggestions:C.slice(0,p),rejections:S.slice(0,p)}}async function C5(e,t,{project:r,cache:s,workspace:a,preserveModifier:n=!0,modifier:c}){let f=r.configuration.normalizeDependency(H.makeDescriptor(e,t)),p=new Qi,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),C={project:r,fetcher:h,cache:s,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},S={...C,resolver:E,fetchOptions:C},x=E.bindDescriptor(f,a.anchoredLocator,S),I=await E.getCandidates(x,{},S);if(I.length===0)return null;let R=I[0],{protocol:N,source:U,params:K,selector:$}=H.parseRange(H.convertToManifestRange(R.reference));if(N===r.configuration.get("defaultProtocol")&&(N=null),y5.default.valid($)){let ie=$;if(typeof c<"u")$=c+$;else if(n!==!1){let ge=typeof n=="string"?n:f.range;$=p0e(ge,{project:r})+$}let fe=H.makeDescriptor(R,H.makeRange({protocol:N,source:U,params:K,selector:$}));(await E.getCandidates(r.configuration.normalizeDependency(fe),{},S)).length!==1&&($=ie)}return H.makeDescriptor(R,H.makeRange({protocol:N,source:U,params:K,selector:$}))}async function Cot(e){return await ae.mktempPromise(async t=>{let r=Je.create(t);return r.useWithSource(t,{enableMirror:!1,compressionLevel:0},t,{overwrite:!0}),await e(new zr(t,{configuration:r,check:!1,immutable:!1}))})}var $I=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=he.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=he.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=he.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=he.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=he.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=he.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=he.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=he.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=he.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=he.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.noTimeGate=he.Boolean("--no-time-gate",!1,{description:"Disable the minimum release age check for this command"});this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)});this.silent=he.Boolean("--silent",{hidden:!0});this.packages=he.Rest()}static{this.paths=[["add"]]}static{this.usage=st.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 latter 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/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"],["Add a local package (gzipped tarball format) to the current workspace","$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);this.noTimeGate&&XI(r);let{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=f||r.get("preferReuse"),h=eS(this,s),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(K=>typeof K<"u"),C=f?1/0:1,S=K=>{let $=H.tryParseDescriptor(K.slice(4));return $?$.range==="unknown"?H.makeDescriptor($,`jsr:${H.stringifyIdent($)}@latest`):H.makeDescriptor($,`jsr:${$.range}`):null},x=await Promise.all(this.packages.map(async K=>{let $=K.match(/^\.{0,2}\//)?await I5(K,{cwd:this.context.cwd,workspace:a}):K.startsWith("jsr:")?S(K):H.tryParseDescriptor(K),ie=K.match(/^(https?:|git@github)/);if(ie)throw new ot(`It seems you are trying to add a package using a ${ue.pretty(r,`${ie[0]}...`,ue.Type.RANGE)} url; we now require package names to be explicitly specified. +Try running the command again with the package name prefixed: ${ue.pretty(r,"yarn add",ue.Type.CODE)} ${ue.pretty(r,H.makeDescriptor(H.makeIdent(null,"my-package"),`${ie[0]}...`),ue.Type.DESCRIPTOR)}`);if(!$)throw new ot(`The ${ue.pretty(r,K,ue.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let fe=wot(a,$,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(fe.map(async ge=>{let pe=await tS($,{project:s,workspace:a,cache:n,fixed:c,target:ge,modifier:h,strategies:E,maxResults:C});return{request:$,suggestedDescriptors:pe,target:ge}}))})).then(K=>K.flat()),I=await fA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async K=>{for(let{request:$,suggestedDescriptors:{suggestions:ie,rejections:fe}}of x)if(ie.filter(ge=>ge.descriptor!==null).length===0){let[ge]=fe;if(typeof ge>"u")throw new Error("Assertion failed: Expected an error to have been set");s.configuration.get("enableNetwork")?K.reportError(27,`${H.prettyDescriptor(r,$)} can't be resolved to a satisfying range`):K.reportError(27,`${H.prettyDescriptor(r,$)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),K.reportSeparator(),K.reportExceptionOnce(ge)}});if(I.hasErrors())return I.exitCode();let R=!1,N=[],U=[];for(let{suggestedDescriptors:{suggestions:K},target:$}of x){let ie,fe=K.filter(De=>De.descriptor!==null),le=fe[0].descriptor,ge=fe.every(De=>H.areDescriptorsEqual(De.descriptor,le));fe.length===1||ge?ie=le:(R=!0,{answer:ie}=await(0,m0e.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:K.map(({descriptor:De,name:ye,reason:d})=>De?{name:ye,hint:d,descriptor:De}:{name:ye,hint:d,disabled:!0}),onCancel:()=>process.exit(130),result(De){return this.find(De,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let pe=a.manifest[$].get(ie.identHash);(typeof pe>"u"||pe.descriptorHash!==ie.descriptorHash)&&(a.manifest[$].set(ie.identHash,ie),this.optional&&($==="dependencies"?a.manifest.ensureDependencyMeta({...ie,range:"unknown"}).optional=!0:$==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...ie,range:"unknown"}).optional=!0)),typeof pe>"u"?N.push([a,$,ie,E]):U.push([a,$,pe,ie]))}return await r.triggerMultipleHooks(K=>K.afterWorkspaceDependencyAddition,N),await r.triggerMultipleHooks(K=>K.afterWorkspaceDependencyReplacement,U),R&&this.context.stdout.write(` +`),await s.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function wot(e,t,{dev:r,peer:s,preferDev:a,optional:n}){let c=e.manifest.dependencies.has(t.identHash),f=e.manifest.devDependencies.has(t.identHash),p=e.manifest.peerDependencies.has(t.identHash);if((r||s)&&c)throw new ot(`Package "${H.prettyIdent(e.project.configuration,t)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!s&&p)throw new ot(`Package "${H.prettyIdent(e.project.configuration,t)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&f)throw new ot(`Package "${H.prettyIdent(e.project.configuration,t)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!s&&p)throw new ot(`Package "${H.prettyIdent(e.project.configuration,t)}" 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||a)&&n)throw new ot(`Package "${H.prettyIdent(e.project.configuration,t)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return s&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:f?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ge();Ge();jt();var eC=class extends ft{constructor(){super(...arguments);this.verbose=he.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=he.String({required:!1})}static{this.paths=[["bin"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Tt.find(r,this.context.cwd);if(await s.restoreInstallState(),this.name){let f=(await wn.getPackageAccessibleBinaries(a,{project:s})).get(this.name);if(!f)throw new ot(`Couldn't find a binary named "${this.name}" for package "${H.prettyLocator(r,a)}"`);let[,p]=f;return this.context.stdout.write(`${p} +`),0}return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async c=>{let f=await wn.getPackageAccessibleBinaries(a,{project:s}),h=Array.from(f.keys()).reduce((E,C)=>Math.max(E,C.length),0);for(let[E,[C,S]]of f)c.reportJson({name:E,source:H.stringifyIdent(C),path:S});if(this.verbose)for(let[E,[C]]of f)c.reportInfo(null,`${E.padEnd(h," ")} ${H.prettyLocator(r,C)}`);else for(let E of f.keys())c.reportInfo(null,E)})).exitCode()}};Ge();bt();jt();var tC=class extends ft{constructor(){super(...arguments);this.mirror=he.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=he.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}static{this.paths=[["cache","clean"],["cache","clear"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);if(!r.get("enableCacheClean"))throw new ot("Cache cleaning is currently disabled. To enable it, set `enableCacheClean: true` in your configuration file. Note: Cache cleaning is typically not required and should be avoided when using Zero-Installs.");let s=await zr.find(r);return(await Ft.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&s.mirrorCwd!==null,c=!this.mirror;n&&(await ae.removePromise(s.mirrorCwd),await r.triggerHook(f=>f.cleanGlobalArtifacts,r)),c&&await ae.removePromise(s.cwd)})).exitCode()}};Ge();jt();Zl();var w5=Ce("util"),rC=class extends ft{constructor(){super(...arguments);this.why=he.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=he.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=he.String()}static{this.paths=[["config","get"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(s)>"u")throw new ot(`Couldn't find a configuration settings named "${s}"`);let c=r.getSpecial(s,{hideSecrets:!this.unsafe,getNativePaths:!0}),f=qe.convertMapsToIndexableObjects(c),p=a?xa(f,a):f,h=await Ft.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} +`),h.exitCode();w5.inspect.styles.name="cyan",this.context.stdout.write(`${(0,w5.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} +`)}return h.exitCode()}};Ge();jt();Zl();var B5=Ce("util"),nC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=he.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=he.String();this.value=he.String()}static{this.paths=[["config","set"]]}static{this.usage=st.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"`]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new ot("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new ot(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new ot("This setting only affects the file it's in, and thus cannot be set from the CLI");let f=this.json?JSON.parse(this.value):this.value;await(this.home?I=>Je.updateHomeConfiguration(I):I=>Je.updateConfiguration(s(),I))(I=>{if(n){let R=pd(I);return J0(R,this.name,f),R}else return{...I,[a]:f}});let E=(await Je.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),C=qe.convertMapsToIndexableObjects(E),S=n?xa(C,n):C;return(await Ft.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async I=>{B5.inspect.styles.name="cyan",I.reportInfo(0,`Successfully set ${this.name} to ${(0,B5.inspect)(S,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Ge();jt();Zl();var iC=class extends ft{constructor(){super(...arguments);this.home=he.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=he.String()}static{this.paths=[["config","unset"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new ot("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new ot(`Couldn't find a configuration settings named "${a}"`);let f=this.home?h=>Je.updateHomeConfiguration(h):h=>Je.updateConfiguration(s(),h);return(await Ft.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await f(C=>{if(!CB(C,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,C;let S=n?pd(C):{...C};return hd(S,this.name),S}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ge();bt();jt();var qR=Ce("util"),sC=class extends ft{constructor(){super(...arguments);this.noDefaults=he.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=he.Boolean("-v,--verbose",{hidden:!0});this.why=he.Boolean("--why",{hidden:!0});this.names=he.Rest()}static{this.paths=[["config"]]}static{this.usage=st.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins,{strict:!1}),s=await kI({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(s!==null)return s;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,c=await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async f=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)f.reportError(34,`Invalid configuration key "${p}" in ${h}`);f.reportSeparator()}if(this.json)for(let p of a){if(this.noDefaults&&!r.sources.has(p))continue;let h=r.settings.get(p);typeof h>"u"&&f.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),C=r.sources.get(p)??"",S=C&&C[0]!=="<"?Ae.fromPortablePath(C):C;f.reportJson({key:p,effective:E,source:S,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let C of a){if(this.noDefaults&&!r.sources.has(C))continue;let S=r.settings.get(C),x=r.sources.get(C)??"",I=r.getSpecial(C,{hideSecrets:!0,getNativePaths:!0}),R={Description:{label:"Description",value:ue.tuple(ue.Type.MARKDOWN,{text:S.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:ue.tuple(x[0]==="<"?ue.Type.CODE:ue.Type.PATH,x)}};h[C]={value:ue.tuple(ue.Type.CODE,C),children:R};let N=(U,K)=>{for(let[$,ie]of K)if(ie instanceof Map){let fe={};U[$]={children:fe},N(fe,ie)}else U[$]={label:$,value:ue.tuple(ue.Type.NO_HINT,(0,qR.inspect)(ie,p))}};I instanceof Map?N(R,I):R.Value={label:"Value",value:ue.tuple(ue.Type.NO_HINT,(0,qR.inspect)(I,p))}}a.length!==1&&(n=void 0),ts.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let f=a[0],p=(0,qR.inspect)(r.getSpecial(f,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` +`),this.context.stdout.write(`${p} +`)}return c.exitCode()}};Ge();jt();Jo();var YR={};Vt(YR,{Strategy:()=>rS,acceptedStrategies:()=>Bot,dedupe:()=>v5});Ge();Ge();var y0e=et(Zo()),rS=(t=>(t.HIGHEST="highest",t))(rS||{}),Bot=new Set(Object.values(rS)),vot={highest:async(e,t,{resolver:r,fetcher:s,resolveOptions:a,fetchOptions:n})=>{let c=new Map;for(let[p,h]of e.storedResolutions){let E=e.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);qe.getSetWithDefault(c,E.identHash).add(h)}let f=new Map(qe.mapAndFilter(e.storedDescriptors.values(),p=>H.isVirtualDescriptor(p)?qe.mapAndFilter.skip:[p.descriptorHash,qe.makeDeferred()]));for(let p of e.storedDescriptors.values()){let h=f.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=e.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let C=e.originalPackages.get(E);if(typeof C>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let S=r.getResolutionDependencies(p,a),x=Object.fromEntries(await qe.allSettledSafe(Object.entries(S).map(async([$,ie])=>{let fe=f.get(ie.descriptorHash);if(typeof fe>"u")throw new Error(`Assertion failed: The descriptor (${ie.descriptorHash}) should have been registered`);let le=await fe.promise;if(!le)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[$,le.updatedPackage]})));if(t.length&&!y0e.default.isMatch(H.stringifyIdent(p),t)||!r.shouldPersistResolution(C,a))return C;let I=c.get(p.identHash);if(typeof I>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(I.size===1)return C;let R=[...I].map($=>{let ie=e.originalPackages.get($);if(typeof ie>"u")throw new Error(`Assertion failed: The package (${$}) should have been registered`);return ie}),N=await r.getSatisfying(p,x,R,a),U=N.locators?.[0];if(typeof U>"u"||!N.sorted)return C;let K=e.originalPackages.get(U.locatorHash);if(typeof K>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return K}).then(async S=>{let x=await e.preparePackage(S,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:C,updatedPackage:S,resolvedPackage:x})}).catch(S=>{h.reject(S)})}return[...f.values()].map(p=>p.promise)}};async function v5(e,{strategy:t,patterns:r,cache:s,report:a}){let{configuration:n}=e,c=new Qi,f=n.makeResolver(),p=n.makeFetcher(),h={cache:s,checksums:e.storedChecksums,fetcher:p,project:e,report:c,cacheOptions:{skipIntegrityCheck:!0}},E={project:e,resolver:f,report:c,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let C=vot[t],S=await C(e,r,{resolver:f,resolveOptions:E,fetcher:p,fetchOptions:h}),x=Io.progressViaCounter(S.length);await a.reportProgress(x);let I=0;await Promise.all(S.map(U=>U.then(K=>{if(K===null||K.currentPackage.locatorHash===K.updatedPackage.locatorHash)return;I++;let{descriptor:$,currentPackage:ie,updatedPackage:fe}=K;a.reportInfo(0,`${H.prettyDescriptor(n,$)} can be deduped from ${H.prettyLocator(n,ie)} to ${H.prettyLocator(n,fe)}`),a.reportJson({descriptor:H.stringifyDescriptor($),currentResolution:H.stringifyLocator(ie),updatedResolution:H.stringifyLocator(fe)}),e.storedResolutions.set($.descriptorHash,fe.locatorHash)}).finally(()=>x.tick())));let R;switch(I){case 0:R="No packages";break;case 1:R="One package";break;default:R=`${I} packages`}let N=ue.pretty(n,t,ue.Type.CODE);return a.reportInfo(0,`${R} can be deduped using the ${N} strategy`),I})}var oC=class extends ft{constructor(){super(...arguments);this.strategy=he.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:Qs(rS)});this.check=he.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)});this.patterns=he.Rest()}static{this.paths=[["dedupe"]]}static{this.usage=st.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 latter 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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=await zr.find(r);await s.restoreInstallState({restoreResolutions:!1});let n=0,c=await Ft.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async f=>{n=await v5(s,{strategy:this.strategy,patterns:this.patterns,cache:a,report:f})});return c.hasErrors()?c.exitCode():this.check?n?1:0:await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ge();jt();var aC=class extends ft{static{this.paths=[["--clipanion=definitions"]]}async execute(){let{plugins:t}=await Je.find(this.context.cwd,this.context.plugins),r=[];for(let c of t){let{commands:f}=c[1];if(f){let h=ba.from(f).definitions();r.push([c[0],h])}}let s=this.cli.definitions(),a=(c,f)=>c.split(" ").slice(1).join()===f.split(" ").slice(1).join(),n=E0e()["@yarnpkg/builder"].bundles.standard;for(let c of r){let f=c[1];for(let p of f)s.find(h=>a(h.path,p.path)).plugin={name:c[0],isDefault:n.includes(c[0])}}this.context.stdout.write(`${JSON.stringify(s,null,2)} +`)}};var lC=class extends ft{static{this.paths=[["help"],["--help"],["-h"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ge();bt();jt();var cC=class extends ft{constructor(){super(...arguments);this.leadingArgument=he.String();this.args=he.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!H.tryParseIdent(this.leadingArgument)){let r=Y.resolve(this.context.cwd,Ae.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ge();var uC=class extends ft{static{this.paths=[["-v"],["--version"]]}async execute(){this.context.stdout.write(`${An||""} +`)}};Ge();Ge();jt();var fC=class extends ft{constructor(){super(...arguments);this.commandName=he.String();this.args=he.Proxy()}static{this.paths=[["exec"]]}static{this.usage=st.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"']]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Tt.find(r,this.context.cwd);return await s.restoreInstallState(),await wn.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:s})}};Ge();jt();Jo();var AC=class extends ft{constructor(){super(...arguments);this.hash=he.String({required:!1,validator:ld(Jf(),[Sp(/^p[0-9a-f]{6}$/)])})}static{this.paths=[["explain","peer-requirements"]]}static{this.usage=st.Usage({description:"explain a set of peer requirements",details:` + A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters. + + When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not. + + When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement. + + **Note:** A hash is a seven-letter code consisting of the letter 'p' followed by six characters that can be obtained from peer dependency warnings or from the list of all peer requirements(\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding peer requirement for a hash","$0 explain peer-requirements p1a4ed"],["List all peer requirements","$0 explain peer-requirements"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),await s.applyLightResolution(),typeof this.hash<"u"?await bot(this.hash,s,{stdout:this.context.stdout}):await Dot(s,{stdout:this.context.stdout})}};async function bot(e,t,r){let s=t.peerRequirementNodes.get(e);if(typeof s>"u")throw new Error(`No peerDependency requirements found for hash: "${e}"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:ue.tuple(ue.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:ue.tuple(ue.Type.NO_HINT,"...")}]:[]}:(a.add(p.requester.locatorHash),{value:ue.tuple(ue.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[H.stringifyLocator(h.requester),n(h)]))}),c=t.peerWarnings.find(p=>p.hash===e);return(await Ft.start({configuration:t.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=ue.mark(t.configuration),E=c?h.Cross:h.Check;if(p.reportInfo(0,`Package ${ue.pretty(t.configuration,s.subject,ue.Type.LOCATOR)} is requested to provide ${ue.pretty(t.configuration,s.ident,ue.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,ue.pretty(t.configuration,s.subject,ue.Type.LOCATOR)),ts.emitTree({children:Object.fromEntries(Array.from(s.requests.values(),C=>[H.stringifyLocator(C.requester),n(C)]))},{configuration:t.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),s.provided.range==="missing:"){let C=c?"":" , but all peer requests are optional";p.reportInfo(0,`${E} Package ${ue.pretty(t.configuration,s.subject,ue.Type.LOCATOR)} does not provide ${ue.pretty(t.configuration,s.ident,ue.Type.IDENT)}${C}.`)}else{let C=t.storedResolutions.get(s.provided.descriptorHash);if(!C)throw new Error("Assertion failed: Expected the descriptor to be registered");let S=t.storedPackages.get(C);if(!S)throw new Error("Assertion failed: Expected the package to be registered");p.reportInfo(0,`${E} Package ${ue.pretty(t.configuration,s.subject,ue.Type.LOCATOR)} provides ${ue.pretty(t.configuration,s.ident,ue.Type.IDENT)} with version ${H.prettyReference(t.configuration,S.version??"0.0.0")}, ${c?"which does not satisfy all requests.":"which satisfies all requests"}`),c?.type===3&&(c.range?p.reportInfo(0,` The combined requested range is ${ue.pretty(t.configuration,c.range,ue.Type.RANGE)}`):p.reportInfo(0," Unfortunately, the requested ranges have no overlap"))}})).exitCode()}async function Dot(e,t){return(await Ft.start({configuration:e.configuration,stdout:t.stdout,includeFooter:!1,includePrefix:!1},async s=>{let a=ue.mark(e.configuration),n=qe.sortMap(e.peerRequirementNodes,[([,c])=>H.stringifyLocator(c.subject),([,c])=>H.stringifyIdent(c.ident)]);for(let[,c]of n.values()){if(!c.root)continue;let f=e.peerWarnings.find(E=>E.hash===c.hash),p=[...H.allPeerRequests(c)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=" and 1 other dependency":h="",c.provided.range!=="missing:"){let E=e.storedResolutions.get(c.provided.descriptorHash);if(!E)throw new Error("Assertion failed: Expected the resolution to have been registered");let C=e.storedPackages.get(E);if(!C)throw new Error("Assertion failed: Expected the provided package to have been registered");let S=`${ue.pretty(e.configuration,c.hash,ue.Type.CODE)} \u2192 ${f?a.Cross:a.Check} ${H.prettyLocator(e.configuration,c.subject)} provides ${H.prettyLocator(e.configuration,C)} to ${H.prettyLocator(e.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,S):s.reportInfo(0,S)}else{let E=`${ue.pretty(e.configuration,c.hash,ue.Type.CODE)} \u2192 ${f?a.Cross:a.Check} ${H.prettyLocator(e.configuration,c.subject)} doesn't provide ${H.prettyIdent(e.configuration,c.ident)} to ${H.prettyLocator(e.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,E):s.reportInfo(0,E)}}})).exitCode()}Ge();jt();Jo();Ge();Ge();bt();jt();var I0e=et(hi()),pC=class extends ft{constructor(){super(...arguments);this.useYarnPath=he.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=he.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=he.String()}static{this.paths=[["set","version"]]}static{this.usage=st.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over 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 different behavior.\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"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let f=r.sources.get("yarnPath");if(!f)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(Y.contains(p,f))return 0}let s=()=>{if(typeof An>"u")throw new ot("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(f,p)=>({version:p,url:f.replace(/\{\}/g,p)});if(this.version==="self")a={url:s(),version:An??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await nS(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await nS(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.version))a={url:`file://${Y.resolve(Ae.toPortablePath(this.version))}`,version:"file"};else if(kr.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(kr.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(kr.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await Pot(r,this.version));else throw new ot(`Invalid version descriptor "${this.version}"`);return(await Ft.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async f=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(f.reportInfo(0,`Retrieving ${ue.pretty(r,a.url,ue.Type.PATH)}`),await ae.readFilePromise(a.url.slice(h.length))):(f.reportInfo(0,`Downloading ${ue.pretty(r,a.url,ue.Type.URL)}`),await nn.get(a.url,{configuration:r}))};await S5(r,a.version,p,{report:f,useYarnPath:this.useYarnPath})})).exitCode()}};async function Pot(e,t){let s=(await nn.get("https://repo.yarnpkg.com/tags",{configuration:e,jsonResponse:!0})).tags.filter(a=>kr.satisfiesWithPrereleases(a,t));if(s.length===0)throw new ot(`No matching release found for range ${ue.pretty(e,t,ue.Type.RANGE)}.`);return s[0]}async function nS(e,t){let r=await nn.get("https://repo.yarnpkg.com/tags",{configuration:e,jsonResponse:!0});if(!r.latest[t])throw new ot(`Tag ${ue.pretty(e,t,ue.Type.RANGE)} not found`);return r.latest[t]}async function S5(e,t,r,{report:s,useYarnPath:a}){let n,c=async()=>(typeof n>"u"&&(n=await r()),n);if(t===null){let $=await c();await ae.mktempPromise(async ie=>{let fe=Y.join(ie,"yarn.cjs");await ae.writeFilePromise(fe,$);let{stdout:le}=await Yr.execvp(process.execPath,[Ae.fromPortablePath(fe),"--version"],{cwd:ie,env:{...e.env,YARN_IGNORE_PATH:"1"}});if(t=le.trim(),!I0e.default.valid(t))throw new Error(`Invalid semver version. ${ue.pretty(e,"yarn --version",ue.Type.CODE)} returned: +${t}`)})}let f=e.projectCwd??e.startingCwd,p=Y.resolve(f,".yarn/releases"),h=Y.resolve(p,`yarn-${t}.cjs`),E=Y.relative(e.startingCwd,h),C=qe.isTaggedYarnVersion(t),S=e.get("yarnPath"),x=!C,I=x||!!S||!!a;if(a===!1){if(x)throw new Lt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");I=!1}else!I&&!process.env.COREPACK_ROOT&&(s.reportWarning(0,`You don't seem to have ${ue.applyHyperlink(e,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${ue.applyHyperlink(e,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),I=!0);if(I){let $=await c();s.reportInfo(0,`Saving the new release in ${ue.pretty(e,E,"magenta")}`),await ae.removePromise(Y.dirname(h)),await ae.mkdirPromise(Y.dirname(h),{recursive:!0}),await ae.writeFilePromise(h,$,{mode:493}),await Je.updateConfiguration(f,{yarnPath:Y.relative(f,h)})}else await ae.removePromise(Y.dirname(h)),await Je.updateConfiguration(f,{yarnPath:Je.deleteProperty});let R=await _t.tryFind(f)||new _t;R.packageManager=`yarn@${C?t:await nS(e,"stable")}`;let N={};R.exportTo(N);let U=Y.join(f,_t.fileName),K=`${JSON.stringify(N,null,R.indent)} +`;return await ae.changeFilePromise(U,K,{automaticNewlines:!0}),{bundleVersion:t}}function C0e(e){return pr[Vx(e)]}var xot=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function kot(e){let r=`https://repo.yarnpkg.com/${qe.isTaggedYarnVersion(An)?An:await nS(e,"canary")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,s=await nn.get(r,{configuration:e});return new Map(Array.from(s.toString().matchAll(xot),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=C0e(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var hC=class extends ft{constructor(){super(...arguments);this.code=he.String({required:!1,validator:z2(Jf(),[Sp(/^YN[0-9]{4}$/)])});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["explain"]]}static{this.usage=st.Usage({description:"explain an error code",details:` + When the code argument is specified, this command prints its name and its details. + + When used without arguments, this command lists all error codes and their names. + `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let s=C0e(this.code),a=ue.pretty(r,s,ue.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),f=(await kot(r)).get(this.code),p=typeof f<"u"?ue.jsonOrPretty(this.json,r,ue.tuple(ue.Type.MARKDOWN,{text:f,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. + +You can help us by editing this page on GitHub \u{1F642}: +${ue.jsonOrPretty(this.json,r,ue.tuple(ue.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx"))} +`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:s,details:p})} +`):this.context.stdout.write(`${n} + +${p} +`)}else{let s={children:qe.mapAndFilter(Object.entries(pr),([a,n])=>Number.isNaN(Number(a))?qe.mapAndFilter.skip:{label:zf(Number(a)),value:ue.tuple(ue.Type.CODE,n)})};ts.emitTree(s,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ge();bt();jt();var w0e=et(Zo()),dC=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=he.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=he.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=he.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=he.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=he.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=he.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=he.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=he.Rest()}static{this.paths=[["info"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a&&!this.all)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=new Set(this.extra);this.cache&&c.add("cache"),this.dependents&&c.add("dependents"),this.manifest&&c.add("manifest");let f=(ie,{recursive:fe})=>{let le=ie.anchoredLocator.locatorHash,ge=new Map,pe=[le];for(;pe.length>0;){let De=pe.shift();if(ge.has(De))continue;let ye=s.storedPackages.get(De);if(typeof ye>"u")throw new Error("Assertion failed: Expected the package to be registered");if(ge.set(De,ye),H.isVirtualLocator(ye)&&pe.push(H.devirtualizeLocator(ye).locatorHash),!(!fe&&De!==le))for(let d of ye.dependencies.values()){let ve=s.storedResolutions.get(d.descriptorHash);if(typeof ve>"u")throw new Error("Assertion failed: Expected the resolution to be registered");pe.push(ve)}}return ge.values()},p=({recursive:ie})=>{let fe=new Map;for(let le of s.workspaces)for(let ge of f(le,{recursive:ie}))fe.set(ge.locatorHash,ge);return fe.values()},h=({all:ie,recursive:fe})=>ie&&fe?s.storedPackages.values():ie?p({recursive:fe}):f(a,{recursive:fe}),E=({all:ie,recursive:fe})=>{let le=h({all:ie,recursive:fe}),ge=this.patterns.map(ye=>{let d=H.parseLocator(ye),ve=w0e.default.makeRe(H.stringifyIdent(d)),Ie=H.isVirtualLocator(d),me=Ie?H.devirtualizeLocator(d):d;return ce=>{let X=H.stringifyIdent(ce);if(!ve.test(X))return!1;if(d.reference==="unknown")return!0;let be=H.isVirtualLocator(ce),ke=be?H.devirtualizeLocator(ce):ce;return!(Ie&&be&&d.reference!==ce.reference||me.reference!==ke.reference)}}),pe=qe.sortMap([...le],ye=>H.stringifyLocator(ye));return{selection:pe.filter(ye=>ge.length===0||ge.some(d=>d(ye))),sortedLookup:pe}},{selection:C,sortedLookup:S}=E({all:this.all,recursive:this.recursive});if(C.length===0)throw new ot("No package matched your request");let x=new Map;if(this.dependents)for(let ie of S)for(let fe of ie.dependencies.values()){let le=s.storedResolutions.get(fe.descriptorHash);if(typeof le>"u")throw new Error("Assertion failed: Expected the resolution to be registered");qe.getArrayWithDefault(x,le).push(ie)}let I=new Map;for(let ie of S){if(!H.isVirtualLocator(ie))continue;let fe=H.devirtualizeLocator(ie);qe.getArrayWithDefault(I,fe.locatorHash).push(ie)}let R={},N={children:R},U=r.makeFetcher(),K={project:s,fetcher:U,cache:n,checksums:s.storedChecksums,report:new Qi,cacheOptions:{skipIntegrityCheck:!0}},$=[async(ie,fe,le)=>{if(!fe.has("manifest"))return;let ge=await U.fetch(ie,K),pe;try{pe=await _t.find(ge.prefixPath,{baseFs:ge.packageFs})}finally{ge.releaseFs?.()}le("Manifest",{License:ue.tuple(ue.Type.NO_HINT,pe.license),Homepage:ue.tuple(ue.Type.URL,pe.raw.homepage??null)})},async(ie,fe,le)=>{if(!fe.has("cache"))return;let ge=s.storedChecksums.get(ie.locatorHash)??null,pe=n.getLocatorPath(ie,ge),De;if(pe!==null)try{De=await ae.statPromise(pe)}catch{}let ye=typeof De<"u"?[De.size,ue.Type.SIZE]:void 0;le("Cache",{Checksum:ue.tuple(ue.Type.NO_HINT,ge),Path:ue.tuple(ue.Type.PATH,pe),Size:ye})}];for(let ie of C){let fe=H.isVirtualLocator(ie);if(!this.virtuals&&fe)continue;let le={},ge={value:[ie,ue.Type.LOCATOR],children:le};if(R[H.stringifyLocator(ie)]=ge,this.nameOnly){delete ge.children;continue}let pe=I.get(ie.locatorHash);typeof pe<"u"&&(le.Instances={label:"Instances",value:ue.tuple(ue.Type.NUMBER,pe.length)}),le.Version={label:"Version",value:ue.tuple(ue.Type.NO_HINT,ie.version)};let De=(d,ve)=>{let Ie={};if(le[d]=Ie,Array.isArray(ve))Ie.children=ve.map(me=>({value:me}));else{let me={};Ie.children=me;for(let[ce,X]of Object.entries(ve))typeof X>"u"||(me[ce]={label:ce,value:X})}};if(!fe){for(let d of $)await d(ie,c,De);await r.triggerHook(d=>d.fetchPackageInfo,ie,c,De)}ie.bin.size>0&&!fe&&De("Exported Binaries",[...ie.bin.keys()].map(d=>ue.tuple(ue.Type.PATH,d)));let ye=x.get(ie.locatorHash);typeof ye<"u"&&ye.length>0&&De("Dependents",ye.map(d=>ue.tuple(ue.Type.LOCATOR,d))),ie.dependencies.size>0&&!fe&&De("Dependencies",[...ie.dependencies.values()].map(d=>{let ve=s.storedResolutions.get(d.descriptorHash),Ie=typeof ve<"u"?s.storedPackages.get(ve)??null:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:d,locator:Ie})})),ie.peerDependencies.size>0&&fe&&De("Peer dependencies",[...ie.peerDependencies.values()].map(d=>{let ve=ie.dependencies.get(d.identHash),Ie=typeof ve<"u"?s.storedResolutions.get(ve.descriptorHash)??null:null,me=Ie!==null?s.storedPackages.get(Ie)??null:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:d,locator:me})}))}ts.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ge();bt();Sc();var WR=et(N0());jt();var b5=et(hi());Jo();var Qot=[{selector:e=>e===-1,name:"nodeLinker",value:"node-modules"},{selector:e=>e!==-1&&e<8,name:"enableGlobalCache",value:!1},{selector:e=>e!==-1&&e<8,name:"compressionLevel",value:"mixed"},{selector:e=>e<9,name:"approvedGitRepositories",value:["**"]},{selector:e=>e<9,name:"enableScripts",value:!0},{selector:e=>e<10,name:"npmMinimalAgeGate",value:"0"}],gC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=he.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=he.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=he.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=he.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=he.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=he.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)});this.cacheFolder=he.String("--cache-folder",{hidden:!0});this.frozenLockfile=he.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=he.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=he.Boolean("--non-interactive",{hidden:!0});this.preferOffline=he.Boolean("--prefer-offline",{hidden:!0});this.production=he.Boolean("--production",{hidden:!0});this.registry=he.String("--registry",{hidden:!0});this.silent=he.Boolean("--silent",{hidden:!0});this.networkTimeout=he.String("--network-timeout",{hidden:!0})}static{this.paths=[["install"],st.Default]}static{this.usage=st.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **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: ).\n\n - **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).\n\n - **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).\n\n - **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.\n\n 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.\n\n 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.\n\n 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).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n 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.\n\n 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.\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 latter 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 ",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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let s=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await kI({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!WR.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!WR.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!s},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!WR.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new ot(`${ue.pretty(r,"--immutable",ue.Type.CODE)} and ${ue.pretty(r,"--immutable-cache",ue.Type.CODE)} cannot be used with ${ue.pretty(r,"--mode=update-lockfile",ue.Type.CODE)}`);let c=(this.immutable??r.get("enableImmutableInstalls"))&&!n,f=this.immutableCache&&!n;if(r.projectCwd!==null){let R=await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await Fot(r,c)&&(N.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await Rot(r,c)&&(N.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&N.reportSeparator()});if(R.hasErrors())return R.exitCode()}if(r.projectCwd!==null){let R=await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(Je.telemetry?.isNew)Je.telemetry.commitTips(),N.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),N.reportInfo(65,`Run ${ue.pretty(r,"yarn config set --home enableTelemetry 0",ue.Type.CODE)} to disable`),N.reportSeparator();else if(Je.telemetry?.shouldShowTips){let U=await nn.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let K=null;if(An!==null){let ie=b5.default.prerelease(An)?"canary":"stable",fe=U.latest[ie];fe!==null&&b5.default.gt(fe,An)&&(K=[ie,fe])}if(K)Je.telemetry.commitTips(),N.reportInfo(88,`${ue.applyStyle(r,`A new ${K[0]} version of Yarn is available:`,ue.Style.BOLD)} ${H.prettyReference(r,K[1])}!`),N.reportInfo(88,`Upgrade now by running ${ue.pretty(r,`yarn set version ${K[1]}`,ue.Type.CODE)}`),N.reportSeparator();else{let $=Je.telemetry.selectTip(U.tips);$&&(N.reportInfo(89,ue.pretty(r,$.message,ue.Type.MARKDOWN_INLINE)),$.url&&N.reportInfo(89,`Learn more at ${$.url}`),N.reportSeparator())}}}});if(R.hasErrors())return R.exitCode()}let{project:p,workspace:h}=await Tt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let R=await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let K of Qot)K.selector(E)&&typeof r.sources.get(K.name)>"u"&&(r.use("",{[K.name]:K.value},p.cwd,{overwrite:!0}),U[K.name]=K.value);Object.keys(U).length>0&&(await Je.updateConfiguration(p.cwd,U),N.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),N.reportSeparator())});if(R.hasErrors())return R.exitCode()}let C=await zr.find(r,{immutable:f,check:this.checkCache});if(!h)throw new ar(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let S=r.get("enableHardenedMode");S&&typeof r.sources.get("enableHardenedMode")>"u"&&await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{R.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),R.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${ue.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),R.reportSeparator()}),(this.refreshLockfile??S)&&(p.lockfileNeedsRefresh=!0);let x=this.checkResolutions??S;return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async R=>{await p.install({cache:C,report:R,immutable:c,checkResolutions:x,mode:this.mode})})).exitCode()}},Tot="<<<<<<<";async function Rot(e,t){if(!e.projectCwd)return!1;let r=Y.join(e.projectCwd,yr.lockfile);if(!await ae.existsPromise(r)||!(await ae.readFilePromise(r,"utf8")).includes(Tot))return!1;if(t)throw new Lt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Yr.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:e.projectCwd});if(a.code!==0&&(a=await Yr.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:e.projectCwd})),a.code!==0&&(a=await Yr.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:e.projectCwd})),a.code!==0)throw new Lt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async f=>{let p=await Yr.execvp("git",["show",`${f}:./${yr.lockfile}`],{cwd:e.projectCwd});if(p.code!==0)throw new Lt(83,`Git returned an error when trying to access the lockfile content in ${f}`);try{return us(p.stdout)}catch{throw new Lt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(f=>!!f.__metadata);for(let f of n){if(f.__metadata.version<7)for(let p of Object.keys(f)){if(p==="__metadata")continue;let h=H.parseDescriptor(p,!0),E=e.normalizeDependency(h),C=H.stringifyDescriptor(E);C!==p&&(f[C]=f[p],delete f[p])}for(let p of Object.keys(f)){if(p==="__metadata")continue;let h=f[p].checksum;typeof h>"u"||h.includes("/")||(f[p].checksum=`${f.__metadata.cacheKey}/${h}`)}}let c=Object.assign({},...n);c.__metadata.version=`${Math.min(...n.map(f=>parseInt(f.__metadata.version??0)))}`,c.__metadata.cacheKey="merged";for(let[f,p]of Object.entries(c))typeof p=="string"&&delete c[f];return await ae.changeFilePromise(r,Al(c),{automaticNewlines:!0}),!0}async function Fot(e,t){if(!e.projectCwd)return!1;let r=[],s=Y.join(e.projectCwd,".yarn/plugins/@yarnpkg");return await Je.updateConfiguration(e.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let c=n.filter(f=>{if(!f.path)return!0;let p=Y.resolve(e.projectCwd,f.path),h=nv.has(f.spec)&&Y.contains(s,p);return h&&r.push(p),!h});return c.length===0?Je.deleteProperty:c.length===n.length?n:c}},{immutable:t})?(await Promise.all(r.map(async n=>{await ae.removePromise(n)})),!0):!1}Ge();bt();jt();var mC=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=he.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=he.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=he.Rest()}static{this.paths=[["link"]]}static{this.usage=st.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 one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=s.topLevelWorkspace,f=[];for(let p of this.destinations){let h=Y.resolve(this.context.cwd,Ae.toPortablePath(p)),E=await Je.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Tt.find(E,h);if(s.cwd===C.cwd)throw new ot(`Invalid destination '${p}'; Can't link the project to itself`);if(!S)throw new ar(C.cwd,h);if(this.all){let x=!1;for(let I of C.workspaces)I.manifest.name&&(!I.manifest.private||this.private)&&(f.push(I),x=!0);if(!x)throw new ot(`No workspace found to be linked in the target project: ${p}`)}else{if(!S.manifest.name)throw new ot(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(S.manifest.private&&!this.private)throw new ot(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);f.push(S)}}for(let p of f){let h=H.stringifyIdent(p.anchoredLocator),E=this.relative?Y.relative(s.cwd,p.cwd):p.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};jt();var yC=class extends ft{constructor(){super(...arguments);this.args=he.Proxy()}static{this.paths=[["node"]]}static{this.usage=st.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"]]})}async execute(){return this.cli.run(["exec","node",...this.args])}};Ge();jt();var EC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","check"]]}static{this.usage=st.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` + Check only the plugins from https. + + If this command detects any plugin differences in the CI environment, it will throw an error. + `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=await Je.findRcFiles(this.context.cwd);return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let c of s)if(c.data?.plugins)for(let f of c.data.plugins){if(!f.checksum||!f.spec.match(/^https?:/))continue;let p=await nn.get(f.spec,{configuration:r}),h=Mn.makeHash(p);if(f.checksum===h)continue;let E=ue.pretty(r,f.path,ue.Type.PATH),C=ue.pretty(r,f.spec,ue.Type.URL),S=`${E} is different from the file provided by ${C}`;n.reportJson({...f,newChecksum:h}),n.reportError(0,S)}})).exitCode()}};Ge();Ge();bt();jt();var D0e=Ce("os");Ge();bt();jt();var B0e=Ce("os");Ge();Sc();jt();var Not="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Qm(e,t){let r=await nn.get(Not,{configuration:e}),s=us(r.toString());return Object.fromEntries(Object.entries(s).filter(([a,n])=>!t||kr.satisfiesWithPrereleases(t,n.range??"<4.0.0-rc.1")))}var IC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","list"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Qm(r,An);for(let[c,{experimental:f,...p}]of Object.entries(n)){let h=c;f&&(h+=" [experimental]"),a.reportJson({name:c,experimental:f,...p}),a.reportInfo(null,h)}})).exitCode()}};var Oot=/^[0-9]+$/,Lot=process.platform==="win32";function v0e(e){return Oot.test(e)?`pull/${e}/head`:e}var Mot=({repository:e,branch:t},r)=>[["git","init",Ae.fromPortablePath(r)],["git","remote","add","origin",e],["git","fetch","origin","--depth=1",v0e(t)],["git","reset","--hard","FETCH_HEAD"]],Uot=({branch:e})=>[["git","fetch","origin","--depth=1",v0e(e),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],_ot=({plugins:e,noMinify:t},r,s)=>[["yarn","build:cli",...new Array().concat(...e.map(a=>["--plugin",Y.resolve(s,a)])),...t?["--no-minify"]:[],"|"],[Lot?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",Ae.fromPortablePath(r),"|"]],CC=class extends ft{constructor(){super(...arguments);this.installPath=he.String("--path",{description:"The path where the repository should be cloned to"});this.repository=he.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=he.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=he.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=he.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=he.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=he.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=he.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}static{this.paths=[["set","version","from","sources"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=typeof this.installPath<"u"?Y.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):Y.resolve(Ae.toPortablePath((0,B0e.tmpdir)()),"yarnpkg-sources",Mn.makeHash(this.repository).slice(0,6));return(await Ft.start({configuration:r,stdout:this.context.stdout},async c=>{await D5(this,{configuration:r,report:c,target:a}),c.reportSeparator(),c.reportInfo(0,"Building a fresh bundle"),c.reportSeparator();let f=await Yr.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=Y.join(a,`packages/yarnpkg-cli/bundles/yarn-${f.stdout.trim()}.js`);ae.existsSync(p)||(await iS(_ot(this,p,a),{configuration:r,context:this.context,target:a}),c.reportSeparator());let h=await ae.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await S5(r,null,async()=>h,{report:c});this.skipPlugins||await Hot(this,E,{project:s,report:c,target:a})}})).exitCode()}};async function iS(e,{configuration:t,context:r,target:s}){for(let[a,...n]of e){let c=n[n.length-1]==="|";if(c&&n.pop(),c)await Yr.pipevp(a,n,{cwd:s,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${ue.pretty(t,` $ ${[a,...n].join(" ")}`,"grey")} +`);try{await Yr.execvp(a,n,{cwd:s,strict:!0})}catch(f){throw r.stdout.write(f.stdout||f.stack),f}}}}async function D5(e,{configuration:t,report:r,target:s}){let a=!1;if(!e.force&&ae.existsSync(Y.join(s,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await iS(Uot(e),{configuration:t,context:e.context,target:s}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await ae.removePromise(s),await ae.mkdirPromise(s,{recursive:!0}),await iS(Mot(e,s),{configuration:t,context:e.context,target:s}))}async function Hot(e,t,{project:r,report:s,target:a}){let n=await Qm(r.configuration,t),c=new Set(Object.keys(n));for(let f of r.configuration.plugins.keys())c.has(f)&&await P5(f,e,{project:r,report:s,target:a})}Ge();Ge();bt();jt();var S0e=et(hi()),b0e=Ce("vm");var wC=class extends ft{constructor(){super(...arguments);this.name=he.String();this.checksum=he.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}static{this.paths=[["plugin","import"]]}static{this.usage=st.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. + + If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. + + 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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);return(await Ft.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await Tt.find(r,this.context.cwd),c,f;if(this.name.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.name)){let p=Y.resolve(this.context.cwd,Ae.toPortablePath(this.name));a.reportInfo(0,`Reading ${ue.pretty(r,p,ue.Type.PATH)}`),c=Y.relative(n.cwd,p),f=await ae.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new Lt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}c=this.name,p=this.name}else{let h=H.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!S0e.default.valid(h.reference))throw new Lt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=H.stringifyIdent(h),C=await Qm(r,An);if(!Object.hasOwn(C,E)){let S=`Couldn't find a plugin named ${H.prettyIdent(r,h)} on the remote registry. +`;throw r.plugins.has(E)?S+=`A plugin named ${H.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:S+=`Note that only the plugins referenced on our website (${ue.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",ue.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${ue.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",ue.Type.URL)}).`,new Lt(51,S)}c=E,p=C[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):An!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${An}/`))}a.reportInfo(0,`Downloading ${ue.pretty(r,p,"green")}`),f=await nn.get(p,{configuration:r})}await x5(c,f,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function x5(e,t,{checksum:r=!0,project:s,report:a}){let{configuration:n}=s,c={},f={exports:c};(0,b0e.runInNewContext)(t.toString(),{module:f,exports:c});let h=`.yarn/plugins/${f.exports.name}.cjs`,E=Y.resolve(s.cwd,h);a.reportInfo(0,`Saving the new plugin in ${ue.pretty(n,h,"magenta")}`),await ae.mkdirPromise(Y.dirname(E),{recursive:!0}),await ae.writeFilePromise(E,t);let C={path:h,spec:e};r&&(C.checksum=Mn.makeHash(t)),await Je.addPlugin(s.cwd,[C])}var jot=({pluginName:e,noMinify:t},r)=>[["yarn",`build:${e}`,...t?["--no-minify"]:[],"|"]],BC=class extends ft{constructor(){super(...arguments);this.installPath=he.String("--path",{description:"The path where the repository should be cloned to"});this.repository=he.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=he.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=he.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=he.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=he.String()}static{this.paths=[["plugin","import","from","sources"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=typeof this.installPath<"u"?Y.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):Y.resolve(Ae.toPortablePath((0,D0e.tmpdir)()),"yarnpkg-sources",Mn.makeHash(this.repository).slice(0,6));return(await Ft.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:c}=await Tt.find(r,this.context.cwd),f=H.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=H.stringifyIdent(f),h=await Qm(r,An);if(!Object.hasOwn(h,p))throw new Lt(51,`Couldn't find a plugin named "${p}" 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 E=p;await D5(this,{configuration:r,report:n,target:s}),await P5(E,this,{project:c,report:n,target:s})})).exitCode()}};async function P5(e,{context:t,noMinify:r},{project:s,report:a,target:n}){let c=e.replace(/@yarnpkg\//,""),{configuration:f}=s;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${c}`),a.reportSeparator(),await iS(jot({pluginName:c,noMinify:r},n),{configuration:f,context:t,target:n}),a.reportSeparator();let p=Y.resolve(n,`packages/${c}/bundles/${e}.js`),h=await ae.readFilePromise(p);await x5(e,h,{project:s,report:a})}Ge();bt();jt();var vC=class extends ft{constructor(){super(...arguments);this.name=he.String()}static{this.paths=[["plugin","remove"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return(await Ft.start({configuration:r,stdout:this.context.stdout},async n=>{let c=this.name,f=H.parseIdent(c);if(!r.plugins.has(c))throw new ot(`${H.prettyIdent(r,f)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${c}.cjs`,h=Y.resolve(s.cwd,p);ae.existsSync(h)&&(n.reportInfo(0,`Removing ${ue.pretty(r,p,ue.Type.PATH)}...`),await ae.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await Je.updateConfiguration(s.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let C=E.filter(S=>S.path!==p);return C.length===0?Je.deleteProperty:C.length===E.length?E:C}})})).exitCode()}};Ge();jt();var SC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","runtime"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins);return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let c=this.context.plugins.plugins.has(n),f=n;c&&(f+=" [builtin]"),a.reportJson({name:n,builtin:c}),a.reportInfo(null,`${f}`)}})).exitCode()}};Ge();Ge();jt();var bC=class extends ft{constructor(){super(...arguments);this.idents=he.Rest()}static{this.paths=[["rebuild"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=new Set;for(let f of this.idents)c.add(H.parseIdent(f).identHash);if(await s.restoreInstallState({restoreResolutions:!1}),await s.resolveEverything({cache:n,report:new Qi}),c.size>0)for(let f of s.storedPackages.values())c.has(f.identHash)&&(s.storedBuildState.delete(f.locatorHash),s.skippedBuilds.delete(f.locatorHash));else s.storedBuildState.clear(),s.skippedBuilds.clear();return await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();jt();var k5=et(Zo());Jo();var DC=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)});this.patterns=he.Rest()}static{this.paths=[["remove"]]}static{this.usage=st.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 latter 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}'"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.all?s.workspaces:[a],f=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let I of this.patterns){let R=!1,N=H.parseIdent(I);for(let U of c){let K=[...U.manifest.peerDependenciesMeta.keys()];for(let $ of(0,k5.default)(K,I))U.manifest.peerDependenciesMeta.delete($),h=!0,R=!0;for(let $ of f){let ie=U.manifest.getForScope($),fe=[...ie.values()].map(le=>H.stringifyIdent(le));for(let le of(0,k5.default)(fe,H.stringifyIdent(N))){let{identHash:ge}=H.parseIdent(le),pe=ie.get(ge);if(typeof pe>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[$].delete(ge),E.push([U,$,pe]),h=!0,R=!0}}}R||p.push(I)}let C=p.length>1?"Patterns":"Pattern",S=p.length>1?"don't":"doesn't",x=this.all?"any":"this";if(p.length>0)throw new ot(`${C} ${ue.prettyList(r,p,ue.Type.CODE)} ${S} match any packages referenced by ${x} workspace`);return h?(await r.triggerMultipleHooks(I=>I.afterWorkspaceDependencyRemoval,E),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ge();Ge();jt();var P0e=Ce("util"),PC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["run"]]}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return(await Ft.start({configuration:r,stdout:this.context.stdout,json:this.json},async c=>{let f=a.manifest.scripts,p=qe.sortMap(f.keys(),C=>C),h={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},E=p.reduce((C,S)=>Math.max(C,S.length),0);for(let[C,S]of f.entries())c.reportInfo(null,`${C.padEnd(E," ")} ${(0,P0e.inspect)(S,h)}`),c.reportJson({name:C,script:S})})).exitCode()}};Ge();Ge();jt();var xC=class extends ft{constructor(){super(...arguments);this.inspect=he.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=he.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=he.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=he.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=he.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=he.Boolean("--silent",{hidden:!0});this.scriptName=he.String();this.args=he.Proxy()}static{this.paths=[["run"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a,locator:n}=await Tt.find(r,this.context.cwd);await s.restoreInstallState();let c=this.topLevel?s.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await wn.hasPackageScript(c,this.scriptName,{project:s}))return await wn.executePackageScript(c,this.scriptName,this.args,{project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let f=await wn.getPackageAccessibleBinaries(c,{project:s});if(f.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await wn.executePackageAccessibleBinary(c,this.scriptName,this.args,{cwd:this.context.cwd,project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:f})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(s.workspaces.map(async C=>C.manifest.scripts.has(this.scriptName)?C:null))).filter(C=>C!==null);if(E.length===1)return await wn.executeWorkspaceScript(E[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 ot(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${H.prettyLocator(r,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 ot(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${H.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new ot("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,C]of WI)for(let S of C)if(h.length>=S.length&&JSON.stringify(h.slice(0,S.length))===JSON.stringify(S))throw new ot(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new ot(`Couldn't find a script named "${this.scriptName}".`)}}};Ge();Ge();jt();var kC=class extends ft{constructor(){super(...arguments);this.descriptor=he.String();this.resolution=he.String()}static{this.paths=[["set","resolution"]]}static{this.usage=st.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, edit the `resolutions` field in 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 npm:1.5.0"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(await s.restoreInstallState({restoreResolutions:!1}),!a)throw new ar(s.cwd,this.context.cwd);let c=H.parseDescriptor(this.descriptor,!0),f=H.makeDescriptor(c,this.resolution);return s.storedDescriptors.set(c.descriptorHash,c),s.storedDescriptors.set(f.descriptorHash,f),s.resolutionAliases.set(c.descriptorHash,f.descriptorHash),await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ge();bt();jt();var x0e=et(Zo()),QC=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=he.Rest()}static{this.paths=[["unlink"]]}static{this.usage=st.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}'"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=s.topLevelWorkspace,f=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of c.manifest.resolutions)h.startsWith("portal:")&&f.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=Y.resolve(this.context.cwd,Ae.toPortablePath(p));if(qe.isPathLike(p)){let E=await Je.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Tt.find(E,h);if(!S)throw new ar(C.cwd,h);if(this.all){for(let x of C.workspaces)x.manifest.name&&f.add(H.stringifyIdent(x.anchoredLocator));if(f.size===0)throw new ot("No workspace found to be unlinked in the target project")}else{if(!S.manifest.name)throw new ot("The target workspace doesn't have a name and thus cannot be unlinked");f.add(H.stringifyIdent(S.anchoredLocator))}}else{let E=[...c.manifest.resolutions.map(({pattern:C})=>C.descriptor.fullName)];for(let C of(0,x0e.default)(E,p))f.add(C)}}return c.manifest.resolutions=c.manifest.resolutions.filter(({pattern:p})=>!f.has(p.descriptor.fullName)),await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();jt();var k0e=et(Xv()),Q5=et(Zo());Jo();var TC=class extends ft{constructor(){super(...arguments);this.interactive=he.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=he.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=he.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=he.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=he.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=he.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.noTimeGate=he.Boolean("--no-time-gate",!1,{description:"Disable the minimum release age check for this command"});this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)});this.patterns=he.Rest()}static{this.paths=[["up"]]}static{this.usage=st.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 latter 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'"]]})}static{this.schema=[X2("recursive",Vf.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await Je.find(this.context.cwd,this.context.plugins);this.noTimeGate&&XI(r);let{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=[...s.storedDescriptors.values()],f=c.map(E=>H.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(H.parseDescriptor(E).range!=="unknown")throw new ot("Ranges aren't allowed when using --recursive");for(let C of(0,Q5.default)(f,E)){let S=H.parseIdent(C);p.add(S.identHash)}}let h=c.filter(E=>p.has(E.identHash));for(let E of h)s.storedDescriptors.delete(E.descriptorHash),s.storedResolutions.delete(E.descriptorHash);return await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await Je.find(this.context.cwd,this.context.plugins);this.noTimeGate&&XI(r);let{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=eS(this,s),h=f?["keep","reuse","project","latest"]:["project","latest"],E=[],C=[];for(let N of this.patterns){let U=!1,K=H.parseDescriptor(N),$=H.stringifyIdent(K);for(let ie of s.workspaces)for(let fe of["dependencies","devDependencies"]){let ge=[...ie.manifest.getForScope(fe).values()].map(De=>H.stringifyIdent(De)),pe=$==="*"?ge:(0,Q5.default)(ge,$);for(let De of pe){let ye=H.parseIdent(De),d=ie.manifest[fe].get(ye.identHash);if(typeof d>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let ve=H.makeDescriptor(ye,K.range);E.push(Promise.resolve().then(async()=>[ie,fe,d,await tS(ve,{project:s,workspace:ie,cache:n,target:fe,fixed:c,modifier:p,strategies:h})])),U=!0}}U||C.push(N)}if(C.length>1)throw new ot(`Patterns ${ue.prettyList(r,C,ue.Type.CODE)} don't match any packages referenced by any workspace`);if(C.length>0)throw new ot(`Pattern ${ue.prettyList(r,C,ue.Type.CODE)} doesn't match any packages referenced by any workspace`);let S=await Promise.all(E),x=await fA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:K,rejections:$}]of S){let ie=K.filter(fe=>fe.descriptor!==null);if(ie.length===0){let[fe]=$;if(typeof fe>"u")throw new Error("Assertion failed: Expected an error to have been set");let le=this.cli.error(fe);s.configuration.get("enableNetwork")?N.reportError(27,`${H.prettyDescriptor(r,U)} can't be resolved to a satisfying range + +${le}`):N.reportError(27,`${H.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${le}`)}else ie.length>1&&!f&&N.reportError(27,`${H.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(x.hasErrors())return x.exitCode();let I=!1,R=[];for(let[N,U,,{suggestions:K}]of S){let $,ie=K.filter(pe=>pe.descriptor!==null),fe=ie[0].descriptor,le=ie.every(pe=>H.areDescriptorsEqual(pe.descriptor,fe));ie.length===1||le?$=fe:(I=!0,{answer:$}=await(0,k0e.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${H.prettyWorkspace(r,N)} \u276F ${U}?`,choices:K.map(({descriptor:pe,name:De,reason:ye})=>pe?{name:De,hint:ye,descriptor:pe}:{name:De,hint:ye,disabled:!0}),onCancel:()=>process.exit(130),result(pe){return this.find(pe,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let ge=N.manifest[U].get($.identHash);if(typeof ge>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(ge.descriptorHash!==$.descriptorHash)N.manifest[U].set($.identHash,$),R.push([N,U,ge,$]);else{let pe=r.makeResolver(),De={project:s,resolver:pe},ye=r.normalizeDependency(ge),d=pe.bindDescriptor(ye,N.anchoredLocator,De);s.forgetResolution(d)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,R),I&&this.context.stdout.write(` +`),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ge();Ge();jt();var RC=class extends ft{constructor(){super(...arguments);this.recursive=he.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=he.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=he.String()}static{this.paths=[["why"]]}static{this.usage=st.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. Specify a version or range to determine why the dependency tree contains a specific version of a package. This is particularly useful when trying to find out why your project depends on lower versions. + + 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"],["Explain why version 3.3.1 of lodash is in your project","$0 why lodash@3.3.1"],["Explain why version 3.X of lodash is in your project","$0 why lodash@^3"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=H.parseDescriptor(this.package,!1);if(n.range!=="unknown"&&kr.validRange(n.range)===null)throw new ot(`Expected a valid semver range, got ${n.range}`);let c=this.recursive?qot(s,n,{configuration:r,peers:this.peers}):Got(s,n,{configuration:r,peers:this.peers});ts.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function Got(e,t,{configuration:r,peers:s}){let a=qe.sortMap(e.storedPackages.values(),f=>H.stringifyLocator(f)),n={},c={children:n};for(let f of a){let p={};for(let E of f.dependencies.values()){if(!s&&T5(f,E))continue;let C=e.storedResolutions.get(E.descriptorHash);if(!C)throw new Error("Assertion failed: The resolution should have been registered");let S=e.storedPackages.get(C);if(!S)throw new Error("Assertion failed: The package should have been registered");if(!H.areIdentsEqual(S,t)||!H.isPackageInRange(S,t.range))continue;{let I=H.stringifyLocator(f);n[I]={value:[f,ue.Type.LOCATOR],children:p}}let x=H.stringifyLocator(S);p[x]={value:[{descriptor:E,locator:S},ue.Type.DEPENDENT]}}}return c}function qot(e,t,{configuration:r,peers:s}){let a=qe.sortMap(e.workspaces,S=>H.stringifyLocator(S.anchoredLocator)),n=new Set,c=new Set,f=S=>{if(n.has(S.locatorHash))return c.has(S.locatorHash);if(n.add(S.locatorHash),H.areIdentsEqual(S,t)&&H.isPackageInRange(S,t.range))return c.add(S.locatorHash),!0;let x=!1;for(let I of S.dependencies.values()){if(!s&&T5(S,I))continue;let R=e.storedResolutions.get(I.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let N=e.storedPackages.get(R);if(!N)throw new Error("Assertion failed: The package should have been registered");f(N)&&(x=!0)}return x&&c.add(S.locatorHash),x};for(let S of a)f(S.anchoredPackage);let p=new Set,h={},E={children:h},C=(S,x,I)=>{if(!c.has(S.locatorHash))return;let R=I!==null?ue.tuple(ue.Type.DEPENDENT,{locator:S,descriptor:I}):ue.tuple(ue.Type.LOCATOR,S),N={},U={value:R,children:N},K=H.stringifyLocator(S);if(x[K]=U,!(I!==null&&e.tryWorkspaceByLocator(S))&&!p.has(S.locatorHash)){p.add(S.locatorHash);for(let $ of S.dependencies.values()){if(!s&&T5(S,$))continue;let ie=e.storedResolutions.get($.descriptorHash);if(!ie)throw new Error("Assertion failed: The resolution should have been registered");let fe=e.storedPackages.get(ie);if(!fe)throw new Error("Assertion failed: The package should have been registered");C(fe,N,$)}}};for(let S of a)C(S.anchoredPackage,h,null);return E}function T5(e,t){return H.isVirtualLocator(e)&&e.peerDependencies.has(t.identHash)}Ge();var j5={};Vt(j5,{GitFetcher:()=>oS,GitResolver:()=>aS,default:()=>fat,gitUtils:()=>Ma});Ge();bt();var Ma={};Vt(Ma,{TreeishProtocols:()=>sS,clone:()=>H5,fetchBase:()=>Z0e,fetchChangedFiles:()=>X0e,fetchChangedWorkspaces:()=>cat,fetchRoot:()=>z0e,isGitUrl:()=>OC,lsRemote:()=>J0e,normalizeLocator:()=>lat,normalizeRepoUrl:()=>FC,resolveUrl:()=>_5,splitRepoUrl:()=>Xp,validateRepoUrl:()=>U5});Ge();bt();jt();Zl();var V0e=et(q0e()),NC=et(Ce("querystring")),L5=et(hi());function O5(e,t,r){let s=e.indexOf(r);return e.lastIndexOf(t,s>-1?s:1/0)}function Y0e(e){try{return new URL(e)}catch{return}}function oat(e){let t=O5(e,"@","#"),r=O5(e,":","#");return r>t&&(e=`${e.slice(0,r)}/${e.slice(r+1)}`),O5(e,":","#")===-1&&e.indexOf("//")===-1&&(e=`ssh://${e}`),e}function W0e(e){return Y0e(e)||Y0e(oat(e))}function FC(e,{git:t=!1}={}){if(e=e.replace(/^git\+https:/,"https:"),e=e.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),e=e.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),t){let r=W0e(e);r&&(e=r.href),e=e.replace(/^git\+([^:]+):/,"$1:")}return e}function K0e(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var aat=[/^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\/(.+)?$/],sS=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(sS||{});function OC(e){return e?aat.some(t=>!!e.match(t)):!1}function Xp(e){e=FC(e);let t=e.indexOf("#");if(t===-1)return{repo:e,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=e.slice(0,t),s=e.slice(t+1);if(s.match(/^[a-z]+=/)){let a=NC.default.parse(s);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(sS).find(p=>Object.hasOwn(a,p)),[c,f]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(sS))delete a[p];return{repo:r,treeish:{protocol:c,request:f},extra:a}}else{let a=s.indexOf(":"),[n,c]=a===-1?[null,s]:[s.slice(0,a),s.slice(a+1)];return{repo:r,treeish:{protocol:n,request:c},extra:{}}}}function lat(e){return H.makeLocator(e,FC(e.reference))}function U5(e,{configuration:t}){let{repo:r}=Xp(e),s=FC(r,{git:!0});if(!nn.getNetworkSettings(`https://${(0,V0e.default)(s).resource}`,{configuration:t}).enableNetwork)throw new Lt(80,`Request to '${s}' has been blocked because of your configuration settings`);let n=qe.buildIgnorePattern(t.get("approvedGitRepositories"));if(n===null||!s.match(n))throw new Lt(80,`Request to '${s}' has been blocked because it doesn't match any of the patterns in 'approvedGitRepositories'`);return s}async function J0e(e,t){let r=U5(e,{configuration:t}),s=await M5("listing refs",["ls-remote",r],{cwd:t.startingCwd,env:K0e()},{configuration:t,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,c;for(;(c=n.exec(s.stdout))!==null;)a.set(c[2],c[1]);return a}async function _5(e,t){let{repo:r,treeish:{protocol:s,request:a},extra:n}=Xp(e),c=await J0e(r,t),f=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return NC.default.stringify({...n,commit:E})}case"head":{let C=c.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof C>"u")throw new Error(`Unknown head ("${E}")`);return NC.default.stringify({...n,commit:C})}case"tag":{let C=c.get(`refs/tags/${E}`);if(typeof C>"u")throw new Error(`Unknown tag ("${E}")`);return NC.default.stringify({...n,commit:C})}case"semver":{let C=kr.validRange(E);if(!C)throw new Error(`Invalid range ("${E}")`);let S=new Map([...c.entries()].filter(([I])=>I.startsWith("refs/tags/")).map(([I,R])=>[L5.default.parse(I.slice(10)),R]).filter(I=>I[0]!==null)),x=L5.default.maxSatisfying([...S.keys()],C);if(x===null)throw new Error(`No matching range ("${E}")`);return NC.default.stringify({...n,commit:S.get(x)})}case null:{let C;if((C=p("commit",E))!==null||(C=p("tag",E))!==null||(C=p("head",E))!==null)return C;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return f(h,E)}catch{return null}};return FC(`${r}#${f(s,a)}`)}async function H5(e,t){return await t.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:s,request:a}}=Xp(e);if(s!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=U5(r,{configuration:t}),c=await ae.mktempPromise(),f={cwd:c,env:K0e()};return await M5("cloning the repository",["clone","-c","core.autocrlf=false",n,Ae.fromPortablePath(c)],f,{configuration:t,normalizedRepoUrl:n}),await M5("switching branch",["checkout",`${a}`],f,{configuration:t,normalizedRepoUrl:n}),c})}async function z0e(e){let t,r=e;do{if(t=r,await ae.existsPromise(Y.join(t,".git")))return t;r=Y.dirname(t)}while(r!==t);return null}async function Z0e(e,{baseRefs:t}){if(t.length===0)throw new ot("Can't run this command with zero base refs specified.");let r=[];for(let f of t){let{code:p}=await Yr.execvp("git",["merge-base",f,"HEAD"],{cwd:e});p===0&&r.push(f)}if(r.length===0)throw new ot(`No ancestor could be found between any of HEAD and ${t.join(", ")}`);let{stdout:s}=await Yr.execvp("git",["merge-base","HEAD",...r],{cwd:e,strict:!0}),a=s.trim(),{stdout:n}=await Yr.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:e,strict:!0}),c=n.trim();return{hash:a,title:c}}async function X0e(e,{base:t,project:r}){let s=qe.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Yr.execvp("git",["diff","--name-only",`${t}`],{cwd:e,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>Y.resolve(e,Ae.toPortablePath(h))),{stdout:c}=await Yr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:e,strict:!0}),f=c.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>Y.resolve(e,Ae.toPortablePath(h))),p=[...new Set([...n,...f].sort())];return s?p.filter(h=>!Y.relative(r.cwd,h).match(s)):p}async function cat({ref:e,project:t}){if(t.configuration.projectCwd===null)throw new ot("This command can only be run from within a Yarn project");let r=[Y.resolve(t.cwd,yr.lockfile),Y.resolve(t.cwd,t.configuration.get("cacheFolder")),Y.resolve(t.cwd,t.configuration.get("installStatePath")),Y.resolve(t.cwd,t.configuration.get("virtualFolder"))];await t.configuration.triggerHook(c=>c.populateYarnPaths,t,c=>{c!=null&&r.push(c)});let s=await z0e(t.configuration.projectCwd);if(s==null)throw new ot("This command can only be run on Git repositories");let a=await Z0e(s,{baseRefs:typeof e=="string"?[e]:t.configuration.get("changesetBaseRefs")}),n=await X0e(s,{base:a.hash,project:t});return new Set(qe.mapAndFilter(n,c=>{let f=t.tryWorkspaceByFilePath(c);return f===null?qe.mapAndFilter.skip:r.some(p=>c.startsWith(p))?qe.mapAndFilter.skip:f}))}async function M5(e,t,r,{configuration:s,normalizedRepoUrl:a}){try{return await Yr.execvp("git",t,{...r,strict:!0})}catch(n){if(!(n instanceof Yr.ExecError))throw n;let c=n.reportExtra,f=n.stderr.toString();throw new Lt(1,`Failed ${e}`,p=>{p.reportError(1,` ${ue.prettyField(s,{label:"Repository URL",value:ue.tuple(ue.Type.URL,a)})}`);for(let h of f.matchAll(/^(.+?): (.*)$/gm)){let[,E,C]=h;E=E.toLowerCase();let S=E==="error"?"Error":`${vB(E)} Error`;p.reportError(1,` ${ue.prettyField(s,{label:S,value:ue.tuple(ue.Type.NO_HINT,C)})}`)}c?.(p)})}}var oS=class{supports(t,r){return OC(t.reference)}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,a=new Map(r.checksums);a.set(t.locatorHash,s);let n={...r,checksums:a},c=await this.downloadHosted(t,n);if(c!==null)return c;let[f,p,h]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(t,n),...r.cacheOptions});return{packageFs:f,releaseFs:p,prefixPath:H.getIdentVendorPath(t),checksum:h}}async downloadHosted(t,r){return r.project.configuration.reduceHook(s=>s.fetchHostedRepository,null,t,r)}async cloneFromRemote(t,r){let s=Xp(t.reference),a=await H5(t.reference,r.project.configuration),n=Y.resolve(a,s.extra.cwd??wt.dot),c=Y.join(n,"package.tgz");await wn.prepareExternalProject(n,c,{configuration:r.project.configuration,report:r.report,workspace:s.extra.workspace,locator:t});let f=await ae.readFilePromise(c);return await qe.releaseAfterUseAsync(async()=>await ms.convertToZip(f,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1}))}};Ge();Ge();var aS=class{supportsDescriptor(t,r){return OC(t.range)}supportsLocator(t,r){return OC(t.reference)}shouldPersistResolution(t,r){return!0}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){let a=await _5(t.range,s.project.configuration);return[H.makeLocator(t,a)]}async getSatisfying(t,r,s,a){let n=Xp(t.range);return{locators:s.filter(f=>{if(f.identHash!==t.identHash)return!1;let p=Xp(f.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var uat={configuration:{approvedGitRepositories:{description:"Array of git repository URL glob patterns that are allowed to be fetched",type:"STRING",default:[],isArray:!0},changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"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:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[oS],resolvers:[aS]};var fat=uat;jt();var LC=class extends ft{constructor(){super(...arguments);this.since=he.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=he.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=he.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=he.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["workspaces","list"]]}static{this.usage=st.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 `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\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 "})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);return(await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let c=this.since?await Ma.fetchChangedWorkspaces({ref:this.since,project:s}):s.workspaces,f=new Set(c);if(this.recursive)for(let p of[...c].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)f.add(h);for(let p of f){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let C=new Set,S=new Set;for(let x of _t.hardDependencies)for(let[I,R]of h.getForScope(x)){let N=s.tryWorkspaceByDescriptor(R);N===null?s.workspacesByIdent.has(I)&&S.add(R):C.add(N)}E={workspaceDependencies:Array.from(C).map(x=>x.relativeCwd),mismatchedWorkspaceDependencies:Array.from(S).map(x=>H.stringifyDescriptor(x))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?H.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ge();Ge();jt();var MC=class extends ft{constructor(){super(...arguments);this.workspaceName=he.String();this.commandName=he.String();this.args=he.Proxy()}static{this.paths=[["workspace"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=s.workspaces,c=new Map(n.map(p=>[H.stringifyIdent(p.anchoredLocator),p])),f=c.get(this.workspaceName);if(f===void 0){let p=Array.from(c.keys()).sort();throw new ot(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${p.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:f.cwd})}};var Aat={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:$0e.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[tC,rC,nC,iC,kC,CC,pC,LC,aC,lC,cC,uC,$I,eC,sC,oC,fC,AC,hC,dC,gC,mC,QC,yC,EC,BC,wC,vC,IC,SC,bC,DC,PC,xC,TC,RC,MC]},pat=Aat;var V5={};Vt(V5,{default:()=>mat});Ge();Ge();var q5="catalog:";var Y5=e=>e.startsWith(q5),hat=e=>e.range.slice(q5.length)||null,eme=e=>e===null?"default catalog":`catalog "${e}"`,dat=e=>e.scope?`@${e.scope}/${e.name}`:e.name,W5=(e,t,r,s)=>{let a=hat(t),n;if(a===null)n=e.configuration.get("catalog");else try{let E=e.configuration.get("catalogs");E&&(n=E.get(a))}catch{n=void 0}if(!n||n.size===0)throw new Lt(82,`${H.prettyDescriptor(e.configuration,t)}: ${eme(a)} not found or empty`);let c=dat(t),f=n.get(c);if(!f)throw new Lt(82,`${H.prettyDescriptor(e.configuration,t)}: entry not found in ${eme(a)}`);let p=e.configuration.normalizeDependency(H.makeDescriptor(t,f));return r.supportsDescriptor(p,s)?r.bindDescriptor(p,e.topLevelWorkspace.anchoredLocator,s):p};var gat={configuration:{catalog:{description:"The default catalog of packages",type:"MAP",valueDefinition:{description:"The catalog of packages",type:"STRING"}},catalogs:{description:"Named catalogs of packages",type:"MAP",valueDefinition:{description:"A named catalog",type:"MAP",valueDefinition:{description:"Package version in the catalog",type:"STRING"}}}},hooks:{beforeWorkspacePacking:(e,t)=>{let r=e.project,s=r.configuration.makeResolver(),a={project:r,resolver:s,report:new Qi};for(let n of _t.allDependencies){let c=t[n];if(c)for(let[f,p]of Object.entries(c)){if(typeof p!="string"||!Y5(p))continue;let h=H.parseIdent(f),E=H.makeDescriptor(h,p),C=W5(r,E,s,a),{protocol:S,source:x,params:I,selector:R}=H.parseRange(H.convertToManifestRange(C.range));S===e.project.configuration.get("defaultProtocol")&&(S=null),c[f]=H.makeRange({protocol:S,source:x,params:I,selector:R})}}},reduceDependency:async(e,t,r,s,{resolver:a,resolveOptions:n})=>Y5(e.range)?W5(t,e,a,n):e}},mat=gat;var X5={};Vt(X5,{default:()=>Eat});Ge();var Qt={optional:!0},K5=[["@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:Qt,zenObservable:Qt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":Qt}}],["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":Qt,"postcss-jsx":Qt,"postcss-less":Qt,"postcss-markdown":Qt,"postcss-scss":Qt}}],["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:Qt}}],["snowpack@>=3.3.0",{dependencies:{"node-gyp":"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Qt}}],["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@<=0.5.2",{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:Qt,"vue-template-compiler":Qt}}],["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:Qt,"utf-8-validate":Qt}}],["react-portal@<4.2.2",{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@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{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":Qt,"vuetify-loader":Qt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Qt}}],["@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":Qt}}],["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":Qt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Qt}}],["consolidate@<=0.16.0",{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:Qt,tinyliquid:Qt,"liquid-node":Qt,jade:Qt,"then-jade":Qt,dust:Qt,"dustjs-helpers":Qt,"dustjs-linkedin":Qt,swig:Qt,"swig-templates":Qt,"razor-tmpl":Qt,atpl:Qt,liquor:Qt,twig:Qt,ejs:Qt,eco:Qt,jazz:Qt,jqtpl:Qt,hamljs:Qt,hamlet:Qt,whiskers:Qt,"haml-coffee":Qt,"hogan.js":Qt,templayed:Qt,handlebars:Qt,underscore:Qt,lodash:Qt,pug:Qt,"then-pug":Qt,qejs:Qt,walrus:Qt,mustache:Qt,just:Qt,ect:Qt,mote:Qt,toffee:Qt,dot:Qt,"bracket-template":Qt,ractive:Qt,nunjucks:Qt,htmling:Qt,"babel-core":Qt,plates:Qt,"react-dom":Qt,react:Qt,"arc-templates":Qt,vash:Qt,slm:Qt,marko:Qt,teacup:Qt,"coffee-script":Qt,squirrelly:Qt,twing:Qt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt,vue:Qt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{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@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{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:Qt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Qt}}],["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(e=>[e,{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":Qt,"webpack-command":Qt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Qt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Qt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Qt,jimp:Qt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Qt,"eslint-import-resolver-typescript":Qt,"eslint-import-resolver-webpack":Qt,"@typescript-eslint/parser":Qt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Qt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Qt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x <10.0.2",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.7"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Qt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Qt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{"vue-template-compiler":"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["parcel@*",{peerDependenciesMeta:{"@parcel/core":Qt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@<5.0.0",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:Qt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:Qt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:Qt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":Qt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}],["vite-plugin-vuetify@<=1.0.2",{peerDependencies:{vue:"^3.0.0"}}],["webpack-plugin-vuetify@<=2.0.1",{peerDependencies:{vue:"^3.2.6"}}],["eslint-import-resolver-vite@<2.0.1",{dependencies:{debug:"^4.3.4",resolve:"^1.22.8"}}],["notistack@^3.0.0",{dependencies:{csstype:"^3.0.10"}}],["@fastify/type-provider-typebox@^5.0.0",{peerDependencies:{fastify:"^5.0.0"}}],["@fastify/type-provider-typebox@^4.0.0",{peerDependencies:{fastify:"^4.0.0"}}]];var J5;function tme(){return typeof J5>"u"&&(J5=Ce("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()),J5}var z5;function rme(){return typeof z5>"u"&&(z5=Ce("zlib").brotliDecompressSync(Buffer.from("G70SIIzURnVBnObTmvZ3L6cX9xewwLKl81s5batuNEoStoADpDrmSguQ3//aq41xiRI5PtbmzrtvssshKgApmnm7H1WJVB2wq7Agv1Q91arLcLrdpRTiDfjlz40ej5HnEx1Q8Tc94iFP67XKY/k09uIx2lpEBumXO6PdvcPNHcZ2d3aUqEcCsbJ38UDk1ftcOfRI+Hd1WOGLFOwwyvM8zTby1jvdmf6GXGRiE0QmxCH+FoVoxUTN926bDWSZwbbBU3RRAMCT5PN9JJAqLN6erJZpJsE/suBOhv/hs8d8scKxIuenRulEH74cCI/jCch8IcDNDOGt53inNi+qDtBv0cX4DJe3Ku3GYQkySc++bmcaU01+2ZMXKMOpGWMqYV/nz8wZrD8GlLhyXznDtq7wz8MttQZOUFDUCxHOoSxHjxDIlm4J4IySxJqjmNoaWXwLUVmMolY+oJxn+DGbNE8oK2Bp/eDpqlmTi6BC3mxI+jM51Vqvg3UrFonU1viAdCX/Z5fz8lt7JT0O01d+lgwvAmz75EmDTbBHuJNlOaAFpWl/h7DVQP3iQih+jLWmpRFyM8LlJ1vmh0MCEikW46xBLptFP7W6CiyVCVa7GaMf+CrOOf3yzCvGiM/gZiy47e/sraVspig+n9Ths18daYGmRSIe0tH97oVCY83nwHbjzkotwrDwPyi3Zh2luOl0mHq6Qwl8T8KoxYTmP0bKq6lCvP/NMSrTIL6pY43Q3FjsdgdNcD+c1scuVUDMuOIo2/mQHmeyw8SwB9bhd97dyV79BQ5RzDYAScw7y/y9M9N+b3UvkeHFhxeDsfxkxelQgszsKsfnRdpRyC/oDjnHGIEp34FEk/wo/zxch0TIrdLhfWtL+rUgKQU1qpGoSIyBPs5v+TMhX4++PT7zIn3i9OvnLSW3LUtuc47UBqAmxSAOxtrF3ovfvVcO1/A3AoojdOSB81w+YYWl/aBmLEpAXD2Tww9NX+4hExsQf+gQOexjSnlSEYXrmCGcpM6x8KZvVfBvlZ+ixlB3snpaue/hO9F32s8hOnhelSh5iX6MuJCExio/4q55FpZAKfW/UbUaEvITwzsKS7A9KeHGMS01MerZWGTV7TMDwoXeEhh3bDzoXc6Gow0HAfWIJN/DQCGJd7+pgFaJaL9MWMU3DBeTuFmDxLNibD59Za/NRF83a9WQ8kMnPe89iqLnoBwtMxCu7lxaaSw9p+k6Vj2ZWH81rSMPSBZDCYFIUgeg0nZoAgxzZXJi4lvS6I7HSOUxG/Jq4J1yBH5CKPPLmm13Ad4wJ6CSXozdVCc73ChoUN72Gu00wqPok7zjewhVPV3frpcGsqlpUlYn3t2PzXhIAFjyEHDf2Cr0QoWzLok7/lUtLAZNtq+yYeIIQyKhnJ3odk8ChKP32wO9xV0/NfWBzvCKnbFP8tMaQ9xNNkPCadYf+ci4g6ZmzXo66VSCh4+6EGKK5qTzL0TtNVU1OvqgNLGvGuNkL/leKbpoFLNLeDjpIfG0z7T/dJwcwV/CV3zjfRzhsYgqddF5ZMsz6TY/PjaidKQ3jt2ev7I1vIcSj/v/vGC1NXUVCMyg4zCYQObrnUuKMSWZ0cf0ekQeS6iYjj1GMo09LS08xv0oBhsSRnxFFP9rsqWxeRpCAfR2kldSAiZZcW8SoaeNiXqqN4iWGdZ29DHFUkTgkwF6wUU02CZdpegmbXGKdW+Y7NYO0bHPXlYAaXW7/EEURkphJOs3/tJCfXYK2qDUxHtKWAdjw8gXIUIsFvpx0AXuKHqweYeTgh2m3rj77rrYBU2sZOmHRo6JxhaPJidVDK5/ZDj0r7o9A1GtWmcWwmbchmNP1EimQWP5NO682+IlNQXEMBI21pftOUzs/YiUttmB7XJlra0lxBDNxFgnt0koRq2gvBAohwaZl22fV8YG","base64")).toString()),z5}var Z5;function nme(){return typeof Z5>"u"&&(Z5=Ce("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Z5}var ime=new Map([[H.makeIdent(null,"fsevents").identHash,tme],[H.makeIdent(null,"resolve").identHash,rme],[H.makeIdent(null,"typescript").identHash,nme]]),yat={hooks:{registerPackageExtensions:async(e,t)=>{for(let[r,s]of K5)t(H.parseDescriptor(r,!0),s)},getBuiltinPatch:async(e,t)=>{let r="compat/";if(!t.startsWith(r))return;let s=H.parseIdent(t.slice(r.length)),a=ime.get(s.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(e,t,r,s)=>typeof ime.get(e.identHash)>"u"?e:H.makeDescriptor(e,H.makeRange({protocol:"patch:",source:H.stringifyDescriptor(e),selector:`optional!builtin`,params:null}))}},Eat=yat;var d9={};Vt(d9,{ConstraintsCheckCommand:()=>WC,ConstraintsQueryCommand:()=>qC,ConstraintsSourceCommand:()=>YC,default:()=>Mat});Ge();Ge();cS();var _C=class{constructor(t){this.project=t}createEnvironment(){let t=new UC(["cwd","ident"]),r=new UC(["workspace","type","ident"]),s=new UC(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,c=new Map;for(let f of this.project.storedPackages.values()){let p=Array.from(f.peerDependencies.values(),h=>[H.stringifyIdent(h),h.range]);n.set(f.locatorHash,{workspace:null,ident:H.stringifyIdent(f),version:f.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional===!0))})}for(let f of this.project.storedPackages.values()){let p=n.get(f.locatorHash);p.dependencies=new Map(Array.from(f.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let C=n.get(E);if(typeof C>"u")throw new Error("Assertion failed: The package should have been registered");return[H.stringifyIdent(h),C]})),p.dependencies.delete(p.ident)}for(let f of this.project.workspaces){let p=H.stringifyIdent(f.anchoredLocator),h=f.manifest.exportTo({}),E=n.get(f.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let C=(R,N,{caller:U=Ui.getCaller()}={})=>{let K=lS(R),$=qe.getMapWithDefault(a.manifestUpdates,f.cwd),ie=qe.getMapWithDefault($,K),fe=qe.getSetWithDefault(ie,N);U!==null&&fe.add(U)},S=R=>C(R,void 0,{caller:Ui.getCaller()}),x=R=>{qe.getArrayWithDefault(a.reportedErrors,f.cwd).push(R)},I=t.insert({cwd:f.relativeCwd,ident:p,manifest:h,pkg:E,set:C,unset:S,error:x});c.set(f,I);for(let R of _t.allDependencies)for(let N of f.manifest[R].values()){let U=H.stringifyIdent(N),K=()=>{C([R,U],void 0,{caller:Ui.getCaller()})},$=fe=>{C([R,U],fe,{caller:Ui.getCaller()})},ie=null;if(R!=="peerDependencies"&&(R!=="dependencies"||!f.manifest.devDependencies.has(N.identHash))){let fe=f.anchoredPackage.dependencies.get(N.identHash);if(fe){if(typeof fe>"u")throw new Error("Assertion failed: The dependency should have been registered");let le=this.project.storedResolutions.get(fe.descriptorHash);if(typeof le>"u")throw new Error("Assertion failed: The resolution should have been registered");let ge=n.get(le);if(typeof ge>"u")throw new Error("Assertion failed: The package should have been registered");ie=ge}}r.insert({workspace:I,ident:U,range:N.range,type:R,resolution:ie,update:$,delete:K,error:x})}}for(let f of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(f);if(!p)continue;let h=c.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(f.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:t,dependencies:r,packages:s,result:a}}async process(){let t=this.createEnvironment(),r={Yarn:{workspace:a=>t.workspaces.find(a)[0]??null,workspaces:a=>t.workspaces.find(a),dependency:a=>t.dependencies.find(a)[0]??null,dependencies:a=>t.dependencies.find(a),package:a=>t.packages.find(a)[0]??null,packages:a=>t.packages.find(a)}},s=await this.project.loadUserConfig();return s?.constraints?(await s.constraints(r),t.result):null}};Ge();Ge();jt();var qC=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=he.String()}static{this.paths=[["constraints","query"]]}static{this.usage=st.Usage({category:"Constraints-related commands",description:"query the constraints fact database",details:` + This command will output all matches to the given prolog query. + `,examples:[["List all dependencies throughout the workspace","yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(pS(),AS)),s=await Je.find(this.context.cwd,this.context.plugins),{project:a}=await Tt.find(s,this.context.cwd),n=await r.find(a),c=this.query;return c.endsWith(".")||(c=`${c}.`),(await Ft.start({configuration:s,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(c)){let E=Array.from(Object.entries(h)),C=E.length,S=E.reduce((x,[I])=>Math.max(x,I.length),0);for(let x=0;x(pS(),AS)),s=await Je.find(this.context.cwd,this.context.plugins),{project:a}=await Tt.find(s,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ge();Ge();jt();cS();var WC=class extends ft{constructor(){super(...arguments);this.fix=he.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["constraints"]]}static{this.usage=st.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` + This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. + + If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. + + For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. + `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd);await s.restoreInstallState();let a=await s.loadUserConfig(),n;if(a?.constraints)n=new _C(s);else{let{Constraints:h}=await Promise.resolve().then(()=>(pS(),AS));n=await h.find(s)}let c,f=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:C,remainingErrors:S}=VR(s,E,{fix:this.fix}),x=[];for(let[I,R]of C){let N=I.manifest.indent;I.manifest=new _t,I.manifest.indent=N,I.manifest.load(R),x.push(I.persistManifest())}if(await Promise.all(x),!(C.size>0&&h>1)){c=sme(S,{configuration:r}),f=!1,p=!0;for(let[,I]of S)for(let R of I)R.fixable?f=!0:p=!1}}if(c.children.length===0)return 0;if(f){let h=p?`Those errors can all be fixed by running ${ue.pretty(r,"yarn constraints --fix",ue.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${ue.pretty(r,"yarn constraints --fix",ue.Type.CODE)}`;await Ft.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return c.children=qe.sortMap(c.children,h=>h.value[1]),ts.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};cS();var Lat={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[qC,YC,WC],hooks:{async validateProjectAfterInstall(e,{reportError:t}){if(!e.configuration.get("enableConstraintsChecks"))return;let r=await e.loadUserConfig(),s;if(r?.constraints)s=new _C(e);else{let{Constraints:c}=await Promise.resolve().then(()=>(pS(),AS));s=await c.find(e)}let a=await s.process();if(!a)return;let{remainingErrors:n}=VR(e,a);if(n.size!==0)if(e.configuration.isCI)for(let[c,f]of n)for(let p of f)t(84,`${ue.pretty(e.configuration,c.anchoredLocator,ue.Type.IDENT)}: ${p.text}`);else t(84,`Constraint check failed; run ${ue.pretty(e.configuration,"yarn constraints",ue.Type.CODE)} for more details`)}}},Mat=Lat;var g9={};Vt(g9,{CreateCommand:()=>VC,DlxCommand:()=>KC,default:()=>_at});Ge();jt();var VC=class extends ft{constructor(){super(...arguments);this.pkg=he.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=he.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=he.String();this.args=he.Proxy()}static{this.paths=[["create"]]}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let s=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=H.parseDescriptor(s),n=a.name.match(/^create(-|$)/)?a:a.scope?H.makeIdent(a.scope,`create-${a.name}`):H.makeIdent(null,`create-${a.name}`),c=H.stringifyIdent(n);return a.range!=="unknown"&&(c+=`@${a.range}`),this.cli.run(["dlx",...r,c,...this.args])}};Ge();Ge();bt();jt();var KC=class extends ft{constructor(){super(...arguments);this.packages=he.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=he.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=he.String();this.args=he.Proxy()}static{this.paths=[["dlx"]]}static{this.usage=st.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-vite to scaffold a new Vite project","yarn dlx create-vite"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]})}async execute(){return Je.telemetry=null,await ae.mktempPromise(async r=>{let s=Y.join(r,`dlx-${process.pid}`);await ae.mkdirPromise(s),await ae.writeFilePromise(Y.join(s,"package.json"),`{} +`),await ae.writeFilePromise(Y.join(s,"yarn.lock"),"");let a=Y.join(s,".yarnrc.yml"),n=await Je.findProjectCwd(this.context.cwd),f={enableGlobalCache:!(await Je.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:zf(68),level:ue.LogLevel.Discard}]},p=n!==null?Y.join(n,".yarnrc.yml"):null;p!==null&&ae.existsSync(p)?(await ae.copyFilePromise(p,a),await Je.updateConfiguration(s,N=>{let U=qe.toMerged(N,f);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(K=>{let $=typeof K=="string"?K:K.path,ie=Ae.isAbsolute($)?$:Ae.resolve(Ae.fromPortablePath(n),$);return typeof K=="string"?ie:{path:ie,spec:K.spec}})),U})):await ae.writeJsonPromise(a,f);let h=this.packages??[this.command],E=H.parseDescriptor(this.command).name,C=await this.cli.run(["add","--fixed","--",...h],{cwd:s,quiet:this.quiet});if(C!==0)return C;this.quiet||this.context.stdout.write(` +`);let S=await Je.find(s,this.context.plugins),{project:x,workspace:I}=await Tt.find(S,s);if(I===null)throw new ar(x.cwd,s);await x.restoreInstallState();let R=await wn.getWorkspaceAccessibleBinaries(I);return R.has(E)===!1&&R.size===1&&typeof this.packages>"u"&&(E=Array.from(R)[0][0]),await wn.executeWorkspaceAccessibleBinary(I,E,this.args,{packageAccessibleBinaries:R,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var Uat={commands:[VC,KC]},_at=Uat;var E9={};Vt(E9,{ExecFetcher:()=>dS,ExecResolver:()=>gS,default:()=>Gat,execUtils:()=>ZR});Ge();Ge();Ge();bt();var AA="exec:";var ZR={};Vt(ZR,{loadGeneratorFile:()=>hS,makeLocator:()=>y9,makeSpec:()=>Qme,parseSpec:()=>m9});Ge();bt();function m9(e){let{params:t,selector:r}=H.parseRange(e),s=Ae.toPortablePath(r);return{parentLocator:t&&typeof t.locator=="string"?H.parseLocator(t.locator):null,path:s}}function Qme({parentLocator:e,path:t,generatorHash:r,protocol:s}){let a=e!==null?{locator:H.stringifyLocator(e)}:{},n=typeof r<"u"?{hash:r}:{};return H.makeRange({protocol:s,source:t,selector:t,params:{...n,...a}})}function y9(e,{parentLocator:t,path:r,generatorHash:s,protocol:a}){return H.makeLocator(e,Qme({parentLocator:t,path:r,generatorHash:s,protocol:a}))}async function hS(e,t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(e,{protocol:t}),n=Y.isAbsolute(a)?{packageFs:new Pn(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,n.localPath)}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=Y.join(c.prefixPath,a);return await f.readFilePromise(p,"utf8")}var dS=class{supports(t,r){return!!t.reference.startsWith(AA)}getLocalPath(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:AA});if(Y.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:Y.resolve(n,a)}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t),loader:()=>this.fetchFromDisk(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),localPath:this.getLocalPath(t,r),checksum:c}}async fetchFromDisk(t,r){let s=r.project.getDependencyMeta(t,null);if(!r.project.configuration.get("enableScripts")&&!s.built)throw new Lt(4,`${H.prettyLocator(r.project.configuration,t)} can't be built with the exec: protocol because all scripts have been disabled.`);let a=await hS(t.reference,AA,r);return ae.mktempPromise(async n=>{let c=Y.join(n,"generator.js");return await ae.writeFilePromise(c,a),ae.mktempPromise(async f=>{if(await this.generatePackage(f,t,c,r),!ae.existsSync(Y.join(f,"build")))throw new Error("The script should have generated a build directory");return await ms.makeArchiveFromDirectory(Y.join(f,"build"),{prefixPath:H.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(t,r,s,a){return await ae.mktempPromise(async n=>{let c=await wn.makeScriptEnv({project:a.project,binFolder:n}),f=Y.join(t,"runtime.js");return await ae.mktempPromise(async p=>{let h=Y.join(p,"buildfile.log"),E=Y.join(t,"generator"),C=Y.join(t,"build");await ae.mkdirPromise(E),await ae.mkdirPromise(C);let S={tempDir:Ae.fromPortablePath(E),buildDir:Ae.fromPortablePath(C),locator:H.stringifyLocator(r)};await ae.writeFilePromise(f,` + // Expose 'Module' as a global variable + Object.defineProperty(global, 'Module', { + get: () => require('module'), + configurable: true, + enumerable: false, + }); + + // Expose non-hidden built-in modules as global variables + for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { + Object.defineProperty(global, name, { + get: () => require(name), + configurable: true, + enumerable: false, + }); + } + + // Expose the 'execEnv' global variable + Object.defineProperty(global, 'execEnv', { + value: { + ...${JSON.stringify(S)}, + }, + enumerable: true, + }); + `);let x=c.NODE_OPTIONS||"",I=/\s*--require\s+\S*\.pnp\.c?js\s*/g;x=x.replace(I," ").trim(),c.NODE_OPTIONS=x;let{stdout:R,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${H.stringifyLocator(r)}) +`,prefix:H.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Yr.pipevp(process.execPath,["--require",Ae.fromPortablePath(f),Ae.fromPortablePath(s),H.stringifyIdent(r)],{cwd:t,env:c,stdin:null,stdout:R,stderr:N});if(U!==0)throw ae.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${ue.pretty(a.project.configuration,h,ue.Type.PATH)})`)})})}};Ge();Ge();Ge();var Hat=2,gS=class{supportsDescriptor(t,r){return!!t.range.startsWith(AA)}supportsLocator(t,r){return!!t.reference.startsWith(AA)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){if(s.project.tryWorkspaceByLocator(r)===null)throw new Lt(57,`${H.prettyLocator(s.project.configuration,r)} lists ${H.prettyDescriptor(s.project.configuration,t)} as dependency, but only workspaces can depend on exec: packages.`);return H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=m9(t.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=await hS(H.makeRange({protocol:AA,source:a,selector:a,params:{locator:H.stringifyLocator(n)}}),AA,s.fetchOptions),f=Mn.makeHash(`${Hat}`,c).slice(0,6);return[y9(t,{parentLocator:n,path:a,generatorHash:f,protocol:AA})]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var jat={fetchers:[dS],resolvers:[gS]},Gat=jat;var C9={};Vt(C9,{FileFetcher:()=>IS,FileResolver:()=>CS,TarballFileFetcher:()=>wS,TarballFileResolver:()=>BS,default:()=>Wat,fileUtils:()=>Nm});Ge();bt();var JC=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,mS=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,rs="file:";var Nm={};Vt(Nm,{fetchArchiveFromLocator:()=>ES,makeArchiveFromLocator:()=>XR,makeBufferFromLocator:()=>I9,makeLocator:()=>zC,makeSpec:()=>Tme,parseSpec:()=>yS});Ge();bt();function yS(e){let{params:t,selector:r}=H.parseRange(e),s=Ae.toPortablePath(r);return{parentLocator:t&&typeof t.locator=="string"?H.parseLocator(t.locator):null,path:s}}function Tme({parentLocator:e,path:t,hash:r,protocol:s}){let a=e!==null?{locator:H.stringifyLocator(e)}:{},n=typeof r<"u"?{hash:r}:{};return H.makeRange({protocol:s,source:t,selector:t,params:{...n,...a}})}function zC(e,{parentLocator:t,path:r,hash:s,protocol:a}){return H.makeLocator(e,Tme({parentLocator:t,path:r,hash:s,protocol:a}))}async function ES(e,t){let{parentLocator:r,path:s}=H.parseFileStyleRange(e.reference,{protocol:rs}),a=Y.isAbsolute(s)?{packageFs:new Pn(wt.root),prefixPath:wt.dot,localPath:wt.root}:await t.fetcher.fetch(r,t),n=a.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let c=n.packageFs,f=Y.join(n.prefixPath,s);return await qe.releaseAfterUseAsync(async()=>await c.readFilePromise(f),n.releaseFs)}async function XR(e,{protocol:t,fetchOptions:r,inMemory:s=!1}){let{parentLocator:a,path:n}=H.parseFileStyleRange(e.reference,{protocol:t}),c=Y.isAbsolute(n)?{packageFs:new Pn(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(a,r),f=c.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,c.localPath)}:c;c!==f&&c.releaseFs&&c.releaseFs();let p=f.packageFs,h=Y.join(f.prefixPath,n);return await qe.releaseAfterUseAsync(async()=>await ms.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:H.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:s}),f.releaseFs)}async function I9(e,{protocol:t,fetchOptions:r}){return(await XR(e,{protocol:t,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var IS=class{supports(t,r){return!!t.reference.startsWith(rs)}getLocalPath(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:rs});if(Y.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:Y.resolve(n,a)}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),localPath:this.getLocalPath(t,r),checksum:c}}async fetchFromDisk(t,r){return XR(t,{protocol:rs,fetchOptions:r})}};Ge();Ge();var qat=2,CS=class{supportsDescriptor(t,r){return t.range.match(JC)?!0:!!t.range.startsWith(rs)}supportsLocator(t,r){return!!t.reference.startsWith(rs)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){return JC.test(t.range)&&(t=H.makeDescriptor(t,`${rs}${t.range}`)),H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=yS(t.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=await I9(H.makeLocator(t,H.makeRange({protocol:rs,source:a,selector:a,params:{locator:H.stringifyLocator(n)}})),{protocol:rs,fetchOptions:s.fetchOptions}),f=Mn.makeHash(`${qat}`,c).slice(0,6);return[zC(t,{parentLocator:n,path:a,hash:f,protocol:rs})]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ge();var wS=class{supports(t,r){return mS.test(t.reference)?!!t.reference.startsWith(rs):!1}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),checksum:c}}async fetchFromDisk(t,r){let s=await ES(t,r);return await ms.convertToZip(s,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1})}};Ge();Ge();Ge();var BS=class{supportsDescriptor(t,r){return mS.test(t.range)?!!(t.range.startsWith(rs)||JC.test(t.range)):!1}supportsLocator(t,r){return mS.test(t.reference)?!!t.reference.startsWith(rs):!1}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){return JC.test(t.range)&&(t=H.makeDescriptor(t,`${rs}${t.range}`)),H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=yS(t.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=zC(t,{parentLocator:n,path:a,hash:"",protocol:rs}),f=await ES(c,s.fetchOptions),p=Mn.makeHash(f).slice(0,6);return[zC(t,{parentLocator:n,path:a,hash:p,protocol:rs})]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Yat={fetchers:[wS,IS],resolvers:[BS,CS]},Wat=Yat;var v9={};Vt(v9,{GithubFetcher:()=>vS,default:()=>Kat,githubUtils:()=>$R});Ge();bt();var $R={};Vt($R,{invalidGithubUrlMessage:()=>Nme,isGithubUrl:()=>w9,parseGithubUrl:()=>B9});var Rme=et(Ce("querystring")),Fme=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function w9(e){return e?Fme.some(t=>!!e.match(t)):!1}function B9(e){let t;for(let f of Fme)if(t=e.match(f),t)break;if(!t)throw new Error(Nme(e));let[,r,s,a,n="master"]=t,{commit:c}=Rme.default.parse(n);return n=c||n.replace(/[^:]*:/,""),{auth:r,username:s,reponame:a,treeish:n}}function Nme(e){return`Input cannot be parsed as a valid GitHub URL ('${e}').`}var vS=class{supports(t,r){return!!w9(t.reference)}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),checksum:c}}async fetchFromNetwork(t,r){let s=await nn.get(this.getLocatorUrl(t,r),{configuration:r.project.configuration});return await ae.mktempPromise(async a=>{let n=new Pn(a);await ms.extractArchiveTo(s,n,{stripComponents:1});let c=Ma.splitRepoUrl(t.reference),f=Y.join(a,"package.tgz");await wn.prepareExternalProject(a,f,{configuration:r.project.configuration,report:r.report,workspace:c.extra.workspace,locator:t});let p=await ae.readFilePromise(f);return await ms.convertToZip(p,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1})})}getLocatorUrl(t,r){let{auth:s,username:a,reponame:n,treeish:c}=B9(t.reference);return`https://${s?`${s}@`:""}github.com/${a}/${n}/archive/${c}.tar.gz`}};var Vat={hooks:{async fetchHostedRepository(e,t,r){if(e!==null)return e;let s=new vS;if(!s.supports(t,r))return null;try{return await s.fetch(t,r)}catch{return null}}}},Kat=Vat;var S9={};Vt(S9,{TarballHttpFetcher:()=>bS,TarballHttpResolver:()=>DS,default:()=>zat});Ge();function SS(e){let t;try{t=new URL(e)}catch{return!1}return!(t.protocol!=="http:"&&t.protocol!=="https:"||!t.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var bS=class{supports(t,r){return SS(t.reference)}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),checksum:c}}async fetchFromNetwork(t,r){let s=await nn.get(t.reference,{configuration:r.project.configuration});return await ms.convertToZip(s,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1})}};Ge();Ge();var DS=class{supportsDescriptor(t,r){return SS(t.range)}supportsLocator(t,r){return SS(t.reference)}shouldPersistResolution(t,r){return!0}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){return[H.convertDescriptorToLocator(t)]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Jat={fetchers:[bS],resolvers:[DS]},zat=Jat;var b9={};Vt(b9,{InitCommand:()=>Zd,InitInitializerCommand:()=>ZC,default:()=>Xat});jt();Ge();Ge();bt();jt();var Zd=class extends ft{constructor(){super(...arguments);this.private=he.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=he.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=he.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=he.String("-n,--name",{description:"Initialize a package with the given name"});this.usev2=he.Boolean("-2",!1,{hidden:!0});this.yes=he.Boolean("-y,--yes",{hidden:!0})}static{this.paths=[["init"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return s!==null?await this.executeProxy(r,s):await this.executeRegular(r)}async executeProxy(r,s){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new ot("Cannot use the --install flag from within a project subdirectory");ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=Y.join(this.context.cwd,yr.lockfile);ae.existsSync(a)||await ae.writeFilePromise(a,"");let n=await this.cli.run(["set","version",s],{quiet:!0});if(n!==0)return n;let c=[];return this.private&&c.push("-p"),this.workspace&&c.push("-w"),this.name&&c.push(`-n=${this.name}`),this.yes&&c.push("-y"),await ae.mktempPromise(async f=>{let{code:p}=await Yr.pipevp("yarn",["init",...c],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await wn.makeScriptEnv({binFolder:f})});return p})}async initialize(){}async executeRegular(r){let s=null;try{s=(await Tt.find(r,this.context.cwd)).project}catch{s=null}ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=await _t.tryFind(this.context.cwd),n=a??new _t,c=Object.fromEntries(r.get("initFields").entries());n.load(c),n.name=n.name??H.makeIdent(r.get("initScope"),this.name??Y.basename(this.context.cwd)),n.packageManager=An&&qe.isTaggedYarnVersion(An)?`yarn@${An}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ae.mkdirPromise(Y.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let f={};n.exportTo(f);let p=Y.join(this.context.cwd,_t.fileName);await ae.changeFilePromise(p,`${JSON.stringify(f,null,2)} +`,{automaticNewlines:!0});let h=[p],E=Y.join(this.context.cwd,"README.md");if(ae.existsSync(E)||(await ae.writeFilePromise(E,`# ${H.stringifyIdent(n.name)} +`),h.push(E)),!s||s.cwd===this.context.cwd){let C=Y.join(this.context.cwd,yr.lockfile);ae.existsSync(C)||(await ae.writeFilePromise(C,""),h.push(C));let x=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Whether you use PnP or not, the node_modules folder is often used to store","# build artifacts that should be gitignored","node_modules","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(fe=>`${fe} +`).join(""),I=Y.join(this.context.cwd,".gitignore");ae.existsSync(I)||(await ae.writeFilePromise(I,x),h.push(I));let N=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(fe=>`${fe} +`).join(""),U=Y.join(this.context.cwd,".gitattributes");ae.existsSync(U)||(await ae.writeFilePromise(U,N),h.push(U));let K={"*":{charset:"utf-8",endOfLine:"lf",indentSize:2,indentStyle:"space",insertFinalNewline:!0}};qe.mergeIntoTarget(K,r.get("initEditorConfig"));let $=`root = true +`;for(let[fe,le]of Object.entries(K)){$+=` +[${fe}] +`;for(let[ge,pe]of Object.entries(le)){let De=ge.replace(/[A-Z]/g,ye=>`_${ye.toLowerCase()}`);$+=`${De} = ${pe} +`}}let ie=Y.join(this.context.cwd,".editorconfig");ae.existsSync(ie)||(await ae.writeFilePromise(ie,$),h.push(ie)),await this.cli.run(["install"],{quiet:!0}),await this.initialize(),ae.existsSync(Y.join(this.context.cwd,".git"))||(await Yr.execvp("git",["init"],{cwd:this.context.cwd}),await Yr.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Yr.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};var ZC=class extends Zd{constructor(){super(...arguments);this.initializer=he.String();this.argv=he.Proxy()}static{this.paths=[["init"]]}async initialize(){this.context.stdout.write(` +`),await this.cli.run(["dlx",this.initializer,...this.argv],{quiet:!0})}};var Zat={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[Zd,ZC]},Xat=Zat;var BY={};Vt(BY,{SearchCommand:()=>dw,UpgradeInteractiveCommand:()=>gw,default:()=>lht});Ge();var Lme=et(Ce("os"));function XC({stdout:e}){if(Lme.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!e.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}jt();var Jye=et(q9()),Y9={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},Jct=(0,Jye.default)(Y9.appId,Y9.apiKey).initIndex(Y9.indexName),W9=async(e,t=0)=>await Jct.search(e,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:t,hitsPerPage:10});var Db=["regular","dev","peer"],dw=class extends ft{static{this.paths=[["search"]]}static{this.usage=st.Usage({category:"Interactive commands",description:"open the search interface",details:` + This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. + `,examples:[["Open the search window","yarn search"]]})}async execute(){XC(this.context);let{Gem:t}=await Promise.resolve().then(()=>(FF(),AY)),{ScrollableItems:r}=await Promise.resolve().then(()=>(MF(),LF)),{useKeypress:s}=await Promise.resolve().then(()=>(hw(),pY)),{useMinistore:a}=await Promise.resolve().then(()=>(yY(),mY)),{renderForm:n}=await Promise.resolve().then(()=>(jF(),HF)),{default:c}=await Promise.resolve().then(()=>et(Fwe())),{Box:f,Text:p}=await Promise.resolve().then(()=>et(Yc())),{default:h,useEffect:E,useState:C}=await Promise.resolve().then(()=>et(dn())),S=await Je.find(this.context.cwd,this.context.plugins),x=()=>h.createElement(f,{flexDirection:"row"},h.createElement(f,{flexDirection:"column",width:48},h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(f,{flexDirection:"column"},h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),I=()=>h.createElement(h.Fragment,null,h.createElement(f,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(f,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(f,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),R=()=>h.createElement(f,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),N=({hit:pe,active:De})=>{let[ye,d]=a(pe.name,null);s({active:De},(me,ce)=>{if(ce.name!=="space")return;if(!ye){d(Db[0]);return}let X=Db.indexOf(ye)+1;X===Db.length?d(null):d(Db[X])},[ye,d]);let ve=H.parseIdent(pe.name),Ie=H.prettyIdent(S,ve);return h.createElement(f,null,h.createElement(f,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},Ie)),h.createElement(f,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},pe.owner.name)),h.createElement(f,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},pe.version)),h.createElement(f,{width:16,marginLeft:1},h.createElement(p,null,pe.humanDownloadsLast30Days)))},U=({name:pe,active:De})=>{let[ye]=a(pe,null),d=H.parseIdent(pe);return h.createElement(f,null,h.createElement(f,{width:47},h.createElement(p,{bold:!0}," - ",H.prettyIdent(S,d))),Db.map(ve=>h.createElement(f,{key:ve,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(t,{active:ye===ve})," ",h.createElement(p,{bold:!0},ve)))))},K=()=>h.createElement(f,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),ie=await n(({useSubmit:pe})=>{let De=a();pe(De);let ye=Array.from(De.keys()).filter(_=>De.get(_)!==null),[d,ve]=C(""),[Ie,me]=C(0),[ce,X]=C([]),be=_=>{_.match(/\t| /)||ve(_)},ke=async()=>{me(0);let _=await W9(d);_.query===d&&X(_.hits)},it=async()=>{let _=await W9(d,Ie+1);_.query===d&&_.page-1===Ie&&(me(_.page),X([...ce,..._.hits]))};return E(()=>{d?ke():X([])},[d]),h.createElement(f,{flexDirection:"column"},h.createElement(x,null),h.createElement(f,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(f,{width:41},h.createElement(c,{value:d,onChange:be,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(I,null)),ce.length?h.createElement(r,{radius:2,loop:!1,children:ce.map(_=>h.createElement(N,{key:_.name,hit:_,active:!1})),willReachEnd:it}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(f,{flexDirection:"row",marginTop:1},h.createElement(f,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(R,null)),ye.length?ye.map(_=>h.createElement(U,{key:_,name:_,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(K,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ie>"u")return 1;let fe=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="regular"),le=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="dev"),ge=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="peer");return fe.length&&await this.cli.run(["add",...fe]),le.length&&await this.cli.run(["add","--dev",...le]),ge&&await this.cli.run(["add","--peer",...ge]),0}};Ge();jt();IG();var Hwe=et(hi());Jo();var _we=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/;function jwe(e,t){return e.length>0?[e.slice(0,t)].concat(jwe(e.slice(t),t)):[]}var gw=class extends ft{constructor(){super(...arguments);this.mode=he.String("--mode",{description:"Change what artifacts installs generate",validator:Qs(La)})}static{this.paths=[["upgrade-interactive"]]}static{this.usage=st.Usage({category:"Interactive commands",description:"open the upgrade interface",details:"\n This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade.\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 latter 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 ",examples:[["Open the upgrade window","yarn upgrade-interactive"]]})}async execute(){XC(this.context);let{ItemOptions:r}=await Promise.resolve().then(()=>(Uwe(),Mwe)),{Pad:s}=await Promise.resolve().then(()=>(wY(),Lwe)),{ScrollableItems:a}=await Promise.resolve().then(()=>(MF(),LF)),{useMinistore:n,useMinistoreSetAll:c}=await Promise.resolve().then(()=>(yY(),mY)),{useKeypress:f}=await Promise.resolve().then(()=>(hw(),pY)),{renderForm:p}=await Promise.resolve().then(()=>(jF(),HF)),{Box:h,Text:E}=await Promise.resolve().then(()=>et(Yc())),{default:C,useCallback:S,useEffect:x,useRef:I,useState:R}=await Promise.resolve().then(()=>et(dn())),N=await Je.find(this.context.cwd,this.context.plugins),{project:U,workspace:K}=await Tt.find(N,this.context.cwd),$=await zr.find(N);if(!K)throw new ar(U.cwd,this.context.cwd);await U.restoreInstallState({restoreResolutions:!1});let ie=this.context.stdout.rows-8,fe=(X,be)=>{let ke=Ide(X,be),it="";for(let _ of ke)_.added?it+=ue.pretty(N,_.value,"green"):_.removed||(it+=_.value);return it},le=(X,be)=>{if(X===be)return be;let ke=H.parseRange(X),it=H.parseRange(be),_=ke.selector.match(_we),tt=it.selector.match(_we);if(!_||!tt)return fe(X,be);let Fe=["gray","red","yellow","green","magenta"],Qe=null,Se="";for(let je=1;je{let it=await ef.fetchDescriptorFrom(X,ke,{project:U,cache:$,preserveModifier:be,workspace:K});return it!==null?it.range:X.range},pe=async X=>{let be=Hwe.default.valid(X.range)?`^${X.range}`:X.range,[ke,it]=await Promise.all([ge(X,X.range,be).catch(()=>null),ge(X,X.range,"latest").catch(()=>null)]),_=[{value:null,label:X.range}];return ke&&ke!==X.range?_.push({value:ke,label:le(X.range,ke)}):_.push({value:null,label:""}),it&&it!==ke&&it!==X.range?_.push({value:it,label:le(X.range,it)}):_.push({value:null,label:""}),_},De=()=>C.createElement(h,{flexDirection:"row"},C.createElement(h,{flexDirection:"column",width:49},C.createElement(h,{marginLeft:1},C.createElement(E,null,"Press ",C.createElement(E,{bold:!0,color:"cyanBright"},""),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"")," to select packages.")),C.createElement(h,{marginLeft:1},C.createElement(E,null,"Press ",C.createElement(E,{bold:!0,color:"cyanBright"},""),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"")," to select versions.")),C.createElement(h,{marginLeft:1},C.createElement(E,null,"Press ",C.createElement(E,{bold:!0,color:"cyanBright"},"c"),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"r"),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"l")," to select all ",C.createElement(E,{bold:!0,color:"cyanBright"},"current"),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"range"),"/",C.createElement(E,{bold:!0,color:"cyanBright"},"latest"),"."))),C.createElement(h,{flexDirection:"column"},C.createElement(h,{marginLeft:1},C.createElement(E,null,"Press ",C.createElement(E,{bold:!0,color:"cyanBright"},"")," to install.")),C.createElement(h,{marginLeft:1},C.createElement(E,null,"Press ",C.createElement(E,{bold:!0,color:"cyanBright"},"")," to abort.")))),ye=()=>C.createElement(h,{flexDirection:"row",paddingTop:1,paddingBottom:1},C.createElement(h,{width:50},C.createElement(E,{bold:!0},C.createElement(E,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),C.createElement(h,{width:17},C.createElement(E,{bold:!0,underline:!0,color:"gray"},"Current")),C.createElement(h,{width:17},C.createElement(E,{bold:!0,underline:!0,color:"gray"},"Range")),C.createElement(h,{width:17},C.createElement(E,{bold:!0,underline:!0,color:"gray"},"Latest"))),d=({active:X,descriptor:be,suggestions:ke})=>{let[it,_]=n(be.descriptorHash,null),tt=H.stringifyIdent(be),Fe=Math.max(0,45-tt.length);return C.createElement(C.Fragment,null,C.createElement(h,null,C.createElement(h,{width:45},C.createElement(E,{bold:!0},H.prettyIdent(N,be)),C.createElement(s,{active:X,length:Fe})),C.createElement(r,{active:X,options:ke,value:it,skewer:!0,onChange:_,sizes:[17,17,17]})))},ve=({dependencies:X})=>{let be=c(),[ke,it]=R(X.map(()=>null)),_=I(!0),tt=async Qe=>{let Se=await pe(Qe);return Se.filter(je=>je.label!=="").length<=1?null:{descriptor:Qe,suggestions:Se}};x(()=>()=>{_.current=!1},[]),x(()=>{let Qe=Math.trunc(ie*1.75),Se=X.slice(0,Qe),je=X.slice(Qe),Te=jwe(je,ie),ct=Se.map(tt).reduce(async(Me,P)=>{await Me;let w=await P;w!==null&&_.current&&it(D=>{let y=D.findIndex(z=>z===null),F=[...D];return F[y]=w,F})},Promise.resolve());Te.reduce((Me,P)=>Promise.all(P.map(w=>Promise.resolve().then(()=>tt(w)))).then(async w=>{w=w.filter(D=>D!==null),await Me,_.current&&it(D=>{let y=D.findIndex(F=>F===null);return D.slice(0,y).concat(w).concat(D.slice(y+w.length))})}),ct).then(()=>{_.current&&it(Me=>Me.filter(P=>P!==null))})},[]);let Fe=S(Qe=>{if(Qe!=="c"&&Qe!=="r"&&Qe!=="l")return;let Se=[];for(let je of ke){if(je===null)continue;let Te;Qe==="c"?Te=null:Qe==="r"?Te=je.suggestions[1].value:Te=je.suggestions[2].value??je.suggestions[1].value,Se.push([je.descriptor.descriptorHash,Te])}be(Se)},[ke,be]);return f({active:!0},Fe,[Fe]),ke.length?C.createElement(a,{radius:ie>>1,children:ke.map((Qe,Se)=>Qe!==null?C.createElement(d,{key:Se,active:!1,descriptor:Qe.descriptor,suggestions:Qe.suggestions}):C.createElement(E,{key:Se},"Loading..."))}):C.createElement(E,null,"No upgrades found")},me=await p(({useSubmit:X})=>{X(n());let be=new Map;for(let it of U.workspaces)for(let _ of["dependencies","devDependencies"])for(let tt of it.manifest[_].values())U.tryWorkspaceByDescriptor(tt)===null&&(tt.range.startsWith("link:")||be.set(tt.descriptorHash,tt));let ke=qe.sortMap(be.values(),it=>H.stringifyDescriptor(it));return C.createElement(h,{flexDirection:"column"},C.createElement(De,null),C.createElement(ye,null),C.createElement(ve,{dependencies:ke}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof me>"u")return 1;let ce=!1;for(let X of U.workspaces)for(let be of["dependencies","devDependencies"]){let ke=X.manifest[be];for(let it of ke.values()){let _=me.get(it.descriptorHash);typeof _<"u"&&_!==null&&(ke.set(it.identHash,H.makeDescriptor(it,_)),ce=!0)}}return ce?await U.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:$,mode:this.mode}):0}};var aht={commands:[dw,gw]},lht=aht;var SY={};Vt(SY,{default:()=>Aht});Ge();var xb="jsr:";Ge();Ge();function mw(e){let t=e.range.slice(4);if(kr.validRange(t))return H.makeDescriptor(e,`npm:${H.stringifyIdent(H.wrapIdentIntoScope(e,"jsr"))}@${t}`);let r=H.tryParseDescriptor(t,!0);if(r!==null)return H.makeDescriptor(e,`npm:${H.stringifyIdent(H.wrapIdentIntoScope(r,"jsr"))}@${r.range}`);throw new Error(`Invalid range: ${e.range}`)}function yw(e){return H.makeLocator(H.wrapIdentIntoScope(e,"jsr"),`npm:${e.reference.slice(4)}`)}function vY(e){return H.makeLocator(H.unwrapIdentFromScope(e,"jsr"),`jsr:${e.reference.slice(4)}`)}var GF=class{supports(t,r){return t.reference.startsWith(xb)}getLocalPath(t,r){let s=yw(t);return r.fetcher.getLocalPath(s,r)}fetch(t,r){let s=yw(t);return r.fetcher.fetch(s,r)}};var qF=class{supportsDescriptor(t,r){return!!t.range.startsWith(xb)}supportsLocator(t,r){return!!t.reference.startsWith(xb)}shouldPersistResolution(t,r){let s=yw(t);return r.resolver.shouldPersistResolution(s,r)}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{inner:mw(t)}}async getCandidates(t,r,s){let a=s.project.configuration.normalizeDependency(mw(t));return(await s.resolver.getCandidates(a,r,s)).map(c=>vY(c))}async getSatisfying(t,r,s,a){let n=a.project.configuration.normalizeDependency(mw(t));return a.resolver.getSatisfying(n,r,s,a)}async resolve(t,r){let s=yw(t),a=await r.resolver.resolve(s,r);return{...a,...vY(a)}}};var cht=["dependencies","devDependencies","peerDependencies"];function uht(e,t){for(let r of cht)for(let s of e.manifest.getForScope(r).values()){if(!s.range.startsWith("jsr:"))continue;let a=mw(s),n=r==="dependencies"?H.makeDescriptor(s,"unknown"):null,c=n!==null&&e.manifest.ensureDependencyMeta(n).optional?"optionalDependencies":r;t[c][H.stringifyIdent(s)]=a.range}}var fht={hooks:{beforeWorkspacePacking:uht},resolvers:[qF],fetchers:[GF]},Aht=fht;var bY={};Vt(bY,{LinkFetcher:()=>kb,LinkResolver:()=>Qb,PortalFetcher:()=>Tb,PortalResolver:()=>Rb,default:()=>hht});Ge();bt();var ih="portal:",sh="link:";var kb=class{supports(t,r){return!!t.reference.startsWith(sh)}getLocalPath(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:sh});if(Y.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:Y.resolve(n,a)}async fetch(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:sh}),n=Y.isAbsolute(a)?{packageFs:new Pn(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,n.localPath),localPath:wt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=Y.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Pn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:wt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new qf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:wt.dot,discardFromLookup:!0}}};Ge();bt();var Qb=class{supportsDescriptor(t,r){return!!t.range.startsWith(sh)}supportsLocator(t,r){return!!t.reference.startsWith(sh)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){return H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){let a=t.range.slice(sh.length);return[H.makeLocator(t,`${sh}${Ae.toPortablePath(a)}`)]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){return{...t,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ge();bt();var Tb=class{supports(t,r){return!!t.reference.startsWith(ih)}getLocalPath(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:ih});if(Y.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:Y.resolve(n,a)}async fetch(t,r){let{parentLocator:s,path:a}=H.parseFileStyleRange(t.reference,{protocol:ih}),n=Y.isAbsolute(a)?{packageFs:new Pn(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,n.localPath),localPath:wt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=Y.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Pn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:wt.dot,localPath:p}:{packageFs:new qf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:wt.dot}}};Ge();Ge();bt();var Rb=class{supportsDescriptor(t,r){return!!t.range.startsWith(ih)}supportsLocator(t,r){return!!t.reference.startsWith(ih)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){return H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){let a=t.range.slice(ih.length);return[H.makeLocator(t,`${ih}${Ae.toPortablePath(a)}`)]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(t,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...t,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var pht={fetchers:[kb,Tb],resolvers:[Qb,Rb]},hht=pht;var dW={};Vt(dW,{NodeModulesLinker:()=>Kb,NodeModulesMode:()=>fW,PnpLooseLinker:()=>Jb,default:()=>Gdt});bt();Ge();bt();bt();var PY=(e,t)=>`${e}@${t}`,Gwe=(e,t)=>{let r=t.indexOf("#"),s=r>=0?t.substring(r+1):t;return PY(e,s)};var Ywe=(e,t={})=>{let r=t.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),s=t.check||r>=9,a=t.hoistingLimits||new Map,n={check:s,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},c;n.debugLevel>=0&&(c=Date.now());let f=Cht(e,n),p=!1,h=0;do{let E=xY(f,[f],new Set([f.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-c}ms, rounds: ${h}`),n.debugLevel>=1){let E=Fb(f);if(xY(f,[f],new Set([f.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${E}, next tree: +${Fb(f)}`);let S=Wwe(f);if(S)throw new Error(`${S}, after hoisting finished: +${Fb(f)}`)}return n.debugLevel>=2&&console.log(Fb(f)),wht(f)},dht=e=>{let t=e[e.length-1],r=new Map,s=new Set,a=n=>{if(!s.has(n)){s.add(n);for(let c of n.hoistedDependencies.values())r.set(c.name,c);for(let c of n.dependencies.values())n.peerNames.has(c.name)||a(c)}};return a(t),r},ght=e=>{let t=e[e.length-1],r=new Map,s=new Set,a=new Set,n=(c,f)=>{if(s.has(c))return;s.add(c);for(let h of c.hoistedDependencies.values())if(!f.has(h.name)){let E;for(let C of e)E=C.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of c.dependencies.values())p.add(h.name);for(let h of c.dependencies.values())c.peerNames.has(h.name)||n(h,p)};return n(t,a),r},qwe=(e,t)=>{if(t.decoupled)return t;let{name:r,references:s,ident:a,locator:n,dependencies:c,originalDependencies:f,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:C,hoistPriority:S,dependencyKind:x,hoistedFrom:I,hoistedTo:R}=t,N={name:r,references:new Set(s),ident:a,locator:n,dependencies:new Map(c),originalDependencies:new Map(f),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:C,hoistPriority:S,dependencyKind:x,hoistedFrom:new Map(I),hoistedTo:new Map(R)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),e.dependencies.set(N.name,N),N},mht=(e,t)=>{let r=new Map([[e.name,[e.ident]]]);for(let a of e.dependencies.values())e.peerNames.has(a.name)||r.set(a.name,[a.ident]);let s=Array.from(t.keys());s.sort((a,n)=>{let c=t.get(a),f=t.get(n);if(f.hoistPriority!==c.hoistPriority)return f.hoistPriority-c.hoistPriority;{let p=c.dependents.size+c.peerDependents.size;return f.dependents.size+f.peerDependents.size-p}});for(let a of s){let n=a.substring(0,a.indexOf("@",1)),c=a.substring(n.length+1);if(!e.peerNames.has(n)){let f=r.get(n);f||(f=[],r.set(n,f)),f.indexOf(c)<0&&f.push(c)}}return r},DY=e=>{let t=new Set,r=(s,a=new Set)=>{if(!a.has(s)){a.add(s);for(let n of s.peerNames)if(!e.peerNames.has(n)){let c=e.dependencies.get(n);c&&!t.has(c)&&r(c,a)}t.add(s)}};for(let s of e.dependencies.values())e.peerNames.has(s.name)||r(s);return t},xY=(e,t,r,s,a,n=new Set)=>{let c=t[t.length-1];if(n.has(c))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(c);let f=Bht(c),p=mht(c,f),h=e==c?new Map:a.fastLookupPossible?dht(t):ght(t),E,C=!1,S=!1,x=new Map(Array.from(p.entries()).map(([R,N])=>[R,N[0]])),I=new Map;do{let R=Iht(e,t,r,h,x,p,s,I,a);R.isGraphChanged&&(S=!0),R.anotherRoundNeeded&&(C=!0),E=!1;for(let[N,U]of p)U.length>1&&!c.dependencies.has(N)&&(x.delete(N),U.shift(),x.set(N,U[0]),E=!0)}while(E);for(let R of c.dependencies.values())if(!c.peerNames.has(R.name)&&!r.has(R.locator)){r.add(R.locator);let N=xY(e,[...t,R],r,I,a);N.isGraphChanged&&(S=!0),N.anotherRoundNeeded&&(C=!0),r.delete(R.locator)}return{anotherRoundNeeded:C,isGraphChanged:S}},yht=e=>{for(let[t,r]of e.dependencies)if(!e.peerNames.has(t)&&r.ident!==e.ident)return!0;return!1},Eht=(e,t,r,s,a,n,c,f,{outputReason:p,fastLookupPossible:h})=>{let E,C=null,S=new Set;p&&(E=`${Array.from(t).map(N=>So(N)).join("\u2192")}`);let x=r[r.length-1],R=!(s.ident===x.ident);if(p&&!R&&(C="- self-reference"),R&&(R=s.dependencyKind!==1,p&&!R&&(C="- workspace")),R&&s.dependencyKind===2&&(R=!yht(s),p&&!R&&(C="- external soft link with unhoisted dependencies")),R&&(R=!e.peerNames.has(s.name),p&&!R&&(C=`- cannot shadow peer: ${So(e.originalDependencies.get(s.name).locator)} at ${E}`)),R){let N=!1,U=a.get(s.name);if(N=!U||U.ident===s.ident,p&&!N&&(C=`- filled by: ${So(U.locator)} at ${E}`),N)for(let K=r.length-1;K>=1;K--){let ie=r[K].dependencies.get(s.name);if(ie&&ie.ident!==s.ident){N=!1;let fe=f.get(x);fe||(fe=new Set,f.set(x,fe)),fe.add(s.name),p&&(C=`- filled by ${So(ie.locator)} at ${r.slice(0,K).map(le=>So(le.locator)).join("\u2192")}`);break}}R=N}if(R&&(R=n.get(s.name)===s.ident,p&&!R&&(C=`- filled by: ${So(c.get(s.name)[0])} at ${E}`)),R){let N=!0,U=new Set(s.peerNames);for(let K=r.length-1;K>=1;K--){let $=r[K];for(let ie of U){if($.peerNames.has(ie)&&$.originalDependencies.has(ie))continue;let fe=$.dependencies.get(ie);fe&&e.dependencies.get(ie)!==fe&&(K===r.length-1?S.add(fe):(S=null,N=!1,p&&(C=`- peer dependency ${So(fe.locator)} from parent ${So($.locator)} was not hoisted to ${E}`))),U.delete(ie)}if(!N)break}R=N}if(R&&!h)for(let N of s.hoistedDependencies.values()){let U=a.get(N.name)||e.dependencies.get(N.name);if(!U||N.ident!==U.ident){R=!1,p&&(C=`- previously hoisted dependency mismatch, needed: ${So(N.locator)}, available: ${So(U?.locator)}`);break}}return S!==null&&S.size>0?{isHoistable:2,dependsOn:S,reason:C}:{isHoistable:R?0:1,reason:C}},YF=e=>`${e.name}@${e.locator}`,Iht=(e,t,r,s,a,n,c,f,p)=>{let h=t[t.length-1],E=new Set,C=!1,S=!1,x=(U,K,$,ie,fe)=>{if(E.has(ie))return;let le=[...K,YF(ie)],ge=[...$,YF(ie)],pe=new Map,De=new Map;for(let me of DY(ie)){let ce=Eht(h,r,[h,...U,ie],me,s,a,n,f,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(De.set(me,ce),ce.isHoistable===2)for(let X of ce.dependsOn){let be=pe.get(X.name)||new Set;be.add(me.name),pe.set(X.name,be)}}let ye=new Set,d=(me,ce,X)=>{if(!ye.has(me)){ye.add(me),De.set(me,{isHoistable:1,reason:X});for(let be of pe.get(me.name)||[])d(ie.dependencies.get(be),ce,p.debugLevel>=2?`- peer dependency ${So(me.locator)} from parent ${So(ie.locator)} was not hoisted`:"")}};for(let[me,ce]of De)ce.isHoistable===1&&d(me,ce,ce.reason);let ve=!1;for(let me of De.keys())if(!ye.has(me)){S=!0;let ce=c.get(ie);ce&&ce.has(me.name)&&(C=!0),ve=!0,ie.dependencies.delete(me.name),ie.hoistedDependencies.set(me.name,me),ie.reasons.delete(me.name);let X=h.dependencies.get(me.name);if(p.debugLevel>=2){let be=Array.from(K).concat([ie.locator]).map(it=>So(it)).join("\u2192"),ke=h.hoistedFrom.get(me.name);ke||(ke=[],h.hoistedFrom.set(me.name,ke)),ke.push(be),ie.hoistedTo.set(me.name,Array.from(t).map(it=>So(it.locator)).join("\u2192"))}if(!X)h.ident!==me.ident&&(h.dependencies.set(me.name,me),fe.add(me));else for(let be of me.references)X.references.add(be)}if(ie.dependencyKind===2&&ve&&(C=!0),p.check){let me=Wwe(e);if(me)throw new Error(`${me}, after hoisting dependencies of ${[h,...U,ie].map(ce=>So(ce.locator)).join("\u2192")}: +${Fb(e)}`)}let Ie=DY(ie);for(let me of Ie)if(ye.has(me)){let ce=De.get(me);if((a.get(me.name)===me.ident||!ie.reasons.has(me.name))&&ce.isHoistable!==0&&ie.reasons.set(me.name,ce.reason),!me.isHoistBorder&&ge.indexOf(YF(me))<0){E.add(ie);let be=qwe(ie,me);x([...U,ie],le,ge,be,R),E.delete(ie)}}},I,R=new Set(DY(h)),N=Array.from(t).map(U=>YF(U));do{I=R,R=new Set;for(let U of I){if(U.locator===h.locator||U.isHoistBorder)continue;let K=qwe(h,U);x([],Array.from(r),N,K,R)}}while(R.size>0);return{anotherRoundNeeded:C,isGraphChanged:S}},Wwe=e=>{let t=[],r=new Set,s=new Set,a=(n,c,f)=>{if(r.has(n)||(r.add(n),s.has(n)))return;let p=new Map(c);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),C=()=>`${Array.from(s).concat([n]).map(S=>So(S.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let S=c.get(h.name);(S!==E||!S||S.ident!==h.ident)&&t.push(`${C()} - broken peer promise: expected ${h.ident} but found ${S&&S.ident}`)}else{let S=f.hoistedFrom.get(n.name),x=n.hoistedTo.get(h.name),I=`${S?` hoisted from ${S.join(", ")}`:""}`,R=`${x?` hoisted to ${x}`:""}`,N=`${C()}${I}`;E?E.ident!==h.ident&&t.push(`${N} - broken require promise for ${h.name}${R}: expected ${h.ident}, but found: ${E.ident}`):t.push(`${N} - broken require promise: no required dependency ${h.name}${R} found`)}}s.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);s.delete(n)};return a(e,e.dependencies,e),t.join(` +`)},Cht=(e,t)=>{let{identName:r,name:s,reference:a,peerNames:n}=e,c={name:s,references:new Set([a]),locator:PY(r,a),ident:Gwe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},f=new Map([[e,c]]),p=(h,E)=>{let C=f.get(h),S=!!C;if(!C){let{name:x,identName:I,reference:R,peerNames:N,hoistPriority:U,dependencyKind:K}=h,$=t.hoistingLimits.get(E.locator);C={name:x,references:new Set([R]),locator:PY(I,R),ident:Gwe(I,R),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:$?$.has(x):!1,hoistPriority:U||0,dependencyKind:K||0,hoistedFrom:new Map,hoistedTo:new Map},f.set(h,C)}if(E.dependencies.set(h.name,C),E.originalDependencies.set(h.name,C),S){let x=new Set,I=R=>{if(!x.has(R)){x.add(R),R.decoupled=!1;for(let N of R.dependencies.values())R.peerNames.has(N.name)||I(N)}};I(C)}else for(let x of h.dependencies)p(x,C)};for(let h of e.dependencies)p(h,c);return c},kY=e=>e.substring(0,e.indexOf("@",1)),wht=e=>{let t={name:e.name,identName:kY(e.locator),references:new Set(e.references),dependencies:new Set},r=new Set([e]),s=(a,n,c)=>{let f=r.has(a),p;if(n===a)p=c;else{let{name:h,references:E,locator:C}=a;p={name:h,identName:kY(C),references:E,dependencies:new Set}}if(c.dependencies.add(p),!f){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||s(h,a,p);r.delete(a)}};for(let a of e.dependencies.values())s(a,e,t);return t},Bht=e=>{let t=new Map,r=new Set([e]),s=c=>`${c.name}@${c.ident}`,a=c=>{let f=s(c),p=t.get(f);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},t.set(f,p)),p},n=(c,f)=>{let p=!!r.has(f);if(a(f).dependents.add(c.ident),!p){r.add(f);for(let E of f.dependencies.values()){let C=a(E);C.hoistPriority=Math.max(C.hoistPriority,E.hoistPriority),f.peerNames.has(E.name)?C.peerDependents.add(f.ident):n(f,E)}}};for(let c of e.dependencies.values())e.peerNames.has(c.name)||n(e,c);return t},So=e=>{if(!e)return"none";let t=e.indexOf("@",1),r=e.substring(0,t);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let s=e.substring(t+1);if(s==="workspace:.")return".";if(s){let a=(s.indexOf("#")>0?s.split("#")[1]:s).replace("npm:","");return s.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`};var Fb=e=>{let t=0,r=(a,n,c="")=>{if(t>5e4||n.has(a))return"";t++;let f=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(S!==E.name?`a:${E.name}:`:"")+So(E.locator)+(C?` ${C}`:"")} +`,p+=r(E,n,`${c}${h5e4?` +Tree is too large, part of the tree has been dunped +`:"")};var Nb=(s=>(s.WORKSPACES="workspaces",s.DEPENDENCIES="dependencies",s.NONE="none",s))(Nb||{}),Vwe="node_modules",ng="$wsroot$";var Ob=(e,t)=>{let{packageTree:r,hoistingLimits:s,errors:a,preserveSymlinksRequired:n}=Sht(e,t),c=null;if(a.length===0){let f=Ywe(r,{hoistingLimits:s});c=Dht(e,f,t)}return{tree:c,errors:a,preserveSymlinksRequired:n}},gA=e=>`${e.name}@${e.reference}`,TY=e=>{let t=new Map;for(let[r,s]of e.entries())if(!s.dirList){let a=t.get(s.locator);a||(a={target:s.target,linkType:s.linkType,locations:[],aliases:s.aliases},t.set(s.locator,a)),a.locations.push(r)}for(let r of t.values())r.locations=r.locations.sort((s,a)=>{let n=s.split(Y.delimiter).length,c=a.split(Y.delimiter).length;return a===s?0:n!==c?c-n:a>s?1:-1});return t},Kwe=(e,t)=>{let r=H.isVirtualLocator(e)?H.devirtualizeLocator(e):e,s=H.isVirtualLocator(t)?H.devirtualizeLocator(t):t;return H.areLocatorsEqual(r,s)},QY=(e,t,r,s)=>{if(e.linkType!=="SOFT")return!1;let a=Ae.toPortablePath(r.resolveVirtual&&t.reference&&t.reference.startsWith("virtual:")?r.resolveVirtual(e.packageLocation):e.packageLocation);return Y.contains(s,a)===null},vht=e=>{let t=e.getPackageInformation(e.topLevel);if(t===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(e.findPackageLocator(t.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let s=Ae.toPortablePath(t.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},c=e.getDependencyTreeRoots(),f=new Map,p=new Set,h=(S,x)=>{let I=gA(S);if(p.has(I))return;p.add(I);let R=e.getPackageInformation(S);if(R){let N=x?gA(x):"";if(gA(S)!==N&&R.linkType==="SOFT"&&!S.reference.startsWith("link:")&&!QY(R,S,e,s)){let U=Jwe(R,S,e);(!f.get(U)||S.reference.startsWith("workspace:"))&&f.set(U,S)}for(let[U,K]of R.packageDependencies)K!==null&&(R.packagePeers.has(U)||h(e.getLocator(U,K),S))}};for(let S of c)h(S,null);let E=s.split(Y.sep);for(let S of f.values()){let x=e.getPackageInformation(S),R=Ae.toPortablePath(x.packageLocation.slice(0,-1)).split(Y.sep).slice(E.length),N=n;for(let U of R){let K=N.children.get(U);K||(K={children:new Map},N.children.set(U,K)),N=K}N.workspaceLocator=S}let C=(S,x)=>{if(S.workspaceLocator){let I=gA(x),R=a.get(I);R||(R=new Set,a.set(I,R)),R.add(S.workspaceLocator)}for(let I of S.children.values())C(I,S.workspaceLocator||x)};for(let S of n.children.values())C(S,n.workspaceLocator);return a},Sht=(e,t)=>{let r=[],s=!1,a=new Map,n=vht(e),c=e.getPackageInformation(e.topLevel);if(c===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let f=e.findPackageLocator(c.packageLocation);if(f===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=Ae.toPortablePath(c.packageLocation.slice(0,-1)),h={name:f.name,identName:f.name,reference:f.reference,peerNames:c.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,C=(x,I)=>`${gA(I)}:${x}`,S=(x,I,R,N,U,K,$,ie)=>{let fe=C(x,R),le=E.get(fe),ge=!!le;!ge&&R.name===f.name&&R.reference===f.reference&&(le=h,E.set(fe,h));let pe=QY(I,R,e,p);if(!le){let me=0;pe?me=2:I.linkType==="SOFT"&&R.name.endsWith(ng)&&(me=1),le={name:x,identName:R.name,reference:R.reference,dependencies:new Set,peerNames:me===1?new Set:I.packagePeers,dependencyKind:me},E.set(fe,le)}let De;if(pe?De=2:U.linkType==="SOFT"?De=1:De=0,le.hoistPriority=Math.max(le.hoistPriority||0,De),ie&&!pe){let me=gA({name:N.identName,reference:N.reference}),ce=a.get(me)||new Set;a.set(me,ce),ce.add(le.name)}let ye=new Map(I.packageDependencies);if(t.project){let me=t.project.workspacesByCwd.get(Ae.toPortablePath(I.packageLocation.slice(0,-1)));if(me){let ce=new Set([...Array.from(me.manifest.peerDependencies.values(),X=>H.stringifyIdent(X)),...Array.from(me.manifest.peerDependenciesMeta.keys())]);for(let X of ce)ye.has(X)||(ye.set(X,K.get(X)||null),le.peerNames.add(X))}}let d=gA({name:R.name.replace(ng,""),reference:R.reference}),ve=n.get(d);if(ve)for(let me of ve)ye.set(`${me.name}${ng}`,me.reference);(I!==U||I.linkType!=="SOFT"||!pe&&(!t.selfReferencesByCwd||t.selfReferencesByCwd.get($)))&&N.dependencies.add(le);let Ie=R!==f&&I.linkType==="SOFT"&&!R.name.endsWith(ng)&&!pe;if(!ge&&!Ie){let me=new Map;for(let[ce,X]of ye)if(X!==null){let be=e.getLocator(ce,X),ke=e.getLocator(ce.replace(ng,""),X),it=e.getPackageInformation(ke);if(it===null)throw new Error("Assertion failed: Expected the package to have been registered");let _=QY(it,be,e,p);if(t.validateExternalSoftLinks&&t.project&&_){it.packageDependencies.size>0&&(s=!0);for(let[je,Te]of it.packageDependencies)if(Te!==null){let ct=H.parseLocator(Array.isArray(Te)?`${Te[0]}@${Te[1]}`:`${je}@${Te}`);if(gA(ct)!==gA(be)){let Me=ye.get(je);if(Me){let P=H.parseLocator(Array.isArray(Me)?`${Me[0]}@${Me[1]}`:`${je}@${Me}`);Kwe(P,ct)||r.push({messageName:71,text:`Cannot link ${H.prettyIdent(t.project.configuration,H.parseIdent(be.name))} into ${H.prettyLocator(t.project.configuration,H.parseLocator(`${R.name}@${R.reference}`))} dependency ${H.prettyLocator(t.project.configuration,ct)} conflicts with parent dependency ${H.prettyLocator(t.project.configuration,P)}`})}else{let P=me.get(je);if(P){let w=P.target,D=H.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${je}@${w}`);Kwe(D,ct)||r.push({messageName:71,text:`Cannot link ${H.prettyIdent(t.project.configuration,H.parseIdent(be.name))} into ${H.prettyLocator(t.project.configuration,H.parseLocator(`${R.name}@${R.reference}`))} dependency ${H.prettyLocator(t.project.configuration,ct)} conflicts with dependency ${H.prettyLocator(t.project.configuration,D)} from sibling portal ${H.prettyIdent(t.project.configuration,H.parseIdent(P.portal.name))}`})}else me.set(je,{target:ct.reference,portal:be})}}}}let tt=t.hoistingLimitsByCwd?.get($),Fe=_?$:Y.relative(p,Ae.toPortablePath(it.packageLocation))||wt.dot,Qe=t.hoistingLimitsByCwd?.get(Fe);S(ce,it,be,le,I,ye,Fe,tt==="dependencies"||Qe==="dependencies"||Qe==="workspaces")}}};return S(f.name,c,f,h,c,c.packageDependencies,wt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:s}};function Jwe(e,t,r){let s=r.resolveVirtual&&t.reference&&t.reference.startsWith("virtual:")?r.resolveVirtual(e.packageLocation):e.packageLocation;return Ae.toPortablePath(s||e.packageLocation)}function bht(e,t,r){let s=t.getLocator(e.name.replace(ng,""),e.reference),a=t.getPackageInformation(s);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:Ae.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:Jwe(a,e,t)}}var Dht=(e,t,r)=>{let s=new Map,a=(E,C,S)=>{let{linkType:x,target:I}=bht(E,e,r);return{locator:gA(E),nodePath:C,target:I,linkType:x,aliases:S}},n=E=>{let[C,S]=E.split("/");return S?{scope:C,name:S}:{scope:null,name:C}},c=new Set,f=(E,C,S)=>{if(c.has(E))return;c.add(E);let x=Array.from(E.references).sort().join("#");for(let I of E.dependencies){let R=Array.from(I.references).sort().join("#");if(I.identName===E.identName.replace(ng,"")&&R===x)continue;let N=Array.from(I.references).sort(),U={name:I.identName,reference:N[0]},{name:K,scope:$}=n(I.name),ie=$?[$,K]:[K],fe=Y.join(C,Vwe),le=Y.join(fe,...ie),ge=`${S}/${U.name}`,pe=a(U,S,N.slice(1)),De=!1;if(pe.linkType==="SOFT"&&r.project){let ye=r.project.workspacesByCwd.get(pe.target.slice(0,-1));De=!!(ye&&!ye.manifest.name)}if(!I.name.endsWith(ng)&&!De){let ye=s.get(le);if(ye){if(ye.dirList)throw new Error(`Assertion failed: ${le} cannot merge dir node with leaf node`);{let Ie=H.parseLocator(ye.locator),me=H.parseLocator(pe.locator);if(ye.linkType!==pe.linkType)throw new Error(`Assertion failed: ${le} cannot merge nodes with different link types ${ye.nodePath}/${H.stringifyLocator(Ie)} and ${S}/${H.stringifyLocator(me)}`);if(Ie.identHash!==me.identHash)throw new Error(`Assertion failed: ${le} cannot merge nodes with different idents ${ye.nodePath}/${H.stringifyLocator(Ie)} and ${S}/s${H.stringifyLocator(me)}`);pe.aliases=[...pe.aliases,...ye.aliases,H.parseLocator(ye.locator).reference]}}s.set(le,pe);let d=le.split("/"),ve=d.indexOf(Vwe);for(let Ie=d.length-1;ve>=0&&Ie>ve;Ie--){let me=Ae.toPortablePath(d.slice(0,Ie).join(Y.sep)),ce=d[Ie],X=s.get(me);if(!X)s.set(me,{dirList:new Set([ce])});else if(X.dirList){if(X.dirList.has(ce))break;X.dirList.add(ce)}}}f(I,pe.linkType==="SOFT"?pe.target:le,ge)}},p=a({name:t.name,reference:Array.from(t.references)[0]},"",[]),h=p.target;return s.set(h,p),f(t,h,""),s};Ge();bt();var zwe="node_modules",Pht="$wsroot$",xht=e=>!e.dirList,FY=e=>{for(;e!==wt.root&&e.endsWith(Y.sep);)e=e.slice(0,-1);return e},kht=(e,t)=>FY(t.linkType==="SOFT"?t.target:e),Qht=(e,t)=>{let r=Y.relative(e,t)||wt.dot;return r.startsWith(".")||(r=`./${r}`),r},Tht=(e,t)=>{let r=Y.relative(e,t)||wt.dot;return r===".."?wt.dot:r},Rht=e=>{let t=e.split(Y.sep),r=t.lastIndexOf(zwe);if(r===-1)return null;let s=t[r+1];if(typeof s>"u")return null;let a=t.slice(0,r+1).join(Y.sep);if(!s.startsWith("@"))return{nodeModulesPath:a,packageName:s};let n=t[r+2];return typeof n>"u"?null:{nodeModulesPath:a,packageName:`${s}/${n}`}},RY=(e,t)=>et?1:0,Fht=(e,t)=>{let r=H.parseLocator(t.locator.replace(Pht,"")),s=e.getPackageInformation({name:H.stringifyIdent(r),reference:r.reference});if(s===null)throw new Error(`Assertion failed: Expected ${t.locator} to have been registered`);let a=new Set;for(let[n,c]of s.packageDependencies)c!==null&&a.add(n);return a},Nht=(e,{basePath:t},r)=>{let s=new Map,a=new Map;t=FY(t);for(let[f,p]of e){if(!xht(p))continue;let h=FY(f),E={id:Tht(t,h),packagePath:kht(h,p),dependencyNames:r(p)};s.set(h,E);let C=Rht(h);if(C!==null){let S=a.get(C.nodeModulesPath);typeof S>"u"&&(S=new Map,a.set(C.nodeModulesPath,S)),S.set(C.packageName,h)}}let n=(f,p)=>{let h=new Map,E=f;for(;;){let C=Y.join(E,zwe),S=a.get(C);if(typeof S<"u")for(let[I,R]of Array.from(S).sort(([N],[U])=>RY(N,U))){if(p!==null&&!p.has(I)||h.has(I))continue;let N=s.get(R);if(typeof N>"u")throw new Error(`Assertion failed: Expected ${R} to have been registered`);h.set(I,N.id)}let x=Y.dirname(E);if(x===E)break;E=x}return Object.fromEntries(Array.from(h).sort(([C],[S])=>RY(C,S)))},c={};for(let f of Array.from(s.values()).sort((p,h)=>RY(p.id,h.id)))c[f.id]={url:Qht(t,f.packagePath),dependencies:n(f.packagePath,f.dependencyNames)};return{packages:c}},NY=(e,{basePath:t,pnp:r})=>Nht(e,{basePath:t},s=>r?Fht(r,s):null);Ge();Ge();bt();bt();iA();Sc();var rW={};Vt(rW,{NodePackageMapType:()=>zF,PnpInstaller:()=>Jm,PnpLinker:()=>og,UnplugCommand:()=>Iw,default:()=>Adt,getPackageMapPath:()=>R1e,getPnpPath:()=>ag,jsInstallUtils:()=>yA,pnpUtils:()=>Vb,quotePathIfNeeded:()=>tW});bt();var T1e=Ce("url");Ge();Ge();bt();bt();var Zwe={DEFAULT:{collapsed:!1,next:{"*":"DEFAULT"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA","*":"DEFAULT"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{"*":"FALLBACK_EXCLUSION_ENTRIES"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{"*":"FALLBACK_EXCLUSION_DATA"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{"*":"DEFAULT"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{"*":"PACKAGE_REGISTRY_ENTRIES"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_STORE_DATA"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{"*":"PACKAGE_STORE_ENTRIES"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_INFORMATION_DATA"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES","*":"DEFAULT"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{"*":"PACKAGE_DEPENDENCY"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{"*":"DEFAULT"}}};function Oht(e,t,r){let s="";s+="[";for(let a=0,n=e.length;a"u"||(f!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=WF(p,h,t,r).replace(/^ +/g,""),f+=1)}return a+="}",a}function Uht(e,t,r){let s=Object.keys(e),a=`${r} `,n="";n+=r,n+=`{ +`;let c=0;for(let f=0,p=s.length;f"u"||(c!==0&&(n+=",",n+=` +`),n+=a,n+=JSON.stringify(h),n+=": ",n+=WF(h,E,t,a).replace(/^ +/g,""),c+=1)}return c!==0&&(n+=` +`),n+=r,n+="}",n}function WF(e,t,r,s){let{next:a}=Zwe[r],n=a[e]||a["*"];return Xwe(t,n,s)}function Xwe(e,t,r){let{collapsed:s}=Zwe[t];return Array.isArray(e)?s?Oht(e,t,r):Lht(e,t,r):typeof e=="object"&&e!==null?s?Mht(e,t,r):Uht(e,t,r):JSON.stringify(e)}function $we(e){return Xwe(e,"TOP_LEVEL","")}function Lb(e,t){let r=Array.from(e);Array.isArray(t)||(t=[t]);let s=[];for(let n of t)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function _ht(e){let t=new Map,r=Lb(e.fallbackExclusionList||[],[({name:s,reference:a})=>s,({name:s,reference:a})=>a]);for(let{name:s,reference:a}of r){let n=t.get(s);typeof n>"u"&&t.set(s,n=new Set),n.add(a)}return Array.from(t).map(([s,a])=>[s,Array.from(a)])}function Hht(e){return Lb(e.fallbackPool||[],([t])=>t)}function jht(e){let t=[],r=e.dependencyTreeRoots.find(s=>e.packageRegistry.get(s.name)?.get(s.reference)?.packageLocation==="./");for(let[s,a]of Lb(e.packageRegistry,([n])=>n===null?"0":`1${n}`)){if(s===null)continue;let n=[];t.push([s,n]);for(let[c,{packageLocation:f,packageDependencies:p,packagePeers:h,linkType:E,discardFromLookup:C}]of Lb(a,([S])=>S===null?"0":`1${S}`)){if(c===null)continue;let S=[];s!==null&&c!==null&&!p.has(s)&&S.push([s,c]);for(let[U,K]of p)S.push([U,K]);let x=Lb(S,([U])=>U),I=h&&h.size>0?Array.from(h):void 0,N={packageLocation:f,packageDependencies:x,packagePeers:I,linkType:E,discardFromLookup:C||void 0};n.push([c,N]),r&&s===r.name&&c===r.reference&&t.unshift([null,[[null,N]]])}}return t}function Mb(e){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:e.dependencyTreeRoots,enableTopLevelFallback:e.enableTopLevelFallback||!1,ignorePatternData:e.ignorePattern||null,pnpZipBackend:e.pnpZipBackend,fallbackExclusionList:_ht(e),fallbackPool:Hht(e),packageRegistryData:jht(e)}}var r1e=et(t1e());function n1e(e,t){return[e?`${e} +`:"",`/* eslint-disable */ +`,`// @ts-nocheck +`,`"use strict"; +`,` +`,t,` +`,(0,r1e.default)()].join("")}function Ght(e){return JSON.stringify(e,null,2)}function qht(e){return`'${e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ +`)}'`}function Yht(e){return[`const RAW_RUNTIME_STATE = +`,`${qht($we(e))}; + +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +`,`} +`].join("")}function Wht(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` const fs = require('fs'); +`,` const path = require('path'); +`,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(yr.pnpData)}); +`,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); +`,`} +`].join("")}function i1e(e){let t=Mb(e),r=Yht(t);return n1e(e.shebang,r)}function s1e(e){let t=Mb(e),r=Wht(),s=n1e(e.shebang,r);return{dataFile:Ght(t),loaderFile:s}}bt();function LY(e,{basePath:t}){let r=Ae.toPortablePath(t),s=Y.resolve(r),a=e.ignorePatternData!==null?new RegExp(e.ignorePatternData):null,n=new Map,c=new Map(e.packageRegistryData.map(([C,S])=>[C,new Map(S.map(([x,I])=>{if(C===null!=(x===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let R=I.discardFromLookup??!1,N={name:C,reference:x},U=n.get(I.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&R,R||(U.locator=N)):n.set(I.packageLocation,{locator:N,discardFromLookup:R});let K=null;return[x,{packageDependencies:new Map(I.packageDependencies),packagePeers:new Set(I.packagePeers),linkType:I.linkType,discardFromLookup:R,get packageLocation(){return K||(K=Y.join(s,I.packageLocation))}}]}))])),f=new Map(e.fallbackExclusionList.map(([C,S])=>[C,new Set(S)])),p=new Map(e.fallbackPool),h=e.dependencyTreeRoots,E=e.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:f,pnpZipBackend:e.pnpZipBackend,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:c}}bt();bt();var oh=Ce("module"),Km=Ce("url"),KY=Ce("util");var aa=Ce("url");var c1e=et(Ce("assert"));var MY=Array.isArray,Ub=JSON.stringify,_b=Object.getOwnPropertyNames,Vm=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),UY=(e,t)=>RegExp.prototype.exec.call(e,t),_Y=(e,...t)=>RegExp.prototype[Symbol.replace].apply(e,t),ig=(e,...t)=>String.prototype.endsWith.apply(e,t),HY=(e,...t)=>String.prototype.includes.apply(e,t),jY=(e,...t)=>String.prototype.lastIndexOf.apply(e,t),Hb=(e,...t)=>String.prototype.indexOf.apply(e,t),o1e=(e,...t)=>String.prototype.replace.apply(e,t),sg=(e,...t)=>String.prototype.slice.apply(e,t),mA=(e,...t)=>String.prototype.startsWith.apply(e,t),a1e=Map,l1e=JSON.parse;function jb(e,t,r){return class extends r{constructor(...s){super(t(...s)),this.code=e,this.name=`${r.name} [${e}]`}}}var u1e=jb("ERR_PACKAGE_IMPORT_NOT_DEFINED",(e,t,r)=>`Package import specifier "${e}" is not defined${t?` in package ${t}package.json`:""} imported from ${r}`,TypeError),GY=jb("ERR_INVALID_MODULE_SPECIFIER",(e,t,r=void 0)=>`Invalid module "${e}" ${t}${r?` imported from ${r}`:""}`,TypeError),f1e=jb("ERR_INVALID_PACKAGE_TARGET",(e,t,r,s=!1,a=void 0)=>{let n=typeof r=="string"&&!s&&r.length&&!mA(r,"./");return t==="."?((0,c1e.default)(s===!1),`Invalid "exports" main target ${Ub(r)} defined in the package config ${e}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${s?"imports":"exports"}" target ${Ub(r)} defined for '${t}' in the package config ${e}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),Gb=jb("ERR_INVALID_PACKAGE_CONFIG",(e,t,r)=>`Invalid package config ${e}${t?` while importing ${t}`:""}${r?`. ${r}`:""}`,Error),A1e=jb("ERR_PACKAGE_PATH_NOT_EXPORTED",(e,t,r=void 0)=>t==="."?`No "exports" main defined in ${e}package.json${r?` imported from ${r}`:""}`:`Package subpath '${t}' is not defined by "exports" in ${e}package.json${r?` imported from ${r}`:""}`,Error);var KF=Ce("url");function p1e(e,t){let r=Object.create(null);for(let s=0;st):e+t}qb(r,e,s,c,a)}UY(d1e,sg(e,2))!==null&&qb(r,e,s,c,a);let p=new URL(e,s),h=p.pathname,E=new URL(".",s).pathname;if(mA(h,E)||qb(r,e,s,c,a),t==="")return p;if(UY(d1e,t)!==null){let C=n?o1e(r,"*",()=>t):r+t;Jht(C,s,c,a)}return n?new URL(_Y(g1e,p.href,()=>t)):new URL(t,p)}function Zht(e){let t=+e;return`${t}`!==e?!1:t>=0&&t<4294967295}function Ew(e,t,r,s,a,n,c,f){if(typeof t=="string")return zht(t,r,s,e,a,n,c,f);if(MY(t)){if(t.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:s===-1||e.length>t.length?-1:t.length>e.length?1:0}function Xht(e,t,r){if(typeof e=="string"||MY(e))return!0;if(typeof e!="object"||e===null)return!1;let s=_b(e),a=!1,n=0;for(let c=0;c=h.length&&ig(t,C)&&y1e(n,h)===1&&jY(h,"*")===E&&(n=h,c=sg(t,E,t.length-C.length))}}if(n){let p=r[n],h=Ew(e,p,c,n,s,!0,!1,a);return h==null&&qY(t,e,s),h}qY(t,e,s)}function I1e({name:e,base:t,conditions:r,readFileSyncFn:s}){if(e==="#"||mA(e,"#/")||ig(e,"/")){let c="is not a valid internal imports specifier name";throw new GY(e,c,(0,aa.fileURLToPath)(t))}let a,n=h1e(t,s);if(n.exists){a=(0,aa.pathToFileURL)(n.pjsonPath);let c=n.imports;if(c)if(Vm(c,e)&&!HY(e,"*")){let f=Ew(a,c[e],"",e,t,!1,!0,r);if(f!=null)return f}else{let f="",p,h=_b(c);for(let E=0;E=C.length&&ig(e,x)&&y1e(f,C)===1&&jY(C,"*")===S&&(f=C,p=sg(e,S,e.length-x.length))}}if(f){let E=c[f],C=Ew(a,E,p,f,t,!0,!0,r);if(C!=null)return C}}}Kht(e,a,t)}bt();var edt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function Es(e,t,r={},s){s??=edt.has(e)?"MODULE_NOT_FOUND":e;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(t),{code:{...a,value:s},pnpCode:{...a,value:e},data:{...a,value:r}})}function ff(e){return Ae.normalize(Ae.fromPortablePath(e))}var v1e=et(w1e());function S1e(e){return tdt(),WY[e]}var WY;function tdt(){WY||(WY={"--conditions":[],...B1e(rdt()),...B1e(process.execArgv)})}function B1e(e){return(0,v1e.default)({"--conditions":[String],"-C":"--conditions"},{argv:e,permissive:!0})}function rdt(){let e=[],t=ndt(process.env.NODE_OPTIONS||"",e);return e.length,t}function ndt(e,t){let r=[],s=!1,a=!0;for(let n=0;nparseInt(e,10)),b1e=ro>19||ro===19&&Sl>=2||ro===18&&Sl>=13,Qzt=ro===20&&Sl<6||ro===19&&Sl>=3,Tzt=ro>19||ro===19&&Sl>=6,Rzt=ro>=21||ro===20&&Sl>=10||ro===18&&Sl>=19,Fzt=ro>=21||ro===20&&Sl>=10||ro===18&&Sl>=20,Nzt=ro>=22,Ozt=ro===26&&Sl<1||ro===25&&Sl>=7||ro===24&&Sl===15||ro===22&&(Sl>22||Sl===22&&idt>=3);function VY(e){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send){let t=e.map(r=>Ae.fromPortablePath(Eo.resolveVirtual(r)));if(b1e)process.send({"watch:require":t});else for(let r of t)process.send({"watch:require":r})}}function JY(e,t){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,s=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,c=/\/$/,f=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(e.enableTopLevelFallback===!0&&h.push(p),t.compatibilityMode!==!1)for(let Fe of["react-scripts","gatsby"]){let Qe=e.packageRegistry.get(Fe);if(Qe)for(let Se of Qe.keys()){if(Se===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Fe,reference:Se})}}let{ignorePattern:C,packageRegistry:S,packageLocatorsByLocations:x}=e;function I(Fe,Qe){return{fn:Fe,args:Qe,error:null,result:null}}function R(Fe){let Qe=process.stderr?.hasColors?.()??process.stdout.isTTY,Se=(ct,Me)=>`\x1B[${ct}m${Me}\x1B[0m`,je=Fe.error;console.error(je?Se("31;1",`\u2716 ${Fe.error?.message.replace(/\n.*/s,"")}`):Se("33;1","\u203C Resolution")),Fe.args.length>0&&console.error();for(let ct of Fe.args)console.error(` ${Se("37;1","In \u2190")} ${(0,KY.inspect)(ct,{colors:Qe,compact:!0})}`);Fe.result&&(console.error(),console.error(` ${Se("37;1","Out \u2192")} ${(0,KY.inspect)(Fe.result,{colors:Qe,compact:!0})}`));let Te=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(Te.length>0){console.error();for(let ct of Te)console.error(` ${Se("38;5;244",ct)}`)}console.error()}function N(Fe,Qe){if(t.allowDebug===!1)return Qe;if(Number.isFinite(s)){if(s>=2)return(...Se)=>{let je=I(Fe,Se);try{return je.result=Qe(...Se)}catch(Te){throw je.error=Te}finally{R(je)}};if(s>=1)return(...Se)=>{try{return Qe(...Se)}catch(je){let Te=I(Fe,Se);throw Te.error=je,R(Te),je}}}return Qe}function U(Fe){let Qe=d(Fe);if(!Qe)throw Es("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Qe}function K(Fe){if(Fe.name===null)return!0;for(let Qe of e.dependencyTreeRoots)if(Qe.name===Fe.name&&Qe.reference===Fe.reference)return!0;return!1}let $=new Set(["node","require",...S1e("--conditions")]);function ie(Fe,Qe=$,Se){let je=me(Y.join(Fe,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(je===null)throw Es("INTERNAL",`The locator that owns the "${Fe}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:Te}=U(je),ct=Y.join(Te,yr.manifest);if(!t.fakeFs.existsSync(ct))return null;let Me=JSON.parse(t.fakeFs.readFileSync(ct,"utf8"));if(Me.exports==null)return null;let P=Y.contains(Te,Fe);if(P===null)throw Es("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");P!=="."&&!f.test(P)&&(P=`./${P}`);try{let w=E1e({packageJSONUrl:(0,Km.pathToFileURL)(Ae.fromPortablePath(ct)),packageSubpath:P,exports:Me.exports,base:Se?(0,Km.pathToFileURL)(Ae.fromPortablePath(Se)):null,conditions:Qe});return Ae.toPortablePath((0,Km.fileURLToPath)(w))}catch(w){throw Es("EXPORTS_RESOLUTION_FAILED",w.message,{unqualifiedPath:ff(Fe),locator:je,pkgJson:Me,subpath:ff(P),conditions:Qe},w.code)}}function fe(Fe,Qe,{extensions:Se}){let je;try{Qe.push(Fe),je=t.fakeFs.statSync(Fe)}catch{}if(je&&!je.isDirectory())return t.fakeFs.realpathSync(Fe);if(je&&je.isDirectory()){let Te;try{Te=JSON.parse(t.fakeFs.readFileSync(Y.join(Fe,yr.manifest),"utf8"))}catch{}let ct;if(Te&&Te.main&&(ct=Y.resolve(Fe,Te.main)),ct&&ct!==Fe){let Me=fe(ct,Qe,{extensions:Se});if(Me!==null)return Me}}for(let Te=0,ct=Se.length;Te{let P=JSON.stringify(Me.name);if(je.has(P))return;je.add(P);let w=ve(Me);for(let D of w)if(U(D).packagePeers.has(Fe))Te(D);else{let F=Se.get(D.name);typeof F>"u"&&Se.set(D.name,F=new Set),F.add(D.reference)}};Te(Qe);let ct=[];for(let Me of[...Se.keys()].sort())for(let P of[...Se.get(Me)].sort())ct.push({name:Me,reference:P});return ct}function me(Fe,{resolveIgnored:Qe=!1,includeDiscardFromLookup:Se=!1}={}){if(pe(Fe)&&!Qe)return null;let je=Y.relative(e.basePath,Fe);je.match(n)||(je=`./${je}`),je.endsWith("/")||(je=`${je}/`);do{let Te=x.get(je);if(typeof Te>"u"||Te.discardFromLookup&&!Se){je=je.substring(0,je.lastIndexOf("/",je.length-2)+1);continue}return Te.locator}while(je!=="");return null}function ce(Fe){try{return t.fakeFs.readFileSync(Ae.toPortablePath(Fe),"utf8")}catch(Qe){if(Qe.code==="ENOENT")return;throw Qe}}function X(Fe,Qe,{considerBuiltins:Se=!0}={}){if(Fe.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Fe==="pnpapi")return Ae.toPortablePath(t.pnpapiResolution);if(Se&&(0,oh.isBuiltin)(Fe))return null;let je=ff(Fe),Te=Qe&&ff(Qe);if(Qe&&pe(Qe)&&(!Y.isAbsolute(Fe)||me(Fe)===null)){let P=ge(Fe,Qe);if(P===!1)throw Es("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: "${je}" +Required by: ${Te} +`,{request:je,issuer:Te});return Ae.toPortablePath(P)}let ct,Me=Fe.match(a);if(Me){if(!Qe)throw Es("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:je,issuer:Te});let[,P,w]=Me,D=me(Qe);if(!D){let Ne=ge(Fe,Qe);if(Ne===!1)throw Es("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: "${je}" +Required by: ${Te} +`,{request:je,issuer:Te});return Ae.toPortablePath(Ne)}let F=U(D).packageDependencies.get(P),z=null;if(F==null&&D.name!==null){let Ne=e.fallbackExclusionList.get(D.name);if(!Ne||!Ne.has(D.reference)){for(let Ct=0,Yt=h.length;CtK(ut))?Z=Es("MISSING_PEER_DEPENDENCY",`${D.name} tried to access ${P} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${D.name}@${D.reference} (via ${Te}) +${Ne.map(ut=>`Ancestor breaking the chain: ${ut.name}@${ut.reference} +`).join("")} +`,{request:je,issuer:Te,issuerLocator:Object.assign({},D),dependencyName:P,brokenAncestors:Ne}):Z=Es("MISSING_PEER_DEPENDENCY",`${D.name} tried to access ${P} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${D.name}@${D.reference} (via ${Te}) + +${Ne.map(ut=>`Ancestor breaking the chain: ${ut.name}@${ut.reference} +`).join("")} +`,{request:je,issuer:Te,issuerLocator:Object.assign({},D),dependencyName:P,brokenAncestors:Ne})}else F===void 0&&(!Se&&(0,oh.isBuiltin)(Fe)?K(D)?Z=Es("UNDECLARED_DEPENDENCY",`Your application tried to access ${P}. 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 ${P} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${Te} +`,{request:je,issuer:Te,dependencyName:P}):Z=Es("UNDECLARED_DEPENDENCY",`${D.name} tried to access ${P}. 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 ${P} isn't otherwise declared in ${D.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${Te} +`,{request:je,issuer:Te,issuerLocator:Object.assign({},D),dependencyName:P}):K(D)?Z=Es("UNDECLARED_DEPENDENCY",`Your application tried to access ${P}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${Te} +`,{request:je,issuer:Te,dependencyName:P}):Z=Es("UNDECLARED_DEPENDENCY",`${D.name} tried to access ${P}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${P}${P!==je?` (via "${je}")`:""} +Required by: ${D.name}@${D.reference} (via ${Te}) +`,{request:je,issuer:Te,issuerLocator:Object.assign({},D),dependencyName:P}));if(F==null){if(z===null||Z===null)throw Z||new Error("Assertion failed: Expected an error to have been set");F=z;let Ne=Z.message.replace(/\n.*/g,"");Z.message=Ne,!E.has(Ne)&&s!==0&&(E.add(Ne),process.emitWarning(Z))}let ee=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:P,reference:F},se=U(ee);if(!se.packageLocation)throw Es("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: ${ee.name}@${ee.reference}${ee.name!==je?` (via "${je}")`:""} +Required by: ${D.name}@${D.reference} (via ${Te}) +`,{request:je,issuer:Te,dependencyLocator:Object.assign({},ee)});let xe=se.packageLocation;w?ct=Y.join(xe,w):ct=xe}else if(Y.isAbsolute(Fe))ct=Y.normalize(Fe);else{if(!Qe)throw Es("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:je,issuer:Te});let P=Y.resolve(Qe);Qe.match(c)?ct=Y.normalize(Y.join(P,Fe)):ct=Y.normalize(Y.join(Y.dirname(P),Fe))}return Y.normalize(ct)}function be(Fe,Qe,Se=$,je){if(n.test(Fe))return Qe;let Te=ie(Qe,Se,je);return Te?Y.normalize(Te):Qe}function ke(Fe,{extensions:Qe=Object.keys(oh.Module._extensions)}={}){let Se=[],je=fe(Fe,Se,{extensions:Qe});if(je)return VY([je]),Y.normalize(je);{VY(Se);let Te=ff(Fe),ct=me(Fe);if(ct){let{packageLocation:Me}=U(ct),P=!0;try{t.fakeFs.accessSync(Me)}catch(w){if(w?.code==="ENOENT")P=!1;else{let D=(w?.message??w??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw Es("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${D}). + +Missing package: ${ct.name}@${ct.reference} +Expected package location: ${ff(Me)} +`,{unqualifiedPath:Te,extensions:Qe})}}if(!P){let w=Me.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 Es("QUALIFIED_PATH_RESOLUTION_FAILED",`${w} + +Missing package: ${ct.name}@${ct.reference} +Expected package location: ${ff(Me)} +`,{unqualifiedPath:Te,extensions:Qe})}}throw Es("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${Te} +${Se.map(Me=>`Not found: ${ff(Me)} +`).join("")}`,{unqualifiedPath:Te,extensions:Qe})}}function it(Fe,Qe,Se){if(!Qe)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let je=I1e({name:Fe,base:(0,Km.pathToFileURL)(Ae.fromPortablePath(Qe)),conditions:Se.conditions??$,readFileSyncFn:ce});if(je instanceof URL)return ke(Ae.toPortablePath((0,Km.fileURLToPath)(je)),{extensions:Se.extensions});if(je.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return _(je,Qe,Se)}function _(Fe,Qe,Se={}){try{if(Fe.startsWith("#"))return it(Fe,Qe,Se);let{considerBuiltins:je,extensions:Te,conditions:ct}=Se,Me=X(Fe,Qe,{considerBuiltins:je});if(Fe==="pnpapi")return Me;if(Me===null)return null;let P=()=>Qe!==null?pe(Qe):!1,w=(!je||!(0,oh.isBuiltin)(Fe))&&!P()?be(Fe,Me,ct,Qe):Me;return ke(w,{extensions:Te})}catch(je){throw Object.hasOwn(je,"pnpCode")&&Object.assign(je.data,{request:ff(Fe),issuer:Qe&&ff(Qe)}),je}}function tt(Fe){let Qe=Y.normalize(Fe),Se=Eo.resolveVirtual(Qe);return Se!==Qe?Se:null}return{VERSIONS:De,topLevel:ye,getLocator:(Fe,Qe)=>Array.isArray(Qe)?{name:Qe[0],reference:Qe[1]}:{name:Fe,reference:Qe},getDependencyTreeRoots:()=>[...e.dependencyTreeRoots],getAllLocators(){let Fe=[];for(let[Qe,Se]of S)for(let je of Se.keys())Qe!==null&&je!==null&&Fe.push({name:Qe,reference:je});return Fe},getPackageInformation:Fe=>{let Qe=d(Fe);if(Qe===null)return null;let Se=Ae.fromPortablePath(Qe.packageLocation);return{...Qe,packageLocation:Se}},findPackageLocator:Fe=>me(Ae.toPortablePath(Fe)),resolveToUnqualified:N("resolveToUnqualified",(Fe,Qe,Se)=>{let je=Qe!==null?Ae.toPortablePath(Qe):null,Te=X(Ae.toPortablePath(Fe),je,Se);return Te===null?null:Ae.fromPortablePath(Te)}),resolveUnqualified:N("resolveUnqualified",(Fe,Qe)=>Ae.fromPortablePath(ke(Ae.toPortablePath(Fe),Qe))),resolveRequest:N("resolveRequest",(Fe,Qe,Se)=>{let je=Qe!==null?Ae.toPortablePath(Qe):null,Te=_(Ae.toPortablePath(Fe),je,Se);return Te===null?null:Ae.fromPortablePath(Te)}),resolveVirtual:N("resolveVirtual",Fe=>{let Qe=tt(Ae.toPortablePath(Fe));return Qe!==null?Ae.fromPortablePath(Qe):null})}}bt();var D1e=(e,t,r)=>{let s=Mb(e),a=LY(s,{basePath:t}),n=Ae.join(t,yr.pnpCjs);return JY(a,{fakeFs:r,pnpapiResolution:n})};var ZY=et(x1e());jt();var yA={};Vt(yA,{checkManifestCompatibility:()=>k1e,extractBuildRequest:()=>JF,getExtractHint:()=>XY,hasBindingGyp:()=>$Y});Ge();bt();function k1e(e){return H.isPackageCompatible(e,Ui.getArchitectureSet())}function JF(e,t,r,{configuration:s}){let a=[];for(let n of["preinstall","install","postinstall"])t.manifest.scripts.has(n)&&a.push({type:0,script:n});return!t.manifest.scripts.has("install")&&t.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:e.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${H.prettyLocator(s,e)} 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?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${H.prettyLocator(s,e)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!s.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${H.prettyLocator(s,e)} lists build scripts, but all build scripts have been disabled.`)}:k1e(e)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${H.prettyLocator(s,e)} The ${Ui.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var odt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function XY(e){return e.packageFs.getExtractHint({relevantExtensions:odt})}function $Y(e){let t=Y.join(e.prefixPath,"binding.gyp");return e.packageFs.existsSync(t)}var Vb={};Vt(Vb,{getUnpluggedPath:()=>Wb});Ge();bt();function Wb(e,{configuration:t}){return Y.resolve(t.get("pnpUnpluggedFolder"),H.slugifyLocator(e))}var adt=new Set([H.makeIdent(null,"open").identHash,H.makeIdent(null,"opn").identHash]),og=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(t,r){return this.isEnabled(r)}async findPackageLocation(t,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let s=ag(r.project).cjs;if(!ae.existsSync(s))throw new ot(`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 a=qe.getFactoryWithDefault(this.pnpCache,s,()=>qe.dynamicRequire(s,{cachingStrategy:qe.CachingStrategy.FsTime})),n={name:H.stringifyIdent(t),reference:t.reference},c=a.getPackageInformation(n);if(!c)throw new ot(`Couldn't find ${H.prettyLocator(r.project.configuration,t)} in the currently installed PnP map - running an install might help`);return Ae.toPortablePath(c.packageLocation)}async findPackageLocator(t,r){if(!this.isEnabled(r))return null;let s=ag(r.project).cjs;if(!ae.existsSync(s))return null;let n=qe.getFactoryWithDefault(this.pnpCache,s,()=>qe.dynamicRequire(s,{cachingStrategy:qe.CachingStrategy.FsTime})).findPackageLocator(Ae.fromPortablePath(t));return n?H.makeLocator(H.parseIdent(n.name),n.reference):null}makeInstaller(t){return new Jm(t)}isEnabled(t){return!(t.project.configuration.get("nodeLinker")!=="pnp"||t.project.configuration.get("pnpMode")!==this.mode)}},Jm=class{constructor(t){this.opts=t;this.mode="strict";this.asyncActions=new qe.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=t}attachCustomData(t){this.customData=t}async installPackage(t,r,s){let a=H.stringifyIdent(t),n=t.reference,c=!!this.opts.project.tryWorkspaceByLocator(t),f=H.isVirtualLocator(t),p=t.peerDependencies.size>0&&!f,h=!p&&!c,E=!p&&t.linkType!=="SOFT",C,S;if(h||E){let $=f?H.devirtualizeLocator(t):t;C=this.customData.store.get($.locatorHash),typeof C>"u"&&(C=await ldt(r),t.linkType==="HARD"&&this.customData.store.set($.locatorHash,C)),C.manifest.type==="module"&&(this.isESMLoaderRequired=!0),S=this.opts.project.getDependencyMeta($,t.version)}let x=h?JF(t,C,S,{configuration:this.opts.project.configuration}):null,I=E?await this.unplugPackageIfNeeded(t,C,r,S,s):r.packageFs;if(Y.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let R=Y.resolve(I.getRealPath(),r.prefixPath),N=eW(this.opts.project.cwd,R),U=new Map,K=new Set;if(f){for(let $ of t.peerDependencies.values())U.set(H.stringifyIdent($),null),K.add(H.stringifyIdent($));if(!c){let $=H.devirtualizeLocator(t);this.virtualTemplates.set($.locatorHash,{location:eW(this.opts.project.cwd,Eo.resolveVirtual(R)),locator:$})}}return qe.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:K,linkType:t.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:R,buildRequest:x}}async attachInternalDependencies(t,r){let s=this.getPackageInformation(t);for(let[a,n]of r){let c=H.areIdentsEqual(a,n)?n.reference:[H.stringifyIdent(n),n.reference];s.packageDependencies.set(H.stringifyIdent(a),c)}}async attachExternalDependents(t,r){for(let s of r)this.getDiskInformation(s).packageDependencies.set(H.stringifyIdent(t),t.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let t=ag(this.opts.project);if(this.isEsmEnabled()||await ae.removePromise(t.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await ae.removePromise(t.cjs),await ae.removePromise(t.data),await ae.removePromise(t.esmLoader),await ae.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:C,location:S}of this.virtualTemplates.values())qe.getMapWithDefault(this.packageRegistry,H.stringifyIdent(C)).set(C.reference,{packageLocation:S,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});let r=this.opts.project.configuration.get("pnpFallbackMode"),s=this.opts.project.workspaces.map(({anchoredLocator:C})=>({name:H.stringifyIdent(C),reference:C.reference})),a=r!=="none",n=[],c=new Map,f=qe.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang"),E=this.opts.project.configuration.get("pnpZipBackend");if(r==="dependencies-only")for(let C of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(C)&&n.push({name:H.stringifyIdent(C),reference:C.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:s,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:c,ignorePattern:f,pnpZipBackend:E,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(t){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let t of this.opts.project.workspaces)if(t.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(t){let r=ag(this.opts.project),s=await this.locateNodeModules(t.ignorePattern);if(s.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of s)await ae.removePromise(n)}if(await this.transformPnpSettings(t),this.opts.project.configuration.get("pnpEnableInlining")){let n=i1e(t);await ae.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ae.removePromise(r.data)}else{let{dataFile:n,loaderFile:c}=s1e(t);await ae.changeFilePromise(r.cjs,c,{automaticNewlines:!0,mode:493}),await ae.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(92,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await ae.changeFilePromise(r.esmLoader,(0,ZY.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await ae.removePromise(a);else for(let n of await ae.readdirPromise(a)){let c=Y.resolve(a,n);this.unpluggedPaths.has(c)||await ae.removePromise(c)}}async locateNodeModules(t){let r=[],s=t?new RegExp(t):null;for(let a of this.opts.project.workspaces){let n=Y.join(a.cwd,"node_modules");if(s&&s.test(Y.relative(this.opts.project.cwd,a.cwd))||!ae.existsSync(n))continue;let c=await ae.readdirPromise(n,{withFileTypes:!0}),f=c.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(f.length===c.length)r.push(n);else for(let p of f)r.push(Y.join(n,p.name))}return r}async unplugPackageIfNeeded(t,r,s,a,n){return this.shouldBeUnplugged(t,r,a)?this.unplugPackage(t,s,n):s.packageFs}shouldBeUnplugged(t,r,s){return typeof s.unplugged<"u"?s.unplugged:adt.has(t.identHash)||t.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(JF(t,r,s,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(t,r,s){let a=Wb(t,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(t.locatorHash)?new Gf(a,{baseFs:r.packageFs,pathUtils:Y}):(this.unpluggedPaths.add(a),s.holdFetchResult(this.asyncActions.set(t.locatorHash,async()=>{let n=Y.join(a,r.prefixPath,".ready");await ae.existsPromise(n)||(this.opts.project.storedBuildState.delete(t.locatorHash),await ae.mkdirPromise(a,{recursive:!0}),await ae.copyPromise(a,wt.dot,{baseFs:r.packageFs,overwrite:!1}),await ae.writeFilePromise(n,""))})),new Pn(a))}getPackageInformation(t){let r=H.stringifyIdent(t),s=t.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${H.prettyIdent(this.opts.project.configuration,t)})`);let n=a.get(s);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${H.prettyLocator(this.opts.project.configuration,t)})`);return n}getDiskInformation(t){let r=qe.getMapWithDefault(this.packageRegistry,"@@disk"),s=eW(this.opts.project.cwd,t);return qe.getFactoryWithDefault(r,s,()=>({packageLocation:s,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function eW(e,t){let r=Y.relative(e,t);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function ldt(e){let t=await _t.tryFind(e.prefixPath,{baseFs:e.packageFs})??new _t,r=new Set(["preinstall","install","postinstall"]);for(let s of t.scripts.keys())r.has(s)||t.scripts.delete(s);return{manifest:{scripts:t.scripts,preferUnplugged:t.preferUnplugged,type:t.type},misc:{extractHint:XY(e),hasBindingGyp:$Y(e)}}}Ge();Ge();jt();var Q1e=et(Zo());var Iw=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=he.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=he.Rest()}static{this.paths=[["unplug"]]}static{this.usage=st.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 '*'"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new ot("This command can only be used if the `nodeLinker` option is set to `pnp`");await s.restoreInstallState();let c=new Set(this.patterns),f=this.patterns.map(x=>{let I=H.parseDescriptor(x),R=I.range!=="unknown"?I:H.makeDescriptor(I,"*");if(!kr.validRange(R.range))throw new ot(`The range of the descriptor patterns must be a valid semver range (${H.prettyDescriptor(r,R)})`);return N=>{let U=H.stringifyIdent(N);return!Q1e.default.isMatch(U,H.stringifyIdent(R))||N.version&&!kr.satisfiesWithPrereleases(N.version,R.range)?!1:(c.delete(x),!0)}}),p=()=>{let x=[];for(let I of s.storedPackages.values())!s.tryWorkspaceByLocator(I)&&!H.isVirtualLocator(I)&&f.some(R=>R(I))&&x.push(I);return x},h=x=>{let I=new Set,R=[],N=(U,K)=>{if(I.has(U.locatorHash))return;let $=!!s.tryWorkspaceByLocator(U);if(!(K>0&&!this.recursive&&$)&&(I.add(U.locatorHash),!s.tryWorkspaceByLocator(U)&&f.some(ie=>ie(U))&&R.push(U),!(K>0&&!this.recursive)))for(let ie of U.dependencies.values()){let fe=s.storedResolutions.get(ie.descriptorHash);if(!fe)throw new Error("Assertion failed: The resolution should have been registered");let le=s.storedPackages.get(fe);if(!le)throw new Error("Assertion failed: The package should have been registered");N(le,K+1)}};for(let U of x)N(U.anchoredPackage,0);return R},E,C;if(this.all&&this.recursive?(E=p(),C="the project"):this.all?(E=h(s.workspaces),C="any workspace"):(E=h([a]),C="this workspace"),c.size>1)throw new ot(`Patterns ${ue.prettyList(r,c,ue.Type.CODE)} don't match any packages referenced by ${C}`);if(c.size>0)throw new ot(`Pattern ${ue.prettyList(r,c,ue.Type.CODE)} doesn't match any packages referenced by ${C}`);E=qe.sortMap(E,x=>H.stringifyLocator(x));let S=await Ft.start({configuration:r,stdout:this.context.stdout,json:this.json},async x=>{for(let I of E){let R=I.version??"unknown",N=s.topLevelWorkspace.manifest.ensureDependencyMeta(H.makeDescriptor(I,R));N.unplugged=!0,x.reportInfo(0,`Will unpack ${H.prettyLocator(r,I)} to ${ue.pretty(r,Wb(I,{configuration:r}),ue.Type.PATH)}`),x.reportJson({locator:H.stringifyLocator(I),version:R})}await s.topLevelWorkspace.persistManifest(),this.json||x.reportSeparator()});return S.hasErrors()?S.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var zF=(r=>(r.STANDARD="standard",r.LOOSE="loose",r))(zF||{}),ag=e=>({cjs:Y.join(e.cwd,yr.pnpCjs),data:Y.join(e.cwd,yr.pnpData),esmLoader:Y.join(e.cwd,yr.pnpEsmLoader)}),R1e=e=>Y.join(e.cwd,yr.nodeModules,".package-map.json"),tW=e=>/\s/.test(e)?JSON.stringify(e):e;async function cdt(e,t,r){let s=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=/\s*--experimental-package-map(?:=|\s+)(?:"[^"]*"|'[^']*'|\S+)\s*/g,c=(t.NODE_OPTIONS??"").replace(s," ").replace(a," ").replace(n," ").trim(),f=e.configuration.get("nodeLinker"),p=[],h=R1e(e);e.configuration.get("nodeExperimentalPackageMap")&&f!=="pnp"&&ae.existsSync(h)&&p.push(`--experimental-package-map=${tW(Ae.fromPortablePath(h))}`);let E=()=>{let x=[...p,c].filter(Boolean).join(" ");t.NODE_OPTIONS=x||void 0};if(f!=="pnp"){E();return}let C=ag(e),S=`--require ${tW(Ae.fromPortablePath(C.cjs))}`;ae.existsSync(C.esmLoader)&&(S=`${S} --experimental-loader ${(0,T1e.pathToFileURL)(Ae.fromPortablePath(C.esmLoader)).href}`),ae.existsSync(C.cjs)&&(p.unshift(S),E())}async function udt(e,t){let r=ag(e);t(r.cjs),t(r.data),t(r.esmLoader),t(e.configuration.get("pnpUnpluggedFolder"))}var fdt={hooks:{populateYarnPaths:udt,setupScriptEnvironment:cdt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},nodeExperimentalPackageMap:{description:"If true, Yarn will inject the experimental package map into Node.js processes when using the node-modules or pnpm linkers.",type:"BOOLEAN",default:!1},nodePackageMapType:{description:"If 'standard', package maps will reflect the dependency graph. If 'loose', they will reflect the hoisted node_modules layout.",type:"STRING",values:["standard","loose"],default:"standard"},minizip:{description:"Whether Yarn should use minizip to extract archives",type:"BOOLEAN",default:!1},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpZipBackend:{description:"Whether to use the experimental js implementation for the ZipFS",type:"STRING",values:["libzip","js"],default:"libzip"},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:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[og],commands:[Iw]},Adt=fdt;var H1e=et(M1e());jt();var cW=et(Ce("crypto")),j1e=et(Ce("fs")),G1e=1,wi="node_modules",ZF=".bin",uW=".yarn-state.yml",xdt=".package-map.json",kdt=1e3,XF=new Map;function aW(e,{unrollAliases:t}){return`${e.cwd}\0${t?"unroll":"plain"}`}function Qdt(e){XF.delete(aW(e,{unrollAliases:!0})),XF.delete(aW(e,{unrollAliases:!1}))}var fW=(s=>(s.CLASSIC="classic",s.HARDLINKS_LOCAL="hardlinks-local",s.HARDLINKS_GLOBAL="hardlinks-global",s))(fW||{}),Kb=class{getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(t,r){return this.isEnabled(r)}async findPackageLocation(t,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let s=r.project.tryWorkspaceByLocator(t);if(s)return s.cwd;let a=await this.findInstallState(r.project,{unrollAliases:!0});if(a===null)throw new ot("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(H.stringifyLocator(t));if(!n){let p=new ot(`Couldn't find ${H.prettyLocator(r.project.configuration,t)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let c=n.locations.sort((p,h)=>p.split(Y.sep).length-h.split(Y.sep).length),f=Y.join(r.project.configuration.startingCwd,wi);return c.find(p=>Y.contains(f,p))||n.locations[0]}async findPackageLocator(t,r){if(!this.isEnabled(r))return null;let s=await this.findInstallState(r.project,{unrollAliases:!0});if(s===null)return null;let{locationRoot:a,segments:n}=$F(Y.resolve(t),{skipPrefix:r.project.cwd}),c=s.locationTree.get(a);if(!c)return null;let f=c.locator;for(let p of n){if(c=c.children.get(p),!c)break;f=c.locator||f}return H.parseLocator(f)}makeInstaller(t){return new lW(t)}async findInstallState(t,{unrollAliases:r}){let s=aW(t,{unrollAliases:r}),a=await Fdt(t),n=XF.get(s);if(n?.statKey===a)return await n.promise;let c=q1e(t,{unrollAliases:r});return XF.set(s,{statKey:a,promise:c}),await c}isEnabled(t){return t.project.configuration.get("nodeLinker")==="node-modules"}},lW=class{constructor(t){this.opts=t;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(t){this.customData=t}async installPackage(t,r){let s=Y.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(t.locatorHash);if(typeof a>"u"&&(a=await Tdt(t,r),t.linkType==="HARD"&&this.customData.store.set(t.locatorHash,a)),!H.isPackageCompatible(t,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,c=new Set;n.has(H.stringifyIdent(t))||n.set(H.stringifyIdent(t),t.reference);let f=t;if(H.isVirtualLocator(t)){f=H.devirtualizeLocator(t);for(let E of t.peerDependencies.values())n.set(H.stringifyIdent(E),null),c.add(H.stringifyIdent(E))}let p={packageLocation:`${Ae.fromPortablePath(s)}/`,packageDependencies:n,packagePeers:c,linkType:t.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(t.locatorHash,{pkg:t,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(t,t.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(f.locatorHash,h),{packageLocation:s,buildRequest:null}}async attachInternalDependencies(t,r){let s=this.localStore.get(t.locatorHash);if(typeof s>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let c=H.areIdentsEqual(a,n)?n.reference:[H.stringifyIdent(n),n.reference];s.pnpNode.packageDependencies.set(H.stringifyIdent(a),c)}}async attachExternalDependents(t,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 t=new Eo({baseFs:new nA({maxOpenFiles:80,readOnlyArchives:!0})}),r=await q1e(this.opts.project),s=this.opts.project.configuration.get("nmMode");(r===null||s!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:s,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(x=>{let I=this.opts.project.configuration.get("nmHoistingLimits");try{I=qe.validateEnum(Nb,x.manifest.installConfig?.hoistingLimits??I)}catch{let R=H.prettyWorkspace(this.opts.project.configuration,x);this.opts.report.reportWarning(57,`${R}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Nb).join(", ")}, using default: "${I}"`)}return[x.relativeCwd,I]})),n=new Map(this.opts.project.workspaces.map(x=>{let I=this.opts.project.configuration.get("nmSelfReferences");return I=x.manifest.installConfig?.selfReferences??I,[x.relativeCwd,I]})),c={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(x,I)=>Array.isArray(I)?{name:I[0],reference:I[1]}:{name:x,reference:I},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(x=>{let I=x.anchoredLocator;return{name:H.stringifyIdent(I),reference:I.reference}}),getPackageInformation:x=>{let I=x.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:H.makeLocator(H.parseIdent(x.name),x.reference),R=this.localStore.get(I.locatorHash);if(typeof R>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return R.pnpNode},findPackageLocator:x=>{let I=this.opts.project.tryWorkspaceByCwd(Ae.toPortablePath(x));if(I!==null){let R=I.anchoredLocator;return{name:H.stringifyIdent(R),reference:R.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:x=>Ae.fromPortablePath(Eo.resolveVirtual(Ae.toPortablePath(x)))},{tree:f,errors:p,preserveSymlinksRequired:h}=Ob(c,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!f){for(let{messageName:x,text:I}of p)this.opts.report.reportError(x,I);return}let E=TY(f),C=NY(f,{basePath:Y.join(this.opts.project.cwd,wi),pnp:this.opts.project.configuration.get("nodePackageMapType")==="standard"?c:null});await _dt(r,E,C,{baseFs:t,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async x=>{let I=H.parseLocator(x),R=this.localStore.get(I.locatorHash);if(typeof R>"u")throw new Error("Assertion failed: Expected the slot to exist");return R.customPackageData.manifest}});let S=[];for(let[x,I]of E.entries()){if(V1e(x))continue;let R=H.parseLocator(x),N=this.localStore.get(R.locatorHash);if(typeof N>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(N.pkg))continue;let U=yA.extractBuildRequest(N.pkg,N.customPackageData,N.dependencyMeta,{configuration:this.opts.project.configuration});U&&S.push({buildLocations:I.locations,locator:R,buildRequest:U})}return h&&this.opts.report.reportWarning(72,`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:S}}};async function Tdt(e,t){let r=await _t.tryFind(t.prefixPath,{baseFs:t.packageFs})??new _t,s=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())s.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:yA.hasBindingGyp(t)}}}async function Rdt(e,t,r,s,{installChangedByUser:a}){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: ${G1e} +`,n+=` nmMode: ${s.value} +`;let c=Array.from(t.keys()).sort(),f=H.stringifyLocator(e.topLevelWorkspace.anchoredLocator);for(let E of c){let C=t.get(E);n+=` +`,n+=`${JSON.stringify(E)}: +`,n+=` locations: +`;for(let S of C.locations){let x=Y.contains(e.cwd,S);if(x===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=` - ${JSON.stringify(x)} +`}if(C.aliases.length>0){n+=` aliases: +`;for(let S of C.aliases)n+=` - ${JSON.stringify(S)} +`}if(E===f&&r.size>0){n+=` bin: +`;for(let[S,x]of r){let I=Y.contains(e.cwd,S);if(I===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=` ${JSON.stringify(I)}: +`;for(let[R,N]of x){let U=Y.relative(Y.join(S,wi),N);n+=` ${JSON.stringify(R)}: ${JSON.stringify(U)} +`}}}}let p=e.cwd,h=Y.join(p,wi,uW);try{a&&await ae.removePromise(h),await ae.changeFilePromise(h,n,{automaticNewlines:!0})}finally{Qdt(e)}}async function Fdt(e){let t=e.cwd,r=Y.join(t,wi,uW);try{let s=await ae.statPromise(r);return`${s.mtimeMs}:${s.size}`}catch{return null}}async function q1e(e,{unrollAliases:t=!1}={}){let r=e.cwd,s=Y.join(r,wi,uW),a;try{a=await ae.statPromise(s)}catch{}if(!a)return null;let n=us(await ae.readFilePromise(s,"utf8"));if(n.__metadata.version>G1e)return null;let c=n.__metadata.nmMode||"classic",f=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let C=E.locations.map(x=>Y.join(r,x)),S=E.bin;if(S)for(let[x,I]of Object.entries(S)){let R=Y.join(r,Ae.toPortablePath(x)),N=qe.getMapWithDefault(p,R);for(let[U,K]of Object.entries(I))N.set(U,Ae.toPortablePath([R,wi,K].join(Y.sep)))}if(f.set(h,{target:wt.dot,linkType:"HARD",locations:C,aliases:E.aliases||[]}),t&&E.aliases)for(let x of E.aliases){let{scope:I,name:R}=H.parseLocator(h),N=H.makeLocator(H.makeIdent(I,R),x),U=H.stringifyLocator(N);f.set(U,{target:wt.dot,linkType:"HARD",locations:C,aliases:[]})}}return{locatorMap:f,binSymlinks:p,locationTree:Y1e(f,{skipPrefix:e.cwd}),nmMode:c,mtimeMs:a.mtimeMs}}var ww=async(e,t)=>{if(e.split(Y.sep).indexOf(wi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${e}`);try{let r;if(!t.innerLoop&&(r=await ae.lstatPromise(e),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!t.isWorkspaceDir)){await ae.unlinkPromise(e);return}let s=await ae.readdirPromise(e,{withFileTypes:!0});for(let n of s){let c=Y.join(e,n.name);n.isDirectory()?(n.name!==wi||t&&t.innerLoop)&&await ww(c,{innerLoop:!0,contentsOnly:!1}):await ae.unlinkPromise(c)}let a=!t.innerLoop&&t.isWorkspaceDir&&r?.isSymbolicLink();!t.contentsOnly&&!a&&await ae.rmdirPromise(e)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},U1e=4,$F=(e,{skipPrefix:t})=>{let r=Y.contains(t,e);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${e} which is outside project root: ${t}`);let s=r.split(Y.sep).filter(p=>p!==""),a=s.indexOf(wi),n=s.slice(0,a).join(Y.sep),c=Y.join(t,n),f=s.slice(a);return{locationRoot:c,segments:f}},Y1e=(e,{skipPrefix:t})=>{let r=new Map;if(e===null)return r;let s=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of e.entries()){if(n.linkType==="SOFT"&&Y.contains(t,n.target)!==null){let f=qe.getFactoryWithDefault(r,n.target,s);f.locator=a,f.linkType=n.linkType}for(let c of n.locations){let{locationRoot:f,segments:p}=$F(c,{skipPrefix:t}),h=qe.getFactoryWithDefault(r,f,s);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let s;try{s=await ae.lstatPromise(e)}catch{}if(!s||s.isDirectory()){await ae.symlinkPromise(e,t,"junction");return}}await ae.symlinkPromise(Y.relative(Y.dirname(t),e),t)};async function W1e(e,t,r){let s=Y.join(e,`${cW.default.randomBytes(16).toString("hex")}.tmp`);try{await ae.writeFilePromise(s,r);try{await ae.linkPromise(s,t)}catch{}}finally{await ae.unlinkPromise(s)}}async function Ndt({srcPath:e,dstPath:t,entry:r,globalHardlinksStore:s,baseFs:a,nmMode:n}){if(r.kind==="file"){if(n.value==="hardlinks-global"&&s&&r.digest){let f=Y.join(s,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ae.statPromise(f);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs{await ae.mkdirPromise(e,{recursive:!0});let f=async(E=wt.dot)=>{let C=Y.join(t,E),S=await r.readdirPromise(C,{withFileTypes:!0}),x=new Map;for(let I of S){let R=Y.join(E,I.name),N,U=Y.join(C,I.name);if(I.isFile()){if(N={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let K=await Mn.checksumFile(U,{baseFs:r,algorithm:"sha1"});N.digest=K}}else if(I.isDirectory())N={kind:"directory"};else if(I.isSymbolicLink())N={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(x.set(R,N),I.isDirectory()&&R!==wi){let K=await f(R);for(let[$,ie]of K)x.set($,ie)}}return x},p;if(a.value==="hardlinks-global"&&s&&c){let E=Y.join(s,c.substring(0,2),`${c.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ae.readFilePromise(E,"utf8"))))}catch{p=await f()}}else p=await f();let h=!1;for(let[E,C]of p){let S=Y.join(t,E),x=Y.join(e,E);if(C.kind==="directory")await ae.mkdirPromise(x,{recursive:!0});else if(C.kind==="file"){let I=C.mtimeMs;await Ndt({srcPath:S,dstPath:x,entry:C,nmMode:a,baseFs:r,globalHardlinksStore:s}),C.mtimeMs!==I&&(h=!0)}else C.kind==="symlink"&&await AW(Y.resolve(Y.dirname(x),C.symlinkTo),x,n)}if(a.value==="hardlinks-global"&&s&&h&&c){let E=Y.join(s,c.substring(0,2),`${c.substring(2)}.json`);await ae.removePromise(E),await W1e(s,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Ldt(e,t,r,s){let a=new Map,n=new Map,c=new Map,f=!1,p=(h,E,C,S,x)=>{let I=!0,R=Y.join(h,E),N=new Set;if(E===wi||E.startsWith("@")){let K;try{K=ae.statSync(R)}catch{}I=!!K,K?K.mtimeMs>r?(f=!0,N=new Set(ae.readdirSync(R))):N=new Set(C.children.get(E).children.keys()):f=!0;let $=t.get(h);if($){let ie=Y.join(h,wi,ZF),fe;try{fe=ae.statSync(ie)}catch{}if(!fe)f=!0;else if(fe.mtimeMs>r){f=!0;let le=new Set(ae.readdirSync(ie)),ge=new Map;n.set(h,ge);for(let[pe,De]of $)le.has(pe)&&ge.set(pe,De)}else n.set(h,$)}}else I=x.has(E);let U=C.children.get(E);if(I){let{linkType:K,locator:$}=U,ie={children:new Map,linkType:K,locator:$};if(S.children.set(E,ie),$){let fe=qe.getSetWithDefault(c,$);fe.add(R),c.set($,fe)}for(let fe of U.children.keys())p(R,fe,U,ie,N)}else U.locator&&s.storedBuildState.delete(H.parseLocator(U.locator).locatorHash)};for(let[h,E]of e){let{linkType:C,locator:S}=E,x={children:new Map,linkType:C,locator:S};if(a.set(h,x),S){let I=qe.getSetWithDefault(c,E.locator);I.add(h),c.set(E.locator,I)}E.children.has(wi)&&p(h,wi,E,x,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:c,installChangedByUser:f}}function V1e(e){let t=H.parseDescriptor(e);return H.isVirtualDescriptor(t)&&(t=H.devirtualizeDescriptor(t)),t.range.startsWith("link:")}async function Mdt(e,t,r,{loadManifest:s}){let a=new Map;for(let[f,{locations:p}]of e){let h=V1e(f)?null:await s(f,p[0]),E=new Map;if(h)for(let[C,S]of h.bin){let x=Y.join(p[0],S);S!==""&&ae.existsSync(x)&&E.set(C,S)}a.set(f,E)}let n=new Map,c=(f,p,h)=>{let E=new Map,C=Y.contains(r,f);if(h.locator&&C!==null){let S=a.get(h.locator);for(let[x,I]of S){let R=Y.join(f,Ae.toPortablePath(I));E.set(x,R)}for(let[x,I]of h.children){let R=Y.join(f,x),N=c(R,R,I);N.size>0&&n.set(f,new Map([...n.get(f)||new Map,...N]))}}else for(let[S,x]of h.children){let I=c(Y.join(f,S),p,x);for(let[R,N]of I)E.set(R,N)}return E};for(let[f,p]of t){let h=c(f,f,p);h.size>0&&n.set(f,new Map([...n.get(f)||new Map,...h]))}return n}var _1e=(e,t)=>{if(!e||!t)return e===t;let r=H.parseLocator(e);H.isVirtualLocator(r)&&(r=H.devirtualizeLocator(r));let s=H.parseLocator(t);return H.isVirtualLocator(s)&&(s=H.devirtualizeLocator(s)),H.areLocatorsEqual(r,s)};function pW(e){return Y.join(e.get("globalFolder"),"store")}function Udt(e,t){let r=s=>{let a=s.split(Y.sep),n=a.lastIndexOf(wi);if(n<0||n==a.length-1)throw new Error(`Assertion failed. Path is outside of any node_modules package ${s}`);return a.slice(0,n+(a[n+1].startsWith("@")?3:2)).join(Y.sep)};for(let s of e.values())for(let[a,n]of s)t.has(r(n))&&s.delete(a)}async function _dt(e,t,r,{baseFs:s,project:a,report:n,loadManifest:c,realLocatorChecksums:f}){let p=Y.join(a.cwd,wi),{locationTree:h,binSymlinks:E,locatorLocations:C,installChangedByUser:S}=Ldt(e.locationTree,e.binSymlinks,e.mtimeMs,a),x=Y1e(t,{skipPrefix:a.cwd}),I=[],R=async({srcDir:ye,dstDir:d,linkType:ve,globalHardlinksStore:Ie,nmMode:me,windowsLinkType:ce,packageChecksum:X})=>{let be=(async()=>{try{ve==="SOFT"?(await ae.mkdirPromise(Y.dirname(d),{recursive:!0}),await AW(Y.resolve(ye),d,ce)):await Odt(d,ye,{baseFs:s,globalHardlinksStore:Ie,nmMode:me,windowsLinkType:ce,packageChecksum:X})}catch(ke){throw ke.message=`While persisting ${ye} -> ${d} ${ke.message}`,ke}finally{fe.tick()}})().then(()=>I.splice(I.indexOf(be),1));I.push(be),I.length>U1e&&await Promise.race(I)},N=async(ye,d,ve)=>{let Ie=(async()=>{let me=async(ce,X,be)=>{try{be.innerLoop||await ae.mkdirPromise(X,{recursive:!0});let ke=await ae.readdirPromise(ce,{withFileTypes:!0});for(let it of ke){if(!be.innerLoop&&it.name===ZF)continue;let _=Y.join(ce,it.name),tt=Y.join(X,it.name);it.isDirectory()?(it.name!==wi||be&&be.innerLoop)&&(await ae.mkdirPromise(tt,{recursive:!0}),await me(_,tt,{...be,innerLoop:!0})):pe.value==="hardlinks-local"||pe.value==="hardlinks-global"?await ae.linkPromise(_,tt):await ae.copyFilePromise(_,tt,j1e.default.constants.COPYFILE_FICLONE)}}catch(ke){throw be.innerLoop||(ke.message=`While cloning ${ce} -> ${X} ${ke.message}`),ke}finally{be.innerLoop||fe.tick()}};await me(ye,d,ve)})().then(()=>I.splice(I.indexOf(Ie),1));I.push(Ie),I.length>U1e&&await Promise.race(I)},U=async(ye,d,ve)=>{if(ve)for(let[Ie,me]of d.children){let ce=ve.children.get(Ie);await U(Y.join(ye,Ie),me,ce)}else{d.children.has(wi)&&await ww(Y.join(ye,wi),{contentsOnly:!1});let Ie=Y.basename(ye)===wi&&h.has(Y.join(Y.dirname(ye)));await ww(ye,{contentsOnly:ye===p,isWorkspaceDir:Ie})}};for(let[ye,d]of h){let ve=x.get(ye);for(let[Ie,me]of d.children){if(Ie===".")continue;let ce=ve&&ve.children.get(Ie),X=Y.join(ye,Ie);await U(X,me,ce)}}let K=async(ye,d,ve)=>{if(ve){_1e(d.locator,ve.locator)||await ww(ye,{contentsOnly:d.linkType==="HARD"});for(let[Ie,me]of d.children){let ce=ve.children.get(Ie);await K(Y.join(ye,Ie),me,ce)}}else{d.children.has(wi)&&await ww(Y.join(ye,wi),{contentsOnly:!0});let Ie=Y.basename(ye)===wi&&x.has(Y.join(Y.dirname(ye)));await ww(ye,{contentsOnly:d.linkType==="HARD",isWorkspaceDir:Ie})}};for(let[ye,d]of x){let ve=h.get(ye);for(let[Ie,me]of d.children){if(Ie===".")continue;let ce=ve&&ve.children.get(Ie);await K(Y.join(ye,Ie),me,ce)}}let $=new Map,ie=[];for(let[ye,d]of C)for(let ve of d){let{locationRoot:Ie,segments:me}=$F(ve,{skipPrefix:a.cwd}),ce=x.get(Ie),X=Ie;if(ce){for(let be of me)if(X=Y.join(X,be),ce=ce.children.get(be),!ce)break;if(ce){let be=_1e(ce.locator,ye),ke=t.get(ce.locator),it=ke.target,_=X,tt=ke.linkType;if(be)$.has(it)||$.set(it,_);else if(it!==_){let Fe=H.parseLocator(ce.locator);H.isVirtualLocator(Fe)&&(Fe=H.devirtualizeLocator(Fe)),ie.push({srcDir:it,dstDir:_,linkType:tt,realLocatorHash:Fe.locatorHash})}}}}for(let[ye,{locations:d}]of t.entries())for(let ve of d){let{locationRoot:Ie,segments:me}=$F(ve,{skipPrefix:a.cwd}),ce=h.get(Ie),X=x.get(Ie),be=Ie,ke=t.get(ye),it=H.parseLocator(ye);H.isVirtualLocator(it)&&(it=H.devirtualizeLocator(it));let _=it.locatorHash,tt=ke.target,Fe=ve;if(tt===Fe)continue;let Qe=ke.linkType;for(let Se of me)X=X.children.get(Se);if(!ce)ie.push({srcDir:tt,dstDir:Fe,linkType:Qe,realLocatorHash:_});else for(let Se of me)if(be=Y.join(be,Se),ce=ce.children.get(Se),!ce){ie.push({srcDir:tt,dstDir:Fe,linkType:Qe,realLocatorHash:_});break}}let fe=Io.progressViaCounter(ie.length),le=n.reportProgress(fe),ge=a.configuration.get("nmMode"),pe={value:ge},De=a.configuration.get("winLinkType");try{let ye=pe.value==="hardlinks-global"?`${pW(a.configuration)}/v1`:null;if(ye&&!await ae.existsPromise(ye)){await ae.mkdirpPromise(ye);for(let ve=0;ve<256;ve++)await ae.mkdirPromise(Y.join(ye,ve.toString(16).padStart(2,"0")))}for(let ve of ie)(ve.linkType==="SOFT"||!$.has(ve.srcDir))&&($.set(ve.srcDir,ve.dstDir),await R({...ve,globalHardlinksStore:ye,nmMode:pe,windowsLinkType:De,packageChecksum:f.get(ve.realLocatorHash)||null}));await Promise.all(I),I.length=0;for(let ve of ie){let Ie=$.get(ve.srcDir);ve.linkType!=="SOFT"&&ve.dstDir!==Ie&&await N(Ie,ve.dstDir,{nmMode:pe})}await Promise.all(I),await ae.mkdirPromise(p,{recursive:!0}),await ae.changeFilePromise(Y.join(p,xdt),JSON.stringify(r,null,2),{automaticNewlines:!0}),Udt(E,new Set(ie.map(ve=>ve.dstDir)));let d=await Mdt(t,x,a.cwd,{loadManifest:c});await Hdt(E,d,a.cwd,De),await Rdt(a,t,d,pe,{installChangedByUser:S}),ge=="hardlinks-global"&&pe.value=="hardlinks-local"&&n.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{le.stop()}}async function Hdt(e,t,r,s){for(let a of e.keys()){if(Y.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!t.has(a)){let n=Y.join(a,wi,ZF);await ae.removePromise(n)}}for(let[a,n]of t){if(Y.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let c=Y.join(a,wi,ZF),f=e.get(a)||new Map;await ae.mkdirPromise(c,{recursive:!0});for(let p of f.keys())n.has(p)||(await ae.removePromise(Y.join(c,p)),process.platform==="win32"&&await ae.removePromise(Y.join(c,`${p}.cmd`)));for(let[p,h]of n){let E=f.get(p),C=Y.join(c,p);E!==h&&(process.platform==="win32"?await(0,H1e.default)(Ae.fromPortablePath(h),Ae.fromPortablePath(C),{createPwshFile:!1}):(await ae.removePromise(C),await AW(h,C,s),Y.contains(r,await ae.realpathPromise(h))!==null&&await ae.chmodPromise(h,493)))}}}Ge();bt();iA();var Jb=class extends og{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new hW(r)}},hW=class extends Jm{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let s=new Eo({baseFs:new nA({maxOpenFiles:80,readOnlyArchives:!0})}),a=D1e(r,this.opts.project.cwd,s),{tree:n,errors:c}=Ob(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:C,text:S}of c)this.opts.report.reportError(C,S);return}let f=new Map;r.fallbackPool=f;let p=(C,S)=>{let x=H.parseLocator(S.locator),I=H.stringifyIdent(x);I===C?f.set(C,x.reference):f.set(C,[I,x.reference])},h=Y.join(this.opts.project.cwd,yr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let C of E.dirList){let S=Y.join(h,C),x=n.get(S);if(typeof x>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in x)p(C,x);else for(let I of x.dirList){let R=Y.join(S,I),N=n.get(R);if(typeof N>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in N)p(`${C}/${I}`,N);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var jdt={hooks:{cleanGlobalArtifacts:async e=>{let t=pW(e);await ae.removePromise(t)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[Kb,Jb]},Gdt=jdt;var hJ={};Vt(hJ,{NpmHttpFetcher:()=>$b,NpmRemapResolver:()=>eD,NpmSemverFetcher:()=>ah,NpmSemverResolver:()=>tD,NpmTagResolver:()=>rD,default:()=>iSt,npmConfigUtils:()=>gn,npmHttpUtils:()=>Qr,npmPublishUtils:()=>E1});Ge();var r2e=et(hi());var ti="npm:";var Qr={};Vt(Qr,{AuthType:()=>$1e,customPackageError:()=>zm,del:()=>ogt,get:()=>Zm,getIdentUrl:()=>Zb,getPackageMetadata:()=>bw,handleInvalidAuthenticationError:()=>lg,post:()=>igt,put:()=>sgt});Ge();Ge();bt();var mW=et(Xv());Zl();var X1e=et(hi());var gn={};Vt(gn,{RegistryType:()=>J1e,getAuditRegistry:()=>qdt,getAuthConfiguration:()=>gW,getDefaultRegistry:()=>zb,getMinimalAgeGate:()=>Z1e,getPublishRegistry:()=>Ydt,getRegistryConfiguration:()=>z1e,getScopeConfiguration:()=>eN,getScopeRegistry:()=>Bw,isPackageApproved:()=>vw,normalizeRegistry:()=>Kc});Ge();var K1e=et(Zo()),J1e=(s=>(s.AUDIT_REGISTRY="npmAuditRegistry",s.FETCH_REGISTRY="npmRegistryServer",s.PUBLISH_REGISTRY="npmPublishRegistry",s))(J1e||{});function Kc(e){return e.replace(/\/$/,"")}function qdt({configuration:e}){return zb({configuration:e,type:"npmAuditRegistry"})}function Ydt(e,{configuration:t}){return e.publishConfig?.registry?Kc(e.publishConfig.registry):e.name?Bw(e.name.scope,{configuration:t,type:"npmPublishRegistry"}):zb({configuration:t,type:"npmPublishRegistry"})}function Bw(e,{configuration:t,type:r="npmRegistryServer"}){let s=eN(e,{configuration:t});if(s===null)return zb({configuration:t,type:r});let a=s.get(r);return a===null?zb({configuration:t,type:r}):Kc(a)}function zb({configuration:e,type:t="npmRegistryServer"}){let r=e.get(t);return Kc(r!==null?r:e.get("npmRegistryServer"))}function z1e(e,{configuration:t}){let r=t.get("npmRegistries"),s=Kc(e),a=r.get(s);if(typeof a<"u")return a;let n=r.get(s.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}var Wdt=new Map([["npmRegistryServer","https://npm.jsr.io/"]]);function eN(e,{configuration:t}){if(e===null)return null;let s=t.get("npmScopes").get(e);return s||(e==="jsr"?Wdt:null)}function gW(e,{configuration:t,ident:r}){let s=r&&eN(r.scope,{configuration:t});return s?.get("npmAuthIdent")||s?.get("npmAuthToken")?s:z1e(e,{configuration:t})||t}function Z1e(e,{configuration:t}){if(e?.scope){let s=eN(e.scope,{configuration:t})?.get("npmMinimalAgeGate");if(typeof s=="number")return s}return t.get("npmMinimalAgeGate")}function Vdt({configuration:e,ident:t,version:r,publishTimes:s}){let a=Z1e(t,{configuration:e});if(a){let n=s?.[r];if(typeof n>"u"||(new Date().getTime()-new Date(n).getTime())/60/1e3Kdt(t,r,s))}function vw(e){return!Vdt(e)||Jdt(e)}var $1e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))($1e||{});async function lg(e,{attemptedAs:t,registry:r,headers:s,configuration:a}){if(rN(e))throw new Lt(41,"Invalid OTP token");if(e.originalError?.name==="HTTPError"&&e.originalError?.response.statusCode===401)throw new Lt(41,`Invalid authentication (${typeof t!="string"?`as ${await lgt(r,s,{configuration:a})}`:`attempted as ${t}`})`)}function zm(e,t){let r=e.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${ue.applyHyperlink(t,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function Zb(e){return e.scope?`/@${encodeURIComponent(e.scope)}%2f${encodeURIComponent(e.name)}`:`/${encodeURIComponent(e.name)}`}var e2e=new Map,zdt=new Map;async function Zdt(e){return await qe.getFactoryWithDefault(e2e,e,async()=>{let t=null;try{t=await ae.readJsonPromise(e)}catch{}return t})}async function Xdt(e,t,{configuration:r,cached:s,registry:a,headers:n,version:c,...f}){return await qe.getFactoryWithDefault(zdt,e,async()=>await Zm(Zb(t),{...f,customErrorMessage:zm,configuration:r,registry:a,ident:t,headers:{...n,"If-None-Match":s?.etag,"If-Modified-Since":s?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(s===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...h,body:s.metadata}}let E=egt(JSON.parse(h.body.toString())),C={metadata:E,etag:h.headers.etag,lastModified:h.headers["last-modified"]};return e2e.set(e,Promise.resolve(C)),Promise.resolve().then(async()=>{let S=`${e}-${process.pid}.tmp`;await ae.mkdirPromise(Y.dirname(S),{recursive:!0}),await ae.writeJsonPromise(S,C,{compact:!0}),await ae.renamePromise(S,e)}).catch(()=>{}),{...h,body:E}}}))}function $dt(e){return e.scope!==null?`@${e.scope}-${e.name}-${e.scope.length}`:e.name}async function bw(e,{cache:t,project:r,registry:s,headers:a,version:n,...c}){let{configuration:f}=r;s=Xb(f,{ident:e,registry:s});let p=rgt(f,s),h=Y.join(p,`${$dt(e)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await Zdt(h),E)){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(f.get("enableOfflineMode")){let C=structuredClone(E.metadata),S=new Set;if(t){for(let I of Object.keys(C.versions)){let R=H.makeLocator(e,`npm:${I}`),N=t.getLocatorMirrorPath(R);(!N||!ae.existsSync(N))&&(delete C.versions[I],S.add(I))}let x=C["dist-tags"].latest;if(S.has(x)){let I=Object.keys(E.metadata.versions).sort(X1e.default.compare),R=I.indexOf(x);for(;S.has(I[R])&&R>=0;)R-=1;R>=0?C["dist-tags"].latest=I[R]:delete C["dist-tags"].latest}}return C}}return await Xdt(h,e,{...c,configuration:f,cached:E,registry:s,headers:a,version:n})}var t2e=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function egt(e){return{"dist-tags":e["dist-tags"],versions:Object.fromEntries(Object.entries(e.versions).map(([t,r])=>[t,z0(r,t2e)])),time:e.time}}var tgt=Mn.makeHash("time",...t2e).slice(0,6);function rgt(e,t){let r=ngt(e),s=new URL(t);return Y.join(r,tgt,s.hostname)}function ngt(e){return Y.join(e.get("globalFolder"),"metadata/npm")}async function Zm(e,{configuration:t,headers:r,ident:s,authType:a,allowOidc:n,registry:c,...f}){c=Xb(t,{ident:s,registry:c}),s&&s.scope&&typeof a>"u"&&(a=1);let p=await tN(c,{authType:a,allowOidc:n,configuration:t,ident:s});p&&(r={...r,authorization:p});try{return await nn.get(e.charAt(0)==="/"?`${c}${e}`:e,{configuration:t,headers:r,...f})}catch(h){throw await lg(h,{registry:c,configuration:t,headers:r}),h}}async function igt(e,t,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=Xb(s,{ident:n,registry:p});let C=await tN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...Sw(h)});try{return await nn.post(p+e,t,{configuration:s,headers:a,...E})}catch(S){if(!rN(S)||h)throw await lg(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await yW(S,{configuration:s});let x={...a,...Sw(h)};try{return await nn.post(`${p}${e}`,t,{configuration:s,headers:x,...E})}catch(I){throw await lg(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function sgt(e,t,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=Xb(s,{ident:n,registry:p});let C=await tN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...Sw(h)});try{return await nn.put(p+e,t,{configuration:s,headers:a,...E})}catch(S){if(!rN(S))throw await lg(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await yW(S,{configuration:s});let x={...a,...Sw(h)};try{return await nn.put(`${p}${e}`,t,{configuration:s,headers:x,...E})}catch(I){throw await lg(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function ogt(e,{attemptedAs:t,configuration:r,headers:s,ident:a,authType:n=3,allowOidc:c,registry:f,otp:p,...h}){f=Xb(r,{ident:a,registry:f});let E=await tN(f,{authType:n,allowOidc:c,configuration:r,ident:a});E&&(s={...s,authorization:E}),p&&(s={...s,...Sw(p)});try{return await nn.del(f+e,{configuration:r,headers:s,...h})}catch(C){if(!rN(C)||p)throw await lg(C,{attemptedAs:t,registry:f,configuration:r,headers:s}),C;p=await yW(C,{configuration:r});let S={...s,...Sw(p)};try{return await nn.del(`${f}${e}`,{configuration:r,headers:S,...h})}catch(x){throw await lg(x,{attemptedAs:t,registry:f,configuration:r,headers:s}),x}}}function Xb(e,{ident:t,registry:r}){if(typeof r>"u"&&t)return Bw(t.scope,{configuration:e});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return Kc(r)}async function tN(e,{authType:t=2,allowOidc:r=!1,configuration:s,ident:a}){let n=gW(e,{configuration:s,ident:a}),c=agt(n,t);if(!c)return null;let f=await s.reduceHook(p=>p.getNpmAuthenticationHeader,void 0,e,{configuration:s,ident:a});if(f)return f;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let p=n.get("npmAuthIdent");return p.includes(":")?`Basic ${Buffer.from(p).toString("base64")}`:`Basic ${p}`}if(r&&a){let p=await cgt(e,{configuration:s,ident:a});if(p)return`Bearer ${p}`}if(c&&t!==1)throw new Lt(33,"No authentication configured for request");return null}function agt(e,t){switch(t){case 2:return e.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function lgt(e,t,{configuration:r}){if(typeof t>"u"||typeof t.authorization>"u")return"an anonymous user";try{return(await nn.get(new URL(`${e}/-/whoami`).href,{configuration:r,headers:t,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function yW(e,{configuration:t}){let r=e.originalError?.response.headers["npm-notice"];if(r&&(await Ft.start({configuration:t,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,ue.pretty(t,"$1",ue.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&Ui.openUrl){let{openNow:c}=await(0,mW.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});c&&(await Ui.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` +`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:s}=await(0,mW.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` +`),s}function rN(e){if(e.originalError?.name!=="HTTPError")return!1;try{return(e.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function Sw(e){return{"npm-otp":e}}async function cgt(e,{configuration:t,ident:r}){let s=null;if(process.env.GITLAB_CI)s=process.env.NPM_ID_TOKEN||null;else if(process.env.CIRCLECI)s=process.env.NPM_ID_TOKEN||null;else if(process.env.GITHUB_ACTIONS){if(!(process.env.ACTIONS_ID_TOKEN_REQUEST_URL&&process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN))return null;let a=`npm:${new URL(e).host.replace("registry.yarnpkg.com","registry.npmjs.org").replace("yarn.npmjs.org","registry.npmjs.org")}`,n=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);n.searchParams.append("audience",a),s=(await nn.get(n.href,{configuration:t,jsonResponse:!0,headers:{Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).value}if(!s)return null;try{return(await nn.post(`${e}/-/npm/v1/oidc/token/exchange/package${Zb(r)}`,null,{configuration:t,jsonResponse:!0,headers:{Authorization:`Bearer ${s}`}})).token||null}catch{}return null}var $b=class{supports(t,r){if(!t.reference.startsWith(ti))return!1;let{selector:s,params:a}=H.parseRange(t.reference);return!(!r2e.default.valid(s)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),checksum:c}}async fetchFromNetwork(t,r){let{params:s}=H.parseRange(t.reference);if(s===null||typeof s.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await Zm(s.__archiveUrl,{customErrorMessage:zm,configuration:r.project.configuration,ident:t});return await ms.convertToZip(a,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1})}};Ge();var eD=class{supportsDescriptor(t,r){return!(!t.range.startsWith(ti)||!H.tryParseDescriptor(t.range.slice(ti.length),!0))}supportsLocator(t,r){return!1}shouldPersistResolution(t,r){throw new Error("Unreachable")}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){let s=r.project.configuration.normalizeDependency(H.parseDescriptor(t.range.slice(ti.length),!0));return r.resolver.getResolutionDependencies(s,r)}async getCandidates(t,r,s){let a=s.project.configuration.normalizeDependency(H.parseDescriptor(t.range.slice(ti.length),!0));return await s.resolver.getCandidates(a,r,s)}async getSatisfying(t,r,s,a){let n=a.project.configuration.normalizeDependency(H.parseDescriptor(t.range.slice(ti.length),!0));return a.resolver.getSatisfying(n,r,s,a)}resolve(t,r){throw new Error("Unreachable")}};Ge();Ge();var n2e=et(hi());var ah=class e{supports(t,r){if(!t.reference.startsWith(ti))return!1;let s=new URL(t.reference);return!(!n2e.default.valid(s.pathname)||s.searchParams.has("__archiveUrl"))}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),checksum:c}}async fetchFromNetwork(t,r){let s;try{s=await Zm(e.getLocatorUrl(t),{customErrorMessage:zm,configuration:r.project.configuration,ident:t})}catch{s=await Zm(e.getLocatorUrl(t).replace(/%2f/g,"/"),{customErrorMessage:zm,configuration:r.project.configuration,ident:t})}return await ms.convertToZip(s,{configuration:r.project.configuration,prefixPath:H.getIdentVendorPath(t),stripComponents:1})}static isConventionalTarballUrl(t,r,{configuration:s}){let a=Bw(t.scope,{configuration:s}),n=e.getLocatorUrl(t);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(t){let r=kr.clean(t.reference.slice(ti.length));if(r===null)throw new Lt(10,"The npm semver resolver got selected, but the version isn't semver");let s=encodeURIComponent(t.name),a=encodeURIComponent(r);return`${Zb(t)}/-/${s}-${a}.tgz`}};Ge();Ge();Ge();var EW=et(hi());var nN=H.makeIdent(null,"node-gyp"),ugt=/\b(node-gyp|prebuild-install)\b/,tD=class{supportsDescriptor(t,r){return t.range.startsWith(ti)?!!kr.validRange(t.range.slice(ti.length)):!1}supportsLocator(t,r){if(!t.reference.startsWith(ti))return!1;let{selector:s}=H.parseRange(t.reference);return!!EW.default.valid(s)}shouldPersistResolution(t,r){return!0}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){let a=kr.validRange(t.range.slice(ti.length));if(a===null)throw new Error(`Expected a valid range, got ${t.range.slice(ti.length)}`);let n=await bw(t,{cache:s.fetchOptions?.cache,project:s.project,version:EW.default.valid(a.raw)?a.raw:void 0}),c=qe.mapAndFilter(Object.keys(n.versions),E=>{try{let C=new kr.SemVer(E);if(a.test(C))return C}catch{}return qe.mapAndFilter.skip}),f=c.filter(E=>vw({configuration:s.project.configuration,ident:t,version:E.raw,publishTimes:n.time}));if(c.length>0&&f.length===0)throw new Lt(16,`All versions satisfying "${t.range.slice(ti.length)}" are quarantined`);let p=f.filter(E=>!n.versions[E.raw].deprecated),h=p.length>0?p:f;return h.sort((E,C)=>-E.compare(C)),h.map(E=>{let C=H.makeLocator(t,`${ti}${E.raw}`),S=n.versions[E.raw].dist.tarball;return ah.isConventionalTarballUrl(C,S,{configuration:s.project.configuration})?C:H.bindLocator(C,{__archiveUrl:S})})}async getSatisfying(t,r,s,a){let n=kr.validRange(t.range.slice(ti.length));if(n===null)throw new Error(`Expected a valid range, got ${t.range.slice(ti.length)}`);return{locators:qe.mapAndFilter(s,p=>{if(p.identHash!==t.identHash)return qe.mapAndFilter.skip;let h=H.tryParseRange(p.reference,{requireProtocol:ti});if(!h)return qe.mapAndFilter.skip;let E=new kr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:qe.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(t,r){let{selector:s}=H.parseRange(t.reference),a=kr.clean(s);if(a===null)throw new Lt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await bw(t,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new Lt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new Lt(16,`Registry failed to return reference "${a}"`);let c=new _t;if(c.load(n.versions[a]),!c.dependencies.has(nN.identHash)&&!c.peerDependencies.has(nN.identHash)){for(let f of c.scripts.values())if(f.match(ugt)){c.dependencies.set(nN.identHash,H.makeDescriptor(nN,"latest"));break}}return{...t,version:a,languageName:"node",linkType:"HARD",conditions:c.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(c.dependencies),peerDependencies:c.peerDependencies,dependenciesMeta:c.dependenciesMeta,peerDependenciesMeta:c.peerDependenciesMeta,bin:c.bin}}};Ge();Ge();var iN=et(hi());var rD=class{supportsDescriptor(t,r){return!(!t.range.startsWith(ti)||!jp.test(t.range.slice(ti.length)))}supportsLocator(t,r){return!1}shouldPersistResolution(t,r){throw new Error("Unreachable")}bindDescriptor(t,r,s){return t}getResolutionDependencies(t,r){return{}}async getCandidates(t,r,s){let a=t.range.slice(ti.length),n=await bw(t,{cache:s.fetchOptions?.cache,project:s.project});if(!Object.hasOwn(n,"dist-tags"))throw new Lt(15,'Registry returned invalid data - missing "dist-tags" field');let c=n["dist-tags"];if(!Object.hasOwn(c,a))throw new Lt(16,`Registry failed to return tag "${a}"`);let f=Object.keys(n.versions),p=n.time,h=c[a];if(a==="latest"&&!vw({configuration:s.project.configuration,ident:t,version:h,publishTimes:p})){let S=h.includes("-"),x=iN.default.rsort(f).find(I=>iN.default.lt(I,h)&&(S||!I.includes("-"))&&vw({configuration:s.project.configuration,ident:t,version:I,publishTimes:p}));if(!x)throw new Lt(16,`The version for tag "${a}" is quarantined, and no lower version is available`);h=x}let E=H.makeLocator(t,`${ti}${h}`),C=n.versions[h].dist.tarball;return ah.isConventionalTarballUrl(E,C,{configuration:s.project.configuration})?[E]:[H.bindLocator(E,{__archiveUrl:C})]}async getSatisfying(t,r,s,a){let n=[];for(let c of s){if(c.identHash!==t.identHash)continue;let f=H.tryParseRange(c.reference,{requireProtocol:ti});if(!(!f||!iN.default.valid(f.selector))){if(f.params?.__archiveUrl){let p=H.makeRange({protocol:ti,selector:f.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(H.makeDescriptor(t,p),r,a);if(c.reference!==h.reference)continue}n.push(c)}}return{locators:n,sorted:!1}}async resolve(t,r){throw new Error("Unreachable")}};var E1={};Vt(E1,{getGitHead:()=>tSt,getPublishAccess:()=>VDe,getReadmeContent:()=>KDe,makePublishBody:()=>eSt});Ge();Ge();bt();var aV={};Vt(aV,{PackCommand:()=>Lw,default:()=>Gmt,packUtils:()=>CA});Ge();Ge();Ge();bt();jt();var CA={};Vt(CA,{genPackList:()=>DN,genPackStream:()=>oV,genPackageManifest:()=>FBe,hasPackScripts:()=>iV,prepareForPack:()=>sV});Ge();bt();var nV=et(Zo()),TBe=et(PBe()),RBe=Ce("zlib"),Tmt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],Rmt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function iV(e){return!!(wn.hasWorkspaceScript(e,"prepack")||wn.hasWorkspaceScript(e,"postpack"))}async function sV(e,{report:t},r){await wn.maybeExecuteWorkspaceLifecycleScript(e,"prepack",{report:t});try{let s=Y.join(e.cwd,_t.fileName);await ae.existsPromise(s)&&await e.manifest.loadFile(s,{baseFs:ae}),await r()}finally{await wn.maybeExecuteWorkspaceLifecycleScript(e,"postpack",{report:t})}}async function oV(e,t){typeof t>"u"&&(t=await DN(e));let r=new Set;for(let n of e.manifest.publishConfig?.executableFiles??new Set)r.add(Y.normalize(n));for(let n of e.manifest.bin.values())r.add(Y.normalize(n));let s=TBe.default.pack();process.nextTick(async()=>{for(let n of t){let c=Y.normalize(n),f=Y.resolve(e.cwd,c),p=Y.join("package",c),h=await ae.lstatPromise(f),E={name:p,mtime:new Date(pi.SAFE_TIME*1e3)},C=r.has(c)?493:420,S,x,I=new Promise((N,U)=>{S=N,x=U}),R=N=>{N?x(N):S()};if(h.isFile()){let N;c==="package.json"?N=Buffer.from(JSON.stringify(await FBe(e),null,2)):N=await ae.readFilePromise(f),s.entry({...E,mode:C,type:"file"},N,R)}else h.isSymbolicLink()?s.entry({...E,mode:C,type:"symlink",linkname:await ae.readlinkPromise(f)},R):R(new Error(`Unsupported file type ${h.mode} for ${Ae.fromPortablePath(c)}`));await I}s.finalize()});let a=(0,RBe.createGzip)();return s.pipe(a),a}async function FBe(e){let t=JSON.parse(JSON.stringify(e.manifest.raw));return await e.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,e,t),t}async function DN(e){let t=e.project,r=t.configuration,s={accept:[],reject:[]};for(let C of Rmt)s.reject.push(C);for(let C of Tmt)s.accept.push(C);s.reject.push(r.get("rcFilename"));let a=C=>{if(C===null||!C.startsWith(`${e.cwd}/`))return;let S=Y.relative(e.cwd,C),x=Y.resolve(wt.root,S);s.reject.push(x)};a(Y.resolve(t.cwd,yr.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(C=>C.populateYarnPaths,t,C=>{a(C)});for(let C of t.workspaces){let S=Y.relative(e.cwd,C.cwd);S!==""&&!S.match(/^(\.\.)?\//)&&s.reject.push(`/${S}`)}let n={accept:[],reject:[]},c=e.manifest.publishConfig?.main??e.manifest.main,f=e.manifest.publishConfig?.module??e.manifest.module,p=e.manifest.publishConfig?.browser??e.manifest.browser,h=e.manifest.publishConfig?.bin??e.manifest.bin;c!=null&&n.accept.push(Y.resolve(wt.root,c)),f!=null&&n.accept.push(Y.resolve(wt.root,f)),typeof p=="string"&&n.accept.push(Y.resolve(wt.root,p));for(let C of h.values())n.accept.push(Y.resolve(wt.root,C));if(p instanceof Map)for(let[C,S]of p.entries())n.accept.push(Y.resolve(wt.root,C)),typeof S=="string"&&n.accept.push(Y.resolve(wt.root,S));let E=e.manifest.files!==null;if(E){n.reject.push("/*");for(let C of e.manifest.files)NBe(n.accept,C,{cwd:wt.root})}return await Fmt(e.cwd,{hasExplicitFileList:E,globalList:s,ignoreList:n})}async function Fmt(e,{hasExplicitFileList:t,globalList:r,ignoreList:s}){let a=[],n=new qf(e),c=[[wt.root,[s]]];for(;c.length>0;){let[f,p]=c.pop(),h=await n.lstatPromise(f);if(!kBe(f,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(f),C=!1,S=!1;if(!t||f!==wt.root)for(let R of E)C=C||R===".gitignore",S=S||R===".npmignore";let x=S?await xBe(n,f,".npmignore"):C?await xBe(n,f,".gitignore"):null,I=x!==null?[x].concat(p):p;kBe(f,{globalList:r,ignoreLists:p})&&(I=[...p,{accept:[],reject:["**/*"]}]);for(let R of E)c.push([Y.resolve(f,R),I])}else(h.isFile()||h.isSymbolicLink())&&a.push(Y.relative(wt.root,f))}return a.sort()}async function xBe(e,t,r){let s={accept:[],reject:[]},a=await e.readFilePromise(Y.join(t,r),"utf8");for(let n of a.split(/\n/g))NBe(s.reject,n,{cwd:t});return s}function Nmt(e,{cwd:t}){let r=e[0]==="!";return r&&(e=e.slice(1)),e.match(/\.{0,1}\//)&&(e=Y.resolve(t,e)),r&&(e=`!${e}`),e}function NBe(e,t,{cwd:r}){let s=t.trim();s===""||s[0]==="#"||e.push(Nmt(s,{cwd:r}))}function kBe(e,{globalList:t,ignoreLists:r}){let s=bN(e,t.accept);if(s!==0)return s===2;let a=bN(e,t.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let c=bN(e,n.accept);if(c!==0)return c===2;let f=bN(e,n.reject);if(f!==0)return f===1}return!1}function bN(e,t){let r=t,s=[];for(let a=0;a{await sV(a,{report:p},async()=>{p.reportJson({base:Ae.fromPortablePath(a.cwd)});let h=await DN(a);for(let E of h)p.reportInfo(null,Ae.fromPortablePath(E)),p.reportJson({location:Ae.fromPortablePath(E)});if(!this.dryRun){let E=await oV(a,h);await ae.mkdirPromise(Y.dirname(c),{recursive:!0});let C=ae.createWriteStream(c);E.pipe(C),await new Promise(S=>{C.on("finish",S)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${ue.pretty(r,c,ue.Type.PATH)}`),p.reportJson({output:Ae.fromPortablePath(c)}))})).exitCode()}};function Omt(e,{workspace:t}){let r=e.replace("%s",Lmt(t)).replace("%v",Mmt(t));return Ae.toPortablePath(r)}function Lmt(e){return e.manifest.name!==null?H.slugifyIdent(e.manifest.name):"package"}function Mmt(e){return e.manifest.version!==null?e.manifest.version:"unknown"}var Umt=["dependencies","devDependencies","peerDependencies"],_mt="workspace:",Hmt=(e,t)=>{t.publishConfig&&(t.publishConfig.type&&(t.type=t.publishConfig.type),t.publishConfig.main&&(t.main=t.publishConfig.main),t.publishConfig.browser&&(t.browser=t.publishConfig.browser),t.publishConfig.module&&(t.module=t.publishConfig.module),t.publishConfig.exports&&(t.exports=t.publishConfig.exports),t.publishConfig.imports&&(t.imports=t.publishConfig.imports),t.publishConfig.bin&&(t.bin=t.publishConfig.bin));let r=e.project;for(let s of Umt)for(let a of e.manifest.getForScope(s).values()){let n=r.tryWorkspaceByDescriptor(a),c=H.parseRange(a.range);if(c.protocol===_mt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Lt(21,`${H.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let f;H.areDescriptorsEqual(a,n.anchoredDescriptor)||c.selector==="*"?f=n.manifest.version??"0.0.0":c.selector==="~"||c.selector==="^"?f=`${c.selector}${n.manifest.version??"0.0.0"}`:f=c.selector;let p=s==="dependencies"?H.makeDescriptor(a,"unknown"):null,h=p!==null&&e.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":s;t[h][H.stringifyIdent(a)]=f}}},jmt={hooks:{beforeWorkspacePacking:Hmt},commands:[Lw]},Gmt=jmt;var WDe=et(qBe());Ge();var qDe=et(GDe()),{env:vt}=process,Yvt="application/vnd.in-toto+json",Wvt="https://in-toto.io/Statement/v0.1",Vvt="https://in-toto.io/Statement/v1",Kvt="https://slsa.dev/provenance/v0.2",Jvt="https://slsa.dev/provenance/v1",zvt="https://github.com/actions/runner",Zvt="https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1",Xvt="https://github.com/npm/cli/gitlab",$vt="v0alpha1",YDe=async(e,t)=>{let r;if(vt.GITHUB_ACTIONS){if(!vt.ACTIONS_ID_TOKEN_REQUEST_URL)throw new Lt(91,'Provenance generation in GitHub Actions requires "write" access to the "id-token" permission');let s=(vt.GITHUB_WORKFLOW_REF||"").replace(`${vt.GITHUB_REPOSITORY}/`,""),a=s.indexOf("@"),n=s.slice(0,a),c=s.slice(a+1);r={_type:Vvt,subject:e,predicateType:Jvt,predicate:{buildDefinition:{buildType:Zvt,externalParameters:{workflow:{ref:c,repository:`${vt.GITHUB_SERVER_URL}/${vt.GITHUB_REPOSITORY}`,path:n}},internalParameters:{github:{event_name:vt.GITHUB_EVENT_NAME,repository_id:vt.GITHUB_REPOSITORY_ID,repository_owner_id:vt.GITHUB_REPOSITORY_OWNER_ID}},resolvedDependencies:[{uri:`git+${vt.GITHUB_SERVER_URL}/${vt.GITHUB_REPOSITORY}@${vt.GITHUB_REF}`,digest:{gitCommit:vt.GITHUB_SHA}}]},runDetails:{builder:{id:`${zvt}/${vt.RUNNER_ENVIRONMENT}`},metadata:{invocationId:`${vt.GITHUB_SERVER_URL}/${vt.GITHUB_REPOSITORY}/actions/runs/${vt.GITHUB_RUN_ID}/attempts/${vt.GITHUB_RUN_ATTEMPT}`}}}}}else if(vt.GITLAB_CI){if(!vt.SIGSTORE_ID_TOKEN)throw new Lt(91,`Provenance generation in GitLab CI requires "SIGSTORE_ID_TOKEN" with "sigstore" audience to be present in "id_tokens". For more info see: +https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html`);r={_type:Wvt,subject:e,predicateType:Kvt,predicate:{buildType:`${Xvt}/${$vt}`,builder:{id:`${vt.CI_PROJECT_URL}/-/runners/${vt.CI_RUNNER_ID}`},invocation:{configSource:{uri:`git+${vt.CI_PROJECT_URL}`,digest:{sha1:vt.CI_COMMIT_SHA},entryPoint:vt.CI_JOB_NAME},parameters:{CI:vt.CI,CI_API_GRAPHQL_URL:vt.CI_API_GRAPHQL_URL,CI_API_V4_URL:vt.CI_API_V4_URL,CI_BUILD_BEFORE_SHA:vt.CI_BUILD_BEFORE_SHA,CI_BUILD_ID:vt.CI_BUILD_ID,CI_BUILD_NAME:vt.CI_BUILD_NAME,CI_BUILD_REF:vt.CI_BUILD_REF,CI_BUILD_REF_NAME:vt.CI_BUILD_REF_NAME,CI_BUILD_REF_SLUG:vt.CI_BUILD_REF_SLUG,CI_BUILD_STAGE:vt.CI_BUILD_STAGE,CI_COMMIT_BEFORE_SHA:vt.CI_COMMIT_BEFORE_SHA,CI_COMMIT_BRANCH:vt.CI_COMMIT_BRANCH,CI_COMMIT_REF_NAME:vt.CI_COMMIT_REF_NAME,CI_COMMIT_REF_PROTECTED:vt.CI_COMMIT_REF_PROTECTED,CI_COMMIT_REF_SLUG:vt.CI_COMMIT_REF_SLUG,CI_COMMIT_SHA:vt.CI_COMMIT_SHA,CI_COMMIT_SHORT_SHA:vt.CI_COMMIT_SHORT_SHA,CI_COMMIT_TIMESTAMP:vt.CI_COMMIT_TIMESTAMP,CI_COMMIT_TITLE:vt.CI_COMMIT_TITLE,CI_CONFIG_PATH:vt.CI_CONFIG_PATH,CI_DEFAULT_BRANCH:vt.CI_DEFAULT_BRANCH,CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX:vt.CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX:vt.CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_SERVER:vt.CI_DEPENDENCY_PROXY_SERVER,CI_DEPENDENCY_PROXY_USER:vt.CI_DEPENDENCY_PROXY_USER,CI_JOB_ID:vt.CI_JOB_ID,CI_JOB_NAME:vt.CI_JOB_NAME,CI_JOB_NAME_SLUG:vt.CI_JOB_NAME_SLUG,CI_JOB_STAGE:vt.CI_JOB_STAGE,CI_JOB_STARTED_AT:vt.CI_JOB_STARTED_AT,CI_JOB_URL:vt.CI_JOB_URL,CI_NODE_TOTAL:vt.CI_NODE_TOTAL,CI_PAGES_DOMAIN:vt.CI_PAGES_DOMAIN,CI_PAGES_URL:vt.CI_PAGES_URL,CI_PIPELINE_CREATED_AT:vt.CI_PIPELINE_CREATED_AT,CI_PIPELINE_ID:vt.CI_PIPELINE_ID,CI_PIPELINE_IID:vt.CI_PIPELINE_IID,CI_PIPELINE_SOURCE:vt.CI_PIPELINE_SOURCE,CI_PIPELINE_URL:vt.CI_PIPELINE_URL,CI_PROJECT_CLASSIFICATION_LABEL:vt.CI_PROJECT_CLASSIFICATION_LABEL,CI_PROJECT_DESCRIPTION:vt.CI_PROJECT_DESCRIPTION,CI_PROJECT_ID:vt.CI_PROJECT_ID,CI_PROJECT_NAME:vt.CI_PROJECT_NAME,CI_PROJECT_NAMESPACE:vt.CI_PROJECT_NAMESPACE,CI_PROJECT_NAMESPACE_ID:vt.CI_PROJECT_NAMESPACE_ID,CI_PROJECT_PATH:vt.CI_PROJECT_PATH,CI_PROJECT_PATH_SLUG:vt.CI_PROJECT_PATH_SLUG,CI_PROJECT_REPOSITORY_LANGUAGES:vt.CI_PROJECT_REPOSITORY_LANGUAGES,CI_PROJECT_ROOT_NAMESPACE:vt.CI_PROJECT_ROOT_NAMESPACE,CI_PROJECT_TITLE:vt.CI_PROJECT_TITLE,CI_PROJECT_URL:vt.CI_PROJECT_URL,CI_PROJECT_VISIBILITY:vt.CI_PROJECT_VISIBILITY,CI_REGISTRY:vt.CI_REGISTRY,CI_REGISTRY_IMAGE:vt.CI_REGISTRY_IMAGE,CI_REGISTRY_USER:vt.CI_REGISTRY_USER,CI_RUNNER_DESCRIPTION:vt.CI_RUNNER_DESCRIPTION,CI_RUNNER_ID:vt.CI_RUNNER_ID,CI_RUNNER_TAGS:vt.CI_RUNNER_TAGS,CI_SERVER_HOST:vt.CI_SERVER_HOST,CI_SERVER_NAME:vt.CI_SERVER_NAME,CI_SERVER_PORT:vt.CI_SERVER_PORT,CI_SERVER_PROTOCOL:vt.CI_SERVER_PROTOCOL,CI_SERVER_REVISION:vt.CI_SERVER_REVISION,CI_SERVER_SHELL_SSH_HOST:vt.CI_SERVER_SHELL_SSH_HOST,CI_SERVER_SHELL_SSH_PORT:vt.CI_SERVER_SHELL_SSH_PORT,CI_SERVER_URL:vt.CI_SERVER_URL,CI_SERVER_VERSION:vt.CI_SERVER_VERSION,CI_SERVER_VERSION_MAJOR:vt.CI_SERVER_VERSION_MAJOR,CI_SERVER_VERSION_MINOR:vt.CI_SERVER_VERSION_MINOR,CI_SERVER_VERSION_PATCH:vt.CI_SERVER_VERSION_PATCH,CI_TEMPLATE_REGISTRY_HOST:vt.CI_TEMPLATE_REGISTRY_HOST,GITLAB_CI:vt.GITLAB_CI,GITLAB_FEATURES:vt.GITLAB_FEATURES,GITLAB_USER_ID:vt.GITLAB_USER_ID,GITLAB_USER_LOGIN:vt.GITLAB_USER_LOGIN,RUNNER_GENERATE_ARTIFACTS_METADATA:vt.RUNNER_GENERATE_ARTIFACTS_METADATA},environment:{name:vt.CI_RUNNER_DESCRIPTION,architecture:vt.CI_RUNNER_EXECUTABLE_ARCH,server:vt.CI_SERVER_URL,project:vt.CI_PROJECT_PATH,job:{id:vt.CI_JOB_ID},pipeline:{id:vt.CI_PIPELINE_ID,ref:vt.CI_CONFIG_PATH}}},metadata:{buildInvocationId:`${vt.CI_JOB_URL}`,completeness:{parameters:!0,environment:!0,materials:!1},reproducible:!1},materials:[{uri:`git+${vt.CI_PROJECT_URL}`,digest:{sha1:vt.CI_COMMIT_SHA}}]}}}else throw new Lt(91,"Provenance generation is only supported in GitHub Actions and GitLab CI");return qDe.attest(Buffer.from(JSON.stringify(r)),Yvt,t)};async function eSt(e,t,{access:r,tag:s,registry:a,gitHead:n,provenance:c}){let f=e.manifest.name,p=e.manifest.version,h=H.stringifyIdent(f),E=WDe.default.fromData(t,{algorithms:["sha1","sha512"]}),C=r??VDe(e,f),S=await KDe(e),x=await CA.genPackageManifest(e),I=`${h}-${p}.tgz`,R=new URL(`${Kc(a)}/${h}/-/${I}`),N={[I]:{content_type:"application/octet-stream",data:t.toString("base64"),length:t.length}};if(c){let U={name:`pkg:npm/${h.replace(/^@/,"%40")}@${p}`,digest:{sha512:E.sha512[0].hexDigest()}},K=await YDe([U]),$=JSON.stringify(K);N[`${h}-${p}.sigstore`]={content_type:K.mediaType,data:$,length:$.length}}return{_id:h,_attachments:N,name:h,access:C,"dist-tags":{[s]:p},versions:{[p]:{...x,_id:`${h}@${p}`,name:h,version:p,gitHead:n,dist:{shasum:E.sha1[0].hexDigest(),integrity:E.sha512[0].toString(),tarball:R.toString()}}},readme:S}}async function tSt(e){try{let{stdout:t}=await Yr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:e});return t.trim()===""?void 0:t.trim()}catch{return}}function VDe(e,t){let r=e.project.configuration;return e.manifest.publishConfig&&typeof e.manifest.publishConfig.access=="string"?e.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):t.scope?"restricted":"public"}async function KDe(e){let t=Ae.toPortablePath(`${e.cwd}/README.md`),r=e.manifest.name,a=`# ${H.stringifyIdent(r)} +`;try{a=await ae.readFilePromise(t,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var pJ={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},JDe={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},zDe={npmMinimalAgeGate:{description:"Minimum age of a package version according to the publish date on the npm registry to be considered for installation",type:"DURATION",unit:"m",default:"1d"}},rSt={npmPreapprovedPackages:{description:"Array of package descriptors or package name glob patterns to exclude from the minimum release age check",type:"STRING",isArray:!0,default:[]}},nSt={configuration:{...pJ,...JDe,...zDe,...rSt,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...pJ,...JDe,...zDe}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:Kc,valueDefinition:{description:"",type:"SHAPE",properties:{...pJ}}}},fetchers:[$b,ah],resolvers:[eD,tD,rD]},iSt=nSt;var vJ={};Vt(vJ,{NpmAuditCommand:()=>C1,NpmInfoCommand:()=>w1,NpmLoginCommand:()=>B1,NpmLogoutCommand:()=>S1,NpmPublishCommand:()=>b1,NpmStageApproveCommand:()=>D1,NpmStageListCommand:()=>P1,NpmStageRejectCommand:()=>x1,NpmTagAddCommand:()=>Q1,NpmTagListCommand:()=>k1,NpmTagRemoveCommand:()=>T1,NpmWhoamiCommand:()=>R1,default:()=>mSt,npmAuditTypes:()=>tP,npmAuditUtils:()=>wL});Ge();Ge();jt();var EJ=et(Zo());Jo();var tP={};Vt(tP,{Environment:()=>$D,Severity:()=>eP});var $D=(s=>(s.All="all",s.Production="production",s.Development="development",s))($D||{}),eP=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(eP||{});var wL={};Vt(wL,{allSeverities:()=>I1,getPackages:()=>yJ,getReportTree:()=>gJ,getSeverityInclusions:()=>dJ,getTopLevelDependencies:()=>mJ});Ge();var ZDe=et(hi());var I1=["info","low","moderate","high","critical"];function dJ(e){if(typeof e>"u")return new Set(I1);let t=I1.indexOf(e),r=I1.slice(t);return new Set(r)}function gJ(e){let t={},r={children:t};for(let[s,a]of qe.sortMap(Object.entries(e),n=>n[0]))for(let n of qe.sortMap(a,c=>`${c.id}`))t[`${s}/${n.id}`]={value:ue.tuple(ue.Type.IDENT,H.parseIdent(s)),children:{ID:typeof n.id<"u"&&{label:"ID",value:ue.tuple(ue.Type.ID,n.id)},Issue:{label:"Issue",value:ue.tuple(ue.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:ue.tuple(ue.Type.URL,n.url)},Severity:{label:"Severity",value:ue.tuple(ue.Type.NO_HINT,n.severity)},"Vulnerable Versions":{label:"Vulnerable Versions",value:ue.tuple(ue.Type.RANGE,n.vulnerable_versions)},"Tree Versions":{label:"Tree Versions",children:[...n.versions].sort(ZDe.default.compare).map(c=>({value:ue.tuple(ue.Type.REFERENCE,c)}))},Dependents:{label:"Dependents",children:qe.sortMap(n.dependents,c=>H.stringifyLocator(c)).map(c=>({value:ue.tuple(ue.Type.LOCATOR,c)}))}}};return r}function mJ(e,t,{all:r,environment:s}){let a=[],n=r?e.workspaces:[t],c=["all","production"].includes(s),f=["all","development"].includes(s);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!f:!c)||a.push({workspace:p,dependency:h});return a}function yJ(e,t,{recursive:r}){let s=new Map,a=new Set,n=[],c=e.configuration.makeResolver(),f={project:e,resolver:c},p=(h,E)=>{let C=e.storedResolutions.get(E.descriptorHash);if(typeof C>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(C))a.add(C);else return;let S=e.storedPackages.get(C);if(typeof S>"u")throw new Error("Assertion failed: The package should have been registered");let x=H.ensureDevirtualizedDescriptor(E);if(c.supportsDescriptor(x,f)){let R=c.getResolutionDependencies(x,f);if(Object.keys(R).length>0)for(let N of Object.values(R))p(h,N)}if(H.ensureDevirtualizedLocator(S).reference.startsWith("npm:")&&S.version!==null){let R=H.stringifyIdent(S),N=qe.getMapWithDefault(s,R);qe.getArrayWithDefault(N,S.version).push(h)}if(r)for(let R of S.dependencies.values())n.push([S,R])};for(let{workspace:h,dependency:E}of t)n.push([h.anchoredLocator,E]);for(;n.length>0;){let[h,E]=n.shift();p(h,E)}return s}var C1=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=he.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=he.String("--environment","all",{description:"Which environments to cover",validator:Qs($D)});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=he.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=he.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:Qs(eP)});this.excludes=he.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=he.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}static{this.paths=[["npm","audit"]]}static{this.usage=st.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 ${I1.map(r=>`\`${r}\``).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. + + If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. + + If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` 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"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=mJ(s,a,{all:this.all,environment:this.environment}),c=yJ(s,n,{recursive:this.recursive}),f=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[N,U]of c)f.some(K=>EJ.default.isMatch(N,K))||(p[N]=[...U.keys()]);let h=gn.getAuditRegistry({configuration:r}),E,C=await fA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=Qr.post("/-/npm/v1/security/advisories/bulk",p,{authType:Qr.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([$,ie])=>{let fe=await Qr.getPackageMetadata(H.parseIdent($),{project:s});return qe.mapAndFilter(ie,le=>{let{deprecated:ge}=fe.versions[le];return ge?[$,le,ge]:qe.mapAndFilter.skip})})),K=await N;for(let[$,ie,fe]of U.flat(1))Object.hasOwn(K,$)&&K[$].some(le=>kr.satisfiesWithPrereleases(ie,le.vulnerable_versions))||(K[$]??=[],K[$].push({id:`${$} (deprecation)`,title:(typeof fe=="string"?fe:"").trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:ie}));E=K});if(C.hasErrors())return C.exitCode();let S=dJ(this.severity),x=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),I=Object.create(null);for(let[N,U]of Object.entries(E)){let K=U.filter($=>!EJ.default.isMatch(`${$.id}`,x)&&S.has($.severity));K.length>0&&(I[N]=K.map($=>{let ie=c.get(N);if(typeof ie>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let fe=[...ie.keys()].filter(ge=>kr.satisfiesWithPrereleases(ge,$.vulnerable_versions)),le=new Map;for(let ge of fe)for(let pe of ie.get(ge))le.set(pe.locatorHash,pe);return{...$,versions:fe,dependents:[...le.values()]}}))}let R=Object.keys(I).length>0;return R?(ts.emitTree(gJ(I),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Ft.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,"No audit suggestions")}),R?1:0)}};Ge();Ge();bt();jt();var IJ=et(hi()),CJ=Ce("util"),w1=class extends ft{constructor(){super(...arguments);this.fields=he.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=he.Rest()}static{this.paths=[["npm","info"]]}static{this.usage=st.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches 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 or to the corresponding tagged version. 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 information.\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 all available information about react@next","yarn npm info react@next"],["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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],c=!1,f=await Ft.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let ie=s.topLevelWorkspace;if(!ie.manifest.name)throw new ot(`Missing ${ue.pretty(r,"name",ue.Type.CODE)} field in ${Ae.fromPortablePath(Y.join(ie.cwd,yr.manifest))}`);E=H.makeDescriptor(ie.manifest.name,"unknown")}else E=H.parseDescriptor(h);let C=Qr.getIdentUrl(E),S=wJ(await Qr.get(C,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:Qr.customPackageError})),x=Object.keys(S.versions).sort(IJ.default.compareLoose),R=S["dist-tags"].latest||x[x.length-1],N=kr.validRange(E.range);if(N){let ie=IJ.default.maxSatisfying(x,N);ie!==null?R=ie:(p.reportWarning(0,`Unmet range ${H.prettyRange(r,E.range)}; falling back to the latest version`),c=!0)}else Object.hasOwn(S["dist-tags"],E.range)?R=S["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${H.prettyRange(r,E.range)}; falling back to the latest version`),c=!0);let U=S.versions[R],K={...S,...U,version:R,versions:x},$;if(a!==null){$={};for(let ie of a){let fe=K[ie];if(typeof fe<"u")$[ie]=fe;else{p.reportWarning(1,`The ${ue.pretty(r,ie,ue.Type.CODE)} field doesn't exist inside ${H.prettyIdent(r,E)}'s information`),c=!0;continue}}}else this.json||(delete K.dist,delete K.readme,delete K.users),$=K;p.reportJson($),this.json||n.push($)}});CJ.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||c)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,CJ.inspect)(p,{depth:1/0,colors:!0,compact:!1})} +`);return f.exitCode()}};function wJ(e){if(Array.isArray(e)){let t=[];for(let r of e)r=wJ(r),r&&t.push(r);return t}else if(typeof e=="object"&&e!==null){let t={};for(let r of Object.keys(e)){if(r.startsWith("_"))continue;let s=wJ(e[r]);s&&(t[r]=s)}return t}else return e||null}Ge();Ge();jt();var BJ=et(Xv()),B1=class extends ft{constructor(){super(...arguments);this.scope=he.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=he.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=he.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"});this.webLogin=he.Boolean("--web-login",{description:"Enable web login"})}static{this.paths=[["npm","login"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=await BL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Ft.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let c=await cSt({registry:s,configuration:r,report:n,webLogin:this.webLogin,stdin:this.context.stdin,stdout:this.context.stdout});return await fSt(s,c,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};async function BL({scope:e,publish:t,configuration:r,cwd:s}){return e&&t?gn.getScopeRegistry(e,{configuration:r,type:gn.RegistryType.PUBLISH_REGISTRY}):e?gn.getScopeRegistry(e,{configuration:r}):t?gn.getPublishRegistry((await VI(r,s)).manifest,{configuration:r}):gn.getDefaultRegistry({configuration:r})}async function sSt(e,t){let r;try{r=await Qr.post("/-/v1/login",null,{configuration:t,registry:e,authType:Qr.AuthType.NO_AUTH,jsonResponse:!0,headers:{"npm-auth-type":"web"}})}catch{return null}return r}async function oSt(e,t){let r=await nn.request(e,null,{configuration:t,jsonResponse:!0});if(r.statusCode===202){let s=r.headers["retry-after"]??"1";return{type:"waiting",sleep:parseInt(s,10)}}return r.statusCode===200?{type:"success",token:r.body.token}:null}async function aSt({registry:e,configuration:t,report:r}){let s=await sSt(e,t);if(!s)return null;if(Ui.openUrl){r.reportInfo(0,"Starting the web login process..."),r.reportSeparator();let{openNow:a}=await(0,BJ.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open your browser now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});r.reportSeparator(),(!a||!await Ui.openUrl(s.loginUrl))&&(r.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice:"),r.reportWarning(0,ue.pretty(t,s.loginUrl,ue.Type.URL)),r.reportSeparator())}for(;;){let a=await oSt(s.doneUrl,t);if(a===null)return null;if(a.type==="waiting")await new Promise(n=>setTimeout(n,a.sleep*1e3));else return a.token}}var lSt=["https://registry.yarnpkg.com","https://registry.npmjs.org"];async function cSt(e){if(e.webLogin??lSt.includes(e.registry)){let t=await aSt(e);if(t!==null)return t}return await uSt(e)}async function uSt({registry:e,configuration:t,report:r,stdin:s,stdout:a}){let n=await ASt({configuration:t,registry:e,report:r,stdin:s,stdout:a}),c=`/-/user/org.couchdb.user:${encodeURIComponent(n.name)}`,f={_id:`org.couchdb.user:${n.name}`,name:n.name,password:n.password,type:"user",roles:[],date:new Date().toISOString()},p={attemptedAs:n.name,configuration:t,registry:e,jsonResponse:!0,authType:Qr.AuthType.NO_AUTH};try{return(await Qr.put(c,f,p)).token}catch(x){if(!(x.originalError?.name==="HTTPError"&&x.originalError?.response.statusCode===409))throw x}let h={...p,authType:Qr.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${n.name}:${n.password}`).toString("base64")}`}},E=await Qr.get(c,h);for(let[x,I]of Object.entries(E))(!f[x]||x==="roles")&&(f[x]=I);let C=`${c}/-rev/${f._rev}`;return(await Qr.put(C,f,h)).token}async function fSt(e,t,{alwaysAuth:r,scope:s}){let a=c=>f=>{let p=qe.isIndexableObject(f)?f:{},h=p[c],E=qe.isIndexableObject(h)?h:{};return{...p,[c]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:t}}},n=s?{npmScopes:a(s)}:{npmRegistries:a(e)};return await Je.updateHomeConfiguration(n)}async function ASt({configuration:e,registry:t,report:r,stdin:s,stdout:a}){r.reportInfo(0,`Logging in to ${ue.pretty(e,t,ue.Type.URL)}`);let n=!1;if(t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),e.env.YARN_IS_TEST_ENV)return{name:e.env.YARN_INJECT_NPM_USER||"",password:e.env.YARN_INJECT_NPM_PASSWORD||""};let c=await(0,BJ.prompt)([{type:"input",name:"name",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a}]);return r.reportSeparator(),c}Ge();Ge();jt();var v1=new Set(["npmAuthIdent","npmAuthToken"]),S1=class extends ft{constructor(){super(...arguments);this.scope=he.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=he.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=he.Boolean("-A,--all",!1,{description:"Logout of all registries"})}static{this.paths=[["npm","logout"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=async()=>{let n=await BL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),c=await Je.find(this.context.cwd,this.context.plugins),f=H.makeIdent(this.scope??null,"pkg");return!gn.getAuthConfiguration(n,{configuration:c,ident:f}).get("npmAuthToken")};return(await Ft.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await hSt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await XDe("npmScopes",this.scope),await s()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let c=await BL({configuration:r,cwd:this.context.cwd,publish:this.publish});await XDe("npmRegistries",c),await s()?n.reportInfo(0,`Successfully logged out from ${c}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};function pSt(e,t){let r=e[t];if(!qe.isIndexableObject(r))return!1;let s=new Set(Object.keys(r));if([...v1].every(n=>!s.has(n)))return!1;for(let n of v1)s.delete(n);if(s.size===0)return e[t]=void 0,!0;let a={...r};for(let n of v1)delete a[n];return e[t]=a,!0}async function hSt(){let e=t=>{let r=!1,s=qe.isIndexableObject(t)?{...t}:{};s.npmAuthToken&&(delete s.npmAuthToken,r=!0);for(let a of Object.keys(s))pSt(s,a)&&(r=!0);if(Object.keys(s).length!==0)return r?s:t};return await Je.updateHomeConfiguration({npmRegistries:e,npmScopes:e})}async function XDe(e,t){return await Je.updateHomeConfiguration({[e]:r=>{let s=qe.isIndexableObject(r)?r:{};if(!Object.hasOwn(s,t))return r;let a=s[t],n=qe.isIndexableObject(a)?a:{},c=new Set(Object.keys(n));if([...v1].every(p=>!c.has(p)))return r;for(let p of v1)c.delete(p);if(c.size===0)return Object.keys(s).length===1?void 0:{...s,[t]:void 0};let f={};for(let p of v1)f[p]=void 0;return{...s,[t]:{...n,...f}}}})}Ge();bt();jt();var b1=class extends ft{constructor(){super(...arguments);this.access=he.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=he.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=he.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=he.String("--otp",{description:"The OTP token to use with the command"});this.provenance=he.Boolean("--provenance",{description:"Generate provenance for the package. Only available in GitHub Actions and GitLab CI. Can be set globally through the `npmPublishProvenance` setting or the `YARN_NPM_CONFIG_PROVENANCE` environment variable, or per-package through the `publishConfig.provenance` field in package.json."});this.dryRun=he.Boolean("-n,--dry-run",!1,{description:"Show what would be published without actually publishing"});this.json=he.Boolean("--json",!1,{description:"Output the result in JSON format"});this.staged=he.Boolean("--staged",!1,{description:"Stage the package for later approval instead of publishing it immediately"})}static{this.paths=[["npm","publish"]]}static{this.usage=st.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 overridden 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\n If the `--staged` flag is set, the package will be staged for later approval instead of being published immediately. Staged publishing does not require 2FA, allowing automated workflows to stage packages while deferring proof-of-presence to the approval step. Use `yarn npm stage list`, `yarn npm stage approve`, and `yarn npm stage reject` to manage staged packages.\n ',examples:[["Publish the active workspace","yarn npm publish"],["Stage the active workspace for later approval","yarn npm publish --staged"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);if(a.manifest.private)throw new ot("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new ot("Workspaces must have valid names and versions to be published on an external registry");await s.restoreInstallState();let n=a.manifest.name,c=a.manifest.version,f=gn.getPublishRegistry(a.manifest,{configuration:r});return(await Ft.start({configuration:r,stdout:this.context.stdout,json:this.json},async h=>{let E=this.staged?"Staging":"Publishing",C=ue.pretty(r,f,ue.Type.URL);if(h.reportInfo(0,`${E} to ${C} with tag ${this.tag}`),this.tolerateRepublish)try{let S=await Qr.get(Qr.getIdentUrl(n),{configuration:r,registry:f,ident:n,jsonResponse:!0});if(!Object.hasOwn(S,"versions"))throw new Lt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(S.versions,c)){let x=`Registry already knows about version ${c}; skipping.`;h.reportWarning(0,x),h.reportJson({name:H.stringifyIdent(n),version:c,registry:f,warning:x,skipped:!0});return}}catch(S){if(S.originalError?.response?.statusCode!==404)throw S}await wn.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await CA.prepareForPack(a,{report:h},async()=>{let S=await CA.genPackList(a);for(let fe of S)h.reportInfo(null,Ae.fromPortablePath(fe)),h.reportJson({file:Ae.fromPortablePath(fe)});let x=await CA.genPackStream(a,S),I=await qe.bufferStream(x),R=await E1.getGitHead(a.cwd),N=!1,U="";this.provenance?(N=!0,U=`Generating provenance statement because the ${ue.pretty(r,"--provenance",ue.Type.CODE)} flag is set.`):this.provenance===!1?(N=!1,U=`Skipping provenance statement because the ${ue.pretty(r,"--no-provenance",ue.Type.CODE)} flag is set.`):a.manifest.publishConfig&&"provenance"in a.manifest.publishConfig?(N=!!a.manifest.publishConfig.provenance,U=N?`Generating provenance statement because the ${ue.pretty(r,"publishConfig.provenance",ue.Type.CODE)} field is set.`:`Skipping provenance statement because the ${ue.pretty(r,"publishConfig.provenance",ue.Type.CODE)} field is set to false.`):r.get("npmPublishProvenance")&&(N=!0,U=`Generating provenance statement because the ${ue.pretty(r,"npmPublishProvenance",ue.Type.CODE)} setting is set.`),U&&(h.reportInfo(null,U),h.reportJson({type:"provenance",enabled:N,provenanceMessage:U}));let K=await E1.makePublishBody(a,I,{access:this.access,tag:this.tag,registry:f,gitHead:R,provenance:N}),$;if(!this.dryRun)if(this.staged){let fe=`/-/stage/package${Qr.getIdentUrl(n)}`;$=(await Qr.post(fe,K,{configuration:r,registry:f,ident:n,jsonResponse:!0,allowOidc:!!(process.env.CI&&(process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI))})).stageId}else await Qr.put(Qr.getIdentUrl(n),K,{configuration:r,registry:f,ident:n,otp:this.otp,jsonResponse:!0,allowOidc:!!(process.env.CI&&(process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI))});let ie=this.dryRun?this.staged?"Package archive not staged (dry run)":"Package archive not published (dry run)":this.staged?`Package archive staged for approval${$?` (run ${ue.pretty(r,`yarn npm stage approve ${$}`,ue.Type.CODE)} to approve)`:""}`:"Package archive published";h.reportInfo(0,ie),h.reportJson({name:H.stringifyIdent(n),version:c,registry:f,tag:this.tag||"latest",files:S.map(fe=>Ae.fromPortablePath(fe)),access:this.access||null,dryRun:this.dryRun,staged:this.staged,published:!this.dryRun&&!this.staged,...$&&{stageId:$},message:ie,provenance:!!N})})})).exitCode()}};Ge();jt();Jo();var D1=class extends ft{constructor(){super(...arguments);this.stageId=he.String({validator:ld(Jf(),[Sp(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)])});this.otp=he.String("--otp",{description:"The OTP token to use with the command"})}static{this.paths=[["npm","stage","approve"]]}static{this.usage=st.Usage({category:"Npm-related commands",description:"approve a staged package version for publishing",details:"\n This command will approve a staged package version, publishing it to the npm registry. This operation requires 2FA and will prompt for an OTP token if one is not provided via the `--otp` flag.\n ",examples:[["Approve a staged package","yarn npm stage approve 1de6f3db-2ed9-4d72-b3dd-8f0e2b474a2f"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=gn.getDefaultRegistry({configuration:r,type:gn.RegistryType.PUBLISH_REGISTRY});return(await Ft.start({configuration:r,stdout:this.context.stdout},async n=>{let c=ue.pretty(r,this.stageId,ue.Type.CODE);n.reportInfo(0,`Approving staged package ${ue.pretty(r,c,ue.Type.CODE)}...`),n.reportSeparator(),await Qr.post(`/-/stage/${this.stageId}/approve`,null,{configuration:r,registry:s,otp:this.otp,jsonResponse:!0,authType:Qr.AuthType.ALWAYS_AUTH}),n.reportInfo(0,`Staged package ${ue.pretty(r,c,ue.Type.CODE)} approved and published successfully.`)})).exitCode()}};Ge();jt();var P1=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=he.String({required:!1})}static{this.paths=[["npm","stage","list"]]}static{this.usage=st.Usage({category:"Npm-related commands",description:"list all staged package versions",details:` + This command will list all staged package versions awaiting approval on the npm registry. + + If a package name is provided, only staged versions of that package will be listed. + `,examples:[["List all staged packages","yarn npm stage list"],["List staged versions of a specific package","yarn npm stage list my-pkg"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s=gn.getDefaultRegistry({configuration:r,type:gn.RegistryType.PUBLISH_REGISTRY}),a=await dSt(r,s,this.package??void 0);if(await Ft.start({configuration:r,stdout:this.context.stdout,json:this.json,includeFooter:!1,includePrefix:!1},async c=>{a.length>0?(c.reportInfo(0,`The following packages are awaiting approval. Use ${ue.pretty(r,"yarn npm stage approve ",ue.Type.CODE)} to approve them.`),c.reportSeparator()):this.package?c.reportInfo(0,`No staged versions found for package ${this.package}`):c.reportInfo(0,"No staged packages found")}),a.length===0)return;let n={children:a.map(c=>{let f=H.parseIdent(c.packageName);return{value:ue.tuple(ue.Type.RESOLUTION,{descriptor:H.makeDescriptor(f,c.tag),locator:H.makeLocator(f,c.version)}),children:{ID:{label:"ID",value:ue.tuple(ue.Type.CODE,c.id)},Staged:{label:"Staged on",value:ue.tuple(ue.Type.NO_HINT,c.createdAt)}}}})};ts.emitTree(n,{configuration:r,json:this.json,stdout:this.context.stdout,separators:1})}};async function dSt(e,t,r){let s=[],a=0,n=100;for(;;){let c={page:String(a),perPage:String(n)};r&&(c.package=r);let f=new URLSearchParams(c).toString(),p=await Qr.get(`/-/stage?${f}`,{configuration:e,registry:t,jsonResponse:!0,authType:Qr.AuthType.ALWAYS_AUTH});if(s.push(...p.items),s.length>=p.total||p.items.length{let c=ue.pretty(r,this.stageId,ue.Type.CODE);n.reportInfo(0,`Rejecting staged package ${ue.pretty(r,c,ue.Type.CODE)}...`),n.reportSeparator(),await Qr.del(`/-/stage/${this.stageId}`,{configuration:r,registry:s,otp:this.otp,authType:Qr.AuthType.ALWAYS_AUTH}),n.reportInfo(0,`Staged package ${ue.pretty(r,c,ue.Type.CODE)} has been rejected.`)})).exitCode()}};Ge();jt();var $De=et(hi());Ge();bt();jt();var k1=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=he.String({required:!1})}static{this.paths=[["npm","tag","list"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n;if(typeof this.package<"u")n=H.parseIdent(this.package);else{if(!a)throw new ar(s.cwd,this.context.cwd);if(!a.manifest.name)throw new ot(`Missing 'name' field in ${Ae.fromPortablePath(Y.join(a.cwd,yr.manifest))}`);n=a.manifest.name}let c=await rP(n,r),p={children:qe.sortMap(Object.entries(c),([h])=>h).map(([h,E])=>({value:ue.tuple(ue.Type.RESOLUTION,{descriptor:H.makeDescriptor(n,h),locator:H.makeLocator(n,E)})}))};return ts.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function rP(e,t){let r=`/-/package${Qr.getIdentUrl(e)}/dist-tags`;return Qr.get(r,{configuration:t,ident:e,jsonResponse:!0,customErrorMessage:Qr.customPackageError})}var Q1=class extends ft{constructor(){super(...arguments);this.package=he.String();this.tag=he.String()}static{this.paths=[["npm","tag","add"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=H.parseDescriptor(this.package,!0),c=n.range;if(!$De.default.valid(c))throw new ot(`The range ${ue.pretty(r,n.range,ue.Type.RANGE)} must be a valid semver version`);let f=gn.getPublishRegistry(a.manifest,{configuration:r}),p=ue.pretty(r,n,ue.Type.IDENT),h=ue.pretty(r,c,ue.Type.RANGE),E=ue.pretty(r,this.tag,ue.Type.CODE);return(await Ft.start({configuration:r,stdout:this.context.stdout},async S=>{let x=await rP(n,r);Object.hasOwn(x,this.tag)&&x[this.tag]===c&&S.reportWarning(0,`Tag ${E} is already set to version ${h}`);let I=`/-/package${Qr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Qr.put(I,c,{configuration:r,registry:f,ident:n,jsonRequest:!0,jsonResponse:!0}),S.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ge();jt();var T1=class extends ft{constructor(){super(...arguments);this.package=he.String();this.tag=he.String()}static{this.paths=[["npm","tag","remove"]]}static{this.usage=st.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"]]})}async execute(){if(this.tag==="latest")throw new ot("The 'latest' tag cannot be removed.");let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=H.parseIdent(this.package),c=gn.getPublishRegistry(a.manifest,{configuration:r}),f=ue.pretty(r,this.tag,ue.Type.CODE),p=ue.pretty(r,n,ue.Type.IDENT),h=await rP(n,r);if(!Object.hasOwn(h,this.tag))throw new ot(`${f} is not a tag of package ${p}`);return(await Ft.start({configuration:r,stdout:this.context.stdout},async C=>{let S=`/-/package${Qr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Qr.del(S,{configuration:r,registry:c,ident:n,jsonResponse:!0}),C.reportInfo(0,`Tag ${f} removed from package ${p}`)})).exitCode()}};Ge();Ge();jt();var R1=class extends ft{constructor(){super(...arguments);this.scope=he.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=he.Boolean("--publish",!1,{description:"Print username for the publish registry"})}static{this.paths=[["npm","whoami"]]}static{this.usage=st.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"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),s;return this.scope&&this.publish?s=gn.getScopeRegistry(this.scope,{configuration:r,type:gn.RegistryType.PUBLISH_REGISTRY}):this.scope?s=gn.getScopeRegistry(this.scope,{configuration:r}):this.publish?s=gn.getPublishRegistry((await VI(r,this.context.cwd)).manifest,{configuration:r}):s=gn.getDefaultRegistry({configuration:r}),(await Ft.start({configuration:r,stdout:this.context.stdout},async n=>{let c;try{c=await Qr.get("/-/whoami",{configuration:r,registry:s,authType:Qr.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?H.makeIdent(this.scope,""):void 0})}catch(f){if(f.response?.statusCode===401||f.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw f}n.reportInfo(0,c.username)})).exitCode()}};var gSt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmPublishProvenance:{description:"Whether to generate provenance for the published packages",type:"BOOLEAN",default:!1},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[C1,w1,B1,S1,b1,D1,P1,x1,Q1,k1,T1,R1]},mSt=gSt;var QJ={};Vt(QJ,{PatchCommand:()=>U1,PatchCommitCommand:()=>M1,PatchFetcher:()=>aP,PatchResolver:()=>lP,default:()=>OSt,patchUtils:()=>Cy});Ge();Ge();bt();iA();var Cy={};Vt(Cy,{applyPatchFile:()=>SL,diffFolders:()=>xJ,ensureUnpatchedDescriptor:()=>SJ,ensureUnpatchedLocator:()=>DL,extractPackageToDisk:()=>PJ,extractPatchFlags:()=>oPe,isParentRequired:()=>DJ,isPatchDescriptor:()=>bL,isPatchLocator:()=>Fg,loadPatchFiles:()=>oP,makeDescriptor:()=>PL,makeLocator:()=>bJ,makePatchHash:()=>kJ,parseDescriptor:()=>iP,parseLocator:()=>sP,parsePatchFile:()=>nP,unpatchDescriptor:()=>TSt,unpatchLocator:()=>RSt});Ge();bt();Ge();bt();var ySt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function F1(e){return Y.relative(wt.root,Y.resolve(wt.root,Ae.toPortablePath(e)))}function ESt(e){let t=e.trim().match(ySt);if(!t)throw new Error(`Bad header line: '${e}'`);return{original:{start:Math.max(Number(t[1]),1),length:Number(t[3]||1)},patched:{start:Math.max(Number(t[4]),1),length:Number(t[6]||1)}}}var ISt=420,CSt=493;var ePe=()=>({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}),wSt=e=>({header:ESt(e),parts:[]}),BSt={"@":"header","-":"deletion","+":"insertion"," ":"context","\\":"pragma",undefined:"context"};function vSt(e){let t=[],r=ePe(),s="parsing header",a=null,n=null;function c(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function f(){c(),t.push(r),r=ePe()}for(let p=0;p0?"patch":"mode change",K=null;switch(U){case"rename":{if(!E||!C)throw new Error("Bad parser state: rename from & to not given");t.push({type:"rename",semverExclusivity:s,fromPath:F1(E),toPath:F1(C)}),K=C}break;case"file deletion":{let $=a||I;if(!$)throw new Error("Bad parse state: no path given for file deletion");t.push({type:"file deletion",semverExclusivity:s,hunk:N&&N[0]||null,path:F1($),mode:vL(p),hash:S})}break;case"file creation":{let $=n||R;if(!$)throw new Error("Bad parse state: no path given for file creation");t.push({type:"file creation",semverExclusivity:s,hunk:N&&N[0]||null,path:F1($),mode:vL(h),hash:x})}break;case"patch":case"mode change":K=R||n;break;default:qe.assertNever(U);break}K&&c&&f&&c!==f&&t.push({type:"mode change",semverExclusivity:s,path:F1(K),oldMode:vL(c),newMode:vL(f)}),K&&N&&N.length&&t.push({type:"patch",semverExclusivity:s,path:F1(K),hunks:N,beforeHash:S,afterHash:x})}if(t.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return t}function vL(e){let t=parseInt(e,8)&511;if(t!==ISt&&t!==CSt)throw new Error(`Unexpected file mode string: ${e}`);return t}function nP(e){let t=e.split(/\n/g);return t[t.length-1]===""&&t.pop(),SSt(vSt(t))}function bSt(e){let t=0,r=0;for(let{type:s,lines:a}of e.parts)switch(s){case"context":r+=a.length,t+=a.length;break;case"deletion":t+=a.length;break;case"insertion":r+=a.length;break;default:qe.assertNever(s);break}if(t!==e.header.original.length||r!==e.header.patched.length){let s=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${s(e.header.original.length)} ${s(e.header.patched.length)} @@, got @@ ${s(t)} ${s(r)} @@)`)}}Ge();bt();var N1=class extends Error{constructor(r,s){super(`Cannot apply hunk #${r+1}`);this.hunk=s}};async function O1(e,t,r){let s=await e.lstatPromise(t),a=await r();typeof a<"u"&&(t=a),await e.lutimesPromise(t,s.atime,s.mtime)}async function SL(e,{baseFs:t=new Kn,dryRun:r=!1,version:s=null}={}){for(let a of e)if(!(a.semverExclusivity!==null&&s!==null&&!kr.satisfiesWithPrereleases(s,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!t.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await O1(t,Y.dirname(a.path),async()=>{await t.unlinkPromise(a.path)});break;case"rename":if(r){if(!t.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await O1(t,Y.dirname(a.fromPath),async()=>{await O1(t,Y.dirname(a.toPath),async()=>{await O1(t,a.fromPath,async()=>(await t.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(t.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` +`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await t.mkdirpPromise(Y.dirname(a.path),{chmod:493,utimes:[pi.SAFE_TIME,pi.SAFE_TIME]}),await t.writeFilePromise(a.path,n,{mode:a.mode}),await t.utimesPromise(a.path,pi.SAFE_TIME,pi.SAFE_TIME)}break;case"patch":await O1(t,a.path,async()=>{await xSt(a,{baseFs:t,dryRun:r})});break;case"mode change":{let c=(await t.statPromise(a.path)).mode;if(tPe(a.newMode)!==tPe(c))continue;await O1(t,a.path,async()=>{await t.chmodPromise(a.path,a.newMode)})}break;default:qe.assertNever(a);break}}function tPe(e){return(e&64)>0}function rPe(e){return e.replace(/\s+$/,"")}function PSt(e,t){return rPe(e)===rPe(t)}async function xSt({hunks:e,path:t},{baseFs:r,dryRun:s=!1}){let a=await r.statSync(t).mode,c=(await r.readFileSync(t,"utf8")).split(/\n/),f=[],p=0,h=0;for(let C of e){let S=Math.max(h,C.header.patched.start+p),x=Math.max(0,S-h),I=Math.max(0,c.length-S-C.header.original.length),R=Math.max(x,I),N=0,U=0,K=null;for(;N<=R;){if(N<=x&&(U=S-N,K=nPe(C,c,U),K!==null)){N=-N;break}if(N<=I&&(U=S+N,K=nPe(C,c,U),K!==null))break;N+=1}if(K===null)throw new N1(e.indexOf(C),C);f.push(K),p+=N,h=U+C.header.original.length}if(s)return;let E=0;for(let C of f)for(let S of C)switch(S.type){case"splice":{let x=S.index+E;c.splice(x,S.numToDelete,...S.linesToInsert),E+=S.linesToInsert.length-S.numToDelete}break;case"pop":c.pop();break;case"push":c.push(S.line);break;default:qe.assertNever(S);break}await r.writeFilePromise(t,c.join(` +`),{mode:a})}function nPe(e,t,r){let s=[];for(let a of e.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let c=t[r];if(c==null||!PSt(c,n))return null;r+=1}a.type==="deletion"&&(s.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&s.push({type:"push",line:""}))}break;case"insertion":s.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&s.push({type:"pop"});break;default:qe.assertNever(a.type);break}return s}var QSt=/^builtin<([^>]+)>$/;function L1(e,t){let{protocol:r,source:s,selector:a,params:n}=H.parseRange(e);if(r!=="patch:")throw new Error("Invalid patch range");if(s===null)throw new Error("Patch locators must explicitly define their source");let c=a?a.split(/&/).map(E=>Ae.toPortablePath(E)):[],f=n&&typeof n.locator=="string"?H.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=t(s);return{parentLocator:f,sourceItem:h,patchPaths:c,sourceVersion:p}}function bL(e){return e.range.startsWith("patch:")}function Fg(e){return e.reference.startsWith("patch:")}function iP(e){let{sourceItem:t,...r}=L1(e.range,H.parseDescriptor);return{...r,sourceDescriptor:t}}function sP(e){let{sourceItem:t,...r}=L1(e.reference,H.parseLocator);return{...r,sourceLocator:t}}function TSt(e){let{sourceItem:t}=L1(e.range,H.parseDescriptor);return t}function RSt(e){let{sourceItem:t}=L1(e.reference,H.parseLocator);return t}function SJ(e){if(!bL(e))return e;let{sourceItem:t}=L1(e.range,H.parseDescriptor);return t}function DL(e){if(!Fg(e))return e;let{sourceItem:t}=L1(e.reference,H.parseLocator);return t}function iPe({parentLocator:e,sourceItem:t,patchPaths:r,sourceVersion:s,patchHash:a},n){let c=e!==null?{locator:H.stringifyLocator(e)}:{},f=typeof s<"u"?{version:s}:{},p=typeof a<"u"?{hash:a}:{};return H.makeRange({protocol:"patch:",source:n(t),selector:r.join("&"),params:{...f,...p,...c}})}function PL(e,{parentLocator:t,sourceDescriptor:r,patchPaths:s}){return H.makeDescriptor(e,iPe({parentLocator:t,sourceItem:r,patchPaths:s},H.stringifyDescriptor))}function bJ(e,{parentLocator:t,sourcePackage:r,patchPaths:s,patchHash:a}){return H.makeLocator(e,iPe({parentLocator:t,sourceItem:r,sourceVersion:r.version,patchPaths:s,patchHash:a},H.stringifyLocator))}function sPe({onAbsolute:e,onRelative:t,onProject:r,onBuiltin:s},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let c=a.match(QSt);return c!==null?s(c[1]):a.startsWith("~/")?r(a.slice(2)):Y.isAbsolute(a)?e(a):t(a)}function oPe(e){let t=e.lastIndexOf("!");return{optional:(t!==-1?new Set(e.slice(0,t).split(/!/)):new Set).has("optional")}}function DJ(e){return sPe({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},e)}async function oP(e,t,r){let s=e!==null?await r.fetcher.fetch(e,r):null,a=s&&s.localPath?{packageFs:new Pn(wt.root),prefixPath:Y.relative(wt.root,s.localPath)}:s;s&&s!==a&&s.releaseFs&&s.releaseFs();let n=await qe.releaseAfterUseAsync(async()=>await Promise.all(t.map(async c=>{let f=oPe(c),p=await sPe({onAbsolute:async h=>await ae.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(Y.join(a.prefixPath,h),"utf8")},onProject:async h=>await ae.readFilePromise(Y.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},c);return{...f,source:p}})));for(let c of n)typeof c.source=="string"&&(c.source=c.source.replace(/\r\n?/g,` +`));return n}async function PJ(e,{cache:t,project:r}){let s=r.storedPackages.get(e.locatorHash);if(typeof s>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=DL(e),n=r.storedChecksums,c=new Qi,f=await ae.mktempPromise(),p=Y.join(f,"source"),h=Y.join(f,"user"),E=Y.join(f,".yarn-patch.json"),C=r.configuration.makeFetcher(),S=[];try{let x,I;if(e.locatorHash===a.locatorHash){let R=await C.fetch(e,{cache:t,project:r,fetcher:C,checksums:n,report:c});S.push(()=>R.releaseFs?.()),x=R,I=R}else x=await C.fetch(e,{cache:t,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>x.releaseFs?.()),I=await C.fetch(e,{cache:t,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>I.releaseFs?.());await Promise.all([ae.copyPromise(p,x.prefixPath,{baseFs:x.packageFs}),ae.copyPromise(h,I.prefixPath,{baseFs:I.packageFs}),ae.writeJsonPromise(E,{locator:H.stringifyLocator(e),version:s.version})])}finally{for(let x of S)x()}return ae.detachTemp(f),h}async function xJ(e,t){let r=Ae.fromPortablePath(e).replace(/\\/g,"/"),s=Ae.fromPortablePath(t).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Yr.execvp("git",["-c","core.safecrlf=false","-c","core.quotePath=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,s],{cwd:Ae.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.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': +${n}`);let c=r.startsWith("/")?f=>f.slice(1):f=>f;return a.replace(new RegExp(`(a|b)(${qe.escapeRegExp(`/${c(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${qe.escapeRegExp(`/${c(s)}/`)}`,"g"),"$1/").replace(new RegExp(qe.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(qe.escapeRegExp(`${s}/`),"g"),"")}function kJ(e,t){let r=[];for(let{source:s}of e){if(s===null)continue;let a=nP(s);for(let n of a){let{semverExclusivity:c,...f}=n;c!==null&&t!==null&&!kr.satisfiesWithPrereleases(t,c)||r.push(JSON.stringify(f))}}return Mn.makeHash(`${3}`,...r).slice(0,6)}Ge();function aPe(e,{configuration:t,report:r}){for(let s of e.parts)for(let a of s.lines)switch(s.type){case"context":r.reportInfo(null,` ${ue.pretty(t,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${ue.pretty(t,a,ue.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${ue.pretty(t,a,ue.Type.ADDED)}`);break;default:qe.assertNever(s.type)}}function FSt(e){return e instanceof Error&&"code"in e&&e.code==="ENOENT"}var aP=class{supports(t,r){return!!Fg(t)}getLocalPath(t,r){return null}async fetch(t,r){let s=r.checksums.get(t.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(t,s,{onHit:()=>r.report.reportCacheHit(t),onMiss:()=>r.report.reportCacheMiss(t,`${H.prettyLocator(r.project.configuration,t)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(t,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:H.getIdentVendorPath(t),localPath:this.getLocalPath(t,r),checksum:c}}async patchPackage(t,r){let{parentLocator:s,sourceLocator:a,sourceVersion:n,patchPaths:c}=sP(t),f=await oP(s,c,r),p=await ae.mktempPromise(),h=Y.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),C=H.getIdentVendorPath(t),S=new hs(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await qe.releaseAfterUseAsync(async()=>{await S.copyPromise(C,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),S.saveAndClose();for(let{source:x,optional:I}of f){if(x===null)continue;let R=new hs(h,{level:r.project.configuration.get("compressionLevel")}),N=new Pn(Y.resolve(wt.root,C),{baseFs:R});try{await SL(nP(x),{baseFs:N,version:n})}catch(U){let K=U instanceof N1?U:null;if(!(K!==null||I&&FSt(U)))throw U;let ie=r.project.configuration.get("enableInlineHunks"),fe=K!==null&&!ie&&!I?" (set enableInlineHunks for details)":"",le=`${H.prettyLocator(r.project.configuration,t)}: ${U.message}${fe}`,ge=pe=>{K===null||!ie||aPe(K.hunk,{configuration:r.project.configuration,report:pe})};if(R.discardAndClose(),I){r.report.reportWarningOnce(66,le,{reportExtra:ge});continue}else throw new Lt(66,le,ge)}R.saveAndClose()}return new hs(h,{level:r.project.configuration.get("compressionLevel")})}};Ge();var lP=class{supportsDescriptor(t,r){return!!bL(t)}supportsLocator(t,r){return!!Fg(t)}shouldPersistResolution(t,r){return!1}bindDescriptor(t,r,s){let{patchPaths:a}=iP(t);return a.every(n=>!DJ(n))?t:H.bindDescriptor(t,{locator:H.stringifyLocator(r)})}getResolutionDependencies(t,r){let{sourceDescriptor:s}=iP(t);return{sourceDescriptor:r.project.configuration.normalizeDependency(s)}}async getCandidates(t,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=iP(t),c=await oP(a,n,s.fetchOptions),f=r.sourceDescriptor;if(typeof f>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=kJ(c,f.version);return[bJ(t,{parentLocator:a,sourcePackage:f,patchPaths:n,patchHash:p})]}async getSatisfying(t,r,s,a){let[n]=await this.getCandidates(t,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(t,r){let{sourceLocator:s}=sP(t);return{...await r.resolver.resolve(s,r),...t}}};Ge();bt();jt();var M1=class extends ft{constructor(){super(...arguments);this.save=he.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=he.String()}static{this.paths=[["patch-commit"]]}static{this.usage=st.Usage({description:"generate a patch out of a directory",details:"\n By default, 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 With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=Y.resolve(this.context.cwd,Ae.toPortablePath(this.patchFolder)),c=Y.join(n,"../source"),f=Y.join(n,"../.yarn-patch.json");if(!ae.existsSync(c))throw new ot("The argument folder didn't get created by 'yarn patch'");let p=await xJ(c,n),h=await ae.readJsonPromise(f),E=H.parseLocator(h.locator,!0);if(!s.storedPackages.has(E.locatorHash))throw new ot("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let C=r.get("patchFolder"),S=Y.join(C,`${H.slugifyLocator(E)}.patch`);await ae.mkdirPromise(C,{recursive:!0}),await ae.writeFilePromise(S,p);let x=[],I=new Map;for(let R of s.storedPackages.values()){if(H.isVirtualLocator(R))continue;let N=R.dependencies.get(E.identHash);if(!N)continue;let U=H.ensureDevirtualizedDescriptor(N),K=SJ(U),$=s.storedResolutions.get(K.descriptorHash);if(!$)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!s.storedPackages.get($))throw new Error("Assertion failed: Expected the package to have been registered");let fe=s.tryWorkspaceByLocator(R);if(fe)x.push(fe);else{let le=s.originalPackages.get(R.locatorHash);if(!le)throw new Error("Assertion failed: Expected the original package to have been registered");let ge=le.dependencies.get(N.identHash);if(!ge)throw new Error("Assertion failed: Expected the original dependency to have been registered");I.set(ge.descriptorHash,ge)}}for(let R of x)for(let N of _t.hardDependencies){let U=R.manifest[N].get(E.identHash);if(!U)continue;let K=PL(U,{parentLocator:null,sourceDescriptor:H.convertLocatorToDescriptor(E),patchPaths:[Y.join(yr.home,Y.relative(s.cwd,S))]});R.manifest[N].set(U.identHash,K)}for(let R of I.values()){let N=PL(R,{parentLocator:null,sourceDescriptor:H.convertLocatorToDescriptor(E),patchPaths:[Y.join(yr.home,Y.relative(s.cwd,S))]});s.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:H.stringifyIdent(N),description:R.range}},reference:N.range})}await s.persist()}};Ge();bt();jt();var U1=class extends ft{constructor(){super(...arguments);this.update=he.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=he.String()}static{this.paths=[["patch"]]}static{this.usage=st.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=H.parseLocator(this.package);if(c.reference==="unknown"){let f=qe.mapAndFilter([...s.storedPackages.values()],p=>p.identHash!==c.identHash?qe.mapAndFilter.skip:H.isVirtualLocator(p)?qe.mapAndFilter.skip:Fg(p)!==this.update?qe.mapAndFilter.skip:p);if(f.length===0)throw new ot("No package found in the project for the given locator");if(f.length>1)throw new ot(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${f.map(p=>` +- ${H.prettyLocator(r,p)}`).join("")}`);c=f[0]}if(!s.storedPackages.has(c.locatorHash))throw new ot("No package found in the project for the given locator");await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=DL(c),h=await PJ(c,{cache:n,project:s});f.reportJson({locator:H.stringifyLocator(p),path:Ae.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";f.reportInfo(0,`Package ${H.prettyLocator(r,p)} got extracted with success${E}!`),f.reportInfo(0,`You can now edit the following folder: ${ue.pretty(r,Ae.fromPortablePath(h),"magenta")}`),f.reportInfo(0,`Once you are done run ${ue.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${Ae.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};var NSt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[M1,U1],fetchers:[aP],resolvers:[lP]},OSt=NSt;var FJ={};Vt(FJ,{PnpmLinker:()=>uP,default:()=>GSt});Ge();bt();jt();var lPe=".package-map.json",uP=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(t,r){return this.isEnabled(r)}async findPackageLocation(t,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new ot(`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=a.pathsByLocator.get(t.locatorHash);if(typeof n>"u")throw new ot(`Couldn't find ${H.prettyLocator(r.project.configuration,t)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(t,r){if(!this.isEnabled(r))return null;let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new ot(`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=t.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let c=t,f=t;do{f=c,c=Y.dirname(f);let p=a.locatorByPath.get(f);if(p)return p}while(c!==f);return null}makeInstaller(t){return new TJ(t)}isEnabled(t){return t.project.configuration.get("nodeLinker")==="pnpm"}},TJ=class{constructor(t){this.opts=t;this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.packageMapNodesByLocator=new Map;this.asyncActions=new qe.AsyncActions(t.project.configuration.get("pnpmInstallConcurrency")),this.indexFolderPromise=sx(ae,{indexPath:Y.join(t.project.configuration.get("globalFolder"),"index")})}attachCustomData(t){}registerPackageMapNode(t,{packageLocation:r}){let s=APe(r);this.packageMapNodesByLocator.has(t)||this.packageMapNodesByLocator.set(t,{packageLocation:s,dependencies:new Map})}registerPackageMapDependency(t,r,s){if(!this.packageMapNodesByLocator.has(s.locatorHash))throw new Error(`Assertion failed: Expected the package to have been registered (${H.stringifyLocator(s)})`);t.dependencies.set(r,s.locatorHash)}async installPackage(t,r,s){switch(t.linkType){case"SOFT":return this.installPackageSoft(t,r,s);case"HARD":return this.installPackageHard(t,r,s)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(t,r,s){let a=Y.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(t)?Y.join(a,yr.nodeModules):null,c={packageLocation:a,dependenciesLocation:n};return this.customData.pathsByLocator.set(t.locatorHash,c),this.registerPackageMapNode(t.locatorHash,c),{packageLocation:a,buildRequest:null}}async installPackageHard(t,r,s){let a=LSt(t,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,H.stringifyLocator(t)),this.customData.pathsByLocator.set(t.locatorHash,a),this.registerPackageMapNode(t.locatorHash,a),s.holdFetchResult(this.asyncActions.set(t.locatorHash,async()=>{await ae.mkdirPromise(n,{recursive:!0}),await ae.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let f=H.isVirtualLocator(t)?H.devirtualizeLocator(t):t,p={manifest:await _t.tryFind(r.prefixPath,{baseFs:r.packageFs})??new _t,misc:{hasBindingGyp:yA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(f,t.version),E=yA.extractBuildRequest(t,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(t,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!uPe(t,{project:this.opts.project}))return;let s=this.customData.pathsByLocator.get(t.locatorHash);if(typeof s>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${H.stringifyLocator(t)})`);let{dependenciesLocation:a}=s;if(!a)return;let n=this.packageMapNodesByLocator.get(t.locatorHash);if(typeof n>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${H.stringifyLocator(t)})`);this.asyncActions.reduce(t.locatorHash,async c=>{await ae.mkdirPromise(a,{recursive:!0});let f=await _St(a),p=new Map(f),h=[c],E=(S,x)=>{let I=x;uPe(x,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),I=H.devirtualizeLocator(x));let R=this.customData.pathsByLocator.get(I.locatorHash);if(typeof R>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${H.stringifyLocator(x)})`);let N=H.stringifyIdent(S);this.registerPackageMapDependency(n,N,I);let U=Y.join(a,N),K=Y.relative(Y.dirname(U),R.packageLocation),$=p.get(N);p.delete(N),h.push(Promise.resolve().then(async()=>{if($){if($.isSymbolicLink()&&await ae.readlinkPromise(U)===K)return;await ae.removePromise(U)}await ae.mkdirpPromise(Y.dirname(U)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await ae.symlinkPromise(R.packageLocation,U,"junction"):await ae.symlinkPromise(K,U)}))},C=!1;for(let[S,x]of r)S.identHash===t.identHash&&(C=!0),E(S,x);!C&&!this.opts.project.tryWorkspaceByLocator(t)&&E(H.convertLocatorToDescriptor(t),t),h.push(HSt(a,p)),await Promise.all(h)})}async attachExternalDependents(t,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let t=fPe(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await ae.removePromise(t);else{let s;try{s=new Set(await ae.readdirPromise(t))}catch{s=new Set}for(let{dependenciesLocation:a}of this.customData.pathsByLocator.values()){if(!a)continue;let n=Y.contains(t,a);if(n===null)continue;let[c]=n.split(Y.sep);s.delete(c)}await Promise.all([...s].map(async a=>{await ae.removePromise(Y.join(t,a))}))}await this.asyncActions.wait();let r=this.opts.project.configuration.get("nodeLinker");if(r==="pnpm"){let s=USt({basePath:cP(this.opts.project),packageMapNodesByLocator:this.packageMapNodesByLocator,topLevelLocatorHash:this.opts.project.topLevelWorkspace.anchoredLocator.locatorHash,type:this.opts.project.configuration.get("nodePackageMapType")});await ae.mkdirPromise(cP(this.opts.project),{recursive:!0}),await ae.changeFilePromise(Y.join(cP(this.opts.project),lPe),JSON.stringify(s,null,2),{automaticNewlines:!0})}else r!=="node-modules"&&await ae.removePromise(Y.join(cP(this.opts.project),lPe));return await RJ(t),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await RJ(cP(this.opts.project)),{customData:this.customData}}};function cP(e){return Y.join(e.cwd,yr.nodeModules)}function fPe(e){return e.configuration.get("pnpmStoreFolder")}function LSt(e,{project:t}){let r=H.slugifyLocator(e),s=fPe(t),a=Y.join(s,r,"package"),n=Y.join(s,r,yr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function APe(e){for(;e!==wt.root&&e.endsWith(Y.sep);)e=e.slice(0,-1);return e}function MSt(e,t){let r=Y.relative(e,t)||wt.dot;return r.startsWith(".")||(r=`./${r}`),r}function xL(e,t){let r=Y.relative(e,t)||wt.dot;return r===".."?wt.dot:r}function cPe(e,t){return et?1:0}function USt({basePath:e,packageMapNodesByLocator:t,topLevelLocatorHash:r,type:s}){e=APe(e);let a=t.get(r);if(typeof a>"u")throw new Error("Assertion failed: Expected the top-level package to have been registered");let n=new Map;for(let[p,h]of t)n.set(p,xL(e,h.packageLocation));let c=p=>Object.fromEntries(Array.from(p).sort(([h],[E])=>cPe(h,E)).map(([h,E])=>{let C=n.get(E);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${E})`);return[h,C]})),f={};for(let p of Array.from(t.values()).sort((h,E)=>cPe(xL(e,h.packageLocation),xL(e,E.packageLocation)))){let h=s==="loose"?new Map([...a.dependencies,...p.dependencies]):p.dependencies;f[xL(e,p.packageLocation)]={url:MSt(e,p.packageLocation),dependencies:c(h)}}return{packages:f}}function uPe(e,{project:t}){return!H.isVirtualLocator(e)||!t.tryWorkspaceByLocator(e)}async function _St(e){let t=new Map,r=[];try{r=await ae.readdirPromise(e,{withFileTypes:!0})}catch(s){if(s.code!=="ENOENT")throw s}try{for(let s of r)if(!s.name.startsWith("."))if(s.name.startsWith("@")){let a=await ae.readdirPromise(Y.join(e,s.name),{withFileTypes:!0});if(a.length===0)t.set(s.name,s);else for(let n of a)t.set(`${s.name}/${n.name}`,n)}else t.set(s.name,s)}catch(s){if(s.code!=="ENOENT")throw s}return t}async function HSt(e,t){let r=[],s=new Set;for(let a of t.keys()){r.push(ae.removePromise(Y.join(e,a)));let n=H.tryParseIdent(a)?.scope;n&&s.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...s].map(a=>RJ(Y.join(e,a)))))}async function RJ(e){try{await ae.rmdirPromise(e)}catch(t){if(t.code!=="ENOENT"&&t.code!=="ENOTEMPTY"&&t.code!=="EBUSY")throw t}}var jSt={configuration:{pnpmStoreFolder:{description:"By default, the store is stored in the 'node_modules/.store' of the project. Sometimes in CI scenario's it is convenient to store this in a different location so it can be cached and reused.",type:"ABSOLUTE_PATH",default:"./node_modules/.store"},pnpmInstallConcurrency:{description:`Maximum number of packages the pnpm linker will install in parallel. Lower this on monorepos with very large caches if you hit "Couldn't allocate enough memory" from the bundled libzip WASM heap.`,type:"NUMBER",default:10}},linkers:[uP]},GSt=jSt;var HJ={};Vt(HJ,{StageCommand:()=>_1,default:()=>ebt,stageUtils:()=>QL});Ge();bt();jt();Ge();bt();var QL={};Vt(QL,{ActionType:()=>NJ,checkConsensus:()=>kL,expandDirectory:()=>MJ,findConsensus:()=>UJ,findVcsRoot:()=>OJ,genCommitMessage:()=>_J,getCommitPrefix:()=>pPe,isYarnFile:()=>LJ});bt();var NJ=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(NJ||{});async function OJ(e,{marker:t}){do if(!ae.existsSync(Y.join(e,t)))e=Y.dirname(e);else return e;while(e!=="/");return null}function LJ(e,{roots:t,names:r}){if(r.has(Y.basename(e)))return!0;do if(!t.has(e))e=Y.dirname(e);else return!0;while(e!=="/");return!1}function MJ(e){let t=[],r=[e];for(;r.length>0;){let s=r.pop(),a=ae.readdirSync(s);for(let n of a){let c=Y.resolve(s,n);ae.lstatSync(c).isDirectory()?r.push(c):t.push(c)}}return t}function kL(e,t){let r=0,s=0;for(let a of e)a!=="wip"&&(t.test(a)?r+=1:s+=1);return r>=s}function UJ(e){let t=kL(e,/^(\w\(\w+\):\s*)?\w+s/),r=kL(e,/^(\w\(\w+\):\s*)?[A-Z]/),s=kL(e,/^\w\(\w+\):/);return{useThirdPerson:t,useUpperCase:r,useComponent:s}}function pPe(e){return e.useComponent?"chore(yarn): ":""}var qSt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function _J(e,t){let r=pPe(e),s=[],a=t.slice().sort((n,c)=>n[0]-c[0]);for(;a.length>0;){let[n,c]=a.shift(),f=qSt.get(n);e.useUpperCase&&s.length===0&&(f=`${f[0].toUpperCase()}${f.slice(1)}`),e.useThirdPerson&&(f+="s");let p=[c];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),s.push(`${f} ${h}`)}return`${r}${s.join(", ")}`}var YSt="Commit generated via `yarn stage`",WSt=11;async function hPe(e){let{code:t,stdout:r}=await Yr.execvp("git",["log","-1","--pretty=format:%H"],{cwd:e});return t===0?r.trim():null}async function VSt(e,t){let r=[],s=t.filter(h=>Y.basename(h.path)==="package.json");for(let{action:h,path:E}of s){let C=Y.relative(e,E);if(h===4){let S=await hPe(e),{stdout:x}=await Yr.execvp("git",["show",`${S}:${C}`],{cwd:e,strict:!0}),I=await _t.fromText(x),R=await _t.fromFile(E),N=new Map([...R.dependencies,...R.devDependencies]),U=new Map([...I.dependencies,...I.devDependencies]);for(let[K,$]of U){let ie=H.stringifyIdent($),fe=N.get(K);fe?fe.range!==$.range&&r.push([4,`${ie} to ${fe.range}`]):r.push([3,ie])}for(let[K,$]of N)U.has(K)||r.push([2,H.stringifyIdent($)])}else if(h===0){let S=await _t.fromFile(E);S.name?r.push([0,H.stringifyIdent(S.name)]):r.push([0,"a package"])}else if(h===1){let S=await hPe(e),{stdout:x}=await Yr.execvp("git",["show",`${S}:${C}`],{cwd:e,strict:!0}),I=await _t.fromText(x);I.name?r.push([1,H.stringifyIdent(I.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Yr.execvp("git",["log",`-${WSt}`,"--pretty=format:%s"],{cwd:e}),c=a===0?n.split(/\n/g).filter(h=>h!==""):[],f=UJ(c);return _J(f,r)}var KSt={0:[" A ","?? "],4:[" M "],1:[" D "]},JSt={0:["A "],4:["M "],1:["D "]},dPe={async findRoot(e){return await OJ(e,{marker:".git"})},async filterChanges(e,t,r,s){let{stdout:a}=await Yr.execvp("git",["status","-s"],{cwd:e,strict:!0}),n=a.toString().split(/\n/g),c=s?.staged?JSt:KSt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=Y.resolve(e,p.slice(3));if(!s?.staged&&h==="?? "&&p.endsWith("/"))return MJ(E).map(C=>({action:0,path:C}));{let S=[0,4,1].find(x=>c[x].includes(h));return S!==void 0?[{action:S,path:E}]:[]}})).filter(p=>LJ(p.path,{roots:t,names:r}))},async genCommitMessage(e,t){return await VSt(e,t)},async makeStage(e,t){let r=t.map(s=>Ae.fromPortablePath(s.path));await Yr.execvp("git",["add","--",...r],{cwd:e,strict:!0})},async makeCommit(e,t,r){let s=t.map(a=>Ae.fromPortablePath(a.path));await Yr.execvp("git",["add","-N","--",...s],{cwd:e,strict:!0}),await Yr.execvp("git",["commit","-m",`${r} + +${YSt} +`,"--",...s],{cwd:e,strict:!0})},async makeReset(e,t){let r=t.map(s=>Ae.fromPortablePath(s.path));await Yr.execvp("git",["reset","HEAD","--",...r],{cwd:e,strict:!0})}};var zSt=[dPe],_1=class extends ft{constructor(){super(...arguments);this.commit=he.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=he.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=he.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=he.Boolean("-u,--update",!1,{hidden:!0})}static{this.paths=[["stage"]]}static{this.usage=st.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s}=await Tt.find(r,this.context.cwd),{driver:a,root:n}=await ZSt(s.cwd),c=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(C=>C.populateYarnPaths,s,C=>{c.push(C)});let f=new Set;for(let C of c)for(let S of XSt(n,C))f.add(S);let p=new Set([r.get("rcFilename"),yr.lockfile,yr.manifest]),h=await a.filterChanges(n,f,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} +`);else for(let C of h)this.context.stdout.write(`${Ae.fromPortablePath(C.path)} +`);else if(this.reset){let C=await a.filterChanges(n,f,p,{staged:!0});C.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,C)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function ZSt(e){let t=null,r=null;for(let s of zSt)if((r=await s.findRoot(e))!==null){t=s;break}if(t===null||r===null)throw new ot("No stage driver has been found for your current project");return{driver:t,root:r}}function XSt(e,t){let r=[];if(t===null)return r;for(;;){(t===e||t.startsWith(`${e}/`))&&r.push(t);let s;try{s=ae.statSync(t)}catch{break}if(s.isSymbolicLink())t=Y.resolve(Y.dirname(t),ae.readlinkSync(t));else break}return r}var $St={commands:[_1]},ebt=$St;var jJ={};Vt(jJ,{default:()=>lbt});Ge();Ge();bt();var yPe=et(hi());Ge();var gPe=et(q9()),tbt="e8e1bd300d860104bb8c58453ffa1eb4",rbt="OFCNCOG2CU",mPe=async(e,t)=>{let r=H.stringifyIdent(e),a=nbt(t).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},nbt=e=>(0,gPe.default)(rbt,tbt,{requester:{async send(r){try{let s=await nn.request(r.url,r.data||null,{configuration:e,headers:r.headers});return{content:s.body,isTimedOut:!1,status:s.statusCode}}catch(s){return{content:s.response.body,isTimedOut:!1,status:s.response.statusCode}}}}});var EPe=e=>e.scope?`${e.scope}__${e.name}`:`${e.name}`,ibt=async(e,t,r,s)=>{if(r.scope==="types")return;let{project:a}=e,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??(ae.existsSync(Y.join(e.cwd,"tsconfig.json"))||ae.existsSync(Y.join(a.cwd,"tsconfig.json")))))return;let f=n.makeResolver(),p={project:a,resolver:f,report:new Qi};if(!await mPe(r,n))return;let E=EPe(r),C=H.parseRange(r.range).selector;if(!kr.validRange(C)){let N=n.normalizeDependency(r),U=await f.getCandidates(N,{},p);C=H.parseRange(U[0].reference).selector}let S=yPe.default.coerce(C);if(S===null)return;let x=`${ef.Modifier.CARET}${S.major}`,I=H.makeDescriptor(H.makeIdent("types",E),x),R=qe.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,K=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&K!==r.descriptorHash)return qe.mapAndFind.skip;let $=[];for(let ie of _t.allDependencies){let fe=N.manifest[ie].get(I.identHash);typeof fe>"u"||$.push([ie,fe])}return $.length===0?qe.mapAndFind.skip:$});if(typeof R<"u")for(let[N,U]of R)e.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(I);if((await f.getCandidates(N,{},p)).length===0)return}catch{return}e.manifest[ef.Target.DEVELOPMENT].set(I.identHash,I)}},sbt=async(e,t,r)=>{if(r.scope==="types")return;let{project:s}=e,{configuration:a}=s;if(!(a.get("tsEnableAutoTypes")??(ae.existsSync(Y.join(e.cwd,"tsconfig.json"))||ae.existsSync(Y.join(s.cwd,"tsconfig.json")))))return;let c=EPe(r),f=H.makeIdent("types",c);for(let p of _t.allDependencies)typeof e.manifest[p].get(f.identHash)>"u"||e.manifest[p].delete(f.identHash)},obt=(e,t)=>{t.publishConfig&&t.publishConfig.typings&&(t.typings=t.publishConfig.typings),t.publishConfig&&t.publishConfig.types&&(t.types=t.publishConfig.types)},abt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:ibt,afterWorkspaceDependencyRemoval:sbt,beforeWorkspacePacking:obt}},lbt=abt;var VJ={};Vt(VJ,{VersionApplyCommand:()=>q1,VersionCheckCommand:()=>Y1,VersionCommand:()=>W1,default:()=>pbt,versionUtils:()=>G1});Ge();Ge();jt();var G1={};Vt(G1,{Decision:()=>H1,applyPrerelease:()=>IPe,applyReleases:()=>WJ,applyStrategy:()=>fP,clearVersionFiles:()=>GJ,getUndecidedDependentWorkspaces:()=>pP,getUndecidedWorkspaces:()=>TL,openVersionFile:()=>j1,requireMoreDecisions:()=>ubt,resolveVersionFiles:()=>AP,suggestStrategy:()=>YJ,updateVersionFiles:()=>qJ,validateReleaseDecision:()=>wy});Ge();bt();Sc();jt();Zl();var RA=et(hi()),cbt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,H1=(h=>(h.UNDECIDED="undecided",h.DECLINE="decline",h.MAJOR="major",h.MINOR="minor",h.PATCH="patch",h.PREMAJOR="premajor",h.PREMINOR="preminor",h.PREPATCH="prepatch",h.PRERELEASE="prerelease",h))(H1||{});function wy(e){let t=RA.default.valid(e);return t||qe.validateEnum(x4(H1,"UNDECIDED"),e)}async function AP(e,{prerelease:t=null}={}){let r=new Map,s=e.configuration.get("deferredVersionFolder");if(!ae.existsSync(s))return r;let a=await ae.readdirPromise(s);for(let n of a){if(!n.endsWith(".yml"))continue;let c=Y.join(s,n),f=await ae.readFilePromise(c,"utf8"),p=us(f);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let C=H.parseIdent(h),S=e.tryWorkspaceByIdent(C);if(S===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${Y.basename(c)} references ${h})`);if(S.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${H.prettyLocator(e.configuration,S.anchoredLocator)})`);let x=S.manifest.raw.stableVersion??S.manifest.version,I=r.get(S),R=fP(E==="prerelease"?S.manifest.version:x,wy(E));if(R===null)throw new Error(`Assertion failed: Expected ${x} to support being bumped via strategy ${E}`);let N=typeof I<"u"?RA.default.gt(R,I)?R:I:R;r.set(S,N)}}return t&&(r=new Map([...r].map(([n,c])=>[n,IPe(c,{current:n.manifest.version,prerelease:t})]))),r}async function GJ(e){let t=e.configuration.get("deferredVersionFolder");ae.existsSync(t)&&await ae.removePromise(t)}async function qJ(e,t){let r=new Set(t),s=e.configuration.get("deferredVersionFolder");if(!ae.existsSync(s))return;let a=await ae.readdirPromise(s);for(let n of a){if(!n.endsWith(".yml"))continue;let c=Y.join(s,n),f=await ae.readFilePromise(c,"utf8"),p=us(f),h=p?.releases;if(h){for(let E of Object.keys(h)){let C=H.parseIdent(E),S=e.tryWorkspaceByIdent(C);(S===null||r.has(S))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ae.changeFilePromise(c,Al(new Al.PreserveOrdering(p))):await ae.unlinkPromise(c)}}}async function j1(e,{allowEmpty:t=!1}={}){let r=e.configuration;if(r.projectCwd===null)throw new ot("This command can only be run from within a Yarn project");let s=await Ma.fetchRoot(r.projectCwd),a=s!==null?await Ma.fetchBase(s,{baseRefs:r.get("changesetBaseRefs")}):null,n=s!==null?await Ma.fetchChangedFiles(s,{base:a.hash,project:e}):[],c=r.get("deferredVersionFolder"),f=n.filter(x=>Y.contains(c,x)!==null);if(f.length>1)throw new ot(`Your current branch contains multiple versioning files; this isn't supported: +- ${f.map(x=>Ae.fromPortablePath(x)).join(` +- `)}`);let p=new Set(qe.mapAndFilter(n,x=>{let I=e.tryWorkspaceByFilePath(x);return I===null?qe.mapAndFilter.skip:I}));if(f.length===0&&p.size===0&&!t)return null;let h=f.length===1?f[0]:Y.join(c,`${Mn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ae.existsSync(h)?await ae.readFilePromise(h,"utf8"):"{}",C=us(E),S=new Map;for(let x of C.declined||[]){let I=H.parseIdent(x),R=e.getWorkspaceByIdent(I);S.set(R,"decline")}for(let[x,I]of Object.entries(C.releases||{})){let R=H.parseIdent(x),N=e.getWorkspaceByIdent(R);S.set(N,wy(I))}return{project:e,root:s,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(x=>x.manifest.version!==null)),releases:S,async saveAll(){let x={},I=[],R=[];for(let N of e.workspaces){if(N.manifest.version===null)continue;let U=H.stringifyIdent(N.anchoredLocator),K=S.get(N);K==="decline"?I.push(U):typeof K<"u"?x[U]=wy(K):p.has(N)&&R.push(U)}await ae.mkdirPromise(Y.dirname(h),{recursive:!0}),await ae.changeFilePromise(h,Al(new Al.PreserveOrdering({releases:Object.keys(x).length>0?x:void 0,declined:I.length>0?I:void 0,undecided:R.length>0?R:void 0})))}}}function ubt(e){return TL(e).size>0||pP(e).length>0}function TL(e){let t=new Set;for(let r of e.changedWorkspaces)r.manifest.version!==null&&(e.releases.has(r)||t.add(r));return t}function pP(e,{include:t=new Set}={}){let r=[],s=new Map(qe.mapAndFilter([...e.releases],([n,c])=>c==="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(qe.mapAndFilter([...e.releases],([n,c])=>c!=="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of e.project.workspaces)if(!(!t.has(n)&&(a.has(n.anchoredLocator.locatorHash)||s.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let c of _t.hardDependencies)for(let f of n.manifest.getForScope(c).values()){let p=e.project.tryWorkspaceByDescriptor(f);p!==null&&s.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function YJ(e,t){let r=RA.default.clean(t);for(let s of Object.values(H1))if(s!=="undecided"&&s!=="decline"&&RA.default.inc(e,s)===r)return s;return null}function fP(e,t){if(RA.default.valid(t))return t;if(e===null)throw new ot(`Cannot apply the release strategy "${t}" unless the workspace already has a valid version`);if(!RA.default.valid(e))throw new ot(`Cannot apply the release strategy "${t}" on a non-semver version (${e})`);let r=RA.default.inc(e,t);if(r===null)throw new ot(`Cannot apply the release strategy "${t}" on the specified version (${e})`);return r}function WJ(e,t,{report:r,exact:s}){let a=new Map;for(let n of e.workspaces)for(let c of _t.allDependencies)for(let f of n.manifest[c].values()){let p=e.tryWorkspaceByDescriptor(f);if(p===null||!t.has(p))continue;qe.getArrayWithDefault(a,p).push([n,c,f.identHash])}for(let[n,c]of t){let f=n.manifest.version;n.manifest.version=c,RA.default.prerelease(c)===null?delete n.manifest.raw.stableVersion:n.manifest.raw.stableVersion||(n.manifest.raw.stableVersion=f);let p=n.manifest.name!==null?H.stringifyIdent(n.manifest.name):null;r.reportInfo(0,`${H.prettyLocator(e.configuration,n.anchoredLocator)}: Bumped to ${c}`),r.reportJson({cwd:Ae.fromPortablePath(n.cwd),ident:p,oldVersion:f,newVersion:c});let h=a.get(n);if(!(typeof h>"u"))for(let[E,C,S]of h){let x=E.manifest[C].get(S);if(typeof x>"u")throw new Error("Assertion failed: The dependency should have existed");let I=x.range,R=!1;if(I.startsWith(Ii.protocol)&&(I=I.slice(Ii.protocol.length),R=!0,I===n.relativeCwd))continue;let N=I.match(cbt);if(!N){r.reportWarning(0,`Couldn't auto-upgrade range ${I} (in ${H.prettyLocator(e.configuration,E.anchoredLocator)})`);continue}let U=s?`${c}`:`${N[1]}${c}`;R&&(U=`${Ii.protocol}${U}`);let K=H.makeDescriptor(x,U);E.manifest[C].set(S,K)}}}var fbt=new Map([["%n",{extract:e=>e.length>=1?[e[0],e.slice(1)]:null,generate:(e=0)=>`${e+1}`}]]);function IPe(e,{current:t,prerelease:r}){let s=new RA.default.SemVer(t),a=s.prerelease.slice(),n=[];s.prerelease=[],s.format()!==e&&(a.length=0);let c=!0,f=r.split(/\./g);for(let p of f){let h=fbt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():c=!1;else{let E=c?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),c=!1)}}return s.prerelease&&(s.prerelease=[]),`${e}-${n.join(".")}`}var q1=class extends ft{constructor(){super(...arguments);this.all=he.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=he.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=he.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.exact=he.Boolean("--exact",!1,{description:"Use the exact version of each package, removes any range. Useful for nightly releases where the range might match another version."});this.recursive=he.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["version","apply"]]}static{this.usage=st.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` + This command will apply the deferred version changes and remove their definitions from the repository. + + Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%n\`) will be used on all new versions and the version definitions will be kept as-is. + + By default only the current workspace will be bumped, but you can configure this behavior by using one of: + + - \`--recursive\` to also apply the version bump on its dependencies + - \`--all\` to apply the version bump on all packages in the repository + + Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. + `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=await Ft.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await AP(s,{prerelease:p}),E=new Map;if(this.all)E=h;else{let C=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let S of C){let x=h.get(S);typeof x<"u"&&E.set(S,x)}}if(E.size===0){let C=h.size>0?" Did you want to add --all?":"";f.reportWarning(0,`The current workspace doesn't seem to require a version bump.${C}`);return}WJ(s,E,{report:f,exact:this.exact}),this.dryRun||(p||(this.all?await GJ(s):await qJ(s,[...E.keys()])),f.reportSeparator())});return this.dryRun||c.hasErrors()?c.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ge();bt();jt();var RL=et(hi());var Y1=class extends ft{constructor(){super(...arguments);this.interactive=he.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}static{this.paths=[["version","check"]]}static{this.usage=st.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){XC(this.context);let{Gem:r}=await Promise.resolve().then(()=>(FF(),AY)),{ScrollableItems:s}=await Promise.resolve().then(()=>(MF(),LF)),{FocusRequest:a}=await Promise.resolve().then(()=>(dY(),bwe)),{useListInput:n}=await Promise.resolve().then(()=>(OF(),Dwe)),{renderForm:c}=await Promise.resolve().then(()=>(jF(),HF)),{Box:f,Text:p}=await Promise.resolve().then(()=>et(Yc())),{default:h,useCallback:E,useState:C}=await Promise.resolve().then(()=>et(dn())),S=await Je.find(this.context.cwd,this.context.plugins),{project:x,workspace:I}=await Tt.find(S,this.context.cwd);if(!I)throw new ar(x.cwd,this.context.cwd);await x.restoreInstallState();let R=await j1(x);if(R===null||R.releaseRoots.size===0)return 0;if(R.root===null)throw new ot("This command can only be run on Git repositories");let N=()=>h.createElement(f,{flexDirection:"row",paddingBottom:1},h.createElement(f,{flexDirection:"column",width:60},h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(f,{flexDirection:"column"},h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:ge,active:pe,decision:De,setDecision:ye})=>{let d=ge.manifest.raw.stableVersion??ge.manifest.version;if(d===null)throw new Error(`Assertion failed: The version should have been set (${H.prettyLocator(S,ge.anchoredLocator)})`);if(RL.default.prerelease(d)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${d})`);let ve=["undecided","decline","patch","minor","major"];n(De,ve,{active:pe,minus:"left",plus:"right",set:ye});let Ie=De==="undecided"?h.createElement(p,{color:"yellow"},d):De==="decline"?h.createElement(p,{color:"green"},d):h.createElement(p,null,h.createElement(p,{color:"magenta"},d)," \u2192 ",h.createElement(p,{color:"green"},RL.default.valid(De)?De:RL.default.inc(d,De)));return h.createElement(f,{flexDirection:"column"},h.createElement(f,null,h.createElement(p,null,H.prettyLocator(S,ge.anchoredLocator)," - ",Ie)),h.createElement(f,null,ve.map(me=>h.createElement(f,{key:me,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:me===De})," ",me)))))},K=ge=>{let pe=new Set(R.releaseRoots),De=new Map([...ge].filter(([ye])=>pe.has(ye)));for(;;){let ye=pP({project:R.project,releases:De}),d=!1;if(ye.length>0){for(let[ve]of ye)if(!pe.has(ve)){pe.add(ve),d=!0;let Ie=ge.get(ve);typeof Ie<"u"&&De.set(ve,Ie)}}if(!d)break}return{relevantWorkspaces:pe,relevantReleases:De}},$=()=>{let[ge,pe]=C(()=>new Map(R.releases)),De=E((ye,d)=>{let ve=new Map(ge);d!=="undecided"?ve.set(ye,d):ve.delete(ye);let{relevantReleases:Ie}=K(ve);pe(Ie)},[ge,pe]);return[ge,De]},ie=({workspaces:ge,releases:pe})=>{let De=[];De.push(`${ge.size} total`);let ye=0,d=0;for(let ve of ge){let Ie=pe.get(ve);typeof Ie>"u"?d+=1:Ie!=="decline"&&(ye+=1)}return De.push(`${ye} release${ye===1?"":"s"}`),De.push(`${d} remaining`),h.createElement(p,{color:"yellow"},De.join(", "))},le=await c(({useSubmit:ge})=>{let[pe,De]=$();ge(pe);let{relevantWorkspaces:ye}=K(pe),d=new Set([...ye].filter(ce=>!R.releaseRoots.has(ce))),[ve,Ie]=C(0),me=E(ce=>{switch(ce){case a.BEFORE:Ie(ve-1);break;case a.AFTER:Ie(ve+1);break}},[ve,Ie]);return h.createElement(f,{flexDirection:"column"},h.createElement(N,null),h.createElement(f,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(f,{flexDirection:"column",marginTop:1,paddingLeft:2},[...R.changedFiles].map(ce=>h.createElement(f,{key:ce},h.createElement(p,null,h.createElement(p,{color:"grey"},Ae.fromPortablePath(R.root)),Ae.sep,Ae.relative(Ae.fromPortablePath(R.root),Ae.fromPortablePath(ce)))))),R.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),d.size>3?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:R.releaseRoots,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:"column"},h.createElement(s,{active:ve%2===0,radius:1,size:2,onFocusRequest:me},[...R.releaseRoots].map(ce=>h.createElement(U,{key:ce.cwd,workspace:ce,decision:pe.get(ce)||"undecided",setDecision:X=>De(ce,X)}))))),d.size>0?h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(f,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),d.size>5?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:d,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:"column"},h.createElement(s,{active:ve%2===1,radius:2,size:2,onFocusRequest:me},[...d].map(ce=>h.createElement(U,{key:ce.cwd,workspace:ce,decision:pe.get(ce)||"undecided",setDecision:X=>De(ce,X)}))))):null)},{versionFile:R},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>"u")return 1;R.releases.clear();for(let[ge,pe]of le)R.releases.set(ge,pe);await R.saveAll()}async executeStandard(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return await s.restoreInstallState(),(await Ft.start({configuration:r,stdout:this.context.stdout},async c=>{let f=await j1(s);if(f===null||f.releaseRoots.size===0)return;if(f.root===null)throw new ot("This command can only be run on Git repositories");if(c.reportInfo(0,`Your PR was started right after ${ue.pretty(r,f.baseHash.slice(0,7),"yellow")} ${ue.pretty(r,f.baseTitle,"magenta")}`),f.changedFiles.size>0){c.reportInfo(0,"You have changed the following files since then:"),c.reportSeparator();for(let S of f.changedFiles)c.reportInfo(null,`${ue.pretty(r,Ae.fromPortablePath(f.root),"gray")}${Ae.sep}${Ae.relative(Ae.fromPortablePath(f.root),Ae.fromPortablePath(S))}`)}let p=!1,h=!1,E=TL(f);if(E.size>0){p||c.reportSeparator();for(let S of E)c.reportError(0,`${H.prettyLocator(r,S.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let C=pP(f);for(let[S,x]of C)h||c.reportSeparator(),c.reportError(0,`${H.prettyLocator(r,S.anchoredLocator)} doesn't have a release strategy attached, but depends on ${H.prettyWorkspace(r,x)} which is planned for release.`),h=!0;(p||h)&&(c.reportSeparator(),c.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),c.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};Ge();jt();var FL=et(hi());var W1=class extends ft{constructor(){super(...arguments);this.deferred=he.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=he.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=he.String()}static{this.paths=[["version"]]}static{this.usage=st.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let c=FL.default.valid(this.strategy),f=this.strategy==="decline",p;if(c)if(a.manifest.version!==null){let E=YJ(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!f){if(E===null)throw new ot("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!FL.default.valid(E))throw new ot(`Can't bump the version (${E}) if it's not valid semver`)}p=wy(this.strategy)}if(!n){let C=(await AP(s)).get(a);if(typeof C<"u"&&p!=="decline"){let S=fP(a.manifest.version,p);if(FL.default.lt(S,C))throw new ot(`Can't bump the version to one that would be lower than the current deferred one (${C})`)}}let h=await j1(s,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};var Abt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[q1,Y1,W1]},pbt=Abt;var KJ={};Vt(KJ,{WorkspacesFocusCommand:()=>V1,WorkspacesForeachCommand:()=>J1,default:()=>gbt});Ge();Ge();jt();var V1=class extends ft{constructor(){super(...arguments);this.json=he.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=he.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=he.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=he.Rest()}static{this.paths=[["workspaces","focus"]]}static{this.usage=st.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "})}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd),n=await zr.find(r);await s.restoreInstallState({restoreResolutions:!1});let c;if(this.all)c=new Set(s.workspaces);else if(this.workspaces.length===0){if(!a)throw new ar(s.cwd,this.context.cwd);c=new Set([a])}else c=new Set(this.workspaces.map(f=>s.getWorkspaceByIdent(H.parseIdent(f))));for(let f of c)for(let p of this.production?["dependencies"]:_t.hardDependencies)for(let h of f.manifest.getForScope(p).values()){let E=s.tryWorkspaceByDescriptor(h);E!==null&&c.add(E)}for(let f of s.workspaces)c.has(f)?this.production&&f.manifest.devDependencies.clear():(f.manifest.installConfig=f.manifest.installConfig||{},f.manifest.installConfig.selfReferences=!1,f.manifest.dependencies.clear(),f.manifest.devDependencies.clear(),f.manifest.peerDependencies.clear(),f.manifest.scripts.clear());return await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ge();Ge();Ge();jt();var K1=et(Zo()),wPe=et(M0());Jo();var J1=class extends ft{constructor(){super(...arguments);this.from=he.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=he.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=he.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=he.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=he.Counter("-v,--verbose",{description:"Increase level of logging verbosity up to 2 times"});this.parallel=he.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=he.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=he.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:l_([Qs(["unlimited"]),z2(a_(),[u_(),c_(1)])])});this.topological=he.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=he.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=he.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=he.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=he.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=he.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=he.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=he.String();this.args=he.Proxy()}static{this.paths=[["workspaces","foreach"]]}static{this.usage=st.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\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 `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on 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 `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (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. You can also use the `--no-private` flag to avoid running the command in private workspaces.\n\n The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A --no-private npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]})}static{this.schema=[X2("all",Vf.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),f_(["all","recursive","since","worktree"],{missingIf:"undefined"})]}async execute(){let r=await Je.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Tt.find(r,this.context.cwd);if(!this.all&&!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),c=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new ot("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let f=ye=>{this.dryRun&&this.context.stdout.write(`${ye} +`)},p=()=>{let ye=this.from.map(d=>K1.default.matcher(d));return s.workspaces.filter(d=>{let ve=H.stringifyIdent(d.anchoredLocator),Ie=d.relativeCwd;return ye.some(me=>me(ve)||me(Ie))})},h=[];if(this.since?(f("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await Ma.fetchChangedWorkspaces({ref:this.since,project:s}))):this.from?(f("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(f("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(f("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(f("Option --all is set; selecting all workspaces"),h=[...s.workspaces]),this.dryRun&&!this.all){for(let ye of h)f(` +- ${ye.relativeCwd} + ${H.prettyLocator(r,ye.anchoredLocator)}`);h.length>0&&f("")}let E;if(this.recursive?this.since?(f("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(ye=>[...ye.getRecursiveWorkspaceDependents()]).flat())):(f("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(ye=>[...ye.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(f("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(ye=>[...ye.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let ye of E)f(` +- ${ye.relativeCwd} + ${H.prettyLocator(r,ye.anchoredLocator)}`);let C=[],S=!1;if(c?.includes(":")){for(let ye of s.workspaces)if(ye.manifest.scripts.has(c)&&(S=!S,S===!1))break}for(let ye of h){if(c&&!ye.manifest.scripts.has(c)&&!S&&!(await wn.getWorkspaceAccessibleBinaries(ye)).has(c)){f(`Excluding ${ye.relativeCwd} because it doesn't have a "${c}" script`);continue}if(!(c===r.env.npm_lifecycle_event&&ye.cwd===a.cwd)){if(this.include.length>0&&!K1.default.isMatch(H.stringifyIdent(ye.anchoredLocator),this.include)&&!K1.default.isMatch(ye.relativeCwd,this.include)){f(`Excluding ${ye.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(K1.default.isMatch(H.stringifyIdent(ye.anchoredLocator),this.exclude)||K1.default.isMatch(ye.relativeCwd,this.exclude))){f(`Excluding ${ye.relativeCwd} because it matches the --exclude filter`);continue}if(this.publicOnly&&ye.manifest.private===!0){f(`Excluding ${ye.relativeCwd} because it's a private workspace and --no-private was set`);continue}C.push(ye)}}if(C.sort((ye,d)=>H.stringifyIdent(ye.anchoredLocator).localeCompare(H.stringifyIdent(d.anchoredLocator))),this.dryRun)return 0;let x=this.verbose??(this.context.stdout.isTTY?1/0:0),I=x>0,R=x>1,N=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(Ui.availableParallelism()/2):1,U=N===1?!1:this.parallel,K=U?this.interlaced:!0,$=(0,wPe.default)(N),ie=new Map,fe=new Set,le=0,ge=null,pe=!1,De=await Ft.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async ye=>{let d=async(ve,{commandIndex:Ie})=>{if(pe)return-1;!U&&R&&Ie>1&&ye.reportSeparator();let me=hbt(ve,{configuration:r,label:I,commandIndex:Ie}),[ce,X]=CPe(ye,{prefix:me,interlaced:K}),[be,ke]=CPe(ye,{prefix:me,interlaced:K});try{R&&ye.reportInfo(null,`${me?`${me} `:""}Process started`);let it=Date.now(),_=await this.cli.run([this.commandName,...this.args],{cwd:ve.cwd,stdout:ce,stderr:be})||0;ce.end(),be.end(),await X,await ke;let tt=Date.now();if(R){let Fe=r.get("enableTimers")?`, completed in ${ue.pretty(r,tt-it,ue.Type.DURATION)}`:"";ye.reportInfo(null,`${me?`${me} `:""}Process exited (exit code ${_})${Fe}`)}return _===130&&(pe=!0,ge=_),_}catch(it){throw ce.end(),be.end(),await X,await ke,it}};for(let ve of C)ie.set(ve.anchoredLocator.locatorHash,ve);for(;ie.size>0&&!ye.hasErrors();){let ve=[];for(let[X,be]of ie){if(fe.has(be.anchoredDescriptor.descriptorHash))continue;let ke=!0;if(this.topological||this.topologicalDev){let it=this.topologicalDev?new Map([...be.manifest.dependencies,...be.manifest.devDependencies]):be.manifest.dependencies;for(let _ of it.values()){let tt=s.tryWorkspaceByDescriptor(_);if(ke=tt===null||!ie.has(tt.anchoredLocator.locatorHash),!ke)break}}if(ke&&(fe.add(be.anchoredDescriptor.descriptorHash),ve.push($(async()=>{let it=await d(be,{commandIndex:++le});return ie.delete(X),fe.delete(be.anchoredDescriptor.descriptorHash),{workspace:be,exitCode:it}})),!U))break}if(ve.length===0){let X=Array.from(ie.values()).map(be=>H.prettyLocator(r,be.anchoredLocator)).join(", ");ye.reportError(3,`Dependency cycle detected (${X})`);return}let Ie=await Promise.all(ve);Ie.forEach(({workspace:X,exitCode:be})=>{be!==0&&ye.reportError(0,`The command failed in workspace ${H.prettyLocator(r,X.anchoredLocator)} with exit code ${be}`)});let ce=Ie.map(X=>X.exitCode).find(X=>X!==0);(this.topological||this.topologicalDev)&&typeof ce<"u"&&ye.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return ge!==null?ge:De.exitCode()}};function CPe(e,{prefix:t,interlaced:r}){let s=e.createStreamReporter(t),a=new qe.DefaultStream;a.pipe(s,{end:!1}),a.on("finish",()=>{s.end()});let n=new Promise(f=>{s.on("finish",()=>{f(a.active)})});if(r)return[a,n];let c=new qe.BufferStream;return c.pipe(a,{end:!1}),c.on("finish",()=>{a.end()}),[c,n]}function hbt(e,{configuration:t,commandIndex:r,label:s}){if(!s)return null;let n=`[${H.stringifyIdent(e.anchoredLocator)}]:`,c=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],f=c[r%c.length];return ue.pretty(t,n,f)}var dbt={commands:[V1,J1]},gbt=dbt;var KI=()=>({modules:new Map([["@yarnpkg/cli",Kv],["@yarnpkg/core",Vv],["@yarnpkg/fslib",M2],["@yarnpkg/libzip",lv],["@yarnpkg/parsers",W2],["@yarnpkg/shell",hv],["clipanion",nB],["semver",mbt],["typanion",qs],["@yarnpkg/plugin-essentials",G5],["@yarnpkg/plugin-catalog",V5],["@yarnpkg/plugin-compat",X5],["@yarnpkg/plugin-constraints",d9],["@yarnpkg/plugin-dlx",g9],["@yarnpkg/plugin-exec",E9],["@yarnpkg/plugin-file",C9],["@yarnpkg/plugin-git",j5],["@yarnpkg/plugin-github",v9],["@yarnpkg/plugin-http",S9],["@yarnpkg/plugin-init",b9],["@yarnpkg/plugin-interactive-tools",BY],["@yarnpkg/plugin-jsr",SY],["@yarnpkg/plugin-link",bY],["@yarnpkg/plugin-nm",dW],["@yarnpkg/plugin-npm",hJ],["@yarnpkg/plugin-npm-cli",vJ],["@yarnpkg/plugin-pack",aV],["@yarnpkg/plugin-patch",QJ],["@yarnpkg/plugin-pnp",rW],["@yarnpkg/plugin-pnpm",FJ],["@yarnpkg/plugin-stage",HJ],["@yarnpkg/plugin-typescript",jJ],["@yarnpkg/plugin-version",VJ],["@yarnpkg/plugin-workspace-tools",KJ]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-catalog","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-jsr","@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","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});function SPe({cwd:e,pluginConfiguration:t}){let r=new ba({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:An??""});return Object.assign(r,{defaultContext:{...ba.defaultContext,cwd:e,plugins:t,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function ybt(e){if(qe.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,s=">=18.12.0";if(kr.satisfiesWithPrereleases(r,s))return!0;let a=new ot(`This tool requires a Node version compatible with ${s} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return ba.defaultContext.stdout.write(e.error(a)),!1}async function bPe({selfPath:e,pluginConfiguration:t}){return await Je.find(Ae.toPortablePath(process.cwd()),t,{strict:!1,usePathCheck:e})}function Ebt(e,t,{yarnPath:r}){if(!ae.existsSync(r))return e.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let s={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,BPe.execFileSync)(process.execPath,[Ae.fromPortablePath(r),...t],s)}catch(a){return a.status??1}return 0}function Ibt(e,t){let r=null,s=t;return t.length>=2&&t[0]==="--cwd"?(r=Ae.toPortablePath(t[1]),s=t.slice(2)):t.length>=1&&t[0].startsWith("--cwd=")?(r=Ae.toPortablePath(t[0].slice(6)),s=t.slice(1)):t[0]==="add"&&t[t.length-2]==="--cwd"&&(r=Ae.toPortablePath(t[t.length-1]),s=t.slice(0,t.length-2)),e.defaultContext.cwd=r!==null?Y.resolve(r):Y.cwd(),s}function Cbt(e,{configuration:t}){if(!t.get("enableTelemetry")||vPe.isCI||!process.stdout.isTTY)return;Je.telemetry=new YI(t,"puba9cdc10ec5790a2cf4969dd413a47270");let s=/^@yarnpkg\/plugin-(.*)$/;for(let a of t.plugins.keys())WI.has(a.match(s)?.[1]??"")&&Je.telemetry?.reportPluginName(a);e.binaryVersion&&Je.telemetry.reportVersion(e.binaryVersion)}function DPe(e,{configuration:t}){for(let r of t.plugins.values())for(let s of r.commands||[])e.register(s)}async function wbt(e,t,{selfPath:r,pluginConfiguration:s}){if(!ybt(e))return 1;let a=await bPe({selfPath:r,pluginConfiguration:s}),n=a.get("yarnPath"),c=a.get("ignorePath");if(n&&!c)return Ebt(e,t,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let f=Ibt(e,t);Cbt(e,{configuration:a}),DPe(e,{configuration:a});let p=e.process(f,e.defaultContext);return p.help||Je.telemetry?.reportCommandName(p.path.join(" ")),await e.run(p,e.defaultContext)}async function kde({cwd:e=Y.cwd(),pluginConfiguration:t=KI()}={}){let r=SPe({cwd:e,pluginConfiguration:t}),s=await bPe({pluginConfiguration:t,selfPath:null});return DPe(r,{configuration:s}),r}async function OR(e,{cwd:t=Y.cwd(),selfPath:r,pluginConfiguration:s}){let a=SPe({cwd:t,pluginConfiguration:s});function n(){ba.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop. +Please report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once("beforeExit",n);try{process.exitCode=42,process.exitCode=await wbt(a,e,{selfPath:r,pluginConfiguration:s})}catch(c){ba.defaultContext.stdout.write(a.error(c)),process.exitCode=1}finally{process.off("beforeExit",n),await ae.rmtempPromise()}}OR(process.argv.slice(2),{cwd:Y.cwd(),selfPath:Ae.toPortablePath(Ae.resolve(process.argv[1])),pluginConfiguration:KI()});})(); +/** + @license + Copyright (c) 2015, Rebecca Turner + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + */ +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +/** + @license + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/*! Bundled license information: + +is-number/index.js: + (*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + *) + +to-regex-range/index.js: + (*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + *) + +fill-range/index.js: + (*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + *) + +is-extglob/index.js: + (*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + *) + +is-glob/index.js: + (*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + *) + +queue-microtask/index.js: + (*! queue-microtask. MIT License. Feross Aboukhadijeh *) + +run-parallel/index.js: + (*! run-parallel. MIT License. Feross Aboukhadijeh *) + +git-url-parse/lib/index.js: + (*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + *) + +object-assign/index.js: + (* + object-assign + (c) Sindre Sorhus + @license MIT + *) + +react/cjs/react.production.min.js: + (** @license React v17.0.2 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +scheduler/cjs/scheduler.production.min.js: + (** @license React v0.20.2 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react-reconciler/cjs/react-reconciler.production.min.js: + (** @license React v0.26.2 + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +is-windows/index.js: + (*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + *) +*/ diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..21424ec --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,8 @@ +nodeLinker: node-modules + +npmMinimalAgeGate: 1w + +npmPreapprovedPackages: + - "@openremote/*" + +yarnPath: .yarn/releases/yarn-4.17.1.cjs diff --git a/build.gradle b/build.gradle index d412dc5..74fc8d5 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ scmVersion { allprojects { // Apply common project setup - apply from: "${project.rootDir}/project.gradle" + apply from: "${rootDir}/project.gradle" version = rootProject.scmVersion.version } diff --git a/gradle.properties b/gradle.properties index d6e3401..f6a609f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,4 @@ releasesRepoUrl=https://ossrh-staging-api.central.sonatype.com/service/local/ projectName = openremote-extensions ideaExtPluginVersion = 1.4.1 +spotlessVersion = 8.9.0 diff --git a/package.json b/package.json new file mode 100644 index 0000000..0f4190c --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "openremote-extensions", + "packageManager": "yarn@4.17.1", + "private": true, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", + "eslint": "8.57.1", + "eslint-config-prettier": "10.1.8", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-lit": "2.3.1", + "eslint-plugin-n": "16.6.2", + "eslint-plugin-promise": "6.6.0", + "eslint-plugin-wc": "3.1.0", + "prettier": "3.9.6", + "typescript": "5.8.3" + } +} diff --git a/project.gradle b/project.gradle index 7bdb39f..45fff13 100644 --- a/project.gradle +++ b/project.gradle @@ -93,6 +93,9 @@ repositories { maven { url = 'https://jitpack.io' } + maven { + url = 'https://plugins.gradle.org/m2' + } } // Eclipse needs help @@ -113,6 +116,27 @@ idea { } } +def getYarnInstallTask() { + tasks.getByPath(":yarnInstall") +} + +ext { + getYarnInstallTask = this.&getYarnInstallTask +} + +// Add UI tasks +ext.npmCommand = { cmd -> + isFamily(FAMILY_WINDOWS) ? "${cmd}.cmd" : cmd +} + +// Add yarn tasks +tasks.register('yarnInstall', Exec) { + commandLine npmCommand("yarn"), "install" +} +tasks.register('yarnInstallForce', Exec) { + commandLine npmCommand("yarn"), "install", "--force" +} + // Configure Java build plugins.withType(JavaPlugin).whenPluginAdded { // Use Java 21 @@ -178,4 +202,9 @@ plugins.withType(JavaPlugin).whenPluginAdded { } } +// Configure Spotless +if (project == rootProject) { + apply from: "${rootDir}/spotless.gradle" +} + // POM generator diff --git a/settings.gradle b/settings.gradle index d286391..958fbad 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,15 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + // TODO: These plugins remain here because project.gradle imports their classes, // and version-catalog aliases cannot be used in settings.gradle. Move the related // configuration into convention plugins/build logic so their versions can be // managed through libs.versions.toml. plugins { + id 'com.diffplug.spotless' version "$spotlessVersion" apply false id 'org.jetbrains.gradle.plugin.idea-ext' version "$ideaExtPluginVersion" apply false } diff --git a/spotless.gradle b/spotless.gradle new file mode 100644 index 0000000..0c6a385 --- /dev/null +++ b/spotless.gradle @@ -0,0 +1,109 @@ +import com.diffplug.gradle.spotless.GroovyGradleExtension +import groovy.json.JsonSlurper + +if (project != rootProject) { + throw new GradleException('The Spotless configuration must only be applied to the root project.') +} + +pluginManager.apply('com.diffplug.spotless') + +Map packageJson = new JsonSlurper().parse(rootProject.file('package.json')) as Map +Map devDependencies = + (packageJson.devDependencies as Map) + .collectEntries { String name, Object version -> + [(name): version.toString()] + } +['eslint', 'prettier', 'typescript'].each { String dependency -> + if (!devDependencies.containsKey(dependency)) { + throw new GradleException( + "Missing required formatter dependency '${dependency}' in package.json" + ) + } +} +String prettierVersion = devDependencies.prettier + +def readIgnorePatterns = { File ignoreFile -> + List patterns = ignoreFile + .readLines('UTF-8') + .collect { it.trim() } + .findAll { it && !it.startsWith('#') } + List unsupported = patterns.findAll { + it.startsWith('!') || it.startsWith('/') || it.contains('\\') + } + if (!unsupported.isEmpty()) { + throw new GradleException( + ".prettierignore contains patterns that cannot safely be reused as Gradle Ant patterns: ${unsupported}" + ) + } + return patterns +} +def prettierIgnorePatterns = readIgnorePatterns(rootProject.file('tools/spotless/.prettierignore')) +def targetWithIgnores = { Collection includes, Collection excludes = [] -> + rootProject.fileTree(rootProject.projectDir) { + includes.each { include it } + (prettierIgnorePatterns + excludes + ['openremote/**']).each { exclude it } + } +} +String blockCommentLicenseDelimiter = '(?![ \\t]*/\\*(?:[ \\t]+|\\R[ \\t]*\\*[ \\t]+)Copyright\\b)(?![ \\t]*\\*)[ \\t]*\\S' + +spotless { + format 'gradle', GroovyGradleExtension, { + target targetWithIgnores(['**/*.gradle']) + toggleOffOn() + greclipse().configFile(rootProject.file('tools/spotless/greclipse-google.properties')) + trimTrailingWhitespace() + endWithNewline() + } + + // Groovy files are not yet formatted because some use '::' operations which greclipse currently cannot handle + groovy { + target targetWithIgnores(['**/*.groovy']) + licenseHeaderFile(rootProject.file('tools/spotless/openremote-license-header.txt'), blockCommentLicenseDelimiter) + trimTrailingWhitespace() + endWithNewline() + } + + java { + target targetWithIgnores(['**/src/*/java/**/*.java']) + toggleOffOn() + googleJavaFormat() + licenseHeaderFile rootProject.file('tools/spotless/openremote-license-header.txt') + removeUnusedImports() + formatAnnotations() + trimTrailingWhitespace() + endWithNewline() + } + + format('markdown') { + target targetWithIgnores(['**/*.md']) + toggleOffOn() + prettier(prettierVersion).npmInstallCache().configFile(rootProject.file('tools/spotless/.prettierrc.json')) + endWithNewline() + } + + format('miscUi') { + target targetWithIgnores(['**/*.html', '**/*.json', '**/*.jsonc']) + toggleOffOn() + prettier(prettierVersion).npmInstallCache().configFile(rootProject.file('tools/spotless/.prettierrc.json')) + endWithNewline() + } + + format('xml') { + target targetWithIgnores(['**/*.xml', '**/*.xsd']) + toggleOffOn() + eclipseWtp('xml').configFile(rootProject.file('tools/spotless/eclipse-wtp-xml.properties')) + endWithNewline() + } + + format('yaml') { + target targetWithIgnores(['**/*.yaml', '**/*.yml']) + toggleOffOn() + prettier(prettierVersion).npmInstallCache().configFile(rootProject.file('tools/spotless/.prettierrc.json')) + endWithNewline() + } +} + +def yarnInstallTask = getYarnInstallTask() +tasks.matching { it.name.startsWith("spotless") }.configureEach { + dependsOn yarnInstallTask +} \ No newline at end of file diff --git a/tools/spotless/.prettierignore b/tools/spotless/.prettierignore new file mode 100644 index 0000000..6914cbc --- /dev/null +++ b/tools/spotless/.prettierignore @@ -0,0 +1,47 @@ +# Keep these patterns compatible with Gradle Ant patterns. +# Do not use negation, root-anchored patterns, or gitignore escaping. + +# Dependencies +**/node_modules/** + +# Gradle and Spotless output +**/build/** + +# Compiled output +**/dist/** +**/lib/** + +# Test and coverage output +**/coverage/** +**/test-results/** +**/playwright-report/** + +# Generated files +**/generated/** +**/*.generated.* +**/custom-elements.json +**/src/model.ts +**/src/restclient.ts + +# Caches +**/.cache/** +**/.gradle/** +**/.yarn/** + +# IDE metadata +**/.idea/** +**/.settings/** +**/.vscode/** + +# Minified and bundled files +**/*.bundle.js +**/*.min.js +**/*.min.css +**/*.zip +**/fonts/** +**/map/sprites/*.json + +# Lock files +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/tools/spotless/.prettierrc.json b/tools/spotless/.prettierrc.json new file mode 100644 index 0000000..6b8d5f5 --- /dev/null +++ b/tools/spotless/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "trailingComma": "es5", + "printWidth": 120, + "singleQuote": false, + "tabWidth": 2, + "useTabs": false, + "embeddedLanguageFormatting": "auto" +} diff --git a/tools/spotless/eclipse-wtp-xml.properties b/tools/spotless/eclipse-wtp-xml.properties new file mode 100644 index 0000000..0c4ffdc --- /dev/null +++ b/tools/spotless/eclipse-wtp-xml.properties @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +indentationChar=space +indentationSize=2 +lineWidth=120 +splitMultiAttrs=false +clearAllBlankLines=false diff --git a/tools/spotless/greclipse-google.properties b/tools/spotless/greclipse-google.properties new file mode 100644 index 0000000..8168e6b --- /dev/null +++ b/tools/spotless/greclipse-google.properties @@ -0,0 +1,28 @@ +# Greclipse configuration approximating Google Java Format conventions for Groovy and Gradle files. +# Greclipse uses a different formatting engine, so formatting may not match google-java-format exactly. + +# Use spaces rather than tabs. +org.eclipse.jdt.core.formatter.tabulation.char=space + +# Google Java Style uses two spaces for block indentation. +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.indentation.size=2 + +# Do not insert whitespace on otherwise-empty lines. +org.eclipse.jdt.core.formatter.indent_empty_lines=false + +# Google Java Style uses at least four spaces for continuation lines. +groovy.formatter.multiline.indentation=4 + +# K&R-style braces. +groovy.formatter.braces.start=same +groovy.formatter.braces.end=next + +# Google Java Style uses a 100-character column limit. +groovy.formatter.line.maxlength=100 + +# Wrap long Groovy list literals at approximately the same limit. +groovy.formatter.longListLength=100 + +# Idiomatic for Groovy/Gradle scripts. Change to false to preserve semicolons. +groovy.formatter.remove.unnecessary.semicolons=true diff --git a/tools/spotless/openremote-license-header.txt b/tools/spotless/openremote-license-header.txt new file mode 100644 index 0000000..2a336e1 --- /dev/null +++ b/tools/spotless/openremote-license-header.txt @@ -0,0 +1,18 @@ +/* + * Copyright $YEAR, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..db42196 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2788 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 10 + cacheKey: 10c0 + +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0": + version: 4.10.1 + resolution: "@eslint-community/eslint-utils@npm:4.10.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/b514586655698bc6b74db72a496c77e813c78b63e36a83429845ac7057dd77113b0b6c31e6e590d5baaeee2abae6ea22363a41209bcafa078d895ab83ce83011 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.40.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.40.0" + "@typescript-eslint/type-utils": "npm:8.40.0" + "@typescript-eslint/utils": "npm:8.40.0" + "@typescript-eslint/visitor-keys": "npm:8.40.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^7.0.0" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + "@typescript-eslint/parser": ^8.40.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/dc8889c3255bce6956432f099059179dd13826ba29670f81ba9238ecde46764ee63459eb73a7d88f4f30e1144a2f000d79c9e3f256fa759689d9b3b74d423bda + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/parser@npm:8.40.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.40.0" + "@typescript-eslint/types": "npm:8.40.0" + "@typescript-eslint/typescript-estree": "npm:8.40.0" + "@typescript-eslint/visitor-keys": "npm:8.40.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/43ca9589b8a1f3f4b30a214c0e2254fa0ad43458ef1258b1d62c5aad52710ad11b9315b124cda79163274147b82201a5d76fab7de413e34bfe8e377142b71e98 + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/project-service@npm:8.40.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.40.0" + "@typescript-eslint/types": "npm:^8.40.0" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/23d62e9ada9750136d0251f268bbe1f9784442ef258bb340a2e1e866749d8076730a14749d9a320d94d7c76df2d108caf21fe35e5dc100385f04be846dc979cb + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/scope-manager@npm:8.40.0" + dependencies: + "@typescript-eslint/types": "npm:8.40.0" + "@typescript-eslint/visitor-keys": "npm:8.40.0" + checksum: 10c0/48af81f9cdcec466994d290561e8d2fa3f6b156a898b71dd0e65633c896543b44729c5353596e84de2ae61bfd20e1398c3309cdfe86714a9663fd5aded4c9cd0 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.40.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/c2366dcd802901d5cd4f59fc4eab7a00ed119aa4591ba59c507fe495d9af4cfca19431a603602ea675e4c861962230d1c2f100896903750cd1fcfc134702a7d0 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:^8.40.0": + version: 8.65.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.65.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/5b897bbba4584ee67c7a0bc0b4b6cbf8db2cb5997d5ab8f07fae692315dd51cabcc7116c609a94a162747dd267118b7a0f1c8fb29d71210ad38549e4b8b6adb1 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/type-utils@npm:8.40.0" + dependencies: + "@typescript-eslint/types": "npm:8.40.0" + "@typescript-eslint/typescript-estree": "npm:8.40.0" + "@typescript-eslint/utils": "npm:8.40.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/660b77d801b2538a4ccb65065269ad0e8370d0be985172b5ecb067f3eea22e64aa8af9e981b31bf2a34002339fe3253b09b55d181ce6d8242fc7daa80ac4aaca + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/types@npm:8.40.0" + checksum: 10c0/225374fff36d59288a5780667a7a1316c75090d5d60b70a8035ac18786120333ccd08dfdf0e05e30d5a82217e44c57b8708b769dd1eed89f12f2ac4d3a769f76 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:^8.40.0": + version: 8.65.0 + resolution: "@typescript-eslint/types@npm:8.65.0" + checksum: 10c0/919b6d96111ea26f09c6cb1121fbba915147761be3fbf9c4de5b200faa2891087ebdcfd2f4a1f27a4c6153daeefc7448147c651a074b3ec70440f3f8c1092a81 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.40.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.40.0" + "@typescript-eslint/tsconfig-utils": "npm:8.40.0" + "@typescript-eslint/types": "npm:8.40.0" + "@typescript-eslint/visitor-keys": "npm:8.40.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/6c1ffc17947cb36cbd987cf9705f85223ed1cce584b5244840e36a2b8480861f4dfdb0312f96afbc12e7d1ba586005f0d959042baa0a96a1913ac7ace8e8f6d4 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/utils@npm:8.40.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.7.0" + "@typescript-eslint/scope-manager": "npm:8.40.0" + "@typescript-eslint/types": "npm:8.40.0" + "@typescript-eslint/typescript-estree": "npm:8.40.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/6b3858b8725083fe7db7fb9bcbde930e758a6ba8ddedd1ed27d828fc1cbe04f54b774ef9144602f8eeaafeea9b19b4fd4c46fdad52a10ade99e6b282c7d0df92 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.40.0": + version: 8.40.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.40.0" + dependencies: + "@typescript-eslint/types": "npm:8.40.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/592f1c8c2d3da43a7f74f8ead14f05fafc2e4609d5df36811cf92ead5dc94f6f669556a494048e4746cb3774c60bc52a8c83d75369d5e196778d935c70e7d3a1 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.3 + resolution: "@ungap/structured-clone@npm:1.3.3" + checksum: 10c0/b199e280ee06e9c447e0ccd38df60a65c2b2c13d3c77af50b1e6d77230aee1ea7da309d7b80c5a4850c8e22e4eee9e4b2813c6a33f8c360560d7f2e99a9f6e8f + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn@npm:^8.9.0": + version: 8.17.0 + resolution: "acorn@npm:8.17.0" + bin: + acorn: bin/acorn + checksum: 10c0/5dcefea5f8f023b6cc24cbe71fb5a8112b601d36c4fa07d14e4e6ffc2ee47383332c46b36c766d9437725aa6660156eae50efa0c838719823b50d7c327c4ed42 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.15.0 + resolution: "ajv@npm:6.15.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/67966499dd272ecde1c2e467084411132891523d057487587879d39ac04207f4351b7b2324c83198013967fbfa632c1612adc960114a30770fbe07a0773b32c2 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + +"array-includes@npm:^3.1.9": + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.0" + es-object-atoms: "npm:^1.1.1" + get-intrinsic: "npm:^1.3.0" + is-string: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.6": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-shim-unscopables: "npm:^1.1.0" + checksum: 10c0/82559310d2e57ec5f8fc53d7df420e3abf0ba497935de0a5570586035478ba7d07618cb18e2d4ada2da514c8fb98a034aaf5c06caa0a57e2f7f4c4adedef5956 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.16 + resolution: "brace-expansion@npm:1.1.16" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/b2a915bbedbf4e45840d1fb9a4d391bbf26a79475bd134714d3cee34f1f0edb0ce982738028843be5fbaf8039429f71fa487df8c915b6065ced542c83e58fae6 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.2": + version: 2.1.2 + resolution: "brace-expansion@npm:2.1.2" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/5442ecab84045d21826268bc56c81a6ef4215327ee1f5ee153f67928e93f7a915d130ecec9966623143277fa3cce036ebb50020024bcc4d78853cdd6af9a19f8 + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"builtins@npm:^5.0.1": + version: 5.1.0 + resolution: "builtins@npm:5.1.0" + dependencies: + semver: "npm:^7.0.0" + checksum: 10c0/3c32fe5bd7ed4ff7dbd6fb14bcb9d7eaa7e967327f1899cd336f8625d3f46fceead0a53528f1e332aeaee757034ebb307cb2f1a37af2b86a3c5ad4845d01c0c8 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:^1.0.9": + version: 1.0.9 + resolution: "call-bind@npm:1.0.9" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + get-intrinsic: "npm:^1.3.0" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a6621f6da1444481919ce3b4983dff725691e0754d3507ae483ce56e54985f2da7d6f1df512c56dbf28660745cf1ca52553f1fc9aef5557f3ce353ef14fab714 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"domelementtype@npm:^3.0.0": + version: 3.0.0 + resolution: "domelementtype@npm:3.0.0" + checksum: 10c0/26e8ef992769c4f9bce941eb0cff7ce2ba3f1b3bf77710bb4b029055030625892e83da326cc36b1e444cf3bfdea7d1954791ee2227746387465da9929d16d954 + languageName: node + linkType: hard + +"domhandler@npm:^6.0.1": + version: 6.0.1 + resolution: "domhandler@npm:6.0.1" + dependencies: + domelementtype: "npm:^3.0.0" + checksum: 10c0/8655204dd9612b55813d5880e3e87e134d6dfb2de4bd80f342b3c97f41b167576a8c66c0449c2423999953aedfcda290f7be253a6f9bf71e815afa85f939d44e + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"entities@npm:^8.0.0": + version: 8.0.0 + resolution: "entities@npm:8.0.0" + checksum: 10c0/938e631664c19451823344a351aeeafd74fae2d5fa51e4d5b6ff635afaefd4bacf0f609989888c04c42733f46ffdac15211608267ebb02488005891a4793e94d + languageName: node + linkType: hard + +"es-abstract-get@npm:^1.0.0": + version: 1.0.0 + resolution: "es-abstract-get@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.2" + is-callable: "npm:^1.2.7" + object-inspect: "npm:^1.13.4" + checksum: 10c0/f9b4838ae719752207383a6d95a74590f891122bf26b92f5e72eeedbe53771029e4561f1cf75ea19330b71bcf3d4f536fb0c8f7e2b601fe24d284f46e488c7e3 + languageName: node + linkType: hard + +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.2": + version: 1.24.2 + resolution: "es-abstract@npm:1.24.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10c0/67a5bf21ef5c7d775e6f6131a836323900b4d87194cf544394ac68fe31c57fa53828b978af4a4f551ef307f83a2f910a16b6b982760ad3ddc3dc471f98d5fd1b + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1, es-object-atoms@npm:^1.1.2": + version: 1.1.2 + resolution: "es-object-atoms@npm:1.1.2" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1772861f094f739d6f41b579cfb9a18579daffeb434552a370a5fbef50a32d22227e27b63fdbb757b7ddd429d1b42fe52ccae7966d9302a2ec221b6f1b41bbc4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.4 + resolution: "es-to-primitive@npm:1.3.4" + dependencies: + es-abstract-get: "npm:^1.0.0" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.1.0" + is-symbol: "npm:^1.1.1" + checksum: 10c0/b10029f8b0b13841bade224ff39005a13d76d9cb803cd1efb18cc96a24414e83e2e7ed15d7ad9d0d0bda66884afd211b7b579b8fa31940e05b060934aa7077d8 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10c0/325e815205fab70ebcd379f6d4b5d44c7d791bb8dfe0c9888233f30ebabd9418422595b53a781b946c768d9244d858540e5e6129a6b3dd6d606f467d599edc6c + languageName: node + linkType: hard + +"eslint-config-prettier@npm:10.1.8": + version: 10.1.8 + resolution: "eslint-config-prettier@npm:10.1.8" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/e1bcfadc9eccd526c240056b1e59c5cd26544fe59feb85f38f4f1f116caed96aea0b3b87868e68b3099e55caaac3f2e5b9f58110f85db893e83a332751192682 + languageName: node + linkType: hard + +"eslint-config-standard@npm:17.1.0": + version: 17.1.0 + resolution: "eslint-config-standard@npm:17.1.0" + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: "^15.0.0 || ^16.0.0 " + eslint-plugin-promise: ^6.0.0 + checksum: 10c0/d32f37ec4bea541debd3a8c9e05227673a9b1a9977da078195ee55fb371813ddf1349c75f2c33d76699fe3412f1e303181795f146e8d0e546b94fa0dce2bfbf9 + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.10 + resolution: "eslint-import-resolver-node@npm:0.3.10" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.16.1" + resolve: "npm:^2.0.0-next.6" + checksum: 10c0/2e05bdb148fe10a25b9a6fec3c4986a2e09e98bb99208491df82a9df7725f7bb312482d585404c440d42e58ab60debe7a48d9c992191851385b18d33a146e3c3 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.1": + version: 2.14.0 + resolution: "eslint-module-utils@npm:2.14.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/f917eefe0aa933192df489f6188fdf13694aca4fdf8347010b77dd0d2e812b57d47622e88206ed50e769e55777ad7ce6c55a9997d5eebb44d8531ead1cc90188 + languageName: node + linkType: hard + +"eslint-plugin-es-x@npm:^7.5.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.1.2" + "@eslint-community/regexpp": "npm:^4.11.0" + eslint-compat-utils: "npm:^0.5.1" + peerDependencies: + eslint: ">=8" + checksum: 10c0/002fda8c029bc5da41e24e7ac11654062831d675fc4f5f20d0de460e24bf1e05cd559000678ef3e46c48641190f4fc07ae3d57aa5e8b085ef5f67e5f63742614 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:2.32.0": + version: 2.32.0 + resolution: "eslint-plugin-import@npm:2.32.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.9" + array.prototype.findlastindex: "npm:^1.2.6" + array.prototype.flat: "npm:^1.3.3" + array.prototype.flatmap: "npm:^1.3.3" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.1" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.16.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.1" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.9" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/bfb1b8fc8800398e62ddfefbf3638d185286edfed26dfe00875cc2846d954491b4f5112457831588b757fa789384e1ae585f812614c4797f0499fa234fd4a48b + languageName: node + linkType: hard + +"eslint-plugin-lit@npm:2.3.1": + version: 2.3.1 + resolution: "eslint-plugin-lit@npm:2.3.1" + dependencies: + parse5: "npm:^8.0.1" + parse5-htmlparser2-tree-adapter: "npm:^8.0.1" + peerDependencies: + eslint: ">= 8" + checksum: 10c0/7d5ff953e0c2f35663a8307f75f261313a72d13d5cbe58c96f6561954b849d32a12a5120ae2ecd080c26427b1455de920c74e2054bcb4efb3e8b4d6255048bf7 + languageName: node + linkType: hard + +"eslint-plugin-n@npm:16.6.2": + version: 16.6.2 + resolution: "eslint-plugin-n@npm:16.6.2" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + builtins: "npm:^5.0.1" + eslint-plugin-es-x: "npm:^7.5.0" + get-tsconfig: "npm:^4.7.0" + globals: "npm:^13.24.0" + ignore: "npm:^5.2.4" + is-builtin-module: "npm:^3.2.1" + is-core-module: "npm:^2.12.1" + minimatch: "npm:^3.1.2" + resolve: "npm:^1.22.2" + semver: "npm:^7.5.3" + peerDependencies: + eslint: ">=7.0.0" + checksum: 10c0/6008493754b51c6b9ce18c17e7c3d455b69444d2c454dd399a5c2f1b833bb5a649992052f141a5dd695d22e3946a518063b2dd01e872c67dc0294eb143b80633 + languageName: node + linkType: hard + +"eslint-plugin-promise@npm:6.6.0": + version: 6.6.0 + resolution: "eslint-plugin-promise@npm:6.6.0" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10c0/93a667dbc9ff15c4d586b0d40a31c7828314cbbb31b2b9a75802aa4ef536e9457bb3e1a89b384b07aa336dd61b315ae8b0aadc0870210378023dd018819b59b3 + languageName: node + linkType: hard + +"eslint-plugin-wc@npm:3.1.0": + version: 3.1.0 + resolution: "eslint-plugin-wc@npm:3.1.0" + dependencies: + is-valid-element-name: "npm:^1.0.0" + js-levenshtein-esm: "npm:^2.0.0" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10c0/6ab0544c91287ff8d4c2131305ff047d9841d90517c6b97a9ed0c44b09db84298fe717410f9f382c2d6f8446456dd4e774c99af8f73aeed339a27519fae4b937 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 + languageName: node + linkType: hard + +"eslint@npm:8.57.1": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.7.0 + resolution: "esquery@npm:1.7.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/77d5173db450b66f3bc685d11af4c90cffeedb340f34a39af96d43509a335ce39c894fd79233df32d38f5e4e219fa0f7076f6ec90bae8320170ba082c0db4793 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.20.1 + resolution: "fastq@npm:1.20.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/e5dd725884decb1f11e5c822221d76136f239d0236f176fab80b7b8f9e7619ae57e6b4e5b73defc21e6b9ef99437ee7b545cff8e6c2c337819633712fa9d352e + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.4.3 + resolution: "flatted@npm:3.4.3" + checksum: 10c0/0b36eba483a68dda5a2c4dda9cab61dc1c57a3bd9bd6942d1c6fac9c94c86fb6295c7167f33f94f72b5a79ccf95bf5c2a0cf99f73888ef858252439e149bf24b + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.2.0 + resolution: "function.prototype.name@npm:1.2.0" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + hasown: "npm:^2.0.4" + is-callable: "npm:^1.2.7" + is-document.all: "npm:^1.0.0" + checksum: 10c0/b20e6370ef4f7d56d0bedf5719f6684a517a8dd3334209b4d9f51e8834859302a584187156bf024cda9f50ba2479e4d6764ac34af9532ea47d2f4d9fa6bcf90d + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.7.0": + version: 4.14.0 + resolution: "get-tsconfig@npm:4.14.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/abc2b9275468eb589079a0b7a95eb5107c14fdd0ca6dda1bff116fe774ea1f79975421dcb22a0c86b4f820fcc69a7655dddf9b6d6a8a2c06fcb59e19794c0724 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^13.19.0, globals@npm:^13.24.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.2, hasown@npm:^2.0.3, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"ignore@npm:^7.0.0": + version: 7.0.6 + resolution: "ignore@npm:7.0.6" + checksum: 10c0/fc01ef1d14efbe003439b60538726351e81483d1b6f55bdbb3a4465c6346d9481afad5b350dfbd604ddd7049618ef9093ff26dc147984aabc303c56ba53ea3b5 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.12.1, is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" + dependencies: + hasown: "npm:^2.0.3" + checksum: 10c0/14b4258390283709c15476d023ec173e27458d5d014ccdb8ed39d576e551c3fa45498b7c9fe178f1529c4cb2648ddd58852a6a62107a019f6e349529f277518a + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 + languageName: node + linkType: hard + +"is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-document.all@npm:^1.0.0": + version: 1.0.0 + resolution: "is-document.all@npm:1.0.0" + dependencies: + call-bound: "npm:^1.0.4" + checksum: 10c0/955c20ed5bf01d49da8243b4c714947a6ff64b6d9ba0e12bdbfa654a3e7c47f72cc01c6cd2905e85512d02bc3a1290edd73857bca8842566ff9dcfb7c3f92dae + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: "npm:^1.0.4" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-potential-custom-element-name@npm:^1.0.0": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db + languageName: node + linkType: hard + +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d + languageName: node + linkType: hard + +"is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 + languageName: node + linkType: hard + +"is-valid-element-name@npm:^1.0.0": + version: 1.0.0 + resolution: "is-valid-element-name@npm:1.0.0" + dependencies: + is-potential-custom-element-name: "npm:^1.0.0" + checksum: 10c0/495b769f281e17dbab475351ba494482245f6bdb4e7bc562bdf7da7691cc38024ed3272ab63b180f8bd642a97b0de7c365f810c687376978ba649a2ffad11a6c + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"js-levenshtein-esm@npm:^2.0.0": + version: 2.0.0 + resolution: "js-levenshtein-esm@npm:2.0.0" + checksum: 10c0/920b43be6d79ef68ecf5c3beda925feff33800e96d303c4d15e6dadbd7feed00f0a6cd3bacc4a70e5032b2102654ddf6d10ae1b4e9a770fcffe4d5af2e6f1e26 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.3.0 + resolution: "js-yaml@npm:4.3.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/058b30473d6915ca5b4feb11e2f7d4d97242f98d00a798ed48dd90b46b7c640398afe9128c5db22c5300f8c6528fe2a174b9a93f351a70ebc28c6203938d8bff + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.9 + resolution: "minimatch@npm:9.0.9" + dependencies: + brace-expansion: "npm:^2.0.2" + checksum: 10c0/0b6a58530dbb00361745aa6c8cffaba4c90f551afe7c734830bd95fd88ebf469dd7355a027824ea1d09e37181cfeb0a797fb17df60c15ac174303ac110eb7e86 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"node-exports-info@npm:^1.6.0": + version: 1.6.2 + resolution: "node-exports-info@npm:1.6.2" + dependencies: + array.prototype.flatmap: "npm:^1.3.3" + es-errors: "npm:^1.3.0" + object.entries: "npm:^1.1.9" + semver: "npm:^6.3.1" + checksum: 10c0/5278fab18e8c97f45275c51819c3078ca9488361e875bc01b680776a339d2fee1ca9c6fcfb972df14945a1b184cc9924a1d9ba87e90f6cb3422c7f5b6900f4bc + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc + languageName: node + linkType: hard + +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c + languageName: node + linkType: hard + +"object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"openremote-extensions@workspace:.": + version: 0.0.0-use.local + resolution: "openremote-extensions@workspace:." + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.40.0" + "@typescript-eslint/parser": "npm:8.40.0" + eslint: "npm:8.57.1" + eslint-config-prettier: "npm:10.1.8" + eslint-config-standard: "npm:17.1.0" + eslint-plugin-import: "npm:2.32.0" + eslint-plugin-lit: "npm:2.3.1" + eslint-plugin-n: "npm:16.6.2" + eslint-plugin-promise: "npm:6.6.0" + eslint-plugin-wc: "npm:3.1.0" + prettier: "npm:3.9.6" + typescript: "npm:5.8.3" + languageName: unknown + linkType: soft + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.2 + resolution: "own-keys@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.4" + get-intrinsic: "npm:^1.3.0" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/84b0d9959475231166c3d4b9abd1b8af8042911e2e5625761eed980d1a1e4381cf52b34d907cae21ee8766c79de943f3cd85eba636149dee5e64cceff3ccdb78 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^8.0.1": + version: 8.0.1 + resolution: "parse5-htmlparser2-tree-adapter@npm:8.0.1" + dependencies: + domhandler: "npm:^6.0.1" + parse5: "npm:^8.0.0" + checksum: 10c0/d69e83f6164b014918b4382bd10b0a5904ebf50af6aaf6c5733282e85f1c7e51fe98a23408b9267beea918c141d3e4cd4f2f156878e809de49077ceec5a2c94b + languageName: node + linkType: hard + +"parse5@npm:^8.0.0, parse5@npm:^8.0.1": + version: 8.0.1 + resolution: "parse5@npm:8.0.1" + dependencies: + entities: "npm:^8.0.0" + checksum: 10c0/c3c1c5aab55f6e4be5245599790e56e64be7764a4a0edd7f98db4fe3bb380f63add752fa047dff0496446c25f4104f0c7c1967723de640bde92306a7bb67ed2f + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.2 + resolution: "picomatch@npm:2.3.2" + checksum: 10c0/a554d1709e59be97d1acb9eaedbbc700a5c03dbd4579807baed95100b00420bc729335440ef15004ae2378984e2487a7c1cebd743cfdb72b6fa9ab69223c0d61 + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0, possible-typed-array-names@npm:^1.1.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier@npm:3.9.6": + version: 3.9.6 + resolution: "prettier@npm:3.9.6" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/9f7ddae234035868f3daab3dc34e6de7e54622185afb017378029f0c09a9c023248ccf6f34def0b17a0538e18c47aa1b3188bab72965d1bf735919baa0747e99 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.10, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + +"resolve@npm:^1.22.2": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/b16dc9b537c02e8c3388f7d3dcff9741d3071625f9a97ac1c885f2b0ca51e78df22328fb6d6ef214dd9101fb7cfc19aa2836fe3410402a94f3f7b8639c7149bf + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.6": + version: 2.0.0-next.7 + resolution: "resolve@npm:2.0.0-next.7" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/8c6fa17ccdb826a3a52387ed8c42bf705dbc19d5494da52a86661b124b5b88fad5d8edbbb4434a1b563ecf7768368b7da9fb9489e20f36e02f7551a4ea87d707 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.22.2#optional!builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=9bd1a5" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/e12af106e16e652bd83060e8afacece4ee3dcbd0f4cf028e3d9ad178e6ced9ecb1c87ee60158b239582313902a717f8adc57a9b76ea54b1994141ba15f420c65 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.6#optional!builtin": + version: 2.0.0-next.7 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=9bd1a5" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/911e8321c64ec2a723247dbeabfcb7663577adf52af642bfda61ddee686fbef2255ad529ff57ee8e3884ee23186b85b2637988bfafc0a9a3a81a98bd4af1e2fc + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.4 + resolution: "safe-array-concat@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + get-intrinsic: "npm:^1.3.0" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10c0/95fb4904ab1d9360a666fe5ba6d88f1c4a3a39682739e4512cff809fc6b5722a94bd95189211015bfb45859a7ffbc3340ea303ae22721c91c59e8946d310975a + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": + version: 7.8.5 + resolution: "semver@npm:7.8.5" + bin: + semver: bin/semver.js + checksum: 10c0/b1f3127a5be8125a94f37188b361c212466c292c6910adce3ec106cff5dc211ccaedc4739c11bb70fda59d6fc1f040a9bca289f4e093451521a2372e5231fe0c + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.1 + resolution: "side-channel@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + side-channel-list: "npm:^1.0.1" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/dc0ab81d67f61bda9247d053ce93f41c3fd8ad2bdcb9cf9d8d2f8540d488f26d87a5e99ebfc07eea49ec025867b2452b705442d974b1478f0395e69f6bfb3270 + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.11 + resolution: "string.prototype.trim@npm:1.2.11" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.24.2" + es-object-atoms: "npm:^1.1.2" + has-property-descriptors: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/b153cf8ed06db82ff40e27829e88e5c13f45eff9799f1d5707626e25989b488b059d6f5d57011e07f77745e28451e16735f295bc59c8ae146a4fd73a442366b0 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.10 + resolution: "string.prototype.trimend@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.2" + checksum: 10c0/cc09233181769047a5330becfd5740fec5f0c8137886e7b553626788b00f75df9f34db1159bc52dbb7fc389b8ebb6e1dab44c8c9e31eb600039729a542013286 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.1.0": + version: 2.5.0 + resolution: "ts-api-utils@npm:2.5.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10c0/767849383c114e7f1971fa976b20e73ac28fd0c70d8d65c0004790bf4d8f89888c7e4cf6d5949f9c1beae9bc3c64835bef77bbe27fddf45a3c7b60cebcf85c8c + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.8 + resolution: "typed-array-length@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.9" + for-each: "npm:^0.3.5" + gopd: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + possible-typed-array-names: "npm:^1.1.0" + reflect.getprototypeof: "npm:^1.0.10" + checksum: 10c0/5319f740fc426a3217182c2f7c87656acb0903e046de5a938e30167337d26abf1bb3ad4b32833a72521a4cc58223aec80627b38b357d0a3d5fd64881427e77ab + languageName: node + linkType: hard + +"typescript@npm:5.8.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.8.3#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.22 + resolution: "which-typed-array@npm:1.1.22" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.9" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/e59db184a4e78b461fac3b05fafc1e7badbbedafbf04a967ee1de73717f1f9723a79699e7b5de71d449541cb5da8353efc01a4f8a72a152479850e54fa196c40 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From 9a89049e94a18bc2d93a895d87c7bb0eea52f8e7 Mon Sep 17 00:00:00 2001 From: Wouter Born Date: Tue, 28 Jul 2026 16:24:43 +0200 Subject: [PATCH 2/3] Run spotlessCheck in CI/CD --- .github/workflows/ci_cd.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 9513094..937df02 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -66,6 +66,11 @@ jobs: echo "value=true" >> $GITHUB_OUTPUT fi + - name: Run Spotless check + if: ${{ inputs.is_release != true }} + timeout-minutes: 10 + run: ./gradlew spotlessCheck + - name: Run installDist timeout-minutes: 20 run: ./gradlew installDist From f8f24eb460f98934bc0e750dda2369a1f72b0752 Mon Sep 17 00:00:00 2001 From: Wouter Born Date: Fri, 31 Jul 2026 15:24:46 +0200 Subject: [PATCH 3/3] Apply Spotless --- .github/pull_request_template.md | 6 +- .github/workflows/ci_cd.yml | 21 +- README.md | 18 +- build.gradle | 84 +- .../main/groovy/TestSummaryListener.groovy | 18 + demo-setup/build.gradle | 110 +- .../extension/demosetup/DemoSetupTasks.java | 45 +- .../demosetup/KeycloakDemoSetup.java | 124 +- .../demosetup/ManagerDemoAgentSetup.java | 141 +- .../demosetup/ManagerDemoDashboardSetup.java | 51 +- .../extension/demosetup/ManagerDemoSetup.java | 6479 +++++++++++------ .../extension/demosetup/RulesDemoSetup.java | 483 +- .../demosetup/model/HarvestRobotAsset.java | 89 +- .../demosetup/model/IrrigationAsset.java | 56 +- .../model/ManufacturerAssetModelProvider.java | 15 +- .../demosetup/model/SoilSensorAsset.java | 68 +- .../dashboards/manufacturer/harvesting.json | 68 +- .../demo/dashboards/smartcity/parking.json | 74 +- .../rules/manufacturer/IrrigationTankLow.json | 24 +- .../manufacturer/SalinityBetween20And25.json | 32 +- .../manufacturer/SalinityGreaterThan25.json | 32 +- .../rules/manufacturer/SalinityLessThan3.json | 32 +- .../demo/rules/smartcity/DeKuip.json | 4 +- .../rules/smartcity/EnvironmentAlerts.json | 8 +- .../demo/rules/smartcity/Euromast.json | 4 +- .../demo/rules/smartcity/Markthal.json | 4 +- .../smartcity/MarkthalChargersInUse.json | 32 +- .../smartcity/OnsParkBrightStrongWinds.json | 56 +- .../rules/smartcity/OnsParkDimLightWinds.json | 56 +- .../demo/rules/smartcity/ParkingFull.json | 8 +- .../rules/smartcity/RotterdamBatteryUse.json | 16 +- .../demo/rules/smartcity/StationCrowded.json | 48 +- deployment/build.gradle | 123 +- ems/README.md | 30 +- ems/build.gradle | 126 +- .../ems/agent/EmsAgentModelProvider.java | 15 +- .../extension/ems/agent/EmsDayAheadAsset.java | 140 +- .../ems/agent/EmsElectricityBatteryAsset.java | 468 +- .../ems/agent/EmsEnergyOptimisationAsset.java | 571 +- .../EmsEnergyOptimisationSetupAsset.java | 68 +- .../extension/ems/agent/EmsGOPACSAsset.java | 404 +- .../ems/manager/EmsOptimisationService.java | 1786 +++-- .../manager/EmsOptimisationSetupService.java | 783 +- .../manager/OptimisationMethodsLoader.java | 175 +- .../extension/ems/manager/Services.java | 214 +- .../gopacs/FlexRequestISPTypeHelper.java | 91 +- .../gopacs/GOPACSAddressBookResource.java | 24 +- .../gopacs/GOPACSAnnouncementResource.java | 32 +- .../manager/gopacs/GOPACSAuthResource.java | 32 +- .../gopacs/GOPACSEanEffectivityResource.java | 25 +- .../ems/manager/gopacs/GOPACSHandler.java | 1311 ++-- .../gopacs/GOPACSRedispatchHandler.java | 1010 +-- .../manager/gopacs/GOPACSServerResource.java | 19 +- .../gopacs/GOPACSServerResourceImpl.java | 26 +- .../manager/gopacs/OAuth2TokenResponse.java | 104 +- .../ems/manager/gopacs/ParticipantView.java | 7 +- .../manager/gopacs/dto/AnnouncementDto.java | 275 +- .../gopacs/dto/EanSolvingEffectivityDto.java | 45 +- .../ems/manager/gopacs/dto/TimeSpanDto.java | 70 +- .../optimisationMethods/EmsOptimisation.java | 3457 +++++---- .../EmsOptimisationBeta.java | 3827 ++++++---- .../OptimisationMethod.java | 9 +- .../resources/ems/config/asset-types.json | 36 +- .../ems/rules/EmsDemoSimulationRules.groovy | 18 + .../gopacs/GOPACSHandlerEanTest.groovy | 7 +- .../gopacs/GOPACSHandlerHttpTest.groovy | 7 +- .../manager/gopacs/GOPACSHandlerTest.groovy | 7 +- energy/build.gradle | 118 +- .../manager/EnergyOptimisationService.java | 2034 ++++-- .../energy/manager/EnergyOptimiser.java | 1577 ++-- .../energy/manager/ForecastSolarService.java | 861 ++- .../energy/manager/ForecastWindService.java | 622 +- .../energy/model/ElectricVehicleAsset.java | 644 +- .../model/ElectricVehicleFleetGroupAsset.java | 332 +- .../energy/model/ElectricityAsset.java | 326 +- .../energy/model/ElectricityBatteryAsset.java | 45 +- .../energy/model/ElectricityChargerAsset.java | 104 +- .../model/ElectricityConsumerAsset.java | 78 +- .../model/ElectricityProducerAsset.java | 77 +- .../model/ElectricityProducerSolarAsset.java | 493 +- .../model/ElectricityProducerWindAsset.java | 482 +- .../energy/model/ElectricityStorageAsset.java | 239 +- .../model/ElectricitySupplierAsset.java | 258 +- .../energy/model/EnergyModelProvider.java | 19 +- .../energy/model/EnergyOptimisationAsset.java | 153 +- .../energy/storage/StorageSimulatorAgent.java | 45 +- .../storage/StorageSimulatorAgentLink.java | 18 +- .../storage/StorageSimulatorProtocol.java | 393 +- .../energy/EnergyOptimisationAssetTest.groovy | 18 + .../energy/EnergyOptimisationTest.groovy | 18 + .../energy/ForecastSolarServiceTest.groovy | 18 + .../energy/ForecastWindServiceTest.groovy | 18 + .../extension/energy/KeycloakTestSetup.groovy | 18 + .../extension/energy/ManagerTestSetup.groovy | 18 + .../extension/energy/TestSetupTasks.groovy | 18 + entsoe/README.md | 6 +- entsoe/build.gradle | 118 +- .../entsoe/agent/protocol/EntsoeAgent.java | 65 +- .../agent/protocol/EntsoeAgentLink.java | 38 +- .../protocol/EntsoeAgentModelProvider.java | 15 +- .../entsoe/agent/protocol/EntsoeProtocol.java | 779 +- .../protocol/PublicationMarketDocument.java | 112 +- .../agent/protocol/EntsoeProtocolTest.groovy | 7 +- project.gradle | 257 +- settings.gradle | 38 +- spotless.gradle | 2 +- test-support/manager-app/index.html | 14 +- 107 files changed, 19597 insertions(+), 14546 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 540f3bc..784adc2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,11 +4,13 @@ --> ## Description + ## Checklist + @@ -18,6 +20,6 @@ - [ ] 3. Changes are manually tested by you and the reviewer - [ ] 4. Documentation is written or updated - diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 937df02..92527d1 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -4,14 +4,14 @@ on: # Push on main and release tags push: branches: - - 'main' + - "main" tags: - - '[0-9]+.[0-9]+.[0-9]+' + - "[0-9]+.[0-9]+.[0-9]+" # PR pull_request: branches: - - 'main' + - "main" # Manual trigger workflow_dispatch: @@ -33,7 +33,6 @@ permissions: contents: write jobs: - build: name: CI/CD runs-on: ubuntu-latest @@ -55,9 +54,9 @@ jobs: id: java uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: - distribution: 'temurin' - java-version: '21' - cache: 'gradle' + distribution: "temurin" + java-version: "21" + cache: "gradle" - name: Check if main repo id: is_main_repo @@ -82,10 +81,10 @@ jobs: # Run build # Make temp dir with 777 mask as docker seems to run as root mkdir -pm 777 tmp - + # Start the dev-testing stack docker compose -f openremote/profile/dev-testing.yml up -d --no-build - + ./gradlew test - name: Login to DockerHub @@ -188,11 +187,11 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results - path: '**/build/reports/tests' + path: "**/build/reports/tests" - name: Archive coverage report if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: coverage-report - path: '**/build/reports/jacoco/test/html' + path: "**/build/reports/jacoco/test/html" diff --git a/README.md b/README.md index ed4ecbe..e6b017f 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Subprojects are included automatically when they contain a `build.gradle` file, ## Available extensions | Extension | Description | -|--------------|-------------------------------------------------------------------------------------------| +| ------------ | ----------------------------------------------------------------------------------------- | | `demo-setup` | Adds the OpenRemote Demo setup. | | `ems` | A new extension-based implementation of the Energy Management System with GOPACS support. | | `energy` | Adds the energy domain extension with several energy related assets. | @@ -87,14 +87,14 @@ After the custom project is rebuilt and the OpenRemote Manager is restarted, the When adding or updating an extension: -* Keep extension code in its own Gradle subproject. -* Use the package namespace `org.openremote.extension.`. -* Register extension components using the appropriate OpenRemote SPI files under `META-INF/services`. -* Keep extension-specific resources under an extension-specific resource path. -* Add tests for extension behavior, preferably following the existing OpenRemote testing conventions. +- Keep extension code in its own Gradle subproject. +- Use the package namespace `org.openremote.extension.`. +- Register extension components using the appropriate OpenRemote SPI files under `META-INF/services`. +- Keep extension-specific resources under an extension-specific resource path. +- Add tests for extension behavior, preferably following the existing OpenRemote testing conventions. Typical extension integration points include: -* `AssetModelProvider` -* `ContainerService` -* `SetupTasks` +- `AssetModelProvider` +- `ContainerService` +- `SetupTasks` diff --git a/build.gradle b/build.gradle index 74fc8d5..abb9981 100644 --- a/build.gradle +++ b/build.gradle @@ -2,69 +2,69 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { - id 'jacoco' - id 'test-report-aggregation' - alias libs.plugins.axionRelease - alias libs.plugins.nexusPublish - alias libs.plugins.testLogger apply false + id 'jacoco' + id 'test-report-aggregation' + alias libs.plugins.axionRelease + alias libs.plugins.nexusPublish + alias libs.plugins.testLogger apply false } // Configure version based on Git tags scmVersion { - releaseOnlyOnReleaseBranches = true - releaseBranchNames = ['main'] - unshallowRepoOnCI.set(true) - versionCreator('simple') - versionIncrementer('incrementMinor') - repository { - remote.set('origin') - } - tag { - prefix.set('') - initialVersion({config, position -> '0.1.0'}) - } + releaseOnlyOnReleaseBranches = true + releaseBranchNames = ['main'] + unshallowRepoOnCI.set(true) + versionCreator('simple') + versionIncrementer('incrementMinor') + repository { + remote.set('origin') + } + tag { + prefix.set('') + initialVersion({config, position -> '0.1.0'}) + } } allprojects { - // Apply common project setup - apply from: "${rootDir}/project.gradle" - version = rootProject.scmVersion.version + // Apply common project setup + apply from: "${rootDir}/project.gradle" + version = rootProject.scmVersion.version } def jacocoToolVersion = libs.versions.jacoco.get() jacoco { - toolVersion = jacocoToolVersion + toolVersion = jacocoToolVersion } subprojects { - pluginManager.withPlugin('java') { - pluginManager.apply('jacoco') - jacoco { toolVersion = jacocoToolVersion } - test { - finalizedBy jacocoTestReport // report is always generated after tests run - } - jacocoTestReport { - dependsOn test // tests are required to run before generating the report - } + pluginManager.withPlugin('java') { + pluginManager.apply('jacoco') + jacoco { toolVersion = jacocoToolVersion } + test { + finalizedBy jacocoTestReport // report is always generated after tests run + } + jacocoTestReport { + dependsOn test // tests are required to run before generating the report } + } - tasks.withType(JacocoReport) { - reports { - xml.required = true - html.required = true - } + tasks.withType(JacocoReport) { + reports { + xml.required = true + html.required = true } + } } nexusPublishing { - repositories { - sonatype { - nexusUrl = uri(findProperty('releasesRepoUrl')) - snapshotRepositoryUrl = uri(findProperty('snapshotsRepoUrl')) - username = findProperty('publishUsername') - password = findProperty('publishPassword') - } + repositories { + sonatype { + nexusUrl = uri(findProperty('releasesRepoUrl')) + snapshotRepositoryUrl = uri(findProperty('snapshotsRepoUrl')) + username = findProperty('publishUsername') + password = findProperty('publishPassword') } + } } group = 'io.openremote.extension' diff --git a/buildSrc/src/main/groovy/TestSummaryListener.groovy b/buildSrc/src/main/groovy/TestSummaryListener.groovy index f1071bf..656c7cc 100644 --- a/buildSrc/src/main/groovy/TestSummaryListener.groovy +++ b/buildSrc/src/main/groovy/TestSummaryListener.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ import org.gradle.api.tasks.testing.TestDescriptor import org.gradle.api.tasks.testing.TestListener import org.gradle.api.tasks.testing.TestResult diff --git a/demo-setup/build.gradle b/demo-setup/build.gradle index 2b247f3..a23f832 100644 --- a/demo-setup/build.gradle +++ b/demo-setup/build.gradle @@ -1,83 +1,83 @@ plugins { - id 'java-library' - id 'maven-publish' - id 'signing' + id 'java-library' + id 'maven-publish' + id 'signing' } base { - archivesName = "openremote-${project.name}-extension" + archivesName = "openremote-${project.name}-extension" } dependencies { - api libs.openremote.manager - implementation project(":energy") + api libs.openremote.manager + implementation project(":energy") } jar { - from sourceSets.main.allJava + from sourceSets.main.allJava } javadoc { - failOnError = false + failOnError = false } java { - withJavadocJar() - withSourcesJar() + withJavadocJar() + withSourcesJar() } publishing { - publications { - maven(MavenPublication) { - group = "io.openremote.extension" - artifactId = "openremote-${project.name}-extension" - from components.java - pom { - name = 'OpenRemote Demo setup' - description = 'Adds the OpenRemote Demo setup' - url = 'https://github.com/openremote/extensions' - licenses { - license { - name = 'GNU Affero General Public License v3.0' - url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' - } - } - developers { - developer { - id = 'developers' - name = 'Developers' - email = 'developers@openremote.io' - organization = 'OpenRemote' - organizationUrl = 'https://openremote.io' - } - } - scm { - connection = 'scm:git:git://github.com/openremote/extensions.git' - developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' - url = 'https://github.com/openremote/extensions/tree/main' - } - } + publications { + maven(MavenPublication) { + group = "io.openremote.extension" + artifactId = "openremote-${project.name}-extension" + from components.java + pom { + name = 'OpenRemote Demo setup' + description = 'Adds the OpenRemote Demo setup' + url = 'https://github.com/openremote/extensions' + licenses { + license { + name = 'GNU Affero General Public License v3.0' + url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + } } + developers { + developer { + id = 'developers' + name = 'Developers' + email = 'developers@openremote.io' + organization = 'OpenRemote' + organizationUrl = 'https://openremote.io' + } + } + scm { + connection = 'scm:git:git://github.com/openremote/extensions.git' + developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' + url = 'https://github.com/openremote/extensions/tree/main' + } + } } + } - repositories { - maven { - if (!version.endsWith('-LOCAL')) { - credentials { - username = findProperty("publishUsername") - password = findProperty("publishPassword") - } - } - url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") + repositories { + maven { + if (!version.endsWith('-LOCAL')) { + credentials { + username = findProperty("publishUsername") + password = findProperty("publishPassword") } + } + url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") } + } } signing { - def signingKey = findProperty("signingKey") - def signingPassword = findProperty("signingPassword") - if (signingKey && signingPassword) { - useInMemoryPgpKeys(signingKey, signingPassword) - sign publishing.publications.maven - } + def signingKey = findProperty("signingKey") + def signingPassword = findProperty("signingPassword") + if (signingKey && signingPassword) { + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.maven + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/DemoSetupTasks.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/DemoSetupTasks.java index 633046a..3166e19 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/DemoSetupTasks.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/DemoSetupTasks.java @@ -1,9 +1,6 @@ /* * Copyright 2017, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,38 +12,36 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import java.util.Arrays; +import java.util.List; import org.openremote.model.Container; import org.openremote.model.setup.Setup; import org.openremote.model.setup.SetupTasks; -import java.util.Arrays; -import java.util.List; - -/** - * Demo setup tasks. - */ +/** Demo setup tasks. */ public class DemoSetupTasks implements SetupTasks { - public static final String DEMO_SETUP_TYPE = "demo"; + public static final String DEMO_SETUP_TYPE = "demo"; - @Override - public List createTasks(Container container, String setupType, boolean keycloakEnabled) { + @Override + public List createTasks(Container container, String setupType, boolean keycloakEnabled) { - if (DEMO_SETUP_TYPE.equals(setupType)) { - return Arrays.asList( - new KeycloakDemoSetup(container), - new ManagerDemoSetup(container), - new RulesDemoSetup(container), - new ManagerDemoAgentSetup(container), - new ManagerDemoDashboardSetup(container) - ); - } - - // Do nothing otherwise - return null; + if (DEMO_SETUP_TYPE.equals(setupType)) { + return Arrays.asList( + new KeycloakDemoSetup(container), + new ManagerDemoSetup(container), + new RulesDemoSetup(container), + new ManagerDemoAgentSetup(container), + new ManagerDemoDashboardSetup(container)); } + + // Do nothing otherwise + return null; + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/KeycloakDemoSetup.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/KeycloakDemoSetup.java index 2566a8c..6058367 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/KeycloakDemoSetup.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/KeycloakDemoSetup.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import java.util.Arrays; +import java.util.logging.Logger; import org.openremote.manager.setup.AbstractKeycloakSetup; import org.openremote.model.Constants; import org.openremote.model.Container; @@ -26,59 +27,94 @@ import org.openremote.model.security.Realm; import org.openremote.model.security.User; -import java.util.Arrays; -import java.util.logging.Logger; - /** * We have the following demo users: - *
    - *
  • admin - The superuser in the "master" realm with all access
  • - *
  • smartcity - (Password: smartcity) A user in the "smartcity" realm with read access
  • - *
  • manufacturer - (Password: manufacturer) A user in the "manufacturer" realm with read access
  • - *
  • manufacturer - customer - (Password: customer) A user in the "manufacturer" realm with restricted access to his assets
  • * + *
      + *
    • admin - The superuser in the "master" realm with all access + *
    • smartcity - (Password: smartcity) A user in the "smartcity" realm with read + * access + *
    • manufacturer - (Password: manufacturer) A user in the "manufacturer" realm + * with read access + *
    • manufacturer - customer - (Password: customer) A user in the "manufacturer" + * realm with restricted access to his assets *
    */ public class KeycloakDemoSetup extends AbstractKeycloakSetup { - private static final Logger LOG = Logger.getLogger(KeycloakDemoSetup.class.getName()); + private static final Logger LOG = Logger.getLogger(KeycloakDemoSetup.class.getName()); - public String smartCityUserId; - public static String manufacturerUserId; - public static String customerUserId; - public Realm realmMaster; - public Realm realmCity; - public static Realm realmManufacturer; + public String smartCityUserId; + public static String manufacturerUserId; + public static String customerUserId; + public Realm realmMaster; + public Realm realmCity; + public static Realm realmManufacturer; - public KeycloakDemoSetup(Container container) { - super(container); - } + public KeycloakDemoSetup(Container container) { + super(container); + } - @Override - public void onStart() throws Exception { - super.onStart(); + @Override + public void onStart() throws Exception { + super.onStart(); - // Realms - realmMaster = identityService.getIdentityProvider().getRealm(Constants.MASTER_REALM); - realmCity = createRealm("smartcity", "Smart City", true); - realmManufacturer = createRealm("manufacturer", "Manufacturer", true); - removeManageAccount("smartcity"); - removeManageAccount("manufacturer"); + // Realms + realmMaster = identityService.getIdentityProvider().getRealm(Constants.MASTER_REALM); + realmCity = createRealm("smartcity", "Smart City", true); + realmManufacturer = createRealm("manufacturer", "Manufacturer", true); + removeManageAccount("smartcity"); + removeManageAccount("manufacturer"); - // Don't allow demo users to write assets - ClientRole[] demoUserRoles = Arrays.stream(AbstractKeycloakSetup.REGULAR_USER_ROLES) + // Don't allow demo users to write assets + ClientRole[] demoUserRoles = + Arrays.stream(AbstractKeycloakSetup.REGULAR_USER_ROLES) .filter(clientRole -> clientRole != ClientRole.WRITE_ASSETS) .toArray(ClientRole[]::new); - // Users - User smartCityUser = createUser(realmCity.getName(), "smartcity", "smartcity", "Smart", "City", null, true, demoUserRoles); - this.smartCityUserId = smartCityUser.getId(); - keycloakProvider.updateUserClientRoles(realmCity.getName(), smartCityUserId, "account"); // Remove all roles for account client - User manufacturerUser = createUser(realmManufacturer.getName(), "manufacturer", "manufacturer", "Agri", "Tech", null, true, demoUserRoles); - manufacturerUserId = manufacturerUser.getId(); - keycloakProvider.updateUserClientRoles(realmManufacturer.getName(), manufacturerUserId, "account"); // Remove all roles for account client - User customerUser = createUser(realmManufacturer.getName(), "customer", "customer", "Bert", "Frederiks", null, true, demoUserRoles); - customerUserId = customerUser.getId(); - keycloakProvider.updateUserClientRoles(realmManufacturer.getName(), customerUserId, "account"); // Remove all roles for account client - } + // Users + User smartCityUser = + createUser( + realmCity.getName(), + "smartcity", + "smartcity", + "Smart", + "City", + null, + true, + demoUserRoles); + this.smartCityUserId = smartCityUser.getId(); + keycloakProvider.updateUserClientRoles( + realmCity.getName(), smartCityUserId, "account"); // Remove all roles for account client + User manufacturerUser = + createUser( + realmManufacturer.getName(), + "manufacturer", + "manufacturer", + "Agri", + "Tech", + null, + true, + demoUserRoles); + manufacturerUserId = manufacturerUser.getId(); + keycloakProvider.updateUserClientRoles( + realmManufacturer.getName(), + manufacturerUserId, + "account"); // Remove all roles for account client + User customerUser = + createUser( + realmManufacturer.getName(), + "customer", + "customer", + "Bert", + "Frederiks", + null, + true, + demoUserRoles); + customerUserId = customerUser.getId(); + keycloakProvider.updateUserClientRoles( + realmManufacturer.getName(), + customerUserId, + "account"); // Remove all roles for account client + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoAgentSetup.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoAgentSetup.java index de20ca6..8b9b4e6 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoAgentSetup.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoAgentSetup.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,81 +12,97 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import java.util.logging.Logger; import org.openremote.agent.protocol.knx.KNXAgent; import org.openremote.agent.protocol.velbus.VelbusTCPAgent; -import org.openremote.model.util.MapAccess; import org.openremote.manager.setup.ManagerSetup; import org.openremote.model.Container; import org.openremote.model.security.Realm; - -import java.util.logging.Logger; +import org.openremote.model.util.MapAccess; public class ManagerDemoAgentSetup extends ManagerSetup { - private static final Logger LOG = Logger.getLogger(ManagerDemoAgentSetup.class.getName()); - - public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX = "OR_SETUP_IMPORT_DEMO_AGENT_KNX"; - public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP = "OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP"; - public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP = "OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP"; - - public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS = "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS"; - public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST = "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST"; - public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT = "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT"; - - public String realmMasterName; - - final protected boolean knx; - final protected String knxGatewayIp; - final protected String knxLocalIp; - - final protected boolean velbus; - final protected String velbusHost; - final protected Integer velbusPort; - - public ManagerDemoAgentSetup(Container container) { - super(container); - - this.knx = MapAccess.getBoolean(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX, false); - this.knxGatewayIp = MapAccess.getString(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP, "localhost"); - this.knxLocalIp = MapAccess.getString(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP, "localhost"); - - this.velbus = MapAccess.getBoolean(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS, false); - this.velbusHost = MapAccess.getString(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST, "localhost"); - this.velbusPort = MapAccess.getInteger(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT, 6000); + private static final Logger LOG = Logger.getLogger(ManagerDemoAgentSetup.class.getName()); + + public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX = "OR_SETUP_IMPORT_DEMO_AGENT_KNX"; + public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP = + "OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP"; + public static final String OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP = + "OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP"; + + public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS = + "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS"; + public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST = + "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST"; + public static final String OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT = + "OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT"; + + public String realmMasterName; + + protected final boolean knx; + protected final String knxGatewayIp; + protected final String knxLocalIp; + + protected final boolean velbus; + protected final String velbusHost; + protected final Integer velbusPort; + + public ManagerDemoAgentSetup(Container container) { + super(container); + + this.knx = MapAccess.getBoolean(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX, false); + this.knxGatewayIp = + MapAccess.getString( + container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX_GATEWAY_IP, "localhost"); + this.knxLocalIp = + MapAccess.getString( + container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_KNX_LOCAL_IP, "localhost"); + + this.velbus = + MapAccess.getBoolean(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS, false); + this.velbusHost = + MapAccess.getString( + container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_HOST, "localhost"); + this.velbusPort = + MapAccess.getInteger(container.getConfig(), OR_SETUP_IMPORT_DEMO_AGENT_VELBUS_PORT, 6000); + } + + @Override + public void onStart() throws Exception { + super.onStart(); + + KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); + Realm realmMaster = keycloakDemoSetup.realmMaster; + realmMasterName = realmMaster.getName(); + + if (knx) { + LOG.info("Enable KNX demo agent, gateway/local IP: " + knxGatewayIp + "/" + knxLocalIp); + + KNXAgent agent = + new KNXAgent("Demo KNX agent") + .setRealm(realmMasterName) + .setHost(knxGatewayIp) + .setBindHost(knxLocalIp); + + agent = assetStorageService.merge(agent); } - @Override - public void onStart() throws Exception { - super.onStart(); - - KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); - Realm realmMaster = keycloakDemoSetup.realmMaster; - realmMasterName = realmMaster.getName(); - - if (knx) { - LOG.info("Enable KNX demo agent, gateway/local IP: " + knxGatewayIp + "/" + knxLocalIp); - - KNXAgent agent = new KNXAgent("Demo KNX agent") - .setRealm(realmMasterName) - .setHost(knxGatewayIp) - .setBindHost(knxLocalIp); - - agent = assetStorageService.merge(agent); - } - - if (velbus) { - LOG.info("Enable Velbus demo agent, host/port: " + velbusHost + "/" + velbusPort); + if (velbus) { + LOG.info("Enable Velbus demo agent, host/port: " + velbusHost + "/" + velbusPort); - VelbusTCPAgent agent = new VelbusTCPAgent("Demo VELBUS agent") - .setRealm(realmMasterName) - .setHost(velbusHost) - .setPort(velbusPort); + VelbusTCPAgent agent = + new VelbusTCPAgent("Demo VELBUS agent") + .setRealm(realmMasterName) + .setHost(velbusHost) + .setPort(velbusPort); - agent = assetStorageService.merge(agent); - } + agent = assetStorageService.merge(agent); } + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoDashboardSetup.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoDashboardSetup.java index 91773da..9466464 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoDashboardSetup.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoDashboardSetup.java @@ -1,9 +1,6 @@ /* * Copyright 2024, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,42 +12,46 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import java.io.InputStream; import org.openremote.manager.dashboard.DashboardStorageService; import org.openremote.manager.setup.ManagerSetup; import org.openremote.model.Container; import org.openremote.model.dashboard.Dashboard; import org.openremote.model.util.ValueUtil; -import java.io.InputStream; - public class ManagerDemoDashboardSetup extends ManagerSetup { - protected final DashboardStorageService dashboardStorageService; - - public ManagerDemoDashboardSetup(Container container) { - super(container); - this.dashboardStorageService = container.getService(DashboardStorageService.class); - } + protected final DashboardStorageService dashboardStorageService; - @Override - public void onStart() throws Exception { - super.onStart(); + public ManagerDemoDashboardSetup(Container container) { + super(container); + this.dashboardStorageService = container.getService(DashboardStorageService.class); + } - // SmartCity - try (InputStream inputStream = ManagerDemoDashboardSetup.class.getResourceAsStream("/demo/dashboards/smartcity/parking.json")) { - Dashboard dashboard = ValueUtil.JSON.readValue(inputStream, Dashboard.class); - dashboardStorageService.createNew(dashboard); - } + @Override + public void onStart() throws Exception { + super.onStart(); - // Manufacturer - try (InputStream inputStream = ManagerDemoDashboardSetup.class.getResourceAsStream("/demo/dashboards/manufacturer/harvesting.json")) { - Dashboard dashboard = ValueUtil.JSON.readValue(inputStream, Dashboard.class); - dashboardStorageService.createNew(dashboard); - } + // SmartCity + try (InputStream inputStream = + ManagerDemoDashboardSetup.class.getResourceAsStream( + "/demo/dashboards/smartcity/parking.json")) { + Dashboard dashboard = ValueUtil.JSON.readValue(inputStream, Dashboard.class); + dashboardStorageService.createNew(dashboard); + } + // Manufacturer + try (InputStream inputStream = + ManagerDemoDashboardSetup.class.getResourceAsStream( + "/demo/dashboards/manufacturer/harvesting.json")) { + Dashboard dashboard = ValueUtil.JSON.readValue(inputStream, Dashboard.class); + dashboardStorageService.createNew(dashboard); } + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoSetup.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoSetup.java index a395c04..f14f4c7 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoSetup.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/ManagerDemoSetup.java @@ -1,9 +1,6 @@ /* * Copyright 2016, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,26 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import static java.time.temporal.ChronoField.SECOND_OF_DAY; +import static org.openremote.model.Constants.*; +import static org.openremote.model.value.MetaItemType.*; +import static org.openremote.model.value.ValueType.MultivaluedStringMap; + +import java.time.Duration; +import java.time.LocalTime; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; import org.openremote.agent.protocol.http.HTTPAgent; import org.openremote.agent.protocol.http.HTTPAgentLink; import org.openremote.agent.protocol.simulator.SimulatorAgent; @@ -35,10 +48,6 @@ import org.openremote.extension.energy.model.ElectricityProducerAsset; import org.openremote.extension.energy.model.ElectricityProducerSolarAsset; import org.openremote.extension.energy.model.ElectricityStorageAsset; -import org.openremote.model.attribute.AttributeMap; -import org.openremote.model.datapoint.ValueDatapoint; -import org.openremote.model.query.AssetQuery; -import org.openremote.model.util.UniqueIdentifierGenerator; import org.openremote.manager.security.ManagerIdentityProvider; import org.openremote.manager.setup.ManagerSetup; import org.openremote.model.Constants; @@ -49,2345 +58,4219 @@ import org.openremote.model.asset.impl.*; import org.openremote.model.attribute.Attribute; import org.openremote.model.attribute.AttributeLink; +import org.openremote.model.attribute.AttributeMap; import org.openremote.model.attribute.AttributeRef; import org.openremote.model.attribute.MetaItem; +import org.openremote.model.datapoint.ValueDatapoint; import org.openremote.model.geo.GeoJSONPoint; +import org.openremote.model.query.AssetQuery; import org.openremote.model.security.Realm; import org.openremote.model.simulator.SimulatorReplayDatapoint; +import org.openremote.model.util.UniqueIdentifierGenerator; import org.openremote.model.value.*; -import java.time.Duration; -import java.time.LocalTime; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.function.Supplier; +public class ManagerDemoSetup extends ManagerSetup { -import static java.time.temporal.ChronoField.SECOND_OF_DAY; -import static org.openremote.model.Constants.*; -import static org.openremote.model.value.MetaItemType.*; -import static org.openremote.model.value.ValueType.MultivaluedStringMap; + public static final int HISTORIC_SIMULATED_DATA_DAYS = 28; + public static GeoJSONPoint STATIONSPLEIN_LOCATION = new GeoJSONPoint(4.470175, 51.923464); + public String realmMasterName; + public String realmCityName; + public String realmManufacturerName; + public String area1Id; + public String smartcitySimulatorAgentId; + public String manufacturerSimulatorAgentId; + public String energyManagementId; + public String weatherHttpApiAgentId; -public class ManagerDemoSetup extends ManagerSetup { + public String paprikaId; + public String irrigation9Id; + public String harvestRobot5Id; + public String irrigation10Id; + public String irrigation11Id; + public String soilSensor4Id; - public static final int HISTORIC_SIMULATED_DATA_DAYS = 28; - public static GeoJSONPoint STATIONSPLEIN_LOCATION = new GeoJSONPoint(4.470175, 51.923464); - public String realmMasterName; - public String realmCityName; - public String realmManufacturerName; - public String area1Id; - public String smartcitySimulatorAgentId; - public String manufacturerSimulatorAgentId; - public String energyManagementId; - public String weatherHttpApiAgentId; - - public String paprikaId; - public String irrigation9Id; - public String harvestRobot5Id; - public String irrigation10Id; - public String irrigation11Id; - public String soilSensor4Id; - - private final long halfHourInMillis = Duration.ofMinutes(30).toMillis(); - - public ManagerDemoSetup(Container container) { - super(container); - } + private final long halfHourInMillis = Duration.ofMinutes(30).toMillis(); - private static SimulatorProtocol.Schedule createDailySchedule() { - return new SimulatorProtocol.Schedule(null, null, "FREQ=DAILY"); - } + public ManagerDemoSetup(Container container) { + super(container); + } - private static int getRandomNumberInRange(int min, int max) { - if (min >= max) { - throw new IllegalArgumentException("max must be greater than min"); - } - Random r = new Random(); - return r.nextInt((max - min) + 1) + min; - } + private static SimulatorProtocol.Schedule createDailySchedule() { + return new SimulatorProtocol.Schedule(null, null, "FREQ=DAILY"); + } - // ################################ Realm manufacturer methods ################################### - protected HarvestRobotAsset createDemoHarvestRobotAsset(String name, Asset parent, GeoJSONPoint location, - OperationMode operationMode, VegetableType vegetableType, int direction, int harvestedTotal, Supplier> agentLinker) { - HarvestRobotAsset harvestRobotAsset = new HarvestRobotAsset(name); - harvestRobotAsset.setParent(parent); - harvestRobotAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.OPERATION_MODE) - .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) - .setValue(operationMode); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.VEGETABLE_TYPE) - .addMeta(new MetaItem<>(RULE_STATE)) - .setValue(vegetableType); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.DIRECTION) - .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) - .setValue(direction); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.SPEED) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.HARVESTED_SESSION) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - harvestRobotAsset.getAttributes().getOrCreate(HarvestRobotAsset.HARVESTED_TOTAL) - .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) - .setValue(harvestedTotal); - - return harvestRobotAsset; + private static int getRandomNumberInRange(int min, int max) { + if (min >= max) { + throw new IllegalArgumentException("max must be greater than min"); } + Random r = new Random(); + return r.nextInt((max - min) + 1) + min; + } - protected IrrigationAsset createDemoIrrigationAsset(String name, Asset parent, GeoJSONPoint location, Supplier> agentLinker) { - IrrigationAsset irrigationAsset = new IrrigationAsset(name); - irrigationAsset.setParent(parent); - irrigationAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); - irrigationAsset.getAttributes().getOrCreate(IrrigationAsset.FLOW_WATER) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - irrigationAsset.getAttributes().getOrCreate(IrrigationAsset.FLOW_NUTRIENTS) - .addMeta(new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - irrigationAsset.getAttributes().getOrCreate(IrrigationAsset.FLOW_TOTAL) - .addMeta(new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - irrigationAsset.getAttributes().getOrCreate(IrrigationAsset.TANK_LEVEL) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)); - - return irrigationAsset; - } - protected SoilSensorAsset createDemoSoilSensorAsset(String name, Asset parent, GeoJSONPoint location, - int soilTensionMin, int soilTensionMax, Supplier> agentLinker) { - SoilSensorAsset soilSensorAsset = new SoilSensorAsset(name); - soilSensorAsset.setParent(parent); - soilSensorAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); - soilSensorAsset.getAttributes().getOrCreate(SoilSensorAsset.SOIL_TENSION_MEASURED) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(RULE_STATE), new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(READ_ONLY)); - soilSensorAsset.getAttributes().getOrCreate(SoilSensorAsset.SOIL_TENSION_MIN) - .addMeta(new MetaItem<>(RULE_STATE)) - .setValue(soilTensionMin); - soilSensorAsset.getAttributes().getOrCreate(SoilSensorAsset.SOIL_TENSION_MAX) - .addMeta(new MetaItem<>(RULE_STATE)) - .setValue(soilTensionMax); - soilSensorAsset.getAttributes().getOrCreate(SoilSensorAsset.TEMPERATURE) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(RULE_STATE), new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(READ_ONLY)); - soilSensorAsset.getAttributes().getOrCreate(SoilSensorAsset.SALINITY) - .addMeta(new MetaItem<>(AGENT_LINK, agentLinker.get()), - new MetaItem<>(RULE_STATE), new MetaItem<>(STORE_DATA_POINTS), new MetaItem<>(READ_ONLY)); - - return soilSensorAsset; - } + // ################################ Realm manufacturer methods ################################### + protected HarvestRobotAsset createDemoHarvestRobotAsset( + String name, + Asset parent, + GeoJSONPoint location, + OperationMode operationMode, + VegetableType vegetableType, + int direction, + int harvestedTotal, + Supplier> agentLinker) { + HarvestRobotAsset harvestRobotAsset = new HarvestRobotAsset(name); + harvestRobotAsset.setParent(parent); + harvestRobotAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.OPERATION_MODE) + .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) + .setValue(operationMode); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.VEGETABLE_TYPE) + .addMeta(new MetaItem<>(RULE_STATE)) + .setValue(vegetableType); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.DIRECTION) + .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) + .setValue(direction); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.SPEED) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.HARVESTED_SESSION) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + harvestRobotAsset + .getAttributes() + .getOrCreate(HarvestRobotAsset.HARVESTED_TOTAL) + .addMeta(new MetaItem<>(RULE_STATE), new MetaItem<>(READ_ONLY)) + .setValue(harvestedTotal); - @Override - public void onStart() throws Exception { - super.onStart(); - - KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); - Realm realmMaster = keycloakDemoSetup.realmMaster; - Realm realmCity = keycloakDemoSetup.realmCity; - Realm realmManufacturer = KeycloakDemoSetup.realmManufacturer; - realmMasterName = realmMaster.getName(); - this.realmCityName = realmCity.getName(); - realmManufacturerName = realmManufacturer.getName(); - - // ################################ Realm smartcity ################################### - - SimulatorAgent smartcitySimulatorAgent = new SimulatorAgent("Simulator agent"); - smartcitySimulatorAgent.setRealm(this.realmCityName); - - smartcitySimulatorAgent = assetStorageService.merge(smartcitySimulatorAgent); - smartcitySimulatorAgentId = smartcitySimulatorAgent.getId(); - - LocalTime midnight = LocalTime.of(0, 0); - - // ################################ Realm smartcity - Energy Management ################################### - - ThingAsset energyManagement = new ThingAsset("Energy management"); - energyManagement.setRealm(this.realmCityName); - energyManagement.getAttributes().addOrReplace( - new Attribute<>("powerTotalProducers", ValueType.NUMBER) - .addOrReplaceMeta( - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), - new MetaItem<>(MetaItemType.READ_ONLY, true), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS, true), - new MetaItem<>(MetaItemType.RULE_STATE, true)), - new Attribute<>("powerTotalConsumers", ValueType.NUMBER).addOrReplaceMeta( - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), - new MetaItem<>(MetaItemType.READ_ONLY, true), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS, true), - new MetaItem<>(MetaItemType.RULE_STATE, true)) - ); - energyManagement.setId(UniqueIdentifierGenerator.generateId(energyManagement.getName())); - energyManagement = assetStorageService.merge(energyManagement); - energyManagementId = energyManagement.getId(); - - // ### De Rotterdam ### - BuildingAsset building1Asset = new BuildingAsset("De Rotterdam"); - building1Asset.setParent(energyManagement); - building1Asset.getAttributes().addOrReplace( - new Attribute<>(BuildingAsset.STREET, "Wilhelminakade 139"), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3072 AP"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.488324, 51.906577)), - new Attribute<>("powerBalance", ValueType.NUMBER).addMeta( - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) - ); - building1Asset.setId(UniqueIdentifierGenerator.generateId(building1Asset.getName() + "building")); - building1Asset = assetStorageService.merge(building1Asset); - - ElectricityStorageAsset storage1Asset = createDemoElectricityStorageAsset("Battery De Rotterdam", building1Asset, new GeoJSONPoint(4.488324, 51.906577)); - storage1Asset.setManufacturer("Super-B"); - storage1Asset.setModel("Nomia"); - storage1Asset.setId(UniqueIdentifierGenerator.generateId(storage1Asset.getName())); - storage1Asset = assetStorageService.merge(storage1Asset); - - ElectricityConsumerAsset consumption1Asset = createDemoElectricityConsumerAsset("Consumption De Rotterdam", building1Asset, new GeoJSONPoint(4.487519, 51.906544)); - consumption1Asset.getAttribute(ElectricityConsumerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 20), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 41), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 54), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 63), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 76), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 80), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 79), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 84), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 76), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 82), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 83), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 77), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 71), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 63), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 41), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 27), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 24), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 20) - }) - ) - ); - }); + return harvestRobotAsset; + } + + protected IrrigationAsset createDemoIrrigationAsset( + String name, Asset parent, GeoJSONPoint location, Supplier> agentLinker) { + IrrigationAsset irrigationAsset = new IrrigationAsset(name); + irrigationAsset.setParent(parent); + irrigationAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + irrigationAsset + .getAttributes() + .getOrCreate(IrrigationAsset.FLOW_WATER) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + irrigationAsset + .getAttributes() + .getOrCreate(IrrigationAsset.FLOW_NUTRIENTS) + .addMeta( + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + irrigationAsset + .getAttributes() + .getOrCreate(IrrigationAsset.FLOW_TOTAL) + .addMeta( + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + irrigationAsset + .getAttributes() + .getOrCreate(IrrigationAsset.TANK_LEVEL) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(RULE_STATE), + new MetaItem<>(READ_ONLY)); + + return irrigationAsset; + } - consumption1Asset.setId(UniqueIdentifierGenerator.generateId(consumption1Asset.getName())); - consumption1Asset = assetStorageService.merge(consumption1Asset); + protected SoilSensorAsset createDemoSoilSensorAsset( + String name, + Asset parent, + GeoJSONPoint location, + int soilTensionMin, + int soilTensionMax, + Supplier> agentLinker) { + SoilSensorAsset soilSensorAsset = new SoilSensorAsset(name); + soilSensorAsset.setParent(parent); + soilSensorAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + soilSensorAsset + .getAttributes() + .getOrCreate(SoilSensorAsset.SOIL_TENSION_MEASURED) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(RULE_STATE), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(READ_ONLY)); + soilSensorAsset + .getAttributes() + .getOrCreate(SoilSensorAsset.SOIL_TENSION_MIN) + .addMeta(new MetaItem<>(RULE_STATE)) + .setValue(soilTensionMin); + soilSensorAsset + .getAttributes() + .getOrCreate(SoilSensorAsset.SOIL_TENSION_MAX) + .addMeta(new MetaItem<>(RULE_STATE)) + .setValue(soilTensionMax); + soilSensorAsset + .getAttributes() + .getOrCreate(SoilSensorAsset.TEMPERATURE) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(RULE_STATE), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(READ_ONLY)); + soilSensorAsset + .getAttributes() + .getOrCreate(SoilSensorAsset.SALINITY) + .addMeta( + new MetaItem<>(AGENT_LINK, agentLinker.get()), + new MetaItem<>(RULE_STATE), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>(READ_ONLY)); - ElectricityProducerSolarAsset production1Asset = createDemoElectricitySolarProducerAsset("Solar De Rotterdam", building1Asset, new GeoJSONPoint(4.488592, 51.907047)); - production1Asset.setManufacturer("AEG"); - production1Asset.setModel("AS-P60"); - production1Asset.getAttribute(ElectricityProducerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + return soilSensorAsset; + } + + @Override + public void onStart() throws Exception { + super.onStart(); + + KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); + Realm realmMaster = keycloakDemoSetup.realmMaster; + Realm realmCity = keycloakDemoSetup.realmCity; + Realm realmManufacturer = KeycloakDemoSetup.realmManufacturer; + realmMasterName = realmMaster.getName(); + this.realmCityName = realmCity.getName(); + realmManufacturerName = realmManufacturer.getName(); + + // ################################ Realm smartcity ################################### + + SimulatorAgent smartcitySimulatorAgent = new SimulatorAgent("Simulator agent"); + smartcitySimulatorAgent.setRealm(this.realmCityName); + + smartcitySimulatorAgent = assetStorageService.merge(smartcitySimulatorAgent); + smartcitySimulatorAgentId = smartcitySimulatorAgent.getId(); + + LocalTime midnight = LocalTime.of(0, 0); + + // ################################ Realm smartcity - Energy Management + // ################################### + + ThingAsset energyManagement = new ThingAsset("Energy management"); + energyManagement.setRealm(this.realmCityName); + energyManagement + .getAttributes() + .addOrReplace( + new Attribute<>("powerTotalProducers", ValueType.NUMBER) + .addOrReplaceMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), -10), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), -15), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), -39), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), -52), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), -50), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), -48), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), -36), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), -23), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), -24), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), -18), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), -10), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), -8), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), -3), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - }); - production1Asset.setEnergyExportTotal(152689d); - production1Asset.setPowerExportMax(89.6); - production1Asset.setEfficiencyExport(93); - production1Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.EAST_WEST); - production1Asset.setPanelAzimuth(30); - production1Asset.setPanelPitch(20); - production1Asset.setId(UniqueIdentifierGenerator.generateId(production1Asset.getName())); - production1Asset = assetStorageService.merge(production1Asset); - - // ### Stadhuis ### - - BuildingAsset building2Asset = new BuildingAsset("Stadhuis"); - building2Asset.setParent(energyManagement); - building2Asset.getAttributes().addOrReplace( - new Attribute<>(BuildingAsset.STREET, "Coolsingel 40"), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3011 AD"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.47985, 51.92274)) - ); - building2Asset.setId(UniqueIdentifierGenerator.generateId(building2Asset.getName() + "building")); - building2Asset = assetStorageService.merge(building2Asset); - - ElectricityStorageAsset storage2Asset = createDemoElectricityStorageAsset("Battery Stadhuis", building2Asset, new GeoJSONPoint(4.47985, 51.92274)); - storage2Asset.setManufacturer("LG Chem"); - storage2Asset.setModel("ESS Industrial"); - storage2Asset.setId(UniqueIdentifierGenerator.generateId(storage2Asset.getName())); - storage2Asset = assetStorageService.merge(storage2Asset); - - ElectricityConsumerAsset consumption2Asset = createDemoElectricityConsumerAsset("Consumption Stadhuis", building2Asset, new GeoJSONPoint(4.47933, 51.92259)); - consumption2Asset.getAttribute(ElectricityConsumerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + MetaItemType.UNITS, + Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), + new MetaItem<>(MetaItemType.READ_ONLY, true), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS, true), + new MetaItem<>(MetaItemType.RULE_STATE, true)), + new Attribute<>("powerTotalConsumers", ValueType.NUMBER) + .addOrReplaceMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 30), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 39), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 44), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 47), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 44), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 33), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 8) - } - ) - ) - ); - }); - consumption2Asset.setId(UniqueIdentifierGenerator.generateId(consumption2Asset.getName())); - consumption2Asset = assetStorageService.merge(consumption2Asset); + MetaItemType.UNITS, + Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), + new MetaItem<>(MetaItemType.READ_ONLY, true), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS, true), + new MetaItem<>(MetaItemType.RULE_STATE, true))); + energyManagement.setId(UniqueIdentifierGenerator.generateId(energyManagement.getName())); + energyManagement = assetStorageService.merge(energyManagement); + energyManagementId = energyManagement.getId(); - ElectricityProducerSolarAsset production2Asset = createDemoElectricitySolarProducerAsset("Solar Stadhuis", building2Asset, new GeoJSONPoint(4.47945, 51.92301)); - production2Asset.getAttribute(ElectricityProducerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + // ### De Rotterdam ### + BuildingAsset building1Asset = new BuildingAsset("De Rotterdam"); + building1Asset.setParent(energyManagement); + building1Asset + .getAttributes() + .addOrReplace( + new Attribute<>(BuildingAsset.STREET, "Wilhelminakade 139"), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3072 AP"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.488324, 51.906577)), + new Attribute<>("powerBalance", ValueType.NUMBER) + .addMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), -2), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), -3), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), -8), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), -14), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), -12), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), -10), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), -7), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), -5), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), -7), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), -5), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), -3), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), -2), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - }); - production2Asset.setEnergyExportTotal(88961d); - production2Asset.setPowerExportMax(19.2); - production2Asset.setEfficiencyExport(79); - production2Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); - production2Asset.setPanelAzimuth(10); - production2Asset.setPanelPitch(40); - production2Asset.setManufacturer("Solarwatt"); - production2Asset.setModel("EasyIn 60M"); - production2Asset.setId(UniqueIdentifierGenerator.generateId(production2Asset.getName())); - production2Asset = assetStorageService.merge(production2Asset); - - // ### Markthal ### - - BuildingAsset building3Asset = new BuildingAsset("Markthal"); - building3Asset.setParent(energyManagement); - building3Asset.getAttributes().addOrReplace( - new Attribute<>(BuildingAsset.STREET, "Dominee Jan Scharpstraat 298"), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3011 GZ"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.47945, 51.92301)), - new Attribute<>("allChargersInUse", ValueType.BOOLEAN) - .addMeta( - new MetaItem<>(MetaItemType.READ_ONLY)) - ); - building3Asset.setId(UniqueIdentifierGenerator.generateId(building3Asset.getName() + "building")); - building3Asset = assetStorageService.merge(building3Asset); - - ElectricityProducerSolarAsset production3Asset = createDemoElectricitySolarProducerAsset("Solar Markthal", building3Asset, new GeoJSONPoint(4.47945, 51.92301)); - production3Asset.getAttribute(ElectricityProducerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { + MetaItemType.UNITS, + Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS))); + building1Asset.setId( + UniqueIdentifierGenerator.generateId(building1Asset.getName() + "building")); + building1Asset = assetStorageService.merge(building1Asset); + + ElectricityStorageAsset storage1Asset = + createDemoElectricityStorageAsset( + "Battery De Rotterdam", building1Asset, new GeoJSONPoint(4.488324, 51.906577)); + storage1Asset.setManufacturer("Super-B"); + storage1Asset.setModel("Nomia"); + storage1Asset.setId(UniqueIdentifierGenerator.generateId(storage1Asset.getName())); + storage1Asset = assetStorageService.merge(storage1Asset); + + ElectricityConsumerAsset consumption1Asset = + createDemoElectricityConsumerAsset( + "Consumption De Rotterdam", building1Asset, new GeoJSONPoint(4.487519, 51.906544)); + consumption1Asset + .getAttribute(ElectricityConsumerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 20), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 41), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 54), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 63), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 76), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 80), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 79), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 84), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 76), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 82), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 83), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 77), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 71), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 63), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 41), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 27), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 24), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 20) + }))); + }); + + consumption1Asset.setId(UniqueIdentifierGenerator.generateId(consumption1Asset.getName())); + consumption1Asset = assetStorageService.merge(consumption1Asset); + + ElectricityProducerSolarAsset production1Asset = + createDemoElectricitySolarProducerAsset( + "Solar De Rotterdam", building1Asset, new GeoJSONPoint(4.488592, 51.907047)); + production1Asset.setManufacturer("AEG"); + production1Asset.setModel("AS-P60"); + production1Asset + .getAttribute(ElectricityProducerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), -2), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), -6), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), -10), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), -13), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), -21), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), -14), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), -17), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), -10), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), -9), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), -7), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), -5), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), -4), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), -2), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - }); - production3Asset.setEnergyExportTotal(24134d); - production3Asset.setPowerExportMax(29.8); - production3Asset.setEfficiencyExport(91); - production3Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); - production3Asset.setManufacturer("Sunpower"); - production3Asset.setModel("E20-327"); - production3Asset.setPanelAzimuth(10); - production3Asset.setPanelPitch(5); - production3Asset.setId(UniqueIdentifierGenerator.generateId(production3Asset.getName())); - production3Asset = assetStorageService.merge(production3Asset); - - ElectricityChargerAsset charger1Asset = createDemoElectricityChargerAsset("Charger 1 Markthal", building3Asset, new GeoJSONPoint(4.486143, 51.920058)); - charger1Asset.setPower(0d); - charger1Asset.getAttributes().getOrCreate(ElectricityChargerAsset.POWER).addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 35), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 17), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - charger1Asset.setManufacturer("Allego"); - charger1Asset.setModel("HPC"); - charger1Asset.setId(UniqueIdentifierGenerator.generateId(charger1Asset.getName())); - charger1Asset = assetStorageService.merge(charger1Asset); - - ElectricityChargerAsset charger2Asset = createDemoElectricityChargerAsset("Charger 2 Markthal", building3Asset, new GeoJSONPoint(4.486188, 51.919957)); - charger2Asset.setPower(0d); - charger2Asset.getAttributes().getOrCreate(ElectricityChargerAsset.POWER) - .addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 17), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 28), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 26), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - charger2Asset.setManufacturer("Bosch"); - charger2Asset.setModel("EV800"); - charger2Asset.setId(UniqueIdentifierGenerator.generateId(charger2Asset.getName())); - charger2Asset = assetStorageService.merge(charger2Asset); - - ElectricityChargerAsset charger3Asset = createDemoElectricityChargerAsset("Charger 3 Markthal", building3Asset, new GeoJSONPoint(4.486232, 51.919856)); - charger3Asset.setPower(0d); - charger3Asset.getAttributes().getOrCreate(ElectricityChargerAsset.POWER) - .addMeta( + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), -10), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), -15), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), -39), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), -52), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), -50), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), -48), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), -36), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), -23), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), -24), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), -18), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), -10), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), -8), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), -3), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + }); + production1Asset.setEnergyExportTotal(152689d); + production1Asset.setPowerExportMax(89.6); + production1Asset.setEfficiencyExport(93); + production1Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.EAST_WEST); + production1Asset.setPanelAzimuth(30); + production1Asset.setPanelPitch(20); + production1Asset.setId(UniqueIdentifierGenerator.generateId(production1Asset.getName())); + production1Asset = assetStorageService.merge(production1Asset); + + // ### Stadhuis ### + + BuildingAsset building2Asset = new BuildingAsset("Stadhuis"); + building2Asset.setParent(energyManagement); + building2Asset + .getAttributes() + .addOrReplace( + new Attribute<>(BuildingAsset.STREET, "Coolsingel 40"), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3011 AD"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.47985, 51.92274))); + building2Asset.setId( + UniqueIdentifierGenerator.generateId(building2Asset.getName() + "building")); + building2Asset = assetStorageService.merge(building2Asset); + + ElectricityStorageAsset storage2Asset = + createDemoElectricityStorageAsset( + "Battery Stadhuis", building2Asset, new GeoJSONPoint(4.47985, 51.92274)); + storage2Asset.setManufacturer("LG Chem"); + storage2Asset.setModel("ESS Industrial"); + storage2Asset.setId(UniqueIdentifierGenerator.generateId(storage2Asset.getName())); + storage2Asset = assetStorageService.merge(storage2Asset); + + ElectricityConsumerAsset consumption2Asset = + createDemoElectricityConsumerAsset( + "Consumption Stadhuis", building2Asset, new GeoJSONPoint(4.47933, 51.92259)); + consumption2Asset + .getAttribute(ElectricityConsumerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 30), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 39), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 44), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 47), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 44), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 33), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 8) + }))); + }); + consumption2Asset.setId(UniqueIdentifierGenerator.generateId(consumption2Asset.getName())); + consumption2Asset = assetStorageService.merge(consumption2Asset); + + ElectricityProducerSolarAsset production2Asset = + createDemoElectricitySolarProducerAsset( + "Solar Stadhuis", building2Asset, new GeoJSONPoint(4.47945, 51.92301)); + production2Asset + .getAttribute(ElectricityProducerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), -2), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), -3), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), -8), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), -14), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), -12), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), -10), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), -7), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), -5), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), -7), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), -5), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), -3), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), -2), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + }); + production2Asset.setEnergyExportTotal(88961d); + production2Asset.setPowerExportMax(19.2); + production2Asset.setEfficiencyExport(79); + production2Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); + production2Asset.setPanelAzimuth(10); + production2Asset.setPanelPitch(40); + production2Asset.setManufacturer("Solarwatt"); + production2Asset.setModel("EasyIn 60M"); + production2Asset.setId(UniqueIdentifierGenerator.generateId(production2Asset.getName())); + production2Asset = assetStorageService.merge(production2Asset); + + // ### Markthal ### + + BuildingAsset building3Asset = new BuildingAsset("Markthal"); + building3Asset.setParent(energyManagement); + building3Asset + .getAttributes() + .addOrReplace( + new Attribute<>(BuildingAsset.STREET, "Dominee Jan Scharpstraat 298"), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3011 GZ"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.47945, 51.92301)), + new Attribute<>("allChargersInUse", ValueType.BOOLEAN) + .addMeta(new MetaItem<>(MetaItemType.READ_ONLY))); + building3Asset.setId( + UniqueIdentifierGenerator.generateId(building3Asset.getName() + "building")); + building3Asset = assetStorageService.merge(building3Asset); + + ElectricityProducerSolarAsset production3Asset = + createDemoElectricitySolarProducerAsset( + "Solar Markthal", building3Asset, new GeoJSONPoint(4.47945, 51.92301)); + production3Asset + .getAttribute(ElectricityProducerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), -2), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), -6), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), -10), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), -13), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), -21), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), -14), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), -17), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), -10), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), -9), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), -7), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), -5), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), -4), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), -2), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + }); + production3Asset.setEnergyExportTotal(24134d); + production3Asset.setPowerExportMax(29.8); + production3Asset.setEfficiencyExport(91); + production3Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); + production3Asset.setManufacturer("Sunpower"); + production3Asset.setModel("E20-327"); + production3Asset.setPanelAzimuth(10); + production3Asset.setPanelPitch(5); + production3Asset.setId(UniqueIdentifierGenerator.generateId(production3Asset.getName())); + production3Asset = assetStorageService.merge(production3Asset); + + ElectricityChargerAsset charger1Asset = + createDemoElectricityChargerAsset( + "Charger 1 Markthal", building3Asset, new GeoJSONPoint(4.486143, 51.920058)); + charger1Asset.setPower(0d); + charger1Asset + .getAttributes() + .getOrCreate(ElectricityChargerAsset.POWER) + .addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 35), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 17), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + charger1Asset.setManufacturer("Allego"); + charger1Asset.setModel("HPC"); + charger1Asset.setId(UniqueIdentifierGenerator.generateId(charger1Asset.getName())); + charger1Asset = assetStorageService.merge(charger1Asset); + + ElectricityChargerAsset charger2Asset = + createDemoElectricityChargerAsset( + "Charger 2 Markthal", building3Asset, new GeoJSONPoint(4.486188, 51.919957)); + charger2Asset.setPower(0d); + charger2Asset + .getAttributes() + .getOrCreate(ElectricityChargerAsset.POWER) + .addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 17), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 28), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 26), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + charger2Asset.setManufacturer("Bosch"); + charger2Asset.setModel("EV800"); + charger2Asset.setId(UniqueIdentifierGenerator.generateId(charger2Asset.getName())); + charger2Asset = assetStorageService.merge(charger2Asset); + + ElectricityChargerAsset charger3Asset = + createDemoElectricityChargerAsset( + "Charger 3 Markthal", building3Asset, new GeoJSONPoint(4.486232, 51.919856)); + charger3Asset.setPower(0d); + charger3Asset + .getAttributes() + .getOrCreate(ElectricityChargerAsset.POWER) + .addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 18), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 29), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + charger3Asset.setManufacturer("Siemens"); + charger3Asset.setModel("CPC 50"); + charger3Asset.setId(UniqueIdentifierGenerator.generateId(charger3Asset.getName())); + charger3Asset = assetStorageService.merge(charger3Asset); + + ElectricityChargerAsset charger4Asset = + createDemoElectricityChargerAsset( + "Charger 4 Markthal", building3Asset, new GeoJSONPoint(4.486286, 51.919733)); + charger4Asset.setPower(0d); + charger4Asset + .getAttributes() + .getOrCreate(ElectricityChargerAsset.POWER) + .addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 17), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 30), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 4) + }))); + + charger4Asset.setManufacturer("SemaConnect"); + charger4Asset.setModel("The Series 6"); + charger4Asset.setId(UniqueIdentifierGenerator.generateId(charger4Asset.getName())); + charger4Asset = assetStorageService.merge(charger4Asset); + + // ### Erasmianum ### + + BuildingAsset building4Asset = new BuildingAsset("Erasmianum"); + building4Asset.setParent(energyManagement); + building4Asset + .getAttributes() + .addOrReplace( + new Attribute<>(BuildingAsset.STREET, "Wytemaweg 25"), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3015 CN"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.468324, 51.912062))); + building4Asset.setId( + UniqueIdentifierGenerator.generateId(building4Asset.getName() + "building")); + building4Asset = assetStorageService.merge(building4Asset); + + ElectricityConsumerAsset consumption4Asset = + createDemoElectricityConsumerAsset( + "Consumption Erasmianum", building4Asset, new GeoJSONPoint(4.468324, 51.912062)); + consumption4Asset + .getAttribute(ElectricityConsumerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 37), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 41), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 47), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 49), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 51), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 43), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 48), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 45), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 46), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 41), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 30), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 19), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 6) + }))); + }); + consumption4Asset.setId(UniqueIdentifierGenerator.generateId(consumption4Asset.getName())); + consumption4Asset = assetStorageService.merge(consumption4Asset); + + // ### Oostelijk zwembad ### + + BuildingAsset building5Asset = new BuildingAsset("Oostelijk zwembad"); + building5Asset.setParent(energyManagement); + building5Asset + .getAttributes() + .addOrReplace( + new Attribute<>(BuildingAsset.STREET, "Gerdesiaweg 480"), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3061 RA"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.498048, 51.925770))); + building5Asset.setId( + UniqueIdentifierGenerator.generateId(building5Asset.getName() + "building")); + building5Asset = assetStorageService.merge(building5Asset); + + ElectricityConsumerAsset consumption5Asset = + createDemoElectricityConsumerAsset( + "Consumption Zwembad", building5Asset, new GeoJSONPoint(4.498048, 51.925770)); + consumption5Asset + .getAttribute(ElectricityConsumerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 17), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 16), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 24), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 35), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 33), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 33), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 31), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 37), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 37), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 35), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 24), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 19) + }))); + }); + consumption5Asset.setId(UniqueIdentifierGenerator.generateId(consumption5Asset.getName())); + consumption5Asset = assetStorageService.merge(consumption5Asset); + + ElectricityProducerSolarAsset production5Asset = + createDemoElectricitySolarProducerAsset( + "Solar Zwembad", building5Asset, new GeoJSONPoint(4.498281, 51.925507)); + production5Asset + .getAttribute(ElectricityProducerAsset.POWER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), -1), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), -3), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), -8), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), -30), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), -44), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), -42), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), -41), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), -29), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), -19), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), -16), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), -11), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), -4), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), -3), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), -2), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0) + }))); + }); + production5Asset.setEnergyExportTotal(23461d); + production5Asset.setPowerExportMax(76.2); + production5Asset.setEfficiencyExport(86); + production5Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); + production5Asset.setManufacturer("S-Energy"); + production5Asset.setModel("SN260P-10"); + production5Asset.setPanelAzimuth(50); + production5Asset.setPanelPitch(15); + production5Asset.setId(UniqueIdentifierGenerator.generateId(production5Asset.getName())); + production5Asset = assetStorageService.merge(production5Asset); + + // ### Weather ### + HTTPAgent weatherHttpApiAgent = new HTTPAgent("Weather Agent"); + weatherHttpApiAgent.setParent(energyManagement); + weatherHttpApiAgent.setBaseURI("https://api.openweathermap.org/data/2.5/"); + + MultivaluedStringMap queryParams = new MultivaluedStringMap(); + queryParams.put("appid", Collections.singletonList("c3ecbf09be5267cd280676a01acd3360")); + queryParams.put("lat", Collections.singletonList("51.918849")); + queryParams.put("lon", Collections.singletonList("4.463250")); + queryParams.put("units", Collections.singletonList("metric")); + weatherHttpApiAgent.setRequestQueryParameters(queryParams); + + MultivaluedStringMap headers = new MultivaluedStringMap(); + headers.put("Accept", Collections.singletonList("application/json")); + weatherHttpApiAgent.setRequestHeaders(headers); + + weatherHttpApiAgent = assetStorageService.merge(weatherHttpApiAgent); + weatherHttpApiAgentId = weatherHttpApiAgent.getId(); + + WeatherAsset weather = new WeatherAsset("Weather"); + weather.setParent(energyManagement); + weather.setId(UniqueIdentifierGenerator.generateId(weather.getName())); + + HTTPAgentLink agentLink = new HTTPAgentLink(weatherHttpApiAgentId); + agentLink.setPath("weather"); + agentLink.setPollingMillis((int) halfHourInMillis); + + weather + .getAttributes() + .addOrReplace( + new Attribute<>("currentWeather") + .addMeta( + new MetaItem<>(MetaItemType.AGENT_LINK, agentLink), + new MetaItem<>(MetaItemType.LABEL, "Open Weather Map API weather end point"), + new MetaItem<>(MetaItemType.READ_ONLY, true), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS, false), + new MetaItem<>(MetaItemType.RULE_STATE, false), new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 18), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 29), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - charger3Asset.setManufacturer("Siemens"); - charger3Asset.setModel("CPC 50"); - charger3Asset.setId(UniqueIdentifierGenerator.generateId(charger3Asset.getName())); - charger3Asset = assetStorageService.merge(charger3Asset); - - ElectricityChargerAsset charger4Asset = createDemoElectricityChargerAsset("Charger 4 Markthal", building3Asset, new GeoJSONPoint(4.486286, 51.919733)); - charger4Asset.setPower(0d); - charger4Asset.getAttributes().getOrCreate(ElectricityChargerAsset.POWER) - .addMeta( + MetaItemType.ATTRIBUTE_LINKS, + new AttributeLink[] { + createWeatherApiAttributeLink( + weather.getId(), "main", "temp", "temperature"), + createWeatherApiAttributeLink( + weather.getId(), "main", "humidity", "humidity"), + createWeatherApiAttributeLink( + weather.getId(), "wind", "speed", "windSpeed"), + createWeatherApiAttributeLink( + weather.getId(), "wind", "deg", "windDirection") + }))); + weather + .getAttribute("windSpeed") + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(MetaItemType.STORE_DATA_POINTS), + new MetaItem<>(MetaItemType.RULE_STATE)); + }); + weather + .getAttribute("temperature") + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(MetaItemType.STORE_DATA_POINTS), + new MetaItem<>(MetaItemType.RULE_STATE)); + }); + weather + .getAttribute("windDirection") + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(MetaItemType.STORE_DATA_POINTS), + new MetaItem<>(MetaItemType.RULE_STATE)); + }); + weather + .getAttribute("humidity") + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(MetaItemType.STORE_DATA_POINTS), + new MetaItem<>(MetaItemType.RULE_STATE)); + }); + new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.463250, 51.918849)); + weather = assetStorageService.merge(weather); + + // ################################ Realm smartcity - Environment monitor + // ################################### + + Asset environmentMonitor = new ThingAsset("Environment monitor"); + environmentMonitor.setRealm(this.realmCityName); + environmentMonitor.setId(UniqueIdentifierGenerator.generateId(environmentMonitor.getName())); + environmentMonitor = assetStorageService.merge(environmentMonitor); + + EnvironmentSensorAsset environment1Asset = + createDemoEnvironmentAsset( + "Oudehaven", + environmentMonitor, + new GeoJSONPoint(4.49313, 51.91885), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + EnvironmentSensorAsset environment2Asset = + createDemoEnvironmentAsset( + "Kaappark", + environmentMonitor, + new GeoJSONPoint(4.480434, 51.899287), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + EnvironmentSensorAsset environment3Asset = + createDemoEnvironmentAsset( + "Museumpark", + environmentMonitor, + new GeoJSONPoint(4.472457, 51.912047), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + EnvironmentSensorAsset environment4Asset = + createDemoEnvironmentAsset( + "Eendrachtsplein", + environmentMonitor, + new GeoJSONPoint(4.473599, 51.916292), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + + EnvironmentSensorAsset[] environmentArray = { + environment1Asset, environment2Asset, environment3Asset, environment4Asset + }; + for (EnvironmentSensorAsset asset : environmentArray) { + asset.setManufacturer("Intemo"); + asset.setModel("Josene outdoor"); + asset + .getAttribute(EnvironmentSensorAsset.OZONE) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 17), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 30), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 4) - } - ) - ) - ); - - charger4Asset.setManufacturer("SemaConnect"); - charger4Asset.setModel("The Series 6"); - charger4Asset.setId(UniqueIdentifierGenerator.generateId(charger4Asset.getName())); - charger4Asset = assetStorageService.merge(charger4Asset); - - // ### Erasmianum ### - - BuildingAsset building4Asset = new BuildingAsset("Erasmianum"); - building4Asset.setParent(energyManagement); - building4Asset.getAttributes().addOrReplace( - new Attribute<>(BuildingAsset.STREET, "Wytemaweg 25"), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3015 CN"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.468324, 51.912062)) - ); - building4Asset.setId(UniqueIdentifierGenerator.generateId(building4Asset.getName() + "building")); - building4Asset = assetStorageService.merge(building4Asset); - - ElectricityConsumerAsset consumption4Asset = createDemoElectricityConsumerAsset("Consumption Erasmianum", building4Asset, new GeoJSONPoint(4.468324, 51.912062)); - consumption4Asset.getAttribute(ElectricityConsumerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + new SimulatorReplayDatapoint( + midnight.get(SECOND_OF_DAY), getRandomNumberInRange(80, 90)), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 90)), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 90)), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 90)), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), + getRandomNumberInRange(75, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 110)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), + getRandomNumberInRange(85, 110)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), + getRandomNumberInRange(85, 115)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), + getRandomNumberInRange(85, 115)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), + getRandomNumberInRange(85, 115)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), + getRandomNumberInRange(105, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), + getRandomNumberInRange(105, 125)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 125)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), + getRandomNumberInRange(90, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), + getRandomNumberInRange(90, 115)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), + getRandomNumberInRange(90, 110)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 95)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 90)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), + getRandomNumberInRange(80, 90)) + }))); + }); + asset.setId(UniqueIdentifierGenerator.generateId(asset.getName())); + asset = assetStorageService.merge(asset); + } + + GroundwaterSensorAsset groundwater1Asset = + createDemoGroundwaterAsset( + "Leuvehaven", environmentMonitor, new GeoJSONPoint(4.48413, 51.91431)); + GroundwaterSensorAsset groundwater2Asset = + createDemoGroundwaterAsset( + "Steiger", environmentMonitor, new GeoJSONPoint(4.482887, 51.920082)); + GroundwaterSensorAsset groundwater3Asset = + createDemoGroundwaterAsset( + "Stadhuis", environmentMonitor, new GeoJSONPoint(4.480876, 51.923212)); + + GroundwaterSensorAsset[] groundwaterArray = { + groundwater1Asset, groundwater2Asset, groundwater3Asset + }; + for (GroundwaterSensorAsset asset : groundwaterArray) { + asset.setManufacturer("Eijkelkamp"); + asset.setModel("TeleControlNet"); + asset + .getAttribute(GroundwaterSensorAsset.SOIL_TEMPERATURE) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 37), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 41), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 47), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 49), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 51), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 43), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 48), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 45), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 46), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 41), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 30), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 19), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 6) - } - ) - ) - ); - }); - consumption4Asset.setId(UniqueIdentifierGenerator.generateId(consumption4Asset.getName())); - consumption4Asset = assetStorageService.merge(consumption4Asset); - - // ### Oostelijk zwembad ### - - BuildingAsset building5Asset = new BuildingAsset("Oostelijk zwembad"); - building5Asset.setParent(energyManagement); - building5Asset.getAttributes().addOrReplace( - new Attribute<>(BuildingAsset.STREET, "Gerdesiaweg 480"), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3061 RA"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands"), - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.498048, 51.925770)) - ); - building5Asset.setId(UniqueIdentifierGenerator.generateId(building5Asset.getName() + "building")); - building5Asset = assetStorageService.merge(building5Asset); - - ElectricityConsumerAsset consumption5Asset = createDemoElectricityConsumerAsset("Consumption Zwembad", building5Asset, new GeoJSONPoint(4.498048, 51.925770)); - consumption5Asset.getAttribute(ElectricityConsumerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 12.2), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 12.0), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 11.8), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 11.7), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 11.7), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 11.9), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 12.8), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 13.5), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 13.9), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 15.2), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 15.3), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 15.5), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 15.5), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 15.4), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 15.2), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 15.2), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 14.6), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 14.2), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 13.8), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 13.4), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 12.8), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 12.3) + }))); + }); + asset + .getAttribute(GroundwaterSensorAsset.WATER_LEVEL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 17), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 16), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 24), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 35), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 33), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 33), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 31), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 37), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 37), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 35), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 24), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 19) - } - ) - ) - ); - }); - consumption5Asset.setId(UniqueIdentifierGenerator.generateId(consumption5Asset.getName())); - consumption5Asset = assetStorageService.merge(consumption5Asset); + new SimulatorReplayDatapoint( + midnight.get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), + getRandomNumberInRange(100, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), + getRandomNumberInRange(100, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), + getRandomNumberInRange(90, 110)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), + getRandomNumberInRange(100, 110)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), + getRandomNumberInRange(100, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), + getRandomNumberInRange(110, 120)) + }))); + }); + asset.setId(UniqueIdentifierGenerator.generateId(asset.getName())); + asset = assetStorageService.merge(asset); + } + + // ################################ Realm smartcity - Mobility and Safety + // ################################### + + Asset mobilityAndSafety = new ThingAsset("Mobility and safety"); + mobilityAndSafety.setRealm(this.realmCityName); + mobilityAndSafety.setId(UniqueIdentifierGenerator.generateId(mobilityAndSafety.getName())); + mobilityAndSafety = assetStorageService.merge(mobilityAndSafety); - ElectricityProducerSolarAsset production5Asset = createDemoElectricitySolarProducerAsset("Solar Zwembad", building5Asset, new GeoJSONPoint(4.498281, 51.925507)); - production5Asset.getAttribute(ElectricityProducerAsset.POWER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( + // ### Parking ### + + GroupAsset parkingGroupAsset = new GroupAsset("Parking group", ParkingAsset.class); + parkingGroupAsset.setParent(mobilityAndSafety); + parkingGroupAsset + .getAttributes() + .addOrReplace( + new Attribute<>("totalOccupancy", ValueType.POSITIVE_INTEGER) + .addMeta( + new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_PERCENTAGE)), new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), -1), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), -3), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), -8), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), -30), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), -44), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), -42), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), -41), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), -29), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), -19), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), -16), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), -11), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), -4), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), -3), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), -2), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0) - } - ) - ) - ); - }); - production5Asset.setEnergyExportTotal(23461d); - production5Asset.setPowerExportMax(76.2); - production5Asset.setEfficiencyExport(86); - production5Asset.setPanelOrientation(ElectricityProducerSolarAsset.PanelOrientation.SOUTH); - production5Asset.setManufacturer("S-Energy"); - production5Asset.setModel("SN260P-10"); - production5Asset.setPanelAzimuth(50); - production5Asset.setPanelPitch(15); - production5Asset.setId(UniqueIdentifierGenerator.generateId(production5Asset.getName())); - production5Asset = assetStorageService.merge(production5Asset); - - // ### Weather ### - HTTPAgent weatherHttpApiAgent = new HTTPAgent("Weather Agent"); - weatherHttpApiAgent.setParent(energyManagement); - weatherHttpApiAgent.setBaseURI("https://api.openweathermap.org/data/2.5/"); - - MultivaluedStringMap queryParams = new MultivaluedStringMap(); - queryParams.put("appid", Collections.singletonList("c3ecbf09be5267cd280676a01acd3360")); - queryParams.put("lat", Collections.singletonList("51.918849")); - queryParams.put("lon", Collections.singletonList("4.463250")); - queryParams.put("units", Collections.singletonList("metric")); - weatherHttpApiAgent.setRequestQueryParameters(queryParams); - - MultivaluedStringMap headers = new MultivaluedStringMap(); - headers.put("Accept", Collections.singletonList("application/json")); - weatherHttpApiAgent.setRequestHeaders(headers); - - weatherHttpApiAgent = assetStorageService.merge(weatherHttpApiAgent); - weatherHttpApiAgentId = weatherHttpApiAgent.getId(); - - WeatherAsset weather = new WeatherAsset("Weather"); - weather.setParent(energyManagement); - weather.setId(UniqueIdentifierGenerator.generateId(weather.getName())); - - HTTPAgentLink agentLink = new HTTPAgentLink(weatherHttpApiAgentId); - agentLink.setPath("weather"); - agentLink.setPollingMillis((int)halfHourInMillis); - - weather.getAttributes().addOrReplace( - new Attribute<>("currentWeather") - .addMeta( - new MetaItem<>(MetaItemType.AGENT_LINK, agentLink), - new MetaItem<>(MetaItemType.LABEL, "Open Weather Map API weather end point"), - new MetaItem<>(MetaItemType.READ_ONLY, true), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS, false), - new MetaItem<>(MetaItemType.RULE_STATE, false), - new MetaItem<>(MetaItemType.ATTRIBUTE_LINKS, new AttributeLink[] { - createWeatherApiAttributeLink(weather.getId(), "main", "temp", "temperature"), - createWeatherApiAttributeLink(weather.getId(), "main", "humidity", "humidity"), - createWeatherApiAttributeLink(weather.getId(), "wind", "speed", "windSpeed"), - createWeatherApiAttributeLink(weather.getId(), "wind", "deg", "windDirection") - }) - )); - weather.getAttribute("windSpeed").ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.STORE_DATA_POINTS), - new MetaItem<>(MetaItemType.RULE_STATE) - ); - }); - weather.getAttribute("temperature").ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.STORE_DATA_POINTS), - new MetaItem<>(MetaItemType.RULE_STATE) - ); - }); - weather.getAttribute("windDirection").ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.STORE_DATA_POINTS), - new MetaItem<>(MetaItemType.RULE_STATE) - ); - }); - weather.getAttribute("humidity").ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.STORE_DATA_POINTS), - new MetaItem<>(MetaItemType.RULE_STATE) - ); - }); - new Attribute<>(Asset.LOCATION, new GeoJSONPoint(4.463250, 51.918849)); - weather = assetStorageService.merge(weather); - - // ################################ Realm smartcity - Environment monitor ################################### - - Asset environmentMonitor = new ThingAsset("Environment monitor"); - environmentMonitor.setRealm(this.realmCityName); - environmentMonitor.setId(UniqueIdentifierGenerator.generateId(environmentMonitor.getName())); - environmentMonitor = assetStorageService.merge(environmentMonitor); - - EnvironmentSensorAsset environment1Asset = createDemoEnvironmentAsset("Oudehaven", environmentMonitor, new GeoJSONPoint(4.49313, 51.91885), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - EnvironmentSensorAsset environment2Asset = createDemoEnvironmentAsset("Kaappark", environmentMonitor, new GeoJSONPoint(4.480434, 51.899287), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - EnvironmentSensorAsset environment3Asset = createDemoEnvironmentAsset("Museumpark", environmentMonitor, new GeoJSONPoint(4.472457, 51.912047), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - EnvironmentSensorAsset environment4Asset = createDemoEnvironmentAsset("Eendrachtsplein", environmentMonitor, new GeoJSONPoint(4.473599, 51.916292), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - - EnvironmentSensorAsset[] environmentArray = {environment1Asset, environment2Asset, environment3Asset, environment4Asset}; - for (EnvironmentSensorAsset asset : environmentArray) { - asset.setManufacturer("Intemo"); - asset.setModel("Josene outdoor"); - asset.getAttribute(EnvironmentSensorAsset.OZONE).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), getRandomNumberInRange(80,90)), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), getRandomNumberInRange(75,90)), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), getRandomNumberInRange(75,90)), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), getRandomNumberInRange(75,90)), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), getRandomNumberInRange(75,95)), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), getRandomNumberInRange(75,95)), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), getRandomNumberInRange(75,95)), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), getRandomNumberInRange(80,95)), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), getRandomNumberInRange(80,95)), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), getRandomNumberInRange(80,110)), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), getRandomNumberInRange(85,110)), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), getRandomNumberInRange(85,115)), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), getRandomNumberInRange(85,115)), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), getRandomNumberInRange(85,115)), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), getRandomNumberInRange(105,120)), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), getRandomNumberInRange(105,125)), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), getRandomNumberInRange(110,125)), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), getRandomNumberInRange(90,120)), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), getRandomNumberInRange(90,115)), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), getRandomNumberInRange(90,110)), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), getRandomNumberInRange(80,95)), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), getRandomNumberInRange(80,95)), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), getRandomNumberInRange(80,90)), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), getRandomNumberInRange(80,90)) - } - ) - ) - ); + MetaItemType.CONSTRAINTS, + ValueConstraint.constraints( + new ValueConstraint.Min(0), new ValueConstraint.Max(100))), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS))); + parkingGroupAsset.setId(UniqueIdentifierGenerator.generateId(parkingGroupAsset.getName())); + parkingGroupAsset = assetStorageService.merge(parkingGroupAsset); + + ParkingAsset parking1Asset = + createDemoParkingAsset("Markthal", parkingGroupAsset, new GeoJSONPoint(4.48527, 51.91984)) + .setManufacturer("SKIDATA") + .setModel("Barrier.Gate"); + parking1Asset + .getAttribute(ParkingAsset.SPACES_OCCUPIED) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 37), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 31), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 39), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 47), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 53), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 165), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 301), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 417), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 442), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 489), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 467), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 490), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 438), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 457), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 402), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 379), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 336), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 257), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 204), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 112), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 75) + }))); }); - asset.setId(UniqueIdentifierGenerator.generateId(asset.getName())); - asset = assetStorageService.merge(asset); - } - - GroundwaterSensorAsset groundwater1Asset = createDemoGroundwaterAsset("Leuvehaven", environmentMonitor, new GeoJSONPoint(4.48413, 51.91431)); - GroundwaterSensorAsset groundwater2Asset = createDemoGroundwaterAsset("Steiger", environmentMonitor, new GeoJSONPoint(4.482887, 51.920082)); - GroundwaterSensorAsset groundwater3Asset = createDemoGroundwaterAsset("Stadhuis", environmentMonitor, new GeoJSONPoint(4.480876, 51.923212)); - - GroundwaterSensorAsset[] groundwaterArray = {groundwater1Asset, groundwater2Asset, groundwater3Asset}; - for (GroundwaterSensorAsset asset : groundwaterArray) { - asset.setManufacturer("Eijkelkamp"); - asset.setModel("TeleControlNet"); - asset.getAttribute(GroundwaterSensorAsset.SOIL_TEMPERATURE).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 12.2), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 12.0), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 11.8), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 11.7), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 11.7), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 11.9), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 12.8), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 13.5), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 13.9), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 15.2), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 15.3), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 15.5), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 15.5), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 15.4), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 15.2), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 15.2), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 14.6), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 14.2), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 13.8), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 13.4), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 12.8), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 12.3) - } - ) - ) - ); + parking1Asset.setPriceHourly(3.75); + parking1Asset.setPriceDaily(25.00); + parking1Asset.setSpacesTotal(512); + parking1Asset + .getAttribute(ParkingAsset.SPACES_TOTAL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta(new MetaItem<>(MetaItemType.RULE_STATE)); }); - asset.getAttribute(GroundwaterSensorAsset.WATER_LEVEL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), getRandomNumberInRange(100, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), getRandomNumberInRange(100, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), getRandomNumberInRange(90, 110)), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), getRandomNumberInRange(100, 110)), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), getRandomNumberInRange(100, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), getRandomNumberInRange(110, 120)) - } - ) - ) - ); + parking1Asset.setId(UniqueIdentifierGenerator.generateId(parking1Asset.getName())); + parking1Asset = assetStorageService.merge(parking1Asset); + + ParkingAsset parking2Asset = + createDemoParkingAsset("Lijnbaan", parkingGroupAsset, new GeoJSONPoint(4.47681, 51.91849)); + parking2Asset.setManufacturer("SKIDATA"); + parking2Asset.setModel("Barrier.Gate"); + parking2Asset + .getAttribute(ParkingAsset.SPACES_OCCUPIED) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 31), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 24), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 46), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 48), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 52), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 89), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 142), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 246), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 231), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 367), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 345), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 386), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 312), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 363), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 276), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 249), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 256), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 123), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 153), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 83), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 25) + }))); }); - asset.setId(UniqueIdentifierGenerator.generateId(asset.getName())); - asset = assetStorageService.merge(asset); - } - - // ################################ Realm smartcity - Mobility and Safety ################################### - - Asset mobilityAndSafety = new ThingAsset("Mobility and safety"); - mobilityAndSafety.setRealm(this.realmCityName); - mobilityAndSafety.setId(UniqueIdentifierGenerator.generateId(mobilityAndSafety.getName())); - mobilityAndSafety = assetStorageService.merge(mobilityAndSafety); - - // ### Parking ### - - GroupAsset parkingGroupAsset = new GroupAsset("Parking group", ParkingAsset.class); - parkingGroupAsset.setParent(mobilityAndSafety); - parkingGroupAsset.getAttributes().addOrReplace( - new Attribute<>("totalOccupancy", ValueType.POSITIVE_INTEGER) - .addMeta( - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_PERCENTAGE)), - new MetaItem<>(MetaItemType.CONSTRAINTS, ValueConstraint.constraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100))), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - )); - parkingGroupAsset.setId(UniqueIdentifierGenerator.generateId(parkingGroupAsset.getName())); - parkingGroupAsset = assetStorageService.merge(parkingGroupAsset); - - ParkingAsset parking1Asset = createDemoParkingAsset("Markthal", parkingGroupAsset, new GeoJSONPoint(4.48527, 51.91984)) - .setManufacturer("SKIDATA") - .setModel("Barrier.Gate"); - parking1Asset.getAttribute(ParkingAsset.SPACES_OCCUPIED).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 37), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 31), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 39), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 47), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 53), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 165), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 301), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 417), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 442), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 489), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 467), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 490), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 438), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 457), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 402), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 379), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 336), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 257), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 204), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 112), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 75) - } - ) - ) - ); - }); - parking1Asset.setPriceHourly(3.75); - parking1Asset.setPriceDaily(25.00); - parking1Asset.setSpacesTotal(512); - parking1Asset.getAttribute(ParkingAsset.SPACES_TOTAL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.RULE_STATE)); - }); - parking1Asset.setId(UniqueIdentifierGenerator.generateId(parking1Asset.getName())); - parking1Asset = assetStorageService.merge(parking1Asset); - - ParkingAsset parking2Asset = createDemoParkingAsset("Lijnbaan", parkingGroupAsset, new GeoJSONPoint(4.47681, 51.91849)); - parking2Asset.setManufacturer("SKIDATA"); - parking2Asset.setModel("Barrier.Gate"); - parking2Asset.getAttribute(ParkingAsset.SPACES_OCCUPIED).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 31), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 24), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 46), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 48), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 52), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 89), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 142), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 246), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 231), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 367), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 345), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 386), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 312), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 363), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 276), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 249), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 256), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 123), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 153), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 83), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 25) - } - ) - ) - ); - }); - parking2Asset.setPriceHourly(3.50); - parking2Asset.setPriceDaily(23.00); - parking2Asset.setSpacesTotal(390); - parking2Asset.getAttribute(ParkingAsset.SPACES_TOTAL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.RULE_STATE)); - }); - parking2Asset.setId(UniqueIdentifierGenerator.generateId(parking2Asset.getName())); - parking2Asset = assetStorageService.merge(parking2Asset); - - ParkingAsset parking3Asset = createDemoParkingAsset("Erasmusbrug", parkingGroupAsset, new GeoJSONPoint(4.48207, 51.91127)); - parking3Asset.setManufacturer("Kiestra"); - parking3Asset.setModel("Genius Rainbow"); - parking3Asset.getAttribute(ParkingAsset.SPACES_OCCUPIED).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 25), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 18), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 29), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 119), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 257), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 357), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 368), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 362), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 349), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 370), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 367), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 355), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 314), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 254), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 215), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 165), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 149), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 108), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 47) - } - ) - ) - ); - }); - parking3Asset.setPriceHourly(3.40); - parking3Asset.setPriceDaily(20.00); - parking3Asset.setSpacesTotal(373); - parking3Asset.getAttribute(ParkingAsset.SPACES_TOTAL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>(MetaItemType.RULE_STATE)); + parking2Asset.setPriceHourly(3.50); + parking2Asset.setPriceDaily(23.00); + parking2Asset.setSpacesTotal(390); + parking2Asset + .getAttribute(ParkingAsset.SPACES_TOTAL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta(new MetaItem<>(MetaItemType.RULE_STATE)); }); - parking3Asset.setId(UniqueIdentifierGenerator.generateId(parking3Asset.getName())); - parking3Asset = assetStorageService.merge(parking3Asset); - - // ### Crowd control ### - - ThingAsset assetAreaStation = new ThingAsset("Stationsplein"); - assetAreaStation.setParent(mobilityAndSafety) - .getAttributes().addOrReplace( - new Attribute<>(Asset.LOCATION, STATIONSPLEIN_LOCATION), - new Attribute<>(BuildingAsset.POSTAL_CODE, "3013 AK"), - new Attribute<>(BuildingAsset.CITY, "Rotterdam"), - new Attribute<>(BuildingAsset.COUNTRY, "Netherlands") - ); - assetAreaStation.setId(UniqueIdentifierGenerator.generateId(assetAreaStation.getName())); - assetAreaStation = assetStorageService.merge(assetAreaStation); - area1Id = assetAreaStation.getId(); - - PeopleCounterAsset peopleCounter1Asset = createDemoPeopleCounterAsset("People Counter South", assetAreaStation, new GeoJSONPoint(4.470147, 51.923171), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - peopleCounter1Asset.setManufacturer("ViNotion"); - peopleCounter1Asset.setModel("ViSense"); - peopleCounter1Asset.getAttribute(PeopleCounterAsset.COUNT_GROWTH_PER_MINUTE).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0.2), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0.3), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0.1), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0.0), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0.2), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0.4), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0.5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0.7), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 1.8), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 2.1), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 2.4), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 1.9), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 1.8), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 2.1), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 1.8), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 1.7), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 2.3), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 3.1), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 2.8), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 2.2), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 1.6), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 1.7), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 1.1), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0.8) - } - ) - ) - ); - }); - peopleCounter1Asset.setId(UniqueIdentifierGenerator.generateId(peopleCounter1Asset.getName())); - peopleCounter1Asset = assetStorageService.merge(peopleCounter1Asset); - - Asset peopleCounter2Asset = createDemoPeopleCounterAsset("People Counter North", assetAreaStation, new GeoJSONPoint(4.469329, 51.923700), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId)); - peopleCounter2Asset.setManufacturer("Axis"); - peopleCounter2Asset.setModel("P1375-E"); - peopleCounter2Asset.getAttribute(PeopleCounterAsset.COUNT_GROWTH_PER_MINUTE).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0.3), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), 0.2), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), 0.3), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), 0.1), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), 0.0), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), 0.3), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 0.7), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 0.6), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 1.9), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 2.2), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 2.8), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 1.6), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 1.9), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 2.2), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 1.9), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 1.6), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 2.4), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 3.2), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 2.9), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 2.3), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 1.7), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 1.4), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 1.2), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 0.7) - } - ) - ) - ); - }); - peopleCounter2Asset.setId(UniqueIdentifierGenerator.generateId(peopleCounter2Asset.getName())); - peopleCounter2Asset = assetStorageService.merge(peopleCounter2Asset); - - MicrophoneAsset microphone1Asset = createDemoMicrophoneAsset("Microphone South", assetAreaStation, new GeoJSONPoint(4.470362, 51.923201), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), getRandomNumberInRange(50,60)), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), getRandomNumberInRange(60,70)), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), getRandomNumberInRange(60,70)), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), getRandomNumberInRange(50,60)) - } - )); - microphone1Asset.setManufacturer("Sorama"); - microphone1Asset.setModel("CAM1K"); - microphone1Asset.setId(UniqueIdentifierGenerator.generateId(microphone1Asset.getName())); - microphone1Asset = assetStorageService.merge(microphone1Asset); - - MicrophoneAsset microphone2Asset = createDemoMicrophoneAsset("Microphone North", assetAreaStation, new GeoJSONPoint(4.469190, 51.923786), () -> - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[] { - new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), getRandomNumberInRange(50,60)), - new SimulatorReplayDatapoint(midnight.plusHours(1).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(2).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(3).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(4).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(5).get(SECOND_OF_DAY), getRandomNumberInRange(45,50)), - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), getRandomNumberInRange(50,55)), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), getRandomNumberInRange(60,70)), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), getRandomNumberInRange(55,60)), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), getRandomNumberInRange(60,70)), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), getRandomNumberInRange(60,65)), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), getRandomNumberInRange(50,60)) - } - )); - microphone2Asset.setManufacturer("Sorama"); - microphone2Asset.setModel("CAM1K"); - microphone2Asset.setId(UniqueIdentifierGenerator.generateId(microphone2Asset.getName())); - microphone2Asset = assetStorageService.merge(microphone2Asset); - - LightAsset lightStation1Asset = createDemoLightAsset("Station Light NW", assetAreaStation, new GeoJSONPoint(4.468874, 51.923881)); - lightStation1Asset.setManufacturer("Philips"); - lightStation1Asset.setModel("CityTouch"); - lightStation1Asset.setId(UniqueIdentifierGenerator.generateId(lightStation1Asset.getName())); - lightStation1Asset = assetStorageService.merge(lightStation1Asset); - - LightAsset lightStation2Asset = createDemoLightAsset("Station Light NE", assetAreaStation, new GeoJSONPoint(4.470539, 51.923991)); - lightStation2Asset.setManufacturer("Philips"); - lightStation2Asset.setModel("CityTouch"); - lightStation2Asset.setId(UniqueIdentifierGenerator.generateId(lightStation2Asset.getName())); - lightStation2Asset = assetStorageService.merge(lightStation2Asset); - - LightAsset lightStation3Asset = createDemoLightAsset("Station Light S", assetAreaStation, new GeoJSONPoint(4.470558, 51.923186)); - lightStation3Asset.setManufacturer("Philips"); - lightStation3Asset.setModel("CityTouch"); - lightStation3Asset.setId(UniqueIdentifierGenerator.generateId(lightStation3Asset.getName())); - lightStation3Asset = assetStorageService.merge(lightStation3Asset); - - // ### Lighting controller ### - - LightAsset lightingControllerOPAsset = createDemoLightControllerAsset("Lighting Noordereiland", mobilityAndSafety, new GeoJSONPoint(4.496177, 51.915060)); - lightingControllerOPAsset.setManufacturer("Pharos"); - lightingControllerOPAsset.setModel("LPC X"); - lightingControllerOPAsset.setId(UniqueIdentifierGenerator.generateId(lightingControllerOPAsset.getName())); - lightingControllerOPAsset = assetStorageService.merge(lightingControllerOPAsset); - - LightAsset lightOP1Asset = createDemoLightAsset("Ons Park 1", lightingControllerOPAsset, new GeoJSONPoint(4.49626, 51.91516)); - lightOP1Asset.setManufacturer("Schréder"); - lightOP1Asset.setModel("Axia 2"); - lightOP1Asset.setId(UniqueIdentifierGenerator.generateId(lightOP1Asset.getName())); - lightOP1Asset = assetStorageService.merge(lightOP1Asset); - - LightAsset lightOP2Asset = createDemoLightAsset("Ons Park 2", lightingControllerOPAsset, new GeoJSONPoint(4.49705, 51.91549)); - lightOP2Asset.setManufacturer("Schréder"); - lightOP2Asset.setModel("Axia 2"); - lightOP2Asset.setId(UniqueIdentifierGenerator.generateId(lightOP2Asset.getName())); - lightOP2Asset = assetStorageService.merge(lightOP2Asset); - - LightAsset lightOP3Asset = createDemoLightAsset("Ons Park 3", lightingControllerOPAsset, new GeoJSONPoint(4.49661, 51.91495)); - lightOP3Asset.setManufacturer("Schréder"); - lightOP3Asset.setModel("Axia 2"); - lightOP3Asset.setId(UniqueIdentifierGenerator.generateId(lightOP3Asset.getName())); - lightOP3Asset = assetStorageService.merge(lightOP3Asset); - - LightAsset lightOP4Asset = createDemoLightAsset("Ons Park 4", lightingControllerOPAsset, new GeoJSONPoint(4.49704, 51.91520)); - lightOP4Asset.setManufacturer("Schréder"); - lightOP4Asset.setModel("Axia 2"); - lightOP4Asset.setId(UniqueIdentifierGenerator.generateId(lightOP4Asset.getName())); - lightOP4Asset = assetStorageService.merge(lightOP4Asset); - - LightAsset lightOP5Asset = createDemoLightAsset("Ons Park 5", lightingControllerOPAsset, new GeoJSONPoint(4.49758, 51.91440)); - lightOP5Asset.setManufacturer("Schréder"); - lightOP5Asset.setModel("Axia 2"); - lightOP5Asset.setId(UniqueIdentifierGenerator.generateId(lightOP5Asset.getName())); - lightOP5Asset = assetStorageService.merge(lightOP5Asset); - - LightAsset lightOP6Asset = createDemoLightAsset("Ons Park 6", lightingControllerOPAsset, new GeoJSONPoint(4.49786, 51.91452)); - lightOP6Asset.setManufacturer("Schréder"); - lightOP6Asset.setModel("Axia 2"); - lightOP6Asset.setId(UniqueIdentifierGenerator.generateId(lightOP6Asset.getName())); - lightOP6Asset = assetStorageService.merge(lightOP6Asset); - - // ### Ships ### - - GroupAsset shipGroupAsset = new GroupAsset("Ship group", ShipAsset.class); - shipGroupAsset.setParent(mobilityAndSafety); - shipGroupAsset.setId(UniqueIdentifierGenerator.generateId(shipGroupAsset.getName())); - shipGroupAsset = assetStorageService.merge(shipGroupAsset); - - ShipAsset ship1Asset = createDemoShipAsset("Hotel New York", shipGroupAsset, new GeoJSONPoint(4.482669, 51.916436)); - ship1Asset.setLength(12); - ship1Asset.setShipType("Passenger"); - ship1Asset.setIMONumber(9183527); - ship1Asset.setMSSINumber(244650537); - ship1Asset.getAttribute(ShipAsset.DIRECTION).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 187), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 7) - } - ) - ) - ); - }); - ship1Asset.getAttribute(Asset.LOCATION).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(smartcitySimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(5).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(10).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(15).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(20).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(25).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), new GeoJSONPoint(4.484374, 51.903518)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(35).get(SECOND_OF_DAY), new GeoJSONPoint(4.479779, 51.904404)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(40).get(SECOND_OF_DAY), new GeoJSONPoint(4.482914, 51.906769)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(45).get(SECOND_OF_DAY), new GeoJSONPoint(4.486156, 51.908570)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(50).get(SECOND_OF_DAY), new GeoJSONPoint(4.483362, 51.911897)), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(55).get(SECOND_OF_DAY), new GeoJSONPoint(4.482669, 51.916436)) - } - ) - ) - ); - }); - ship1Asset.setId(UniqueIdentifierGenerator.generateId(ship1Asset.getName())); - ship1Asset = assetStorageService.merge(ship1Asset); - - // ################################ Realm Manufaturer Simulator ################################### - - SimulatorAgent manufacturerSimulatorAgent = new SimulatorAgent("Simulator"); - manufacturerSimulatorAgent.setRealm(this.realmManufacturerName); - - manufacturerSimulatorAgent = assetStorageService.merge(manufacturerSimulatorAgent); - manufacturerSimulatorAgentId = manufacturerSimulatorAgent.getId(); - - // ################################ Manufacturer realm assets ################################### - - // ### Greenhouse equipment distribution ### - - Asset distributor1 = new ThingAsset("GreenEquipment Distribution"); - distributor1.setRealm(this.realmManufacturerName); - distributor1.setId(UniqueIdentifierGenerator.generateId(distributor1.getName())); - distributor1 = assetStorageService.merge(distributor1); - - BuildingAsset vegetablesAndMore = new BuildingAsset("Vegetables & More"); - vegetablesAndMore.setParent(distributor1); - vegetablesAndMore.setId(UniqueIdentifierGenerator.generateId(vegetablesAndMore.getName())); - vegetablesAndMore = assetStorageService.merge(vegetablesAndMore); - - HarvestRobotAsset harvestRobot1 = createDemoHarvestRobotAsset("Robot 1", vegetablesAndMore, new GeoJSONPoint(4.279166, 51.978078), OperationMode.CUTTING, VegetableType.BELL_PEPPER, 26, 45, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - harvestRobot1.setId(UniqueIdentifierGenerator.generateId(harvestRobot1.getName())); - harvestRobot1 = assetStorageService.merge(harvestRobot1); - HarvestRobotAsset harvestRobot2 = createDemoHarvestRobotAsset("Robot 2", vegetablesAndMore, new GeoJSONPoint(4.277852, 51.977487), OperationMode.SCANNING, VegetableType.BELL_PEPPER, 26, 45, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - harvestRobot2.setId(UniqueIdentifierGenerator.generateId(harvestRobot2.getName())); - harvestRobot2 = assetStorageService.merge(harvestRobot2); - SoilSensorAsset soilSensor1 = createDemoSoilSensorAsset("Water sensor", vegetablesAndMore, new GeoJSONPoint(4.279010, 51.977391), 41, 53, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - soilSensor1.setId(UniqueIdentifierGenerator.generateId(soilSensor1.getName())); - soilSensor1 = assetStorageService.merge(soilSensor1); - - BuildingAsset moreauHorticulture = new BuildingAsset("Qoreau Horticulture"); - moreauHorticulture.setParent(distributor1); - moreauHorticulture.setId(UniqueIdentifierGenerator.generateId(moreauHorticulture.getName())); - moreauHorticulture = assetStorageService.merge(moreauHorticulture); - - IrrigationAsset irrigation1 = createDemoIrrigationAsset("Soil drip 1", moreauHorticulture, new GeoJSONPoint(4.311493, 51.961554), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - IrrigationAsset irrigation2 = createDemoIrrigationAsset("Soil drip 2", moreauHorticulture, new GeoJSONPoint(4.310893, 51.961354), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - IrrigationAsset irrigation3 = createDemoIrrigationAsset("Soil drip 3", moreauHorticulture, new GeoJSONPoint(4.310293, 51.961154), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - IrrigationAsset irrigation4 = createDemoIrrigationAsset("Soil drip 4", moreauHorticulture, new GeoJSONPoint(4.309617, 51.960975), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - IrrigationAsset irrigation5 = createDemoIrrigationAsset("Soil drip 5", moreauHorticulture, new GeoJSONPoint(4.309153, 51.960901), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation1.setId(UniqueIdentifierGenerator.generateId(irrigation1.getName())); - irrigation1 = assetStorageService.merge(irrigation1); - irrigation2.setId(UniqueIdentifierGenerator.generateId(irrigation2.getName())); - irrigation2 = assetStorageService.merge(irrigation2); - irrigation3.setId(UniqueIdentifierGenerator.generateId(irrigation3.getName())); - irrigation3 = assetStorageService.merge(irrigation3); - irrigation4.setId(UniqueIdentifierGenerator.generateId(irrigation4.getName())); - irrigation4 = assetStorageService.merge(irrigation4); - irrigation5.setId(UniqueIdentifierGenerator.generateId(irrigation5.getName())); - irrigation5 = assetStorageService.merge(irrigation5); - SoilSensorAsset soilSensor2 = createDemoSoilSensorAsset("Soil measurement", moreauHorticulture, new GeoJSONPoint(4.310436, 51.961354), 27, 35, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - soilSensor2.setId(UniqueIdentifierGenerator.generateId(soilSensor2.getName())); - soilSensor2 = assetStorageService.merge(soilSensor2); - - BuildingAsset paprika = new BuildingAsset("Paprika Perfect BV"); - paprika.setParent(distributor1); - paprika.getAttributes().getOrCreate("flowPerMeter", ValueType.NUMBER) - .addMeta(new MetaItem<>(READ_ONLY), new MetaItem<>(RULE_STATE), new MetaItem<>(STORE_DATA_POINTS), - new MetaItem<>(UNITS, Constants.units(UNITS_LITRE, UNITS_PER, UNITS_METRE, UNITS_SQUARED, UNITS_HOUR))); - paprika.getAttribute(BuildingAsset.AREA).ifPresent(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(RULE_STATE)) - .setValue(1800);}); - paprika.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - paprika.setId(UniqueIdentifierGenerator.generateId(paprika.getName())); - paprikaId = paprika.getId(); - paprika = assetStorageService.merge(paprika); - - HarvestRobotAsset harvestRobot5 = createDemoHarvestRobotAsset("Harvest Robot 1", paprika, new GeoJSONPoint(4.282415, 51.975951), OperationMode.UNLOADING, VegetableType.TOMATO, 26, 45, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - harvestRobot5.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - harvestRobot5.getAttribute(HarvestRobotAsset.HARVESTED_SESSION).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 814), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 814), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 815), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 816), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 816), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 816), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 816), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 817), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 818), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 819), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 820), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 821), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 0), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 34), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 86), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 112), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 156), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 289), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 348), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 456), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 516), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 624), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 684), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 713), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 762), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 787), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 792), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 798), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 804), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 808), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 812), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 813), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 813), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 814), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 814) - } - ) - ) - ); - }); - harvestRobot5.getAttribute(HarvestRobotAsset.SPEED).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 8), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 1), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 1), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1) - } - ) - ) - ); - }); - harvestRobot5.setId(UniqueIdentifierGenerator.generateId(harvestRobot5.getName())); - harvestRobot5Id = harvestRobot5.getId(); - harvestRobot5 = assetStorageService.merge(harvestRobot5); - - IrrigationAsset irrigation9 = createDemoIrrigationAsset("Irrigation 1", paprika, new GeoJSONPoint(4.283731, 51.976526), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation9.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - irrigation9.getAttribute(IrrigationAsset.TANK_LEVEL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 1000), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 995), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 990), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 986), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 980), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 975), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 970), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 965), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 960), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 956), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 950), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 945), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 941), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 936), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 929), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 925), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 919), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 914), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 910), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 906), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 900), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 895), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 891), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 1200), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 1195), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 1190), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 1184), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 1173), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 1145), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 1105), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 1074), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 1032), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 1027), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 1022), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 1017), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1006) - } - ) - ) - ); - }); - irrigation9.getAttribute(IrrigationAsset.FLOW_WATER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 10.5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 10.8), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 11.3), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 11.9), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 12.5), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 10.8), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 9.6), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 9.4), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 10.4), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 11.8), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 12.3), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 11.3), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 11.7), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 10.2), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 10.3), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 10.1), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 10), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 9), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 10.2), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 10.1) - } - ) - ) - ); - }); - irrigation9.setId(UniqueIdentifierGenerator.generateId(irrigation9.getName())); - irrigation9Id = irrigation9.getId(); - irrigation9 = assetStorageService.merge(irrigation9); - IrrigationAsset irrigation10 = createDemoIrrigationAsset("Irrigation 2", paprika, new GeoJSONPoint(4.285047, 51.975652), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation10.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - irrigation10.getAttribute(IrrigationAsset.TANK_LEVEL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 1200), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 1193), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 1185), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 1178), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 1170), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1162), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 1155), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1148), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 1140), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 1132), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 1124), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 1117), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 1110), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 1102), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 1093), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 1085), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 1076), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 1070), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 1063), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 1055), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 1048), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 1041), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 1035), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 1028), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 1022), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 1021), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 1018), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 1015), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 1010), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 1002), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 995), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 1050), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 1150), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 1290), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 1250), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1210) - } - ) - ) - ); - }); - irrigation10.getAttribute(IrrigationAsset.FLOW_WATER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 12.5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 12.6), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 14.2), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 13.3), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 14.5), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 12.8), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 13.2), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 11.6), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 11.4), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 11.2), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 12.3), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 13.8), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 12.3), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 13.1), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 13.2), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 12.9), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 13.7), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 11.8), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 12.6), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 12.2), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 12.1) - } - ) - ) - ); - }); - irrigation10.setId(UniqueIdentifierGenerator.generateId(irrigation10.getName())); - irrigation10Id = irrigation10.getId(); - irrigation10 = assetStorageService.merge(irrigation10); - IrrigationAsset irrigation11 = createDemoIrrigationAsset("Irrigation 3", paprika, new GeoJSONPoint(4.286504, 51.974613), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation11.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - irrigation11.getAttribute(IrrigationAsset.TANK_LEVEL).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 1210), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 1190), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 1180), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 1172), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 1160), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1152), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 1145), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1141), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 1132), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 1125), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 1120), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 1110), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 1100), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 1102), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 1083), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 1071), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 1066), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 1060), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 1055), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 1035), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 1028), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 1021), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 1015), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 1006), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 1002), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 1001), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 997), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 985), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 985), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 982), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 975), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 1040), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 1200), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 1250), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 1250), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1220) - } - ) - ) - ); - }); - irrigation11.getAttribute(IrrigationAsset.FLOW_WATER).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 13.5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 13.5), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 14.2), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 13.1), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 15.2), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 15.4), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 13.8), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 14.2), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 12.6), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 12.2), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 12.2), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 13.2), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 13.4), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 14.7), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 13.2), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 14), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 14.1), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 14.6), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 12.9), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 13), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 13.4), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 13.1), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 12.9), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 12.1), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 13.2), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 13.1) - } - ) - ) - ); - }); - irrigation11.setId(UniqueIdentifierGenerator.generateId(irrigation11.getName())); - irrigation11Id = irrigation11.getId(); - irrigation11 = assetStorageService.merge(irrigation11); - - SoilSensorAsset soilSensor4 = createDemoSoilSensorAsset("Soil sensor", paprika, new GeoJSONPoint(4.285034, 51.973881), 34, 47, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - soilSensor4.getAttributes().stream().forEach(assetAttribute -> { - assetAttribute.addMeta(new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE));}); - soilSensor4.getAttribute(SoilSensorAsset.SALINITY).ifPresent(assetAttribute -> { - assetAttribute.addMeta( - new MetaItem<>( - MetaItemType.AGENT_LINK, - new SimulatorAgentLink(manufacturerSimulatorAgentId).setSchedule(createDailySchedule()).setReplayData( - new SimulatorReplayDatapoint[]{ - new SimulatorReplayDatapoint(midnight.plusHours(6).get(SECOND_OF_DAY), 2), - new SimulatorReplayDatapoint(midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(7).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 12), - new SimulatorReplayDatapoint(midnight.plusHours(8).get(SECOND_OF_DAY), 17), - new SimulatorReplayDatapoint(midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(9).get(SECOND_OF_DAY), 28), - new SimulatorReplayDatapoint(midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 33), - new SimulatorReplayDatapoint(midnight.plusHours(10).get(SECOND_OF_DAY), 32), - new SimulatorReplayDatapoint(midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 38), - new SimulatorReplayDatapoint(midnight.plusHours(11).get(SECOND_OF_DAY), 36), - new SimulatorReplayDatapoint(midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 31), - new SimulatorReplayDatapoint(midnight.plusHours(12).get(SECOND_OF_DAY), 25), - new SimulatorReplayDatapoint(midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 28), - new SimulatorReplayDatapoint(midnight.plusHours(13).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(14).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 23), - new SimulatorReplayDatapoint(midnight.plusHours(15).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(16).get(SECOND_OF_DAY), 20), - new SimulatorReplayDatapoint(midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 18), - new SimulatorReplayDatapoint(midnight.plusHours(17).get(SECOND_OF_DAY), 21), - new SimulatorReplayDatapoint(midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 22), - new SimulatorReplayDatapoint(midnight.plusHours(18).get(SECOND_OF_DAY), 19), - new SimulatorReplayDatapoint(midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 20), - new SimulatorReplayDatapoint(midnight.plusHours(19).get(SECOND_OF_DAY), 15), - new SimulatorReplayDatapoint(midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 11), - new SimulatorReplayDatapoint(midnight.plusHours(20).get(SECOND_OF_DAY), 6), - new SimulatorReplayDatapoint(midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 7), - new SimulatorReplayDatapoint(midnight.plusHours(21).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 5), - new SimulatorReplayDatapoint(midnight.plusHours(22).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 4), - new SimulatorReplayDatapoint(midnight.plusHours(23).get(SECOND_OF_DAY), 3), - new SimulatorReplayDatapoint(midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1) - } - ) - ) - ); + parking2Asset.setId(UniqueIdentifierGenerator.generateId(parking2Asset.getName())); + parking2Asset = assetStorageService.merge(parking2Asset); + + ParkingAsset parking3Asset = + createDemoParkingAsset( + "Erasmusbrug", parkingGroupAsset, new GeoJSONPoint(4.48207, 51.91127)); + parking3Asset.setManufacturer("Kiestra"); + parking3Asset.setModel("Genius Rainbow"); + parking3Asset + .getAttribute(ParkingAsset.SPACES_OCCUPIED) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 25), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 18), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 29), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 119), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 257), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 357), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 368), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 362), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 349), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 370), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 367), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 355), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 314), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 254), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 215), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 165), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 149), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 108), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 47) + }))); + }); + parking3Asset.setPriceHourly(3.40); + parking3Asset.setPriceDaily(20.00); + parking3Asset.setSpacesTotal(373); + parking3Asset + .getAttribute(ParkingAsset.SPACES_TOTAL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta(new MetaItem<>(MetaItemType.RULE_STATE)); + }); + parking3Asset.setId(UniqueIdentifierGenerator.generateId(parking3Asset.getName())); + parking3Asset = assetStorageService.merge(parking3Asset); + + // ### Crowd control ### + + ThingAsset assetAreaStation = new ThingAsset("Stationsplein"); + assetAreaStation + .setParent(mobilityAndSafety) + .getAttributes() + .addOrReplace( + new Attribute<>(Asset.LOCATION, STATIONSPLEIN_LOCATION), + new Attribute<>(BuildingAsset.POSTAL_CODE, "3013 AK"), + new Attribute<>(BuildingAsset.CITY, "Rotterdam"), + new Attribute<>(BuildingAsset.COUNTRY, "Netherlands")); + assetAreaStation.setId(UniqueIdentifierGenerator.generateId(assetAreaStation.getName())); + assetAreaStation = assetStorageService.merge(assetAreaStation); + area1Id = assetAreaStation.getId(); + + PeopleCounterAsset peopleCounter1Asset = + createDemoPeopleCounterAsset( + "People Counter South", + assetAreaStation, + new GeoJSONPoint(4.470147, 51.923171), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + peopleCounter1Asset.setManufacturer("ViNotion"); + peopleCounter1Asset.setModel("ViSense"); + peopleCounter1Asset + .getAttribute(PeopleCounterAsset.COUNT_GROWTH_PER_MINUTE) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0.2), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0.3), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0.1), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0.0), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0.2), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0.4), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0.5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 0.7), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 1.8), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 2.1), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 2.4), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 1.9), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 1.8), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 2.1), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 1.8), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 1.7), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 2.3), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 3.1), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 2.8), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 2.2), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 1.6), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 1.7), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 1.1), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0.8) + }))); + }); + peopleCounter1Asset.setId(UniqueIdentifierGenerator.generateId(peopleCounter1Asset.getName())); + peopleCounter1Asset = assetStorageService.merge(peopleCounter1Asset); + + Asset peopleCounter2Asset = + createDemoPeopleCounterAsset( + "People Counter North", + assetAreaStation, + new GeoJSONPoint(4.469329, 51.923700), + () -> new SimulatorAgentLink(smartcitySimulatorAgentId)); + peopleCounter2Asset.setManufacturer("Axis"); + peopleCounter2Asset.setModel("P1375-E"); + peopleCounter2Asset + .getAttribute(PeopleCounterAsset.COUNT_GROWTH_PER_MINUTE) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint(midnight.get(SECOND_OF_DAY), 0.3), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), 0.2), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), 0.3), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), 0.1), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), 0.0), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), 0.3), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 0.7), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 0.6), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 1.9), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 2.2), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 2.8), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 1.6), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 1.9), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 2.2), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 1.9), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 1.6), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 2.4), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 3.2), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 2.9), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 2.3), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 1.7), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 1.4), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 1.2), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 0.7) + }))); + }); + peopleCounter2Asset.setId(UniqueIdentifierGenerator.generateId(peopleCounter2Asset.getName())); + peopleCounter2Asset = assetStorageService.merge(peopleCounter2Asset); + + MicrophoneAsset microphone1Asset = + createDemoMicrophoneAsset( + "Microphone South", + assetAreaStation, + new GeoJSONPoint(4.470362, 51.923201), + () -> + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.get(SECOND_OF_DAY), getRandomNumberInRange(50, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 70)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 70)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 60)) + })); + microphone1Asset.setManufacturer("Sorama"); + microphone1Asset.setModel("CAM1K"); + microphone1Asset.setId(UniqueIdentifierGenerator.generateId(microphone1Asset.getName())); + microphone1Asset = assetStorageService.merge(microphone1Asset); + + MicrophoneAsset microphone2Asset = + createDemoMicrophoneAsset( + "Microphone North", + assetAreaStation, + new GeoJSONPoint(4.469190, 51.923786), + () -> + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.get(SECOND_OF_DAY), getRandomNumberInRange(50, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(1).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(2).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(3).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(4).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(5).get(SECOND_OF_DAY), + getRandomNumberInRange(45, 50)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 55)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 70)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), + getRandomNumberInRange(55, 60)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 70)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), + getRandomNumberInRange(60, 65)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), + getRandomNumberInRange(50, 60)) + })); + microphone2Asset.setManufacturer("Sorama"); + microphone2Asset.setModel("CAM1K"); + microphone2Asset.setId(UniqueIdentifierGenerator.generateId(microphone2Asset.getName())); + microphone2Asset = assetStorageService.merge(microphone2Asset); + + LightAsset lightStation1Asset = + createDemoLightAsset( + "Station Light NW", assetAreaStation, new GeoJSONPoint(4.468874, 51.923881)); + lightStation1Asset.setManufacturer("Philips"); + lightStation1Asset.setModel("CityTouch"); + lightStation1Asset.setId(UniqueIdentifierGenerator.generateId(lightStation1Asset.getName())); + lightStation1Asset = assetStorageService.merge(lightStation1Asset); + + LightAsset lightStation2Asset = + createDemoLightAsset( + "Station Light NE", assetAreaStation, new GeoJSONPoint(4.470539, 51.923991)); + lightStation2Asset.setManufacturer("Philips"); + lightStation2Asset.setModel("CityTouch"); + lightStation2Asset.setId(UniqueIdentifierGenerator.generateId(lightStation2Asset.getName())); + lightStation2Asset = assetStorageService.merge(lightStation2Asset); + + LightAsset lightStation3Asset = + createDemoLightAsset( + "Station Light S", assetAreaStation, new GeoJSONPoint(4.470558, 51.923186)); + lightStation3Asset.setManufacturer("Philips"); + lightStation3Asset.setModel("CityTouch"); + lightStation3Asset.setId(UniqueIdentifierGenerator.generateId(lightStation3Asset.getName())); + lightStation3Asset = assetStorageService.merge(lightStation3Asset); + + // ### Lighting controller ### + + LightAsset lightingControllerOPAsset = + createDemoLightControllerAsset( + "Lighting Noordereiland", mobilityAndSafety, new GeoJSONPoint(4.496177, 51.915060)); + lightingControllerOPAsset.setManufacturer("Pharos"); + lightingControllerOPAsset.setModel("LPC X"); + lightingControllerOPAsset.setId( + UniqueIdentifierGenerator.generateId(lightingControllerOPAsset.getName())); + lightingControllerOPAsset = assetStorageService.merge(lightingControllerOPAsset); + + LightAsset lightOP1Asset = + createDemoLightAsset( + "Ons Park 1", lightingControllerOPAsset, new GeoJSONPoint(4.49626, 51.91516)); + lightOP1Asset.setManufacturer("Schréder"); + lightOP1Asset.setModel("Axia 2"); + lightOP1Asset.setId(UniqueIdentifierGenerator.generateId(lightOP1Asset.getName())); + lightOP1Asset = assetStorageService.merge(lightOP1Asset); + + LightAsset lightOP2Asset = + createDemoLightAsset( + "Ons Park 2", lightingControllerOPAsset, new GeoJSONPoint(4.49705, 51.91549)); + lightOP2Asset.setManufacturer("Schréder"); + lightOP2Asset.setModel("Axia 2"); + lightOP2Asset.setId(UniqueIdentifierGenerator.generateId(lightOP2Asset.getName())); + lightOP2Asset = assetStorageService.merge(lightOP2Asset); + + LightAsset lightOP3Asset = + createDemoLightAsset( + "Ons Park 3", lightingControllerOPAsset, new GeoJSONPoint(4.49661, 51.91495)); + lightOP3Asset.setManufacturer("Schréder"); + lightOP3Asset.setModel("Axia 2"); + lightOP3Asset.setId(UniqueIdentifierGenerator.generateId(lightOP3Asset.getName())); + lightOP3Asset = assetStorageService.merge(lightOP3Asset); + + LightAsset lightOP4Asset = + createDemoLightAsset( + "Ons Park 4", lightingControllerOPAsset, new GeoJSONPoint(4.49704, 51.91520)); + lightOP4Asset.setManufacturer("Schréder"); + lightOP4Asset.setModel("Axia 2"); + lightOP4Asset.setId(UniqueIdentifierGenerator.generateId(lightOP4Asset.getName())); + lightOP4Asset = assetStorageService.merge(lightOP4Asset); + + LightAsset lightOP5Asset = + createDemoLightAsset( + "Ons Park 5", lightingControllerOPAsset, new GeoJSONPoint(4.49758, 51.91440)); + lightOP5Asset.setManufacturer("Schréder"); + lightOP5Asset.setModel("Axia 2"); + lightOP5Asset.setId(UniqueIdentifierGenerator.generateId(lightOP5Asset.getName())); + lightOP5Asset = assetStorageService.merge(lightOP5Asset); + + LightAsset lightOP6Asset = + createDemoLightAsset( + "Ons Park 6", lightingControllerOPAsset, new GeoJSONPoint(4.49786, 51.91452)); + lightOP6Asset.setManufacturer("Schréder"); + lightOP6Asset.setModel("Axia 2"); + lightOP6Asset.setId(UniqueIdentifierGenerator.generateId(lightOP6Asset.getName())); + lightOP6Asset = assetStorageService.merge(lightOP6Asset); + + // ### Ships ### + + GroupAsset shipGroupAsset = new GroupAsset("Ship group", ShipAsset.class); + shipGroupAsset.setParent(mobilityAndSafety); + shipGroupAsset.setId(UniqueIdentifierGenerator.generateId(shipGroupAsset.getName())); + shipGroupAsset = assetStorageService.merge(shipGroupAsset); + + ShipAsset ship1Asset = + createDemoShipAsset( + "Hotel New York", shipGroupAsset, new GeoJSONPoint(4.482669, 51.916436)); + ship1Asset.setLength(12); + ship1Asset.setShipType("Passenger"); + ship1Asset.setIMONumber(9183527); + ship1Asset.setMSSINumber(244650537); + ship1Asset + .getAttribute(ShipAsset.DIRECTION) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 187), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 7) + }))); + }); + ship1Asset + .getAttribute(Asset.LOCATION) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(smartcitySimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(5).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(10).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(15).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(20).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(25).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), + new GeoJSONPoint(4.484374, 51.903518)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(35).get(SECOND_OF_DAY), + new GeoJSONPoint(4.479779, 51.904404)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(40).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482914, 51.906769)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(45).get(SECOND_OF_DAY), + new GeoJSONPoint(4.486156, 51.908570)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(50).get(SECOND_OF_DAY), + new GeoJSONPoint(4.483362, 51.911897)), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(55).get(SECOND_OF_DAY), + new GeoJSONPoint(4.482669, 51.916436)) + }))); + }); + ship1Asset.setId(UniqueIdentifierGenerator.generateId(ship1Asset.getName())); + ship1Asset = assetStorageService.merge(ship1Asset); + + // ################################ Realm Manufaturer Simulator + // ################################### + + SimulatorAgent manufacturerSimulatorAgent = new SimulatorAgent("Simulator"); + manufacturerSimulatorAgent.setRealm(this.realmManufacturerName); + + manufacturerSimulatorAgent = assetStorageService.merge(manufacturerSimulatorAgent); + manufacturerSimulatorAgentId = manufacturerSimulatorAgent.getId(); + + // ################################ Manufacturer realm assets + // ################################### + + // ### Greenhouse equipment distribution ### + + Asset distributor1 = new ThingAsset("GreenEquipment Distribution"); + distributor1.setRealm(this.realmManufacturerName); + distributor1.setId(UniqueIdentifierGenerator.generateId(distributor1.getName())); + distributor1 = assetStorageService.merge(distributor1); + + BuildingAsset vegetablesAndMore = new BuildingAsset("Vegetables & More"); + vegetablesAndMore.setParent(distributor1); + vegetablesAndMore.setId(UniqueIdentifierGenerator.generateId(vegetablesAndMore.getName())); + vegetablesAndMore = assetStorageService.merge(vegetablesAndMore); + + HarvestRobotAsset harvestRobot1 = + createDemoHarvestRobotAsset( + "Robot 1", + vegetablesAndMore, + new GeoJSONPoint(4.279166, 51.978078), + OperationMode.CUTTING, + VegetableType.BELL_PEPPER, + 26, + 45, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + harvestRobot1.setId(UniqueIdentifierGenerator.generateId(harvestRobot1.getName())); + harvestRobot1 = assetStorageService.merge(harvestRobot1); + HarvestRobotAsset harvestRobot2 = + createDemoHarvestRobotAsset( + "Robot 2", + vegetablesAndMore, + new GeoJSONPoint(4.277852, 51.977487), + OperationMode.SCANNING, + VegetableType.BELL_PEPPER, + 26, + 45, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + harvestRobot2.setId(UniqueIdentifierGenerator.generateId(harvestRobot2.getName())); + harvestRobot2 = assetStorageService.merge(harvestRobot2); + SoilSensorAsset soilSensor1 = + createDemoSoilSensorAsset( + "Water sensor", + vegetablesAndMore, + new GeoJSONPoint(4.279010, 51.977391), + 41, + 53, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + soilSensor1.setId(UniqueIdentifierGenerator.generateId(soilSensor1.getName())); + soilSensor1 = assetStorageService.merge(soilSensor1); + + BuildingAsset moreauHorticulture = new BuildingAsset("Qoreau Horticulture"); + moreauHorticulture.setParent(distributor1); + moreauHorticulture.setId(UniqueIdentifierGenerator.generateId(moreauHorticulture.getName())); + moreauHorticulture = assetStorageService.merge(moreauHorticulture); + + IrrigationAsset irrigation1 = + createDemoIrrigationAsset( + "Soil drip 1", + moreauHorticulture, + new GeoJSONPoint(4.311493, 51.961554), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + IrrigationAsset irrigation2 = + createDemoIrrigationAsset( + "Soil drip 2", + moreauHorticulture, + new GeoJSONPoint(4.310893, 51.961354), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + IrrigationAsset irrigation3 = + createDemoIrrigationAsset( + "Soil drip 3", + moreauHorticulture, + new GeoJSONPoint(4.310293, 51.961154), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + IrrigationAsset irrigation4 = + createDemoIrrigationAsset( + "Soil drip 4", + moreauHorticulture, + new GeoJSONPoint(4.309617, 51.960975), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + IrrigationAsset irrigation5 = + createDemoIrrigationAsset( + "Soil drip 5", + moreauHorticulture, + new GeoJSONPoint(4.309153, 51.960901), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation1.setId(UniqueIdentifierGenerator.generateId(irrigation1.getName())); + irrigation1 = assetStorageService.merge(irrigation1); + irrigation2.setId(UniqueIdentifierGenerator.generateId(irrigation2.getName())); + irrigation2 = assetStorageService.merge(irrigation2); + irrigation3.setId(UniqueIdentifierGenerator.generateId(irrigation3.getName())); + irrigation3 = assetStorageService.merge(irrigation3); + irrigation4.setId(UniqueIdentifierGenerator.generateId(irrigation4.getName())); + irrigation4 = assetStorageService.merge(irrigation4); + irrigation5.setId(UniqueIdentifierGenerator.generateId(irrigation5.getName())); + irrigation5 = assetStorageService.merge(irrigation5); + SoilSensorAsset soilSensor2 = + createDemoSoilSensorAsset( + "Soil measurement", + moreauHorticulture, + new GeoJSONPoint(4.310436, 51.961354), + 27, + 35, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + soilSensor2.setId(UniqueIdentifierGenerator.generateId(soilSensor2.getName())); + soilSensor2 = assetStorageService.merge(soilSensor2); + + BuildingAsset paprika = new BuildingAsset("Paprika Perfect BV"); + paprika.setParent(distributor1); + paprika + .getAttributes() + .getOrCreate("flowPerMeter", ValueType.NUMBER) + .addMeta( + new MetaItem<>(READ_ONLY), + new MetaItem<>(RULE_STATE), + new MetaItem<>(STORE_DATA_POINTS), + new MetaItem<>( + UNITS, + Constants.units(UNITS_LITRE, UNITS_PER, UNITS_METRE, UNITS_SQUARED, UNITS_HOUR))); + paprika + .getAttribute(BuildingAsset.AREA) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta(new MetaItem<>(RULE_STATE)).setValue(1800); + }); + paprika.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + paprika.setId(UniqueIdentifierGenerator.generateId(paprika.getName())); + paprikaId = paprika.getId(); + paprika = assetStorageService.merge(paprika); + + HarvestRobotAsset harvestRobot5 = + createDemoHarvestRobotAsset( + "Harvest Robot 1", + paprika, + new GeoJSONPoint(4.282415, 51.975951), + OperationMode.UNLOADING, + VegetableType.TOMATO, + 26, + 45, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + harvestRobot5.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + harvestRobot5 + .getAttribute(HarvestRobotAsset.HARVESTED_SESSION) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 814), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 814), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 815), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 816), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 816), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 816), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 816), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 817), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 818), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 819), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 820), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 821), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 0), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 34), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 86), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 112), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 156), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 289), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 348), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 456), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 516), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 624), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 684), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 713), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 762), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 787), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 792), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 798), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 804), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 808), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 812), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 813), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 813), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 814), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 814) + }))); + }); + harvestRobot5 + .getAttribute(HarvestRobotAsset.SPEED) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 8), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 1), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 1), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1) + }))); + }); + harvestRobot5.setId(UniqueIdentifierGenerator.generateId(harvestRobot5.getName())); + harvestRobot5Id = harvestRobot5.getId(); + harvestRobot5 = assetStorageService.merge(harvestRobot5); + + IrrigationAsset irrigation9 = + createDemoIrrigationAsset( + "Irrigation 1", + paprika, + new GeoJSONPoint(4.283731, 51.976526), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation9.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + irrigation9 + .getAttribute(IrrigationAsset.TANK_LEVEL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 1000), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 995), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 990), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 986), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 980), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 975), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 970), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 965), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 960), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 956), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 950), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 945), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 941), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 936), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 929), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 925), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 919), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 914), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 910), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 906), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 900), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 895), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 891), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + 1200), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 1195), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + 1190), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 1184), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + 1173), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 1145), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), + 1105), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 1074), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + 1032), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 1027), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), + 1022), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 1017), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1006) + }))); + }); + irrigation9 + .getAttribute(IrrigationAsset.FLOW_WATER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 10.5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 10.8), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 11.3), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 11.9), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + 12.5), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + 10.8), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 9.6), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 9.4), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + 10.4), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + 11.8), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + 12.3), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + 11.3), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + 11.7), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), + 10.2), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 10.3), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + 10.1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 10), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 9), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 10.2), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 10.1) + }))); + }); + irrigation9.setId(UniqueIdentifierGenerator.generateId(irrigation9.getName())); + irrigation9Id = irrigation9.getId(); + irrigation9 = assetStorageService.merge(irrigation9); + IrrigationAsset irrigation10 = + createDemoIrrigationAsset( + "Irrigation 2", + paprika, + new GeoJSONPoint(4.285047, 51.975652), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation10.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + irrigation10 + .getAttribute(IrrigationAsset.TANK_LEVEL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 1200), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 1193), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 1185), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 1178), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 1170), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1162), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 1155), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1148), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 1140), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + 1132), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 1124), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + 1117), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 1110), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), + 1102), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 1093), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), + 1085), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 1076), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + 1070), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 1063), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + 1055), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 1048), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + 1041), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 1035), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + 1028), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 1022), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + 1021), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 1018), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + 1015), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 1010), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), + 1002), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 995), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + 1050), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 1150), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), + 1290), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 1250), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1210) + }))); + }); + irrigation10 + .getAttribute(IrrigationAsset.FLOW_WATER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 12.5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 12.6), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 14.2), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 13.3), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + 14.5), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + 12.8), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 13.2), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), + 11.6), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), + 11.4), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 11.2), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + 12.3), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + 13.8), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + 12.3), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 13.1), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + 13.2), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 12.9), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + 13.7), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 11.8), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), + 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 12.6), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 12.2), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 12.1) + }))); + }); + irrigation10.setId(UniqueIdentifierGenerator.generateId(irrigation10.getName())); + irrigation10Id = irrigation10.getId(); + irrigation10 = assetStorageService.merge(irrigation10); + IrrigationAsset irrigation11 = + createDemoIrrigationAsset( + "Irrigation 3", + paprika, + new GeoJSONPoint(4.286504, 51.974613), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation11.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + irrigation11 + .getAttribute(IrrigationAsset.TANK_LEVEL) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 1210), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 1190), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 1180), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 1172), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 1160), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 1152), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 1145), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 1141), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 1132), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + 1125), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 1120), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + 1110), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 1100), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), + 1102), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 1083), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), + 1071), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 1066), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + 1060), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 1055), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + 1035), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 1028), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + 1021), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 1015), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), + 1006), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 1002), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), + 1001), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 997), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 985), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 985), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 982), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 975), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + 1040), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 1200), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), + 1250), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 1250), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1220) + }))); + }); + irrigation11 + .getAttribute(IrrigationAsset.FLOW_WATER) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 13.5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 13.5), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 14.2), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 13.1), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 15.2), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), + 15.4), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), + 13.8), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 14.2), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), + 12.6), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 12.2), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), + 12.2), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 13.2), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), + 13.4), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), + 14.7), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), + 13.2), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 14), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 14.1), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), + 14.6), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 12.9), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 13), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 13.4), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), + 13.1), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 12.9), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), + 12.1), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 13.2), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 13.1) + }))); + }); + irrigation11.setId(UniqueIdentifierGenerator.generateId(irrigation11.getName())); + irrigation11Id = irrigation11.getId(); + irrigation11 = assetStorageService.merge(irrigation11); + + SoilSensorAsset soilSensor4 = + createDemoSoilSensorAsset( + "Soil sensor", + paprika, + new GeoJSONPoint(4.285034, 51.973881), + 34, + 47, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + soilSensor4.getAttributes().stream() + .forEach( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>(ACCESS_RESTRICTED_READ), new MetaItem<>(ACCESS_RESTRICTED_WRITE)); + }); + soilSensor4 + .getAttribute(SoilSensorAsset.SALINITY) + .ifPresent( + assetAttribute -> { + assetAttribute.addMeta( + new MetaItem<>( + MetaItemType.AGENT_LINK, + new SimulatorAgentLink(manufacturerSimulatorAgentId) + .setSchedule(createDailySchedule()) + .setReplayData( + new SimulatorReplayDatapoint[] { + new SimulatorReplayDatapoint( + midnight.plusHours(6).get(SECOND_OF_DAY), 2), + new SimulatorReplayDatapoint( + midnight.plusHours(6).plusMinutes(30).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(7).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(7).plusMinutes(30).get(SECOND_OF_DAY), 12), + new SimulatorReplayDatapoint( + midnight.plusHours(8).get(SECOND_OF_DAY), 17), + new SimulatorReplayDatapoint( + midnight.plusHours(8).plusMinutes(30).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(9).get(SECOND_OF_DAY), 28), + new SimulatorReplayDatapoint( + midnight.plusHours(9).plusMinutes(30).get(SECOND_OF_DAY), 33), + new SimulatorReplayDatapoint( + midnight.plusHours(10).get(SECOND_OF_DAY), 32), + new SimulatorReplayDatapoint( + midnight.plusHours(10).plusMinutes(30).get(SECOND_OF_DAY), 38), + new SimulatorReplayDatapoint( + midnight.plusHours(11).get(SECOND_OF_DAY), 36), + new SimulatorReplayDatapoint( + midnight.plusHours(11).plusMinutes(30).get(SECOND_OF_DAY), 31), + new SimulatorReplayDatapoint( + midnight.plusHours(12).get(SECOND_OF_DAY), 25), + new SimulatorReplayDatapoint( + midnight.plusHours(12).plusMinutes(30).get(SECOND_OF_DAY), 28), + new SimulatorReplayDatapoint( + midnight.plusHours(13).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(13).plusMinutes(30).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(14).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(14).plusMinutes(30).get(SECOND_OF_DAY), 23), + new SimulatorReplayDatapoint( + midnight.plusHours(15).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(15).plusMinutes(30).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(16).get(SECOND_OF_DAY), 20), + new SimulatorReplayDatapoint( + midnight.plusHours(16).plusMinutes(30).get(SECOND_OF_DAY), 18), + new SimulatorReplayDatapoint( + midnight.plusHours(17).get(SECOND_OF_DAY), 21), + new SimulatorReplayDatapoint( + midnight.plusHours(17).plusMinutes(30).get(SECOND_OF_DAY), 22), + new SimulatorReplayDatapoint( + midnight.plusHours(18).get(SECOND_OF_DAY), 19), + new SimulatorReplayDatapoint( + midnight.plusHours(18).plusMinutes(30).get(SECOND_OF_DAY), 20), + new SimulatorReplayDatapoint( + midnight.plusHours(19).get(SECOND_OF_DAY), 15), + new SimulatorReplayDatapoint( + midnight.plusHours(19).plusMinutes(30).get(SECOND_OF_DAY), 11), + new SimulatorReplayDatapoint( + midnight.plusHours(20).get(SECOND_OF_DAY), 6), + new SimulatorReplayDatapoint( + midnight.plusHours(20).plusMinutes(30).get(SECOND_OF_DAY), 7), + new SimulatorReplayDatapoint( + midnight.plusHours(21).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(21).plusMinutes(30).get(SECOND_OF_DAY), 5), + new SimulatorReplayDatapoint( + midnight.plusHours(22).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(22).plusMinutes(30).get(SECOND_OF_DAY), 4), + new SimulatorReplayDatapoint( + midnight.plusHours(23).get(SECOND_OF_DAY), 3), + new SimulatorReplayDatapoint( + midnight.plusHours(23).plusMinutes(30).get(SECOND_OF_DAY), 1) + }))); + }); + soilSensor4.setId(UniqueIdentifierGenerator.generateId(soilSensor4.getName())); + soilSensor4Id = soilSensor4.getId(); + soilSensor4 = assetStorageService.merge(soilSensor4); + + // ### Distributor 2 ### + + Asset distributor2 = new ThingAsset("High-Tech Greenhouse Distribution"); + distributor2.setRealm(this.realmManufacturerName); + distributor2.setId(UniqueIdentifierGenerator.generateId(distributor2.getName())); + distributor2 = assetStorageService.merge(distributor2); + + BuildingAsset bertHaanen = new BuildingAsset("Haanen Vegetables BV"); + bertHaanen.setParent(distributor2); + bertHaanen.setId(UniqueIdentifierGenerator.generateId(bertHaanen.getName())); + bertHaanen = assetStorageService.merge(bertHaanen); + + HarvestRobotAsset harvestRobot3 = + createDemoHarvestRobotAsset( + "Harvest", + bertHaanen, + new GeoJSONPoint(4.286209, 51.983544), + OperationMode.UNLOADING, + VegetableType.TOMATO, + 26, + 45, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + harvestRobot3.setId(UniqueIdentifierGenerator.generateId(harvestRobot3.getName())); + harvestRobot3 = assetStorageService.merge(harvestRobot3); + + BuildingAsset rtd = new BuildingAsset("RTD Vegetable Grower"); + rtd.setParent(distributor2); + rtd.setId(UniqueIdentifierGenerator.generateId(rtd.getName())); + rtd = assetStorageService.merge(rtd); + + HarvestRobotAsset harvestRobot4 = + createDemoHarvestRobotAsset( + "Harvester", + rtd, + new GeoJSONPoint(4.408010, 51.986839), + OperationMode.UNLOADING, + VegetableType.TOMATO, + 26, + 45, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + harvestRobot4.setId(UniqueIdentifierGenerator.generateId(harvestRobot4.getName())); + harvestRobot4 = assetStorageService.merge(harvestRobot4); + + IrrigationAsset irrigation6 = + createDemoIrrigationAsset( + "Irrigation N", + rtd, + new GeoJSONPoint(4.408287, 51.987239), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation6.setId(UniqueIdentifierGenerator.generateId(irrigation6.getName())); + irrigation6 = assetStorageService.merge(irrigation6); + IrrigationAsset irrigation7 = + createDemoIrrigationAsset( + "Irrigation S", + rtd, + new GeoJSONPoint(4.408313, 51.986357), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation7.setId(UniqueIdentifierGenerator.generateId(irrigation7.getName())); + irrigation7 = assetStorageService.merge(irrigation7); + IrrigationAsset irrigation8 = + createDemoIrrigationAsset( + "Irrigation W", + rtd, + new GeoJSONPoint(4.407037, 51.986598), + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + irrigation8.setId(UniqueIdentifierGenerator.generateId(irrigation8.getName())); + irrigation8 = assetStorageService.merge(irrigation8); + + SoilSensorAsset soilSensor3 = + createDemoSoilSensorAsset( + "Soil monitor", + rtd, + new GeoJSONPoint(4.408088, 51.986793), + 44, + 68, + () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); + soilSensor3.setId(UniqueIdentifierGenerator.generateId(soilSensor3.getName())); + soilSensor3 = assetStorageService.merge(soilSensor3); + + // ############################## Add historic simulated data ############################### + + upsertSimulatedHistoricData(); + + // ################################ Link users and assets ################################### + + assetStorageService.storeUserAssetLinks( + Arrays.asList( + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, paprikaId), + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, irrigation9Id), + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, irrigation10Id), + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, irrigation11Id), + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, harvestRobot5Id), + new UserAssetLink( + this.realmManufacturerName, KeycloakDemoSetup.customerUserId, soilSensor4Id))); + + // ################################ Make user restricted ################################### + ManagerIdentityProvider identityProvider = identityService.getIdentityProvider(); + identityProvider.updateUserRealmRoles( + realmManufacturer.getName(), + KeycloakDemoSetup.customerUserId, + identityProvider.addUserRealmRoles( + realmManufacturer.getName(), + KeycloakDemoSetup.customerUserId, + RESTRICTED_USER_REALM_ROLE)); + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + protected static AttributeLink createWeatherApiAttributeLink( + String assetId, String jsonParentName, String jsonName, String parameter) { + return new AttributeLink( + new AttributeRef(assetId, parameter), + null, + new ValueFilter[] { + new JsonPathFilter("$." + jsonParentName + "." + jsonName, true, false), }); - soilSensor4.setId(UniqueIdentifierGenerator.generateId(soilSensor4.getName())); - soilSensor4Id = soilSensor4.getId(); - soilSensor4 = assetStorageService.merge(soilSensor4); - - // ### Distributor 2 ### - - Asset distributor2 = new ThingAsset("High-Tech Greenhouse Distribution"); - distributor2.setRealm(this.realmManufacturerName); - distributor2.setId(UniqueIdentifierGenerator.generateId(distributor2.getName())); - distributor2 = assetStorageService.merge(distributor2); - - BuildingAsset bertHaanen = new BuildingAsset("Haanen Vegetables BV"); - bertHaanen.setParent(distributor2); - bertHaanen.setId(UniqueIdentifierGenerator.generateId(bertHaanen.getName())); - bertHaanen = assetStorageService.merge(bertHaanen); - - HarvestRobotAsset harvestRobot3 = createDemoHarvestRobotAsset("Harvest", bertHaanen, new GeoJSONPoint(4.286209, 51.983544), OperationMode.UNLOADING, VegetableType.TOMATO, 26, 45, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - harvestRobot3.setId(UniqueIdentifierGenerator.generateId(harvestRobot3.getName())); - harvestRobot3 = assetStorageService.merge(harvestRobot3); - - BuildingAsset rtd = new BuildingAsset("RTD Vegetable Grower"); - rtd.setParent(distributor2); - rtd.setId(UniqueIdentifierGenerator.generateId(rtd.getName())); - rtd = assetStorageService.merge(rtd); - - HarvestRobotAsset harvestRobot4 = createDemoHarvestRobotAsset("Harvester", rtd, new GeoJSONPoint(4.408010, 51.986839), OperationMode.UNLOADING, VegetableType.TOMATO, 26, 45, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - harvestRobot4.setId(UniqueIdentifierGenerator.generateId(harvestRobot4.getName())); - harvestRobot4 = assetStorageService.merge(harvestRobot4); - - IrrigationAsset irrigation6 = createDemoIrrigationAsset("Irrigation N", rtd, new GeoJSONPoint(4.408287, 51.987239), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation6.setId(UniqueIdentifierGenerator.generateId(irrigation6.getName())); - irrigation6 = assetStorageService.merge(irrigation6); - IrrigationAsset irrigation7 = createDemoIrrigationAsset("Irrigation S", rtd, new GeoJSONPoint(4.408313, 51.986357), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation7.setId(UniqueIdentifierGenerator.generateId(irrigation7.getName())); - irrigation7 = assetStorageService.merge(irrigation7); - IrrigationAsset irrigation8 = createDemoIrrigationAsset("Irrigation W", rtd, new GeoJSONPoint(4.407037, 51.986598), () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - irrigation8.setId(UniqueIdentifierGenerator.generateId(irrigation8.getName())); - irrigation8 = assetStorageService.merge(irrigation8); - - SoilSensorAsset soilSensor3 = createDemoSoilSensorAsset("Soil monitor", rtd, new GeoJSONPoint(4.408088, 51.986793), 44, 68, () -> new SimulatorAgentLink(manufacturerSimulatorAgentId)); - soilSensor3.setId(UniqueIdentifierGenerator.generateId(soilSensor3.getName())); - soilSensor3 = assetStorageService.merge(soilSensor3); - - // ############################## Add historic simulated data ############################### - - upsertSimulatedHistoricData(); - - // ################################ Link users and assets ################################### - - assetStorageService.storeUserAssetLinks(Arrays.asList( - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - paprikaId), - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - irrigation9Id), - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - irrigation10Id), - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - irrigation11Id), - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - harvestRobot5Id), - new UserAssetLink(this.realmManufacturerName, - KeycloakDemoSetup.customerUserId, - soilSensor4Id))); - - // ################################ Make user restricted ################################### - ManagerIdentityProvider identityProvider = identityService.getIdentityProvider(); - identityProvider.updateUserRealmRoles(realmManufacturer.getName(), KeycloakDemoSetup.customerUserId, identityProvider - .addUserRealmRoles(realmManufacturer.getName(), - KeycloakDemoSetup.customerUserId, RESTRICTED_USER_REALM_ROLE)); - } + } - @SuppressWarnings("OptionalGetWithoutIsPresent") - protected static AttributeLink createWeatherApiAttributeLink(String assetId, String jsonParentName, String jsonName, String parameter) { - return new AttributeLink( - new AttributeRef(assetId, parameter), - null, - new ValueFilter[]{ - new JsonPathFilter("$." + jsonParentName + "." + jsonName, true, false), - } - ); - } + /** + * Adds {@link #HISTORIC_SIMULATED_DATA_DAYS} days of historic datapoints based on the configured + * simulator data. + */ + private void upsertSimulatedHistoricData() { + for (Asset asset : assetStorageService.findAll(new AssetQuery())) { + AttributeMap attributes = asset.getAttributes(); + for (Attribute attribute : attributes.values()) { + attribute + .getMeta() + .get(AGENT_LINK) + .ifPresent( + agentLinkMetaItem -> { + agentLinkMetaItem + .getValue() + .ifPresent( + agentLink -> { + if (agentLink instanceof SimulatorAgentLink simulatorAgentLink) { + simulatorAgentLink + .getReplayData() + .ifPresent( + replayData -> { + List> valuesAndTimestamps = + new ArrayList<>(); + ZonedDateTime midnight = + ZonedDateTime.now() + .with(LocalTime.MIDNIGHT) + .minusDays(HISTORIC_SIMULATED_DATA_DAYS); - /** - * Adds {@link #HISTORIC_SIMULATED_DATA_DAYS} days of historic datapoints based on the configured simulator data. - */ - private void upsertSimulatedHistoricData() { - for (Asset asset : assetStorageService.findAll(new AssetQuery())) { - AttributeMap attributes = asset.getAttributes(); - for (Attribute attribute : attributes.values()) { - attribute.getMeta().get(AGENT_LINK).ifPresent(agentLinkMetaItem -> { - agentLinkMetaItem.getValue().ifPresent(agentLink -> { - if (agentLink instanceof SimulatorAgentLink simulatorAgentLink) { - simulatorAgentLink.getReplayData().ifPresent(replayData -> { - List> valuesAndTimestamps = new ArrayList<>(); - ZonedDateTime midnight = ZonedDateTime.now().with(LocalTime.MIDNIGHT).minusDays(HISTORIC_SIMULATED_DATA_DAYS); - - while (midnight.isBefore(ZonedDateTime.now())) { - for (SimulatorReplayDatapoint datapoint : replayData) { - ZonedDateTime timestamp = midnight.plusSeconds(datapoint.getTimestamp()); - if (timestamp.isBefore(ZonedDateTime.now())) { - valuesAndTimestamps.add(new ValueDatapoint<>(timestamp.toInstant().toEpochMilli(), datapoint.getValue().get())); - } - } + while (midnight.isBefore(ZonedDateTime.now())) { + for (SimulatorReplayDatapoint datapoint : replayData) { + ZonedDateTime timestamp = + midnight.plusSeconds(datapoint.getTimestamp()); + if (timestamp.isBefore(ZonedDateTime.now())) { + valuesAndTimestamps.add( + new ValueDatapoint<>( + timestamp.toInstant().toEpochMilli(), + datapoint.getValue().get())); + } + } - midnight = midnight.plusDays(1); - } + midnight = midnight.plusDays(1); + } - assetDatapointService.upsertValues(asset.getId(), attribute.getName(), valuesAndTimestamps); - }); - } - }); + assetDatapointService.upsertValues( + asset.getId(), + attribute.getName(), + valuesAndTimestamps); + }); + } + }); }); - } - } + } } + } - protected ElectricityStorageAsset createDemoElectricityStorageAsset(String name, Asset area, - GeoJSONPoint location) { - ElectricityStorageAsset electricityStorageAsset = new ElectricityBatteryAsset(name); - electricityStorageAsset.setParent(area); - electricityStorageAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + protected ElectricityStorageAsset createDemoElectricityStorageAsset( + String name, Asset area, GeoJSONPoint location) { + ElectricityStorageAsset electricityStorageAsset = new ElectricityBatteryAsset(name); + electricityStorageAsset.setParent(area); + electricityStorageAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); - return electricityStorageAsset; - } + return electricityStorageAsset; + } - protected ElectricityProducerSolarAsset createDemoElectricitySolarProducerAsset(String name, Asset area, - GeoJSONPoint location) { - ElectricityProducerSolarAsset electricityProducerAsset = new ElectricityProducerSolarAsset(name); - electricityProducerAsset.setParent(area); - electricityProducerAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + protected ElectricityProducerSolarAsset createDemoElectricitySolarProducerAsset( + String name, Asset area, GeoJSONPoint location) { + ElectricityProducerSolarAsset electricityProducerAsset = + new ElectricityProducerSolarAsset(name); + electricityProducerAsset.setParent(area); + electricityProducerAsset + .getAttributes() + .addOrReplace(new Attribute<>(Asset.LOCATION, location)); - return electricityProducerAsset; - } + return electricityProducerAsset; + } - protected ElectricityConsumerAsset createDemoElectricityConsumerAsset(String name, Asset area, - GeoJSONPoint location) { - ElectricityConsumerAsset electricityConsumerAsset = new ElectricityConsumerAsset(name); - electricityConsumerAsset.setParent(area); - electricityConsumerAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + protected ElectricityConsumerAsset createDemoElectricityConsumerAsset( + String name, Asset area, GeoJSONPoint location) { + ElectricityConsumerAsset electricityConsumerAsset = new ElectricityConsumerAsset(name); + electricityConsumerAsset.setParent(area); + electricityConsumerAsset + .getAttributes() + .addOrReplace(new Attribute<>(Asset.LOCATION, location)); - return electricityConsumerAsset; - } + return electricityConsumerAsset; + } - protected ElectricityChargerAsset createDemoElectricityChargerAsset(String name, Asset area, - GeoJSONPoint location) { - ElectricityChargerAsset electricityChargerAsset = new ElectricityChargerAsset(name); - electricityChargerAsset.setParent(area); - electricityChargerAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); + protected ElectricityChargerAsset createDemoElectricityChargerAsset( + String name, Asset area, GeoJSONPoint location) { + ElectricityChargerAsset electricityChargerAsset = new ElectricityChargerAsset(name); + electricityChargerAsset.setParent(area); + electricityChargerAsset.getAttributes().addOrReplace(new Attribute<>(Asset.LOCATION, location)); - return electricityChargerAsset; - } + return electricityChargerAsset; + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/RulesDemoSetup.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/RulesDemoSetup.java index 6379b67..63e6f54 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/RulesDemoSetup.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/RulesDemoSetup.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,209 +12,303 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.logging.Logger; import org.apache.commons.io.IOUtils; import org.openremote.manager.setup.ManagerSetup; import org.openremote.model.Container; import org.openremote.model.rules.RealmRuleset; import org.openremote.model.rules.Ruleset; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.logging.Logger; - public class RulesDemoSetup extends ManagerSetup { - private static final Logger LOG = Logger.getLogger(RulesDemoSetup.class.getName()); - - public RulesDemoSetup(Container container) { - super(container); - } - - public Long realmSmartCityRulesetId; - public Long realmManufacturerRulesetId; - - @Override - public void onStart() throws Exception { - - KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); - ManagerDemoSetup managerDemoSetup = setupService.getTaskOfType(ManagerDemoSetup.class); - - LOG.info("Importing demo rulesets"); - - // ################################ Rules demo data ################################### - - // SmartCity geofences - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/DeKuip.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "De Kuip", Ruleset.Lang.JSON, rules - ).setAccessPublicRead(true).setShowOnList(true); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/Euromast.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Euromast", Ruleset.Lang.JSON, rules - ).setAccessPublicRead(true).setShowOnList(true); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/Markthal.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Markthal", Ruleset.Lang.JSON, rules - ).setAccessPublicRead(true).setShowOnList(true); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/MarkthalChargersInUse.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Markthal: All chargers in use", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/OnsParkBrightStrongWinds.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Ons Park: Brighten lights", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/OnsParkDimLightWinds.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Ons Park: Dim lights", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/StationCrowded.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Station: Crowded square", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/EnvironmentAlerts.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Environment monitoring: Alerts", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/TotalPowerConsumption.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Total power consumption", Ruleset.Lang.FLOW, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/TotalSolarProduction.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Total power production", Ruleset.Lang.FLOW, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/RotterdamPowerBalance.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "De Rotterdam: Power balance", Ruleset.Lang.FLOW, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/ParkingOccupiedPercentage.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Parking: Occupied spaces", Ruleset.Lang.FLOW, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/ParkingFull.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Parking: Almost full", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/RotterdamBatteryUse.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "De Rotterdam: Battery use", Ruleset.Lang.JSON, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/LightGroupOnOff.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmCity.getName(), "Light group: On/Off", Ruleset.Lang.FLOW, rules - ); - realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - /// Manufacturer rules - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/FlowPerMeter.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "KPI: Flow per m2", Ruleset.Lang.FLOW, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/SalinityBetween20And25.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "Salinity 20 < 25", Ruleset.Lang.JSON, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/SalinityGreaterThan25.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "Salinity > 25", Ruleset.Lang.JSON, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/SalinityLessThan3.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "Salinity < 3", Ruleset.Lang.JSON, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/IrrigationTankLow.json")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "Irrigation tank low", Ruleset.Lang.JSON, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } - - try (InputStream inputStream = RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/TotalFlow.flow")) { - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - Ruleset ruleset = new RealmRuleset( - keycloakDemoSetup.realmManufacturer.getName(), "Irrigation flow total", Ruleset.Lang.FLOW, rules - ); - realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); - } + private static final Logger LOG = Logger.getLogger(RulesDemoSetup.class.getName()); + + public RulesDemoSetup(Container container) { + super(container); + } + + public Long realmSmartCityRulesetId; + public Long realmManufacturerRulesetId; + + @Override + public void onStart() throws Exception { + + KeycloakDemoSetup keycloakDemoSetup = setupService.getTaskOfType(KeycloakDemoSetup.class); + ManagerDemoSetup managerDemoSetup = setupService.getTaskOfType(ManagerDemoSetup.class); + + LOG.info("Importing demo rulesets"); + + // ################################ Rules demo data ################################### + + // SmartCity geofences + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/DeKuip.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), "De Kuip", Ruleset.Lang.JSON, rules) + .setAccessPublicRead(true) + .setShowOnList(true); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/Euromast.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), "Euromast", Ruleset.Lang.JSON, rules) + .setAccessPublicRead(true) + .setShowOnList(true); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/Markthal.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), "Markthal", Ruleset.Lang.JSON, rules) + .setAccessPublicRead(true) + .setShowOnList(true); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/MarkthalChargersInUse.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Markthal: All chargers in use", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/OnsParkBrightStrongWinds.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Ons Park: Brighten lights", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/OnsParkDimLightWinds.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Ons Park: Dim lights", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/StationCrowded.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Station: Crowded square", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/EnvironmentAlerts.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Environment monitoring: Alerts", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/TotalPowerConsumption.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Total power consumption", + Ruleset.Lang.FLOW, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/TotalSolarProduction.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Total power production", + Ruleset.Lang.FLOW, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/RotterdamPowerBalance.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "De Rotterdam: Power balance", + Ruleset.Lang.FLOW, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/ParkingOccupiedPercentage.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Parking: Occupied spaces", + Ruleset.Lang.FLOW, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/ParkingFull.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Parking: Almost full", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/smartcity/RotterdamBatteryUse.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "De Rotterdam: Battery use", + Ruleset.Lang.JSON, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/smartcity/LightGroupOnOff.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmCity.getName(), + "Light group: On/Off", + Ruleset.Lang.FLOW, + rules); + realmSmartCityRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + /// Manufacturer rules + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/FlowPerMeter.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "KPI: Flow per m2", + Ruleset.Lang.FLOW, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/manufacturer/SalinityBetween20And25.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "Salinity 20 < 25", + Ruleset.Lang.JSON, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/manufacturer/SalinityGreaterThan25.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "Salinity > 25", + Ruleset.Lang.JSON, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/manufacturer/SalinityLessThan3.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "Salinity < 3", + Ruleset.Lang.JSON, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream( + "/demo/rules/manufacturer/IrrigationTankLow.json")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "Irrigation tank low", + Ruleset.Lang.JSON, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); + } + + try (InputStream inputStream = + RulesDemoSetup.class.getResourceAsStream("/demo/rules/manufacturer/TotalFlow.flow")) { + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + Ruleset ruleset = + new RealmRuleset( + keycloakDemoSetup.realmManufacturer.getName(), + "Irrigation flow total", + Ruleset.Lang.FLOW, + rules); + realmManufacturerRulesetId = rulesetStorageService.merge(ruleset).getId(); } + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/HarvestRobotAsset.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/HarvestRobotAsset.java index 04a28c5..809c66f 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/HarvestRobotAsset.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/HarvestRobotAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,66 +12,66 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup.model; +import static org.openremote.model.Constants.*; + +import jakarta.persistence.Entity; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueDescriptor; import org.openremote.model.value.ValueType; -import static org.openremote.model.Constants.*; - -import jakarta.persistence.Entity; - @Entity public class HarvestRobotAsset extends Asset { - public enum OperationMode { - MOVING, - SCANNING, - CUTTING, - UNLOADING, - CHARGING - } - public static final ValueDescriptor OPERATION_MODE_VALUE = new ValueDescriptor<>("operationMode", - OperationMode.class); - public static final AttributeDescriptor OPERATION_MODE = new AttributeDescriptor<>( - "operationMode", OPERATION_MODE_VALUE); + public enum OperationMode { + MOVING, + SCANNING, + CUTTING, + UNLOADING, + CHARGING + } + + public static final ValueDescriptor OPERATION_MODE_VALUE = + new ValueDescriptor<>("operationMode", OperationMode.class); + public static final AttributeDescriptor OPERATION_MODE = + new AttributeDescriptor<>("operationMode", OPERATION_MODE_VALUE); - public enum VegetableType { - TOMATO, - CUCUMBER, - BELL_PEPPER - } - public static final ValueDescriptor VEGETABLE_TYPE_VALUE = new ValueDescriptor<>("vegetableType", - VegetableType.class); - public static final AttributeDescriptor VEGETABLE_TYPE = new AttributeDescriptor<>( - "vegetableType", VEGETABLE_TYPE_VALUE); + public enum VegetableType { + TOMATO, + CUCUMBER, + BELL_PEPPER + } - public static final AttributeDescriptor DIRECTION = new AttributeDescriptor<>("direction", - ValueType.DIRECTION); - public static final AttributeDescriptor SPEED = new AttributeDescriptor<>("speed", - ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_METRE, UNITS_PER, UNITS_HOUR); + public static final ValueDescriptor VEGETABLE_TYPE_VALUE = + new ValueDescriptor<>("vegetableType", VegetableType.class); + public static final AttributeDescriptor VEGETABLE_TYPE = + new AttributeDescriptor<>("vegetableType", VEGETABLE_TYPE_VALUE); - public static final AttributeDescriptor HARVESTED_SESSION = new AttributeDescriptor<>("harvestedSession", - ValueType.POSITIVE_INTEGER); - public static final AttributeDescriptor HARVESTED_TOTAL = new AttributeDescriptor<>("harvestedTotal", - ValueType.POSITIVE_INTEGER); + public static final AttributeDescriptor DIRECTION = + new AttributeDescriptor<>("direction", ValueType.DIRECTION); + public static final AttributeDescriptor SPEED = + new AttributeDescriptor<>("speed", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_METRE, UNITS_PER, UNITS_HOUR); - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("robot-industrial", "38761d", HarvestRobotAsset.class); + public static final AttributeDescriptor HARVESTED_SESSION = + new AttributeDescriptor<>("harvestedSession", ValueType.POSITIVE_INTEGER); + public static final AttributeDescriptor HARVESTED_TOTAL = + new AttributeDescriptor<>("harvestedTotal", ValueType.POSITIVE_INTEGER); - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected HarvestRobotAsset() { - } + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("robot-industrial", "38761d", HarvestRobotAsset.class); - public HarvestRobotAsset(String name) { - super(name); - } + /** For use by hydrators (i.e. JPA/Jackson) */ + protected HarvestRobotAsset() {} + public HarvestRobotAsset(String name) { + super(name); + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/IrrigationAsset.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/IrrigationAsset.java index a0f9b05..878d367 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/IrrigationAsset.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/IrrigationAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,41 +12,42 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup.model; +import static org.openremote.model.Constants.*; + +import jakarta.persistence.Entity; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueType; -import static org.openremote.model.Constants.*; - -import jakarta.persistence.Entity; - @Entity public class IrrigationAsset extends Asset { - public static final AttributeDescriptor FLOW_WATER = new AttributeDescriptor<>("flowWater", - ValueType.POSITIVE_NUMBER).withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); - public static final AttributeDescriptor FLOW_NUTRIENTS = new AttributeDescriptor<>("flowNutrients", - ValueType.POSITIVE_NUMBER).withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); - public static final AttributeDescriptor FLOW_TOTAL = new AttributeDescriptor<>("flowTotal", - ValueType.POSITIVE_NUMBER).withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); - public static final AttributeDescriptor TANK_LEVEL = new AttributeDescriptor<>("tankLevel", - ValueType.POSITIVE_NUMBER).withUnits(UNITS_LITRE); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("water-pump", "3d85c6", IrrigationAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected IrrigationAsset() { - } - - public IrrigationAsset(String name) { - super(name); - } - + public static final AttributeDescriptor FLOW_WATER = + new AttributeDescriptor<>("flowWater", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); + public static final AttributeDescriptor FLOW_NUTRIENTS = + new AttributeDescriptor<>("flowNutrients", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); + public static final AttributeDescriptor FLOW_TOTAL = + new AttributeDescriptor<>("flowTotal", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_LITRE, UNITS_PER, UNITS_HOUR); + public static final AttributeDescriptor TANK_LEVEL = + new AttributeDescriptor<>("tankLevel", ValueType.POSITIVE_NUMBER).withUnits(UNITS_LITRE); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("water-pump", "3d85c6", IrrigationAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected IrrigationAsset() {} + + public IrrigationAsset(String name) { + super(name); + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/ManufacturerAssetModelProvider.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/ManufacturerAssetModelProvider.java index 8e99a6a..5987840 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/ManufacturerAssetModelProvider.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/ManufacturerAssetModelProvider.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup.model; @@ -23,8 +22,8 @@ public class ManufacturerAssetModelProvider implements AssetModelProvider { - @Override - public boolean useAutoScan() { - return true; - } + @Override + public boolean useAutoScan() { + return true; + } } diff --git a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/SoilSensorAsset.java b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/SoilSensorAsset.java index 0d05adf..3441de3 100644 --- a/demo-setup/src/main/java/org/openremote/extension/demosetup/model/SoilSensorAsset.java +++ b/demo-setup/src/main/java/org/openremote/extension/demosetup/model/SoilSensorAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,50 +12,47 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.demosetup.model; +import static org.openremote.model.Constants.*; + +import jakarta.persistence.Entity; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueConstraint; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; - -import static org.openremote.model.Constants.*; - @Entity public class SoilSensorAsset extends Asset { - public static final AttributeDescriptor SOIL_TENSION_MEASURED = new AttributeDescriptor<>("soilTensionMeasured", - ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_PASCAL); - public static final AttributeDescriptor SOIL_TENSION_MIN = new AttributeDescriptor<>("soilTensionMin", - ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_PASCAL) - .withConstraints(new ValueConstraint.Min(0),new ValueConstraint.Max(80)); - public static final AttributeDescriptor SOIL_TENSION_MAX = new AttributeDescriptor<>("soilTensionMax", - ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_PASCAL) - .withConstraints(new ValueConstraint.Min(0),new ValueConstraint.Max(80)); - public static final AttributeDescriptor TEMPERATURE = new AttributeDescriptor<>("temperature", - ValueType.NUMBER) - .withUnits(UNITS_CELSIUS); - public static final AttributeDescriptor SALINITY = new AttributeDescriptor<>("salinity", - ValueType.NUMBER); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("water-percent", "993333", SoilSensorAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected SoilSensorAsset() { - } - - public SoilSensorAsset(String name) { - super(name); - } - + public static final AttributeDescriptor SOIL_TENSION_MEASURED = + new AttributeDescriptor<>("soilTensionMeasured", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_PASCAL); + public static final AttributeDescriptor SOIL_TENSION_MIN = + new AttributeDescriptor<>("soilTensionMin", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_PASCAL) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(80)); + public static final AttributeDescriptor SOIL_TENSION_MAX = + new AttributeDescriptor<>("soilTensionMax", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_PASCAL) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(80)); + public static final AttributeDescriptor TEMPERATURE = + new AttributeDescriptor<>("temperature", ValueType.NUMBER).withUnits(UNITS_CELSIUS); + public static final AttributeDescriptor SALINITY = + new AttributeDescriptor<>("salinity", ValueType.NUMBER); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("water-percent", "993333", SoilSensorAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected SoilSensorAsset() {} + + public SoilSensorAsset(String name) { + super(name); + } } diff --git a/demo-setup/src/main/resources/demo/dashboards/manufacturer/harvesting.json b/demo-setup/src/main/resources/demo/dashboards/manufacturer/harvesting.json index 5751732..016caef 100644 --- a/demo-setup/src/main/resources/demo/dashboards/manufacturer/harvesting.json +++ b/demo-setup/src/main/resources/demo/dashboards/manufacturer/harvesting.json @@ -94,18 +94,9 @@ "decimals": 0, "valueType": "number", "thresholds": [ - [ - 0, - "#4caf50" - ], - [ - 75, - "#ff9800" - ], - [ - 90, - "#ef5350" - ] + [0, "#4caf50"], + [75, "#ff9800"], + [90, "#ef5350"] ], "attributeRefs": [ { @@ -167,30 +158,21 @@ "widgetConfig": { "markers": [ { - "coordinates": [ - 45, - 80 - ], + "coordinates": [45, 80], "attributeRef": { "id": "6ZQkcWjwZjL8d04t9mvVvW", "name": "harvestedSession" } }, { - "coordinates": [ - 75, - 80 - ], + "coordinates": [75, 80], "attributeRef": { "id": "2XOXVoMmDkOyLjY1JEnuoF", "name": "soilTensionMeasured" } }, { - "coordinates": [ - 12, - 80 - ], + "coordinates": [12, 80], "attributeRef": { "id": "2XOXVoMmDkOyLjY1JEnuoF", "name": "temperature" @@ -351,28 +333,13 @@ }, "showLabels": true, "textColors": [ - [ - "example", - "#4caf50" - ], - [ - "example2", - "#ff9800" - ] + ["example", "#4caf50"], + ["example2", "#ff9800"] ], "thresholds": [ - [ - 90, - "#ef5350" - ], - [ - 75, - "#ff9800" - ], - [ - 0, - "#4caf50" - ] + [90, "#ef5350"], + [75, "#ff9800"], + [0, "#4caf50"] ], "showGeoJson": true, "attributeName": "flowTotal", @@ -407,17 +374,8 @@ ], "assetType": "HarvestRobotAsset", "tableSize": 10, - "tableOptions": [ - 10, - 25, - 100 - ], - "attributeNames": [ - "harvestedTotal", - "vegetableType", - "speed", - "harvestedSession" - ] + "tableOptions": [10, 25, 100], + "attributeNames": ["harvestedTotal", "vegetableType", "speed", "harvestedSession"] } } ] diff --git a/demo-setup/src/main/resources/demo/dashboards/smartcity/parking.json b/demo-setup/src/main/resources/demo/dashboards/smartcity/parking.json index 6b84123..7115796 100644 --- a/demo-setup/src/main/resources/demo/dashboards/smartcity/parking.json +++ b/demo-setup/src/main/resources/demo/dashboards/smartcity/parking.json @@ -90,11 +90,7 @@ "widgetTypeId": "map", "widgetConfig": { "zoom": 14, - "assetIds": [ - "1yuaW634x1LqumPTwGxvyg", - "3D49AxXerrIycM8gNd0zlK", - "2tLAEBGjmRCu1KrdJn9T2Z" - ], + "assetIds": ["1yuaW634x1LqumPTwGxvyg", "3D49AxXerrIycM8gNd0zlK", "2tLAEBGjmRCu1KrdJn9T2Z"], "assetType": "ParkingAsset", "showUnits": false, "valueType": "positiveInteger", @@ -107,28 +103,13 @@ }, "showLabels": true, "textColors": [ - [ - "example", - "#4caf50" - ], - [ - "example2", - "#ff9800" - ] + ["example", "#4caf50"], + ["example2", "#ff9800"] ], "thresholds": [ - [ - 450, - "#ef5350" - ], - [ - 250, - "#ff9800" - ], - [ - 0, - "#4caf50" - ] + [450, "#ef5350"], + [250, "#ff9800"], + [0, "#4caf50"] ], "showGeoJson": true, "attributeName": "spacesOccupied", @@ -159,18 +140,9 @@ "decimals": 0, "valueType": "number", "thresholds": [ - [ - 0, - "#4caf50" - ], - [ - 75, - "#ff9800" - ], - [ - 90, - "#ef5350" - ] + [0, "#4caf50"], + [75, "#ff9800"], + [90, "#ef5350"] ], "attributeRefs": [ { @@ -201,20 +173,14 @@ "widgetConfig": { "markers": [ { - "coordinates": [ - 10, - 50 - ], + "coordinates": [10, 50], "attributeRef": { "id": "52kOB7c1Rs7WUxgfoCKf5B", "name": "onOff" } }, { - "coordinates": [ - 9, - 10 - ], + "coordinates": [9, 10], "attributeRef": { "id": "52kOB7c1Rs7WUxgfoCKf5B", "name": "colourRGB" @@ -250,23 +216,11 @@ }, "widgetTypeId": "table", "widgetConfig": { - "assetIds": [ - "2tLAEBGjmRCu1KrdJn9T2Z", - "3D49AxXerrIycM8gNd0zlK", - "1yuaW634x1LqumPTwGxvyg" - ], + "assetIds": ["2tLAEBGjmRCu1KrdJn9T2Z", "3D49AxXerrIycM8gNd0zlK", "1yuaW634x1LqumPTwGxvyg"], "assetType": "ParkingAsset", "tableSize": 10, - "tableOptions": [ - 10, - 25, - 100 - ], - "attributeNames": [ - "spacesOccupied", - "spacesOpen", - "spacesTotal" - ] + "tableOptions": [10, 25, 100], + "attributeNames": ["spacesOccupied", "spacesOpen", "spacesTotal"] } } ] diff --git a/demo-setup/src/main/resources/demo/rules/manufacturer/IrrigationTankLow.json b/demo-setup/src/main/resources/demo/rules/manufacturer/IrrigationTankLow.json index 2d8d803..5fa84c0 100644 --- a/demo-setup/src/main/resources/demo/rules/manufacturer/IrrigationTankLow.json +++ b/demo-setup/src/main/resources/demo/rules/manufacturer/IrrigationTankLow.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "IrrigationAsset" - ], + "types": ["IrrigationAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "7atRfYJf83HuiHB6ZdM3ko" - ] + "ids": ["7atRfYJf83HuiHB6ZdM3ko"] } } ] @@ -43,9 +39,7 @@ "items": [ { "assets": { - "types": [ - "IrrigationAsset" - ], + "types": ["IrrigationAsset"], "attributes": { "items": [ { @@ -62,9 +56,7 @@ } ] }, - "ids": [ - "7jSsUaNvM3ZQGfRqBTsOpJ" - ] + "ids": ["7jSsUaNvM3ZQGfRqBTsOpJ"] } } ] @@ -74,9 +66,7 @@ "items": [ { "assets": { - "types": [ - "IrrigationAsset" - ], + "types": ["IrrigationAsset"], "attributes": { "items": [ { @@ -93,9 +83,7 @@ } ] }, - "ids": [ - "72f37OCsEYkVPdzgcKDlRL" - ] + "ids": ["72f37OCsEYkVPdzgcKDlRL"] } } ] diff --git a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityBetween20And25.json b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityBetween20And25.json index 2bd44b1..e212f04 100644 --- a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityBetween20And25.json +++ b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityBetween20And25.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "SoilSensorAsset" - ], + "types": ["SoilSensorAsset"], "attributes": { "items": [ { @@ -32,9 +30,7 @@ } ] }, - "ids": [ - "2XOXVoMmDkOyLjY1JEnuoF" - ] + "ids": ["2XOXVoMmDkOyLjY1JEnuoF"] } } ] @@ -46,12 +42,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "72f37OCsEYkVPdzgcKDlRL" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["72f37OCsEYkVPdzgcKDlRL"], + "types": ["IrrigationAsset"] } }, "value": 1, @@ -61,12 +53,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7jSsUaNvM3ZQGfRqBTsOpJ" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7jSsUaNvM3ZQGfRqBTsOpJ"], + "types": ["IrrigationAsset"] } }, "value": 1.2, @@ -76,12 +64,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7atRfYJf83HuiHB6ZdM3ko" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7atRfYJf83HuiHB6ZdM3ko"], + "types": ["IrrigationAsset"] } }, "value": 1.4, diff --git a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityGreaterThan25.json b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityGreaterThan25.json index fbda54d..bffd552 100644 --- a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityGreaterThan25.json +++ b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityGreaterThan25.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "SoilSensorAsset" - ], + "types": ["SoilSensorAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2XOXVoMmDkOyLjY1JEnuoF" - ] + "ids": ["2XOXVoMmDkOyLjY1JEnuoF"] } } ] @@ -45,12 +41,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "72f37OCsEYkVPdzgcKDlRL" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["72f37OCsEYkVPdzgcKDlRL"], + "types": ["IrrigationAsset"] } }, "value": 0.5, @@ -60,12 +52,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7jSsUaNvM3ZQGfRqBTsOpJ" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7jSsUaNvM3ZQGfRqBTsOpJ"], + "types": ["IrrigationAsset"] } }, "value": 0.7, @@ -75,12 +63,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7atRfYJf83HuiHB6ZdM3ko" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7atRfYJf83HuiHB6ZdM3ko"], + "types": ["IrrigationAsset"] } }, "value": 0.9, diff --git a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityLessThan3.json b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityLessThan3.json index a24bee5..46760bb 100644 --- a/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityLessThan3.json +++ b/demo-setup/src/main/resources/demo/rules/manufacturer/SalinityLessThan3.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "SoilSensorAsset" - ], + "types": ["SoilSensorAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2XOXVoMmDkOyLjY1JEnuoF" - ] + "ids": ["2XOXVoMmDkOyLjY1JEnuoF"] } } ] @@ -45,12 +41,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "72f37OCsEYkVPdzgcKDlRL" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["72f37OCsEYkVPdzgcKDlRL"], + "types": ["IrrigationAsset"] } }, "value": 2, @@ -60,12 +52,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7jSsUaNvM3ZQGfRqBTsOpJ" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7jSsUaNvM3ZQGfRqBTsOpJ"], + "types": ["IrrigationAsset"] } }, "value": 2.5, @@ -75,12 +63,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "7atRfYJf83HuiHB6ZdM3ko" - ], - "types": [ - "IrrigationAsset" - ] + "ids": ["7atRfYJf83HuiHB6ZdM3ko"], + "types": ["IrrigationAsset"] } }, "value": 2.8, diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/DeKuip.json b/demo-setup/src/main/resources/demo/rules/smartcity/DeKuip.json index 242ddae..64b4202 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/DeKuip.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/DeKuip.json @@ -10,9 +10,7 @@ "items": [ { "assets": { - "types": [ - "ConsoleAsset" - ], + "types": ["ConsoleAsset"], "attributes": { "items": [ { diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/EnvironmentAlerts.json b/demo-setup/src/main/resources/demo/rules/smartcity/EnvironmentAlerts.json index 78aa615..d6ca1e2 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/EnvironmentAlerts.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/EnvironmentAlerts.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "GroundwaterSensorAsset" - ], + "types": ["GroundwaterSensorAsset"], "attributes": { "items": [ { @@ -40,9 +38,7 @@ "items": [ { "assets": { - "types": [ - "EnvironmentSensorAsset" - ], + "types": ["EnvironmentSensorAsset"], "attributes": { "items": [ { diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/Euromast.json b/demo-setup/src/main/resources/demo/rules/smartcity/Euromast.json index 0b0b86a..8ee4446 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/Euromast.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/Euromast.json @@ -10,9 +10,7 @@ "items": [ { "assets": { - "types": [ - "ConsoleAsset" - ], + "types": ["ConsoleAsset"], "attributes": { "items": [ { diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/Markthal.json b/demo-setup/src/main/resources/demo/rules/smartcity/Markthal.json index d430586..bb3adac 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/Markthal.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/Markthal.json @@ -10,9 +10,7 @@ "items": [ { "assets": { - "types": [ - "ConsoleAsset" - ], + "types": ["ConsoleAsset"], "attributes": { "items": [ { diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/MarkthalChargersInUse.json b/demo-setup/src/main/resources/demo/rules/smartcity/MarkthalChargersInUse.json index 833a2c5..4c5e12d 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/MarkthalChargersInUse.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/MarkthalChargersInUse.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "ElectricityChargerAsset" - ], + "types": ["ElectricityChargerAsset"], "attributes": { "items": [ { @@ -31,16 +29,12 @@ } ] }, - "ids": [ - "2QEKoczoTiOfLKh5UHqEf5" - ] + "ids": ["2QEKoczoTiOfLKh5UHqEf5"] } }, { "assets": { - "types": [ - "ElectricityChargerAsset" - ], + "types": ["ElectricityChargerAsset"], "attributes": { "items": [ { @@ -57,16 +51,12 @@ } ] }, - "ids": [ - "6Pgv4HQGmC0EjXg7GmNM6l" - ] + "ids": ["6Pgv4HQGmC0EjXg7GmNM6l"] } }, { "assets": { - "types": [ - "ElectricityChargerAsset" - ], + "types": ["ElectricityChargerAsset"], "attributes": { "items": [ { @@ -83,16 +73,12 @@ } ] }, - "ids": [ - "3KUCNnuNcS2zFAURMpAq0u" - ] + "ids": ["3KUCNnuNcS2zFAURMpAq0u"] } }, { "assets": { - "types": [ - "ElectricityChargerAsset" - ], + "types": ["ElectricityChargerAsset"], "attributes": { "items": [ { @@ -109,9 +95,7 @@ } ] }, - "ids": [ - "6EaYX7DEAFwxOJr3de4GFf" - ] + "ids": ["6EaYX7DEAFwxOJr3de4GFf"] } } ] diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkBrightStrongWinds.json b/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkBrightStrongWinds.json index ee06d23..6f71c79 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkBrightStrongWinds.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkBrightStrongWinds.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "WeatherAsset" - ], + "types": ["WeatherAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2bMjSx0iy1usC9KKhT24h9" - ] + "ids": ["2bMjSx0iy1usC9KKhT24h9"] } } ] @@ -45,12 +41,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "3QlH8nQWvnevcyxat6tQKJ" - ], - "types": [ - "LightAsset" - ] + "ids": ["3QlH8nQWvnevcyxat6tQKJ"], + "types": ["LightAsset"] } }, "value": 90, @@ -60,12 +52,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "4Y8sldGAezGSxqSSW3bly5" - ], - "types": [ - "LightAsset" - ] + "ids": ["4Y8sldGAezGSxqSSW3bly5"], + "types": ["LightAsset"] } }, "value": 90, @@ -75,12 +63,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "4RYkKKuM1wOw21PNOgHShZ" - ], - "types": [ - "LightAsset" - ] + "ids": ["4RYkKKuM1wOw21PNOgHShZ"], + "types": ["LightAsset"] } }, "value": 90, @@ -90,12 +74,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "43F9MlyRcnGhY2m2hHlOdz" - ], - "types": [ - "LightAsset" - ] + "ids": ["43F9MlyRcnGhY2m2hHlOdz"], + "types": ["LightAsset"] } }, "value": 90, @@ -105,12 +85,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "5aID6iE9exaVNirT2flago" - ], - "types": [ - "LightAsset" - ] + "ids": ["5aID6iE9exaVNirT2flago"], + "types": ["LightAsset"] } }, "value": 90, @@ -120,12 +96,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "3wauEi0ol2th6hXULHV2N4" - ], - "types": [ - "LightAsset" - ] + "ids": ["3wauEi0ol2th6hXULHV2N4"], + "types": ["LightAsset"] } }, "value": 90, diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkDimLightWinds.json b/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkDimLightWinds.json index dd59a4c..5994991 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkDimLightWinds.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/OnsParkDimLightWinds.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "WeatherAsset" - ], + "types": ["WeatherAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2bMjSx0iy1usC9KKhT24h9" - ] + "ids": ["2bMjSx0iy1usC9KKhT24h9"] } } ] @@ -45,12 +41,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "3QlH8nQWvnevcyxat6tQKJ" - ], - "types": [ - "LightAsset" - ] + "ids": ["3QlH8nQWvnevcyxat6tQKJ"], + "types": ["LightAsset"] } }, "value": 60, @@ -60,12 +52,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "4Y8sldGAezGSxqSSW3bly5" - ], - "types": [ - "LightAsset" - ] + "ids": ["4Y8sldGAezGSxqSSW3bly5"], + "types": ["LightAsset"] } }, "value": 60, @@ -75,12 +63,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "4RYkKKuM1wOw21PNOgHShZ" - ], - "types": [ - "LightAsset" - ] + "ids": ["4RYkKKuM1wOw21PNOgHShZ"], + "types": ["LightAsset"] } }, "value": 60, @@ -90,12 +74,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "43F9MlyRcnGhY2m2hHlOdz" - ], - "types": [ - "LightAsset" - ] + "ids": ["43F9MlyRcnGhY2m2hHlOdz"], + "types": ["LightAsset"] } }, "value": 60, @@ -105,12 +85,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "5aID6iE9exaVNirT2flago" - ], - "types": [ - "LightAsset" - ] + "ids": ["5aID6iE9exaVNirT2flago"], + "types": ["LightAsset"] } }, "value": 60, @@ -120,12 +96,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "3wauEi0ol2th6hXULHV2N4" - ], - "types": [ - "LightAsset" - ] + "ids": ["3wauEi0ol2th6hXULHV2N4"], + "types": ["LightAsset"] } }, "value": 60, diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/ParkingFull.json b/demo-setup/src/main/resources/demo/rules/smartcity/ParkingFull.json index 1593d38..112871a 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/ParkingFull.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/ParkingFull.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "GroupAsset" - ], + "types": ["GroupAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "7UUzmvnTuLdjVpTb8MnjSX" - ] + "ids": ["7UUzmvnTuLdjVpTb8MnjSX"] } } ] diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/RotterdamBatteryUse.json b/demo-setup/src/main/resources/demo/rules/smartcity/RotterdamBatteryUse.json index 878497c..58f2c36 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/RotterdamBatteryUse.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/RotterdamBatteryUse.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "BuildingAsset" - ], + "types": ["BuildingAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2wzKB2j39144oTzAJnHpfs" - ] + "ids": ["2wzKB2j39144oTzAJnHpfs"] } } ] @@ -45,12 +41,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "6bzhox7vxOKpKQ5yX5Ysoh" - ], - "types": [ - "ElectricityBatteryAsset" - ] + "ids": ["6bzhox7vxOKpKQ5yX5Ysoh"], + "types": ["ElectricityBatteryAsset"] } }, "value": 25, diff --git a/demo-setup/src/main/resources/demo/rules/smartcity/StationCrowded.json b/demo-setup/src/main/resources/demo/rules/smartcity/StationCrowded.json index 0f02935..d67ad01 100644 --- a/demo-setup/src/main/resources/demo/rules/smartcity/StationCrowded.json +++ b/demo-setup/src/main/resources/demo/rules/smartcity/StationCrowded.json @@ -12,9 +12,7 @@ "items": [ { "assets": { - "types": [ - "MicrophoneAsset" - ], + "types": ["MicrophoneAsset"], "attributes": { "items": [ { @@ -31,9 +29,7 @@ } ] }, - "ids": [ - "2bdD9xZlveIOabucPi9Iur" - ] + "ids": ["2bdD9xZlveIOabucPi9Iur"] } } ] @@ -43,9 +39,7 @@ "items": [ { "assets": { - "types": [ - "MicrophoneAsset" - ], + "types": ["MicrophoneAsset"], "attributes": { "items": [ { @@ -62,16 +56,12 @@ } ] }, - "ids": [ - "5WKcxVxZqFq1GYd9b2YVGD" - ] + "ids": ["5WKcxVxZqFq1GYd9b2YVGD"] } }, { "assets": { - "types": [ - "PeopleCounterAsset" - ], + "types": ["PeopleCounterAsset"], "attributes": { "items": [ { @@ -88,9 +78,7 @@ } ] }, - "ids": [ - "4vD8XpKSR6iieaSLJ35nKl" - ] + "ids": ["4vD8XpKSR6iieaSLJ35nKl"] } } ] @@ -102,12 +90,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "2JA9oLQDHY0pjVHnGJMS35" - ], - "types": [ - "LightAsset" - ] + "ids": ["2JA9oLQDHY0pjVHnGJMS35"], + "types": ["LightAsset"] } }, "value": 60, @@ -117,12 +101,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "3BSvaTREZX2MLjuE8bkM16" - ], - "types": [ - "LightAsset" - ] + "ids": ["3BSvaTREZX2MLjuE8bkM16"], + "types": ["LightAsset"] } }, "value": 75, @@ -132,12 +112,8 @@ "action": "write-attribute", "target": { "assets": { - "ids": [ - "2motXSzult66RsYrImPTdf" - ], - "types": [ - "LightAsset" - ] + "ids": ["2motXSzult66RsYrImPTdf"], + "types": ["LightAsset"] } }, "value": 70, diff --git a/deployment/build.gradle b/deployment/build.gradle index 0ae4d8d..4b699d9 100644 --- a/deployment/build.gradle +++ b/deployment/build.gradle @@ -14,111 +14,108 @@ import org.gradle.api.tasks.TaskAction import javax.inject.Inject plugins { - id 'base' + id 'base' } abstract class DistributeExtensions extends DefaultTask { - @Classpath - abstract ConfigurableFileCollection getExtensionFiles() + @Classpath + abstract ConfigurableFileCollection getExtensionFiles() - @Classpath - abstract ConfigurableFileCollection getManagerFiles() + @Classpath + abstract ConfigurableFileCollection getManagerFiles() - @OutputDirectory - abstract DirectoryProperty getDestinationDirectory() + @OutputDirectory + abstract DirectoryProperty getDestinationDirectory() - @Inject - abstract FileSystemOperations getFileSystemOperations() + @Inject + abstract FileSystemOperations getFileSystemOperations() - @TaskAction - void distribute() { - Set managerFileNames = managerFiles.files.collect { - it.name - } as Set + @TaskAction + void distribute() { + Set managerFileNames = managerFiles.files.collect { + it.name + } as Set - fileSystemOperations.sync { - from(extensionFiles) { - exclude { details -> - managerFileNames.contains(details.file.name) - } - } - - into(destinationDirectory.get().asFile) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE + fileSystemOperations.sync { + from(extensionFiles) { + exclude { details -> + managerFileNames.contains(details.file.name) } + } + + into(destinationDirectory.get().asFile) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } + } } -def excludedExtensionProjects = [ - project.path, - ":ems" -] as Set +def excludedExtensionProjects = [project.path, ":ems"] as Set def extensionProjects = rootProject.subprojects.findAll { - !excludedExtensionProjects.contains(it.path) + !excludedExtensionProjects.contains(it.path) } def configureRuntimeAttributes = { configuration -> - configuration.attributes { - attribute( - Usage.USAGE_ATTRIBUTE, - objects.named(Usage, Usage.JAVA_RUNTIME) - ) - attribute( + configuration.attributes { + attribute( + Usage.USAGE_ATTRIBUTE, + objects.named(Usage, Usage.JAVA_RUNTIME) + ) + attribute( Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY) - ) - attribute( + ) + attribute( LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, LibraryElements.JAR) - ) - attribute( + ) + attribute( TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objects.named( - TargetJvmEnvironment, - TargetJvmEnvironment.STANDARD_JVM + TargetJvmEnvironment, + TargetJvmEnvironment.STANDARD_JVM + ) ) - ) - } + } } configurations { - extensionRuntime { - canBeConsumed = false - canBeResolved = true - } - - managerRuntime { - canBeConsumed = false - canBeResolved = true - } + extensionRuntime { + canBeConsumed = false + canBeResolved = true + } + + managerRuntime { + canBeConsumed = false + canBeResolved = true + } } configureRuntimeAttributes(configurations.extensionRuntime) configureRuntimeAttributes(configurations.managerRuntime) dependencies { - extensionProjects.each { extensionProject -> - extensionRuntime project(path: extensionProject.path) - } + extensionProjects.each { extensionProject -> + extensionRuntime project(path: extensionProject.path) + } - managerRuntime libs.openremote.manager + managerRuntime libs.openremote.manager } tasks.register("copyDockerFile", Copy) { - from layout.projectDirectory.file("Dockerfile") - into layout.buildDirectory + from layout.projectDirectory.file("Dockerfile") + into layout.buildDirectory } tasks.register("distributeExtensions", DistributeExtensions) { - extensionFiles.from(configurations.extensionRuntime) - managerFiles.from(configurations.managerRuntime) - destinationDirectory.set( - layout.buildDirectory.dir("extensions") - ) + extensionFiles.from(configurations.extensionRuntime) + managerFiles.from(configurations.managerRuntime) + destinationDirectory.set( + layout.buildDirectory.dir("extensions") + ) } tasks.register("installDist") { - dependsOn "copyDockerFile", "distributeExtensions" + dependsOn "copyDockerFile", "distributeExtensions" } diff --git a/ems/README.md b/ems/README.md index f052169..de5a91c 100644 --- a/ems/README.md +++ b/ems/README.md @@ -23,15 +23,15 @@ To participate in GOPACS flex trading through OpenRemote, you need: The following environment variables must be set on the OpenRemote manager: -| Variable | Required | Description | -|---|---|---| -| `GOPACS_PRIVATE_KEY_FILE` | Yes | File path to the Ed25519 private key for signing UFTP messages | -| `GOPACS_CLIENT_ID` | Yes | OAuth2 client ID from GOPACS | -| `GOPACS_CLIENT_SECRET` | Yes | OAuth2 client secret from GOPACS | -| `GOPACS_PARTICIPANT_URL` | No | Address book base URL (default: `https://clc-message-broker.gopacs-services.eu`) | -| `GOPACS_OAUTH2_URL` | No | OAuth2 token endpoint (default: `https://auth.gopacs-services.eu/realms/gopacs/protocol/openid-connect/token`) | -| `GOPACS_RESPONSE_DELAY_SECONDS` | No | Delay before auto-responding to messages (default: `10`) | -| `GOPACS_FLEX_OFFER_DELAY_SECONDS` | No | Delay before sending a flex offer (default: `30`) | +| Variable | Required | Description | +| --------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | +| `GOPACS_PRIVATE_KEY_FILE` | Yes | File path to the Ed25519 private key for signing UFTP messages | +| `GOPACS_CLIENT_ID` | Yes | OAuth2 client ID from GOPACS | +| `GOPACS_CLIENT_SECRET` | Yes | OAuth2 client secret from GOPACS | +| `GOPACS_PARTICIPANT_URL` | No | Address book base URL (default: `https://clc-message-broker.gopacs-services.eu`) | +| `GOPACS_OAUTH2_URL` | No | OAuth2 token endpoint (default: `https://auth.gopacs-services.eu/realms/gopacs/protocol/openid-connect/token`) | +| `GOPACS_RESPONSE_DELAY_SECONDS` | No | Delay before auto-responding to messages (default: `10`) | +| `GOPACS_FLEX_OFFER_DELAY_SECONDS` | No | Delay before sending a flex offer (default: `30`) | #### Asset Setup @@ -56,6 +56,7 @@ gopacs/ ``` Related files outside this package: + - `agent/EmsGOPACSAsset.java` — JPA entity defining the GOPACS asset type (contracted EAN, power attributes) - `manager/EmsOptimisationService.java` — Manages `GOPACSHandler` lifecycle (creates/destroys handlers when assets are added/removed) - `manager/EmsOptimisationSetupService.java` — Setup class that optionally creates GOPACS assets @@ -104,6 +105,7 @@ Content-Type: application/xml ``` Processing steps: + 1. Deserialize signed XML envelope 2. Verify cryptographic signature using the sender's public key (from address book) 3. Deserialize UFTP payload @@ -136,11 +138,11 @@ The Redispatch flow is different from the UFTP flow: ### Configuration -| Variable | Required | Description | -|---|---|---| -| `GOPACS_REDISPATCH_API_KEY` | Yes | API key from GOPACS UI (User Menu > Settings > Generate API-key); required to resolve EAN effectivity per announcement. Polling will not start without it. | -| `GOPACS_REDISPATCH_URL` | No | Base URL for the Redispatch API (default: `https://idcons.gopacs-services.eu`) | -| `GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES` | No | Polling interval in minutes (default: `5`, minimum: `5`) | +| Variable | Required | Description | +| ----------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `GOPACS_REDISPATCH_API_KEY` | Yes | API key from GOPACS UI (User Menu > Settings > Generate API-key); required to resolve EAN effectivity per announcement. Polling will not start without it. | +| `GOPACS_REDISPATCH_URL` | No | Base URL for the Redispatch API (default: `https://idcons.gopacs-services.eu`) | +| `GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES` | No | Polling interval in minutes (default: `5`, minimum: `5`) | ### Asset Setup diff --git a/ems/build.gradle b/ems/build.gradle index 550f831..455900a 100644 --- a/ems/build.gradle +++ b/ems/build.gradle @@ -1,93 +1,93 @@ plugins { - id 'groovy' - id 'java-library' - id 'maven-publish' - id 'signing' + id 'groovy' + id 'java-library' + id 'maven-publish' + id 'signing' } base { - archivesName = "openremote-${project.name}-extension" + archivesName = "openremote-${project.name}-extension" } dependencies { - api libs.openremote.manager - api libs.openremote.model + api libs.openremote.manager + api libs.openremote.model - api libs.resteasyClientApi - implementation libs.shapeshifter + api libs.resteasyClientApi + implementation libs.shapeshifter - testImplementation libs.openremote.test - // Standalone (shaded) WireMock so its embedded Jetty/Jackson don't clash with the manager's web stack; - // used to mock the GOPACS broker / OAuth2 / address-book HTTP endpoints (the broker send goes through - // java.net.http.HttpClient, which a JAX-RS ClientRequestFilter cannot intercept). - testImplementation libs.wireMock + testImplementation libs.openremote.test + // Standalone (shaded) WireMock so its embedded Jetty/Jackson don't clash with the manager's web stack; + // used to mock the GOPACS broker / OAuth2 / address-book HTTP endpoints (the broker send goes through + // java.net.http.HttpClient, which a JAX-RS ClientRequestFilter cannot intercept). + testImplementation libs.wireMock } jar { - from sourceSets.main.allJava + from sourceSets.main.allJava } javadoc { - failOnError = false + failOnError = false } java { - withJavadocJar() - withSourcesJar() + withJavadocJar() + withSourcesJar() } publishing { - publications { - maven(MavenPublication) { - group = "io.openremote.extension" - artifactId = "openremote-${project.name}-extension" - from components.java - pom { - name = 'OpenRemote EMS extension' - description = 'Adds the EMS extension' - url = 'https://github.com/openremote/extensions' - licenses { - license { - name = 'GNU Affero General Public License v3.0' - url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' - } - } - developers { - developer { - id = 'developers' - name = 'Developers' - email = 'developers@openremote.io' - organization = 'OpenRemote' - organizationUrl = 'https://openremote.io' - } - } - scm { - connection = 'scm:git:git://github.com/openremote/extensions.git' - developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' - url = 'https://github.com/openremote/extensions/tree/main' - } - } + publications { + maven(MavenPublication) { + group = "io.openremote.extension" + artifactId = "openremote-${project.name}-extension" + from components.java + pom { + name = 'OpenRemote EMS extension' + description = 'Adds the EMS extension' + url = 'https://github.com/openremote/extensions' + licenses { + license { + name = 'GNU Affero General Public License v3.0' + url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + } } + developers { + developer { + id = 'developers' + name = 'Developers' + email = 'developers@openremote.io' + organization = 'OpenRemote' + organizationUrl = 'https://openremote.io' + } + } + scm { + connection = 'scm:git:git://github.com/openremote/extensions.git' + developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' + url = 'https://github.com/openremote/extensions/tree/main' + } + } } + } - repositories { - maven { - if (!version.endsWith('-LOCAL')) { - credentials { - username = findProperty("publishUsername") - password = findProperty("publishPassword") - } - } - url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") + repositories { + maven { + if (!version.endsWith('-LOCAL')) { + credentials { + username = findProperty("publishUsername") + password = findProperty("publishPassword") } + } + url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") } + } } signing { - def signingKey = findProperty("signingKey") - def signingPassword = findProperty("signingPassword") - if (signingKey && signingPassword) { - useInMemoryPgpKeys(signingKey, signingPassword) - sign publishing.publications.maven - } + def signingKey = findProperty("signingKey") + def signingPassword = findProperty("signingPassword") + if (signingKey && signingPassword) { + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.maven + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsAgentModelProvider.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsAgentModelProvider.java index c2dbde2..d264d21 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsAgentModelProvider.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsAgentModelProvider.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; @@ -23,8 +22,8 @@ public class EmsAgentModelProvider implements AssetModelProvider { - @Override - public boolean useAutoScan() { - return true; - } + @Override + public boolean useAutoScan() { + return true; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsDayAheadAsset.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsDayAheadAsset.java index d63bc26..7ef5057 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsDayAheadAsset.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsDayAheadAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,11 +12,16 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; +import static org.openremote.model.Constants.*; + import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; @@ -29,71 +31,73 @@ import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class EmsDayAheadAsset extends Asset { - public static final AttributeDescriptor COLLECT_TIME_FORECASTS = new AttributeDescriptor<>("collectTimeForecasts", ValueType.TEXT); - - public static final AttributeDescriptor LAST_UPDATE_FORECASTS = new AttributeDescriptor<>("lastUpdateForecasts", ValueType.TEXT, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ); - - public static final AttributeDescriptor TARIFF_EXPORT_DAY_AHEAD = new AttributeDescriptor<>("tariffExportDayAheadForecast", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor TARIFF_IMPORT_DAY_AHEAD = new AttributeDescriptor<>("tariffImportDayAheadForecast", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor USE_TARIFF_DAY_AHEAD_FORECASTS = new AttributeDescriptor<>("useTariffDayAheadForecasts", ValueType.BOOLEAN); - - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("calendar-clock", "000000", EmsDayAheadAsset.class); - - protected EmsDayAheadAsset() { - } - - public EmsDayAheadAsset(String name) { - super(name); - } - - - public Optional getCollectTimeForecasts() { - return getAttribute(COLLECT_TIME_FORECASTS).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getLastUpdateForecasts() { - return getAttribute(LAST_UPDATE_FORECASTS).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getLastUpdateForecastsTimestamp() { - return getAttribute(LAST_UPDATE_FORECASTS).flatMap(Attribute::getTimestamp); - } - - public Optional getUseTariffDayAheadForecasts() { - return getAttribute(USE_TARIFF_DAY_AHEAD_FORECASTS).flatMap(AbstractNameValueHolder::getValue); - } - - - public EmsDayAheadAsset setCollectTimeForecasts(String value) { - getAttributes().getOrCreate(COLLECT_TIME_FORECASTS).setValue(value); - return this; - } - - public EmsDayAheadAsset setUseTariffDayAheadForecasts(Boolean value) { - getAttributes().getOrCreate(USE_TARIFF_DAY_AHEAD_FORECASTS).setValue(value); - return this; - } - + public static final AttributeDescriptor COLLECT_TIME_FORECASTS = + new AttributeDescriptor<>("collectTimeForecasts", ValueType.TEXT); + + public static final AttributeDescriptor LAST_UPDATE_FORECASTS = + new AttributeDescriptor<>( + "lastUpdateForecasts", + ValueType.TEXT, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)); + + public static final AttributeDescriptor TARIFF_EXPORT_DAY_AHEAD = + new AttributeDescriptor<>( + "tariffExportDayAheadForecast", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor TARIFF_IMPORT_DAY_AHEAD = + new AttributeDescriptor<>( + "tariffImportDayAheadForecast", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor USE_TARIFF_DAY_AHEAD_FORECASTS = + new AttributeDescriptor<>("useTariffDayAheadForecasts", ValueType.BOOLEAN); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("calendar-clock", "000000", EmsDayAheadAsset.class); + + protected EmsDayAheadAsset() {} + + public EmsDayAheadAsset(String name) { + super(name); + } + + public Optional getCollectTimeForecasts() { + return getAttribute(COLLECT_TIME_FORECASTS).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getLastUpdateForecasts() { + return getAttribute(LAST_UPDATE_FORECASTS).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getLastUpdateForecastsTimestamp() { + return getAttribute(LAST_UPDATE_FORECASTS).flatMap(Attribute::getTimestamp); + } + + public Optional getUseTariffDayAheadForecasts() { + return getAttribute(USE_TARIFF_DAY_AHEAD_FORECASTS).flatMap(AbstractNameValueHolder::getValue); + } + + public EmsDayAheadAsset setCollectTimeForecasts(String value) { + getAttributes().getOrCreate(COLLECT_TIME_FORECASTS).setValue(value); + return this; + } + + public EmsDayAheadAsset setUseTariffDayAheadForecasts(Boolean value) { + getAttributes().getOrCreate(USE_TARIFF_DAY_AHEAD_FORECASTS).setValue(value); + return this; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsElectricityBatteryAsset.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsElectricityBatteryAsset.java index 2c9839e..b332640 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsElectricityBatteryAsset.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsElectricityBatteryAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,235 +12,264 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; +import static org.openremote.model.Constants.*; + import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.*; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class EmsElectricityBatteryAsset extends Asset { - public static final AttributeDescriptor ALLOW_CHARGING = new AttributeDescriptor<>("allowCharging", ValueType.BOOLEAN); - - public static final AttributeDescriptor ALLOW_DISCHARGING = new AttributeDescriptor<>("allowDischarging", ValueType.BOOLEAN); - - public enum EmsElectricityBatteryConnectionStatusValueType { - connected, - disconnected - } - - public static final AttributeDescriptor CHARGE_EFFICIENCY = new AttributeDescriptor<>("chargeEfficiency", ValueType.POSITIVE_INTEGER - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor CHARGE_POWER_MAXIMUM = new AttributeDescriptor<>("chargePowerMaximum", ValueType.POSITIVE_NUMBER - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final ValueDescriptor CONNECTION_STATUS_VALUE_TYPE = new ValueDescriptor<>("EmsElectricityBatteryConnectionStatusValueType", EmsElectricityBatteryConnectionStatusValueType.class); - - public static final AttributeDescriptor CONNECTION_STATUS = new AttributeDescriptor<>("connectionStatus", CONNECTION_STATUS_VALUE_TYPE, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ); - - public static final AttributeDescriptor DISCHARGE_EFFICIENCY = new AttributeDescriptor<>("dischargeEfficiency", ValueType.POSITIVE_INTEGER - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor DISCHARGE_POWER_MAXIMUM = new AttributeDescriptor<>("dischargePowerMaximum", ValueType.NEGATIVE_NUMBER - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor ENERGY_CAPACITY = new AttributeDescriptor<>("energyCapacity", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.RULE_STATE) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor ENERGY_LEVEL = new AttributeDescriptor<>("energyLevel", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE = new AttributeDescriptor<>("energyLevelPercentage", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MAXIMUM = new AttributeDescriptor<>("energyLevelPercentageMaximum", ValueType.POSITIVE_INTEGER - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MINIMUM = new AttributeDescriptor<>("energyLevelPercentageMinimum", ValueType.POSITIVE_INTEGER - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor POWER = new AttributeDescriptor<>("power", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_SETPOINT = new AttributeDescriptor<>("powerSetpoint", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - -// // Placeholders -// public static final AttributeDescriptor INCLUDE_BATTERY_COST = new AttributeDescriptor<>("includeBatteryCost", ValueType.BOOLEAN -// ); -// -// public static final AttributeDescriptor CHARGE_COST = new AttributeDescriptor<>("chargeCost", ValueType.NUMBER, -// new MetaItem<>(MetaItemType.LABEL, "Charge cost (€/kWh)") -// ); -// -// public static final AttributeDescriptor DISCHARGE_COST = new AttributeDescriptor<>("dischargeCost", ValueType.NUMBER, -// new MetaItem<>(MetaItemType.LABEL, "Discharge cost (€/kWh)") -// ); - - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("battery-charging", "1B7C89", EmsElectricityBatteryAsset.class); - - protected EmsElectricityBatteryAsset() { - } - - public EmsElectricityBatteryAsset(String name) { - super(name); - } - - public Optional getAllowCharging() { - return getAttribute(ALLOW_CHARGING).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getAllowDischarging() { - return getAttribute(ALLOW_DISCHARGING).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getConnectionStatus() { - return getAttribute(CONNECTION_STATUS).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getChargeEfficiency() { - return getAttribute(CHARGE_EFFICIENCY).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getChargePowerMaximum() { - return getAttribute(CHARGE_POWER_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getDischargeEfficiency() { - return getAttribute(DISCHARGE_EFFICIENCY).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getDischargePowerMaximum() { - return getAttribute(DISCHARGE_POWER_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyCapacity() { - return getAttribute(ENERGY_CAPACITY).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyLevelPercentage() { - return getAttribute(ENERGY_LEVEL_PERCENTAGE).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyLevelPercentageTimestamp() { - return getAttribute(ENERGY_LEVEL_PERCENTAGE).flatMap(Attribute::getTimestamp); - } - - public Optional getEnergyLevelPercentageMaximum() { - return getAttribute(ENERGY_LEVEL_PERCENTAGE_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyLevelPercentageMinimum() { - return getAttribute(ENERGY_LEVEL_PERCENTAGE_MINIMUM).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPower() { - return getAttribute(POWER).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerTimestamp() { - return getAttribute(POWER).flatMap(Attribute::getTimestamp); - } - - public Optional getPowerSetpoint() { - return getAttribute(POWER_SETPOINT).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerSetpointTimestamp() { - return getAttribute(POWER_SETPOINT).flatMap(Attribute::getTimestamp); - } - - - public EmsElectricityBatteryAsset setAllowCharging(Boolean value) { - getAttributes().getOrCreate(ALLOW_CHARGING).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setAllowDischarging(Boolean value) { - getAttributes().getOrCreate(ALLOW_DISCHARGING).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setChargeEfficiency(Integer value) { - getAttributes().getOrCreate(CHARGE_EFFICIENCY).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setChargePowerMaximum(Double value) { - getAttributes().getOrCreate(CHARGE_POWER_MAXIMUM).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setDischargeEfficiency(Integer value) { - getAttributes().getOrCreate(DISCHARGE_EFFICIENCY).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setDischargePowerMaximum(Double value) { - getAttributes().getOrCreate(DISCHARGE_POWER_MAXIMUM).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setEnergyCapacity(Double value) { - getAttributes().getOrCreate(ENERGY_CAPACITY).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setEnergyLevelPercentage(Double value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setEnergyLevelPercentageMaximum(Integer value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MAXIMUM).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setEnergyLevelPercentageMinimum(Integer value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MINIMUM).setValue(value); - return this; - } - - public EmsElectricityBatteryAsset setPower(Double value) { - getAttributes().getOrCreate(POWER).setValue(value); - return this; - } + public static final AttributeDescriptor ALLOW_CHARGING = + new AttributeDescriptor<>("allowCharging", ValueType.BOOLEAN); + + public static final AttributeDescriptor ALLOW_DISCHARGING = + new AttributeDescriptor<>("allowDischarging", ValueType.BOOLEAN); + + public enum EmsElectricityBatteryConnectionStatusValueType { + connected, + disconnected + } + + public static final AttributeDescriptor CHARGE_EFFICIENCY = + new AttributeDescriptor<>("chargeEfficiency", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor CHARGE_POWER_MAXIMUM = + new AttributeDescriptor<>("chargePowerMaximum", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final ValueDescriptor + CONNECTION_STATUS_VALUE_TYPE = + new ValueDescriptor<>( + "EmsElectricityBatteryConnectionStatusValueType", + EmsElectricityBatteryConnectionStatusValueType.class); + + public static final AttributeDescriptor + CONNECTION_STATUS = + new AttributeDescriptor<>( + "connectionStatus", + CONNECTION_STATUS_VALUE_TYPE, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)); + + public static final AttributeDescriptor DISCHARGE_EFFICIENCY = + new AttributeDescriptor<>("dischargeEfficiency", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor DISCHARGE_POWER_MAXIMUM = + new AttributeDescriptor<>("dischargePowerMaximum", ValueType.NEGATIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor ENERGY_CAPACITY = + new AttributeDescriptor<>( + "energyCapacity", ValueType.POSITIVE_NUMBER, new MetaItem<>(MetaItemType.RULE_STATE)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor ENERGY_LEVEL = + new AttributeDescriptor<>( + "energyLevel", + ValueType.POSITIVE_NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE = + new AttributeDescriptor<>( + "energyLevelPercentage", + ValueType.POSITIVE_NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MAXIMUM = + new AttributeDescriptor<>("energyLevelPercentageMaximum", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MINIMUM = + new AttributeDescriptor<>("energyLevelPercentageMinimum", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor POWER = + new AttributeDescriptor<>( + "power", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_SETPOINT = + new AttributeDescriptor<>( + "powerSetpoint", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + // // Placeholders + // public static final AttributeDescriptor INCLUDE_BATTERY_COST = new + // AttributeDescriptor<>("includeBatteryCost", ValueType.BOOLEAN + // ); + // + // public static final AttributeDescriptor CHARGE_COST = new + // AttributeDescriptor<>("chargeCost", ValueType.NUMBER, + // new MetaItem<>(MetaItemType.LABEL, "Charge cost (€/kWh)") + // ); + // + // public static final AttributeDescriptor DISCHARGE_COST = new + // AttributeDescriptor<>("dischargeCost", ValueType.NUMBER, + // new MetaItem<>(MetaItemType.LABEL, "Discharge cost (€/kWh)") + // ); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("battery-charging", "1B7C89", EmsElectricityBatteryAsset.class); + + protected EmsElectricityBatteryAsset() {} + + public EmsElectricityBatteryAsset(String name) { + super(name); + } + + public Optional getAllowCharging() { + return getAttribute(ALLOW_CHARGING).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getAllowDischarging() { + return getAttribute(ALLOW_DISCHARGING).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getConnectionStatus() { + return getAttribute(CONNECTION_STATUS).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getChargeEfficiency() { + return getAttribute(CHARGE_EFFICIENCY).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getChargePowerMaximum() { + return getAttribute(CHARGE_POWER_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getDischargeEfficiency() { + return getAttribute(DISCHARGE_EFFICIENCY).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getDischargePowerMaximum() { + return getAttribute(DISCHARGE_POWER_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyCapacity() { + return getAttribute(ENERGY_CAPACITY).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyLevelPercentage() { + return getAttribute(ENERGY_LEVEL_PERCENTAGE).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyLevelPercentageTimestamp() { + return getAttribute(ENERGY_LEVEL_PERCENTAGE).flatMap(Attribute::getTimestamp); + } + + public Optional getEnergyLevelPercentageMaximum() { + return getAttribute(ENERGY_LEVEL_PERCENTAGE_MAXIMUM).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyLevelPercentageMinimum() { + return getAttribute(ENERGY_LEVEL_PERCENTAGE_MINIMUM).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPower() { + return getAttribute(POWER).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerTimestamp() { + return getAttribute(POWER).flatMap(Attribute::getTimestamp); + } + + public Optional getPowerSetpoint() { + return getAttribute(POWER_SETPOINT).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerSetpointTimestamp() { + return getAttribute(POWER_SETPOINT).flatMap(Attribute::getTimestamp); + } + + public EmsElectricityBatteryAsset setAllowCharging(Boolean value) { + getAttributes().getOrCreate(ALLOW_CHARGING).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setAllowDischarging(Boolean value) { + getAttributes().getOrCreate(ALLOW_DISCHARGING).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setChargeEfficiency(Integer value) { + getAttributes().getOrCreate(CHARGE_EFFICIENCY).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setChargePowerMaximum(Double value) { + getAttributes().getOrCreate(CHARGE_POWER_MAXIMUM).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setDischargeEfficiency(Integer value) { + getAttributes().getOrCreate(DISCHARGE_EFFICIENCY).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setDischargePowerMaximum(Double value) { + getAttributes().getOrCreate(DISCHARGE_POWER_MAXIMUM).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setEnergyCapacity(Double value) { + getAttributes().getOrCreate(ENERGY_CAPACITY).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setEnergyLevelPercentage(Double value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setEnergyLevelPercentageMaximum(Integer value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MAXIMUM).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setEnergyLevelPercentageMinimum(Integer value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MINIMUM).setValue(value); + return this; + } + + public EmsElectricityBatteryAsset setPower(Double value) { + getAttributes().getOrCreate(POWER).setValue(value); + return this; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationAsset.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationAsset.java index 12d5e4a..429b815 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationAsset.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,273 +12,329 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; +import static org.openremote.model.Constants.*; + import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.*; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class EmsEnergyOptimisationAsset extends Asset { - public static final AttributeDescriptor ADVANCED_SETTINGS_ATTRIBUTES = new AttributeDescriptor<>("advancedSettingsAttributes", ValueType.TEXT, - new MetaItem<>(MetaItemType.MULTILINE), - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor ENABLE_DETAILED_LOGGING = new AttributeDescriptor<>("enableDetailedLogging", ValueType.BOOLEAN); - - public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = new AttributeDescriptor<>("energyExportTotal", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = new AttributeDescriptor<>("energyImportTotal", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor GENERATE_POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT = new AttributeDescriptor<>("generatePowerLimitMaximumProfileManualInput", ValueType.BOOLEAN); - - public static final AttributeDescriptor GENERATE_POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT = new AttributeDescriptor<>("generatePowerLimitMinimumProfileManualInput", ValueType.BOOLEAN); - - public static final AttributeDescriptor DISABLE_OPTIMISATION_SERVICE = new AttributeDescriptor<>("disableOptimisationService", ValueType.BOOLEAN); - - public enum OptimisationMethodValueType { - None, - EmsOptimisation, - EmsOptimisationBeta, - } - - public static final ValueDescriptor OPTIMISATION_METHOD_VALUE_TYPE = new ValueDescriptor<>("optimisationMethodValueType", OptimisationMethodValueType.class); - - public static final AttributeDescriptor OPTIMISATION_METHOD = new AttributeDescriptor<>("optimisationMethod", OPTIMISATION_METHOD_VALUE_TYPE - ); - - public static final AttributeDescriptor POWER_CONSUMPTION = new AttributeDescriptor<>("powerConsumption", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_FLEXIBLE = new AttributeDescriptor<>("powerFlexible", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_NET = new AttributeDescriptor<>("powerNet", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_PRODUCTION = new AttributeDescriptor<>("powerProduction", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_INPUT = new AttributeDescriptor<>("powerLimitMaximumInput", ValueType.NUMBER - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_MANUAL = new AttributeDescriptor<>("powerLimitMaximumProfileManual", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT = new AttributeDescriptor<>("powerLimitMaximumProfileManualInput", ValueType.TEXT, - new MetaItem<>(MetaItemType.MULTILINE) - ); - - public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_TOTAL = new AttributeDescriptor<>("powerLimitMaximumProfileTotal", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MINIMUM_INPUT = new AttributeDescriptor<>("powerLimitMinimumInput", ValueType.NUMBER - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_MANUAL = new AttributeDescriptor<>("powerLimitMinimumProfileManual", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT = new AttributeDescriptor<>("powerLimitMinimumProfileManualInput", ValueType.TEXT, - new MetaItem<>(MetaItemType.MULTILINE) - ); - - public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_TOTAL = new AttributeDescriptor<>("powerLimitMinimumProfileTotal", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor TARIFF_EXPORT = new AttributeDescriptor<>("tariffExport", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor TARIFF_IMPORT = new AttributeDescriptor<>("tariffImport", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.RULE_STATE), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("flash", "C4DB0D", EmsEnergyOptimisationAsset.class); - - protected EmsEnergyOptimisationAsset() { - } - - public EmsEnergyOptimisationAsset(String name) { - super(name); - } - - public Optional getAdvancedSettingsAttributes() { - return getAttribute(ADVANCED_SETTINGS_ATTRIBUTES).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnableDetailedLogging() { - return getAttribute(ENABLE_DETAILED_LOGGING).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyExportTotal() { - return getAttribute(ENERGY_EXPORT_TOTAL).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getEnergyImportTotal() { - return getAttribute(ENERGY_IMPORT_TOTAL).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getOptimisationDisabled() { - return getAttribute(DISABLE_OPTIMISATION_SERVICE).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getOptimisationMethod() { - return getAttribute(OPTIMISATION_METHOD).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerNet() { - return getAttribute(POWER_NET).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerNetTimestamp() { - return getAttribute(POWER_NET).flatMap(Attribute::getTimestamp); - } - - public Optional getPowerLimitMaximumInput() { - return getAttribute(POWER_LIMIT_MAXIMUM_INPUT).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerLimitMaximumProfileManualInput() { - return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerLimitMaximumProfileTotal() { - return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerLimitMaximumProfileTotalTimestamp() { - return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL).flatMap(Attribute::getTimestamp); - } - - public Optional getPowerLimitMinimumInput() { - return getAttribute(POWER_LIMIT_MINIMUM_INPUT).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerLimitMinimumProfileManualInput() { - return getAttribute(POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional getPowerLimitMinimumProfileTotal() { - return getAttribute(POWER_LIMIT_MINIMUM_PROFILE_TOTAL).flatMap(AbstractNameValueHolder::getValue); - } - - - public EmsEnergyOptimisationAsset setOptimisationDisabled(Boolean value) { - getAttributes().getOrCreate(DISABLE_OPTIMISATION_SERVICE).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setOptimisationMethod(OptimisationMethodValueType value) { - getAttributes().getOrCreate(OPTIMISATION_METHOD).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMaximumInput(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_INPUT).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileManual(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileManualInput(String value) { - getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileTotal(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMinimumInput(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_INPUT).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileManual(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_MANUAL).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileManualInput(String value) { - getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileTotal(Double value) { - getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_TOTAL).setValue(value); - return this; - } - - public EmsEnergyOptimisationAsset setPowerNet(Double value) { - getAttributes().getOrCreate(POWER_NET).setValue(value); - return this; - } + public static final AttributeDescriptor ADVANCED_SETTINGS_ATTRIBUTES = + new AttributeDescriptor<>( + "advancedSettingsAttributes", + ValueType.TEXT, + new MetaItem<>(MetaItemType.MULTILINE), + new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor ENABLE_DETAILED_LOGGING = + new AttributeDescriptor<>("enableDetailedLogging", ValueType.BOOLEAN); + + public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = + new AttributeDescriptor<>( + "energyExportTotal", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = + new AttributeDescriptor<>( + "energyImportTotal", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor + GENERATE_POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT = + new AttributeDescriptor<>( + "generatePowerLimitMaximumProfileManualInput", ValueType.BOOLEAN); + + public static final AttributeDescriptor + GENERATE_POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT = + new AttributeDescriptor<>( + "generatePowerLimitMinimumProfileManualInput", ValueType.BOOLEAN); + + public static final AttributeDescriptor DISABLE_OPTIMISATION_SERVICE = + new AttributeDescriptor<>("disableOptimisationService", ValueType.BOOLEAN); + + public enum OptimisationMethodValueType { + None, + EmsOptimisation, + EmsOptimisationBeta, + } + + public static final ValueDescriptor OPTIMISATION_METHOD_VALUE_TYPE = + new ValueDescriptor<>("optimisationMethodValueType", OptimisationMethodValueType.class); + + public static final AttributeDescriptor OPTIMISATION_METHOD = + new AttributeDescriptor<>("optimisationMethod", OPTIMISATION_METHOD_VALUE_TYPE); + + public static final AttributeDescriptor POWER_CONSUMPTION = + new AttributeDescriptor<>( + "powerConsumption", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_FLEXIBLE = + new AttributeDescriptor<>( + "powerFlexible", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_NET = + new AttributeDescriptor<>( + "powerNet", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_PRODUCTION = + new AttributeDescriptor<>( + "powerProduction", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_INPUT = + new AttributeDescriptor<>("powerLimitMaximumInput", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_MANUAL = + new AttributeDescriptor<>( + "powerLimitMaximumProfileManual", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT = + new AttributeDescriptor<>( + "powerLimitMaximumProfileManualInput", + ValueType.TEXT, + new MetaItem<>(MetaItemType.MULTILINE)); + + public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_TOTAL = + new AttributeDescriptor<>( + "powerLimitMaximumProfileTotal", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MINIMUM_INPUT = + new AttributeDescriptor<>("powerLimitMinimumInput", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_MANUAL = + new AttributeDescriptor<>( + "powerLimitMinimumProfileManual", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT = + new AttributeDescriptor<>( + "powerLimitMinimumProfileManualInput", + ValueType.TEXT, + new MetaItem<>(MetaItemType.MULTILINE)); + + public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_TOTAL = + new AttributeDescriptor<>( + "powerLimitMinimumProfileTotal", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor TARIFF_EXPORT = + new AttributeDescriptor<>( + "tariffExport", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor TARIFF_IMPORT = + new AttributeDescriptor<>( + "tariffImport", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.RULE_STATE), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("flash", "C4DB0D", EmsEnergyOptimisationAsset.class); + + protected EmsEnergyOptimisationAsset() {} + + public EmsEnergyOptimisationAsset(String name) { + super(name); + } + + public Optional getAdvancedSettingsAttributes() { + return getAttribute(ADVANCED_SETTINGS_ATTRIBUTES).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnableDetailedLogging() { + return getAttribute(ENABLE_DETAILED_LOGGING).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyExportTotal() { + return getAttribute(ENERGY_EXPORT_TOTAL).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getEnergyImportTotal() { + return getAttribute(ENERGY_IMPORT_TOTAL).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getOptimisationDisabled() { + return getAttribute(DISABLE_OPTIMISATION_SERVICE).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getOptimisationMethod() { + return getAttribute(OPTIMISATION_METHOD).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerNet() { + return getAttribute(POWER_NET).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerNetTimestamp() { + return getAttribute(POWER_NET).flatMap(Attribute::getTimestamp); + } + + public Optional getPowerLimitMaximumInput() { + return getAttribute(POWER_LIMIT_MAXIMUM_INPUT).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerLimitMaximumProfileManualInput() { + return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT) + .flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerLimitMaximumProfileTotal() { + return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL) + .flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerLimitMaximumProfileTotalTimestamp() { + return getAttribute(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL).flatMap(Attribute::getTimestamp); + } + + public Optional getPowerLimitMinimumInput() { + return getAttribute(POWER_LIMIT_MINIMUM_INPUT).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerLimitMinimumProfileManualInput() { + return getAttribute(POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT) + .flatMap(AbstractNameValueHolder::getValue); + } + + public Optional getPowerLimitMinimumProfileTotal() { + return getAttribute(POWER_LIMIT_MINIMUM_PROFILE_TOTAL) + .flatMap(AbstractNameValueHolder::getValue); + } + + public EmsEnergyOptimisationAsset setOptimisationDisabled(Boolean value) { + getAttributes().getOrCreate(DISABLE_OPTIMISATION_SERVICE).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setOptimisationMethod(OptimisationMethodValueType value) { + getAttributes().getOrCreate(OPTIMISATION_METHOD).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMaximumInput(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_INPUT).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileManual(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileManualInput(String value) { + getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMaximumProfileTotal(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MAXIMUM_PROFILE_TOTAL).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMinimumInput(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_INPUT).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileManual(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_MANUAL).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileManualInput(String value) { + getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerLimitMinimumProfileTotal(Double value) { + getAttributes().getOrCreate(POWER_LIMIT_MINIMUM_PROFILE_TOTAL).setValue(value); + return this; + } + + public EmsEnergyOptimisationAsset setPowerNet(Double value) { + getAttributes().getOrCreate(POWER_NET).setValue(value); + return this; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationSetupAsset.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationSetupAsset.java index 9890f37..90a6836 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationSetupAsset.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsEnergyOptimisationSetupAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,11 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; @@ -27,46 +27,46 @@ import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import java.util.Optional; - @Entity public class EmsEnergyOptimisationSetupAsset extends Asset { - public static final AttributeDescriptor CREATE_ENERGY_MANAGEMENT_SYSTEM = new AttributeDescriptor<>("createEnergyManagementSystem", ValueType.BOOLEAN - ); - - public static final AttributeDescriptor ENERGY_MANAGEMENT_SYSTEM_NAME = new AttributeDescriptor<>("energyManagementSystemName", ValueType.TEXT - ); + public static final AttributeDescriptor CREATE_ENERGY_MANAGEMENT_SYSTEM = + new AttributeDescriptor<>("createEnergyManagementSystem", ValueType.BOOLEAN); - public static final AttributeDescriptor INCLUDE_DAY_AHEAD_FORECASTS = new AttributeDescriptor<>("includeDayAheadForecasts", ValueType.BOOLEAN - ); + public static final AttributeDescriptor ENERGY_MANAGEMENT_SYSTEM_NAME = + new AttributeDescriptor<>("energyManagementSystemName", ValueType.TEXT); - public static final AttributeDescriptor INCLUDE_GOPACS = new AttributeDescriptor<>("includeGOPACS", ValueType.BOOLEAN - ); + public static final AttributeDescriptor INCLUDE_DAY_AHEAD_FORECASTS = + new AttributeDescriptor<>("includeDayAheadForecasts", ValueType.BOOLEAN); - public static final AttributeDescriptor INFO_FIELD = new AttributeDescriptor<>("infoField", ValueType.TEXT, - new MetaItem<>(MetaItemType.MULTILINE), - new MetaItem<>(MetaItemType.READ_ONLY) - ); + public static final AttributeDescriptor INCLUDE_GOPACS = + new AttributeDescriptor<>("includeGOPACS", ValueType.BOOLEAN); + public static final AttributeDescriptor INFO_FIELD = + new AttributeDescriptor<>( + "infoField", + ValueType.TEXT, + new MetaItem<>(MetaItemType.MULTILINE), + new MetaItem<>(MetaItemType.READ_ONLY)); - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("application-cog-outline", "000000", EmsEnergyOptimisationSetupAsset.class); + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>( + "application-cog-outline", "000000", EmsEnergyOptimisationSetupAsset.class); - protected EmsEnergyOptimisationSetupAsset() { - } + protected EmsEnergyOptimisationSetupAsset() {} - public EmsEnergyOptimisationSetupAsset(String name) { - super(name); - } + public EmsEnergyOptimisationSetupAsset(String name) { + super(name); + } - public Optional getIncludeDayAheadForecasts() { - return getAttributes().getValue(INCLUDE_DAY_AHEAD_FORECASTS); - } + public Optional getIncludeDayAheadForecasts() { + return getAttributes().getValue(INCLUDE_DAY_AHEAD_FORECASTS); + } - public Optional getIncludeGopacs() { - return getAttributes().getValue(INCLUDE_GOPACS); - } + public Optional getIncludeGopacs() { + return getAttributes().getValue(INCLUDE_GOPACS); + } - public Optional getEnergyManagementSystemName() { - return getAttributes().getValue(ENERGY_MANAGEMENT_SYSTEM_NAME); - } + public Optional getEnergyManagementSystemName() { + return getAttributes().getValue(ENERGY_MANAGEMENT_SYSTEM_NAME); + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/agent/EmsGOPACSAsset.java b/ems/src/main/java/org/openremote/extension/ems/agent/EmsGOPACSAsset.java index 85d2ac5..df96de6 100644 --- a/ems/src/main/java/org/openremote/extension/ems/agent/EmsGOPACSAsset.java +++ b/ems/src/main/java/org/openremote/extension/ems/agent/EmsGOPACSAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,207 +12,236 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.agent; +import static org.openremote.model.Constants.*; + import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; - import org.openremote.model.value.ValueType.ObjectMap; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class EmsGOPACSAsset extends Asset { - // --- UFTP / Day-Ahead attributes --- - - public static final AttributeDescriptor CONTRACTED_EAN = new AttributeDescriptor<>("contractedEAN", ValueType.TEXT - ); - - public static final AttributeDescriptor CURRENT_POWER_FLEX_REQUEST = new AttributeDescriptor<>("currentPowerFlexRequest", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER = new AttributeDescriptor<>("powerLimitMaximumProfileFlexOrder", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER = new AttributeDescriptor<>("powerLimitMinimumProfileFlexOrder", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_MAXIMUM_FLEX_REQUEST = new AttributeDescriptor<>("powerMaximumFlexRequest", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor POWER_MINIMUM_FLEX_REQUEST = new AttributeDescriptor<>("powerMinimumFlexRequest", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - // --- Redispatch configuration attributes --- - - public static final AttributeDescriptor REDISPATCH_ENABLED = new AttributeDescriptor<>("redispatchEnabled", ValueType.BOOLEAN - ); - - // --- Redispatch status attributes (read-only, system-updated) --- - - public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_ID = new AttributeDescriptor<>("redispatchAnnouncementId", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_COMPLIANCE_TYPE = new AttributeDescriptor<>("redispatchComplianceType", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_MESSAGE = new AttributeDescriptor<>("redispatchAnnouncementMessage", ValueType.TEXT, - new MetaItem<>(MetaItemType.MULTILINE), - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_START_TIME = new AttributeDescriptor<>("redispatchStartTime", ValueType.TIMESTAMP, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_END_TIME = new AttributeDescriptor<>("redispatchEndTime", ValueType.TIMESTAMP, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_BID_VALIDITY_END = new AttributeDescriptor<>("redispatchBidValidityEnd", ValueType.TIMESTAMP, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_REQUESTED_POWER = new AttributeDescriptor<>("redispatchRequestedPower", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor REDISPATCH_EAN_EFFECTIVITY = new AttributeDescriptor<>("redispatchEanEffectivity", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_REQUEST_AREA_BUY = new AttributeDescriptor<>("redispatchRequestAreaBuy", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_REQUEST_AREA_SELL = new AttributeDescriptor<>("redispatchRequestAreaSell", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - public static final AttributeDescriptor REDISPATCH_LAST_POLL = new AttributeDescriptor<>("redispatchLastPoll", ValueType.TIMESTAMP, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - // --- Redispatch bid attributes (auto-calculated, operator-overridable) --- - - public static final AttributeDescriptor REDISPATCH_SUGGESTED_POWER = new AttributeDescriptor<>("redispatchSuggestedPower", ValueType.NUMBER, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), - new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ).withUnits(UNITS_KILO, UNITS_WATT); - - public static final AttributeDescriptor REDISPATCH_SUGGESTED_VOLUME = new AttributeDescriptor<>("redispatchSuggestedVolume", ValueType.NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - - public static final AttributeDescriptor REDISPATCH_BID_PRICE = new AttributeDescriptor<>("redispatchBidPrice", ValueType.NUMBER - ).withUnits("EUR", UNITS_PER, UNITS_MEGA, UNITS_WATT, UNITS_HOUR); - - // --- Redispatch confirmation workflow --- - - public static final AttributeDescriptor REDISPATCH_CONFIRM_BID = new AttributeDescriptor<>("redispatchConfirmBid", ValueType.BOOLEAN - ); - - public static final AttributeDescriptor REDISPATCH_BID_STATUS = new AttributeDescriptor<>("redispatchBidStatus", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY) - ); - - // --- Redispatch history (stored as data points for time-series history) --- - - public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_HISTORY = new AttributeDescriptor<>("redispatchAnnouncementHistory", ValueType.JSON_OBJECT, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 90), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ); - - public static final AttributeDescriptor REDISPATCH_BID_HISTORY = new AttributeDescriptor<>("redispatchBidHistory", ValueType.JSON_OBJECT, - new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 90), - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.STORE_DATA_POINTS) - ); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("transmission-tower", null, EmsGOPACSAsset.class); - - protected EmsGOPACSAsset() { - } - - public EmsGOPACSAsset(String name) { - super(name); - } - - // --- UFTP getters --- - - public Optional getContractedEan() { - return getAttributes().getValue(CONTRACTED_EAN); - } - - // --- Redispatch getters --- - - public Optional getRedispatchEnabled() { - return getAttributes().getValue(REDISPATCH_ENABLED); - } - - public Optional getRedispatchAnnouncementId() { - return getAttributes().getValue(REDISPATCH_ANNOUNCEMENT_ID); - } - - public Optional getRedispatchBidStatus() { - return getAttributes().getValue(REDISPATCH_BID_STATUS); - } - - public Optional getRedispatchBidPrice() { - return getAttributes().getValue(REDISPATCH_BID_PRICE); - } - - public Optional getRedispatchConfirmBid() { - return getAttributes().getValue(REDISPATCH_CONFIRM_BID); - } - - // --- Redispatch setters --- + // --- UFTP / Day-Ahead attributes --- + + public static final AttributeDescriptor CONTRACTED_EAN = + new AttributeDescriptor<>("contractedEAN", ValueType.TEXT); + + public static final AttributeDescriptor CURRENT_POWER_FLEX_REQUEST = + new AttributeDescriptor<>( + "currentPowerFlexRequest", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER = + new AttributeDescriptor<>( + "powerLimitMaximumProfileFlexOrder", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER = + new AttributeDescriptor<>( + "powerLimitMinimumProfileFlexOrder", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_MAXIMUM_FLEX_REQUEST = + new AttributeDescriptor<>( + "powerMaximumFlexRequest", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor POWER_MINIMUM_FLEX_REQUEST = + new AttributeDescriptor<>( + "powerMinimumFlexRequest", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + // --- Redispatch configuration attributes --- + + public static final AttributeDescriptor REDISPATCH_ENABLED = + new AttributeDescriptor<>("redispatchEnabled", ValueType.BOOLEAN); + + // --- Redispatch status attributes (read-only, system-updated) --- + + public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_ID = + new AttributeDescriptor<>( + "redispatchAnnouncementId", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_COMPLIANCE_TYPE = + new AttributeDescriptor<>( + "redispatchComplianceType", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_MESSAGE = + new AttributeDescriptor<>( + "redispatchAnnouncementMessage", + ValueType.TEXT, + new MetaItem<>(MetaItemType.MULTILINE), + new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_START_TIME = + new AttributeDescriptor<>( + "redispatchStartTime", ValueType.TIMESTAMP, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_END_TIME = + new AttributeDescriptor<>( + "redispatchEndTime", ValueType.TIMESTAMP, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_BID_VALIDITY_END = + new AttributeDescriptor<>( + "redispatchBidValidityEnd", ValueType.TIMESTAMP, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_REQUESTED_POWER = + new AttributeDescriptor<>( + "redispatchRequestedPower", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor REDISPATCH_EAN_EFFECTIVITY = + new AttributeDescriptor<>( + "redispatchEanEffectivity", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_REQUEST_AREA_BUY = + new AttributeDescriptor<>( + "redispatchRequestAreaBuy", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_REQUEST_AREA_SELL = + new AttributeDescriptor<>( + "redispatchRequestAreaSell", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + public static final AttributeDescriptor REDISPATCH_LAST_POLL = + new AttributeDescriptor<>( + "redispatchLastPoll", ValueType.TIMESTAMP, new MetaItem<>(MetaItemType.READ_ONLY)); + + // --- Redispatch bid attributes (auto-calculated, operator-overridable) --- + + public static final AttributeDescriptor REDISPATCH_SUGGESTED_POWER = + new AttributeDescriptor<>( + "redispatchSuggestedPower", + ValueType.NUMBER, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 7), + new MetaItem<>(MetaItemType.HAS_PREDICTED_DATA_POINTS), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor REDISPATCH_SUGGESTED_VOLUME = + new AttributeDescriptor<>( + "redispatchSuggestedVolume", ValueType.NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + + public static final AttributeDescriptor REDISPATCH_BID_PRICE = + new AttributeDescriptor<>("redispatchBidPrice", ValueType.NUMBER) + .withUnits("EUR", UNITS_PER, UNITS_MEGA, UNITS_WATT, UNITS_HOUR); + + // --- Redispatch confirmation workflow --- + + public static final AttributeDescriptor REDISPATCH_CONFIRM_BID = + new AttributeDescriptor<>("redispatchConfirmBid", ValueType.BOOLEAN); + + public static final AttributeDescriptor REDISPATCH_BID_STATUS = + new AttributeDescriptor<>( + "redispatchBidStatus", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + + // --- Redispatch history (stored as data points for time-series history) --- + + public static final AttributeDescriptor REDISPATCH_ANNOUNCEMENT_HISTORY = + new AttributeDescriptor<>( + "redispatchAnnouncementHistory", + ValueType.JSON_OBJECT, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 90), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)); + + public static final AttributeDescriptor REDISPATCH_BID_HISTORY = + new AttributeDescriptor<>( + "redispatchBidHistory", + ValueType.JSON_OBJECT, + new MetaItem<>(MetaItemType.DATA_POINTS_MAX_AGE_DAYS, 90), + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>(MetaItemType.STORE_DATA_POINTS)); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("transmission-tower", null, EmsGOPACSAsset.class); + + protected EmsGOPACSAsset() {} + + public EmsGOPACSAsset(String name) { + super(name); + } + + // --- UFTP getters --- + + public Optional getContractedEan() { + return getAttributes().getValue(CONTRACTED_EAN); + } + + // --- Redispatch getters --- + + public Optional getRedispatchEnabled() { + return getAttributes().getValue(REDISPATCH_ENABLED); + } + + public Optional getRedispatchAnnouncementId() { + return getAttributes().getValue(REDISPATCH_ANNOUNCEMENT_ID); + } + + public Optional getRedispatchBidStatus() { + return getAttributes().getValue(REDISPATCH_BID_STATUS); + } + + public Optional getRedispatchBidPrice() { + return getAttributes().getValue(REDISPATCH_BID_PRICE); + } + + public Optional getRedispatchConfirmBid() { + return getAttributes().getValue(REDISPATCH_CONFIRM_BID); + } + + // --- Redispatch setters --- - public EmsGOPACSAsset setRedispatchEnabled(Boolean enabled) { - getAttributes().getOrCreate(REDISPATCH_ENABLED).setValue(enabled); - return this; - } + public EmsGOPACSAsset setRedispatchEnabled(Boolean enabled) { + getAttributes().getOrCreate(REDISPATCH_ENABLED).setValue(enabled); + return this; + } - public EmsGOPACSAsset setRedispatchBidPrice(Double bidPrice) { - getAttributes().getOrCreate(REDISPATCH_BID_PRICE).setValue(bidPrice); - return this; - } + public EmsGOPACSAsset setRedispatchBidPrice(Double bidPrice) { + getAttributes().getOrCreate(REDISPATCH_BID_PRICE).setValue(bidPrice); + return this; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationService.java b/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationService.java index 3077c1b..c98e97f 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationService.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationService.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,28 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager; +import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; +import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; +import static org.openremote.manager.gateway.GatewayService.isNotForGateway; +import static org.openremote.model.syslog.SyslogCategory.DATA; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; import org.apache.camel.builder.RouteBuilder; import org.openremote.container.message.MessageBrokerService; import org.openremote.container.timer.TimerService; @@ -45,850 +60,1135 @@ import org.openremote.model.query.AssetQuery; import org.openremote.model.syslog.SyslogCategory; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.text.SimpleDateFormat; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; -import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; -import static org.openremote.manager.gateway.GatewayService.isNotForGateway; -import static org.openremote.model.syslog.SyslogCategory.DATA; - public class EmsOptimisationService extends RouteBuilder implements ContainerService { - protected static final Logger LOG = SyslogCategory.getLogger(DATA, EmsOptimisationService.class.getName()); - protected Services services; - - protected GOPACSHandler.Factory gopacsHandlerFactory; - protected GOPACSRedispatchHandler.Factory gopacsRedispatchHandlerFactory; - - private final Map> energyOptimisationAssetsMap = new ConcurrentHashMap<>(); - private final Map energyOptimisationTimersMap = new HashMap<>(); - private final Map gopacsHandlerMap = new HashMap<>(); - private final Map gopacsRedispatchHandlerMap = new HashMap<>(); - - - @SuppressWarnings("unchecked") - @Override - public void configure() throws Exception { - from(PERSISTENCE_TOPIC) - .routeId("Persistence-EmsEnergyOptimisation") - .filter(isPersistenceEventForEntityType(Asset.class)) - .filter(isNotForGateway(services.getGatewayService())) - .process(exchange -> processAssetChange(exchange.getIn().getBody(PersistenceEvent.class))); - } - - @Override - public void init(Container container) throws Exception { - services = Services.builder() - .withAssetDatapointService(container.getService(AssetDatapointService.class)) - .withAssetPredictedDatapointService(container.getService(AssetPredictedDatapointService.class)) - .withAssetProcessingService(container.getService(AssetProcessingService.class)) - .withAssetStorageService(container.getService(AssetStorageService.class)) - .withClientEventService(container.getService(ClientEventService.class)) - .withGatewayService(container.getService(GatewayService.class)) - .withMessageBrokerService(container.getService(MessageBrokerService.class)) - .withScheduledExecutorService(container.getScheduledExecutor()) - .withTimerService(container.getService(TimerService.class)) - .build(); - - gopacsHandlerFactory = new GOPACSHandler.Factory(container); - gopacsRedispatchHandlerFactory = new GOPACSRedispatchHandler.Factory(container); - } - - @Override - public void start(Container container) throws Exception { - // Add service - services.getMessageBrokerService().getContext().addRoutes(this); - - // Find all energy optimisation assets - List energyOptimisationAssets = services.getAssetStorageService() - .findAll(new AssetQuery().types(EmsEnergyOptimisationAsset.class)) - .stream() - .map(asset -> (EmsEnergyOptimisationAsset) asset) - .toList(); - - // Start optimisation for enabled energy optimisation assets - if (!energyOptimisationAssets.isEmpty()) { - List enabledEnergyOptimisationAssetIds = energyOptimisationAssets - .stream() - .filter(energyOptimisationAsset -> services.getGatewayService().getLocallyRegisteredGatewayId(energyOptimisationAsset.getId(), null) == null) - .filter(energyOptimisationAsset -> !energyOptimisationAsset.getOptimisationDisabled().orElse(false)) - .map(Asset::getId) - .toList(); - - LOG.info(String.format("Number of enabled '%s' assets = %s", EmsEnergyOptimisationAsset.class.getSimpleName(), enabledEnergyOptimisationAssetIds.size())); - - enabledEnergyOptimisationAssetIds.forEach(this::startOptimisation); - } - - // Start GOPACS handler for all GOPACS assets - services.getAssetStorageService() - .findAll(new AssetQuery().types(EmsGOPACSAsset.class).attributeName(EmsGOPACSAsset.CONTRACTED_EAN.getName())) - .stream() - .map(asset -> (EmsGOPACSAsset) asset) - .forEach(gopacsAsset -> { - startGopacsHandler(gopacsAsset.getContractedEan().orElse(""), gopacsAsset.getRealm(), gopacsAsset.getId()); - - // Start redispatch handler if enabled - if (gopacsAsset.getRedispatchEnabled().orElse(false)) { - startRedispatchHandler(gopacsAsset.getContractedEan().orElse(""), gopacsAsset.getRealm(), gopacsAsset.getId()); - } - }); - - - // List of asset types that are part of the core EMS service - String[] assetTypes = { - EmsElectricityBatteryAsset.DESCRIPTOR.getName(), - EmsEnergyOptimisationAsset.DESCRIPTOR.getName(), - EmsGOPACSAsset.DESCRIPTOR.getName() - }; - - // Listen to attribute events of listed asset types - services.getClientEventService().addSubscription( - AttributeEvent.class, - new AssetFilter().setAssetTypes(assetTypes), - this::processAttributeEvent); + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, EmsOptimisationService.class.getName()); + protected Services services; + + protected GOPACSHandler.Factory gopacsHandlerFactory; + protected GOPACSRedispatchHandler.Factory gopacsRedispatchHandlerFactory; + + private final Map> energyOptimisationAssetsMap = + new ConcurrentHashMap<>(); + private final Map energyOptimisationTimersMap = new HashMap<>(); + private final Map gopacsHandlerMap = new HashMap<>(); + private final Map gopacsRedispatchHandlerMap = new HashMap<>(); + + @SuppressWarnings("unchecked") + @Override + public void configure() throws Exception { + from(PERSISTENCE_TOPIC) + .routeId("Persistence-EmsEnergyOptimisation") + .filter(isPersistenceEventForEntityType(Asset.class)) + .filter(isNotForGateway(services.getGatewayService())) + .process(exchange -> processAssetChange(exchange.getIn().getBody(PersistenceEvent.class))); + } + + @Override + public void init(Container container) throws Exception { + services = + Services.builder() + .withAssetDatapointService(container.getService(AssetDatapointService.class)) + .withAssetPredictedDatapointService( + container.getService(AssetPredictedDatapointService.class)) + .withAssetProcessingService(container.getService(AssetProcessingService.class)) + .withAssetStorageService(container.getService(AssetStorageService.class)) + .withClientEventService(container.getService(ClientEventService.class)) + .withGatewayService(container.getService(GatewayService.class)) + .withMessageBrokerService(container.getService(MessageBrokerService.class)) + .withScheduledExecutorService(container.getScheduledExecutor()) + .withTimerService(container.getService(TimerService.class)) + .build(); + + gopacsHandlerFactory = new GOPACSHandler.Factory(container); + gopacsRedispatchHandlerFactory = new GOPACSRedispatchHandler.Factory(container); + } + + @Override + public void start(Container container) throws Exception { + // Add service + services.getMessageBrokerService().getContext().addRoutes(this); + + // Find all energy optimisation assets + List energyOptimisationAssets = + services + .getAssetStorageService() + .findAll(new AssetQuery().types(EmsEnergyOptimisationAsset.class)) + .stream() + .map(asset -> (EmsEnergyOptimisationAsset) asset) + .toList(); + + // Start optimisation for enabled energy optimisation assets + if (!energyOptimisationAssets.isEmpty()) { + List enabledEnergyOptimisationAssetIds = + energyOptimisationAssets.stream() + .filter( + energyOptimisationAsset -> + services + .getGatewayService() + .getLocallyRegisteredGatewayId(energyOptimisationAsset.getId(), null) + == null) + .filter( + energyOptimisationAsset -> + !energyOptimisationAsset.getOptimisationDisabled().orElse(false)) + .map(Asset::getId) + .toList(); + + LOG.info( + String.format( + "Number of enabled '%s' assets = %s", + EmsEnergyOptimisationAsset.class.getSimpleName(), + enabledEnergyOptimisationAssetIds.size())); + + enabledEnergyOptimisationAssetIds.forEach(this::startOptimisation); } - @Override - public void stop(Container container) throws Exception { - gopacsRedispatchHandlerMap.forEach((ean, handler) -> handler.stopPolling()); - gopacsRedispatchHandlerMap.clear(); - energyOptimisationAssetsMap.forEach((assetId, scheduledFuture) -> stopOptimisation(assetId)); - energyOptimisationTimersMap.clear(); - } + // Start GOPACS handler for all GOPACS assets + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .types(EmsGOPACSAsset.class) + .attributeName(EmsGOPACSAsset.CONTRACTED_EAN.getName())) + .stream() + .map(asset -> (EmsGOPACSAsset) asset) + .forEach( + gopacsAsset -> { + startGopacsHandler( + gopacsAsset.getContractedEan().orElse(""), + gopacsAsset.getRealm(), + gopacsAsset.getId()); + + // Start redispatch handler if enabled + if (gopacsAsset.getRedispatchEnabled().orElse(false)) { + startRedispatchHandler( + gopacsAsset.getContractedEan().orElse(""), + gopacsAsset.getRealm(), + gopacsAsset.getId()); + } + }); - private void startOptimisation(String assetId) { - final Runnable command = () -> { - try { - runOptimisation(assetId); - } catch (Exception e) { - LOG.severe(String.format("assetType='%s', assetId='%s'; Failed to run energy optimisation; Exception: %s", EmsEnergyOptimisationAsset.class.getSimpleName(), assetId, e)); - } + // List of asset types that are part of the core EMS service + String[] assetTypes = { + EmsElectricityBatteryAsset.DESCRIPTOR.getName(), + EmsEnergyOptimisationAsset.DESCRIPTOR.getName(), + EmsGOPACSAsset.DESCRIPTOR.getName() + }; + + // Listen to attribute events of listed asset types + services + .getClientEventService() + .addSubscription( + AttributeEvent.class, + new AssetFilter().setAssetTypes(assetTypes), + this::processAttributeEvent); + } + + @Override + public void stop(Container container) throws Exception { + gopacsRedispatchHandlerMap.forEach((ean, handler) -> handler.stopPolling()); + gopacsRedispatchHandlerMap.clear(); + energyOptimisationAssetsMap.forEach((assetId, scheduledFuture) -> stopOptimisation(assetId)); + energyOptimisationTimersMap.clear(); + } + + private void startOptimisation(String assetId) { + final Runnable command = + () -> { + try { + runOptimisation(assetId); + } catch (Exception e) { + LOG.severe( + String.format( + "assetType='%s', assetId='%s'; Failed to run energy optimisation; Exception: %s", + EmsEnergyOptimisationAsset.class.getSimpleName(), assetId, e)); + } }; - ScheduledFuture scheduledFuture = services.getScheduledExecutorService().scheduleAtFixedRate(command, 1, 1, TimeUnit.MINUTES); - energyOptimisationAssetsMap.put(assetId, scheduledFuture); + ScheduledFuture scheduledFuture = + services.getScheduledExecutorService().scheduleAtFixedRate(command, 1, 1, TimeUnit.MINUTES); + energyOptimisationAssetsMap.put(assetId, scheduledFuture); - energyOptimisationTimersMap.put(assetId, 0L); - } + energyOptimisationTimersMap.put(assetId, 0L); + } - private void runOptimisation(String energyOptimisationAssetId) throws Exception { - // Get latest asset from database - EmsEnergyOptimisationAsset energyOptimisationAsset = (EmsEnergyOptimisationAsset) services.getAssetStorageService().find(energyOptimisationAssetId); + private void runOptimisation(String energyOptimisationAssetId) throws Exception { + // Get latest asset from database + EmsEnergyOptimisationAsset energyOptimisationAsset = + (EmsEnergyOptimisationAsset) + services.getAssetStorageService().find(energyOptimisationAssetId); - if (energyOptimisationAsset == null) { - return; - } + if (energyOptimisationAsset == null) { + return; + } - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - Long triggerTimeMillis = energyOptimisationTimersMap.get(energyOptimisationAssetId); - - // Update forecast attributes every 15 minutes - if (triggerTimeMillis != null && currentTimeMillis > triggerTimeMillis) { - // Convert milliseconds to date - ZoneId zone = ZoneId.systemDefault(); - LocalDate previousDate = Instant.ofEpochMilli(triggerTimeMillis - 60000).atZone(zone).toLocalDate(); - LocalDate currentDate = Instant.ofEpochMilli(currentTimeMillis).atZone(zone).toLocalDate(); - - // Update manual forecasts after midnight - if (!currentDate.equals(previousDate)) { - updatePowerLimitProfileManualForecasts(energyOptimisationAsset); - } - - EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); - - // Update total forecasts - updatePowerLimitProfileTotalForecasts(energyOptimisationAsset, gopacsAsset); - - // Update energy optimisation asset attributes - String[] energyOptimisationAssetAttributeNames = new String[]{ - EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), - EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), - EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), - EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), - EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), - EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName() + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + Long triggerTimeMillis = energyOptimisationTimersMap.get(energyOptimisationAssetId); + + // Update forecast attributes every 15 minutes + if (triggerTimeMillis != null && currentTimeMillis > triggerTimeMillis) { + // Convert milliseconds to date + ZoneId zone = ZoneId.systemDefault(); + LocalDate previousDate = + Instant.ofEpochMilli(triggerTimeMillis - 60000).atZone(zone).toLocalDate(); + LocalDate currentDate = Instant.ofEpochMilli(currentTimeMillis).atZone(zone).toLocalDate(); + + // Update manual forecasts after midnight + if (!currentDate.equals(previousDate)) { + updatePowerLimitProfileManualForecasts(energyOptimisationAsset); + } + + EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); + + // Update total forecasts + updatePowerLimitProfileTotalForecasts(energyOptimisationAsset, gopacsAsset); + + // Update energy optimisation asset attributes + String[] energyOptimisationAssetAttributeNames = + new String[] { + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), + EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName() + }; + + updatePowerLimitProfileAttributes( + energyOptimisationAsset, energyOptimisationAssetAttributeNames); + + if (gopacsAsset != null) { + // Update GOPACS asset attributes + String[] gopacsAttributeNames = + new String[] { + EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), + EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName() }; - updatePowerLimitProfileAttributes(energyOptimisationAsset, energyOptimisationAssetAttributeNames); - - if (gopacsAsset != null) { - // Update GOPACS asset attributes - String[] gopacsAttributeNames = new String[]{ - EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), - EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName() - }; - - updatePowerLimitProfileAttributes(gopacsAsset, gopacsAttributeNames); - } - - // Calculate new trigger time - triggerTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60 * 1000) + (15 * 60 * 1000); - energyOptimisationTimersMap.put(energyOptimisationAssetId, triggerTimeMillis); - } + updatePowerLimitProfileAttributes(gopacsAsset, gopacsAttributeNames); + } - // Run selected optimisation method - String optimisationMethodName = energyOptimisationAsset.getOptimisationMethod().orElse(EmsEnergyOptimisationAsset.OptimisationMethodValueType.None).toString(); - OptimisationMethodsLoader optimisationMethodsLoader = new OptimisationMethodsLoader(); - optimisationMethodsLoader.runOptimisationMethod(optimisationMethodName, energyOptimisationAssetId, services); + // Calculate new trigger time + triggerTimeMillis = + currentTimeMillis - currentTimeMillis % (15 * 60 * 1000) + (15 * 60 * 1000); + energyOptimisationTimersMap.put(energyOptimisationAssetId, triggerTimeMillis); } - private void stopOptimisation(String assetId) { - ScheduledFuture scheduledFuture = energyOptimisationAssetsMap.remove(assetId); - energyOptimisationTimersMap.remove(assetId); - - if (scheduledFuture != null) { - scheduledFuture.cancel(false); - } - - services.getAssetPredictedDatapointService().purgeValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName()); - services.getAssetPredictedDatapointService().purgeValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName()); - services.getAssetPredictedDatapointService().purgeValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName()); - services.getAssetPredictedDatapointService().purgeValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName()); + // Run selected optimisation method + String optimisationMethodName = + energyOptimisationAsset + .getOptimisationMethod() + .orElse(EmsEnergyOptimisationAsset.OptimisationMethodValueType.None) + .toString(); + OptimisationMethodsLoader optimisationMethodsLoader = new OptimisationMethodsLoader(); + optimisationMethodsLoader.runOptimisationMethod( + optimisationMethodName, energyOptimisationAssetId, services); + } + + private void stopOptimisation(String assetId) { + ScheduledFuture scheduledFuture = energyOptimisationAssetsMap.remove(assetId); + energyOptimisationTimersMap.remove(assetId); + + if (scheduledFuture != null) { + scheduledFuture.cancel(false); } - private void startGopacsHandler(String contractedEan, String realm, String assetId) { - if (contractedEan.isBlank()) { - LOG.warning("Unable to deploy GOPACS because EAN is blank"); - return; - } - LOG.fine("Deploying GOPACS for EAN: " + contractedEan); - gopacsHandlerMap.put(contractedEan, gopacsHandlerFactory.createHandler( - contractedEan, - realm, - assetId) - ); - LOG.fine("Deployed GOPACS for EAN: " + contractedEan); - } - - private void stopGopacsHandler(String contractedEan) { - GOPACSHandler existing = gopacsHandlerMap.get(contractedEan); - if (existing != null) { - existing.undeploy(); - gopacsHandlerMap.remove(contractedEan); - } + services + .getAssetPredictedDatapointService() + .purgeValues( + assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName()); + services + .getAssetPredictedDatapointService() + .purgeValues( + assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName()); + services + .getAssetPredictedDatapointService() + .purgeValues( + assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName()); + services + .getAssetPredictedDatapointService() + .purgeValues( + assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName()); + } + + private void startGopacsHandler(String contractedEan, String realm, String assetId) { + if (contractedEan.isBlank()) { + LOG.warning("Unable to deploy GOPACS because EAN is blank"); + return; } - - private void startRedispatchHandler(String contractedEan, String realm, String assetId) { - if (contractedEan.isBlank()) { - LOG.warning("Unable to start redispatch handler because EAN is blank"); - return; - } - LOG.fine("Starting redispatch handler for EAN: " + contractedEan); - GOPACSRedispatchHandler handler = gopacsRedispatchHandlerFactory.createHandler(contractedEan, realm, assetId); - gopacsRedispatchHandlerMap.put(contractedEan, handler); - handler.startPolling(); - LOG.fine("Started redispatch handler for EAN: " + contractedEan); - } - - private void stopRedispatchHandler(String contractedEan) { - GOPACSRedispatchHandler existing = gopacsRedispatchHandlerMap.get(contractedEan); - if (existing != null) { - existing.stopPolling(); - gopacsRedispatchHandlerMap.remove(contractedEan); - } + LOG.fine("Deploying GOPACS for EAN: " + contractedEan); + gopacsHandlerMap.put( + contractedEan, gopacsHandlerFactory.createHandler(contractedEan, realm, assetId)); + LOG.fine("Deployed GOPACS for EAN: " + contractedEan); + } + + private void stopGopacsHandler(String contractedEan) { + GOPACSHandler existing = gopacsHandlerMap.get(contractedEan); + if (existing != null) { + existing.undeploy(); + gopacsHandlerMap.remove(contractedEan); } + } - protected void processAssetChange(PersistenceEvent persistenceEvent) { - if (persistenceEvent.getEntity() instanceof EmsEnergyOptimisationAsset emsEnergyOptimisationAsset) { - if (persistenceEvent.getCause() == PersistenceEvent.Cause.DELETE) { - stopOptimisation(emsEnergyOptimisationAsset.getId()); - } - } else if (persistenceEvent.getEntity() instanceof EmsGOPACSAsset emsGOPACSAsset) { - emsGOPACSAsset.getContractedEan().ifPresent(contractedEan -> { + private void startRedispatchHandler(String contractedEan, String realm, String assetId) { + if (contractedEan.isBlank()) { + LOG.warning("Unable to start redispatch handler because EAN is blank"); + return; + } + LOG.fine("Starting redispatch handler for EAN: " + contractedEan); + GOPACSRedispatchHandler handler = + gopacsRedispatchHandlerFactory.createHandler(contractedEan, realm, assetId); + gopacsRedispatchHandlerMap.put(contractedEan, handler); + handler.startPolling(); + LOG.fine("Started redispatch handler for EAN: " + contractedEan); + } + + private void stopRedispatchHandler(String contractedEan) { + GOPACSRedispatchHandler existing = gopacsRedispatchHandlerMap.get(contractedEan); + if (existing != null) { + existing.stopPolling(); + gopacsRedispatchHandlerMap.remove(contractedEan); + } + } + + protected void processAssetChange(PersistenceEvent persistenceEvent) { + if (persistenceEvent.getEntity() + instanceof EmsEnergyOptimisationAsset emsEnergyOptimisationAsset) { + if (persistenceEvent.getCause() == PersistenceEvent.Cause.DELETE) { + stopOptimisation(emsEnergyOptimisationAsset.getId()); + } + } else if (persistenceEvent.getEntity() instanceof EmsGOPACSAsset emsGOPACSAsset) { + emsGOPACSAsset + .getContractedEan() + .ifPresent( + contractedEan -> { if (persistenceEvent.getCause() == PersistenceEvent.Cause.DELETE) { - stopGopacsHandler(contractedEan); - stopRedispatchHandler(contractedEan); + stopGopacsHandler(contractedEan); + stopRedispatchHandler(contractedEan); } if (persistenceEvent.getCause() == PersistenceEvent.Cause.CREATE) { - startGopacsHandler(contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); - if (emsGOPACSAsset.getRedispatchEnabled().orElse(false)) { - startRedispatchHandler(contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); - } + startGopacsHandler( + contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); + if (emsGOPACSAsset.getRedispatchEnabled().orElse(false)) { + startRedispatchHandler( + contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); + } } if (persistenceEvent.getCause() == PersistenceEvent.Cause.UPDATE) { - stopGopacsHandler(contractedEan); - startGopacsHandler(contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); - // Redispatch handler is managed via attribute events (redispatchEnabled) + stopGopacsHandler(contractedEan); + startGopacsHandler( + contractedEan, emsGOPACSAsset.getRealm(), emsGOPACSAsset.getId()); + // Redispatch handler is managed via attribute events (redispatchEnabled) } - }); - } + }); } + } - private void processAttributeEvent(AttributeEvent attributeEvent) { - String assetType = attributeEvent.getAssetType(); + private void processAttributeEvent(AttributeEvent attributeEvent) { + String assetType = attributeEvent.getAssetType(); - if (assetType.equals(EmsEnergyOptimisationAsset.DESCRIPTOR.getName())) { - processAttributeEventEmsEnergyOptimisationAsset(attributeEvent); - return; - } - - if (assetType.equals(EmsGOPACSAsset.DESCRIPTOR.getName())) { - processAttributeEventEmsGOPACSAsset(attributeEvent); - return; - } + if (assetType.equals(EmsEnergyOptimisationAsset.DESCRIPTOR.getName())) { + processAttributeEventEmsEnergyOptimisationAsset(attributeEvent); + return; } - private void processAttributeEventEmsEnergyOptimisationAsset(AttributeEvent attributeEvent) { - String assetId = attributeEvent.getId(); - - // Get asset from database - EmsEnergyOptimisationAsset energyOptimisationAsset = (EmsEnergyOptimisationAsset) services.getAssetStorageService().find(assetId); - - // Check if asset exists - if (energyOptimisationAsset == null) { - return; - } - - String logPrefix = String.format("assetType='%s', assetId='%s', assetName='%s', attributeName='%s'", attributeEvent.getAssetType(), attributeEvent.getId(), attributeEvent.getAssetName(), attributeEvent.getName()); - String attributeName = attributeEvent.getName(); - - // Disable/enable optimisation service - if (attributeName.equals(EmsEnergyOptimisationAsset.DISABLE_OPTIMISATION_SERVICE.getName())) { - boolean disabled = (Boolean) attributeEvent.getValue().orElse(false); - - if (!disabled && !energyOptimisationAssetsMap.containsKey(assetId)) { - if (services.getGatewayService().getLocallyRegisteredGatewayId(assetId, null) == null) { - LOG.info(String.format("%s; Enabled energy optimisation service", logPrefix)); - startOptimisation(assetId); - } - } else if (disabled && energyOptimisationAssetsMap.containsKey(assetId)) { - stopOptimisation(assetId); - LOG.info(String.format("%s; Disabled energy optimisation service", logPrefix)); - } - return; - } - - // Generate power maximum profile manual input - if (attributeName.equals(EmsEnergyOptimisationAsset.GENERATE_POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())) { - boolean generatePowerLimitMaximumProfileManualInput = (Boolean) attributeEvent.getValue().orElse(false); - - if (!generatePowerLimitMaximumProfileManualInput) { - return; - } - - // Add 1-second delay before resetting checkbox for user-friendliness - services.getScheduledExecutorService().schedule(() -> services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(assetId, attributeName, false), getClass().getSimpleName()), 1, TimeUnit.SECONDS); - - Double powerLimitMaximumInput = energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); - - if (powerLimitMaximumInput == null) { - LOG.warning(String.format("%s; '%s' attribute value is missing. Unable to generate power limit maximum profile", logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_INPUT.getName())); - return; - } - - String powerLimitMaximumProfileManualInput = energyOptimisationAsset.getPowerLimitMaximumProfileManualInput().orElse(""); - - if (!powerLimitMaximumProfileManualInput.isBlank()) { - LOG.warning(String.format("%s; '%s' attribute is already set. Remove current power limit maximum profile to generate a new power limit profile", logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())); - return; - } - - String powerLimitMaximumProfileCsv = generatePowerLimitProfile(powerLimitMaximumInput); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT, powerLimitMaximumProfileCsv), getClass().getSimpleName()); - } - - - // Generate power limit minimum profile input - if (attributeName.equals(EmsEnergyOptimisationAsset.GENERATE_POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())) { - boolean generatePowerLimitMinimumProfileManualInput = (Boolean) attributeEvent.getValue().orElse(false); - - if (!generatePowerLimitMinimumProfileManualInput) { - return; - } - - // Add 1-second delay before resetting checkbox for user-friendliness - services.getScheduledExecutorService().schedule(() -> services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(assetId, attributeName, false), getClass().getSimpleName()), 1, TimeUnit.SECONDS); - - Double powerLimitMinimumInput = energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); - - if (powerLimitMinimumInput == null) { - LOG.warning(String.format("%s; '%s' attribute value is missing. Unable to generate power limit minimum profile", logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_INPUT.getName())); - return; - } - - String powerLimitMinimumProfileManualInput = energyOptimisationAsset.getPowerLimitMinimumProfileManualInput().orElse(""); - - if (!powerLimitMinimumProfileManualInput.isBlank()) { - LOG.warning(String.format("%s; '%s' attribute is already set. Remove current power limit minimum profile to generate a new power limit profile", logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())); - return; - } - - String powerLimitMinimumProfileCsv = generatePowerLimitProfile(powerLimitMinimumInput); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT, powerLimitMinimumProfileCsv), getClass().getSimpleName()); - } - - - // Update power limit maximum profile manual - if (attributeName.equals(EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())) { - if (!energyOptimisationAssetsMap.containsKey(assetId)) { - LOG.warning(String.format("%s; Optimisation is disabled. The manual power limit profile has been updated but has not been loaded into the forecast database.", logPrefix)); - return; - } - - String powerLimitMaximumProfileManualInput = (String) attributeEvent.getValue().orElse(""); - - if (powerLimitMaximumProfileManualInput.isBlank()) { - return; - } - - // Parse CSV - List parsedCSV = parseCSV(powerLimitMaximumProfileManualInput, ",", logPrefix); - - // Convert parsed CSV to database insertable data-points - List> powerLimitMaximumProfileManual = csvToValueDatapoints(parsedCSV, logPrefix); - services.getAssetPredictedDatapointService().updateValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), powerLimitMaximumProfileManual); - - List>> powerLimitProfiles = new ArrayList<>(); - powerLimitProfiles.add(powerLimitMaximumProfileManual); + if (assetType.equals(EmsGOPACSAsset.DESCRIPTOR.getName())) { + processAttributeEventEmsGOPACSAsset(attributeEvent); + return; + } + } - EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); + private void processAttributeEventEmsEnergyOptimisationAsset(AttributeEvent attributeEvent) { + String assetId = attributeEvent.getId(); - if (gopacsAsset != null) { - // Forecast data-point range of 1 week - long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long endTimeMillis = startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + // Get asset from database + EmsEnergyOptimisationAsset energyOptimisationAsset = + (EmsEnergyOptimisationAsset) services.getAssetStorageService().find(assetId); - // Get power limit profile day-ahead - List> powerLimitMaximumProfileDayAhead = services.getAssetPredictedDatapointService().queryDatapoints(gopacsAsset.getId(), EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), assetDatapointQuery); - powerLimitProfiles.add(powerLimitMaximumProfileDayAhead); - } + // Check if asset exists + if (energyOptimisationAsset == null) { + return; + } - // Update power limit maximum profile total - List> powerLimitMaximumProfileTotal = calculatePowerLimitProfileTotal(powerLimitProfiles, "floor"); - services.getAssetPredictedDatapointService().updateValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), powerLimitMaximumProfileTotal); + String logPrefix = + String.format( + "assetType='%s', assetId='%s', assetName='%s', attributeName='%s'", + attributeEvent.getAssetType(), + attributeEvent.getId(), + attributeEvent.getAssetName(), + attributeEvent.getName()); + String attributeName = attributeEvent.getName(); + + // Disable/enable optimisation service + if (attributeName.equals(EmsEnergyOptimisationAsset.DISABLE_OPTIMISATION_SERVICE.getName())) { + boolean disabled = (Boolean) attributeEvent.getValue().orElse(false); + + if (!disabled && !energyOptimisationAssetsMap.containsKey(assetId)) { + if (services.getGatewayService().getLocallyRegisteredGatewayId(assetId, null) == null) { + LOG.info(String.format("%s; Enabled energy optimisation service", logPrefix)); + startOptimisation(assetId); } + } else if (disabled && energyOptimisationAssetsMap.containsKey(assetId)) { + stopOptimisation(assetId); + LOG.info(String.format("%s; Disabled energy optimisation service", logPrefix)); + } + return; + } + // Generate power maximum profile manual input + if (attributeName.equals( + EmsEnergyOptimisationAsset.GENERATE_POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())) { + boolean generatePowerLimitMaximumProfileManualInput = + (Boolean) attributeEvent.getValue().orElse(false); + + if (!generatePowerLimitMaximumProfileManualInput) { + return; + } + + // Add 1-second delay before resetting checkbox for user-friendliness + services + .getScheduledExecutorService() + .schedule( + () -> + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent(assetId, attributeName, false), + getClass().getSimpleName()), + 1, + TimeUnit.SECONDS); + + Double powerLimitMaximumInput = + energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); + + if (powerLimitMaximumInput == null) { + LOG.warning( + String.format( + "%s; '%s' attribute value is missing. Unable to generate power limit maximum profile", + logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_INPUT.getName())); + return; + } + + String powerLimitMaximumProfileManualInput = + energyOptimisationAsset.getPowerLimitMaximumProfileManualInput().orElse(""); + + if (!powerLimitMaximumProfileManualInput.isBlank()) { + LOG.warning( + String.format( + "%s; '%s' attribute is already set. Remove current power limit maximum profile to generate a new power limit profile", + logPrefix, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())); + return; + } + + String powerLimitMaximumProfileCsv = generatePowerLimitProfile(powerLimitMaximumInput); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT, + powerLimitMaximumProfileCsv), + getClass().getSimpleName()); + } - // Update power limit minimum profile manual - if (attributeName.equals(EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())) { - if (!energyOptimisationAssetsMap.containsKey(assetId)) { - LOG.warning(String.format("%s; Optimisation is disabled. The manual power limit profile has been updated but has not been loaded into the forecast database.", logPrefix)); - return; - } - - String powerLimitMinimumProfileManualInput = (String) attributeEvent.getValue().orElse(""); - - if (powerLimitMinimumProfileManualInput.isBlank()) { - return; - } - - // Parse CSV - List parsedCSV = parseCSV(powerLimitMinimumProfileManualInput, ",", logPrefix); - - // Convert parsed CSV to database insertable data-points - List> powerLimitMinimumProfileManual = csvToValueDatapoints(parsedCSV, logPrefix); - services.getAssetPredictedDatapointService().updateValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), powerLimitMinimumProfileManual); - - List>> powerLimitProfiles = new ArrayList<>(); - powerLimitProfiles.add(powerLimitMinimumProfileManual); - - EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); - - if (gopacsAsset != null) { - // Forecast data-point range of 1 week - long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long endTimeMillis = startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - - // Get power limit profile day-ahead - List> powerLimitMinimumProfileDayAhead = services.getAssetPredictedDatapointService().queryDatapoints(gopacsAsset.getId(), EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), assetDatapointQuery); - powerLimitProfiles.add(powerLimitMinimumProfileDayAhead); - } - - // Update power limit minimum profile total - List> powerLimitMinimumProfileTotal = calculatePowerLimitProfileTotal(powerLimitProfiles, "ceil"); - services.getAssetPredictedDatapointService().updateValues(assetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), powerLimitMinimumProfileTotal); - } + // Generate power limit minimum profile input + if (attributeName.equals( + EmsEnergyOptimisationAsset.GENERATE_POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())) { + boolean generatePowerLimitMinimumProfileManualInput = + (Boolean) attributeEvent.getValue().orElse(false); + + if (!generatePowerLimitMinimumProfileManualInput) { + return; + } + + // Add 1-second delay before resetting checkbox for user-friendliness + services + .getScheduledExecutorService() + .schedule( + () -> + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent(assetId, attributeName, false), + getClass().getSimpleName()), + 1, + TimeUnit.SECONDS); + + Double powerLimitMinimumInput = + energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); + + if (powerLimitMinimumInput == null) { + LOG.warning( + String.format( + "%s; '%s' attribute value is missing. Unable to generate power limit minimum profile", + logPrefix, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_INPUT.getName())); + return; + } + + String powerLimitMinimumProfileManualInput = + energyOptimisationAsset.getPowerLimitMinimumProfileManualInput().orElse(""); + + if (!powerLimitMinimumProfileManualInput.isBlank()) { + LOG.warning( + String.format( + "%s; '%s' attribute is already set. Remove current power limit minimum profile to generate a new power limit profile", + logPrefix, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())); + return; + } + + String powerLimitMinimumProfileCsv = generatePowerLimitProfile(powerLimitMinimumInput); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT, + powerLimitMinimumProfileCsv), + getClass().getSimpleName()); + } + // Update power limit maximum profile manual + if (attributeName.equals( + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL_INPUT.getName())) { + if (!energyOptimisationAssetsMap.containsKey(assetId)) { + LOG.warning( + String.format( + "%s; Optimisation is disabled. The manual power limit profile has been updated but has not been loaded into the forecast database.", + logPrefix)); + return; + } + + String powerLimitMaximumProfileManualInput = (String) attributeEvent.getValue().orElse(""); + + if (powerLimitMaximumProfileManualInput.isBlank()) { + return; + } + + // Parse CSV + List parsedCSV = parseCSV(powerLimitMaximumProfileManualInput, ",", logPrefix); + + // Convert parsed CSV to database insertable data-points + List> powerLimitMaximumProfileManual = + csvToValueDatapoints(parsedCSV, logPrefix); + services + .getAssetPredictedDatapointService() + .updateValues( + assetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), + powerLimitMaximumProfileManual); + + List>> powerLimitProfiles = new ArrayList<>(); + powerLimitProfiles.add(powerLimitMaximumProfileManual); + + EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); + + if (gopacsAsset != null) { + // Forecast data-point range of 1 week + long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long endTimeMillis = + startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + // Get power limit profile day-ahead + List> powerLimitMaximumProfileDayAhead = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + gopacsAsset.getId(), + EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), + assetDatapointQuery); + powerLimitProfiles.add(powerLimitMaximumProfileDayAhead); + } + + // Update power limit maximum profile total + List> powerLimitMaximumProfileTotal = + calculatePowerLimitProfileTotal(powerLimitProfiles, "floor"); + services + .getAssetPredictedDatapointService() + .updateValues( + assetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + powerLimitMaximumProfileTotal); + } - // Run selected optimisation method - if (attributeName.equals(EmsEnergyOptimisationAsset.OPTIMISATION_METHOD.getName())) { - if (energyOptimisationAssetsMap.containsKey(assetId)) { - // Reset advanced settings attributes field - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.ADVANCED_SETTINGS_ATTRIBUTES, null), getClass().getSimpleName()); + // Update power limit minimum profile manual + if (attributeName.equals( + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL_INPUT.getName())) { + if (!energyOptimisationAssetsMap.containsKey(assetId)) { + LOG.warning( + String.format( + "%s; Optimisation is disabled. The manual power limit profile has been updated but has not been loaded into the forecast database.", + logPrefix)); + return; + } + + String powerLimitMinimumProfileManualInput = (String) attributeEvent.getValue().orElse(""); + + if (powerLimitMinimumProfileManualInput.isBlank()) { + return; + } + + // Parse CSV + List parsedCSV = parseCSV(powerLimitMinimumProfileManualInput, ",", logPrefix); + + // Convert parsed CSV to database insertable data-points + List> powerLimitMinimumProfileManual = + csvToValueDatapoints(parsedCSV, logPrefix); + services + .getAssetPredictedDatapointService() + .updateValues( + assetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), + powerLimitMinimumProfileManual); + + List>> powerLimitProfiles = new ArrayList<>(); + powerLimitProfiles.add(powerLimitMinimumProfileManual); + + EmsGOPACSAsset gopacsAsset = getGopacsAsset(energyOptimisationAsset); + + if (gopacsAsset != null) { + // Forecast data-point range of 1 week + long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long endTimeMillis = + startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + // Get power limit profile day-ahead + List> powerLimitMinimumProfileDayAhead = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + gopacsAsset.getId(), + EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), + assetDatapointQuery); + powerLimitProfiles.add(powerLimitMinimumProfileDayAhead); + } + + // Update power limit minimum profile total + List> powerLimitMinimumProfileTotal = + calculatePowerLimitProfileTotal(powerLimitProfiles, "ceil"); + services + .getAssetPredictedDatapointService() + .updateValues( + assetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + powerLimitMinimumProfileTotal); + } - String optimisationMethodName = attributeEvent.getValue().orElse(EmsEnergyOptimisationAsset.OptimisationMethodValueType.None).toString(); - OptimisationMethodsLoader optimisationMethodsLoader = new OptimisationMethodsLoader(); - services.getScheduledExecutorService().schedule(() -> optimisationMethodsLoader.runOptimisationMethod(optimisationMethodName, assetId, services), 1, TimeUnit.SECONDS); - } - } + // Run selected optimisation method + if (attributeName.equals(EmsEnergyOptimisationAsset.OPTIMISATION_METHOD.getName())) { + if (energyOptimisationAssetsMap.containsKey(assetId)) { + // Reset advanced settings attributes field + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.ADVANCED_SETTINGS_ATTRIBUTES, + null), + getClass().getSimpleName()); + + String optimisationMethodName = + attributeEvent + .getValue() + .orElse(EmsEnergyOptimisationAsset.OptimisationMethodValueType.None) + .toString(); + OptimisationMethodsLoader optimisationMethodsLoader = new OptimisationMethodsLoader(); + services + .getScheduledExecutorService() + .schedule( + () -> + optimisationMethodsLoader.runOptimisationMethod( + optimisationMethodName, assetId, services), + 1, + TimeUnit.SECONDS); + } } + } - private void processAttributeEventEmsGOPACSAsset(AttributeEvent attributeEvent) { - String assetId = attributeEvent.getId(); + private void processAttributeEventEmsGOPACSAsset(AttributeEvent attributeEvent) { + String assetId = attributeEvent.getId(); - // Get asset from database - EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) services.getAssetStorageService().find(assetId); + // Get asset from database + EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) services.getAssetStorageService().find(assetId); - // Check if asset exists - if (gopacsAsset == null) { - return; - } + // Check if asset exists + if (gopacsAsset == null) { + return; + } - String attributeName = attributeEvent.getName(); + String attributeName = attributeEvent.getName(); - if (attributeName.equals(EmsGOPACSAsset.CONTRACTED_EAN.getName())) { - attributeEvent.getOldValue(String.class).ifPresent(oldEan -> { + if (attributeName.equals(EmsGOPACSAsset.CONTRACTED_EAN.getName())) { + attributeEvent + .getOldValue(String.class) + .ifPresent( + oldEan -> { stopGopacsHandler(oldEan); stopRedispatchHandler(oldEan); - }); - attributeEvent.getValue(String.class).ifPresent(contractedEan -> { - startGopacsHandler(contractedEan, attributeEvent.getRealm(), attributeEvent.getId()); + }); + attributeEvent + .getValue(String.class) + .ifPresent( + contractedEan -> { + startGopacsHandler( + contractedEan, attributeEvent.getRealm(), attributeEvent.getId()); if (gopacsAsset.getRedispatchEnabled().orElse(false)) { - startRedispatchHandler(contractedEan, attributeEvent.getRealm(), attributeEvent.getId()); + startRedispatchHandler( + contractedEan, attributeEvent.getRealm(), attributeEvent.getId()); } - }); - } + }); + } - // Handle redispatch enabled/disabled toggle - if (attributeName.equals(EmsGOPACSAsset.REDISPATCH_ENABLED.getName())) { - gopacsAsset.getContractedEan().ifPresent(contractedEan -> { + // Handle redispatch enabled/disabled toggle + if (attributeName.equals(EmsGOPACSAsset.REDISPATCH_ENABLED.getName())) { + gopacsAsset + .getContractedEan() + .ifPresent( + contractedEan -> { boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); if (enabled) { - stopRedispatchHandler(contractedEan); // Stop existing if any - startRedispatchHandler(contractedEan, gopacsAsset.getRealm(), gopacsAsset.getId()); + stopRedispatchHandler(contractedEan); // Stop existing if any + startRedispatchHandler( + contractedEan, gopacsAsset.getRealm(), gopacsAsset.getId()); } else { - stopRedispatchHandler(contractedEan); + stopRedispatchHandler(contractedEan); } - }); - } + }); + } - // Handle bid confirmation - if (attributeName.equals(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName())) { - boolean confirmed = (Boolean) attributeEvent.getValue().orElse(false); - if (confirmed) { - gopacsAsset.getContractedEan().ifPresent(contractedEan -> { - GOPACSRedispatchHandler handler = gopacsRedispatchHandlerMap.get(contractedEan); - if (handler != null) { - handler.handleConfirmation(); - } else { - LOG.warning("No redispatch handler running for EAN '" + contractedEan - + "' while processing bid confirmation for asset '" + gopacsAsset.getId() + "'"); - services.getAssetProcessingService().sendAttributeEvent( - new AttributeEvent(gopacsAsset.getId(), EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), false), - getClass().getSimpleName()); - } + // Handle bid confirmation + if (attributeName.equals(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName())) { + boolean confirmed = (Boolean) attributeEvent.getValue().orElse(false); + if (confirmed) { + gopacsAsset + .getContractedEan() + .ifPresent( + contractedEan -> { + GOPACSRedispatchHandler handler = gopacsRedispatchHandlerMap.get(contractedEan); + if (handler != null) { + handler.handleConfirmation(); + } else { + LOG.warning( + "No redispatch handler running for EAN '" + + contractedEan + + "' while processing bid confirmation for asset '" + + gopacsAsset.getId() + + "'"); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + gopacsAsset.getId(), + EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), + false), + getClass().getSimpleName()); + } }); - } - } + } } - - private void updatePowerLimitProfileManualForecasts(EmsEnergyOptimisationAsset energyOptimisationAsset) { - String logPrefix = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAsset.getId(), energyOptimisationAsset.getAssetName()); - String[] powerLimitTypes = {"maximum", "minimum"}; - - for (String powerLimitType : powerLimitTypes) { - String powerLimitProfileManualInput; - String powerLimitProfileManualAttributeName; - - if (powerLimitType.equals("maximum")) { - powerLimitProfileManualInput = energyOptimisationAsset.getPowerLimitMaximumProfileManualInput().orElse(""); - powerLimitProfileManualAttributeName = EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(); - } else { - powerLimitProfileManualInput = energyOptimisationAsset.getPowerLimitMinimumProfileManualInput().orElse(""); - powerLimitProfileManualAttributeName = EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(); - } - - if (powerLimitProfileManualInput.isBlank()) { - continue; - } - - // Parse CSV - List parsedCSV = parseCSV(powerLimitProfileManualInput, ",", logPrefix); - - // Convert parsed CSV to database insertable data-points - List> powerLimitProfileManual = csvToValueDatapoints(parsedCSV, logPrefix); - - // Update manual forecast - services.getAssetPredictedDatapointService().updateValues(energyOptimisationAsset.getId(), powerLimitProfileManualAttributeName, powerLimitProfileManual); - } + } + + private void updatePowerLimitProfileManualForecasts( + EmsEnergyOptimisationAsset energyOptimisationAsset) { + String logPrefix = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAsset.getId(), + energyOptimisationAsset.getAssetName()); + String[] powerLimitTypes = {"maximum", "minimum"}; + + for (String powerLimitType : powerLimitTypes) { + String powerLimitProfileManualInput; + String powerLimitProfileManualAttributeName; + + if (powerLimitType.equals("maximum")) { + powerLimitProfileManualInput = + energyOptimisationAsset.getPowerLimitMaximumProfileManualInput().orElse(""); + powerLimitProfileManualAttributeName = + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(); + } else { + powerLimitProfileManualInput = + energyOptimisationAsset.getPowerLimitMinimumProfileManualInput().orElse(""); + powerLimitProfileManualAttributeName = + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(); + } + + if (powerLimitProfileManualInput.isBlank()) { + continue; + } + + // Parse CSV + List parsedCSV = parseCSV(powerLimitProfileManualInput, ",", logPrefix); + + // Convert parsed CSV to database insertable data-points + List> powerLimitProfileManual = csvToValueDatapoints(parsedCSV, logPrefix); + + // Update manual forecast + services + .getAssetPredictedDatapointService() + .updateValues( + energyOptimisationAsset.getId(), + powerLimitProfileManualAttributeName, + powerLimitProfileManual); } - - private void updatePowerLimitProfileAttributes(Asset asset, String[] attributeNames) { - String assetId = asset.getId(); - - // Get forecast data-points for current 15 minute interval - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long startTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000); - long endTimeMillis = startTimeMillis + (15 * 60000); - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - - for (String attributeName : attributeNames) { - List> forecastDatapoints = services.getAssetPredictedDatapointService().queryDatapoints(assetId, attributeName, assetDatapointQuery); - - // Check if there are forecast data-points in the database - if (forecastDatapoints.isEmpty()) { - continue; - } - - // The last data-point in list is the first data-point in the 15-minute interval - ValueDatapoint forecastDatapoint = forecastDatapoints.getLast(); - long forecastAttributeMillis = asset.getAttributes().get(attributeName).flatMap(Attribute::getTimestamp).orElse(0L); - - // Update attribute with new forecast value - if (forecastDatapoint.getTimestamp() > forecastAttributeMillis && forecastDatapoint.getTimestamp() <= currentTimeMillis) { - Double powerLimit = (Double) forecastDatapoint.getValue(); - long timestampMillis = forecastDatapoint.getTimestamp(); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(assetId, attributeName, powerLimit, timestampMillis)); - } - } + } + + private void updatePowerLimitProfileAttributes(Asset asset, String[] attributeNames) { + String assetId = asset.getId(); + + // Get forecast data-points for current 15 minute interval + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long startTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000); + long endTimeMillis = startTimeMillis + (15 * 60000); + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + for (String attributeName : attributeNames) { + List> forecastDatapoints = + services + .getAssetPredictedDatapointService() + .queryDatapoints(assetId, attributeName, assetDatapointQuery); + + // Check if there are forecast data-points in the database + if (forecastDatapoints.isEmpty()) { + continue; + } + + // The last data-point in list is the first data-point in the 15-minute interval + ValueDatapoint forecastDatapoint = forecastDatapoints.getLast(); + long forecastAttributeMillis = + asset.getAttributes().get(attributeName).flatMap(Attribute::getTimestamp).orElse(0L); + + // Update attribute with new forecast value + if (forecastDatapoint.getTimestamp() > forecastAttributeMillis + && forecastDatapoint.getTimestamp() <= currentTimeMillis) { + Double powerLimit = (Double) forecastDatapoint.getValue(); + long timestampMillis = forecastDatapoint.getTimestamp(); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent(assetId, attributeName, powerLimit, timestampMillis)); + } + } + } + + private void updatePowerLimitProfileTotalForecasts( + EmsEnergyOptimisationAsset energyOptimisationAsset, EmsGOPACSAsset gopacsAsset) { + String energyOptimisationAssetId = energyOptimisationAsset.getId(); + + // Forecast data-point range of 1 week + long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long endTimeMillis = + startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + // Get power limit profiles + List> powerLimitMaximumProfileManual = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), + assetDatapointQuery); + List> powerLimitMinimumProfileManual = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), + assetDatapointQuery); + + List> powerLimitMaximumProfileTotal; + List> powerLimitMinimumProfileTotal; + + if (gopacsAsset != null) { + List> powerLimitMaximumProfileDayAhead = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + gopacsAsset.getId(), + EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), + assetDatapointQuery); + List> powerLimitMinimumProfileDayAhead = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + gopacsAsset.getId(), + EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), + assetDatapointQuery); + + // Calculate power limit profile totals + List>> powerLimitMaximumProfiles = new ArrayList<>(); + powerLimitMaximumProfiles.add(powerLimitMaximumProfileDayAhead); + powerLimitMaximumProfiles.add(powerLimitMaximumProfileManual); + + List>> powerLimitMinimumProfiles = new ArrayList<>(); + powerLimitMinimumProfiles.add(powerLimitMinimumProfileDayAhead); + powerLimitMinimumProfiles.add(powerLimitMinimumProfileManual); + + powerLimitMaximumProfileTotal = + calculatePowerLimitProfileTotal(powerLimitMaximumProfiles, "floor"); + powerLimitMinimumProfileTotal = + calculatePowerLimitProfileTotal(powerLimitMinimumProfiles, "ceil"); + } else { + powerLimitMaximumProfileTotal = powerLimitMaximumProfileManual; + powerLimitMinimumProfileTotal = powerLimitMinimumProfileManual; } - private void updatePowerLimitProfileTotalForecasts(EmsEnergyOptimisationAsset energyOptimisationAsset, EmsGOPACSAsset gopacsAsset) { - String energyOptimisationAssetId = energyOptimisationAsset.getId(); - - // Forecast data-point range of 1 week - long startTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long endTimeMillis = startTimeMillis - startTimeMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - - // Get power limit profiles - List> powerLimitMaximumProfileManual = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_MANUAL.getName(), assetDatapointQuery); - List> powerLimitMinimumProfileManual = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_MANUAL.getName(), assetDatapointQuery); - - List> powerLimitMaximumProfileTotal; - List> powerLimitMinimumProfileTotal; - - if (gopacsAsset != null) { - List> powerLimitMaximumProfileDayAhead = services.getAssetPredictedDatapointService().queryDatapoints(gopacsAsset.getId(), EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), assetDatapointQuery); - List> powerLimitMinimumProfileDayAhead = services.getAssetPredictedDatapointService().queryDatapoints(gopacsAsset.getId(), EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), assetDatapointQuery); - - // Calculate power limit profile totals - List>> powerLimitMaximumProfiles = new ArrayList<>(); - powerLimitMaximumProfiles.add(powerLimitMaximumProfileDayAhead); - powerLimitMaximumProfiles.add(powerLimitMaximumProfileManual); - - List>> powerLimitMinimumProfiles = new ArrayList<>(); - powerLimitMinimumProfiles.add(powerLimitMinimumProfileDayAhead); - powerLimitMinimumProfiles.add(powerLimitMinimumProfileManual); - - powerLimitMaximumProfileTotal = calculatePowerLimitProfileTotal(powerLimitMaximumProfiles, "floor"); - powerLimitMinimumProfileTotal = calculatePowerLimitProfileTotal(powerLimitMinimumProfiles, "ceil"); - } else { - powerLimitMaximumProfileTotal = powerLimitMaximumProfileManual; - powerLimitMinimumProfileTotal = powerLimitMinimumProfileManual; - } - - // Update power limit profile totals - services.getAssetPredictedDatapointService().updateValues(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), powerLimitMaximumProfileTotal); - services.getAssetPredictedDatapointService().updateValues(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), powerLimitMinimumProfileTotal); + // Update power limit profile totals + services + .getAssetPredictedDatapointService() + .updateValues( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + powerLimitMaximumProfileTotal); + services + .getAssetPredictedDatapointService() + .updateValues( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + powerLimitMinimumProfileTotal); + } + + private EmsGOPACSAsset getGopacsAsset(EmsEnergyOptimisationAsset energyOptimisationAsset) { + EmsGOPACSAsset gopacsAsset = null; + String logPrefix = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAsset.getId(), + energyOptimisationAsset.getAssetName()); + + // Check for GOPACS assets + List gopacsAssets = + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .parents(energyOptimisationAsset.getId()) + .types(EmsGOPACSAsset.class)) + .stream() + .map(asset -> (EmsGOPACSAsset) asset) + .toList(); + + if (gopacsAssets.size() == 1) { + gopacsAsset = gopacsAssets.getFirst(); + } else if (gopacsAssets.size() > 1) { + LOG.warning( + String.format( + "%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", + logPrefix, + gopacsAssets.size(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName())); } - private EmsGOPACSAsset getGopacsAsset(EmsEnergyOptimisationAsset energyOptimisationAsset) { - EmsGOPACSAsset gopacsAsset = null; - String logPrefix = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAsset.getId(), energyOptimisationAsset.getAssetName()); + return gopacsAsset; + } - // Check for GOPACS assets - List gopacsAssets = services.getAssetStorageService() - .findAll(new AssetQuery().parents(energyOptimisationAsset.getId()).types(EmsGOPACSAsset.class)) - .stream() - .map(asset -> (EmsGOPACSAsset) asset) - .toList(); + private String generatePowerLimitProfile(double powerLimit) { + LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay(); + LocalDateTime endOfDay = startOfDay.plusDays(1); - if (gopacsAssets.size() == 1) { - gopacsAsset = gopacsAssets.getFirst(); - } else if (gopacsAssets.size() > 1) { - LOG.warning(String.format("%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", logPrefix, gopacsAssets.size(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName())); - } + List dailyIntervals = new ArrayList<>(); - return gopacsAsset; + // Generate 15-minute intervals for a day + for (LocalDateTime dateTime = startOfDay; + dateTime.isBefore(endOfDay); + dateTime = dateTime.plusMinutes(15)) { + String time = dateTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm")); + dailyIntervals.add(time); } - private String generatePowerLimitProfile(double powerLimit) { - LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay(); - LocalDateTime endOfDay = startOfDay.plusDays(1); - - List dailyIntervals = new ArrayList<>(); + String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + StringBuilder powerLimitProfileCsv = new StringBuilder(); - // Generate 15-minute intervals for a day - for (LocalDateTime dateTime = startOfDay; dateTime.isBefore(endOfDay); dateTime = dateTime.plusMinutes(15)) { - String time = dateTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm")); - dailyIntervals.add(time); - } + // Generate power limit profile for a week + for (String day : days) { + for (String time : dailyIntervals) { + String powerLimitProfileEntry = String.format("%s %s,%s\n", day, time, powerLimit); + powerLimitProfileCsv.append(powerLimitProfileEntry); + } + } - String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; - StringBuilder powerLimitProfileCsv = new StringBuilder(); + return powerLimitProfileCsv.toString(); + } - // Generate power limit profile for a week - for (String day : days) { - for (String time : dailyIntervals) { - String powerLimitProfileEntry = String.format("%s %s,%s\n", day, time, powerLimit); - powerLimitProfileCsv.append(powerLimitProfileEntry); - } - } + private List parseCSV(String csvFile, String delimiter, String logPrefix) { + List data = new ArrayList<>(); - return powerLimitProfileCsv.toString(); - } + BufferedReader reader = null; - private List parseCSV(String csvFile, String delimiter, String logPrefix) { - List data = new ArrayList<>(); + try { + reader = new BufferedReader(new StringReader(csvFile)); + String line; + while ((line = reader.readLine()) != null) { + // Split data based on delimiter + String[] row = line.split(delimiter + "(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1); - BufferedReader reader = null; + // Handle escape character "double quotes" + for (int i = 0; i < row.length; i++) { + row[i] = row[i].replaceFirst("\"", ""); - try { - reader = new BufferedReader(new StringReader(csvFile)); - String line; - while ((line = reader.readLine()) != null) { - // Split data based on delimiter - String[] row = line.split(delimiter + "(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1); - - // Handle escape character "double quotes" - for (int i = 0; i < row.length; i++) { - row[i] = row[i].replaceFirst("\"", ""); - - if (row[i].endsWith("\"")) { - row[i] = row[i].substring(0, row[i].length() - 1); - } - row[i] = row[i].replace("\"\"", "\""); - } - - data.add(row); - } - } catch (IOException e) { - LOG.warning(String.format("%s; Error while parsing CSV file; Exception: %s", logPrefix, e)); - } finally { - try { - assert reader != null; - reader.close(); - } catch (IOException e) { - LOG.warning(String.format("%s; Error while closing CSV file reader; Exception: %s", logPrefix, e)); - } + if (row[i].endsWith("\"")) { + row[i] = row[i].substring(0, row[i].length() - 1); + } + row[i] = row[i].replace("\"\"", "\""); } - return data; + data.add(row); + } + } catch (IOException e) { + LOG.warning(String.format("%s; Error while parsing CSV file; Exception: %s", logPrefix, e)); + } finally { + try { + assert reader != null; + reader.close(); + } catch (IOException e) { + LOG.warning( + String.format("%s; Error while closing CSV file reader; Exception: %s", logPrefix, e)); + } } - private List> csvToValueDatapoints(List parsedCSV, String logPrefix) { - List> valueDatapointList = new ArrayList<>(); - - // Get dates for the coming 7 days starting from today - Map dayToDateMap = weekDates(); - - List incorrectlyFormattedRows = new ArrayList<>(); - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - long currentMillis = System.currentTimeMillis(); + return data; + } - for (String[] line : parsedCSV) { - int rowLength = line.length; + private List> csvToValueDatapoints(List parsedCSV, String logPrefix) { + List> valueDatapointList = new ArrayList<>(); - if (rowLength != 2) { - incorrectlyFormattedRows.add(Arrays.toString(line)); - continue; - } + // Get dates for the coming 7 days starting from today + Map dayToDateMap = weekDates(); - String dayTimeStr = line[0]; - String valueStr = line[1]; + List incorrectlyFormattedRows = new ArrayList<>(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + long currentMillis = System.currentTimeMillis(); - String dayAbbreviation = dayTimeStr.split(" ")[0]; - String dateStr = dayToDateMap.get(dayAbbreviation); - LocalDate today = LocalDate.now(); + for (String[] line : parsedCSV) { + int rowLength = line.length; - if (dateStr != null) { - // Replace the day in the input string with the date - String dateTimeStr = dayTimeStr.replaceFirst(dayAbbreviation, dateStr); + if (rowLength != 2) { + incorrectlyFormattedRows.add(Arrays.toString(line)); + continue; + } - try { - LocalDate timestampLocalDate = LocalDate.parse(dateTimeStr, dateTimeFormatter); - long timestampMillis = simpleDateFormat.parse(dateTimeStr).getTime(); - double value = Double.parseDouble(valueStr); + String dayTimeStr = line[0]; + String valueStr = line[1]; - // Add this day next week - if (today.equals(timestampLocalDate)) { - long timestampMillisPlusOneWeek = timestampMillis + 604800000L; - valueDatapointList.add((new ValueDatapoint<>(timestampMillisPlusOneWeek, value))); - } + String dayAbbreviation = dayTimeStr.split(" ")[0]; + String dateStr = dayToDateMap.get(dayAbbreviation); + LocalDate today = LocalDate.now(); - if (timestampMillis > currentMillis) { - valueDatapointList.add((new ValueDatapoint<>(timestampMillis, value))); - } - } catch (Exception e) { - incorrectlyFormattedRows.add(Arrays.toString(line)); - } + if (dateStr != null) { + // Replace the day in the input string with the date + String dateTimeStr = dayTimeStr.replaceFirst(dayAbbreviation, dateStr); - } else { - incorrectlyFormattedRows.add(Arrays.toString(line)); - } + try { + LocalDate timestampLocalDate = LocalDate.parse(dateTimeStr, dateTimeFormatter); + long timestampMillis = simpleDateFormat.parse(dateTimeStr).getTime(); + double value = Double.parseDouble(valueStr); + + // Add this day next week + if (today.equals(timestampLocalDate)) { + long timestampMillisPlusOneWeek = timestampMillis + 604800000L; + valueDatapointList.add((new ValueDatapoint<>(timestampMillisPlusOneWeek, value))); + } + + if (timestampMillis > currentMillis) { + valueDatapointList.add((new ValueDatapoint<>(timestampMillis, value))); + } + } catch (Exception e) { + incorrectlyFormattedRows.add(Arrays.toString(line)); } - if (incorrectlyFormattedRows.size() > 0) { - LOG.warning(String.format("%s; Input is incorrectly formatted at row %s;", logPrefix, incorrectlyFormattedRows)); - } + } else { + incorrectlyFormattedRows.add(Arrays.toString(line)); + } + } - return valueDatapointList; + if (incorrectlyFormattedRows.size() > 0) { + LOG.warning( + String.format( + "%s; Input is incorrectly formatted at row %s;", + logPrefix, incorrectlyFormattedRows)); } - private Map weekDates() { - String[] dayAbbreviations = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + return valueDatapointList; + } - // Map to match day abbreviations with DayOfWeek enum - Map dayMap = new HashMap<>(); - dayMap.put("Mon", DayOfWeek.MONDAY); - dayMap.put("Tue", DayOfWeek.TUESDAY); - dayMap.put("Wed", DayOfWeek.WEDNESDAY); - dayMap.put("Thu", DayOfWeek.THURSDAY); - dayMap.put("Fri", DayOfWeek.FRIDAY); - dayMap.put("Sat", DayOfWeek.SATURDAY); - dayMap.put("Sun", DayOfWeek.SUNDAY); + private Map weekDates() { + String[] dayAbbreviations = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; - LocalDate today = LocalDate.now(); - Map dayToDateMap = new HashMap<>(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // Map to match day abbreviations with DayOfWeek enum + Map dayMap = new HashMap<>(); + dayMap.put("Mon", DayOfWeek.MONDAY); + dayMap.put("Tue", DayOfWeek.TUESDAY); + dayMap.put("Wed", DayOfWeek.WEDNESDAY); + dayMap.put("Thu", DayOfWeek.THURSDAY); + dayMap.put("Fri", DayOfWeek.FRIDAY); + dayMap.put("Sat", DayOfWeek.SATURDAY); + dayMap.put("Sun", DayOfWeek.SUNDAY); - for (String dayAbbreviation : dayAbbreviations) { - // Get day of week for the day abbreviation - DayOfWeek dayOfWeek = dayMap.get(dayAbbreviation); + LocalDate today = LocalDate.now(); + Map dayToDateMap = new HashMap<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - // Get date of day of week for this week - LocalDate date = today.with(dayOfWeek); + for (String dayAbbreviation : dayAbbreviations) { + // Get day of week for the day abbreviation + DayOfWeek dayOfWeek = dayMap.get(dayAbbreviation); - // If the day is in the past for this week, add 7 days to move to next week - if (date.isBefore(today)) { - date = date.plusWeeks(1); - } + // Get date of day of week for this week + LocalDate date = today.with(dayOfWeek); - dayToDateMap.put(dayAbbreviation, date.format(formatter)); - } + // If the day is in the past for this week, add 7 days to move to next week + if (date.isBefore(today)) { + date = date.plusWeeks(1); + } - return dayToDateMap; + dayToDateMap.put(dayAbbreviation, date.format(formatter)); } - private List> calculatePowerLimitProfileTotal(List>> powerLimitProfiles, String floorOrCeil) { - List> powerLimitProfileTotal = new ArrayList<>(); - Map> mergedMap = new HashMap<>(); + return dayToDateMap; + } - for (List> powerLimitProfile : powerLimitProfiles) { - for (ValueDatapoint valueDatapoint : powerLimitProfile) { - long timestamp = valueDatapoint.getTimestamp(); - Double value = (Double) valueDatapoint.getValue(); - mergedMap.computeIfAbsent(timestamp, k -> new ArrayList<>()).add(value); - } - } + private List> calculatePowerLimitProfileTotal( + List>> powerLimitProfiles, String floorOrCeil) { + List> powerLimitProfileTotal = new ArrayList<>(); + Map> mergedMap = new HashMap<>(); - if (floorOrCeil.equals("floor")) { - mergedMap.forEach((timestamp, values) -> { - ValueDatapoint valueDatapoint = new ValueDatapoint<>(timestamp, Collections.min(values)); - powerLimitProfileTotal.add(valueDatapoint); - }); - } else if (floorOrCeil.equals("ceil")) { - mergedMap.forEach((timestamp, values) -> { - ValueDatapoint valueDatapoint = new ValueDatapoint<>(timestamp, Collections.max(values)); - powerLimitProfileTotal.add(valueDatapoint); - }); - } + for (List> powerLimitProfile : powerLimitProfiles) { + for (ValueDatapoint valueDatapoint : powerLimitProfile) { + long timestamp = valueDatapoint.getTimestamp(); + Double value = (Double) valueDatapoint.getValue(); + mergedMap.computeIfAbsent(timestamp, k -> new ArrayList<>()).add(value); + } + } - return powerLimitProfileTotal; + if (floorOrCeil.equals("floor")) { + mergedMap.forEach( + (timestamp, values) -> { + ValueDatapoint valueDatapoint = + new ValueDatapoint<>(timestamp, Collections.min(values)); + powerLimitProfileTotal.add(valueDatapoint); + }); + } else if (floorOrCeil.equals("ceil")) { + mergedMap.forEach( + (timestamp, values) -> { + ValueDatapoint valueDatapoint = + new ValueDatapoint<>(timestamp, Collections.max(values)); + powerLimitProfileTotal.add(valueDatapoint); + }); } -} \ No newline at end of file + + return powerLimitProfileTotal; + } +} diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationSetupService.java b/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationSetupService.java index d1bf9c2..72239b6 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationSetupService.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/EmsOptimisationSetupService.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,12 +12,26 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager; +import static org.openremote.model.rules.Ruleset.Lang.GROOVY; +import static org.openremote.model.syslog.SyslogCategory.DATA; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; import org.apache.commons.io.IOUtils; import org.openremote.container.persistence.PersistenceService; import org.openremote.container.timer.TimerService; @@ -47,384 +58,446 @@ import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; - -import static org.openremote.model.rules.Ruleset.Lang.GROOVY; -import static org.openremote.model.syslog.SyslogCategory.DATA; - public class EmsOptimisationSetupService implements ContainerService { - protected static final Logger LOG = SyslogCategory.getLogger(DATA, EmsOptimisationService.class.getName()); - - protected AssetProcessingService assetProcessingService; - protected AssetStorageService assetStorageService; - protected ClientEventService clientEventService; - private ConfigurationService configurationService; - protected DashboardStorageService dashboardStorageService; - protected PersistenceService persistenceService; - protected ScheduledExecutorService scheduledExecutorService; - protected TimerService timerService; - - @Override - public void init(Container container) throws Exception { - assetProcessingService = container.getService(AssetProcessingService.class); - assetStorageService = container.getService(AssetStorageService.class); - clientEventService = container.getService(ClientEventService.class); - configurationService = container.getService(ConfigurationService.class); - dashboardStorageService = container.getService(DashboardStorageService.class); - persistenceService = container.getService(PersistenceService.class); - scheduledExecutorService = container.getScheduledExecutor(); - timerService = container.getService(TimerService.class); + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, EmsOptimisationService.class.getName()); + + protected AssetProcessingService assetProcessingService; + protected AssetStorageService assetStorageService; + protected ClientEventService clientEventService; + private ConfigurationService configurationService; + protected DashboardStorageService dashboardStorageService; + protected PersistenceService persistenceService; + protected ScheduledExecutorService scheduledExecutorService; + protected TimerService timerService; + + @Override + public void init(Container container) throws Exception { + assetProcessingService = container.getService(AssetProcessingService.class); + assetStorageService = container.getService(AssetStorageService.class); + clientEventService = container.getService(ClientEventService.class); + configurationService = container.getService(ConfigurationService.class); + dashboardStorageService = container.getService(DashboardStorageService.class); + persistenceService = container.getService(PersistenceService.class); + scheduledExecutorService = container.getScheduledExecutor(); + timerService = container.getService(TimerService.class); + } + + @Override + public void start(Container container) throws Exception { + // List of asset types that are part of this service + String[] assetTypes = {EmsEnergyOptimisationSetupAsset.DESCRIPTOR.getName()}; + + // Listen to attribute events of listed asset types + clientEventService.addSubscription( + AttributeEvent.class, + new AssetFilter().setAssetTypes(assetTypes), + this::processAttributeEvent); + } + + @Override + public void stop(Container container) throws Exception {} + + private void processAttributeEvent(AttributeEvent attributeEvent) { + String assetType = attributeEvent.getAssetType(); + + if (assetType.equals(EmsEnergyOptimisationSetupAsset.DESCRIPTOR.getName())) { + processAttributeEventEnergyOptimisationSetupAsset(attributeEvent); } - - @Override - public void start(Container container) throws Exception { - // List of asset types that are part of this service - String[] assetTypes = { - EmsEnergyOptimisationSetupAsset.DESCRIPTOR.getName() - }; - - // Listen to attribute events of listed asset types - clientEventService.addSubscription( - AttributeEvent.class, - new AssetFilter().setAssetTypes(assetTypes), - this::processAttributeEvent); + } + + private void processAttributeEventEnergyOptimisationSetupAsset(AttributeEvent attributeEvent) { + String attributeName = attributeEvent.getName(); + String assetId = attributeEvent.getId(); + + if (attributeName.equals( + EmsEnergyOptimisationSetupAsset.CREATE_ENERGY_MANAGEMENT_SYSTEM.getName())) { + boolean checkboxValue = (Boolean) attributeEvent.getValue().orElse(false); + + // Get asset from database + EmsEnergyOptimisationSetupAsset setupAsset = + (EmsEnergyOptimisationSetupAsset) assetStorageService.find(assetId); + + if (setupAsset == null || !checkboxValue) { + return; + } + + // Add a 1-second delay before resetting checkbox for user-friendliness + scheduledExecutorService.schedule( + () -> + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + setupAsset.getId(), + EmsEnergyOptimisationSetupAsset.CREATE_ENERGY_MANAGEMENT_SYSTEM, + false), + getClass().getSimpleName()), + 1, + TimeUnit.SECONDS); + + try { + updateManagerConfig(); + String infoFieldMessage = createEnergyManagementSystem(setupAsset); + + // Add a 1-second delay to ensure the info field is updated after all assets and rules are + // merged + scheduledExecutorService.schedule( + () -> + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + setupAsset.getId(), + EmsEnergyOptimisationSetupAsset.INFO_FIELD, + infoFieldMessage), + getClass().getSimpleName()), + 1, + TimeUnit.SECONDS); + } catch (Exception e) { + LOG.warning( + String.format( + "assetName='%s', assetId='%s'; An exception occurred during energy management system creation; Exception: %s", + setupAsset.getName(), setupAsset.getId(), e)); + } } + } - @Override - public void stop(Container container) throws Exception { - } + @SuppressWarnings("unchecked") + private void updateManagerConfig() { + ManagerAppConfig managerConfig = configurationService.getManagerConfig(); - private void processAttributeEvent(AttributeEvent attributeEvent) { - String assetType = attributeEvent.getAssetType(); + Map pages = managerConfig.getPages(); + if (pages == null) { + pages = new HashMap<>(); + managerConfig.setPages(pages); + } - if (assetType.equals(EmsEnergyOptimisationSetupAsset.DESCRIPTOR.getName())) { - processAttributeEventEnergyOptimisationSetupAsset(attributeEvent); - } + Map assets = + (Map) pages.computeIfAbsent("assets", k -> new HashMap<>()); + Map viewer = + (Map) assets.computeIfAbsent("viewer", k -> new HashMap<>()); + Map assetTypes = + (Map) viewer.computeIfAbsent("assetTypes", k -> new HashMap<>()); + + try { + assetTypes.putAll(getEmsAssetTypesConfig()); + configurationService.saveManagerConfig(managerConfig); + } catch (Exception e) { + LOG.warning(String.format("Failed to update EMS asset types config; Exception: %s", e)); } + } + + private Map getEmsAssetTypesConfig() { + String path = "/ems/config/asset-types.json"; + try (InputStream is = EmsOptimisationSetupService.class.getResourceAsStream(path)) { + if (is == null) { + throw new IllegalArgumentException("Resource not found: " + path); + } + + String json = new String(is.readAllBytes(), StandardCharsets.UTF_8); + ObjectMapper mapper = new ObjectMapper(); + return mapper.convertValue(mapper.readTree(json), new TypeReference<>() {}); + } catch (Exception e) { + throw new RuntimeException("Failed to read resource: " + path, e); + } + } - private void processAttributeEventEnergyOptimisationSetupAsset(AttributeEvent attributeEvent) { - String attributeName = attributeEvent.getName(); - String assetId = attributeEvent.getId(); + private String createEnergyManagementSystem(EmsEnergyOptimisationSetupAsset setupAsset) { + String energyManagementSystemName = setupAsset.getEnergyManagementSystemName().orElse(""); - if (attributeName.equals(EmsEnergyOptimisationSetupAsset.CREATE_ENERGY_MANAGEMENT_SYSTEM.getName())) { - boolean checkboxValue = (Boolean) attributeEvent.getValue().orElse(false); + // Initiate info field string + String infoFieldMessage; - // Get asset from database - EmsEnergyOptimisationSetupAsset setupAsset = (EmsEnergyOptimisationSetupAsset) assetStorageService.find(assetId); + // Check if energy management system name is provided + if (energyManagementSystemName.isBlank()) { + infoFieldMessage = + "Energy management system not created:\n" + " - Set energy management system name"; + return infoFieldMessage; + } - if (setupAsset == null || !checkboxValue) { - return; - } + String energyOptimisationAssetName = energyManagementSystemName + " Energy Optimisation"; + + // Check if energy management system already exists + List energyOptimisationAssets = + assetStorageService + .findAll( + new AssetQuery() + .types(EmsEnergyOptimisationAsset.class) + .names(energyOptimisationAssetName)) + .stream() + .map(asset -> (EmsEnergyOptimisationAsset) asset) + .toList(); + + if (!energyOptimisationAssets.isEmpty()) { + infoFieldMessage = + "Energy management system not created:\n" + + " - \"" + + energyOptimisationAssetName + + "\" asset already exists"; + return infoFieldMessage; + } + + // Create Energy Optimisation Asset + EmsEnergyOptimisationAsset energyOptimisationAsset = + new EmsEnergyOptimisationAsset(energyOptimisationAssetName); + energyOptimisationAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(setupAsset); + + double powerLimitMaximum = 500.0; + double powerLimitMinimum = -500.0; + double powerFluctuation = 40.0; + Double powerConsumption = 400.0; + + String powerLimitMaximumProfileCsv = generatePowerLimitProfile(powerLimitMaximum); + String powerLimitMinimumProfileCsv = generatePowerLimitProfile(powerLimitMinimum); + + energyOptimisationAsset + .setOptimisationMethod( + EmsEnergyOptimisationAsset.OptimisationMethodValueType.EmsOptimisation) + .setPowerLimitMaximumInput(powerLimitMaximum) + .setPowerLimitMaximumProfileManual(powerLimitMaximum) + .setPowerLimitMaximumProfileManualInput(powerLimitMaximumProfileCsv) + .setPowerLimitMaximumProfileTotal(powerLimitMaximum) + .setPowerLimitMinimumInput(powerLimitMinimum) + .setPowerLimitMinimumProfileManual(powerLimitMinimum) + .setPowerLimitMinimumProfileManualInput(powerLimitMinimumProfileCsv) + .setPowerLimitMinimumProfileTotal(powerLimitMinimum) + // .setPowerNet(powerConsumption) + ; + + energyOptimisationAsset.addOrReplaceAttributes( + new Attribute<>( + "powerLimitMaximumFluctuationMargin", ValueType.POSITIVE_NUMBER, powerFluctuation) + .addOrReplaceMeta( + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>( + MetaItemType.UNITS, + Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT))), + new Attribute<>( + "powerLimitMinimumFluctuationMargin", ValueType.POSITIVE_NUMBER, powerFluctuation) + .addOrReplaceMeta( + new MetaItem<>(MetaItemType.READ_ONLY), + new MetaItem<>( + MetaItemType.UNITS, + Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)))); + + assetStorageService.merge(energyOptimisationAsset); + + // Create Electricity Battery Asset + EmsElectricityBatteryAsset electricityBatteryAsset = + new EmsElectricityBatteryAsset(energyManagementSystemName + " Battery"); + electricityBatteryAsset + .setId(UniqueIdentifierGenerator.generateId()) + .setParent(energyOptimisationAsset); + + electricityBatteryAsset + .setAllowCharging(true) + .setAllowDischarging(true) + .setChargeEfficiency(100) + .setChargePowerMaximum(200.0) + .setDischargeEfficiency(100) + .setDischargePowerMaximum(-200.0) + .setEnergyCapacity(425.0) + .setEnergyLevelPercentage(50.0) + .setEnergyLevelPercentageMaximum(95) + .setEnergyLevelPercentageMinimum(20) + .setPower(0.0); + + assetStorageService.merge(electricityBatteryAsset); + + // Create Day Ahead Asset + if (setupAsset.getIncludeDayAheadForecasts().orElse(false)) { + EmsDayAheadAsset dayAheadAsset = + new EmsDayAheadAsset(energyManagementSystemName + " Day ahead forecasts"); + dayAheadAsset + .setId(UniqueIdentifierGenerator.generateId()) + .setParent(energyOptimisationAsset); + + dayAheadAsset.setCollectTimeForecasts("10:00").setUseTariffDayAheadForecasts(true); + + assetStorageService.merge(dayAheadAsset); + } - // Add a 1-second delay before resetting checkbox for user-friendliness - scheduledExecutorService.schedule(() -> assetProcessingService.sendAttributeEvent(new AttributeEvent(setupAsset.getId(), EmsEnergyOptimisationSetupAsset.CREATE_ENERGY_MANAGEMENT_SYSTEM, false), getClass().getSimpleName()), 1, TimeUnit.SECONDS); + // Create GOPACS Asset + if (setupAsset.getIncludeGopacs().orElse(false)) { + EmsGOPACSAsset gopacsAsset = new EmsGOPACSAsset(energyManagementSystemName + " GOPACS"); + gopacsAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(energyOptimisationAsset); - try { - updateManagerConfig(); - String infoFieldMessage = createEnergyManagementSystem(setupAsset); + assetStorageService.merge(gopacsAsset); + } - // Add a 1-second delay to ensure the info field is updated after all assets and rules are merged - scheduledExecutorService.schedule(() -> assetProcessingService.sendAttributeEvent(new AttributeEvent(setupAsset.getId(), EmsEnergyOptimisationSetupAsset.INFO_FIELD, infoFieldMessage), getClass().getSimpleName()), 1, TimeUnit.SECONDS); - } catch (Exception e) { - LOG.warning(String.format("assetName='%s', assetId='%s'; An exception occurred during energy management system creation; Exception: %s", setupAsset.getName(), setupAsset.getId(), e)); - } - } + // Setup rules + String realmName = setupAsset.getRealm(); + String energyOptimisationAssetId = energyOptimisationAsset.getId(); + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + + try (InputStream inputStream = + EmsOptimisationService.class.getResourceAsStream( + "/ems/rules/EmsDemoSimulationRules.groovy")) { + if (inputStream != null) { + String rulesName = energyManagementSystemName + ": Demo simulation rules"; + + String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + + // General variables rules + rules = rules.replaceFirst("setId1", energyOptimisationAssetId); + rules = rules.replaceFirst("setValue1", String.valueOf(powerConsumption)); + rules = rules.replaceFirst("setValue2", "1"); + rules = rules.replaceFirst("setValue3", String.valueOf(powerFluctuation)); + + // Link forecasts rule + rules = rules.replaceFirst("linkInputAssetId1", electricityBatteryAssetId); + rules = + rules.replaceFirst( + "linkInputAttributeName1", EmsElectricityBatteryAsset.POWER_SETPOINT.getName()); + rules = rules.replaceFirst("linkOutputAssetId1", energyOptimisationAssetId); + rules = + rules.replaceFirst( + "linkOutputAttributeName1", EmsEnergyOptimisationAsset.POWER_FLEXIBLE.getName()); + + // Sum forecasts rule + rules = rules.replaceFirst("sumInputAssetId1", energyOptimisationAssetId); + rules = + rules.replaceFirst( + "sumInputAttributeName1", EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName()); + rules = rules.replaceFirst("sumInputAssetId2", energyOptimisationAssetId); + rules = + rules.replaceFirst( + "sumInputAttributeName2", EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName()); + rules = rules.replaceFirst("sumInputAssetId3", energyOptimisationAssetId); + rules = + rules.replaceFirst( + "sumInputAttributeName3", EmsEnergyOptimisationAsset.POWER_FLEXIBLE.getName()); + rules = rules.replaceFirst("sumOutputAssetId", energyOptimisationAssetId); + rules = + rules.replaceFirst( + "sumOutputAttributeName", EmsEnergyOptimisationAsset.POWER_NET.getName()); + + RealmRuleset districtRuleSet = new RealmRuleset(realmName, rulesName, GROOVY, rules); + + // Merge rules into database + persistenceService.doReturningTransaction( + entityManager -> entityManager.merge(districtRuleSet)); + } + } catch (Exception e) { + LOG.warning( + String.format( + "assetName='%s', assetId='%s'; Rules were not created for energy management system '%s'; Exception: %s", + setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); } - @SuppressWarnings("unchecked") - private void updateManagerConfig() { - ManagerAppConfig managerConfig = configurationService.getManagerConfig(); - - Map pages = managerConfig.getPages(); - if (pages == null) { - pages = new HashMap<>(); - managerConfig.setPages(pages); - } - - Map assets = (Map) pages.computeIfAbsent("assets", k -> new HashMap<>()); - Map viewer = (Map) assets.computeIfAbsent("viewer", k -> new HashMap<>()); - Map assetTypes = (Map) viewer.computeIfAbsent("assetTypes", k -> new HashMap<>()); - - try { - assetTypes.putAll(getEmsAssetTypesConfig()); - configurationService.saveManagerConfig(managerConfig); - } catch (Exception e) { - LOG.warning(String.format("Failed to update EMS asset types config; Exception: %s", e)); - } + Instant currentDate = timerService.getNow(); + + // Create main dashboard + try (InputStream inputStream = + EmsOptimisationService.class.getResourceAsStream( + "/ems/dashboards/EmsOverviewDashboard.json")) { + String dashboardName = energyManagementSystemName + ": Overview"; + if (inputStream != null) { + + String dashboardStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + + dashboardStr = + dashboardStr + .replace("setAssetId1", energyOptimisationAssetId) + .replace("setTemplateId1", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId1", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId2", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId3", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId4", UniqueIdentifierGenerator.generateId()); + + Dashboard dashboard = ValueUtil.JSON.readValue(dashboardStr, Dashboard.class); + + dashboard.setCreatedOn(currentDate); + dashboard.setRealm(realmName); + dashboard.setDisplayName(dashboardName); + + dashboardStorageService.createNew(dashboard); + } + } catch (Exception e) { + LOG.warning( + String.format( + "assetName='%s', assetId='%s'; Dashboard was not created for energy management system '%s'; Exception: %s", + setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); } - private Map getEmsAssetTypesConfig() { - String path = "/ems/config/asset-types.json"; - try (InputStream is = EmsOptimisationSetupService.class.getResourceAsStream(path)) { - if (is == null) { - throw new IllegalArgumentException("Resource not found: " + path); - } - - String json = new String(is.readAllBytes(), StandardCharsets.UTF_8); - ObjectMapper mapper = new ObjectMapper(); - return mapper.convertValue(mapper.readTree(json), new TypeReference<>() { - }); - } catch (Exception e) { - throw new RuntimeException("Failed to read resource: " + path, e); - } + // Create battery dashboard + try (InputStream inputStream = + EmsOptimisationService.class.getResourceAsStream( + "/ems/dashboards/EmsBatteryDashboard.json")) { + String dashboardName = energyManagementSystemName + ": Battery"; + if (inputStream != null) { + + String dashboardStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + + dashboardStr = + dashboardStr + .replace("setAssetId1", electricityBatteryAssetId) + .replace("setTemplateId1", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId1", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId2", UniqueIdentifierGenerator.generateId()) + .replace("setWidgetId3", UniqueIdentifierGenerator.generateId()); + + Dashboard dashboard = ValueUtil.JSON.readValue(dashboardStr, Dashboard.class); + + dashboard.setCreatedOn(currentDate); + dashboard.setRealm(realmName); + dashboard.setDisplayName(dashboardName); + + dashboardStorageService.createNew(dashboard); + } + } catch (Exception e) { + LOG.warning( + String.format( + "assetName='%s', assetId='%s'; Dashboard was not created for energy management system '%s'; Exception: %s", + setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); } - private String createEnergyManagementSystem(EmsEnergyOptimisationSetupAsset setupAsset) { - String energyManagementSystemName = setupAsset.getEnergyManagementSystemName().orElse(""); - - // Initiate info field string - String infoFieldMessage; - - // Check if energy management system name is provided - if (energyManagementSystemName.isBlank()) { - infoFieldMessage = "Energy management system not created:\n" + - " - Set energy management system name"; - return infoFieldMessage; - } - - String energyOptimisationAssetName = energyManagementSystemName + " Energy Optimisation"; - - // Check if energy management system already exists - List energyOptimisationAssets = assetStorageService - .findAll(new AssetQuery().types(EmsEnergyOptimisationAsset.class).names(energyOptimisationAssetName)) - .stream() - .map(asset -> (EmsEnergyOptimisationAsset) asset) - .toList(); - - if (!energyOptimisationAssets.isEmpty()) { - infoFieldMessage = "Energy management system not created:\n" + - " - \"" + energyOptimisationAssetName + "\" asset already exists"; - return infoFieldMessage; - } - - - // Create Energy Optimisation Asset - EmsEnergyOptimisationAsset energyOptimisationAsset = new EmsEnergyOptimisationAsset(energyOptimisationAssetName); - energyOptimisationAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(setupAsset); - - double powerLimitMaximum = 500.0; - double powerLimitMinimum = -500.0; - double powerFluctuation = 40.0; - Double powerConsumption = 400.0; - - String powerLimitMaximumProfileCsv = generatePowerLimitProfile(powerLimitMaximum); - String powerLimitMinimumProfileCsv = generatePowerLimitProfile(powerLimitMinimum); - - energyOptimisationAsset - .setOptimisationMethod(EmsEnergyOptimisationAsset.OptimisationMethodValueType.EmsOptimisation) - .setPowerLimitMaximumInput(powerLimitMaximum) - .setPowerLimitMaximumProfileManual(powerLimitMaximum) - .setPowerLimitMaximumProfileManualInput(powerLimitMaximumProfileCsv) - .setPowerLimitMaximumProfileTotal(powerLimitMaximum) - .setPowerLimitMinimumInput(powerLimitMinimum) - .setPowerLimitMinimumProfileManual(powerLimitMinimum) - .setPowerLimitMinimumProfileManualInput(powerLimitMinimumProfileCsv) - .setPowerLimitMinimumProfileTotal(powerLimitMinimum) -// .setPowerNet(powerConsumption) - ; - - energyOptimisationAsset.addOrReplaceAttributes( - new Attribute<>("powerLimitMaximumFluctuationMargin", ValueType.POSITIVE_NUMBER, powerFluctuation) - .addOrReplaceMeta( - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)) - ), - new Attribute<>("powerLimitMinimumFluctuationMargin", ValueType.POSITIVE_NUMBER, powerFluctuation) - .addOrReplaceMeta( - new MetaItem<>(MetaItemType.READ_ONLY), - new MetaItem<>(MetaItemType.UNITS, Constants.units(Constants.UNITS_KILO, Constants.UNITS_WATT)) - ) - ); - - assetStorageService.merge(energyOptimisationAsset); - - // Create Electricity Battery Asset - EmsElectricityBatteryAsset electricityBatteryAsset = new EmsElectricityBatteryAsset(energyManagementSystemName + " Battery"); - electricityBatteryAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(energyOptimisationAsset); - - electricityBatteryAsset - .setAllowCharging(true) - .setAllowDischarging(true) - .setChargeEfficiency(100) - .setChargePowerMaximum(200.0) - .setDischargeEfficiency(100) - .setDischargePowerMaximum(-200.0) - .setEnergyCapacity(425.0) - .setEnergyLevelPercentage(50.0) - .setEnergyLevelPercentageMaximum(95) - .setEnergyLevelPercentageMinimum(20) - .setPower(0.0); - - assetStorageService.merge(electricityBatteryAsset); - - // Create Day Ahead Asset - if (setupAsset.getIncludeDayAheadForecasts().orElse(false)) { - EmsDayAheadAsset dayAheadAsset = new EmsDayAheadAsset(energyManagementSystemName + " Day ahead forecasts"); - dayAheadAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(energyOptimisationAsset); - - dayAheadAsset - .setCollectTimeForecasts("10:00") - .setUseTariffDayAheadForecasts(true); - - assetStorageService.merge(dayAheadAsset); - } - - // Create GOPACS Asset - if (setupAsset.getIncludeGopacs().orElse(false)) { - EmsGOPACSAsset gopacsAsset = new EmsGOPACSAsset(energyManagementSystemName + " GOPACS"); - gopacsAsset.setId(UniqueIdentifierGenerator.generateId()).setParent(energyOptimisationAsset); - - assetStorageService.merge(gopacsAsset); - } - - - // Setup rules - String realmName = setupAsset.getRealm(); - String energyOptimisationAssetId = energyOptimisationAsset.getId(); - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - - try (InputStream inputStream = EmsOptimisationService.class.getResourceAsStream("/ems/rules/EmsDemoSimulationRules.groovy")) { - if (inputStream != null) { - String rulesName = energyManagementSystemName + ": Demo simulation rules"; - - String rules = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - - // General variables rules - rules = rules.replaceFirst("setId1", energyOptimisationAssetId); - rules = rules.replaceFirst("setValue1", String.valueOf(powerConsumption)); - rules = rules.replaceFirst("setValue2", "1"); - rules = rules.replaceFirst("setValue3", String.valueOf(powerFluctuation)); - - // Link forecasts rule - rules = rules.replaceFirst("linkInputAssetId1", electricityBatteryAssetId); - rules = rules.replaceFirst("linkInputAttributeName1", EmsElectricityBatteryAsset.POWER_SETPOINT.getName()); - rules = rules.replaceFirst("linkOutputAssetId1", energyOptimisationAssetId); - rules = rules.replaceFirst("linkOutputAttributeName1", EmsEnergyOptimisationAsset.POWER_FLEXIBLE.getName()); - - // Sum forecasts rule - rules = rules.replaceFirst("sumInputAssetId1", energyOptimisationAssetId); - rules = rules.replaceFirst("sumInputAttributeName1", EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName()); - rules = rules.replaceFirst("sumInputAssetId2", energyOptimisationAssetId); - rules = rules.replaceFirst("sumInputAttributeName2", EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName()); - rules = rules.replaceFirst("sumInputAssetId3", energyOptimisationAssetId); - rules = rules.replaceFirst("sumInputAttributeName3", EmsEnergyOptimisationAsset.POWER_FLEXIBLE.getName()); - rules = rules.replaceFirst("sumOutputAssetId", energyOptimisationAssetId); - rules = rules.replaceFirst("sumOutputAttributeName", EmsEnergyOptimisationAsset.POWER_NET.getName()); - - RealmRuleset districtRuleSet = new RealmRuleset(realmName, rulesName, GROOVY, rules); - - // Merge rules into database - persistenceService.doReturningTransaction(entityManager -> entityManager.merge(districtRuleSet)); - } - } catch (Exception e) { - LOG.warning(String.format("assetName='%s', assetId='%s'; Rules were not created for energy management system '%s'; Exception: %s", setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); - } - - Instant currentDate = timerService.getNow(); - - // Create main dashboard - try (InputStream inputStream = EmsOptimisationService.class.getResourceAsStream("/ems/dashboards/EmsOverviewDashboard.json")) { - String dashboardName = energyManagementSystemName + ": Overview"; - if (inputStream != null) { - - String dashboardStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - - dashboardStr = dashboardStr - .replace("setAssetId1", energyOptimisationAssetId) - .replace("setTemplateId1", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId1", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId2", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId3", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId4", UniqueIdentifierGenerator.generateId()) - ; - - Dashboard dashboard = ValueUtil.JSON.readValue(dashboardStr, Dashboard.class); - - dashboard.setCreatedOn(currentDate); - dashboard.setRealm(realmName); - dashboard.setDisplayName(dashboardName); - - dashboardStorageService.createNew(dashboard); - } - } catch (Exception e) { - LOG.warning(String.format("assetName='%s', assetId='%s'; Dashboard was not created for energy management system '%s'; Exception: %s", setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); - } - - // Create battery dashboard - try (InputStream inputStream = EmsOptimisationService.class.getResourceAsStream("/ems/dashboards/EmsBatteryDashboard.json")) { - String dashboardName = energyManagementSystemName + ": Battery"; - if (inputStream != null) { + // Create info field message + infoFieldMessage = + "Created energy management system \"" + + energyOptimisationAssetName + + "\":\n" + + "\n" + + "1) Drag the energy management system to your preferred location\n"; - String dashboardStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8); - - dashboardStr = dashboardStr - .replace("setAssetId1", electricityBatteryAssetId) - .replace("setTemplateId1", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId1", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId2", UniqueIdentifierGenerator.generateId()) - .replace("setWidgetId3", UniqueIdentifierGenerator.generateId()) - ; - - Dashboard dashboard = ValueUtil.JSON.readValue(dashboardStr, Dashboard.class); - - dashboard.setCreatedOn(currentDate); - dashboard.setRealm(realmName); - dashboard.setDisplayName(dashboardName); - - dashboardStorageService.createNew(dashboard); - } - } catch (Exception e) { - LOG.warning(String.format("assetName='%s', assetId='%s'; Dashboard was not created for energy management system '%s'; Exception: %s", setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName, e)); - } - - - // Create info field message - infoFieldMessage = "Created energy management system \"" + energyOptimisationAssetName + "\":\n" + - "\n" + - "1) Drag the energy management system to your preferred location\n"; - - if (setupAsset.getIncludeGopacs().orElse(false)) { - infoFieldMessage = infoFieldMessage + "2) Set GOPACS variables\n"; - } - - infoFieldMessage = infoFieldMessage + "\nYou can delete this setup asset after you have created your energy management system."; - - LOG.info(String.format("assetName='%s', assetId='%s'; Created energy management system '%s'", setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName)); - - return infoFieldMessage; + if (setupAsset.getIncludeGopacs().orElse(false)) { + infoFieldMessage = infoFieldMessage + "2) Set GOPACS variables\n"; } - private String generatePowerLimitProfile(double powerLimit) { - LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay(); - LocalDateTime endOfDay = startOfDay.plusDays(1); + infoFieldMessage = + infoFieldMessage + + "\nYou can delete this setup asset after you have created your energy management system."; - List dailyIntervals = new ArrayList<>(); + LOG.info( + String.format( + "assetName='%s', assetId='%s'; Created energy management system '%s'", + setupAsset.getName(), setupAsset.getId(), energyOptimisationAssetName)); - // Generate 15-minute intervals for a day - for (LocalDateTime dateTime = startOfDay; dateTime.isBefore(endOfDay); dateTime = dateTime.plusMinutes(15)) { - String time = dateTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm")); - dailyIntervals.add(time); - } + return infoFieldMessage; + } - String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; - StringBuilder powerLimitProfileCsv = new StringBuilder(); + private String generatePowerLimitProfile(double powerLimit) { + LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay(); + LocalDateTime endOfDay = startOfDay.plusDays(1); - // Generate power limit profile for a week - for (String day : days) { - for (String time : dailyIntervals) { - String powerLimitProfileEntry = String.format("%s %s,%s\n", day, time, powerLimit); - powerLimitProfileCsv.append(powerLimitProfileEntry); - } - } + List dailyIntervals = new ArrayList<>(); - return powerLimitProfileCsv.toString(); + // Generate 15-minute intervals for a day + for (LocalDateTime dateTime = startOfDay; + dateTime.isBefore(endOfDay); + dateTime = dateTime.plusMinutes(15)) { + String time = dateTime.toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm")); + dailyIntervals.add(time); } + + String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + StringBuilder powerLimitProfileCsv = new StringBuilder(); + + // Generate power limit profile for a week + for (String day : days) { + for (String time : dailyIntervals) { + String powerLimitProfileEntry = String.format("%s %s,%s\n", day, time, powerLimit); + powerLimitProfileCsv.append(powerLimitProfileEntry); + } + } + + return powerLimitProfileCsv.toString(); + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/OptimisationMethodsLoader.java b/ems/src/main/java/org/openremote/extension/ems/manager/OptimisationMethodsLoader.java index 4bf5851..964a8f3 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/OptimisationMethodsLoader.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/OptimisationMethodsLoader.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,12 +12,13 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager; -import org.openremote.extension.ems.manager.optimisationMethods.OptimisationMethod; -import org.openremote.model.syslog.SyslogCategory; +import static org.openremote.model.syslog.SyslogCategory.DATA; import java.io.File; import java.net.URL; @@ -31,94 +29,111 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Logger; - -import static org.openremote.model.syslog.SyslogCategory.DATA; +import org.openremote.extension.ems.manager.optimisationMethods.OptimisationMethod; +import org.openremote.model.syslog.SyslogCategory; public class OptimisationMethodsLoader { - protected static final Logger LOG = SyslogCategory.getLogger(DATA, OptimisationMethodsLoader.class.getName()); + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, OptimisationMethodsLoader.class.getName()); - private final String OPTIMISATION_METHODS_PACKAGE_NAME = OptimisationMethodsLoader.class.getPackage().getName() + ".optimisationMethods"; + private final String OPTIMISATION_METHODS_PACKAGE_NAME = + OptimisationMethodsLoader.class.getPackage().getName() + ".optimisationMethods"; - protected void runOptimisationMethod(String currentOptimisationMethodName, String energyOptimisationAssetId, Services services) { - List optimisationMethods = loadOptimisationMethods(); + protected void runOptimisationMethod( + String currentOptimisationMethodName, String energyOptimisationAssetId, Services services) { + List optimisationMethods = loadOptimisationMethods(); - for (OptimisationMethod optimisationMethod : optimisationMethods) { - String classNameCurrent = OPTIMISATION_METHODS_PACKAGE_NAME + "." + currentOptimisationMethodName; - String classNameMethod = optimisationMethod.getClass().getName(); + for (OptimisationMethod optimisationMethod : optimisationMethods) { + String classNameCurrent = + OPTIMISATION_METHODS_PACKAGE_NAME + "." + currentOptimisationMethodName; + String classNameMethod = optimisationMethod.getClass().getName(); - if (classNameMethod.equals(classNameCurrent)) { - optimisationMethod.execute(energyOptimisationAssetId, services); - return; - } - } - if (!currentOptimisationMethodName.equals("None")) { - LOG.info(String.format("assetId='%s'; Optimisation method '%s' not found", energyOptimisationAssetId, currentOptimisationMethodName)); - } + if (classNameMethod.equals(classNameCurrent)) { + optimisationMethod.execute(energyOptimisationAssetId, services); + return; + } + } + if (!currentOptimisationMethodName.equals("None")) { + LOG.info( + String.format( + "assetId='%s'; Optimisation method '%s' not found", + energyOptimisationAssetId, currentOptimisationMethodName)); } + } - private List loadOptimisationMethods() { - List optimisationMethods = new ArrayList<>(); + private List loadOptimisationMethods() { + List optimisationMethods = new ArrayList<>(); - try { - // Get the package path - String packagePath = OPTIMISATION_METHODS_PACKAGE_NAME.replace('.', '/'); - URL packageURL = Thread.currentThread().getContextClassLoader().getResource(packagePath); + try { + // Get the package path + String packagePath = OPTIMISATION_METHODS_PACKAGE_NAME.replace('.', '/'); + URL packageURL = Thread.currentThread().getContextClassLoader().getResource(packagePath); - if (packageURL == null) { - LOG.info(String.format("Package not found; packageName='%s'", OPTIMISATION_METHODS_PACKAGE_NAME)); - return optimisationMethods; - } + if (packageURL == null) { + LOG.info( + String.format( + "Package not found; packageName='%s'", OPTIMISATION_METHODS_PACKAGE_NAME)); + return optimisationMethods; + } + + if (packageURL.getProtocol().equals("file")) { + // Handle file URL + File directory = new File(packageURL.toURI()); + + if (!directory.exists() || !directory.isDirectory()) { + LOG.info( + String.format( + "Invalid package directory; packageName='%s', directoryPath='%s'", + OPTIMISATION_METHODS_PACKAGE_NAME, directory.getAbsolutePath())); + return optimisationMethods; + } - if (packageURL.getProtocol().equals("file")) { - // Handle file URL - File directory = new File(packageURL.toURI()); - - if (!directory.exists() || !directory.isDirectory()) { - LOG.info(String.format("Invalid package directory; packageName='%s', directoryPath='%s'", OPTIMISATION_METHODS_PACKAGE_NAME, directory.getAbsolutePath())); - return optimisationMethods; - } - - // Check if the file is a class file - for (String fileName : Objects.requireNonNull(directory.list())) { - if (fileName.endsWith(".class")) { - String className = OPTIMISATION_METHODS_PACKAGE_NAME + "." + fileName.replace(".class", ""); - Class clazz = Class.forName(className); - - if (OptimisationMethod.class.isAssignableFrom(clazz) && !clazz.isInterface()) { - optimisationMethods.add((OptimisationMethod) clazz.getDeclaredConstructor().newInstance()); - } - } - } - } else if (packageURL.getProtocol().equals("jar")) { - // Handle the case where the resources are in a JAR file - String jarFilePath = packageURL.getPath().substring(5, packageURL.getPath().indexOf("!")); - JarFile jarFile = new JarFile(jarFilePath); - Enumeration entries = jarFile.entries(); - - while (entries.hasMoreElements()) { - JarEntry entry = entries.nextElement(); - - // Check if the entry is a class file - if (entry.getName().endsWith(".class") && entry.getName().startsWith(packagePath)) { - String className = entry.getName().replace('/', '.').replace(".class", ""); - Class clazz = Class.forName(className); - - if (OptimisationMethod.class.isAssignableFrom(clazz) && !clazz.isInterface()) { - optimisationMethods.add((OptimisationMethod) clazz.getDeclaredConstructor().newInstance()); - } - } - } - - jarFile.close(); - } else { - LOG.info(String.format("Unknown URL protocol; protocolName='%s'", packageURL.getProtocol())); - } + // Check if the file is a class file + for (String fileName : Objects.requireNonNull(directory.list())) { + if (fileName.endsWith(".class")) { + String className = + OPTIMISATION_METHODS_PACKAGE_NAME + "." + fileName.replace(".class", ""); + Class clazz = Class.forName(className); - } catch (Exception e) { - LOG.info(String.format("An exception occurred during loading of optimisation methods; Exception: %s", e)); + if (OptimisationMethod.class.isAssignableFrom(clazz) && !clazz.isInterface()) { + optimisationMethods.add( + (OptimisationMethod) clazz.getDeclaredConstructor().newInstance()); + } + } + } + } else if (packageURL.getProtocol().equals("jar")) { + // Handle the case where the resources are in a JAR file + String jarFilePath = packageURL.getPath().substring(5, packageURL.getPath().indexOf("!")); + JarFile jarFile = new JarFile(jarFilePath); + Enumeration entries = jarFile.entries(); + + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + + // Check if the entry is a class file + if (entry.getName().endsWith(".class") && entry.getName().startsWith(packagePath)) { + String className = entry.getName().replace('/', '.').replace(".class", ""); + Class clazz = Class.forName(className); + + if (OptimisationMethod.class.isAssignableFrom(clazz) && !clazz.isInterface()) { + optimisationMethods.add( + (OptimisationMethod) clazz.getDeclaredConstructor().newInstance()); + } + } } - return optimisationMethods; + jarFile.close(); + } else { + LOG.info( + String.format("Unknown URL protocol; protocolName='%s'", packageURL.getProtocol())); + } + + } catch (Exception e) { + LOG.info( + String.format( + "An exception occurred during loading of optimisation methods; Exception: %s", e)); } + return optimisationMethods; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/Services.java b/ems/src/main/java/org/openremote/extension/ems/manager/Services.java index 11a26bd..23595fd 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/Services.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/Services.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,13 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager; +import java.util.concurrent.ScheduledExecutorService; import org.openremote.container.message.MessageBrokerService; import org.openremote.container.timer.TimerService; import org.openremote.manager.asset.AssetProcessingService; @@ -28,130 +28,128 @@ import org.openremote.manager.event.ClientEventService; import org.openremote.manager.gateway.GatewayService; -import java.util.concurrent.ScheduledExecutorService; - public class Services { - private final AssetDatapointService assetDatapointService; - private final AssetPredictedDatapointService assetPredictedDatapointService; - private final AssetProcessingService assetProcessingService; - private final AssetStorageService assetStorageService; - private final ClientEventService clientEventService; - private final GatewayService gatewayService; - private final MessageBrokerService messageBrokerService; - private final ScheduledExecutorService scheduledExecutorService; - private final TimerService timerService; - - private Services(Builder builder) { - this.assetDatapointService = builder.assetDatapointService; - this.assetPredictedDatapointService = builder.assetPredictedDatapointService; - this.assetProcessingService = builder.assetProcessingService; - this.assetStorageService = builder.assetStorageService; - this.clientEventService = builder.clientEventService; - this.gatewayService = builder.gatewayService; - this.messageBrokerService = builder.messageBrokerService; - this.scheduledExecutorService = builder.scheduledExecutorService; - this.timerService = builder.timerService; + private final AssetDatapointService assetDatapointService; + private final AssetPredictedDatapointService assetPredictedDatapointService; + private final AssetProcessingService assetProcessingService; + private final AssetStorageService assetStorageService; + private final ClientEventService clientEventService; + private final GatewayService gatewayService; + private final MessageBrokerService messageBrokerService; + private final ScheduledExecutorService scheduledExecutorService; + private final TimerService timerService; + + private Services(Builder builder) { + this.assetDatapointService = builder.assetDatapointService; + this.assetPredictedDatapointService = builder.assetPredictedDatapointService; + this.assetProcessingService = builder.assetProcessingService; + this.assetStorageService = builder.assetStorageService; + this.clientEventService = builder.clientEventService; + this.gatewayService = builder.gatewayService; + this.messageBrokerService = builder.messageBrokerService; + this.scheduledExecutorService = builder.scheduledExecutorService; + this.timerService = builder.timerService; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private AssetDatapointService assetDatapointService; + private AssetPredictedDatapointService assetPredictedDatapointService; + private AssetProcessingService assetProcessingService; + private AssetStorageService assetStorageService; + private ClientEventService clientEventService; + private GatewayService gatewayService; + private MessageBrokerService messageBrokerService; + private ScheduledExecutorService scheduledExecutorService; + private TimerService timerService; + + public Builder withAssetDatapointService(AssetDatapointService service) { + this.assetDatapointService = service; + return this; } - public static Builder builder() { - return new Builder(); + public Builder withAssetPredictedDatapointService(AssetPredictedDatapointService service) { + this.assetPredictedDatapointService = service; + return this; } - public static class Builder { - private AssetDatapointService assetDatapointService; - private AssetPredictedDatapointService assetPredictedDatapointService; - private AssetProcessingService assetProcessingService; - private AssetStorageService assetStorageService; - private ClientEventService clientEventService; - private GatewayService gatewayService; - private MessageBrokerService messageBrokerService; - private ScheduledExecutorService scheduledExecutorService; - private TimerService timerService; - - public Builder withAssetDatapointService(AssetDatapointService service) { - this.assetDatapointService = service; - return this; - } - - public Builder withAssetPredictedDatapointService(AssetPredictedDatapointService service) { - this.assetPredictedDatapointService = service; - return this; - } - - public Builder withAssetProcessingService(AssetProcessingService service) { - this.assetProcessingService = service; - return this; - } - - public Builder withAssetStorageService(AssetStorageService service) { - this.assetStorageService = service; - return this; - } - - public Builder withClientEventService(ClientEventService service) { - this.clientEventService = service; - return this; - } - - public Builder withGatewayService(GatewayService service) { - this.gatewayService = service; - return this; - } - - public Builder withMessageBrokerService(MessageBrokerService service) { - this.messageBrokerService = service; - return this; - } - - public Builder withScheduledExecutorService(ScheduledExecutorService service) { - this.scheduledExecutorService = service; - return this; - } - - public Builder withTimerService(TimerService service) { - this.timerService = service; - return this; - } - - public Services build() { - return new Services(this); - } + public Builder withAssetProcessingService(AssetProcessingService service) { + this.assetProcessingService = service; + return this; } - // Getters for each service - public AssetDatapointService getAssetDatapointService() { - return assetDatapointService; + public Builder withAssetStorageService(AssetStorageService service) { + this.assetStorageService = service; + return this; } - public AssetPredictedDatapointService getAssetPredictedDatapointService() { - return assetPredictedDatapointService; + public Builder withClientEventService(ClientEventService service) { + this.clientEventService = service; + return this; } - public AssetProcessingService getAssetProcessingService() { - return assetProcessingService; + public Builder withGatewayService(GatewayService service) { + this.gatewayService = service; + return this; } - public AssetStorageService getAssetStorageService() { - return assetStorageService; + public Builder withMessageBrokerService(MessageBrokerService service) { + this.messageBrokerService = service; + return this; } - public ClientEventService getClientEventService() { - return clientEventService; + public Builder withScheduledExecutorService(ScheduledExecutorService service) { + this.scheduledExecutorService = service; + return this; } - public GatewayService getGatewayService() { - return gatewayService; + public Builder withTimerService(TimerService service) { + this.timerService = service; + return this; } - public MessageBrokerService getMessageBrokerService() { - return messageBrokerService; + public Services build() { + return new Services(this); } + } - public ScheduledExecutorService getScheduledExecutorService() { - return scheduledExecutorService; - } + // Getters for each service + public AssetDatapointService getAssetDatapointService() { + return assetDatapointService; + } - public TimerService getTimerService() { - return timerService; - } + public AssetPredictedDatapointService getAssetPredictedDatapointService() { + return assetPredictedDatapointService; + } + + public AssetProcessingService getAssetProcessingService() { + return assetProcessingService; + } + + public AssetStorageService getAssetStorageService() { + return assetStorageService; + } + + public ClientEventService getClientEventService() { + return clientEventService; + } + + public GatewayService getGatewayService() { + return gatewayService; + } + + public MessageBrokerService getMessageBrokerService() { + return messageBrokerService; + } + + public ScheduledExecutorService getScheduledExecutorService() { + return scheduledExecutorService; + } + + public TimerService getTimerService() { + return timerService; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/FlexRequestISPTypeHelper.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/FlexRequestISPTypeHelper.java index f211fd0..4bfa068 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/FlexRequestISPTypeHelper.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/FlexRequestISPTypeHelper.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,61 +12,65 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; import java.time.*; public class FlexRequestISPTypeHelper { - private static final long ISP_DURATION_IN_MINUTES = 15; + private static final long ISP_DURATION_IN_MINUTES = 15; - public static LocalTime getISPStart(long ispNumber, int year, int month, int day, String timeZone) { - ZoneId zoneId = ZoneId.of(timeZone); - ZonedDateTime date = ZonedDateTime.of(year, month, day, 0, 0, 0, 0, zoneId); + public static LocalTime getISPStart( + long ispNumber, int year, int month, int day, String timeZone) { + ZoneId zoneId = ZoneId.of(timeZone); + ZonedDateTime date = ZonedDateTime.of(year, month, day, 0, 0, 0, 0, zoneId); - if (ispNumber == 9 && isLastSundayInMarch(year, month, day)) { - return date.plusHours(3).toLocalTime(); - } else if (ispNumber == 13 && isLastSundayInOctober(year, month, day)) { - return date.plusHours(2).toLocalTime(); - } else { - return date.plusMinutes((ispNumber - 1) * ISP_DURATION_IN_MINUTES).toLocalTime(); - } + if (ispNumber == 9 && isLastSundayInMarch(year, month, day)) { + return date.plusHours(3).toLocalTime(); + } else if (ispNumber == 13 && isLastSundayInOctober(year, month, day)) { + return date.plusHours(2).toLocalTime(); + } else { + return date.plusMinutes((ispNumber - 1) * ISP_DURATION_IN_MINUTES).toLocalTime(); } + } - public static LocalTime getISPEnd(int ispNumber, int year, int month, int day, String timeZone) { - LocalTime end = getISPStart(ispNumber, year, month, day, timeZone).plusMinutes(ISP_DURATION_IN_MINUTES); - if (ispNumber == 8 && isLastSundayInMarch(year, month, day)) { - end = end.plusHours(1); - } else if (ispNumber == 12 && isLastSundayInOctober(year, month, day)) { - end = end.minusHours(1); - } - return end; + public static LocalTime getISPEnd(int ispNumber, int year, int month, int day, String timeZone) { + LocalTime end = + getISPStart(ispNumber, year, month, day, timeZone).plusMinutes(ISP_DURATION_IN_MINUTES); + if (ispNumber == 8 && isLastSundayInMarch(year, month, day)) { + end = end.plusHours(1); + } else if (ispNumber == 12 && isLastSundayInOctober(year, month, day)) { + end = end.minusHours(1); } + return end; + } - private static boolean isLastSundayInMarch(int year, int month, int day) { - if (month != 3) { // March is 3 in Java's month numbering - return false; - } - LocalDate date = LocalDate.of(year, month, day); - int lastDayInMarch = YearMonth.of(year, month).lengthOfMonth(); - LocalDate lastSundayInMarch = LocalDate.of(year, month, lastDayInMarch); - while (lastSundayInMarch.getDayOfWeek() != DayOfWeek.SUNDAY) { - lastSundayInMarch = lastSundayInMarch.minusDays(1); - } - return date.equals(lastSundayInMarch); + private static boolean isLastSundayInMarch(int year, int month, int day) { + if (month != 3) { // March is 3 in Java's month numbering + return false; } + LocalDate date = LocalDate.of(year, month, day); + int lastDayInMarch = YearMonth.of(year, month).lengthOfMonth(); + LocalDate lastSundayInMarch = LocalDate.of(year, month, lastDayInMarch); + while (lastSundayInMarch.getDayOfWeek() != DayOfWeek.SUNDAY) { + lastSundayInMarch = lastSundayInMarch.minusDays(1); + } + return date.equals(lastSundayInMarch); + } - private static boolean isLastSundayInOctober(int year, int month, int day) { - if (month != 10) { // October is 10 in Java's month numbering - return false; - } - LocalDate date = LocalDate.of(year, month, day); - int lastDayInOctober = YearMonth.of(year, month).lengthOfMonth(); - LocalDate lastSundayInOctober = LocalDate.of(year, month, lastDayInOctober); - while (lastSundayInOctober.getDayOfWeek() != DayOfWeek.SUNDAY) { - lastSundayInOctober = lastSundayInOctober.minusDays(1); - } - return date.equals(lastSundayInOctober); + private static boolean isLastSundayInOctober(int year, int month, int day) { + if (month != 10) { // October is 10 in Java's month numbering + return false; + } + LocalDate date = LocalDate.of(year, month, day); + int lastDayInOctober = YearMonth.of(year, month).lengthOfMonth(); + LocalDate lastSundayInOctober = LocalDate.of(year, month, lastDayInOctober); + while (lastSundayInOctober.getDayOfWeek() != DayOfWeek.SUNDAY) { + lastSundayInOctober = lastSundayInOctober.minusDays(1); } + return date.equals(lastSundayInOctober); + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAddressBookResource.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAddressBookResource.java index a119a08..6b061cf 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAddressBookResource.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAddressBookResource.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + import jakarta.ws.rs.GET; import jakarta.ws.rs.HeaderParam; import jakarta.ws.rs.Path; @@ -26,15 +27,12 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; -import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; - @Path("uftp-participants/v3/participants") public interface GOPACSAddressBookResource { - @GET - @Path("{uftpDomainName}") - @Produces(APPLICATION_JSON) - Response fetchParticipantByDomain( - @HeaderParam("Authorization") String authorization, - @PathParam("uftpDomainName") String uftpDomainName - ); + @GET + @Path("{uftpDomainName}") + @Produces(APPLICATION_JSON) + Response fetchParticipantByDomain( + @HeaderParam("Authorization") String authorization, + @PathParam("uftpDomainName") String uftpDomainName); } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAnnouncementResource.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAnnouncementResource.java index 53cb19e..d4447ad 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAnnouncementResource.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAnnouncementResource.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,33 +12,34 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; import jakarta.ws.rs.core.Response; -import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; - /** - * RESTEasy client proxy for the GOPACS machine announcements endpoint. - * No authentication required (public API). + * RESTEasy client proxy for the GOPACS machine announcements endpoint. No authentication required + * (public API). */ @Path("/") @Produces(APPLICATION_JSON) public interface GOPACSAnnouncementResource { - @GET - @Path("machineannouncements") - Response fetchAnnouncements( - @QueryParam("postalcode") String postalCode, - @QueryParam("starttime") String startTime, - @QueryParam("endtime") String endTime, - @QueryParam("type") String type, - @QueryParam("state") String state - ); + @GET + @Path("machineannouncements") + Response fetchAnnouncements( + @QueryParam("postalcode") String postalCode, + @QueryParam("starttime") String startTime, + @QueryParam("endtime") String endTime, + @QueryParam("type") String type, + @QueryParam("state") String state); } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAuthResource.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAuthResource.java index a05140e..828a4d6 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAuthResource.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSAuthResource.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,15 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + import jakarta.ws.rs.Consumes; import jakarta.ws.rs.FormParam; import jakarta.ws.rs.POST; @@ -26,21 +28,15 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; -import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED; -import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; - -/** - * RESTEasy client interface for OAuth2 token endpoint - */ +/** RESTEasy client interface for OAuth2 token endpoint */ @Path("/") public interface GOPACSAuthResource { - @POST - @Consumes(APPLICATION_FORM_URLENCODED) - @Produces(APPLICATION_JSON) - Response getAccessToken( - @FormParam("grant_type") String grantType, - @FormParam("client_id") String clientId, - @FormParam("client_secret") String clientSecret - ); + @POST + @Consumes(APPLICATION_FORM_URLENCODED) + @Produces(APPLICATION_JSON) + Response getAccessToken( + @FormParam("grant_type") String grantType, + @FormParam("client_id") String clientId, + @FormParam("client_secret") String clientSecret); } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSEanEffectivityResource.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSEanEffectivityResource.java index 83d2259..7203951 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSEanEffectivityResource.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSEanEffectivityResource.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + import jakarta.ws.rs.GET; import jakarta.ws.rs.HeaderParam; import jakarta.ws.rs.Path; @@ -26,20 +27,16 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; -import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; - /** - * RESTEasy client proxy for the GOPACS EAN solving effectivity endpoint. - * Requires an API key header for authentication. + * RESTEasy client proxy for the GOPACS EAN solving effectivity endpoint. Requires an API key header + * for authentication. */ @Path("public-api/1.0") @Produces(APPLICATION_JSON) public interface GOPACSEanEffectivityResource { - @GET - @Path("announcements/{id}/eansolvingeffectivity") - Response fetchEanSolvingEffectivity( - @PathParam("id") String announcementId, - @HeaderParam("API_KEY") String apiKey - ); + @GET + @Path("announcements/{id}/eansolvingeffectivity") + Response fetchEanSolvingEffectivity( + @PathParam("id") String announcementId, @HeaderParam("API_KEY") String apiKey); } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSHandler.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSHandler.java index 63ccf96..ca8618d 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSHandler.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSHandler.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,16 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static org.openremote.container.web.WebService.getStandardProviders; +import static org.openremote.container.web.WebTargetBuilder.createClient; +import static org.openremote.model.syslog.SyslogCategory.API; + import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -26,6 +29,21 @@ import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.core.Application; import jakarta.ws.rs.core.Response; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Stream; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.lfenergy.shapeshifter.api.*; import org.lfenergy.shapeshifter.api.model.UftpParticipantInformation; @@ -62,626 +80,733 @@ import org.openremote.model.syslog.SyslogCategory; import org.openremote.model.util.TextUtil; -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.util.*; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Stream; - -import static org.openremote.container.web.WebService.getStandardProviders; -import static org.openremote.container.web.WebTargetBuilder.createClient; -import static org.openremote.model.syslog.SyslogCategory.API; - -/** - * This class handles the communication with the GoPacs server. - */ -public class GOPACSHandler implements UftpPayloadHandler, UftpParticipantService, ParticipantAuthorizationProvider { - - private static final Logger LOG = SyslogCategory.getLogger(API, GOPACSHandler.class); - public static final String GOPACS_PRIVATE_KEY_FILE = "GOPACS_PRIVATE_KEY_FILE"; - public static final String GOPACS_BROKER_URL = "GOPACS_BROKER_URL"; - public static final String DEFAULT_GOPACS_BROKER_URL = "https://clc-message-broker.gopacs-services.eu"; - public static final String GOPACS_PARTICIPANT_URL = "GOPACS_PARTICIPANT_URL"; - public static final String DEFAULT_GOPACS_PARTICIPANT_URL = "https://api.gopacs-services.eu"; - public static final String GOPACS_OAUTH2_URL = "GOPACS_OAUTH2_URL"; - public static final String DEFAULT_GOPACS_OAUTH2_URL = "https://auth.gopacs-services.eu/realms/gopacs/protocol/openid-connect/token"; - public static final String GOPACS_CLIENT_ID = "GOPACS_CLIENT_ID"; - public static final String GOPACS_CLIENT_SECRET = "GOPACS_CLIENT_SECRET"; - public static final String GOPACS_RESPONSE_DELAY_SECONDS = "GOPACS_RESPONSE_DELAY_SECONDS"; - public static final String DEFAULT_GOPACS_RESPONSE_DELAY_SECONDS = "10"; - public static final String GOPACS_FLEX_OFFER_DELAY_SECONDS = "GOPACS_FLEX_OFFER_DELAY_SECONDS"; - public static final String DEFAULT_GOPACS_FLEX_OFFER_DELAY_SECONDS = "30"; - public static final String DEPLOYMENT_PATH = "/gopacs"; - /** Scheme prefix GOPACS uses on congestion-point identifiers, e.g. "ean.265987182507322951". */ - public static final String EAN_PREFIX = "ean."; - - - protected static final UftpSerializer serializer = new UftpSerializer(new XmlSerializer(), new XsdValidator(new XsdSchemaProvider(new XsdFactory(new XsdSchemaFactoryPool())))); - - protected final boolean devMode; - protected final String contractedEAN; - protected final String electricitySupplierAssetId; - protected final String realm; - protected final String gopacsBrokerUrl; - protected final Map participants; - - protected final AssetProcessingService assetProcessingService; - protected final AssetPredictedDatapointService assetPredictedDatapointService; - protected final ScheduledExecutorService scheduledExecutorService; - protected final TimerService timerService; - protected final WebService webService; - - protected final ResteasyClient client; - protected final GOPACSAddressBookResource gopacsAddressBookResource; - protected final GOPACSAuthResource gopacsAuthResource; - protected final GOPACSServerResource gopacsServerResource; - - protected final ParticipantResolutionService participantResolutionService; - protected final UftpValidationService uftpValidationService; - protected final UftpReceivedMessageService uftpReceivedMessageService; - protected final UftpSendMessageService uftpSendMessageService; - protected final UftpCryptoService cryptoService; - protected final String privateKey; - protected final String clientId; - protected final String clientSecret; - - protected final int responseDelaySeconds; - protected final int flexOfferDelaySeconds; - protected ObjectMapper objectMapper; - - List> scheduledFutureList = new ArrayList<>(); - - public static class Factory { - protected Container container; - - public Factory(Container container) { - this.container = container; - } - - public GOPACSHandler createHandler(String contractedEan, String realm, String electricitySupplierAssetId) { - return new GOPACSHandler(contractedEan, realm, electricitySupplierAssetId, container); - } +/** This class handles the communication with the GoPacs server. */ +public class GOPACSHandler + implements UftpPayloadHandler, UftpParticipantService, ParticipantAuthorizationProvider { + + private static final Logger LOG = SyslogCategory.getLogger(API, GOPACSHandler.class); + public static final String GOPACS_PRIVATE_KEY_FILE = "GOPACS_PRIVATE_KEY_FILE"; + public static final String GOPACS_BROKER_URL = "GOPACS_BROKER_URL"; + public static final String DEFAULT_GOPACS_BROKER_URL = + "https://clc-message-broker.gopacs-services.eu"; + public static final String GOPACS_PARTICIPANT_URL = "GOPACS_PARTICIPANT_URL"; + public static final String DEFAULT_GOPACS_PARTICIPANT_URL = "https://api.gopacs-services.eu"; + public static final String GOPACS_OAUTH2_URL = "GOPACS_OAUTH2_URL"; + public static final String DEFAULT_GOPACS_OAUTH2_URL = + "https://auth.gopacs-services.eu/realms/gopacs/protocol/openid-connect/token"; + public static final String GOPACS_CLIENT_ID = "GOPACS_CLIENT_ID"; + public static final String GOPACS_CLIENT_SECRET = "GOPACS_CLIENT_SECRET"; + public static final String GOPACS_RESPONSE_DELAY_SECONDS = "GOPACS_RESPONSE_DELAY_SECONDS"; + public static final String DEFAULT_GOPACS_RESPONSE_DELAY_SECONDS = "10"; + public static final String GOPACS_FLEX_OFFER_DELAY_SECONDS = "GOPACS_FLEX_OFFER_DELAY_SECONDS"; + public static final String DEFAULT_GOPACS_FLEX_OFFER_DELAY_SECONDS = "30"; + public static final String DEPLOYMENT_PATH = "/gopacs"; + + /** Scheme prefix GOPACS uses on congestion-point identifiers, e.g. "ean.265987182507322951". */ + public static final String EAN_PREFIX = "ean."; + + protected static final UftpSerializer serializer = + new UftpSerializer( + new XmlSerializer(), + new XsdValidator(new XsdSchemaProvider(new XsdFactory(new XsdSchemaFactoryPool())))); + + protected final boolean devMode; + protected final String contractedEAN; + protected final String electricitySupplierAssetId; + protected final String realm; + protected final String gopacsBrokerUrl; + protected final Map participants; + + protected final AssetProcessingService assetProcessingService; + protected final AssetPredictedDatapointService assetPredictedDatapointService; + protected final ScheduledExecutorService scheduledExecutorService; + protected final TimerService timerService; + protected final WebService webService; + + protected final ResteasyClient client; + protected final GOPACSAddressBookResource gopacsAddressBookResource; + protected final GOPACSAuthResource gopacsAuthResource; + protected final GOPACSServerResource gopacsServerResource; + + protected final ParticipantResolutionService participantResolutionService; + protected final UftpValidationService uftpValidationService; + protected final UftpReceivedMessageService uftpReceivedMessageService; + protected final UftpSendMessageService uftpSendMessageService; + protected final UftpCryptoService cryptoService; + protected final String privateKey; + protected final String clientId; + protected final String clientSecret; + + protected final int responseDelaySeconds; + protected final int flexOfferDelaySeconds; + protected ObjectMapper objectMapper; + + List> scheduledFutureList = new ArrayList<>(); + + public static class Factory { + protected Container container; + + public Factory(Container container) { + this.container = container; } - protected GOPACSHandler(String contractedEAN, String realm, String electricitySupplierAssetId, Container container) { - this.devMode = container.isDevMode(); - this.contractedEAN = contractedEAN; - this.realm = realm; - this.electricitySupplierAssetId = electricitySupplierAssetId; - this.participants = new HashMap<>(); - - this.assetProcessingService = container.getService(AssetProcessingService.class); - this.assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); - this.scheduledExecutorService = container.getScheduledExecutor(); - this.timerService = container.getService(TimerService.class); - this.webService = container.getService(WebService.class); - - // Strip trailing slashes so the synthesised broker endpoint never contains a double slash - this.gopacsBrokerUrl = container.getConfig().getOrDefault(GOPACS_BROKER_URL, DEFAULT_GOPACS_BROKER_URL).replaceAll("/+$", ""); - this.responseDelaySeconds = Integer.parseInt(container.getConfig().getOrDefault(GOPACS_RESPONSE_DELAY_SECONDS, DEFAULT_GOPACS_RESPONSE_DELAY_SECONDS)); - this.flexOfferDelaySeconds = Integer.parseInt(container.getConfig().getOrDefault(GOPACS_FLEX_OFFER_DELAY_SECONDS, DEFAULT_GOPACS_FLEX_OFFER_DELAY_SECONDS)); - - // Initialize OAuth2 configuration first - this.clientId = container.getConfig().get(GOPACS_CLIENT_ID); - this.clientSecret = container.getConfig().get(GOPACS_CLIENT_SECRET); - - if (clientId == null || clientId.isBlank() || clientSecret == null || clientSecret.isBlank()) { - throw new RuntimeException(GOPACS_CLIENT_ID + " or " + GOPACS_CLIENT_SECRET + " not defined, cannot use GOPACS."); - } - - String goPacsPrivateKeyFile = container.getConfig().get(GOPACS_PRIVATE_KEY_FILE); - if (TextUtil.isNullOrEmpty(goPacsPrivateKeyFile)) { - throw new RuntimeException(GOPACS_PRIVATE_KEY_FILE + " not defined, can not send use GOPACS."); - } - if (!Files.isReadable(Paths.get(goPacsPrivateKeyFile))) { - throw new RuntimeException(GOPACS_PRIVATE_KEY_FILE + " invalid path or file not readable: " + goPacsPrivateKeyFile); - } - // Read the private key from file - try { - this.privateKey = Files.readString(Paths.get(goPacsPrivateKeyFile)); - } catch (Exception ex) { - throw new RuntimeException("Failed to initialize GOPACSHandler for ean " + contractedEAN + ".", ex); - } - - this.client = createClient(org.openremote.container.Container.EXECUTOR); - - String addressBookUrl = container.getConfig().getOrDefault(GOPACS_PARTICIPANT_URL, DEFAULT_GOPACS_PARTICIPANT_URL); - String oAuth2Url = container.getConfig().getOrDefault(GOPACS_OAUTH2_URL, DEFAULT_GOPACS_OAUTH2_URL); - - this.gopacsAddressBookResource = client.target(addressBookUrl).proxy(GOPACSAddressBookResource.class); - this.gopacsAuthResource = client.target(oAuth2Url).proxy(GOPACSAuthResource.class); - this.gopacsServerResource = new GOPACSServerResourceImpl(this::processRawMessage); - - this.participantResolutionService = new ParticipantResolutionService(this); - this.cryptoService = new UftpCryptoService(participantResolutionService, new LazySodiumFactory(), new LazySodiumBase64Pool()); - this.uftpValidationService = new UftpValidationService(new ArrayList<>()); - this.uftpReceivedMessageService = new UftpReceivedMessageService(uftpValidationService, this); - this.uftpSendMessageService = new UftpSendMessageService(serializer, cryptoService, participantResolutionService, this, uftpValidationService); - - this.objectMapper = new ObjectMapper(); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); - - deploy(container); + public GOPACSHandler createHandler( + String contractedEan, String realm, String electricitySupplierAssetId) { + return new GOPACSHandler(contractedEan, realm, electricitySupplierAssetId, container); } - - /** - * Test-support constructor. Wires the message-processing collaborators directly and skips - * remote configuration (OAuth client, private-key file) and JAX-RS deployment, so the - * day-ahead UFTP message flow can be exercised in isolation. Not used in production wiring. - */ - protected GOPACSHandler(String contractedEAN, - String realm, - String electricitySupplierAssetId, - AssetProcessingService assetProcessingService, - AssetPredictedDatapointService assetPredictedDatapointService, - TimerService timerService, - ScheduledExecutorService scheduledExecutorService, - String privateKey) { - this.devMode = false; - this.contractedEAN = contractedEAN; - this.realm = realm; - this.electricitySupplierAssetId = electricitySupplierAssetId; - this.participants = new HashMap<>(); - - this.assetProcessingService = assetProcessingService; - this.assetPredictedDatapointService = assetPredictedDatapointService; - this.timerService = timerService; - this.scheduledExecutorService = scheduledExecutorService; - this.webService = null; - - this.gopacsBrokerUrl = ""; - this.responseDelaySeconds = 0; - this.flexOfferDelaySeconds = 0; - this.clientId = null; - this.clientSecret = null; - this.privateKey = privateKey; - - this.client = null; - this.gopacsAddressBookResource = null; - this.gopacsAuthResource = null; - this.gopacsServerResource = null; - - this.participantResolutionService = new ParticipantResolutionService(this); - this.cryptoService = new UftpCryptoService(participantResolutionService, new LazySodiumFactory(), new LazySodiumBase64Pool()); - this.uftpValidationService = new UftpValidationService(new ArrayList<>()); - this.uftpReceivedMessageService = new UftpReceivedMessageService(uftpValidationService, this); - this.uftpSendMessageService = new UftpSendMessageService(serializer, cryptoService, participantResolutionService, this, uftpValidationService); - - this.objectMapper = new ObjectMapper(); + } + + protected GOPACSHandler( + String contractedEAN, String realm, String electricitySupplierAssetId, Container container) { + this.devMode = container.isDevMode(); + this.contractedEAN = contractedEAN; + this.realm = realm; + this.electricitySupplierAssetId = electricitySupplierAssetId; + this.participants = new HashMap<>(); + + this.assetProcessingService = container.getService(AssetProcessingService.class); + this.assetPredictedDatapointService = + container.getService(AssetPredictedDatapointService.class); + this.scheduledExecutorService = container.getScheduledExecutor(); + this.timerService = container.getService(TimerService.class); + this.webService = container.getService(WebService.class); + + // Strip trailing slashes so the synthesised broker endpoint never contains a double slash + this.gopacsBrokerUrl = + container + .getConfig() + .getOrDefault(GOPACS_BROKER_URL, DEFAULT_GOPACS_BROKER_URL) + .replaceAll("/+$", ""); + this.responseDelaySeconds = + Integer.parseInt( + container + .getConfig() + .getOrDefault( + GOPACS_RESPONSE_DELAY_SECONDS, DEFAULT_GOPACS_RESPONSE_DELAY_SECONDS)); + this.flexOfferDelaySeconds = + Integer.parseInt( + container + .getConfig() + .getOrDefault( + GOPACS_FLEX_OFFER_DELAY_SECONDS, DEFAULT_GOPACS_FLEX_OFFER_DELAY_SECONDS)); + + // Initialize OAuth2 configuration first + this.clientId = container.getConfig().get(GOPACS_CLIENT_ID); + this.clientSecret = container.getConfig().get(GOPACS_CLIENT_SECRET); + + if (clientId == null || clientId.isBlank() || clientSecret == null || clientSecret.isBlank()) { + throw new RuntimeException( + GOPACS_CLIENT_ID + " or " + GOPACS_CLIENT_SECRET + " not defined, cannot use GOPACS."); } - protected static String getDeploymentName(String contractedEAN) { - return "GOPACS: " + contractedEAN; + String goPacsPrivateKeyFile = container.getConfig().get(GOPACS_PRIVATE_KEY_FILE); + if (TextUtil.isNullOrEmpty(goPacsPrivateKeyFile)) { + throw new RuntimeException( + GOPACS_PRIVATE_KEY_FILE + " not defined, can not send use GOPACS."); } - - protected void deploy(Container container) { - LOG.info("Deploying JAX-RS deployment for instance : " + this); - - List singletons = Stream.of(getStandardProviders(devMode), Collections.singletonList(gopacsServerResource)) - .flatMap(Collection::stream) - .toList(); - Application application = new WebApplication( - container, - null, - singletons); - - webService.deployJaxRsApplication(application, DEPLOYMENT_PATH, getDeploymentName(contractedEAN), 0, true, new CORSConfig() - .setCorsAllowedOrigins(Collections.singleton(CORSConfig.DEFAULT_CORS_ALLOW_ALL)) - .setCorsAllowedMethods(CORSConfig.DEFAULT_CORS_ALLOW_ALL) - .setCorsAllowedHeaders(CORSConfig.DEFAULT_CORS_ALLOW_ALL)); + if (!Files.isReadable(Paths.get(goPacsPrivateKeyFile))) { + throw new RuntimeException( + GOPACS_PRIVATE_KEY_FILE + " invalid path or file not readable: " + goPacsPrivateKeyFile); } - - public void undeploy() { - for (ScheduledFuture scheduledFuture : scheduledFutureList) { - scheduledFuture.cancel(true); - } - scheduledFutureList.clear(); - webService.undeploy(getDeploymentName(contractedEAN)); + // Read the private key from file + try { + this.privateKey = Files.readString(Paths.get(goPacsPrivateKeyFile)); + } catch (Exception ex) { + throw new RuntimeException( + "Failed to initialize GOPACSHandler for ean " + contractedEAN + ".", ex); } - @Override - public void notifyNewIncomingMessage(IncomingUftpMessage message) { - LOG.info("Received message with conversation ID: " + message.payloadMessage().getConversationID() + " type " + message.payloadMessage().getClass().getSimpleName()); - var messageType = message.payloadMessage().getClass(); - - if (FlexRequest.class.isAssignableFrom(messageType)) { - var flexRequest = (FlexRequest) message.payloadMessage(); - LOG.fine("Processing FlexRequest: " + flexRequest.getConversationID()); - handleFlexRequestMessage(message.sender(), flexRequest); - LOG.fine("Finished processing FlexRequest: " + flexRequest.getConversationID()); - } else if (FlexOfferResponse.class.isAssignableFrom(messageType)) { - var flexOfferResponse = (FlexOfferResponse) message.payloadMessage(); - LOG.fine("Processing FlexOfferResponse: " + flexOfferResponse.getConversationID()); - handleFlexOfferResponseMessage(message.sender(), flexOfferResponse); - LOG.fine("Finished processing FlexOfferResponse: " + flexOfferResponse.getConversationID()); - } else if (FlexOrder.class.isAssignableFrom(messageType)) { - var flexOrder = (FlexOrder) message.payloadMessage(); - LOG.fine("Processing FlexOrder: " + flexOrder.getConversationID()); - handleFlexOrderMessage(message.sender(), flexOrder); - LOG.fine("Finished processing FlexOrder: " + flexOrder.getConversationID()); - } else { - LOG.warning("Received unknown message type: " + messageType.getSimpleName()); - } - LOG.info("Finished processing message with conversation ID: " + message.payloadMessage().getConversationID() + " type " + message.payloadMessage().getClass().getSimpleName()); + this.client = createClient(org.openremote.container.Container.EXECUTOR); + + String addressBookUrl = + container.getConfig().getOrDefault(GOPACS_PARTICIPANT_URL, DEFAULT_GOPACS_PARTICIPANT_URL); + String oAuth2Url = + container.getConfig().getOrDefault(GOPACS_OAUTH2_URL, DEFAULT_GOPACS_OAUTH2_URL); + + this.gopacsAddressBookResource = + client.target(addressBookUrl).proxy(GOPACSAddressBookResource.class); + this.gopacsAuthResource = client.target(oAuth2Url).proxy(GOPACSAuthResource.class); + this.gopacsServerResource = new GOPACSServerResourceImpl(this::processRawMessage); + + this.participantResolutionService = new ParticipantResolutionService(this); + this.cryptoService = + new UftpCryptoService( + participantResolutionService, new LazySodiumFactory(), new LazySodiumBase64Pool()); + this.uftpValidationService = new UftpValidationService(new ArrayList<>()); + this.uftpReceivedMessageService = new UftpReceivedMessageService(uftpValidationService, this); + this.uftpSendMessageService = + new UftpSendMessageService( + serializer, cryptoService, participantResolutionService, this, uftpValidationService); + + this.objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + + deploy(container); + } + + /** + * Test-support constructor. Wires the message-processing collaborators directly and skips remote + * configuration (OAuth client, private-key file) and JAX-RS deployment, so the day-ahead UFTP + * message flow can be exercised in isolation. Not used in production wiring. + */ + protected GOPACSHandler( + String contractedEAN, + String realm, + String electricitySupplierAssetId, + AssetProcessingService assetProcessingService, + AssetPredictedDatapointService assetPredictedDatapointService, + TimerService timerService, + ScheduledExecutorService scheduledExecutorService, + String privateKey) { + this.devMode = false; + this.contractedEAN = contractedEAN; + this.realm = realm; + this.electricitySupplierAssetId = electricitySupplierAssetId; + this.participants = new HashMap<>(); + + this.assetProcessingService = assetProcessingService; + this.assetPredictedDatapointService = assetPredictedDatapointService; + this.timerService = timerService; + this.scheduledExecutorService = scheduledExecutorService; + this.webService = null; + + this.gopacsBrokerUrl = ""; + this.responseDelaySeconds = 0; + this.flexOfferDelaySeconds = 0; + this.clientId = null; + this.clientSecret = null; + this.privateKey = privateKey; + + this.client = null; + this.gopacsAddressBookResource = null; + this.gopacsAuthResource = null; + this.gopacsServerResource = null; + + this.participantResolutionService = new ParticipantResolutionService(this); + this.cryptoService = + new UftpCryptoService( + participantResolutionService, new LazySodiumFactory(), new LazySodiumBase64Pool()); + this.uftpValidationService = new UftpValidationService(new ArrayList<>()); + this.uftpReceivedMessageService = new UftpReceivedMessageService(uftpValidationService, this); + this.uftpSendMessageService = + new UftpSendMessageService( + serializer, cryptoService, participantResolutionService, this, uftpValidationService); + + this.objectMapper = new ObjectMapper(); + } + + protected static String getDeploymentName(String contractedEAN) { + return "GOPACS: " + contractedEAN; + } + + protected void deploy(Container container) { + LOG.info("Deploying JAX-RS deployment for instance : " + this); + + List singletons = + Stream.of( + getStandardProviders(devMode), + Collections.singletonList(gopacsServerResource)) + .flatMap(Collection::stream) + .toList(); + Application application = new WebApplication(container, null, singletons); + + webService.deployJaxRsApplication( + application, + DEPLOYMENT_PATH, + getDeploymentName(contractedEAN), + 0, + true, + new CORSConfig() + .setCorsAllowedOrigins(Collections.singleton(CORSConfig.DEFAULT_CORS_ALLOW_ALL)) + .setCorsAllowedMethods(CORSConfig.DEFAULT_CORS_ALLOW_ALL) + .setCorsAllowedHeaders(CORSConfig.DEFAULT_CORS_ALLOW_ALL)); + } + + public void undeploy() { + for (ScheduledFuture scheduledFuture : scheduledFutureList) { + scheduledFuture.cancel(true); } - - @Override - public void notifyNewOutgoingMessage(OutgoingUftpMessage message) { - LOG.info("Sending message: " + message.payloadMessage().getConversationID() + " type " + message.payloadMessage().getClass().getSimpleName()); - try { - if (message.payloadMessage() instanceof FlexRequestResponse || - message.payloadMessage() instanceof FlexOffer || - message.payloadMessage() instanceof FlexOrderResponse) { - - if (LOG.isLoggable(Level.FINE)) { - LOG.fine("Content to send: " + serializer.toXml(message.payloadMessage())); - } - - String recipientDomain = message.payloadMessage().getRecipientDomain(); - uftpSendMessageService.attemptToSendMessage( - message.payloadMessage(), - new SigningDetails( - message.sender(), - this.privateKey, - new UftpParticipant(recipientDomain, UftpRoleInformation.getRecipientRoleBySenderRole(message.sender().role())) - ) - ); - } - LOG.fine("Finished sending message: " + message.payloadMessage().getConversationID()); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to send message", e); - } + scheduledFutureList.clear(); + webService.undeploy(getDeploymentName(contractedEAN)); + } + + @Override + public void notifyNewIncomingMessage(IncomingUftpMessage message) { + LOG.info( + "Received message with conversation ID: " + + message.payloadMessage().getConversationID() + + " type " + + message.payloadMessage().getClass().getSimpleName()); + var messageType = message.payloadMessage().getClass(); + + if (FlexRequest.class.isAssignableFrom(messageType)) { + var flexRequest = (FlexRequest) message.payloadMessage(); + LOG.fine("Processing FlexRequest: " + flexRequest.getConversationID()); + handleFlexRequestMessage(message.sender(), flexRequest); + LOG.fine("Finished processing FlexRequest: " + flexRequest.getConversationID()); + } else if (FlexOfferResponse.class.isAssignableFrom(messageType)) { + var flexOfferResponse = (FlexOfferResponse) message.payloadMessage(); + LOG.fine("Processing FlexOfferResponse: " + flexOfferResponse.getConversationID()); + handleFlexOfferResponseMessage(message.sender(), flexOfferResponse); + LOG.fine("Finished processing FlexOfferResponse: " + flexOfferResponse.getConversationID()); + } else if (FlexOrder.class.isAssignableFrom(messageType)) { + var flexOrder = (FlexOrder) message.payloadMessage(); + LOG.fine("Processing FlexOrder: " + flexOrder.getConversationID()); + handleFlexOrderMessage(message.sender(), flexOrder); + LOG.fine("Finished processing FlexOrder: " + flexOrder.getConversationID()); + } else { + LOG.warning("Received unknown message type: " + messageType.getSimpleName()); } - - @Override - public String getAuthorizationHeader(UftpParticipant uftpParticipant) { - LOG.fine("Getting authorization header for: " + uftpParticipant); - String authorization = fetchBearerToken(); - if (authorization.isBlank()) { - LOG.warning("No OAuth2 bearer token available for authorization header of " + uftpParticipant); + LOG.info( + "Finished processing message with conversation ID: " + + message.payloadMessage().getConversationID() + + " type " + + message.payloadMessage().getClass().getSimpleName()); + } + + @Override + public void notifyNewOutgoingMessage(OutgoingUftpMessage message) { + LOG.info( + "Sending message: " + + message.payloadMessage().getConversationID() + + " type " + + message.payloadMessage().getClass().getSimpleName()); + try { + if (message.payloadMessage() instanceof FlexRequestResponse + || message.payloadMessage() instanceof FlexOffer + || message.payloadMessage() instanceof FlexOrderResponse) { + + if (LOG.isLoggable(Level.FINE)) { + LOG.fine("Content to send: " + serializer.toXml(message.payloadMessage())); } - return authorization; - } - protected String fetchBearerToken() { - try { - try (Response response = gopacsAuthResource.getAccessToken( - "client_credentials", - this.clientId, - this.clientSecret - )) { - if (response.getStatus() == 200) { - String responseBody = response.readEntity(String.class); - OAuth2TokenResponse tokenResponse = objectMapper.readValue(responseBody, OAuth2TokenResponse.class); - return "Bearer " + tokenResponse.getAccessToken(); - } - LOG.warning("OAuth2 token request failed with status: " + response.getStatus()); - return ""; - } - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to obtain OAuth2 access token", e); - return ""; - } + String recipientDomain = message.payloadMessage().getRecipientDomain(); + uftpSendMessageService.attemptToSendMessage( + message.payloadMessage(), + new SigningDetails( + message.sender(), + this.privateKey, + new UftpParticipant( + recipientDomain, + UftpRoleInformation.getRecipientRoleBySenderRole(message.sender().role())))); + } + LOG.fine("Finished sending message: " + message.payloadMessage().getConversationID()); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Failed to send message", e); } - - protected void handleFlexRequestMessage(UftpParticipant participant, FlexRequest flexRequest) { - LOG.fine("Received Flex Request: " + flexRequest.getConversationID()); - int year = flexRequest.getPeriod().getYear(); - int month = flexRequest.getPeriod().getMonthValue(); - int day = flexRequest.getPeriod().getDayOfMonth(); - List> powerImportMaxGopacsDatapoints = new ArrayList<>(); - List> powerExportMaxGopacsDatapoints = new ArrayList<>(); - - for (int i = 0; i < flexRequest.getISPS().size(); i++) { - FlexRequestISPType flexRequestISPType = flexRequest.getISPS().get(i); - LocalTime start = FlexRequestISPTypeHelper.getISPStart(flexRequestISPType.getStart(), year, month, day, flexRequest.getTimeZone()); - double importMax = flexRequestISPType.getMaxPower() == 0L ? 0 : (double) flexRequestISPType.getMaxPower() / 1000.0F; - double exportMax = flexRequestISPType.getMinPower() == 0L ? 0 : (double) Math.abs(flexRequestISPType.getMinPower()) / 1000.0F; - LOG.fine("importMax:" + importMax + " exportMax:" + exportMax); - this.schedulePowerUpdate(start, EmsGOPACSAsset.POWER_MAXIMUM_FLEX_REQUEST.getName(), exportMax); - this.schedulePowerUpdate(start, EmsGOPACSAsset.POWER_MINIMUM_FLEX_REQUEST.getName(), exportMax); - - // Correct usage of ZoneId.of instead of ZoneOffset.of - ZoneId zoneId = ZoneId.of(flexRequest.getTimeZone()); - long startEpochMilli = flexRequest.getPeriod().atTime(start).atZone(zoneId).toInstant().toEpochMilli(); - - powerImportMaxGopacsDatapoints.add(new ValueDatapoint<>(startEpochMilli, importMax)); - powerExportMaxGopacsDatapoints.add(new ValueDatapoint<>(startEpochMilli, exportMax)); - } - - this.setPredictedDataPoints(EmsGOPACSAsset.POWER_MAXIMUM_FLEX_REQUEST.getName(), powerImportMaxGopacsDatapoints); - this.setPredictedDataPoints(EmsGOPACSAsset.POWER_MINIMUM_FLEX_REQUEST.getName(), powerExportMaxGopacsDatapoints); - LOG.fine("Finished processing Flex Request: " + flexRequest); + } + + @Override + public String getAuthorizationHeader(UftpParticipant uftpParticipant) { + LOG.fine("Getting authorization header for: " + uftpParticipant); + String authorization = fetchBearerToken(); + if (authorization.isBlank()) { + LOG.warning( + "No OAuth2 bearer token available for authorization header of " + uftpParticipant); } - - protected void handleFlexOfferResponseMessage(UftpParticipant participant, FlexOfferResponse flexOfferResponse) { - // Handle the response to our FlexOffer - if (flexOfferResponse.getResult() == AcceptedRejectedType.ACCEPTED) { - LOG.info("FlexOffer accepted: " + flexOfferResponse.getConversationID()); - } else { - LOG.warning("FlexOffer rejected: " + flexOfferResponse.getConversationID()); + return authorization; + } + + protected String fetchBearerToken() { + try { + try (Response response = + gopacsAuthResource.getAccessToken( + "client_credentials", this.clientId, this.clientSecret)) { + if (response.getStatus() == 200) { + String responseBody = response.readEntity(String.class); + OAuth2TokenResponse tokenResponse = + objectMapper.readValue(responseBody, OAuth2TokenResponse.class); + return "Bearer " + tokenResponse.getAccessToken(); } + LOG.warning("OAuth2 token request failed with status: " + response.getStatus()); + return ""; + } + } catch (Exception e) { + LOG.log(Level.SEVERE, "Failed to obtain OAuth2 access token", e); + return ""; + } + } + + protected void handleFlexRequestMessage(UftpParticipant participant, FlexRequest flexRequest) { + LOG.fine("Received Flex Request: " + flexRequest.getConversationID()); + int year = flexRequest.getPeriod().getYear(); + int month = flexRequest.getPeriod().getMonthValue(); + int day = flexRequest.getPeriod().getDayOfMonth(); + List> powerImportMaxGopacsDatapoints = new ArrayList<>(); + List> powerExportMaxGopacsDatapoints = new ArrayList<>(); + + for (int i = 0; i < flexRequest.getISPS().size(); i++) { + FlexRequestISPType flexRequestISPType = flexRequest.getISPS().get(i); + LocalTime start = + FlexRequestISPTypeHelper.getISPStart( + flexRequestISPType.getStart(), year, month, day, flexRequest.getTimeZone()); + double importMax = + flexRequestISPType.getMaxPower() == 0L + ? 0 + : (double) flexRequestISPType.getMaxPower() / 1000.0F; + double exportMax = + flexRequestISPType.getMinPower() == 0L + ? 0 + : (double) Math.abs(flexRequestISPType.getMinPower()) / 1000.0F; + LOG.fine("importMax:" + importMax + " exportMax:" + exportMax); + this.schedulePowerUpdate( + start, EmsGOPACSAsset.POWER_MAXIMUM_FLEX_REQUEST.getName(), exportMax); + this.schedulePowerUpdate( + start, EmsGOPACSAsset.POWER_MINIMUM_FLEX_REQUEST.getName(), exportMax); + + // Correct usage of ZoneId.of instead of ZoneOffset.of + ZoneId zoneId = ZoneId.of(flexRequest.getTimeZone()); + long startEpochMilli = + flexRequest.getPeriod().atTime(start).atZone(zoneId).toInstant().toEpochMilli(); + + powerImportMaxGopacsDatapoints.add(new ValueDatapoint<>(startEpochMilli, importMax)); + powerExportMaxGopacsDatapoints.add(new ValueDatapoint<>(startEpochMilli, exportMax)); } - protected void handleFlexOrderMessage(UftpParticipant participant, FlexOrder flexOrder) { - LOG.fine("Received FlexOrder for FlexOffer: " + flexOrder.getConversationID()); - - int year = flexOrder.getPeriod().getYear(); - int month = flexOrder.getPeriod().getMonthValue(); - int day = flexOrder.getPeriod().getDayOfMonth(); - List> powerDatapoints = new ArrayList<>(); - List> powerDatapointsFeedin = new ArrayList<>(); - List> powerDatapointsOfftake = new ArrayList<>(); - - for (int i = 0; i < flexOrder.getISPS().size(); i++) { - FlexOrderISPType flexOrderISPType = flexOrder.getISPS().get(i); - LocalTime start = FlexRequestISPTypeHelper.getISPStart(flexOrderISPType.getStart(), year, month, day, flexOrder.getTimeZone()); - double power = flexOrderISPType.getPower() / 1000.0F; - LOG.fine("power:" + power); - this.schedulePowerUpdate(start, EmsGOPACSAsset.CURRENT_POWER_FLEX_REQUEST.getName(), power); - - // Correct usage of ZoneId.of instead of ZoneOffset.of - ZoneId zoneId = ZoneId.of(flexOrder.getTimeZone()); - long startEpochMilli = flexOrder.getPeriod().atTime(start).atZone(zoneId).toInstant().toEpochMilli(); - - powerDatapoints.add(new ValueDatapoint<>(startEpochMilli, power)); - - // NOTE: this logic assumes offtake MaxPower is always higher than 0 Watt. If this is not the case this logic needs to be changed - if (power > 0.0) { - powerDatapointsOfftake.add(new ValueDatapoint<>(startEpochMilli, power)); - } else { - powerDatapointsFeedin.add(new ValueDatapoint<>(startEpochMilli, power)); - } - } - - if (!powerDatapointsOfftake.isEmpty()) { - this.setPredictedDataPoints(EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), powerDatapointsOfftake); - } else if (!powerDatapointsFeedin.isEmpty()) { - this.setPredictedDataPoints(EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), powerDatapointsFeedin); - } + this.setPredictedDataPoints( + EmsGOPACSAsset.POWER_MAXIMUM_FLEX_REQUEST.getName(), powerImportMaxGopacsDatapoints); + this.setPredictedDataPoints( + EmsGOPACSAsset.POWER_MINIMUM_FLEX_REQUEST.getName(), powerExportMaxGopacsDatapoints); + LOG.fine("Finished processing Flex Request: " + flexRequest); + } + + protected void handleFlexOfferResponseMessage( + UftpParticipant participant, FlexOfferResponse flexOfferResponse) { + // Handle the response to our FlexOffer + if (flexOfferResponse.getResult() == AcceptedRejectedType.ACCEPTED) { + LOG.info("FlexOffer accepted: " + flexOfferResponse.getConversationID()); + } else { + LOG.warning("FlexOffer rejected: " + flexOfferResponse.getConversationID()); + } + } + + protected void handleFlexOrderMessage(UftpParticipant participant, FlexOrder flexOrder) { + LOG.fine("Received FlexOrder for FlexOffer: " + flexOrder.getConversationID()); + + int year = flexOrder.getPeriod().getYear(); + int month = flexOrder.getPeriod().getMonthValue(); + int day = flexOrder.getPeriod().getDayOfMonth(); + List> powerDatapoints = new ArrayList<>(); + List> powerDatapointsFeedin = new ArrayList<>(); + List> powerDatapointsOfftake = new ArrayList<>(); + + for (int i = 0; i < flexOrder.getISPS().size(); i++) { + FlexOrderISPType flexOrderISPType = flexOrder.getISPS().get(i); + LocalTime start = + FlexRequestISPTypeHelper.getISPStart( + flexOrderISPType.getStart(), year, month, day, flexOrder.getTimeZone()); + double power = flexOrderISPType.getPower() / 1000.0F; + LOG.fine("power:" + power); + this.schedulePowerUpdate(start, EmsGOPACSAsset.CURRENT_POWER_FLEX_REQUEST.getName(), power); + + // Correct usage of ZoneId.of instead of ZoneOffset.of + ZoneId zoneId = ZoneId.of(flexOrder.getTimeZone()); + long startEpochMilli = + flexOrder.getPeriod().atTime(start).atZone(zoneId).toInstant().toEpochMilli(); + + powerDatapoints.add(new ValueDatapoint<>(startEpochMilli, power)); + + // NOTE: this logic assumes offtake MaxPower is always higher than 0 Watt. If this is not the + // case this logic needs to be changed + if (power > 0.0) { + powerDatapointsOfftake.add(new ValueDatapoint<>(startEpochMilli, power)); + } else { + powerDatapointsFeedin.add(new ValueDatapoint<>(startEpochMilli, power)); + } + } - this.setPredictedDataPoints(EmsGOPACSAsset.CURRENT_POWER_FLEX_REQUEST.getName(), powerDatapoints); + if (!powerDatapointsOfftake.isEmpty()) { + this.setPredictedDataPoints( + EmsGOPACSAsset.POWER_LIMIT_MAXIMUM_PROFILE_FLEX_ORDER.getName(), powerDatapointsOfftake); + } else if (!powerDatapointsFeedin.isEmpty()) { + this.setPredictedDataPoints( + EmsGOPACSAsset.POWER_LIMIT_MINIMUM_PROFILE_FLEX_ORDER.getName(), powerDatapointsFeedin); } - protected void sendFlexOffer(UftpParticipant recipient, FlexRequest flexRequest) { - try { - FlexOffer flexOffer = new FlexOffer(); - flexOffer.setVersion("3.0.0"); - flexOffer.setSenderDomain(flexRequest.getRecipientDomain()); - flexOffer.setRecipientDomain(flexRequest.getSenderDomain()); - flexOffer.setTimeStamp(OffsetDateTime.now(ZoneId.systemDefault())); - flexOffer.setMessageID(UUID.randomUUID().toString()); - flexOffer.setConversationID(flexRequest.getConversationID()); - flexOffer.setISPDuration(flexRequest.getISPDuration()); - flexOffer.setTimeZone(flexRequest.getTimeZone()); - flexOffer.setPeriod(flexRequest.getPeriod()); - flexOffer.setCongestionPoint(flexRequest.getCongestionPoint()); - flexOffer.setExpirationDateTime(flexRequest.getExpirationDateTime()); - flexOffer.setFlexRequestMessageID(flexRequest.getMessageID()); - flexOffer.setContractID(flexRequest.getContractID()); - flexOffer.setBaselineReference(""); - flexOffer.setCurrency("EUR"); - - // Set ISPs based on the FlexRequest ISPs - List currentOptionIsps = new ArrayList<>(); - long previousPower = 0L, currentPower = 0L; - boolean firstIsp = true; - - for (FlexRequestISPType requestIsp : flexRequest.getISPS()) { - FlexOfferOptionISPType offerIsp = new FlexOfferOptionISPType(); - offerIsp.setStart(requestIsp.getStart()); - offerIsp.setDuration(requestIsp.getDuration()); - // Set power values based on your available flexibility - currentPower = calculatePower(requestIsp); - offerIsp.setPower(currentPower); - - // Add the ISP to the current option - currentOptionIsps.add(offerIsp); - - // Check if we need to create a new FlexOfferOptionType - // when power changes from negative to positive or vice versa - // Skip the check for the first ISP - if (!firstIsp && ((previousPower < 0 && currentPower >= 0) || (previousPower >= 0 && currentPower < 0))) { - // Create a new FlexOfferOptionType for the previous set of ISPs with the same sign - FlexOfferOptionType flexOfferOptionType = new FlexOfferOptionType(); - flexOfferOptionType.setOptionReference(UUID.randomUUID().toString()); - flexOfferOptionType.setPrice(new BigDecimal("0.00")); - - // Remove the current ISP from the list as it belongs to the next option - List previousOptionIsps = new ArrayList<>(currentOptionIsps); - previousOptionIsps.removeLast(); - - flexOfferOptionType.getISPS().addAll(previousOptionIsps); - flexOffer.getOfferOptions().add(flexOfferOptionType); - - // Start a new list with just the current ISP - currentOptionIsps = new ArrayList<>(); - currentOptionIsps.add(offerIsp); - } - - previousPower = currentPower; - firstIsp = false; - } - - // Create the final FlexOfferOptionType with any remaining ISPs - if (!currentOptionIsps.isEmpty()) { - FlexOfferOptionType finalOptionType = new FlexOfferOptionType(); - finalOptionType.setOptionReference(UUID.randomUUID().toString()); - finalOptionType.setPrice(new BigDecimal("0.00")); - finalOptionType.getISPS().addAll(currentOptionIsps); - flexOffer.getOfferOptions().add(finalOptionType); - } - - // Send the FlexOffer - UftpParticipant sender = new UftpParticipant(flexRequest.getRecipientDomain(), USEFRoleType.AGR); - notifyNewOutgoingMessage(OutgoingUftpMessage.create(sender, flexOffer)); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to send FlexOffer", e); + this.setPredictedDataPoints( + EmsGOPACSAsset.CURRENT_POWER_FLEX_REQUEST.getName(), powerDatapoints); + } + + protected void sendFlexOffer(UftpParticipant recipient, FlexRequest flexRequest) { + try { + FlexOffer flexOffer = new FlexOffer(); + flexOffer.setVersion("3.0.0"); + flexOffer.setSenderDomain(flexRequest.getRecipientDomain()); + flexOffer.setRecipientDomain(flexRequest.getSenderDomain()); + flexOffer.setTimeStamp(OffsetDateTime.now(ZoneId.systemDefault())); + flexOffer.setMessageID(UUID.randomUUID().toString()); + flexOffer.setConversationID(flexRequest.getConversationID()); + flexOffer.setISPDuration(flexRequest.getISPDuration()); + flexOffer.setTimeZone(flexRequest.getTimeZone()); + flexOffer.setPeriod(flexRequest.getPeriod()); + flexOffer.setCongestionPoint(flexRequest.getCongestionPoint()); + flexOffer.setExpirationDateTime(flexRequest.getExpirationDateTime()); + flexOffer.setFlexRequestMessageID(flexRequest.getMessageID()); + flexOffer.setContractID(flexRequest.getContractID()); + flexOffer.setBaselineReference(""); + flexOffer.setCurrency("EUR"); + + // Set ISPs based on the FlexRequest ISPs + List currentOptionIsps = new ArrayList<>(); + long previousPower = 0L, currentPower = 0L; + boolean firstIsp = true; + + for (FlexRequestISPType requestIsp : flexRequest.getISPS()) { + FlexOfferOptionISPType offerIsp = new FlexOfferOptionISPType(); + offerIsp.setStart(requestIsp.getStart()); + offerIsp.setDuration(requestIsp.getDuration()); + // Set power values based on your available flexibility + currentPower = calculatePower(requestIsp); + offerIsp.setPower(currentPower); + + // Add the ISP to the current option + currentOptionIsps.add(offerIsp); + + // Check if we need to create a new FlexOfferOptionType + // when power changes from negative to positive or vice versa + // Skip the check for the first ISP + if (!firstIsp + && ((previousPower < 0 && currentPower >= 0) + || (previousPower >= 0 && currentPower < 0))) { + // Create a new FlexOfferOptionType for the previous set of ISPs with the same sign + FlexOfferOptionType flexOfferOptionType = new FlexOfferOptionType(); + flexOfferOptionType.setOptionReference(UUID.randomUUID().toString()); + flexOfferOptionType.setPrice(new BigDecimal("0.00")); + + // Remove the current ISP from the list as it belongs to the next option + List previousOptionIsps = new ArrayList<>(currentOptionIsps); + previousOptionIsps.removeLast(); + + flexOfferOptionType.getISPS().addAll(previousOptionIsps); + flexOffer.getOfferOptions().add(flexOfferOptionType); + + // Start a new list with just the current ISP + currentOptionIsps = new ArrayList<>(); + currentOptionIsps.add(offerIsp); } - } - protected void schedulePowerUpdate(LocalTime start, String attributeName, double power) { - long currentTimeMillis = timerService.getCurrentTimeMillis(); - long ispStartMillis = start.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - long delay = ispStartMillis - currentTimeMillis; - scheduledExecutorService.schedule(() -> updatePowerValues(attributeName, power), delay, TimeUnit.MILLISECONDS); + previousPower = currentPower; + firstIsp = false; + } + + // Create the final FlexOfferOptionType with any remaining ISPs + if (!currentOptionIsps.isEmpty()) { + FlexOfferOptionType finalOptionType = new FlexOfferOptionType(); + finalOptionType.setOptionReference(UUID.randomUUID().toString()); + finalOptionType.setPrice(new BigDecimal("0.00")); + finalOptionType.getISPS().addAll(currentOptionIsps); + flexOffer.getOfferOptions().add(finalOptionType); + } + + // Send the FlexOffer + UftpParticipant sender = + new UftpParticipant(flexRequest.getRecipientDomain(), USEFRoleType.AGR); + notifyNewOutgoingMessage(OutgoingUftpMessage.create(sender, flexOffer)); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Failed to send FlexOffer", e); } - - protected void updatePowerValues(String attributeName, double power) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(electricitySupplierAssetId, attributeName, power), getClass().getSimpleName()); + } + + protected void schedulePowerUpdate(LocalTime start, String attributeName, double power) { + long currentTimeMillis = timerService.getCurrentTimeMillis(); + long ispStartMillis = + start.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long delay = ispStartMillis - currentTimeMillis; + scheduledExecutorService.schedule( + () -> updatePowerValues(attributeName, power), delay, TimeUnit.MILLISECONDS); + } + + protected void updatePowerValues(String attributeName, double power) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent(electricitySupplierAssetId, attributeName, power), + getClass().getSimpleName()); + } + + protected void setPredictedDataPoints( + String attributeName, List> valuesAndTimestamps) { + assetPredictedDatapointService.updateValues( + electricitySupplierAssetId, attributeName, valuesAndTimestamps); + } + + protected long calculatePower(FlexRequestISPType requestIsp) { + // TODO: Implement power calculation logic here + return requestIsp.getMaxPower() == 0 ? requestIsp.getMinPower() : requestIsp.getMaxPower(); + } + + /** + * Only act on flex messages whose congestion point matches this handler's contracted EAN. Returns + * false (and logs a warning) for out-of-scope messages so they are rejected (with a rejection + * response, but without asset mutation or FlexOffer). See issue #28 for full per-contract/role + * scoping via the V3 contracts endpoint. + */ + protected boolean isWithinContractedScope( + String messageType, String conversationId, String congestionPoint) { + if (Objects.equals(toCongestionPoint(contractedEAN), toCongestionPoint(congestionPoint))) { + return true; } - - protected void setPredictedDataPoints(String attributeName, List> valuesAndTimestamps) { - assetPredictedDatapointService.updateValues(electricitySupplierAssetId, attributeName, valuesAndTimestamps); + LOG.warning( + "Rejecting " + + messageType + + " " + + conversationId + + " for out-of-scope congestion point " + + congestionPoint + + " (contracted EAN " + + contractedEAN + + ")"); + return false; + } + + /** + * Converts an EAN / congestion-point identifier to the canonical GOPACS congestion-point format + * "ean.<code>" (for example "ean.265987182507322951"). GOPACS flex messages always carry + * the congestion point with the "ean." prefix, whereas the contracted EAN may be configured with + * or without it; canonicalising both sides keeps the scope check correct either way. + */ + protected static String toCongestionPoint(String ean) { + if (ean == null) { + return null; } - - protected long calculatePower(FlexRequestISPType requestIsp) { - //TODO: Implement power calculation logic here - return requestIsp.getMaxPower() == 0 ? requestIsp.getMinPower() : requestIsp.getMaxPower(); + String trimmed = ean.trim(); + if (trimmed.regionMatches(true, 0, EAN_PREFIX, 0, EAN_PREFIX.length())) { + // Already prefixed (any case) — normalise the prefix to its canonical lower-case form. + return EAN_PREFIX + trimmed.substring(EAN_PREFIX.length()); } - - /** - * Only act on flex messages whose congestion point matches this handler's contracted EAN. Returns - * false (and logs a warning) for out-of-scope messages so they are rejected (with a rejection - * response, but without asset mutation or FlexOffer). See issue #28 for full per-contract/role - * scoping via the V3 contracts endpoint. - */ - protected boolean isWithinContractedScope(String messageType, String conversationId, String congestionPoint) { - if (Objects.equals(toCongestionPoint(contractedEAN), toCongestionPoint(congestionPoint))) { - return true; - } - LOG.warning("Rejecting " + messageType + " " + conversationId + " for out-of-scope congestion point " - + congestionPoint + " (contracted EAN " + contractedEAN + ")"); - return false; + return EAN_PREFIX + trimmed; + } + + protected void processRawMessage(String transportXml) { + try { + SignedMessage signedMessage = serializer.fromSignedXml(transportXml); + String payloadXml = cryptoService.verifySignedMessage(signedMessage); + if (LOG.isLoggable(Level.FINE)) { + LOG.fine("Received message:" + payloadXml); + } + PayloadMessageType payloadMessage = serializer.fromPayloadXml(payloadXml); + + // Re-assert EAN scoping that the V2 participant lookup enforced implicitly. The V3 lookup + // resolves any participant domain, so a validly signed flex message from a participant + // outside + // this handler's contracted EAN would otherwise be applied to the asset. Full + // per-contract/role + // scoping via the V3 contracts endpoint is tracked in issue #28. + // Out-of-scope messages are not applied to the asset and get no FlexOffer, but UFTP still + // requires a response: reject with a reason instead of leaving the DSO's conversation + // dangling. + if (payloadMessage instanceof FlexMessageType flexMessage + && !isWithinContractedScope( + payloadMessage.getClass().getSimpleName(), + payloadMessage.getConversationID(), + flexMessage.getCongestionPoint())) { + PayloadMessageType rejection = + UftpValidationResponseCreator.getResponseForMessage( + payloadMessage, + ValidationResult.rejection("CongestionPoint not within contracted scope")); + UftpParticipant sender = new UftpParticipant(signedMessage); + UftpParticipant responder = + new UftpParticipant( + payloadMessage.getRecipientDomain(), + UftpRoleInformation.getRecipientRoleBySenderRole(sender.role())); + // Send delayed so the HTTP 200 on the transport call goes out first, like the accepted path + scheduledExecutorService.schedule( + () -> notifyNewOutgoingMessage(OutgoingUftpMessage.create(responder, rejection)), + this.responseDelaySeconds, + TimeUnit.SECONDS); + return; + } + + var incomingUftpMessage = + IncomingUftpMessage.create( + new UftpParticipant(signedMessage), payloadMessage, transportXml, payloadXml); + notifyNewIncomingMessage(incomingUftpMessage); + + // Send response delayed to ensure HTTP response is sent first + scheduledExecutorService.schedule( + () -> { + uftpReceivedMessageService.process(incomingUftpMessage); + }, + this.responseDelaySeconds, + TimeUnit.SECONDS); // 10s delay to ensure HTTP response is sent + + // Check if the message is a FlexRequest and schedule sendFlexOffer with delay + if (payloadMessage instanceof FlexRequest flexRequest) { + UftpParticipant participant = new UftpParticipant(signedMessage); + + // Schedule FlexOffer to be sent after a short delay to ensure HTTP response is sent first + scheduledExecutorService.schedule( + () -> { + try { + sendFlexOffer(participant, flexRequest); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Error sending delayed FlexOffer", e); + } + }, + this.flexOfferDelaySeconds, + TimeUnit + .SECONDS); // 30s delay to ensure FlexRequestResponse is sent and processed by the + // other party + } + } catch (UftpConnectorException e) { + LOG.log(Level.SEVERE, "Error processing raw message", e); + Throwable rootCause = e; + while (rootCause.getCause() != null && rootCause.getCause() != rootCause) { + rootCause = rootCause.getCause(); + } + String errorMessage = rootCause.getMessage(); + if (errorMessage == null) { + errorMessage = "Invalid message format"; + } + throw new WebApplicationException(errorMessage, Response.Status.BAD_REQUEST); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Error processing raw message", e); + // Do not expose internal exception details to the client + String errorMessage = "Internal server error occurred"; + throw new WebApplicationException(errorMessage, Response.Status.INTERNAL_SERVER_ERROR); } + } - /** - * Converts an EAN / congestion-point identifier to the canonical GOPACS congestion-point format - * "ean.<code>" (for example "ean.265987182507322951"). GOPACS flex messages always carry the - * congestion point with the "ean." prefix, whereas the contracted EAN may be configured with or - * without it; canonicalising both sides keeps the scope check correct either way. - */ - protected static String toCongestionPoint(String ean) { - if (ean == null) { - return null; - } - String trimmed = ean.trim(); - if (trimmed.regionMatches(true, 0, EAN_PREFIX, 0, EAN_PREFIX.length())) { - // Already prefixed (any case) — normalise the prefix to its canonical lower-case form. - return EAN_PREFIX + trimmed.substring(EAN_PREFIX.length()); - } - return EAN_PREFIX + trimmed; + @Override + public Optional getParticipantInformation( + USEFRoleType role, String domain) { + if (participants.containsKey(domain)) { + return Optional.of(participants.get(domain)); } - protected void processRawMessage(String transportXml) { - try { - SignedMessage signedMessage = serializer.fromSignedXml(transportXml); - String payloadXml = cryptoService.verifySignedMessage(signedMessage); - if (LOG.isLoggable(Level.FINE)) { - LOG.fine("Received message:" + payloadXml); - } - PayloadMessageType payloadMessage = serializer.fromPayloadXml(payloadXml); - - // Re-assert EAN scoping that the V2 participant lookup enforced implicitly. The V3 lookup - // resolves any participant domain, so a validly signed flex message from a participant outside - // this handler's contracted EAN would otherwise be applied to the asset. Full per-contract/role - // scoping via the V3 contracts endpoint is tracked in issue #28. - // Out-of-scope messages are not applied to the asset and get no FlexOffer, but UFTP still - // requires a response: reject with a reason instead of leaving the DSO's conversation dangling. - if (payloadMessage instanceof FlexMessageType flexMessage - && !isWithinContractedScope(payloadMessage.getClass().getSimpleName(), - payloadMessage.getConversationID(), flexMessage.getCongestionPoint())) { - PayloadMessageType rejection = UftpValidationResponseCreator.getResponseForMessage( - payloadMessage, ValidationResult.rejection("CongestionPoint not within contracted scope")); - UftpParticipant sender = new UftpParticipant(signedMessage); - UftpParticipant responder = new UftpParticipant(payloadMessage.getRecipientDomain(), - UftpRoleInformation.getRecipientRoleBySenderRole(sender.role())); - // Send delayed so the HTTP 200 on the transport call goes out first, like the accepted path - scheduledExecutorService.schedule(() -> - notifyNewOutgoingMessage(OutgoingUftpMessage.create(responder, rejection)), - this.responseDelaySeconds, TimeUnit.SECONDS); - return; - } - - var incomingUftpMessage = IncomingUftpMessage.create(new UftpParticipant(signedMessage), payloadMessage, transportXml, payloadXml); - notifyNewIncomingMessage(incomingUftpMessage); - - // Send response delayed to ensure HTTP response is sent first - scheduledExecutorService.schedule(() -> { - uftpReceivedMessageService.process(incomingUftpMessage); - }, this.responseDelaySeconds, TimeUnit.SECONDS); // 10s delay to ensure HTTP response is sent - - // Check if the message is a FlexRequest and schedule sendFlexOffer with delay - if (payloadMessage instanceof FlexRequest flexRequest) { - UftpParticipant participant = new UftpParticipant(signedMessage); - - // Schedule FlexOffer to be sent after a short delay to ensure HTTP response is sent first - scheduledExecutorService.schedule(() -> { - try { - sendFlexOffer(participant, flexRequest); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Error sending delayed FlexOffer", e); - } - }, this.flexOfferDelaySeconds, TimeUnit.SECONDS); // 30s delay to ensure FlexRequestResponse is sent and processed by the other party - } - } catch (UftpConnectorException e) { - LOG.log(Level.SEVERE, "Error processing raw message", e); - Throwable rootCause = e; - while (rootCause.getCause() != null && rootCause.getCause() != rootCause) { - rootCause = rootCause.getCause(); - } - String errorMessage = rootCause.getMessage(); - if (errorMessage == null) { - errorMessage = "Invalid message format"; - } - throw new WebApplicationException(errorMessage, Response.Status.BAD_REQUEST); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Error processing raw message", e); - // Do not expose internal exception details to the client - String errorMessage = "Internal server error occurred"; - throw new WebApplicationException(errorMessage, Response.Status.INTERNAL_SERVER_ERROR); - } + String authorization = fetchBearerToken(); + if (authorization.isBlank()) { + LOG.warning( + "Skipping participant lookup for " + domain + ": no OAuth2 bearer token available"); + return Optional.empty(); } - - @Override - public Optional getParticipantInformation(USEFRoleType role, String domain) { - if (participants.containsKey(domain)) { - return Optional.of(participants.get(domain)); - } - - String authorization = fetchBearerToken(); - if (authorization.isBlank()) { - LOG.warning("Skipping participant lookup for " + domain + ": no OAuth2 bearer token available"); - return Optional.empty(); - } - try (Response response = gopacsAddressBookResource.fetchParticipantByDomain(authorization, domain)) { - int status = response != null ? response.getStatus() : -1; - if (status == 200) { - ParticipantView view = response.readEntity(ParticipantView.class); - UftpParticipantInformation info = new UftpParticipantInformation(view.domain(), view.publicKey(), this.gopacsBrokerUrl + "/shapeshifter/api/v3/message", true); - participants.put(view.domain(), info); - return Optional.of(info); - } - if (status == 404) { - LOG.fine("Participant not found in GOPACS address book: " + domain); - } else { - LOG.severe("Unexpected status " + status + " when requesting participant information for " + domain); - } - } catch (Exception e) { - Throwable cause = e.getCause() instanceof IOException ? e.getCause() : e; - LOG.log(Level.SEVERE, "Exception when requesting participant information for " + domain, cause); - } - return Optional.empty(); + try (Response response = + gopacsAddressBookResource.fetchParticipantByDomain(authorization, domain)) { + int status = response != null ? response.getStatus() : -1; + if (status == 200) { + ParticipantView view = response.readEntity(ParticipantView.class); + UftpParticipantInformation info = + new UftpParticipantInformation( + view.domain(), + view.publicKey(), + this.gopacsBrokerUrl + "/shapeshifter/api/v3/message", + true); + participants.put(view.domain(), info); + return Optional.of(info); + } + if (status == 404) { + LOG.fine("Participant not found in GOPACS address book: " + domain); + } else { + LOG.severe( + "Unexpected status " + + status + + " when requesting participant information for " + + domain); + } + } catch (Exception e) { + Throwable cause = e.getCause() instanceof IOException ? e.getCause() : e; + LOG.log( + Level.SEVERE, "Exception when requesting participant information for " + domain, cause); } + return Optional.empty(); + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSRedispatchHandler.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSRedispatchHandler.java index 2d36388..96c300d 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSRedispatchHandler.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSRedispatchHandler.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,15 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static org.openremote.container.web.WebTargetBuilder.createClient; +import static org.openremote.model.syslog.SyslogCategory.API; + import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.type.TypeReference; @@ -26,6 +28,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.ws.rs.core.Response; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.openremote.container.timer.TimerService; import org.openremote.extension.ems.agent.EmsGOPACSAsset; @@ -39,508 +47,604 @@ import org.openremote.model.datapoint.ValueDatapoint; import org.openremote.model.syslog.SyslogCategory; -import java.util.*; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static org.openremote.container.web.WebTargetBuilder.createClient; -import static org.openremote.model.syslog.SyslogCategory.API; - /** - * Handles GOPACS Redispatch (intraday congestion management) by polling for - * congestion announcements, checking EAN solving effectivity, calculating - * suggested bid parameters, and managing the operator confirmation workflow. + * Handles GOPACS Redispatch (intraday congestion management) by polling for congestion + * announcements, checking EAN solving effectivity, calculating suggested bid parameters, and + * managing the operator confirmation workflow. */ public class GOPACSRedispatchHandler { - private static final Logger LOG = SyslogCategory.getLogger(API, GOPACSRedispatchHandler.class); - - public static final String GOPACS_REDISPATCH_API_KEY = "GOPACS_REDISPATCH_API_KEY"; - public static final String GOPACS_REDISPATCH_URL = "GOPACS_REDISPATCH_URL"; - public static final String DEFAULT_GOPACS_REDISPATCH_URL = "https://idcons.gopacs-services.eu"; - public static final String GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES = "GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES"; - public static final String DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES = "5"; - - public static final String ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT = "CONGESTIONMANAGEMENT"; - public static final String ANNOUNCEMENT_STATE_OPEN = "ANNOUNCEMENT_OPEN"; - public static final String COMPLIANCE_TYPE_MANDATORY = "MANDATORY"; - public static final String BID_STATUS_NONE = "NONE"; - public static final String BID_STATUS_PENDING_CONFIRMATION = "PENDING_CONFIRMATION"; - public static final String BID_STATUS_CONFIRMED = "CONFIRMED"; - - protected record EanEffectivityResult( - String matchedCategory, - List effectivities - ) {} - - protected final String contractedEAN; - protected final String assetId; - protected final String realm; - - protected final AssetProcessingService assetProcessingService; - protected final AssetStorageService assetStorageService; - protected final AssetPredictedDatapointService assetPredictedDatapointService; - protected final ScheduledExecutorService scheduledExecutorService; - protected final TimerService timerService; - - protected final ResteasyClient client; - protected final GOPACSAnnouncementResource announcementResource; - protected final GOPACSEanEffectivityResource eanEffectivityResource; - - protected final ObjectMapper objectMapper; - protected final String apiKey; - protected final int pollIntervalMinutes; - - private static final int MAX_RECORDED_ANNOUNCEMENT_IDS = 10_000; - - private ScheduledFuture pollingFuture; - private String lastProcessedAnnouncementId; - // Bounded LRU set so a long-running handler does not accumulate every announcement ID it has ever seen. - private final Set recordedAnnouncementIds = Collections.newSetFromMap( - new LinkedHashMap<>(16, 0.75f, false) { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_RECORDED_ANNOUNCEMENT_IDS; - } - }); - - public static class Factory { - protected Container container; - - public Factory(Container container) { - this.container = container; - } - - public GOPACSRedispatchHandler createHandler(String contractedEan, String realm, String assetId) { - return new GOPACSRedispatchHandler(contractedEan, realm, assetId, container); - } - } - - protected GOPACSRedispatchHandler(String contractedEAN, String realm, String assetId, Container container) { - this.contractedEAN = contractedEAN; - this.realm = realm; - this.assetId = assetId; - - this.assetProcessingService = container.getService(AssetProcessingService.class); - this.assetStorageService = container.getService(AssetStorageService.class); - this.assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); - this.scheduledExecutorService = container.getScheduledExecutor(); - this.timerService = container.getService(TimerService.class); - - this.apiKey = container.getConfig().get(GOPACS_REDISPATCH_API_KEY); - // GOPACS recommends to poll 5 or more minutes apart - String pollIntervalConfig = container.getConfig().getOrDefault( - GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES, DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES); - int parsedPollInterval; - try { - parsedPollInterval = Integer.parseInt(pollIntervalConfig); - } catch (NumberFormatException e) { - parsedPollInterval = Integer.parseInt(DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES); - LOG.warning("Invalid " + GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES + " value '" + pollIntervalConfig - + "', falling back to default " + parsedPollInterval + " minutes"); - } - this.pollIntervalMinutes = Math.max(5, parsedPollInterval); - - String redispatchUrl = container.getConfig().getOrDefault(GOPACS_REDISPATCH_URL, DEFAULT_GOPACS_REDISPATCH_URL); - - this.client = createClient(org.openremote.container.Container.EXECUTOR); - this.announcementResource = client.target(redispatchUrl).proxy(GOPACSAnnouncementResource.class); - this.eanEffectivityResource = client.target(redispatchUrl).proxy(GOPACSEanEffectivityResource.class); + private static final Logger LOG = SyslogCategory.getLogger(API, GOPACSRedispatchHandler.class); + + public static final String GOPACS_REDISPATCH_API_KEY = "GOPACS_REDISPATCH_API_KEY"; + public static final String GOPACS_REDISPATCH_URL = "GOPACS_REDISPATCH_URL"; + public static final String DEFAULT_GOPACS_REDISPATCH_URL = "https://idcons.gopacs-services.eu"; + public static final String GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES = + "GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES"; + public static final String DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES = "5"; + + public static final String ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT = "CONGESTIONMANAGEMENT"; + public static final String ANNOUNCEMENT_STATE_OPEN = "ANNOUNCEMENT_OPEN"; + public static final String COMPLIANCE_TYPE_MANDATORY = "MANDATORY"; + public static final String BID_STATUS_NONE = "NONE"; + public static final String BID_STATUS_PENDING_CONFIRMATION = "PENDING_CONFIRMATION"; + public static final String BID_STATUS_CONFIRMED = "CONFIRMED"; + + protected record EanEffectivityResult( + String matchedCategory, List effectivities) {} + + protected final String contractedEAN; + protected final String assetId; + protected final String realm; + + protected final AssetProcessingService assetProcessingService; + protected final AssetStorageService assetStorageService; + protected final AssetPredictedDatapointService assetPredictedDatapointService; + protected final ScheduledExecutorService scheduledExecutorService; + protected final TimerService timerService; + + protected final ResteasyClient client; + protected final GOPACSAnnouncementResource announcementResource; + protected final GOPACSEanEffectivityResource eanEffectivityResource; + + protected final ObjectMapper objectMapper; + protected final String apiKey; + protected final int pollIntervalMinutes; + + private static final int MAX_RECORDED_ANNOUNCEMENT_IDS = 10_000; + + private ScheduledFuture pollingFuture; + private String lastProcessedAnnouncementId; + // Bounded LRU set so a long-running handler does not accumulate every announcement ID it has ever + // seen. + private final Set recordedAnnouncementIds = + Collections.newSetFromMap( + new LinkedHashMap<>(16, 0.75f, false) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_RECORDED_ANNOUNCEMENT_IDS; + } + }); - this.objectMapper = new ObjectMapper(); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + public static class Factory { + protected Container container; - LOG.info("Initialized GOPACSRedispatchHandler for EAN: " + contractedEAN + " (poll interval: " + pollIntervalMinutes + " min)"); + public Factory(Container container) { + this.container = container; } - public void startPolling() { - if (apiKey == null || apiKey.isBlank()) { - LOG.severe("GOPACS_REDISPATCH_API_KEY not configured; redispatch polling will not start for EAN: " - + contractedEAN + " (the API key is required to resolve EAN effectivity per announcement)"); - return; - } - if (pollingFuture != null && !pollingFuture.isCancelled()) { - LOG.warning("Polling already active for EAN: " + contractedEAN); - return; - } + public GOPACSRedispatchHandler createHandler( + String contractedEan, String realm, String assetId) { + return new GOPACSRedispatchHandler(contractedEan, realm, assetId, container); + } + } + + protected GOPACSRedispatchHandler( + String contractedEAN, String realm, String assetId, Container container) { + this.contractedEAN = contractedEAN; + this.realm = realm; + this.assetId = assetId; + + this.assetProcessingService = container.getService(AssetProcessingService.class); + this.assetStorageService = container.getService(AssetStorageService.class); + this.assetPredictedDatapointService = + container.getService(AssetPredictedDatapointService.class); + this.scheduledExecutorService = container.getScheduledExecutor(); + this.timerService = container.getService(TimerService.class); + + this.apiKey = container.getConfig().get(GOPACS_REDISPATCH_API_KEY); + // GOPACS recommends to poll 5 or more minutes apart + String pollIntervalConfig = + container + .getConfig() + .getOrDefault( + GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES, + DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES); + int parsedPollInterval; + try { + parsedPollInterval = Integer.parseInt(pollIntervalConfig); + } catch (NumberFormatException e) { + parsedPollInterval = Integer.parseInt(DEFAULT_GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES); + LOG.warning( + "Invalid " + + GOPACS_REDISPATCH_POLL_INTERVAL_MINUTES + + " value '" + + pollIntervalConfig + + "', falling back to default " + + parsedPollInterval + + " minutes"); + } + this.pollIntervalMinutes = Math.max(5, parsedPollInterval); + + String redispatchUrl = + container.getConfig().getOrDefault(GOPACS_REDISPATCH_URL, DEFAULT_GOPACS_REDISPATCH_URL); + + this.client = createClient(org.openremote.container.Container.EXECUTOR); + this.announcementResource = + client.target(redispatchUrl).proxy(GOPACSAnnouncementResource.class); + this.eanEffectivityResource = + client.target(redispatchUrl).proxy(GOPACSEanEffectivityResource.class); + + this.objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + + LOG.info( + "Initialized GOPACSRedispatchHandler for EAN: " + + contractedEAN + + " (poll interval: " + + pollIntervalMinutes + + " min)"); + } + + public void startPolling() { + if (apiKey == null || apiKey.isBlank()) { + LOG.severe( + "GOPACS_REDISPATCH_API_KEY not configured; redispatch polling will not start for EAN: " + + contractedEAN + + " (the API key is required to resolve EAN effectivity per announcement)"); + return; + } + if (pollingFuture != null && !pollingFuture.isCancelled()) { + LOG.warning("Polling already active for EAN: " + contractedEAN); + return; + } - pollingFuture = scheduledExecutorService.scheduleAtFixedRate(() -> { - try { + pollingFuture = + scheduledExecutorService.scheduleAtFixedRate( + () -> { + try { pollAndProcess(); - } catch (Exception e) { + } catch (Exception e) { LOG.log(Level.SEVERE, "Error during redispatch poll for EAN: " + contractedEAN, e); - } - }, 0, pollIntervalMinutes, TimeUnit.MINUTES); - - LOG.info("Started redispatch polling for EAN: " + contractedEAN); - } - - public void stopPolling() { - if (pollingFuture != null) { - // Interrupt to abort any in-flight HTTP call before closing the client - pollingFuture.cancel(true); - pollingFuture = null; - } - client.close(); - LOG.info("Stopped redispatch polling for EAN: " + contractedEAN); + } + }, + 0, + pollIntervalMinutes, + TimeUnit.MINUTES); + + LOG.info("Started redispatch polling for EAN: " + contractedEAN); + } + + public void stopPolling() { + if (pollingFuture != null) { + // Interrupt to abort any in-flight HTTP call before closing the client + pollingFuture.cancel(true); + pollingFuture = null; } + client.close(); + LOG.info("Stopped redispatch polling for EAN: " + contractedEAN); + } - protected void pollAndProcess() { - LOG.fine("Redispatch poll started for EAN: " + contractedEAN); + protected void pollAndProcess() { + LOG.fine("Redispatch poll started for EAN: " + contractedEAN); - EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); - if (gopacsAsset == null) { - LOG.warning("GOPACS asset not found: " + assetId); - return; - } + EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); + if (gopacsAsset == null) { + LOG.warning("GOPACS asset not found: " + assetId); + return; + } - LOG.fine("Fetching announcements for EAN: " + contractedEAN); + LOG.fine("Fetching announcements for EAN: " + contractedEAN); - // Fetch announcements - List announcements = fetchAnnouncements(); - if (announcements == null) { - // Fetch failed (HTTP error / exception). Skip this poll and keep existing - // announcement state so a transient connectivity issue does not flap the UI. - LOG.fine("Skipping announcement processing due to fetch failure for EAN: " + contractedEAN); - return; - } - if (announcements.isEmpty()) { - LOG.fine("No announcements found for EAN: " + contractedEAN); - updateLastPoll(); - clearAnnouncementAttributes(); - return; - } + // Fetch announcements + List announcements = fetchAnnouncements(); + if (announcements == null) { + // Fetch failed (HTTP error / exception). Skip this poll and keep existing + // announcement state so a transient connectivity issue does not flap the UI. + LOG.fine("Skipping announcement processing due to fetch failure for EAN: " + contractedEAN); + return; + } + if (announcements.isEmpty()) { + LOG.fine("No announcements found for EAN: " + contractedEAN); + updateLastPoll(); + clearAnnouncementAttributes(); + return; + } - LOG.fine("Fetched " + announcements.size() + " announcements for EAN: " + contractedEAN); + LOG.fine("Fetched " + announcements.size() + " announcements for EAN: " + contractedEAN); - // Record every newly-seen announcement so we keep an audit trail of what GOPACS returned. - for (AnnouncementDto announcement : announcements) { - if (recordedAnnouncementIds.add(announcement.getId())) { - recordAnnouncementHistory(announcement, null, null); - } - } - - // The API call already filters by type/state, but re-check defensively in case - // GOPACS ever returns extras so downstream logic can rely on the invariant. - List relevant = announcements.stream() - .filter(a -> ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT.equals(a.getType())) - .filter(a -> ANNOUNCEMENT_STATE_OPEN.equals(a.getAnnouncementState())) - .toList(); - - if (relevant.isEmpty()) { - LOG.fine("No open CONGESTIONMANAGEMENT announcements for EAN: " + contractedEAN); - updateLastPoll(); - clearAnnouncementAttributes(); - return; - } + // Record every newly-seen announcement so we keep an audit trail of what GOPACS returned. + for (AnnouncementDto announcement : announcements) { + if (recordedAnnouncementIds.add(announcement.getId())) { + recordAnnouncementHistory(announcement, null, null); + } + } - LOG.fine("Found " + relevant.size() + " relevant open announcements for EAN: " + contractedEAN); - - // Check EAN effectivity to find relevant ones - AnnouncementDto selected = null; - String effectivityCategory = null; - EanEffectivityResult selectedEffectivity = null; - - // Check effectivity for all, find ones where our EAN is listed - LOG.fine("Checking EAN effectivity for " + relevant.size() + " announcements"); - for (AnnouncementDto announcement : relevant) { - EanEffectivityResult result = checkEanEffectivity(announcement.getId()); - if (result != null) { - LOG.fine("EAN " + contractedEAN + " found in category '" + result.matchedCategory() + "' for announcement " + announcement.getId()); - // Prefer MANDATORY over VOLUNTARY - if (selected == null || COMPLIANCE_TYPE_MANDATORY.equals(announcement.getComplianceType())) { - selected = announcement; - effectivityCategory = result.matchedCategory(); - selectedEffectivity = result; - } - } - } + // The API call already filters by type/state, but re-check defensively in case + // GOPACS ever returns extras so downstream logic can rely on the invariant. + List relevant = + announcements.stream() + .filter(a -> ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT.equals(a.getType())) + .filter(a -> ANNOUNCEMENT_STATE_OPEN.equals(a.getAnnouncementState())) + .toList(); + + if (relevant.isEmpty()) { + LOG.fine("No open CONGESTIONMANAGEMENT announcements for EAN: " + contractedEAN); + updateLastPoll(); + clearAnnouncementAttributes(); + return; + } - if (selected == null) { - LOG.fine("No relevant announcement found for EAN: " + contractedEAN + " after effectivity check"); - updateLastPoll(); - clearAnnouncementAttributes(); - return; + LOG.fine("Found " + relevant.size() + " relevant open announcements for EAN: " + contractedEAN); + + // Check EAN effectivity to find relevant ones + AnnouncementDto selected = null; + String effectivityCategory = null; + EanEffectivityResult selectedEffectivity = null; + + // Check effectivity for all, find ones where our EAN is listed + LOG.fine("Checking EAN effectivity for " + relevant.size() + " announcements"); + for (AnnouncementDto announcement : relevant) { + EanEffectivityResult result = checkEanEffectivity(announcement.getId()); + if (result != null) { + LOG.fine( + "EAN " + + contractedEAN + + " found in category '" + + result.matchedCategory() + + "' for announcement " + + announcement.getId()); + // Prefer MANDATORY over VOLUNTARY + if (selected == null + || COMPLIANCE_TYPE_MANDATORY.equals(announcement.getComplianceType())) { + selected = announcement; + effectivityCategory = result.matchedCategory(); + selectedEffectivity = result; } + } + } - // Check if this is a new announcement - boolean isNew = !selected.getId().equals(lastProcessedAnnouncementId); - lastProcessedAnnouncementId = selected.getId(); - - if (isNew) { - LOG.info("New redispatch announcement for EAN " + contractedEAN + ": id=" + selected.getId() - + ", compliance=" + selected.getComplianceType() - + ", org=" + selected.getOrganisationName() - + ", effectivity=" + effectivityCategory); - } else { - LOG.fine("Announcement " + selected.getId() + " unchanged for EAN: " + contractedEAN); - } + if (selected == null) { + LOG.fine( + "No relevant announcement found for EAN: " + contractedEAN + " after effectivity check"); + updateLastPoll(); + clearAnnouncementAttributes(); + return; + } - // Update asset attributes with announcement info - updateAnnouncementAttributes(selected, effectivityCategory); + // Check if this is a new announcement + boolean isNew = !selected.getId().equals(lastProcessedAnnouncementId); + lastProcessedAnnouncementId = selected.getId(); + + if (isNew) { + LOG.info( + "New redispatch announcement for EAN " + + contractedEAN + + ": id=" + + selected.getId() + + ", compliance=" + + selected.getComplianceType() + + ", org=" + + selected.getOrganisationName() + + ", effectivity=" + + effectivityCategory); + } else { + LOG.fine("Announcement " + selected.getId() + " unchanged for EAN: " + contractedEAN); + } - // Record history for new announcements - if (isNew) { - recordAnnouncementHistory(selected, effectivityCategory, - selectedEffectivity != null ? selectedEffectivity.effectivities() : null); + // Update asset attributes with announcement info + updateAnnouncementAttributes(selected, effectivityCategory); - // Store remaining problem profile as predicted data points (MW → kW) - storeRequestedPowerProfile(selected); + // Record history for new announcements + if (isNew) { + recordAnnouncementHistory( + selected, + effectivityCategory, + selectedEffectivity != null ? selectedEffectivity.effectivities() : null); - // TODO: populate redispatchSuggestedPower / redispatchSuggestedVolume from - // the linked EnergyOptimisation flex profile + Pierre's bid pricing strategy. - // Tracked separately; attributes intentionally left empty in this PR. + // Store remaining problem profile as predicted data points (MW → kW) + storeRequestedPowerProfile(selected); - // Set status to PENDING_CONFIRMATION for new announcements - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_PENDING_CONFIRMATION); + // TODO: populate redispatchSuggestedPower / redispatchSuggestedVolume from + // the linked EnergyOptimisation flex profile + Pierre's bid pricing strategy. + // Tracked separately; attributes intentionally left empty in this PR. - // Reset confirmation flag - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), false); - } + // Set status to PENDING_CONFIRMATION for new announcements + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_PENDING_CONFIRMATION); - updateLastPoll(); - LOG.fine("Redispatch poll completed for EAN: " + contractedEAN); + // Reset confirmation flag + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), false); } - /** - * Returns the fetched announcements, an empty list if the API confirms there are - * none, or {@code null} if the fetch itself failed (HTTP error / exception). The - * caller uses the null sentinel to skip processing without wiping current state. - */ - protected List fetchAnnouncements() { - try (Response response = announcementResource.fetchAnnouncements( - null, - null, - null, - ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT, - ANNOUNCEMENT_STATE_OPEN - )) { - if (response.getStatus() == 200) { - String body = response.readEntity(String.class); - LOG.fine("GOPACS announcements found: " + body); - return objectMapper.readValue(body, new TypeReference<>() { - }); - } - LOG.warning("Failed to fetch announcements: HTTP " + response.getStatus()); - return null; - } catch (Exception e) { - LOG.log(Level.SEVERE, "Error fetching announcements for EAN: " + contractedEAN, e); - return null; - } + updateLastPoll(); + LOG.fine("Redispatch poll completed for EAN: " + contractedEAN); + } + + /** + * Returns the fetched announcements, an empty list if the API confirms there are none, or {@code + * null} if the fetch itself failed (HTTP error / exception). The caller uses the null sentinel to + * skip processing without wiping current state. + */ + protected List fetchAnnouncements() { + try (Response response = + announcementResource.fetchAnnouncements( + null, null, null, ANNOUNCEMENT_TYPE_CONGESTIONMANAGEMENT, ANNOUNCEMENT_STATE_OPEN)) { + if (response.getStatus() == 200) { + String body = response.readEntity(String.class); + LOG.fine("GOPACS announcements found: " + body); + return objectMapper.readValue(body, new TypeReference<>() {}); + } + LOG.warning("Failed to fetch announcements: HTTP " + response.getStatus()); + return null; + } catch (Exception e) { + LOG.log(Level.SEVERE, "Error fetching announcements for EAN: " + contractedEAN, e); + return null; } - - protected EanEffectivityResult checkEanEffectivity(String announcementId) { - LOG.fine("Checking EAN effectivity for announcement " + announcementId + " and EAN " + contractedEAN); - try (Response response = eanEffectivityResource.fetchEanSolvingEffectivity(announcementId, apiKey)) { - if (response.getStatus() == 200) { - String body = response.readEntity(String.class); - LOG.fine("Fetched EAN solving effectivity: " + body); - List effectivities = objectMapper.readValue(body, new TypeReference<>() { - }); - - for (EanSolvingEffectivityDto effectivity : effectivities) { - if (effectivity.getEansByCategory() != null) { - LOG.fine("Effectivity categories: " + effectivity.getEansByCategory().keySet()); - for (Map.Entry> entry : effectivity.getEansByCategory().entrySet()) { - if (entry.getValue() != null && entry.getValue().contains(contractedEAN)) { - LOG.fine("EAN " + contractedEAN + " found in category '" + entry.getKey() + "'"); - return new EanEffectivityResult(entry.getKey(), effectivities); - } - } - } - } - LOG.fine("EAN " + contractedEAN + " not found in any effectivity category"); - } else { - LOG.warning("Failed to fetch EAN effectivity for announcement " + announcementId + ": HTTP " + response.getStatus()); + } + + protected EanEffectivityResult checkEanEffectivity(String announcementId) { + LOG.fine( + "Checking EAN effectivity for announcement " + + announcementId + + " and EAN " + + contractedEAN); + try (Response response = + eanEffectivityResource.fetchEanSolvingEffectivity(announcementId, apiKey)) { + if (response.getStatus() == 200) { + String body = response.readEntity(String.class); + LOG.fine("Fetched EAN solving effectivity: " + body); + List effectivities = + objectMapper.readValue(body, new TypeReference<>() {}); + + for (EanSolvingEffectivityDto effectivity : effectivities) { + if (effectivity.getEansByCategory() != null) { + LOG.fine("Effectivity categories: " + effectivity.getEansByCategory().keySet()); + for (Map.Entry> entry : + effectivity.getEansByCategory().entrySet()) { + if (entry.getValue() != null && entry.getValue().contains(contractedEAN)) { + LOG.fine("EAN " + contractedEAN + " found in category '" + entry.getKey() + "'"); + return new EanEffectivityResult(entry.getKey(), effectivities); + } } - } catch (Exception e) { - LOG.log(Level.SEVERE, "Error checking EAN effectivity for announcement " + announcementId, e); + } } - return null; + LOG.fine("EAN " + contractedEAN + " not found in any effectivity category"); + } else { + LOG.warning( + "Failed to fetch EAN effectivity for announcement " + + announcementId + + ": HTTP " + + response.getStatus()); + } + } catch (Exception e) { + LOG.log(Level.SEVERE, "Error checking EAN effectivity for announcement " + announcementId, e); } - - protected void updateAnnouncementAttributes(AnnouncementDto announcement, String effectivityCategory) { - LOG.fine("Updating announcement attributes for announcement " + announcement.getId() + ", effectivity=" + effectivityCategory); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_ID.getName(), announcement.getId()); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_COMPLIANCE_TYPE.getName(), announcement.getComplianceType()); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_MESSAGE.getName(), announcement.getMessage()); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_BUY.getName(), announcement.getRequestAreaDescriptionBuyOrders()); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_SELL.getName(), announcement.getRequestAreaDescriptionSellOrders()); - - if (announcement.getProblemPeriod() != null) { - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), announcement.getProblemPeriod().getStartTime()); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), announcement.getProblemPeriod().getEndTime()); - } else { - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), null); - } - - if (announcement.getBidValidityPeriod() != null) { - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), announcement.getBidValidityPeriod().getEndTime()); - } else { - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), null); - } - - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_EAN_EFFECTIVITY.getName(), effectivityCategory); + return null; + } + + protected void updateAnnouncementAttributes( + AnnouncementDto announcement, String effectivityCategory) { + LOG.fine( + "Updating announcement attributes for announcement " + + announcement.getId() + + ", effectivity=" + + effectivityCategory); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_ID.getName(), announcement.getId()); + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_COMPLIANCE_TYPE.getName(), announcement.getComplianceType()); + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_MESSAGE.getName(), announcement.getMessage()); + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_BUY.getName(), + announcement.getRequestAreaDescriptionBuyOrders()); + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_SELL.getName(), + announcement.getRequestAreaDescriptionSellOrders()); + + if (announcement.getProblemPeriod() != null) { + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), + announcement.getProblemPeriod().getStartTime()); + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), + announcement.getProblemPeriod().getEndTime()); + } else { + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), null); } - protected void clearAnnouncementAttributes() { - // Check asset state to handle stale attributes after service restart (lastProcessedAnnouncementId is in-memory only) - if (lastProcessedAnnouncementId != null) { - LOG.fine("Clearing announcement attributes (previous: " + lastProcessedAnnouncementId + ") for EAN: " + contractedEAN); - } else { - EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); - if (gopacsAsset == null || gopacsAsset.getRedispatchAnnouncementId().isEmpty()) { - return; - } - LOG.fine("Clearing stale announcement attributes for EAN: " + contractedEAN); - } - - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_ID.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_COMPLIANCE_TYPE.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_MESSAGE.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_EAN_EFFECTIVITY.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_BUY.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_SELL.getName(), null); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_NONE); - lastProcessedAnnouncementId = null; + if (announcement.getBidValidityPeriod() != null) { + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), + announcement.getBidValidityPeriod().getEndTime()); + } else { + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), null); } - protected void storeRequestedPowerProfile(AnnouncementDto announcement) { - if (announcement.getRemainingProblemProfileInMW() == null || announcement.getProblemPeriod() == null) { - LOG.fine("No power profile or problem period in announcement " + announcement.getId()); - return; - } - - Long startTime = announcement.getProblemPeriod().getStartTime(); - if (startTime == null) { - return; - } - - List> datapoints = new ArrayList<>(); - long quarterMillis = 15 * 60 * 1000L; - - for (int i = 0; i < announcement.getRemainingProblemProfileInMW().size(); i++) { - double powerMW = announcement.getRemainingProblemProfileInMW().get(i); - double powerKW = powerMW * 1000.0; // Convert MW to kW - long timestamp = startTime + (long) i * quarterMillis; - datapoints.add(new ValueDatapoint<>(timestamp, powerKW)); - } - - LOG.fine("Storing " + datapoints.size() + " power profile data points for announcement " + announcement.getId() - + " (profile MW: " + announcement.getRemainingProblemProfileInMW() + ")"); - assetPredictedDatapointService.updateValues(assetId, EmsGOPACSAsset.REDISPATCH_REQUESTED_POWER.getName(), datapoints); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_EAN_EFFECTIVITY.getName(), effectivityCategory); + } + + protected void clearAnnouncementAttributes() { + // Check asset state to handle stale attributes after service restart + // (lastProcessedAnnouncementId is in-memory only) + if (lastProcessedAnnouncementId != null) { + LOG.fine( + "Clearing announcement attributes (previous: " + + lastProcessedAnnouncementId + + ") for EAN: " + + contractedEAN); + } else { + EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); + if (gopacsAsset == null || gopacsAsset.getRedispatchAnnouncementId().isEmpty()) { + return; + } + LOG.fine("Clearing stale announcement attributes for EAN: " + contractedEAN); } - protected void recordAnnouncementHistory(AnnouncementDto announcement, String effectivityCategory, - List effectivities) { - try { - ObjectNode historyEntry = objectMapper.createObjectNode(); - historyEntry.put("announcementId", announcement.getId()); - historyEntry.put("type", announcement.getType()); - historyEntry.put("complianceType", announcement.getComplianceType()); - historyEntry.put("organisationName", announcement.getOrganisationName()); - if (announcement.getProblemPeriod() != null) { - historyEntry.put("startTime", announcement.getProblemPeriod().getStartTime()); - historyEntry.put("endTime", announcement.getProblemPeriod().getEndTime()); - } - if (announcement.getRemainingProblemProfileInMW() != null) { - historyEntry.put("maxRequestedPowerMW", announcement.getRemainingProblemProfileInMW().stream() - .mapToDouble(Double::doubleValue).max().orElse(0)); - } - if (effectivityCategory != null) { - historyEntry.put("eanEffectivity", effectivityCategory); - } - if (effectivities != null && !effectivities.isEmpty()) { - historyEntry.set("eanEffectivityDetails", objectMapper.valueToTree(effectivities)); - } - historyEntry.put("receivedAt", timerService.getCurrentTimeMillis()); - - Map historyMap = objectMapper.convertValue(historyEntry, new TypeReference<>() { - }); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_HISTORY.getName(), historyMap); - } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to record announcement history", e); - } + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_ID.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_COMPLIANCE_TYPE.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_MESSAGE.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_START_TIME.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_END_TIME.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_VALIDITY_END.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_EAN_EFFECTIVITY.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_BUY.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_REQUEST_AREA_SELL.getName(), null); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_NONE); + lastProcessedAnnouncementId = null; + } + + protected void storeRequestedPowerProfile(AnnouncementDto announcement) { + if (announcement.getRemainingProblemProfileInMW() == null + || announcement.getProblemPeriod() == null) { + LOG.fine("No power profile or problem period in announcement " + announcement.getId()); + return; } - public void handleConfirmation() { - LOG.fine("Processing bid confirmation for EAN: " + contractedEAN); - EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); - if (gopacsAsset == null) { - LOG.warning("Cannot confirm bid: GOPACS asset not found: " + assetId); - return; - } - - String announcementId = gopacsAsset.getRedispatchAnnouncementId().orElse(null); - Double bidPrice = gopacsAsset.getRedispatchBidPrice().orElse(null); - - if (announcementId == null) { - LOG.warning("Cannot confirm bid: no active announcement for EAN " + contractedEAN); - resetConfirmFlag(); - return; - } - - if (bidPrice == null || bidPrice <= 0) { - LOG.warning("Cannot confirm bid: bid price not set or invalid for EAN " + contractedEAN); - resetConfirmFlag(); - return; - } - - LOG.info("Bid confirmed for EAN " + contractedEAN + ": announcement=" + announcementId + ", price=" + bidPrice + " EUR/MWh"); - - // Update status - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_CONFIRMED); - - // Record bid history - updateBidHistory(BID_STATUS_CONFIRMED, announcementId, bidPrice); + Long startTime = announcement.getProblemPeriod().getStartTime(); + if (startTime == null) { + return; + } - // Reset confirm flag - resetConfirmFlag(); + List> datapoints = new ArrayList<>(); + long quarterMillis = 15 * 60 * 1000L; - // Placeholder for trading platform integration - placeBidOnPlatform(announcementId, bidPrice); + for (int i = 0; i < announcement.getRemainingProblemProfileInMW().size(); i++) { + double powerMW = announcement.getRemainingProblemProfileInMW().get(i); + double powerKW = powerMW * 1000.0; // Convert MW to kW + long timestamp = startTime + (long) i * quarterMillis; + datapoints.add(new ValueDatapoint<>(timestamp, powerKW)); } - protected void placeBidOnPlatform(String announcementId, Double bidPrice) { - // TODO: Integrate with trading platform (ETPA, EPEX SPOT, or NordPool) when decided - LOG.info("Bid placement placeholder for EAN " + contractedEAN + ": announcement=" + announcementId + - ", price=" + bidPrice + " EUR/MWh. Trading platform integration pending."); + LOG.fine( + "Storing " + + datapoints.size() + + " power profile data points for announcement " + + announcement.getId() + + " (profile MW: " + + announcement.getRemainingProblemProfileInMW() + + ")"); + assetPredictedDatapointService.updateValues( + assetId, EmsGOPACSAsset.REDISPATCH_REQUESTED_POWER.getName(), datapoints); + } + + protected void recordAnnouncementHistory( + AnnouncementDto announcement, + String effectivityCategory, + List effectivities) { + try { + ObjectNode historyEntry = objectMapper.createObjectNode(); + historyEntry.put("announcementId", announcement.getId()); + historyEntry.put("type", announcement.getType()); + historyEntry.put("complianceType", announcement.getComplianceType()); + historyEntry.put("organisationName", announcement.getOrganisationName()); + if (announcement.getProblemPeriod() != null) { + historyEntry.put("startTime", announcement.getProblemPeriod().getStartTime()); + historyEntry.put("endTime", announcement.getProblemPeriod().getEndTime()); + } + if (announcement.getRemainingProblemProfileInMW() != null) { + historyEntry.put( + "maxRequestedPowerMW", + announcement.getRemainingProblemProfileInMW().stream() + .mapToDouble(Double::doubleValue) + .max() + .orElse(0)); + } + if (effectivityCategory != null) { + historyEntry.put("eanEffectivity", effectivityCategory); + } + if (effectivities != null && !effectivities.isEmpty()) { + historyEntry.set("eanEffectivityDetails", objectMapper.valueToTree(effectivities)); + } + historyEntry.put("receivedAt", timerService.getCurrentTimeMillis()); + + Map historyMap = + objectMapper.convertValue(historyEntry, new TypeReference<>() {}); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_ANNOUNCEMENT_HISTORY.getName(), historyMap); + } catch (Exception e) { + LOG.log(Level.WARNING, "Failed to record announcement history", e); } - - protected void updateBidHistory(String status, String announcementId, Double bidPrice) { - try { - ObjectNode historyEntry = objectMapper.createObjectNode(); - historyEntry.put("announcementId", announcementId); - historyEntry.put("bidPrice", bidPrice); - historyEntry.put("status", status); - historyEntry.put("timestamp", timerService.getCurrentTimeMillis()); - - Map historyMap = objectMapper.convertValue(historyEntry, new TypeReference<>() { - }); - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_HISTORY.getName(), historyMap); - } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to record bid history", e); - } + } + + public void handleConfirmation() { + LOG.fine("Processing bid confirmation for EAN: " + contractedEAN); + EmsGOPACSAsset gopacsAsset = (EmsGOPACSAsset) assetStorageService.find(assetId); + if (gopacsAsset == null) { + LOG.warning("Cannot confirm bid: GOPACS asset not found: " + assetId); + return; } - private void resetConfirmFlag() { - scheduledExecutorService.schedule(() -> - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), false), 1, TimeUnit.SECONDS); + String announcementId = gopacsAsset.getRedispatchAnnouncementId().orElse(null); + Double bidPrice = gopacsAsset.getRedispatchBidPrice().orElse(null); + + if (announcementId == null) { + LOG.warning("Cannot confirm bid: no active announcement for EAN " + contractedEAN); + resetConfirmFlag(); + return; } - private void updateLastPoll() { - sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_LAST_POLL.getName(), timerService.getCurrentTimeMillis()); + if (bidPrice == null || bidPrice <= 0) { + LOG.warning("Cannot confirm bid: bid price not set or invalid for EAN " + contractedEAN); + resetConfirmFlag(); + return; } - private void sendAttributeEvent(String attributeName, Object value) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(assetId, attributeName, value), getClass().getSimpleName()); + LOG.info( + "Bid confirmed for EAN " + + contractedEAN + + ": announcement=" + + announcementId + + ", price=" + + bidPrice + + " EUR/MWh"); + + // Update status + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_STATUS.getName(), BID_STATUS_CONFIRMED); + + // Record bid history + updateBidHistory(BID_STATUS_CONFIRMED, announcementId, bidPrice); + + // Reset confirm flag + resetConfirmFlag(); + + // Placeholder for trading platform integration + placeBidOnPlatform(announcementId, bidPrice); + } + + protected void placeBidOnPlatform(String announcementId, Double bidPrice) { + // TODO: Integrate with trading platform (ETPA, EPEX SPOT, or NordPool) when decided + LOG.info( + "Bid placement placeholder for EAN " + + contractedEAN + + ": announcement=" + + announcementId + + ", price=" + + bidPrice + + " EUR/MWh. Trading platform integration pending."); + } + + protected void updateBidHistory(String status, String announcementId, Double bidPrice) { + try { + ObjectNode historyEntry = objectMapper.createObjectNode(); + historyEntry.put("announcementId", announcementId); + historyEntry.put("bidPrice", bidPrice); + historyEntry.put("status", status); + historyEntry.put("timestamp", timerService.getCurrentTimeMillis()); + + Map historyMap = + objectMapper.convertValue(historyEntry, new TypeReference<>() {}); + sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_BID_HISTORY.getName(), historyMap); + } catch (Exception e) { + LOG.log(Level.WARNING, "Failed to record bid history", e); } + } + + private void resetConfirmFlag() { + scheduledExecutorService.schedule( + () -> sendAttributeEvent(EmsGOPACSAsset.REDISPATCH_CONFIRM_BID.getName(), false), + 1, + TimeUnit.SECONDS); + } + + private void updateLastPoll() { + sendAttributeEvent( + EmsGOPACSAsset.REDISPATCH_LAST_POLL.getName(), timerService.getCurrentTimeMillis()); + } + + private void sendAttributeEvent(String attributeName, Object value) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent(assetId, attributeName, value), getClass().getSimpleName()); + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResource.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResource.java index 3c591cd..bdb73d6 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResource.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResource.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,21 +12,23 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; +import static jakarta.ws.rs.core.MediaType.APPLICATION_XML; +import static jakarta.ws.rs.core.MediaType.TEXT_XML; + import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; -import static jakarta.ws.rs.core.MediaType.APPLICATION_XML; -import static jakarta.ws.rs.core.MediaType.TEXT_XML; - @Path("message") public interface GOPACSServerResource { - @POST - @Consumes({APPLICATION_XML, TEXT_XML}) - void inMessage(String transportXml); + @POST + @Consumes({APPLICATION_XML, TEXT_XML}) + void inMessage(String transportXml); } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResourceImpl.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResourceImpl.java index dcad0ae..8746a2c 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResourceImpl.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/GOPACSServerResourceImpl.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; @@ -23,17 +22,16 @@ public class GOPACSServerResourceImpl implements GOPACSServerResource { - protected Consumer messageConsumer; + protected Consumer messageConsumer; + public GOPACSServerResourceImpl(Consumer messageConsumer) { + this.messageConsumer = messageConsumer; + } - public GOPACSServerResourceImpl(Consumer messageConsumer) { - this.messageConsumer = messageConsumer; - } - - @Override - public void inMessage(String transportXml) { - if (messageConsumer != null) { - messageConsumer.accept(transportXml); - } + @Override + public void inMessage(String transportXml) { + if (messageConsumer != null) { + messageConsumer.accept(transportXml); } + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/OAuth2TokenResponse.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/OAuth2TokenResponse.java index af0e812..f2b2c67 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/OAuth2TokenResponse.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/OAuth2TokenResponse.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,63 +12,62 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -/** - * OAuth2 token response model for client credentials flow - */ +/** OAuth2 token response model for client credentials flow */ @JsonIgnoreProperties(ignoreUnknown = true) public class OAuth2TokenResponse { - - @JsonProperty("access_token") - private String accessToken; - - @JsonProperty("token_type") - private String tokenType; - - @JsonProperty("expires_in") - private Long expiresIn; - - @JsonProperty("scope") - private String scope; - - public OAuth2TokenResponse() { - } - - public String getAccessToken() { - return accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - public String getTokenType() { - return tokenType; - } - - public void setTokenType(String tokenType) { - this.tokenType = tokenType; - } - - public Long getExpiresIn() { - return expiresIn; - } - - public void setExpiresIn(Long expiresIn) { - this.expiresIn = expiresIn; - } - - public String getScope() { - return scope; - } - - public void setScope(String scope) { - this.scope = scope; - } + + @JsonProperty("access_token") + private String accessToken; + + @JsonProperty("token_type") + private String tokenType; + + @JsonProperty("expires_in") + private Long expiresIn; + + @JsonProperty("scope") + private String scope; + + public OAuth2TokenResponse() {} + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getTokenType() { + return tokenType; + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + + public Long getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Long expiresIn) { + this.expiresIn = expiresIn; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/ParticipantView.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/ParticipantView.java index f956a3a..58f0981 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/ParticipantView.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/ParticipantView.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs; diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/AnnouncementDto.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/AnnouncementDto.java index 9de1873..7822015 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/AnnouncementDto.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/AnnouncementDto.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,156 +12,154 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - import java.util.List; -/** - * DTO for GOPACS congestion announcement entries from the /machineannouncements endpoint. - */ +/** DTO for GOPACS congestion announcement entries from the /machineannouncements endpoint. */ @JsonIgnoreProperties(ignoreUnknown = true) public class AnnouncementDto { - private String id; - private String message; - private String type; - private String complianceType; - private String announcementState; - private String organisationName; - private String problemAreaDescription; - private String requestAreaDescriptionBuyOrders; - private String requestAreaDescriptionSellOrders; - private Long createdTimestamp; - private Long lastUpdatedTimestamp; - private Long day; - private TimeSpanDto problemPeriod; - private TimeSpanDto bidValidityPeriod; - private List remainingProblemProfileInMW; - - public AnnouncementDto() { - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getComplianceType() { - return complianceType; - } - - public void setComplianceType(String complianceType) { - this.complianceType = complianceType; - } - - public String getAnnouncementState() { - return announcementState; - } - - public void setAnnouncementState(String announcementState) { - this.announcementState = announcementState; - } - - public String getOrganisationName() { - return organisationName; - } - - public void setOrganisationName(String organisationName) { - this.organisationName = organisationName; - } - - public String getProblemAreaDescription() { - return problemAreaDescription; - } - - public void setProblemAreaDescription(String problemAreaDescription) { - this.problemAreaDescription = problemAreaDescription; - } - - public String getRequestAreaDescriptionBuyOrders() { - return requestAreaDescriptionBuyOrders; - } - - public void setRequestAreaDescriptionBuyOrders(String requestAreaDescriptionBuyOrders) { - this.requestAreaDescriptionBuyOrders = requestAreaDescriptionBuyOrders; - } - - public String getRequestAreaDescriptionSellOrders() { - return requestAreaDescriptionSellOrders; - } - - public void setRequestAreaDescriptionSellOrders(String requestAreaDescriptionSellOrders) { - this.requestAreaDescriptionSellOrders = requestAreaDescriptionSellOrders; - } - - public Long getCreatedTimestamp() { - return createdTimestamp; - } - - public void setCreatedTimestamp(Long createdTimestamp) { - this.createdTimestamp = createdTimestamp; - } - - public Long getLastUpdatedTimestamp() { - return lastUpdatedTimestamp; - } - - public void setLastUpdatedTimestamp(Long lastUpdatedTimestamp) { - this.lastUpdatedTimestamp = lastUpdatedTimestamp; - } - - public Long getDay() { - return day; - } - - public void setDay(Long day) { - this.day = day; - } + private String id; + private String message; + private String type; + private String complianceType; + private String announcementState; + private String organisationName; + private String problemAreaDescription; + private String requestAreaDescriptionBuyOrders; + private String requestAreaDescriptionSellOrders; + private Long createdTimestamp; + private Long lastUpdatedTimestamp; + private Long day; + private TimeSpanDto problemPeriod; + private TimeSpanDto bidValidityPeriod; + private List remainingProblemProfileInMW; + + public AnnouncementDto() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getComplianceType() { + return complianceType; + } + + public void setComplianceType(String complianceType) { + this.complianceType = complianceType; + } + + public String getAnnouncementState() { + return announcementState; + } + + public void setAnnouncementState(String announcementState) { + this.announcementState = announcementState; + } + + public String getOrganisationName() { + return organisationName; + } + + public void setOrganisationName(String organisationName) { + this.organisationName = organisationName; + } + + public String getProblemAreaDescription() { + return problemAreaDescription; + } + + public void setProblemAreaDescription(String problemAreaDescription) { + this.problemAreaDescription = problemAreaDescription; + } + + public String getRequestAreaDescriptionBuyOrders() { + return requestAreaDescriptionBuyOrders; + } + + public void setRequestAreaDescriptionBuyOrders(String requestAreaDescriptionBuyOrders) { + this.requestAreaDescriptionBuyOrders = requestAreaDescriptionBuyOrders; + } + + public String getRequestAreaDescriptionSellOrders() { + return requestAreaDescriptionSellOrders; + } + + public void setRequestAreaDescriptionSellOrders(String requestAreaDescriptionSellOrders) { + this.requestAreaDescriptionSellOrders = requestAreaDescriptionSellOrders; + } + + public Long getCreatedTimestamp() { + return createdTimestamp; + } + + public void setCreatedTimestamp(Long createdTimestamp) { + this.createdTimestamp = createdTimestamp; + } + + public Long getLastUpdatedTimestamp() { + return lastUpdatedTimestamp; + } + + public void setLastUpdatedTimestamp(Long lastUpdatedTimestamp) { + this.lastUpdatedTimestamp = lastUpdatedTimestamp; + } + + public Long getDay() { + return day; + } + + public void setDay(Long day) { + this.day = day; + } - public TimeSpanDto getProblemPeriod() { - return problemPeriod; - } + public TimeSpanDto getProblemPeriod() { + return problemPeriod; + } - public void setProblemPeriod(TimeSpanDto problemPeriod) { - this.problemPeriod = problemPeriod; - } + public void setProblemPeriod(TimeSpanDto problemPeriod) { + this.problemPeriod = problemPeriod; + } - public TimeSpanDto getBidValidityPeriod() { - return bidValidityPeriod; - } + public TimeSpanDto getBidValidityPeriod() { + return bidValidityPeriod; + } - public void setBidValidityPeriod(TimeSpanDto bidValidityPeriod) { - this.bidValidityPeriod = bidValidityPeriod; - } + public void setBidValidityPeriod(TimeSpanDto bidValidityPeriod) { + this.bidValidityPeriod = bidValidityPeriod; + } - public List getRemainingProblemProfileInMW() { - return remainingProblemProfileInMW; - } + public List getRemainingProblemProfileInMW() { + return remainingProblemProfileInMW; + } - public void setRemainingProblemProfileInMW(List remainingProblemProfileInMW) { - this.remainingProblemProfileInMW = remainingProblemProfileInMW; - } + public void setRemainingProblemProfileInMW(List remainingProblemProfileInMW) { + this.remainingProblemProfileInMW = remainingProblemProfileInMW; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/EanSolvingEffectivityDto.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/EanSolvingEffectivityDto.java index ebc4479..db75259 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/EanSolvingEffectivityDto.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/EanSolvingEffectivityDto.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,44 +12,44 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - import java.util.Map; import java.util.Set; /** * DTO for the GOPACS EAN solving effectivity response from * /public-api/1.0/announcements/{id}/eansolvingeffectivity. - *

    - * The {@code eansByCategory} maps effectivity category names to sets of EANs - * that fall into that category for the given announcement. + * + *

    The {@code eansByCategory} maps effectivity category names to sets of EANs that fall into that + * category for the given announcement. */ @JsonIgnoreProperties(ignoreUnknown = true) public class EanSolvingEffectivityDto { - private TimeSpanDto during; - private Map> eansByCategory; + private TimeSpanDto during; + private Map> eansByCategory; - public EanSolvingEffectivityDto() { - } + public EanSolvingEffectivityDto() {} - public TimeSpanDto getDuring() { - return during; - } + public TimeSpanDto getDuring() { + return during; + } - public void setDuring(TimeSpanDto during) { - this.during = during; - } + public void setDuring(TimeSpanDto during) { + this.during = during; + } - public Map> getEansByCategory() { - return eansByCategory; - } + public Map> getEansByCategory() { + return eansByCategory; + } - public void setEansByCategory(Map> eansByCategory) { - this.eansByCategory = eansByCategory; - } + public void setEansByCategory(Map> eansByCategory) { + this.eansByCategory = eansByCategory; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/TimeSpanDto.java b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/TimeSpanDto.java index d20ae29..b3cfe2e 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/TimeSpanDto.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/gopacs/dto/TimeSpanDto.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,56 +12,57 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** - * DTO for GOPACS time span objects used in announcements and effectivity responses. - * All time values are epoch milliseconds. + * DTO for GOPACS time span objects used in announcements and effectivity responses. All time values + * are epoch milliseconds. */ @JsonIgnoreProperties(ignoreUnknown = true) public class TimeSpanDto { - private Long startTime; - private Long endTime; - private Double durationInHours; - private Integer numberOfQuartersInTimeSpan; + private Long startTime; + private Long endTime; + private Double durationInHours; + private Integer numberOfQuartersInTimeSpan; - public TimeSpanDto() { - } + public TimeSpanDto() {} - public Long getStartTime() { - return startTime; - } + public Long getStartTime() { + return startTime; + } - public void setStartTime(Long startTime) { - this.startTime = startTime; - } + public void setStartTime(Long startTime) { + this.startTime = startTime; + } - public Long getEndTime() { - return endTime; - } + public Long getEndTime() { + return endTime; + } - public void setEndTime(Long endTime) { - this.endTime = endTime; - } + public void setEndTime(Long endTime) { + this.endTime = endTime; + } - public Double getDurationInHours() { - return durationInHours; - } + public Double getDurationInHours() { + return durationInHours; + } - public void setDurationInHours(Double durationInHours) { - this.durationInHours = durationInHours; - } + public void setDurationInHours(Double durationInHours) { + this.durationInHours = durationInHours; + } - public Integer getNumberOfQuartersInTimeSpan() { - return numberOfQuartersInTimeSpan; - } + public Integer getNumberOfQuartersInTimeSpan() { + return numberOfQuartersInTimeSpan; + } - public void setNumberOfQuartersInTimeSpan(Integer numberOfQuartersInTimeSpan) { - this.numberOfQuartersInTimeSpan = numberOfQuartersInTimeSpan; - } + public void setNumberOfQuartersInTimeSpan(Integer numberOfQuartersInTimeSpan) { + this.numberOfQuartersInTimeSpan = numberOfQuartersInTimeSpan; + } } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisation.java b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisation.java index ce98b6d..5e857f6 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisation.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisation.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,22 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.optimisationMethods; +import static org.openremote.model.syslog.SyslogCategory.DATA; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.openremote.extension.ems.agent.EmsDayAheadAsset; import org.openremote.extension.ems.agent.EmsElectricityBatteryAsset; import org.openremote.extension.ems.agent.EmsEnergyOptimisationAsset; @@ -31,1632 +40,2246 @@ import org.openremote.model.query.AssetQuery; import org.openremote.model.syslog.SyslogCategory; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.logging.Logger; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.openremote.model.syslog.SyslogCategory.DATA; - public class EmsOptimisation implements OptimisationMethod { - protected static final Logger LOG = SyslogCategory.getLogger(DATA, EmsOptimisation.class.getName()); - private final String optimisationMethodName = EmsOptimisation.class.getSimpleName(); - - // Maximum interval between data-points send by the device to be considered connected - private final int ACTIVE_PERIOD_MINUTES = 5; - - // EMS power limits settings - private final int POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE = 5; - private final int POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE = 5; - private final int POWER_LIMIT_MAXIMUM_BATTERIES_MARGIN_PERCENTAGE = 10; - private final int POWER_LIMIT_MINIMUM_BATTERIES_MARGIN_PERCENTAGE = 10; - - // Battery settings - private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT = 50; - private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL = 3; - private final int BATTERY_EFFICIENCY_BUFFER_PERCENTAGE = 3; - + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, EmsOptimisation.class.getName()); + private final String optimisationMethodName = EmsOptimisation.class.getSimpleName(); + + // Maximum interval between data-points send by the device to be considered connected + private final int ACTIVE_PERIOD_MINUTES = 5; + + // EMS power limits settings + private final int POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE = 5; + private final int POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE = 5; + private final int POWER_LIMIT_MAXIMUM_BATTERIES_MARGIN_PERCENTAGE = 10; + private final int POWER_LIMIT_MINIMUM_BATTERIES_MARGIN_PERCENTAGE = 10; + + // Battery settings + private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT = 50; + private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL = 3; + private final int BATTERY_EFFICIENCY_BUFFER_PERCENTAGE = 3; + + @Override + public void execute(String energyOptimisationAssetId, Services services) { + runOptimisationMethodEms(energyOptimisationAssetId, services); + } + + private void runOptimisationMethodEms(String energyOptimisationAssetId, Services services) { + // Get energy optimisation asset + EmsEnergyOptimisationAsset energyOptimisationAsset = + (EmsEnergyOptimisationAsset) + services.getAssetStorageService().find(energyOptimisationAssetId); + + if (energyOptimisationAsset == null) { + return; + } - @Override - public void execute(String energyOptimisationAssetId, Services services) { - runOptimisationMethodEms(energyOptimisationAssetId, services); + String logPrefixEnergyOptimisation = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAssetId, + energyOptimisationAsset.getAssetName()); + + // Get all battery assets + List electricityBatteryAssets = + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .parents(energyOptimisationAssetId) + .types(EmsElectricityBatteryAsset.class)) + .stream() + .map(asset -> (EmsElectricityBatteryAsset) asset) + .toList(); + + // TODO: Add order to battery assets from longest to smallest discharge duration + + if (energyOptimisationAsset.getEnableDetailedLogging().orElse(false)) { + int allowChargingSize = + electricityBatteryAssets.stream() + .filter( + electricityBatteryAsset -> + electricityBatteryAsset.getAllowCharging().orElse(false)) + .toList() + .size(); + + int allowDischargingSize = + electricityBatteryAssets.stream() + .filter( + electricityBatteryAsset -> + electricityBatteryAsset.getAllowDischarging().orElse(false)) + .toList() + .size(); + + LOG.info( + String.format( + "%s; Energy optimisation asset has %s battery asset(s). Number of batteries with '%s'= %s and '%s'= %s", + logPrefixEnergyOptimisation, + electricityBatteryAssets.size(), + EmsElectricityBatteryAsset.ALLOW_CHARGING.getName(), + allowChargingSize, + EmsElectricityBatteryAsset.ALLOW_DISCHARGING.getName(), + allowDischargingSize)); } - private void runOptimisationMethodEms(String energyOptimisationAssetId, Services services) { - // Get energy optimisation asset - EmsEnergyOptimisationAsset energyOptimisationAsset = (EmsEnergyOptimisationAsset) services.getAssetStorageService().find(energyOptimisationAssetId); + // Check if power net is connected + Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); - if (energyOptimisationAsset == null) { - return; - } + if (powerNet == null) { + LOG.warning( + String.format( + "%s; Failed to perform '%s' energy optimisation method. '%s' attribute is not connected", + logPrefixEnergyOptimisation, + optimisationMethodName, + EmsEnergyOptimisationAsset.POWER_NET.getName())); + } - String logPrefixEnergyOptimisation = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAssetId, energyOptimisationAsset.getAssetName()); + // Validate power limits + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); + Long powerLimitMaximumProfileTimestampMillis = + energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); - // Get all battery assets - List electricityBatteryAssets = services.getAssetStorageService() - .findAll(new AssetQuery().parents(energyOptimisationAssetId).types(EmsElectricityBatteryAsset.class)) - .stream() - .map(asset -> (EmsElectricityBatteryAsset) asset) - .toList(); + DateTimeFormatter formatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); - // TODO: Add order to battery assets from longest to smallest discharge duration + String powerLimitMaximumProfileDateTime = ""; - if (energyOptimisationAsset.getEnableDetailedLogging().orElse(false)) { - int allowChargingSize = electricityBatteryAssets - .stream() - .filter(electricityBatteryAsset -> electricityBatteryAsset.getAllowCharging().orElse(false)) - .toList() - .size(); + if (powerLimitMaximumProfileTimestampMillis != null) { + powerLimitMaximumProfileDateTime = + formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); + } - int allowDischargingSize = electricityBatteryAssets - .stream() - .filter(electricityBatteryAsset -> electricityBatteryAsset.getAllowDischarging().orElse(false)) - .toList() - .size(); + if (powerLimitMaximumProfileTotal != null + && powerLimitMinimumProfileTotal != null + && powerLimitMaximumProfileTotal <= powerLimitMinimumProfileTotal) { + LOG.warning( + String.format( + "%s; Failed to perform '%s' energy optimisation method. The '%s'= %s kW is lower than or equal to '%s'= %s kW for timestamp='%s'", + logPrefixEnergyOptimisation, + optimisationMethodName, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + powerLimitMaximumProfileTotal, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + powerLimitMinimumProfileTotal, + powerLimitMaximumProfileDateTime)); + } - LOG.info(String.format("%s; Energy optimisation asset has %s battery asset(s). Number of batteries with '%s'= %s and '%s'= %s", - logPrefixEnergyOptimisation, electricityBatteryAssets.size(), EmsElectricityBatteryAsset.ALLOW_CHARGING.getName(), allowChargingSize, EmsElectricityBatteryAsset.ALLOW_DISCHARGING.getName(), allowDischargingSize)); - } + // Get day ahead asset + EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); - // Check if power net is connected - Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); + // Update day ahead asset at specific time of day + if (dayAheadAsset != null) { + updateDayAheadAsset(energyOptimisationAsset, dayAheadAsset, services); + } - if (powerNet == null) { - LOG.warning(String.format("%s; Failed to perform '%s' energy optimisation method. '%s' attribute is not connected", logPrefixEnergyOptimisation, optimisationMethodName, EmsEnergyOptimisationAsset.POWER_NET.getName())); - } + // Check for battery assets + if (electricityBatteryAssets.isEmpty()) { + return; + } - // Validate power limits - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); - Long powerLimitMaximumProfileTimestampMillis = energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); + // Check connection status of battery assets + batteryCheckConnection(electricityBatteryAssets, services); + + // Check if all required attributes are connected/set and create log messages + batteryCheckSetup(electricityBatteryAssets); + + // Calculate new battery power set-points + Map powerSetpointsNew = + batteryCalculatePowerSetpoints( + energyOptimisationAsset, + electricityBatteryAssets, + services, + logPrefixEnergyOptimisation); + + // Update battery power set-points + batteryUpdatePowerSetpoints(electricityBatteryAssets, powerSetpointsNew, services); + } + + private int batteryCalculateEnergyLevelPercentageDefault( + Integer energyLevelPercentageMaximumBattery, + Integer energyLevelPercentageMinimumBattery, + EmsEnergyOptimisationAsset energyOptimisationAsset) { + if (energyLevelPercentageMaximumBattery == null + || energyLevelPercentageMinimumBattery == null) { + return BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT; + } - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); + + int energyLevelPercentageDefault; + + if (powerLimitMaximumProfileTotal == null && powerLimitMinimumProfileTotal != null) { + energyLevelPercentageDefault = energyLevelPercentageMinimumBattery; + } else if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal == null) { + energyLevelPercentageDefault = energyLevelPercentageMaximumBattery; + } else { + energyLevelPercentageDefault = + (int) + Math.round( + (double) + (energyLevelPercentageMaximumBattery + - energyLevelPercentageMinimumBattery) + / 2 + + energyLevelPercentageMinimumBattery); + } - String powerLimitMaximumProfileDateTime = ""; + return energyLevelPercentageDefault; + } + + private Map batteryCalculateForecasts( + List electricityBatteryAssets, + EmsEnergyOptimisationAsset energyOptimisationAsset, + Services services) { + Map batteryEnergyLevelPercentageTargets = new HashMap<>(); + + // Get power consumption forecast for 1 week + long intervalMillis = 15 * 60000; + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long startTimeMillis = currentTimeMillis - currentTimeMillis % intervalMillis; + long endTimeMillis = startTimeMillis + 7 * 24 * 60 * 60000; + + String energyOptimisationAssetId = energyOptimisationAsset.getId(); + AssetDatapointAllQuery assetDatapointQueryConsumptionPredicted = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + List> energyOptimisationPowerConsumptionPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName(), + assetDatapointQueryConsumptionPredicted); + + // System.out.println("energyOptimisationPowerConsumptionPredicted = " + + // energyOptimisationPowerConsumptionPredicted); + + if (energyOptimisationPowerConsumptionPredicted.isEmpty()) { + return batteryEnergyLevelPercentageTargets; + } - if (powerLimitMaximumProfileTimestampMillis != null) { - powerLimitMaximumProfileDateTime = formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); - } + // Calculate power average for each 15-minute interval + List> totalPowerConsumptionAveraged = + intervalAverage(energyOptimisationPowerConsumptionPredicted, intervalMillis); + totalPowerConsumptionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal != null && powerLimitMaximumProfileTotal <= powerLimitMinimumProfileTotal) { - LOG.warning(String.format("%s; Failed to perform '%s' energy optimisation method. The '%s'= %s kW is lower than or equal to '%s'= %s kW for timestamp='%s'", - logPrefixEnergyOptimisation, optimisationMethodName, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), powerLimitMaximumProfileTotal, - EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), powerLimitMinimumProfileTotal, powerLimitMaximumProfileDateTime)); - } + // System.out.println("totalPowerConsumptionAveraged = " + + // totalPowerConsumptionAveraged); - // Get day ahead asset - EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); + long startTimestampMillis = totalPowerConsumptionAveraged.getFirst().getTimestamp(); + long endTimestampMillis = totalPowerConsumptionAveraged.getLast().getTimestamp(); - // Update day ahead asset at specific time of day - if (dayAheadAsset != null) { - updateDayAheadAsset(energyOptimisationAsset, dayAheadAsset, services); - } + // Interpolate power average values for each 15-minute interval + List> totalPowerConsumptionInterpolated = + intervalInterpolate( + totalPowerConsumptionAveraged, + startTimestampMillis, + endTimestampMillis, + intervalMillis); - // Check for battery assets - if (electricityBatteryAssets.isEmpty()) { - return; - } + List timestampsMillisList = new ArrayList<>(); + List totalPowerConsumptionList = new ArrayList<>(); - // Check connection status of battery assets - batteryCheckConnection(electricityBatteryAssets, services); + for (ValueDatapoint datapoint : totalPowerConsumptionInterpolated) { + long timestampMillis = datapoint.getTimestamp(); + Double value = (Double) datapoint.getValue(); - // Check if all required attributes are connected/set and create log messages - batteryCheckSetup(electricityBatteryAssets); + timestampsMillisList.add(timestampMillis); + totalPowerConsumptionList.add(value); + } - // Calculate new battery power set-points - Map powerSetpointsNew = batteryCalculatePowerSetpoints(energyOptimisationAsset, electricityBatteryAssets, services, logPrefixEnergyOptimisation); + // System.out.println("timestampsMillisList = " + timestampsMillisList); + // System.out.println("totalPowerConsumptionList = " + totalPowerConsumptionList); - // Update battery power set-points - batteryUpdatePowerSetpoints(electricityBatteryAssets, powerSetpointsNew, services); + if (totalPowerConsumptionList.isEmpty()) { + return batteryEnergyLevelPercentageTargets; } - private int batteryCalculateEnergyLevelPercentageDefault(Integer energyLevelPercentageMaximumBattery, Integer energyLevelPercentageMinimumBattery, EmsEnergyOptimisationAsset energyOptimisationAsset) { - if (energyLevelPercentageMaximumBattery == null || energyLevelPercentageMinimumBattery == null) { - return BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT; - } - - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); + AssetDatapointAllQuery assetDatapointQueryPeriodPredicted = + new AssetDatapointAllQuery(startTimestampMillis, endTimestampMillis); + List> energyOptimisationPowerProductionPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName(), + assetDatapointQueryPeriodPredicted); + + // System.out.println("energyOptimisationPowerProductionPredicted = " + + // energyOptimisationPowerProductionPredicted); + + Map totalPowerProductionMap = new HashMap<>(); + + if (!energyOptimisationPowerProductionPredicted.isEmpty()) { + // Calculate power average for each 15-minute interval + List> totalPowerProductionAveraged = + intervalAverage(energyOptimisationPowerProductionPredicted, intervalMillis); + totalPowerProductionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + + // Interpolate power average values for each 15-minute interval + List> totalPowerProductionInterpolated = + intervalInterpolate( + totalPowerProductionAveraged, + totalPowerProductionAveraged.getFirst().getTimestamp(), + totalPowerProductionAveraged.getLast().getTimestamp(), + intervalMillis); + + totalPowerProductionMap = + totalPowerProductionInterpolated.stream() + .collect( + Collectors.toMap(ValueDatapoint::getTimestamp, dp -> ((Double) dp.getValue()))); + } - int energyLevelPercentageDefault; + // List to store the sum of total power consumption, production and flexible power + List totalPowerConsumptionProductionFlexList = new ArrayList<>(); - if (powerLimitMaximumProfileTotal == null && powerLimitMinimumProfileTotal != null) { - energyLevelPercentageDefault = energyLevelPercentageMinimumBattery; - } else if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal == null) { - energyLevelPercentageDefault = energyLevelPercentageMaximumBattery; - } else { - energyLevelPercentageDefault = (int) Math.round((double) (energyLevelPercentageMaximumBattery - energyLevelPercentageMinimumBattery) / 2 + energyLevelPercentageMinimumBattery); - } + // Sum total power consumption and production + for (int i = 0; i < timestampsMillisList.size(); i++) { + Double powerConsumption = totalPowerConsumptionList.get(i); + Double powerProduction = totalPowerProductionMap.get(timestampsMillisList.get(i)); - return energyLevelPercentageDefault; + if (powerProduction != null) { + double sum = powerConsumption + powerProduction; + totalPowerConsumptionProductionFlexList.add(sum); + } else { + totalPowerConsumptionProductionFlexList.add(powerConsumption); + } } - private Map batteryCalculateForecasts(List electricityBatteryAssets, EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { - Map batteryEnergyLevelPercentageTargets = new HashMap<>(); - - // Get power consumption forecast for 1 week - long intervalMillis = 15 * 60000; - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long startTimeMillis = currentTimeMillis - currentTimeMillis % intervalMillis; - long endTimeMillis = startTimeMillis + 7 * 24 * 60 * 60000; - - String energyOptimisationAssetId = energyOptimisationAsset.getId(); - AssetDatapointAllQuery assetDatapointQueryConsumptionPredicted = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - List> energyOptimisationPowerConsumptionPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName(), assetDatapointQueryConsumptionPredicted); + // System.out.println("totalPowerConsumptionProductionFlexList = " + + // totalPowerConsumptionProductionFlexList); + // System.out.println(); + + // Get power limits forecasts + List> energyOptimisationPowerLimitMaximumPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + assetDatapointQueryPeriodPredicted); + List> energyOptimisationPowerLimitMinimumPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + assetDatapointQueryPeriodPredicted); + + Map powerLimitMaximumMap = new HashMap<>(); + Map powerLimitMinimumMap = new HashMap<>(); + + for (ValueDatapoint dp : energyOptimisationPowerLimitMaximumPredicted) { + powerLimitMaximumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + } -// System.out.println("energyOptimisationPowerConsumptionPredicted = " + energyOptimisationPowerConsumptionPredicted); + for (ValueDatapoint dp : energyOptimisationPowerLimitMinimumPredicted) { + powerLimitMinimumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + } - if (energyOptimisationPowerConsumptionPredicted.isEmpty()) { - return batteryEnergyLevelPercentageTargets; + List chargePowerAvailableTotalList = new ArrayList<>(); + List dischargePowerAvailableTotalList = new ArrayList<>(); + + // Add current available charge and discharge power + chargePowerAvailableTotalList.add(0.0); + dischargePowerAvailableTotalList.add(0.0); + + double intervalHour = (double) intervalMillis / (60 * 60000); + + // Calculate forecast for each battery + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String batteryAssetId = electricityBatteryAsset.getId(); + Integer chargeEfficiencyBattery = electricityBatteryAsset.getChargeEfficiency().orElse(null); + Double chargePowerMaximumBattery = + electricityBatteryAsset.getChargePowerMaximum().orElse(null); + Integer dischargeEfficiencyBattery = + electricityBatteryAsset.getDischargeEfficiency().orElse(null); + Double dischargePowerMaximumBattery = + electricityBatteryAsset.getDischargePowerMaximum().orElse(null); + Double energyCapacityBattery = electricityBatteryAsset.getEnergyCapacity().orElse(null); + Double energyLevelPercentageBattery = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + Integer energyLevelPercentageMaximumBattery = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimumBattery = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + + if (chargeEfficiencyBattery == null + || chargePowerMaximumBattery == null + || dischargeEfficiencyBattery == null + || dischargePowerMaximumBattery == null + || energyCapacityBattery == null + || energyLevelPercentageBattery == null + || energyLevelPercentageMaximumBattery == null + || energyLevelPercentageMinimumBattery == null) { + continue; + } + + // Check if the energy level percentage maximum and minimum are valid + if ((energyLevelPercentageMaximumBattery - energyLevelPercentageMinimumBattery) + < BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { + continue; + } + + // Calculate total available charge and discharge power + for (int i = 0; i < timestampsMillisList.size(); i++) { + long timestampMillis = timestampsMillisList.get(i); + double totalPower = totalPowerConsumptionProductionFlexList.get(i); + + Double powerLimitMaximum = powerLimitMaximumMap.getOrDefault(timestampMillis, null); + Double powerLimitMinimum = powerLimitMinimumMap.getOrDefault(timestampMillis, null); + + if (powerLimitMaximum != null) { + double powerLimitMaximumVirtual = + powerLimitMaximum * (1 - POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01); + double chargePowerTotalAvailable = powerLimitMaximumVirtual - totalPower; + chargePowerAvailableTotalList.add(chargePowerTotalAvailable); + } else { + chargePowerAvailableTotalList.add(Double.POSITIVE_INFINITY); } - // Calculate power average for each 15-minute interval - List> totalPowerConsumptionAveraged = intervalAverage(energyOptimisationPowerConsumptionPredicted, intervalMillis); - totalPowerConsumptionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - -// System.out.println("totalPowerConsumptionAveraged = " + totalPowerConsumptionAveraged); - - long startTimestampMillis = totalPowerConsumptionAveraged.getFirst().getTimestamp(); - long endTimestampMillis = totalPowerConsumptionAveraged.getLast().getTimestamp(); - - // Interpolate power average values for each 15-minute interval - List> totalPowerConsumptionInterpolated = intervalInterpolate(totalPowerConsumptionAveraged, startTimestampMillis, endTimestampMillis, intervalMillis); - - List timestampsMillisList = new ArrayList<>(); - List totalPowerConsumptionList = new ArrayList<>(); - - for (ValueDatapoint datapoint : totalPowerConsumptionInterpolated) { - long timestampMillis = datapoint.getTimestamp(); - Double value = (Double) datapoint.getValue(); - - timestampsMillisList.add(timestampMillis); - totalPowerConsumptionList.add(value); + if (powerLimitMinimum != null) { + double powerLimitMinimumVirtual = + powerLimitMinimum * (1 - POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01); + double dischargePowerTotalAvailable = powerLimitMinimumVirtual - totalPower; + dischargePowerAvailableTotalList.add(dischargePowerTotalAvailable); + } else { + dischargePowerAvailableTotalList.add(Double.NEGATIVE_INFINITY); } - -// System.out.println("timestampsMillisList = " + timestampsMillisList); -// System.out.println("totalPowerConsumptionList = " + totalPowerConsumptionList); - - if (totalPowerConsumptionList.isEmpty()) { - return batteryEnergyLevelPercentageTargets; + } + + int numberOfDataPoints = chargePowerAvailableTotalList.size(); + + // System.out.println("numberOfDataPoints = " + numberOfDataPoints); + // System.out.println("chargePowerAvailableTotalList = " + + // chargePowerAvailableTotalList); + // System.out.println("dischargePowerAvailableTotalList = " + + // dischargePowerAvailableTotalList); + + List chargeNeededTotalList = + dischargePowerAvailableTotalList.stream().map(x -> x > 0 ? x : 0).toList(); + List dischargeNeededTotalList = + chargePowerAvailableTotalList.stream().map(x -> x < 0 ? x : 0).toList(); + + // System.out.println("chargeNeededTotalList = " + chargeNeededTotalList); + // System.out.println("dischargeNeededTotalList = " + dischargeNeededTotalList); + + List chargePowerAvailableBatteryList = + chargePowerAvailableTotalList.stream() + .map(x -> x > 0 ? Math.min(x, chargePowerMaximumBattery) : 0) + .toList(); + List dischargePowerAvailableBatteryList = + dischargePowerAvailableTotalList.stream() + .map(x -> x < 0 ? Math.max(x, dischargePowerMaximumBattery) : 0) + .toList(); + + // System.out.println("chargeAvailableBatteryList = " + + // chargePowerAvailableBatteryList); + // System.out.println("dischargeAvailableBatteryList = " + + // dischargePowerAvailableBatteryList); + // System.out.println(); + + // Convert power to energy level percentage + List chargePercentageNeededTotalList = new ArrayList<>(); + List dischargePercentageNeededTotalList = new ArrayList<>(); + + chargeEfficiencyBattery = chargeEfficiencyBattery - BATTERY_EFFICIENCY_BUFFER_PERCENTAGE; + dischargeEfficiencyBattery = + dischargeEfficiencyBattery - BATTERY_EFFICIENCY_BUFFER_PERCENTAGE; + + for (int i = 0; i < numberOfDataPoints; i++) { + double c = + intervalHour + * chargeNeededTotalList.get(i) + * chargeEfficiencyBattery + / energyCapacityBattery; + double d = + 10000 + * intervalHour + * dischargeNeededTotalList.get(i) + / (energyCapacityBattery * dischargeEfficiencyBattery); + chargePercentageNeededTotalList.add(c); + dischargePercentageNeededTotalList.add(d); + } + + // System.out.println("chargePercentageNeededTotalList = " + + // chargePercentageNeededTotalList); + // System.out.println("dischargePercentageNeededTotalList = " + + // dischargePercentageNeededTotalList); + + List chargePercentageAvailableBatteryList = new ArrayList<>(); + List dischargePercentageAvailableBatteryList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + double c = + intervalHour + * chargePowerAvailableBatteryList.get(i) + * chargeEfficiencyBattery + / energyCapacityBattery; + double d = + 10000 + * intervalHour + * dischargePowerAvailableBatteryList.get(i) + / (energyCapacityBattery * dischargeEfficiencyBattery); + chargePercentageAvailableBatteryList.add(c); + dischargePercentageAvailableBatteryList.add(d); + } + + // System.out.println("chargePercentageAvailableBatteryList = " + + // chargePercentageAvailableBatteryList); + // System.out.println("dischargePercentageAvailableBatteryList = " + + // dischargePercentageAvailableBatteryList); + // System.out.println(); + + // Calculate forecast when current energy level percentage is outside limits + int getToLimitIndex = 0; + double getToLimitPercentage = energyLevelPercentageBattery; + List getToLimitPercentageList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + getToLimitIndex = i; + + if (getToLimitPercentage > energyLevelPercentageMaximumBattery) { + double dischargePercentageNeeded = + energyLevelPercentageMaximumBattery - getToLimitPercentage; + double dischargePercentageAvailable = + Math.max(dischargePercentageAvailableBatteryList.get(i), dischargePercentageNeeded); + getToLimitPercentage = getToLimitPercentage + dischargePercentageAvailable; + dischargePercentageAvailableBatteryList.set( + i, dischargePercentageAvailableBatteryList.get(i) - dischargePercentageAvailable); + getToLimitPercentageList.add(getToLimitPercentage); + } else if (getToLimitPercentage < energyLevelPercentageMinimumBattery) { + double chargePercentageNeeded = + energyLevelPercentageMinimumBattery - getToLimitPercentage; + double chargePercentageAvailable = + Math.min(chargePercentageAvailableBatteryList.get(i), chargePercentageNeeded); + getToLimitPercentage = getToLimitPercentage + chargePercentageAvailable; + chargePercentageAvailableBatteryList.set( + i, chargePercentageAvailableBatteryList.get(i) - chargePercentageAvailable); + getToLimitPercentageList.add(getToLimitPercentage); + } else { + break; } - - AssetDatapointAllQuery assetDatapointQueryPeriodPredicted = new AssetDatapointAllQuery(startTimestampMillis, endTimestampMillis); - List> energyOptimisationPowerProductionPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName(), assetDatapointQueryPeriodPredicted); - -// System.out.println("energyOptimisationPowerProductionPredicted = " + energyOptimisationPowerProductionPredicted); - - Map totalPowerProductionMap = new HashMap<>(); - - if (!energyOptimisationPowerProductionPredicted.isEmpty()) { - // Calculate power average for each 15-minute interval - List> totalPowerProductionAveraged = intervalAverage(energyOptimisationPowerProductionPredicted, intervalMillis); - totalPowerProductionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - - // Interpolate power average values for each 15-minute interval - List> totalPowerProductionInterpolated = intervalInterpolate(totalPowerProductionAveraged, totalPowerProductionAveraged.getFirst().getTimestamp(), totalPowerProductionAveraged.getLast().getTimestamp(), intervalMillis); - - totalPowerProductionMap = totalPowerProductionInterpolated.stream().collect(Collectors.toMap(ValueDatapoint::getTimestamp, dp -> ((Double) dp.getValue()))); + } + + // System.out.println("getToLimitIndex = " + getToLimitIndex); + // System.out.println("getToLimitPercentage = " + getToLimitPercentage); + // System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); + // System.out.println("chargePercentageAvailableBatteryList = " + + // chargePercentageAvailableBatteryList); + // System.out.println("dischargePercentageAvailableBatteryList = " + + // dischargePercentageAvailableBatteryList); + + List energyLevelPredictionList = new ArrayList<>(); + + if (getToLimitPercentage > energyLevelPercentageMaximumBattery + || getToLimitPercentage < energyLevelPercentageMinimumBattery) { + // Energy level percentage forecast when whole forecast is outside of battery percentage + // limits + energyLevelPredictionList = getToLimitPercentageList; + } else { + // Calculate energy level percentage forecast starting from value within battery percentage + // limits + List chargePercentageWantBatteryList = new ArrayList<>(); + List dischargePercentageWantBatteryList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + chargePercentageWantBatteryList.add( + Math.min( + chargePercentageNeededTotalList.get(i), + chargePercentageAvailableBatteryList.get(i))); + dischargePercentageWantBatteryList.add( + Math.max( + dischargePercentageNeededTotalList.get(i), + dischargePercentageAvailableBatteryList.get(i))); } - // List to store the sum of total power consumption, production and flexible power - List totalPowerConsumptionProductionFlexList = new ArrayList<>(); + // System.out.println("chargePercentageWantBatteryList = " + + // chargePercentageWantBatteryList); + // System.out.println("dischargePercentageWantBatteryList = " + + // dischargePercentageWantBatteryList); - // Sum total power consumption and production - for (int i = 0; i < timestampsMillisList.size(); i++) { - Double powerConsumption = totalPowerConsumptionList.get(i); - Double powerProduction = totalPowerProductionMap.get(timestampsMillisList.get(i)); + List chargeAndDischargePercentageWantBatteryList = new ArrayList<>(); - if (powerProduction != null) { - double sum = powerConsumption + powerProduction; - totalPowerConsumptionProductionFlexList.add(sum); - } else { - totalPowerConsumptionProductionFlexList.add(powerConsumption); - } + for (int i = 0; i < numberOfDataPoints; i++) { + chargeAndDischargePercentageWantBatteryList.add( + chargePercentageWantBatteryList.get(i) + dischargePercentageWantBatteryList.get(i)); } -// System.out.println("totalPowerConsumptionProductionFlexList = " + totalPowerConsumptionProductionFlexList); -// System.out.println(); + // System.out.println("chargeAndDischargePercentageWantBatteryList = " + + // chargeAndDischargePercentageWantBatteryList); + // System.out.println(); - // Get power limits forecasts - List> energyOptimisationPowerLimitMaximumPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), assetDatapointQueryPeriodPredicted); - List> energyOptimisationPowerLimitMinimumPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), assetDatapointQueryPeriodPredicted); + // Calculate forecast without battery percentage limits + int startRunningSumIndex = getToLimitIndex > 0 ? getToLimitIndex - 1 : 0; + List runningSumList = new ArrayList<>(); + double sum = getToLimitPercentage; - Map powerLimitMaximumMap = new HashMap<>(); - Map powerLimitMinimumMap = new HashMap<>(); - - for (ValueDatapoint dp : energyOptimisationPowerLimitMaximumPredicted) { - powerLimitMaximumMap.put(dp.getTimestamp(), (Double) dp.getValue()); - } - - for (ValueDatapoint dp : energyOptimisationPowerLimitMinimumPredicted) { - powerLimitMinimumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + for (int i = startRunningSumIndex; i < numberOfDataPoints; i++) { + sum = sum + chargeAndDischargePercentageWantBatteryList.get(i); + runningSumList.add(sum); } - List chargePowerAvailableTotalList = new ArrayList<>(); - List dischargePowerAvailableTotalList = new ArrayList<>(); - - // Add current available charge and discharge power - chargePowerAvailableTotalList.add(0.0); - dischargePowerAvailableTotalList.add(0.0); - - double intervalHour = (double) intervalMillis / (60 * 60000); - - // Calculate forecast for each battery - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String batteryAssetId = electricityBatteryAsset.getId(); - Integer chargeEfficiencyBattery = electricityBatteryAsset.getChargeEfficiency().orElse(null); - Double chargePowerMaximumBattery = electricityBatteryAsset.getChargePowerMaximum().orElse(null); - Integer dischargeEfficiencyBattery = electricityBatteryAsset.getDischargeEfficiency().orElse(null); - Double dischargePowerMaximumBattery = electricityBatteryAsset.getDischargePowerMaximum().orElse(null); - Double energyCapacityBattery = electricityBatteryAsset.getEnergyCapacity().orElse(null); - Double energyLevelPercentageBattery = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - Integer energyLevelPercentageMaximumBattery = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimumBattery = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - - if (chargeEfficiencyBattery == null || chargePowerMaximumBattery == null || dischargeEfficiencyBattery == null || dischargePowerMaximumBattery == null || energyCapacityBattery == null || - energyLevelPercentageBattery == null || energyLevelPercentageMaximumBattery == null || energyLevelPercentageMinimumBattery == null) { - continue; - } - - // Check if the energy level percentage maximum and minimum are valid - if ((energyLevelPercentageMaximumBattery - energyLevelPercentageMinimumBattery) < BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { - continue; - } - - // Calculate total available charge and discharge power - for (int i = 0; i < timestampsMillisList.size(); i++) { - long timestampMillis = timestampsMillisList.get(i); - double totalPower = totalPowerConsumptionProductionFlexList.get(i); - - Double powerLimitMaximum = powerLimitMaximumMap.getOrDefault(timestampMillis, null); - Double powerLimitMinimum = powerLimitMinimumMap.getOrDefault(timestampMillis, null); - - if (powerLimitMaximum != null) { - double powerLimitMaximumVirtual = powerLimitMaximum * (1 - POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01); - double chargePowerTotalAvailable = powerLimitMaximumVirtual - totalPower; - chargePowerAvailableTotalList.add(chargePowerTotalAvailable); - } else { - chargePowerAvailableTotalList.add(Double.POSITIVE_INFINITY); - } - - if (powerLimitMinimum != null) { - double powerLimitMinimumVirtual = powerLimitMinimum * (1 - POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01); - double dischargePowerTotalAvailable = powerLimitMinimumVirtual - totalPower; - dischargePowerAvailableTotalList.add(dischargePowerTotalAvailable); - } else { - dischargePowerAvailableTotalList.add(Double.NEGATIVE_INFINITY); - } - } - - int numberOfDataPoints = chargePowerAvailableTotalList.size(); - -// System.out.println("numberOfDataPoints = " + numberOfDataPoints); -// System.out.println("chargePowerAvailableTotalList = " + chargePowerAvailableTotalList); -// System.out.println("dischargePowerAvailableTotalList = " + dischargePowerAvailableTotalList); - - List chargeNeededTotalList = dischargePowerAvailableTotalList.stream().map(x -> x > 0 ? x : 0).toList(); - List dischargeNeededTotalList = chargePowerAvailableTotalList.stream().map(x -> x < 0 ? x : 0).toList(); - -// System.out.println("chargeNeededTotalList = " + chargeNeededTotalList); -// System.out.println("dischargeNeededTotalList = " + dischargeNeededTotalList); + // System.out.println("getToLimitPercentageList = " + + // getToLimitPercentageList); + // System.out.println("runningSumList = " + runningSumList); + // System.out.println(); - List chargePowerAvailableBatteryList = chargePowerAvailableTotalList.stream().map(x -> x > 0 ? Math.min(x, chargePowerMaximumBattery) : 0).toList(); - List dischargePowerAvailableBatteryList = dischargePowerAvailableTotalList.stream().map(x -> x < 0 ? Math.max(x, dischargePowerMaximumBattery) : 0).toList(); - -// System.out.println("chargeAvailableBatteryList = " + chargePowerAvailableBatteryList); -// System.out.println("dischargeAvailableBatteryList = " + dischargePowerAvailableBatteryList); -// System.out.println(); - - // Convert power to energy level percentage - List chargePercentageNeededTotalList = new ArrayList<>(); - List dischargePercentageNeededTotalList = new ArrayList<>(); - - chargeEfficiencyBattery = chargeEfficiencyBattery - BATTERY_EFFICIENCY_BUFFER_PERCENTAGE; - dischargeEfficiencyBattery = dischargeEfficiencyBattery - BATTERY_EFFICIENCY_BUFFER_PERCENTAGE; - - for (int i = 0; i < numberOfDataPoints; i++) { - double c = intervalHour * chargeNeededTotalList.get(i) * chargeEfficiencyBattery / energyCapacityBattery; - double d = 10000 * intervalHour * dischargeNeededTotalList.get(i) / (energyCapacityBattery * dischargeEfficiencyBattery); - chargePercentageNeededTotalList.add(c); - dischargePercentageNeededTotalList.add(d); - } - -// System.out.println("chargePercentageNeededTotalList = " + chargePercentageNeededTotalList); -// System.out.println("dischargePercentageNeededTotalList = " + dischargePercentageNeededTotalList); - - List chargePercentageAvailableBatteryList = new ArrayList<>(); - List dischargePercentageAvailableBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - double c = intervalHour * chargePowerAvailableBatteryList.get(i) * chargeEfficiencyBattery / energyCapacityBattery; - double d = 10000 * intervalHour * dischargePowerAvailableBatteryList.get(i) / (energyCapacityBattery * dischargeEfficiencyBattery); - chargePercentageAvailableBatteryList.add(c); - dischargePercentageAvailableBatteryList.add(d); - } - -// System.out.println("chargePercentageAvailableBatteryList = " + chargePercentageAvailableBatteryList); -// System.out.println("dischargePercentageAvailableBatteryList = " + dischargePercentageAvailableBatteryList); -// System.out.println(); - - // Calculate forecast when current energy level percentage is outside limits - int getToLimitIndex = 0; - double getToLimitPercentage = energyLevelPercentageBattery; - List getToLimitPercentageList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - getToLimitIndex = i; - - if (getToLimitPercentage > energyLevelPercentageMaximumBattery) { - double dischargePercentageNeeded = energyLevelPercentageMaximumBattery - getToLimitPercentage; - double dischargePercentageAvailable = Math.max(dischargePercentageAvailableBatteryList.get(i), dischargePercentageNeeded); - getToLimitPercentage = getToLimitPercentage + dischargePercentageAvailable; - dischargePercentageAvailableBatteryList.set(i, dischargePercentageAvailableBatteryList.get(i) - dischargePercentageAvailable); - getToLimitPercentageList.add(getToLimitPercentage); - } else if (getToLimitPercentage < energyLevelPercentageMinimumBattery) { - double chargePercentageNeeded = energyLevelPercentageMinimumBattery - getToLimitPercentage; - double chargePercentageAvailable = Math.min(chargePercentageAvailableBatteryList.get(i), chargePercentageNeeded); - getToLimitPercentage = getToLimitPercentage + chargePercentageAvailable; - chargePercentageAvailableBatteryList.set(i, chargePercentageAvailableBatteryList.get(i) - chargePercentageAvailable); - getToLimitPercentageList.add(getToLimitPercentage); - } else { - break; - } - } - -// System.out.println("getToLimitIndex = " + getToLimitIndex); -// System.out.println("getToLimitPercentage = " + getToLimitPercentage); -// System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); -// System.out.println("chargePercentageAvailableBatteryList = " + chargePercentageAvailableBatteryList); -// System.out.println("dischargePercentageAvailableBatteryList = " + dischargePercentageAvailableBatteryList); - - List energyLevelPredictionList = new ArrayList<>(); - - if (getToLimitPercentage > energyLevelPercentageMaximumBattery || getToLimitPercentage < energyLevelPercentageMinimumBattery) { - // Energy level percentage forecast when whole forecast is outside of battery percentage limits - energyLevelPredictionList = getToLimitPercentageList; - } else { - // Calculate energy level percentage forecast starting from value within battery percentage limits - List chargePercentageWantBatteryList = new ArrayList<>(); - List dischargePercentageWantBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - chargePercentageWantBatteryList.add(Math.min(chargePercentageNeededTotalList.get(i), chargePercentageAvailableBatteryList.get(i))); - dischargePercentageWantBatteryList.add(Math.max(dischargePercentageNeededTotalList.get(i), dischargePercentageAvailableBatteryList.get(i))); - } - -// System.out.println("chargePercentageWantBatteryList = " + chargePercentageWantBatteryList); -// System.out.println("dischargePercentageWantBatteryList = " + dischargePercentageWantBatteryList); - - List chargeAndDischargePercentageWantBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - chargeAndDischargePercentageWantBatteryList.add(chargePercentageWantBatteryList.get(i) + dischargePercentageWantBatteryList.get(i)); - } - -// System.out.println("chargeAndDischargePercentageWantBatteryList = " + chargeAndDischargePercentageWantBatteryList); -// System.out.println(); - - // Calculate forecast without battery percentage limits - int startRunningSumIndex = getToLimitIndex > 0 ? getToLimitIndex - 1 : 0; - List runningSumList = new ArrayList<>(); - double sum = getToLimitPercentage; - - for (int i = startRunningSumIndex; i < numberOfDataPoints; i++) { - sum = sum + chargeAndDischargePercentageWantBatteryList.get(i); - runningSumList.add(sum); - } - -// System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); -// System.out.println("runningSumList = " + runningSumList); -// System.out.println(); - - // Combine outside limits and running sum energy level percentages - if (getToLimitPercentageList.size() > 1) { - energyLevelPredictionList.addAll(getToLimitPercentageList.subList(0, getToLimitPercentageList.size() - 1)); - } - energyLevelPredictionList.addAll(runningSumList); - -// System.out.println("energyLevelPredictionList = " + energyLevelPredictionList); -// System.out.println(); - - // Calculate forecast starting within battery percentage limits - double energyLevelPredictionMaximum = Collections.max(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionList.size())); - double energyLevelPredictionMinimum = Collections.min(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionList.size())); - - long dtStart = services.getTimerService().getCurrentTimeMillis(); - long dt = 0; - long timeoutMillis = 10000; - - int intervalEndIndex = startRunningSumIndex; - int predictionListIndex = startRunningSumIndex; - - while (energyLevelPredictionMaximum > energyLevelPercentageMaximumBattery || energyLevelPredictionMinimum < energyLevelPercentageMinimumBattery) { - String chargeOrDischarge = ""; - int intervalStartIndex = startRunningSumIndex; - - for (int i = intervalEndIndex; i < energyLevelPredictionList.size(); i++) { - predictionListIndex = i; - - if (energyLevelPredictionList.get(i) < energyLevelPercentageMinimumBattery) { - intervalEndIndex = i; - - for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { - if (energyLevelPredictionList.get(j) >= energyLevelPercentageMaximumBattery) { - intervalStartIndex = j; - break; - } - } - - chargeOrDischarge = "charge"; - -// System.out.println("CHARGE"); -// System.out.println("intervalStartIndex = " + intervalStartIndex); -// System.out.println("intervalEndIndex = " + intervalEndIndex); - - break; - } else if (energyLevelPredictionList.get(i) > energyLevelPercentageMaximumBattery) { - intervalEndIndex = i; - - for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { - if (energyLevelPredictionList.get(j) <= energyLevelPercentageMinimumBattery) { - intervalStartIndex = j; - break; - } - } - - chargeOrDischarge = "discharge"; - -// System.out.println("DISCHARGE"); -// System.out.println("intervalStartIndex = " + intervalStartIndex); -// System.out.println("intervalEndIndex = " + intervalEndIndex); - - break; - } - } - - int changeIndex = -1; - double energyLevelPredictionValueBefore = energyLevelPredictionList.get(intervalEndIndex); - - if (chargeOrDischarge.equals("charge")) { - double chargeAvailable = 0; - double chargeAvailableInterval = energyLevelPercentageMaximumBattery - Collections.max(energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)); - - if (chargeAvailableInterval > 0) { - for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { - if (i - 1 < 0) { - break; - } - - double chargeAvailableLeft = 0; - - if (dischargePercentageWantBatteryList.get(i) >= 0) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; - } - - if (chargeAvailableLeft > 0) { - changeIndex = i; - chargeAvailable = Math.min(chargeAvailableInterval, chargeAvailableLeft); - break; - } - } - } - - double chargeNeeded = energyLevelPercentageMinimumBattery - energyLevelPredictionList.get(intervalEndIndex); - double changeValue = Math.min(chargeAvailable, chargeNeeded); - - if (changeIndex == -1) { - changeIndex = intervalEndIndex; - changeValue = chargeNeeded; - } - - for (int i = changeIndex; i < energyLevelPredictionList.size(); i++) { - energyLevelPredictionList.set(i, energyLevelPredictionList.get(i) + changeValue); - } - } else if (chargeOrDischarge.equals("discharge")) { - double dischargeAvailable = 0; - double dischargeAvailableInterval = energyLevelPercentageMinimumBattery - Collections.min(energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)); - - if (dischargeAvailableInterval > 0) { - for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { - if (i - 1 < 0) { - break; - } - - double dischargeAvailableLeft = 0; - - if (chargePercentageWantBatteryList.get(i) <= 0) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - dischargeAvailableLeft = dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; - } - if (dischargeAvailableLeft < 0) { - changeIndex = i; - dischargeAvailable = Math.max(dischargeAvailableInterval, dischargeAvailableLeft); - break; - } - } - } - - double dischargeNeeded = energyLevelPercentageMaximumBattery - energyLevelPredictionList.get(intervalEndIndex); - double changeValue = Math.max(dischargeAvailable, dischargeNeeded); - - if (changeIndex == -1) { - changeIndex = intervalEndIndex; - changeValue = dischargeNeeded; - } - - for (int i = changeIndex; i < energyLevelPredictionList.size(); i++) { - energyLevelPredictionList.set(i, energyLevelPredictionList.get(i) + changeValue); - } - } - - if (energyLevelPredictionValueBefore == energyLevelPredictionList.get(intervalEndIndex)) { - LOG.warning(String.format("Battery energy level percentage calculation error at index = %s", predictionListIndex)); -// System.out.println("ERROR: calculation error at index = " + predictionListIndex); - break; - } else if (dt > timeoutMillis) { - LOG.warning(String.format("Battery energy level percentage calculation timed out at index = %s", predictionListIndex)); -// System.out.println("ERROR: calculation timeout at index = " + predictionListIndex); - break; - } - - energyLevelPredictionMaximum = Collections.max(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionList.size())); - energyLevelPredictionMinimum = Collections.min(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionList.size())); - dt = services.getTimerService().getCurrentTimeMillis() - dtStart; - } - -// System.out.println("After limits: energyLevelPredictionList = " + energyLevelPredictionList + "\n"); - - // Get day ahead asset - EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); - boolean useDayAheadTariffs = false; - - if (dayAheadAsset != null) { - useDayAheadTariffs = dayAheadAsset.getUseTariffDayAheadForecasts().orElse(false); + // Combine outside limits and running sum energy level percentages + if (getToLimitPercentageList.size() > 1) { + energyLevelPredictionList.addAll( + getToLimitPercentageList.subList(0, getToLimitPercentageList.size() - 1)); + } + energyLevelPredictionList.addAll(runningSumList); + + // System.out.println("energyLevelPredictionList = " + + // energyLevelPredictionList); + // System.out.println(); + + // Calculate forecast starting within battery percentage limits + double energyLevelPredictionMaximum = + Collections.max( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionList.size())); + double energyLevelPredictionMinimum = + Collections.min( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionList.size())); + + long dtStart = services.getTimerService().getCurrentTimeMillis(); + long dt = 0; + long timeoutMillis = 10000; + + int intervalEndIndex = startRunningSumIndex; + int predictionListIndex = startRunningSumIndex; + + while (energyLevelPredictionMaximum > energyLevelPercentageMaximumBattery + || energyLevelPredictionMinimum < energyLevelPercentageMinimumBattery) { + String chargeOrDischarge = ""; + int intervalStartIndex = startRunningSumIndex; + + for (int i = intervalEndIndex; i < energyLevelPredictionList.size(); i++) { + predictionListIndex = i; + + if (energyLevelPredictionList.get(i) < energyLevelPercentageMinimumBattery) { + intervalEndIndex = i; + + for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { + if (energyLevelPredictionList.get(j) >= energyLevelPercentageMaximumBattery) { + intervalStartIndex = j; + break; } + } - // Get the tariff forecasts from energy optimisation asset for 1 week - List> tariffExportDatapoints = getTariffDatapoints(energyOptimisationAsset, EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), services); - List> tariffImportDatapoints = getTariffDatapoints(energyOptimisationAsset, EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), services); + chargeOrDischarge = "charge"; - // Overwrite the current tariff forecasts with the day ahead tariff forecasts - if (useDayAheadTariffs) { - List> tariffExportDayAheadAssetDatapoints = getTariffDayAheadDatapoints(dayAheadAsset, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), services); - List> tariffImportDayAheadAssetDatapoints = getTariffDayAheadDatapoints(dayAheadAsset, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), services); + // System.out.println("CHARGE"); + // System.out.println("intervalStartIndex = " + + // intervalStartIndex); + // System.out.println("intervalEndIndex = " + + // intervalEndIndex); - // Combine tariff export forecasts - if (!tariffExportDayAheadAssetDatapoints.isEmpty()) { - Map> mergedMap = new HashMap<>(); + break; + } else if (energyLevelPredictionList.get(i) > energyLevelPercentageMaximumBattery) { + intervalEndIndex = i; - for (ValueDatapoint dp : tariffExportDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - for (ValueDatapoint dp : tariffExportDayAheadAssetDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - tariffExportDatapoints = new ArrayList<>(mergedMap.values()); - tariffExportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - } - - // Combine tariff import forecasts - if (!tariffImportDayAheadAssetDatapoints.isEmpty()) { - Map> mergedMap = new HashMap<>(); - - for (ValueDatapoint dp : tariffImportDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - for (ValueDatapoint dp : tariffImportDayAheadAssetDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - tariffImportDatapoints = new ArrayList<>(mergedMap.values()); - tariffImportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - } + for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { + if (energyLevelPredictionList.get(j) <= energyLevelPercentageMinimumBattery) { + intervalStartIndex = j; + break; } + } - // Calculate battery energy level percentage default - double energyLevelPercentageDefault = batteryCalculateEnergyLevelPercentageDefault(energyLevelPercentageMaximumBattery, energyLevelPercentageMinimumBattery, energyOptimisationAsset); - - // TODO: make window dynamic based on time needed to reach energyLevelPercentageDefault - // Calculate optimal charge and discharge zone for each day based on tariffs - Map chargeAndDischargeZonesMap = calculateTariffChargeAndDischargeZones(tariffImportDatapoints, tariffExportDatapoints, 4); + chargeOrDischarge = "discharge"; - // Charge zone = 1, discharge zone = -1 - List chargeAndDischargeZonesList = new ArrayList<>(Collections.nCopies(energyLevelPredictionList.size(), 0)); + // System.out.println("DISCHARGE"); + // System.out.println("intervalStartIndex = " + + // intervalStartIndex); + // System.out.println("intervalEndIndex = " + + // intervalEndIndex); - for (Map.Entry entry : chargeAndDischargeZonesMap.entrySet()) { - long timestampMillis = entry.getKey(); - int value = entry.getValue(); - - int timestampIndex = timestampsMillisList.indexOf(timestampMillis); - - if (timestampIndex != -1) { - // Add 1 to align list indices - chargeAndDischargeZonesList.set(timestampIndex + 1, value); - } + break; + } + } + + int changeIndex = -1; + double energyLevelPredictionValueBefore = energyLevelPredictionList.get(intervalEndIndex); + + if (chargeOrDischarge.equals("charge")) { + double chargeAvailable = 0; + double chargeAvailableInterval = + energyLevelPercentageMaximumBattery + - Collections.max( + energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)); + + if (chargeAvailableInterval > 0) { + for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { + if (i - 1 < 0) { + break; } -// System.out.println("chargeAndDischargeZonesList = " + chargeAndDischargeZonesList); - - // Default energy level percentage for each interval - List energyLevelPercentageDefaultList = new ArrayList<>(Collections.nCopies(chargeAndDischargeZonesList.size(), energyLevelPercentageDefault)); + double chargeAvailableLeft = 0; - for (int i = 0; i < chargeAndDischargeZonesList.size(); i++) { - if (chargeAndDischargeZonesList.get(i) == 1) { - energyLevelPercentageDefaultList.set(i, Double.valueOf(energyLevelPercentageMaximumBattery)); - } else if (chargeAndDischargeZonesList.get(i) == -1) { - energyLevelPercentageDefaultList.set(i, Double.valueOf(energyLevelPercentageMinimumBattery)); - } + if (dischargePercentageWantBatteryList.get(i) >= 0) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; } -// System.out.println("energyLevelPercentageDefaultList = " + energyLevelPercentageDefaultList); - - // TODO: handle debounce interval in forecast - // Optimise forecast based on optimal tariffs - for (int i = 1; i < chargeAndDischargeZonesList.size() && i < energyLevelPredictionList.size(); i++) { - // Only adjust forecast if predicted energy level percentage is outside battery debounce interval - if (Math.abs(energyLevelPredictionList.get(i) - energyLevelPercentageDefaultList.get(i)) <= BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { - continue; - } - - if (chargeAndDischargeZonesList.get(i) == 1 && energyLevelPredictionList.get(i) < energyLevelPercentageDefaultList.get(i)) { - Double energyLevelIntervalMaximum = Collections.max(energyLevelPredictionList.subList(i, energyLevelPredictionList.size())); - - double chargeSpaceLeft = energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum; - - if (chargeSpaceLeft > 0) { - double chargeNeeded = energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i); - double chargeAvailableLeft = 0; - - if (dischargePercentageWantBatteryList.get(i) >= 0) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; - } - - if (chargeAvailableLeft > 0) { - chargeAvailableLeft = Math.min(Math.min(chargeSpaceLeft, chargeAvailableLeft), chargeNeeded); - - for (int j = i; j < energyLevelPredictionList.size(); j++) { - energyLevelPredictionList.set(j, energyLevelPredictionList.get(j) + chargeAvailableLeft); - } - } - } else { - double chargeZoneEnergyLevel = energyLevelPredictionList.get(i); - - int energyLevelIntervalMaximumIndex = energyLevelPredictionList.size(); - - if (energyLevelIntervalMaximum >= energyLevelPercentageMaximumBattery) { - energyLevelIntervalMaximumIndex = energyLevelPredictionList.indexOf(energyLevelIntervalMaximum); - } - - for (int k = i; k <= energyLevelIntervalMaximumIndex; k++) { - double chargeNeeded = energyLevelPredictionList.get(k) - chargeZoneEnergyLevel; - - if (chargeNeeded > 0 && chargePercentageWantBatteryList.get(k) == 0) { - double chargeAvailableLeft = 0; - - if (dischargePercentageWantBatteryList.get(i) >= 0) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; - } - - if (chargeAvailableLeft > 0) { - double energyLevelIntervalMaximum2 = Collections.max(energyLevelPredictionList.subList(i, k - 1)); - double chargeSpaceInterval = energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum2; - - if (chargeSpaceInterval > 0) { - chargeAvailableLeft = Math.min(Math.min(chargeAvailableLeft, chargeNeeded), chargeSpaceInterval); - - for (int j = i; j < k; j++) { - energyLevelPredictionList.set(j, energyLevelPredictionList.get(j) + chargeAvailableLeft); - } - } - } - - break; - } - } - } - } else if (chargeAndDischargeZonesList.get(i) == -1 && energyLevelPredictionList.get(i) > energyLevelPercentageDefaultList.get(i)) { - Double energyLevelIntervalMinimum = Collections.min(energyLevelPredictionList.subList(i, energyLevelPredictionList.size())); - - double dischargeSpaceLeft = energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum; - - if (dischargeSpaceLeft < 0) { - double dischargeNeeded = energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i); - double dischargeAvailableLeft = 0; - - if (chargePercentageWantBatteryList.get(i) <= 0) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - dischargeAvailableLeft = dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; - } - - if (dischargeAvailableLeft < 0) { - dischargeAvailableLeft = Math.max(Math.max(dischargeSpaceLeft, dischargeAvailableLeft), dischargeNeeded); - - for (int j = i; j < energyLevelPredictionList.size(); j++) { - energyLevelPredictionList.set(j, energyLevelPredictionList.get(j) + dischargeAvailableLeft); - } - } - } else { - double dischargeZoneEnergyLevel = energyLevelPredictionList.get(i); - - int energyLevelIntervalMinimumIndex = energyLevelPredictionList.size(); - - if (energyLevelIntervalMinimum <= energyLevelPercentageMinimumBattery) { - energyLevelIntervalMinimumIndex = energyLevelPredictionList.indexOf(energyLevelIntervalMinimum); - } - - for (int k = i; k <= energyLevelIntervalMinimumIndex; k++) { - double dischargeNeeded = energyLevelPredictionList.get(k) - dischargeZoneEnergyLevel; - - if (dischargeNeeded < 0 && dischargePercentageWantBatteryList.get(k) == 0) { - double dischargeAvailableLeft = 0; - - if (chargePercentageWantBatteryList.get(i) <= 0) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - dischargeAvailableLeft = dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; - } - - if (dischargeAvailableLeft < 0) { - double energyLevelIntervalMinimum2 = Collections.min(energyLevelPredictionList.subList(i, k - 1)); - double dischargeSpaceInterval = energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum2; - - if (dischargeSpaceInterval < 0) { - dischargeAvailableLeft = Math.max(Math.max(dischargeAvailableLeft, dischargeNeeded), dischargeSpaceInterval); - - for (int j = i; j < k; j++) { - energyLevelPredictionList.set(j, energyLevelPredictionList.get(j) + dischargeAvailableLeft); - } - } - } - - break; - } - } - } - } + if (chargeAvailableLeft > 0) { + changeIndex = i; + chargeAvailable = Math.min(chargeAvailableInterval, chargeAvailableLeft); + break; } + } } -// System.out.println("After Tariffs: energyLevelPredictionList = " + energyLevelPredictionList + "\n"); + double chargeNeeded = + energyLevelPercentageMinimumBattery + - energyLevelPredictionList.get(intervalEndIndex); + double changeValue = Math.min(chargeAvailable, chargeNeeded); - // Get the current energy level percentage target - int batteryEnergyLevelPercentageTarget = (int) Math.round(energyLevelPredictionList.get(1)); - batteryEnergyLevelPercentageTargets.put(batteryAssetId, batteryEnergyLevelPercentageTarget); - - // Calculate energy level percentage change per interval - List percentageChangeBatteryList = new ArrayList<>(); - - for (int i = 0; i < energyLevelPredictionList.size() - 1; i++) { - double percentageChange = energyLevelPredictionList.get(i + 1) - energyLevelPredictionList.get(i); - percentageChangeBatteryList.add(percentageChange); + if (changeIndex == -1) { + changeIndex = intervalEndIndex; + changeValue = chargeNeeded; } -// System.out.println("percentageChangeBatteryList = " + percentageChangeBatteryList); - - // Calculate total power change for the EMS - List powerChangeTotalList = new ArrayList<>(); - - for (double percentageChange : percentageChangeBatteryList) { - double power = 0; - - if (percentageChange > 0) { - power = percentageChange * energyCapacityBattery / (intervalHour * chargeEfficiencyBattery); - } else if (percentageChange < 0) { - power = percentageChange * energyCapacityBattery * dischargeEfficiencyBattery / (10000 * intervalHour); - } - - powerChangeTotalList.add(round(power, 3)); + for (int i = changeIndex; i < energyLevelPredictionList.size(); i++) { + energyLevelPredictionList.set(i, energyLevelPredictionList.get(i) + changeValue); } + } else if (chargeOrDischarge.equals("discharge")) { + double dischargeAvailable = 0; + double dischargeAvailableInterval = + energyLevelPercentageMinimumBattery + - Collections.min( + energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)); + + if (dischargeAvailableInterval > 0) { + for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { + if (i - 1 < 0) { + break; + } -// System.out.println("powerChangeTotalList = " + powerChangeTotalList); + double dischargeAvailableLeft = 0; - for (int i = 0; i < powerChangeTotalList.size() - 1; i++) { - totalPowerConsumptionProductionFlexList.set(i, totalPowerConsumptionProductionFlexList.get(i) - powerChangeTotalList.get(i)); + if (chargePercentageWantBatteryList.get(i) <= 0) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + dischargeAvailableLeft = + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; + } + if (dischargeAvailableLeft < 0) { + changeIndex = i; + dischargeAvailable = Math.max(dischargeAvailableInterval, dischargeAvailableLeft); + break; + } + } } -// System.out.println("totalPowerConsumptionProductionFlexList = " + totalPowerConsumptionProductionFlexList); - - List> energyLevelPercentageForecast = new ArrayList<>(); - List> powerSetpointForecast = new ArrayList<>(); + double dischargeNeeded = + energyLevelPercentageMaximumBattery + - energyLevelPredictionList.get(intervalEndIndex); + double changeValue = Math.max(dischargeAvailable, dischargeNeeded); - // Update energy level percentage forecast starting after current time - for (int i = 1; i < timestampsMillisList.size(); i++) { - energyLevelPercentageForecast.add(new ValueDatapoint<>(timestampsMillisList.get(i), (int) Math.round(energyLevelPredictionList.get(i)))); + if (changeIndex == -1) { + changeIndex = intervalEndIndex; + changeValue = dischargeNeeded; } - // Update power set-point starting from current power limit - for (int i = 0; i < timestampsMillisList.size(); i++) { - powerSetpointForecast.add(new ValueDatapoint<>(timestampsMillisList.get(i), powerChangeTotalList.get(i))); + for (int i = changeIndex; i < energyLevelPredictionList.size(); i++) { + energyLevelPredictionList.set(i, energyLevelPredictionList.get(i) + changeValue); } - - services.getAssetPredictedDatapointService().updateValues(batteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), energyLevelPercentageForecast); - services.getAssetPredictedDatapointService().updateValues(batteryAssetId, EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), powerSetpointForecast); - -// System.out.println("UPDATED forecasts"); + } + + if (energyLevelPredictionValueBefore == energyLevelPredictionList.get(intervalEndIndex)) { + LOG.warning( + String.format( + "Battery energy level percentage calculation error at index = %s", + predictionListIndex)); + // System.out.println("ERROR: calculation error at index = " + + // predictionListIndex); + break; + } else if (dt > timeoutMillis) { + LOG.warning( + String.format( + "Battery energy level percentage calculation timed out at index = %s", + predictionListIndex)); + // System.out.println("ERROR: calculation timeout at index = " + + // predictionListIndex); + break; + } + + energyLevelPredictionMaximum = + Collections.max( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionList.size())); + energyLevelPredictionMinimum = + Collections.min( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionList.size())); + dt = services.getTimerService().getCurrentTimeMillis() - dtStart; } - return batteryEnergyLevelPercentageTargets; - } - - private Map batteryCalculatePowerFlexibleAvailable(List electricityBatteryAssets) { - HashMap powerFlexibleAvailable = new HashMap<>(); + // System.out.println("After limits: energyLevelPredictionList = " + + // energyLevelPredictionList + "\n"); - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - boolean allowCharging = electricityBatteryAsset.getAllowCharging().orElse(false); - boolean allowDischarging = electricityBatteryAsset.getAllowDischarging().orElse(false); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + // Get day ahead asset + EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); + boolean useDayAheadTariffs = false; - double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(0.0); - double dischargePowerMaximum = electricityBatteryAsset.getDischargePowerMaximum().orElse(0.0); + if (dayAheadAsset != null) { + useDayAheadTariffs = dayAheadAsset.getUseTariffDayAheadForecasts().orElse(false); + } - if (!allowCharging || energyLevelPercentageMaximum == null || energyLevelPercentage == null) { - chargePowerMaximum = 0.0; - } else if (energyLevelPercentage >= energyLevelPercentageMaximum) { - chargePowerMaximum = 0.0; + // Get the tariff forecasts from energy optimisation asset for 1 week + List> tariffExportDatapoints = + getTariffDatapoints( + energyOptimisationAsset, + EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), + services); + List> tariffImportDatapoints = + getTariffDatapoints( + energyOptimisationAsset, + EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), + services); + + // Overwrite the current tariff forecasts with the day ahead tariff forecasts + if (useDayAheadTariffs) { + List> tariffExportDayAheadAssetDatapoints = + getTariffDayAheadDatapoints( + dayAheadAsset, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), services); + List> tariffImportDayAheadAssetDatapoints = + getTariffDayAheadDatapoints( + dayAheadAsset, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), services); + + // Combine tariff export forecasts + if (!tariffExportDayAheadAssetDatapoints.isEmpty()) { + Map> mergedMap = new HashMap<>(); + + for (ValueDatapoint dp : tariffExportDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - if (!allowDischarging || energyLevelPercentageMinimum == null || energyLevelPercentage == null) { - dischargePowerMaximum = 0.0; - } else if (energyLevelPercentage <= energyLevelPercentageMinimum) { - dischargePowerMaximum = 0.0; + for (ValueDatapoint dp : tariffExportDayAheadAssetDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - powerFlexibleAvailable.put(electricityBatteryAsset.getId(), new double[]{chargePowerMaximum, dischargePowerMaximum}); - } - - return powerFlexibleAvailable; - } - - private Map batteryCalculatePowerSetpoints(EmsEnergyOptimisationAsset energyOptimisationAsset, List electricityBatteryAssets, Services services, String logPrefix) { - Map powerFlexibleAvailable = batteryCalculatePowerFlexibleAvailable(electricityBatteryAssets); - Map powerSetpointsNew; + tariffExportDatapoints = new ArrayList<>(mergedMap.values()); + tariffExportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + } - // Get latest power set-point across all batteries - long powerSetpointTimestampMillisLatest = 0L; + // Combine tariff import forecasts + if (!tariffImportDayAheadAssetDatapoints.isEmpty()) { + Map> mergedMap = new HashMap<>(); - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - long powerSetpointTimestampMillis = electricityBatteryAsset.getPowerSetpointTimestamp().orElse(0L); - - if (powerSetpointTimestampMillis > powerSetpointTimestampMillisLatest) { - powerSetpointTimestampMillisLatest = powerSetpointTimestampMillis; + for (ValueDatapoint dp : tariffImportDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - } - - // Check if power net is updated since last battery power set-points update - Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); - long powerNetTimestampMillis = energyOptimisationAsset.getPowerNetTimestamp().orElse(0L); - // Turn off batteries that do not have flexible power available during main power meter disconnect - if (powerSetpointTimestampMillisLatest > powerNetTimestampMillis || powerNet == null) { - powerSetpointsNew = batteryCheckPowerSetpointsCurrent(electricityBatteryAssets, powerFlexibleAvailable); - return powerSetpointsNew; - } - - // Check if power limits are present and calculate additional power limits - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); - - Double powerLimitMaximumBatteries = null; - - if (powerLimitMaximumProfileTotal != null) { - powerLimitMaximumBatteries = round(powerLimitMaximumProfileTotal * (1 - POWER_LIMIT_MAXIMUM_BATTERIES_MARGIN_PERCENTAGE * 0.01), 3); - } - - Double powerLimitMinimumBatteries = null; - - if (powerLimitMinimumProfileTotal != null) { - powerLimitMinimumBatteries = round(powerLimitMinimumProfileTotal * (1 - POWER_LIMIT_MINIMUM_BATTERIES_MARGIN_PERCENTAGE * 0.01), 3); - } - - // TODO: add battery limits cross-over warning - // TODO: add advanced settings - - int currentMinute = LocalDateTime.now().getMinute(); - Map batteryEnergyLevelPercentageTargets = batteryGetEnergyLevelPercentageTargetsCurrent(electricityBatteryAssets, services); + for (ValueDatapoint dp : tariffImportDayAheadAssetDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); + } - // Calculate battery energy level forecast - // TODO: add 15 minute skip protection with forecast update timestamp for robust forecast updating - if ((currentMinute % 15) == 0) { - batteryEnergyLevelPercentageTargets = batteryCalculateForecasts(electricityBatteryAssets, energyOptimisationAsset, services); + tariffImportDatapoints = new ArrayList<>(mergedMap.values()); + tariffImportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + } } - // Calculate virtual power consumption - Map powerSetpointsCurrent = new HashMap<>(); - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - double powerSetpoint = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); - powerSetpointsCurrent.put(electricityBatteryAssetId, powerSetpoint); + // Calculate battery energy level percentage default + double energyLevelPercentageDefault = + batteryCalculateEnergyLevelPercentageDefault( + energyLevelPercentageMaximumBattery, + energyLevelPercentageMinimumBattery, + energyOptimisationAsset); + + // TODO: make window dynamic based on time needed to reach energyLevelPercentageDefault + // Calculate optimal charge and discharge zone for each day based on tariffs + Map chargeAndDischargeZonesMap = + calculateTariffChargeAndDischargeZones( + tariffImportDatapoints, tariffExportDatapoints, 4); + + // Charge zone = 1, discharge zone = -1 + List chargeAndDischargeZonesList = + new ArrayList<>(Collections.nCopies(energyLevelPredictionList.size(), 0)); + + for (Map.Entry entry : chargeAndDischargeZonesMap.entrySet()) { + long timestampMillis = entry.getKey(); + int value = entry.getValue(); + + int timestampIndex = timestampsMillisList.indexOf(timestampMillis); + + if (timestampIndex != -1) { + // Add 1 to align list indices + chargeAndDischargeZonesList.set(timestampIndex + 1, value); + } } - double powerSetpointsCurrentSum = powerSetpointsCurrent.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; - - // Calculate new power set-points - if (powerLimitMaximumProfileTotal != null && powerConsumptionVirtual > powerLimitMaximumProfileTotal) { - Double powerLimitMaximumVirtual = round(powerLimitMaximumProfileTotal * (1 - POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01), 3); - powerSetpointsNew = batteryCalculatePowerSetpointsOnLimitBreach(powerFlexibleAvailable, powerConsumptionVirtual, powerLimitMaximumVirtual, "max"); - } else if (powerLimitMinimumProfileTotal != null && powerConsumptionVirtual < powerLimitMinimumProfileTotal) { - Double powerLimitMinimumVirtual = round(powerLimitMinimumProfileTotal * (1 - POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01), 3); - powerSetpointsNew = batteryCalculatePowerSetpointsOnLimitBreach(powerFlexibleAvailable, powerConsumptionVirtual, powerLimitMinimumVirtual, "min"); - } else { - powerSetpointsNew = batteryRestoreEnergyLevels(energyOptimisationAsset, electricityBatteryAssets, powerFlexibleAvailable, powerNet, powerSetpointsCurrentSum, powerLimitMinimumBatteries, powerLimitMaximumBatteries, batteryEnergyLevelPercentageTargets); + // System.out.println("chargeAndDischargeZonesList = " + + // chargeAndDischargeZonesList); + + // Default energy level percentage for each interval + List energyLevelPercentageDefaultList = + new ArrayList<>( + Collections.nCopies( + chargeAndDischargeZonesList.size(), energyLevelPercentageDefault)); + + for (int i = 0; i < chargeAndDischargeZonesList.size(); i++) { + if (chargeAndDischargeZonesList.get(i) == 1) { + energyLevelPercentageDefaultList.set( + i, Double.valueOf(energyLevelPercentageMaximumBattery)); + } else if (chargeAndDischargeZonesList.get(i) == -1) { + energyLevelPercentageDefaultList.set( + i, Double.valueOf(energyLevelPercentageMinimumBattery)); + } } - // Create log messages on power limit breach - double powerSetpointsNewSum = powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerNetNewVirtual = powerConsumptionVirtual + powerSetpointsNewSum; - - if (powerLimitMaximumProfileTotal != null && powerNet > powerLimitMaximumProfileTotal) { - double powerExceededAmount = round((powerNet - powerLimitMaximumProfileTotal), 3); - LOG.warning(String.format("%s; Power net is %s kW above power limit maximum", logPrefix, powerExceededAmount)); - - if (powerNetNewVirtual > powerLimitMaximumProfileTotal) { - double powerReductionShortage = round((powerNetNewVirtual - powerLimitMaximumProfileTotal), 3); - LOG.warning(String.format("%s; Not enough flexible power to get below power limit maximum; Shortage of %s kW", logPrefix, powerReductionShortage)); - } - } else if (powerLimitMinimumProfileTotal != null && powerNet < powerLimitMinimumProfileTotal) { - double powerExceededAmount = round((powerNet - powerLimitMinimumProfileTotal), 3); - LOG.warning(String.format("%s; Power net is %s kW below power limit minimum", logPrefix, powerExceededAmount)); + // System.out.println("energyLevelPercentageDefaultList = " + + // energyLevelPercentageDefaultList); + + // TODO: handle debounce interval in forecast + // Optimise forecast based on optimal tariffs + for (int i = 1; + i < chargeAndDischargeZonesList.size() && i < energyLevelPredictionList.size(); + i++) { + // Only adjust forecast if predicted energy level percentage is outside battery debounce + // interval + if (Math.abs(energyLevelPredictionList.get(i) - energyLevelPercentageDefaultList.get(i)) + <= BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { + continue; + } + + if (chargeAndDischargeZonesList.get(i) == 1 + && energyLevelPredictionList.get(i) < energyLevelPercentageDefaultList.get(i)) { + Double energyLevelIntervalMaximum = + Collections.max( + energyLevelPredictionList.subList(i, energyLevelPredictionList.size())); + + double chargeSpaceLeft = + energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum; + + if (chargeSpaceLeft > 0) { + double chargeNeeded = + energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i); + double chargeAvailableLeft = 0; + + if (dischargePercentageWantBatteryList.get(i) >= 0) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; + } + + if (chargeAvailableLeft > 0) { + chargeAvailableLeft = + Math.min(Math.min(chargeSpaceLeft, chargeAvailableLeft), chargeNeeded); + + for (int j = i; j < energyLevelPredictionList.size(); j++) { + energyLevelPredictionList.set( + j, energyLevelPredictionList.get(j) + chargeAvailableLeft); + } + } + } else { + double chargeZoneEnergyLevel = energyLevelPredictionList.get(i); + + int energyLevelIntervalMaximumIndex = energyLevelPredictionList.size(); + + if (energyLevelIntervalMaximum >= energyLevelPercentageMaximumBattery) { + energyLevelIntervalMaximumIndex = + energyLevelPredictionList.indexOf(energyLevelIntervalMaximum); + } + + for (int k = i; k <= energyLevelIntervalMaximumIndex; k++) { + double chargeNeeded = energyLevelPredictionList.get(k) - chargeZoneEnergyLevel; + + if (chargeNeeded > 0 && chargePercentageWantBatteryList.get(k) == 0) { + double chargeAvailableLeft = 0; + + if (dischargePercentageWantBatteryList.get(i) >= 0) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + chargeAvailableLeft = chargePercentageAvailableBatteryList.get(i) - chargeInUse; + } + + if (chargeAvailableLeft > 0) { + double energyLevelIntervalMaximum2 = + Collections.max(energyLevelPredictionList.subList(i, k - 1)); + double chargeSpaceInterval = + energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum2; + + if (chargeSpaceInterval > 0) { + chargeAvailableLeft = + Math.min( + Math.min(chargeAvailableLeft, chargeNeeded), chargeSpaceInterval); + + for (int j = i; j < k; j++) { + energyLevelPredictionList.set( + j, energyLevelPredictionList.get(j) + chargeAvailableLeft); + } + } + } - if (powerNetNewVirtual < powerLimitMinimumProfileTotal) { - double powerReductionShortage = round((powerNetNewVirtual - powerLimitMinimumProfileTotal), 3); - LOG.warning(String.format("%s; Not enough flexible power to get above power limit minimum; Shortage of %s kW", logPrefix, powerReductionShortage)); + break; + } + } } - } - - return powerSetpointsNew; - } - - private Map batteryCalculatePowerSetpointsOnLimitBreach(Map powerFlexibleAvailable, Double powerConsumptionVirtual, Double powerLimitVirtual, String maxOrMin) { - Map powerSetpointsNew = new HashMap<>(); - boolean isMin = "min".equals(maxOrMin); - - // Calculate the total power adjustment needed - double powerReduction = powerConsumptionVirtual - powerLimitVirtual; - - if (isMin) { - powerReduction = -powerReduction; - } - - // Iterate over each battery asset - for (Map.Entry entry : powerFlexibleAvailable.entrySet()) { - String electricityBatteryAssetId = entry.getKey(); - double[] powerBatteryAvailableChargeDischarge = entry.getValue(); - - // Choose available power based on breach type - double powerBatteryAvailable = isMin ? -powerBatteryAvailableChargeDischarge[0] : powerBatteryAvailableChargeDischarge[1]; - - if (powerReduction > 0) { - // Limit the power set-point to available battery power or remaining reduction needed - double setpoint = round(Math.max(-powerReduction, powerBatteryAvailable), 3); - - if (isMin) { - setpoint = -setpoint; + } else if (chargeAndDischargeZonesList.get(i) == -1 + && energyLevelPredictionList.get(i) > energyLevelPercentageDefaultList.get(i)) { + Double energyLevelIntervalMinimum = + Collections.min( + energyLevelPredictionList.subList(i, energyLevelPredictionList.size())); + + double dischargeSpaceLeft = + energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum; + + if (dischargeSpaceLeft < 0) { + double dischargeNeeded = + energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i); + double dischargeAvailableLeft = 0; + + if (chargePercentageWantBatteryList.get(i) <= 0) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + dischargeAvailableLeft = + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; + } + + if (dischargeAvailableLeft < 0) { + dischargeAvailableLeft = + Math.max(Math.max(dischargeSpaceLeft, dischargeAvailableLeft), dischargeNeeded); + + for (int j = i; j < energyLevelPredictionList.size(); j++) { + energyLevelPredictionList.set( + j, energyLevelPredictionList.get(j) + dischargeAvailableLeft); } - - powerSetpointsNew.put(electricityBatteryAssetId, setpoint); - powerReduction += setpoint; + } } else { - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + double dischargeZoneEnergyLevel = energyLevelPredictionList.get(i); + + int energyLevelIntervalMinimumIndex = energyLevelPredictionList.size(); + + if (energyLevelIntervalMinimum <= energyLevelPercentageMinimumBattery) { + energyLevelIntervalMinimumIndex = + energyLevelPredictionList.indexOf(energyLevelIntervalMinimum); + } + + for (int k = i; k <= energyLevelIntervalMinimumIndex; k++) { + double dischargeNeeded = + energyLevelPredictionList.get(k) - dischargeZoneEnergyLevel; + + if (dischargeNeeded < 0 && dischargePercentageWantBatteryList.get(k) == 0) { + double dischargeAvailableLeft = 0; + + if (chargePercentageWantBatteryList.get(i) <= 0) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + dischargeAvailableLeft = + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse; + } + + if (dischargeAvailableLeft < 0) { + double energyLevelIntervalMinimum2 = + Collections.min(energyLevelPredictionList.subList(i, k - 1)); + double dischargeSpaceInterval = + energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum2; + + if (dischargeSpaceInterval < 0) { + dischargeAvailableLeft = + Math.max( + Math.max(dischargeAvailableLeft, dischargeNeeded), + dischargeSpaceInterval); + + for (int j = i; j < k; j++) { + energyLevelPredictionList.set( + j, energyLevelPredictionList.get(j) + dischargeAvailableLeft); + } + } + } + + break; + } + } } + } + } + } + + // System.out.println("After Tariffs: energyLevelPredictionList = " + + // energyLevelPredictionList + "\n"); + + // Get the current energy level percentage target + int batteryEnergyLevelPercentageTarget = (int) Math.round(energyLevelPredictionList.get(1)); + batteryEnergyLevelPercentageTargets.put(batteryAssetId, batteryEnergyLevelPercentageTarget); + + // Calculate energy level percentage change per interval + List percentageChangeBatteryList = new ArrayList<>(); + + for (int i = 0; i < energyLevelPredictionList.size() - 1; i++) { + double percentageChange = + energyLevelPredictionList.get(i + 1) - energyLevelPredictionList.get(i); + percentageChangeBatteryList.add(percentageChange); + } + + // System.out.println("percentageChangeBatteryList = " + + // percentageChangeBatteryList); + + // Calculate total power change for the EMS + List powerChangeTotalList = new ArrayList<>(); + + for (double percentageChange : percentageChangeBatteryList) { + double power = 0; + + if (percentageChange > 0) { + power = + percentageChange * energyCapacityBattery / (intervalHour * chargeEfficiencyBattery); + } else if (percentageChange < 0) { + power = + percentageChange + * energyCapacityBattery + * dischargeEfficiencyBattery + / (10000 * intervalHour); } - return powerSetpointsNew; + powerChangeTotalList.add(round(power, 3)); + } + + // System.out.println("powerChangeTotalList = " + powerChangeTotalList); + + for (int i = 0; i < powerChangeTotalList.size() - 1; i++) { + totalPowerConsumptionProductionFlexList.set( + i, totalPowerConsumptionProductionFlexList.get(i) - powerChangeTotalList.get(i)); + } + + // System.out.println("totalPowerConsumptionProductionFlexList = " + + // totalPowerConsumptionProductionFlexList); + + List> energyLevelPercentageForecast = new ArrayList<>(); + List> powerSetpointForecast = new ArrayList<>(); + + // Update energy level percentage forecast starting after current time + for (int i = 1; i < timestampsMillisList.size(); i++) { + energyLevelPercentageForecast.add( + new ValueDatapoint<>( + timestampsMillisList.get(i), (int) Math.round(energyLevelPredictionList.get(i)))); + } + + // Update power set-point starting from current power limit + for (int i = 0; i < timestampsMillisList.size(); i++) { + powerSetpointForecast.add( + new ValueDatapoint<>(timestampsMillisList.get(i), powerChangeTotalList.get(i))); + } + + services + .getAssetPredictedDatapointService() + .updateValues( + batteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), + energyLevelPercentageForecast); + services + .getAssetPredictedDatapointService() + .updateValues( + batteryAssetId, + EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), + powerSetpointForecast); + + // System.out.println("UPDATED forecasts"); } - private void batteryCheckConnection(List electricityBatteryAssets, Services services) { - // This method checks if a battery is connected based on if the power and energyLevelPercentage attributes update within the active time interval - String connected = EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected.toString(); - String disconnected = EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected.toString(); - - long currentTimestampMillis = services.getTimerService().getCurrentTimeMillis(); - long activePeriodMillis = ACTIVE_PERIOD_MINUTES * 60000L; - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - - Optional connectionStatusValue = electricityBatteryAsset.getConnectionStatus(); - String connectionStatusPrevious = ""; - - if (connectionStatusValue.isPresent()) { - connectionStatusPrevious = connectionStatusValue.get().toString(); - } + return batteryEnergyLevelPercentageTargets; + } + + private Map batteryCalculatePowerFlexibleAvailable( + List electricityBatteryAssets) { + HashMap powerFlexibleAvailable = new HashMap<>(); + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + boolean allowCharging = electricityBatteryAsset.getAllowCharging().orElse(false); + boolean allowDischarging = electricityBatteryAsset.getAllowDischarging().orElse(false); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + + double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(0.0); + double dischargePowerMaximum = electricityBatteryAsset.getDischargePowerMaximum().orElse(0.0); + + if (!allowCharging || energyLevelPercentageMaximum == null || energyLevelPercentage == null) { + chargePowerMaximum = 0.0; + } else if (energyLevelPercentage >= energyLevelPercentageMaximum) { + chargePowerMaximum = 0.0; + } + + if (!allowDischarging + || energyLevelPercentageMinimum == null + || energyLevelPercentage == null) { + dischargePowerMaximum = 0.0; + } else if (energyLevelPercentage <= energyLevelPercentageMinimum) { + dischargePowerMaximum = 0.0; + } + + powerFlexibleAvailable.put( + electricityBatteryAsset.getId(), + new double[] {chargePowerMaximum, dischargePowerMaximum}); + } - Double powerBattery = electricityBatteryAsset.getPower().orElse(null); - long powerTimestampMillisBattery = electricityBatteryAsset.getPowerTimestamp().orElse(0L); + return powerFlexibleAvailable; + } - Double energyLevelPercentageBattery = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - long energyLevelPercentageTimestampMillisBattery = electricityBatteryAsset.getEnergyLevelPercentageTimestamp().orElse(0L); + private Map batteryCalculatePowerSetpoints( + EmsEnergyOptimisationAsset energyOptimisationAsset, + List electricityBatteryAssets, + Services services, + String logPrefix) { + Map powerFlexibleAvailable = + batteryCalculatePowerFlexibleAvailable(electricityBatteryAssets); + Map powerSetpointsNew; - String connectionStatusCurrent = disconnected; + // Get latest power set-point across all batteries + long powerSetpointTimestampMillisLatest = 0L; - if ((currentTimestampMillis - powerTimestampMillisBattery) < activePeriodMillis && powerBattery != null && (currentTimestampMillis - energyLevelPercentageTimestampMillisBattery) < activePeriodMillis && energyLevelPercentageBattery != null) { - connectionStatusCurrent = connected; - } + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + long powerSetpointTimestampMillis = + electricityBatteryAsset.getPowerSetpointTimestamp().orElse(0L); - if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.equals(disconnected)) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(disconnected) && connectionStatusPrevious.equals(connected)) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected), getClass().getSimpleName()); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE, null), getClass().getSimpleName()); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER, null), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.isEmpty()) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(disconnected) && connectionStatusPrevious.isEmpty()) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected), getClass().getSimpleName()); - } - } + if (powerSetpointTimestampMillis > powerSetpointTimestampMillisLatest) { + powerSetpointTimestampMillisLatest = powerSetpointTimestampMillis; + } } - private void batteryCheckSetup(List electricityBatteryAssets) { - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - // Check if the battery is enabled - boolean allowCharging = electricityBatteryAsset.getAllowDischarging().orElse(false); - boolean allowDischarging = electricityBatteryAsset.getAllowCharging().orElse(false); - - if (!allowCharging && !allowDischarging) { - continue; - } - - String logPrefixBattery = String.format("assetType='%s', assetId='%s', assetName='%s'", electricityBatteryAsset.getAssetType(), electricityBatteryAsset.getId(), electricityBatteryAsset.getAssetName()); - - // Check if the following attributes are connected - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - Double power = electricityBatteryAsset.getPower().orElse(null); - StringBuilder logMessageBatteryConnect = new StringBuilder(); + // Check if power net is updated since last battery power set-points update + Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); + long powerNetTimestampMillis = energyOptimisationAsset.getPowerNetTimestamp().orElse(0L); - if (energyLevelPercentage == null) { - logMessageBatteryConnect.append(String.format(" '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName())); - } + // Turn off batteries that do not have flexible power available during main power meter + // disconnect + if (powerSetpointTimestampMillisLatest > powerNetTimestampMillis || powerNet == null) { + powerSetpointsNew = + batteryCheckPowerSetpointsCurrent(electricityBatteryAssets, powerFlexibleAvailable); + return powerSetpointsNew; + } - if (power == null) { - logMessageBatteryConnect.append(String.format(" '%s',", EmsElectricityBatteryAsset.POWER.getName())); - } + // Check if power limits are present and calculate additional power limits + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); - if (!logMessageBatteryConnect.isEmpty()) { - logMessageBatteryConnect.setLength(logMessageBatteryConnect.length() - 1); - logMessageBatteryConnect.insert(0, String.format("%s; Can't use battery for flexible power. The following attributes are not connected:", logPrefixBattery)); - LOG.warning(logMessageBatteryConnect.toString()); - } + Double powerLimitMaximumBatteries = null; - // Check if the following attributes are set - Double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(null); - Double dischargePowerMaximum = electricityBatteryAsset.getDischargePowerMaximum().orElse(null); - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - StringBuilder logMessageBatterySet = new StringBuilder(); - - if (chargePowerMaximum == null) { - logMessageBatterySet.append(String.format(" '%s',", EmsElectricityBatteryAsset.CHARGE_POWER_MAXIMUM.getName())); - } + if (powerLimitMaximumProfileTotal != null) { + powerLimitMaximumBatteries = + round( + powerLimitMaximumProfileTotal + * (1 - POWER_LIMIT_MAXIMUM_BATTERIES_MARGIN_PERCENTAGE * 0.01), + 3); + } - if (dischargePowerMaximum == null) { - logMessageBatterySet.append(String.format(" '%s',", EmsElectricityBatteryAsset.DISCHARGE_POWER_MAXIMUM.getName())); - } + Double powerLimitMinimumBatteries = null; - if (energyLevelPercentageMaximum == null) { - logMessageBatterySet.append(String.format(" '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName())); - } + if (powerLimitMinimumProfileTotal != null) { + powerLimitMinimumBatteries = + round( + powerLimitMinimumProfileTotal + * (1 - POWER_LIMIT_MINIMUM_BATTERIES_MARGIN_PERCENTAGE * 0.01), + 3); + } - if (energyLevelPercentageMinimum == null) { - logMessageBatterySet.append(String.format(" '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName())); - } + // TODO: add battery limits cross-over warning + // TODO: add advanced settings - if (!logMessageBatterySet.isEmpty()) { - logMessageBatterySet.setLength(logMessageBatterySet.length() - 1); - logMessageBatterySet.insert(0, String.format("%s; Can't use battery for flexible power. The following attributes are not set:", logPrefixBattery)); - LOG.warning(logMessageBatterySet.toString()); - } + int currentMinute = LocalDateTime.now().getMinute(); + Map batteryEnergyLevelPercentageTargets = + batteryGetEnergyLevelPercentageTargetsCurrent(electricityBatteryAssets, services); - if (energyLevelPercentageMaximum != null && energyLevelPercentageMinimum != null && (energyLevelPercentageMaximum - energyLevelPercentageMinimum) < BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { - int diff = energyLevelPercentageMaximum - energyLevelPercentageMinimum; - LOG.warning(String.format("%s; Can't use battery for flexible power. %s - %s = %s - %s = %s < %s%%)", logPrefixBattery, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), - energyLevelPercentageMaximum, energyLevelPercentageMinimum, diff, BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)); - } - } + // Calculate battery energy level forecast + // TODO: add 15 minute skip protection with forecast update timestamp for robust forecast + // updating + if ((currentMinute % 15) == 0) { + batteryEnergyLevelPercentageTargets = + batteryCalculateForecasts(electricityBatteryAssets, energyOptimisationAsset, services); } - private Map batteryCheckPowerSetpointsCurrent(List electricityBatteryAssets, Map powerFlexibleAvailable) { - Map powerSetpointsNew = new HashMap<>(); + // Calculate virtual power consumption + Map powerSetpointsCurrent = new HashMap<>(); - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + double powerSetpoint = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + powerSetpointsCurrent.put(electricityBatteryAssetId, powerSetpoint); + } - if (energyLevelPercentage == null) { - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); - continue; - } + double powerSetpointsCurrentSum = + powerSetpointsCurrent.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; + + // Calculate new power set-points + if (powerLimitMaximumProfileTotal != null + && powerConsumptionVirtual > powerLimitMaximumProfileTotal) { + Double powerLimitMaximumVirtual = + round( + powerLimitMaximumProfileTotal + * (1 - POWER_LIMIT_MAXIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01), + 3); + powerSetpointsNew = + batteryCalculatePowerSetpointsOnLimitBreach( + powerFlexibleAvailable, powerConsumptionVirtual, powerLimitMaximumVirtual, "max"); + } else if (powerLimitMinimumProfileTotal != null + && powerConsumptionVirtual < powerLimitMinimumProfileTotal) { + Double powerLimitMinimumVirtual = + round( + powerLimitMinimumProfileTotal + * (1 - POWER_LIMIT_MINIMUM_SAFETY_MARGIN_PERCENTAGE * 0.01), + 3); + powerSetpointsNew = + batteryCalculatePowerSetpointsOnLimitBreach( + powerFlexibleAvailable, powerConsumptionVirtual, powerLimitMinimumVirtual, "min"); + } else { + powerSetpointsNew = + batteryRestoreEnergyLevels( + energyOptimisationAsset, + electricityBatteryAssets, + powerFlexibleAvailable, + powerNet, + powerSetpointsCurrentSum, + powerLimitMinimumBatteries, + powerLimitMaximumBatteries, + batteryEnergyLevelPercentageTargets); + } - double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); - double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; - double dischargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; + // Create log messages on power limit breach + double powerSetpointsNewSum = + powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerNetNewVirtual = powerConsumptionVirtual + powerSetpointsNewSum; + + if (powerLimitMaximumProfileTotal != null && powerNet > powerLimitMaximumProfileTotal) { + double powerExceededAmount = round((powerNet - powerLimitMaximumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Power net is %s kW above power limit maximum", logPrefix, powerExceededAmount)); + + if (powerNetNewVirtual > powerLimitMaximumProfileTotal) { + double powerReductionShortage = + round((powerNetNewVirtual - powerLimitMaximumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Not enough flexible power to get below power limit maximum; Shortage of %s kW", + logPrefix, powerReductionShortage)); + } + } else if (powerLimitMinimumProfileTotal != null && powerNet < powerLimitMinimumProfileTotal) { + double powerExceededAmount = round((powerNet - powerLimitMinimumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Power net is %s kW below power limit minimum", logPrefix, powerExceededAmount)); + + if (powerNetNewVirtual < powerLimitMinimumProfileTotal) { + double powerReductionShortage = + round((powerNetNewVirtual - powerLimitMinimumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Not enough flexible power to get above power limit minimum; Shortage of %s kW", + logPrefix, powerReductionShortage)); + } + } - // Set initial power set-point new - double powerSetpointNew = 0.0; + return powerSetpointsNew; + } - // Check if power set-point current is within available power limits - if (powerSetpointCurrent > 0.0) { - powerSetpointNew = Math.min(powerSetpointCurrent, chargePowerAvailable); - } else if (powerSetpointCurrent < 0.0) { - powerSetpointNew = Math.max(powerSetpointCurrent, dischargePowerAvailable); - } + private Map batteryCalculatePowerSetpointsOnLimitBreach( + Map powerFlexibleAvailable, + Double powerConsumptionVirtual, + Double powerLimitVirtual, + String maxOrMin) { + Map powerSetpointsNew = new HashMap<>(); + boolean isMin = "min".equals(maxOrMin); - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } + // Calculate the total power adjustment needed + double powerReduction = powerConsumptionVirtual - powerLimitVirtual; - return powerSetpointsNew; + if (isMin) { + powerReduction = -powerReduction; } - private Map batteryGetEnergyLevelPercentageTargetsCurrent(List electricityBatteryAssets, Services services) { - Map batteryEnergyLevelPercentageTargetsCurrent = new HashMap<>(); - - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long endTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000) + (15 * 60000); + // Iterate over each battery asset + for (Map.Entry entry : powerFlexibleAvailable.entrySet()) { + String electricityBatteryAssetId = entry.getKey(); + double[] powerBatteryAvailableChargeDischarge = entry.getValue(); - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String batteryAssetId = electricityBatteryAsset.getId(); - AssetDatapointAllQuery assetDatapointQueryPredicted = new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); - List> energyLevelPercentagePredictedCurrent = services.getAssetPredictedDatapointService().queryDatapoints(batteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), assetDatapointQueryPredicted); + // Choose available power based on breach type + double powerBatteryAvailable = + isMin + ? -powerBatteryAvailableChargeDischarge[0] + : powerBatteryAvailableChargeDischarge[1]; - Integer energyLevelPercentageTarget = null; + if (powerReduction > 0) { + // Limit the power set-point to available battery power or remaining reduction needed + double setpoint = round(Math.max(-powerReduction, powerBatteryAvailable), 3); - if (!energyLevelPercentagePredictedCurrent.isEmpty()) { - Double value = ((Double) energyLevelPercentagePredictedCurrent.getLast().getValue()); - energyLevelPercentageTarget = (value != null) ? value.intValue() : null; - } - - batteryEnergyLevelPercentageTargetsCurrent.put(batteryAssetId, energyLevelPercentageTarget); + if (isMin) { + setpoint = -setpoint; } - return batteryEnergyLevelPercentageTargetsCurrent; + powerSetpointsNew.put(electricityBatteryAssetId, setpoint); + powerReduction += setpoint; + } else { + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + } } - private Map batteryRestoreEnergyLevels(EmsEnergyOptimisationAsset energyOptimisationAsset, List electricityBatteryAssets, Map powerFlexibleAvailable, Double powerNet, - Double powerSetpointsCurrentSum, Double powerLimitMinimumBatteries, Double powerLimitMaximumBatteries, Map batteryEnergyLevelPercentageTargets) { - Map powerSetpointsNew = new HashMap<>(); - - // Find battery power set-points for a system without power limits - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - - // Set initial power set-point of 0 - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); - - if (energyLevelPercentage == null) { - continue; - } - - double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + return powerSetpointsNew; + } + + private void batteryCheckConnection( + List electricityBatteryAssets, Services services) { + // This method checks if a battery is connected based on if the power and energyLevelPercentage + // attributes update within the active time interval + String connected = + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected + .toString(); + String disconnected = + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected + .toString(); + + long currentTimestampMillis = services.getTimerService().getCurrentTimeMillis(); + long activePeriodMillis = ACTIVE_PERIOD_MINUTES * 60000L; + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + + Optional + connectionStatusValue = electricityBatteryAsset.getConnectionStatus(); + String connectionStatusPrevious = ""; + + if (connectionStatusValue.isPresent()) { + connectionStatusPrevious = connectionStatusValue.get().toString(); + } + + Double powerBattery = electricityBatteryAsset.getPower().orElse(null); + long powerTimestampMillisBattery = electricityBatteryAsset.getPowerTimestamp().orElse(0L); + + Double energyLevelPercentageBattery = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + long energyLevelPercentageTimestampMillisBattery = + electricityBatteryAsset.getEnergyLevelPercentageTimestamp().orElse(0L); + + String connectionStatusCurrent = disconnected; + + if ((currentTimestampMillis - powerTimestampMillisBattery) < activePeriodMillis + && powerBattery != null + && (currentTimestampMillis - energyLevelPercentageTimestampMillisBattery) + < activePeriodMillis + && energyLevelPercentageBattery != null) { + connectionStatusCurrent = connected; + } + + if (connectionStatusCurrent.equals(connected) + && connectionStatusPrevious.equals(disconnected)) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .connected), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(disconnected) + && connectionStatusPrevious.equals(connected)) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .disconnected), + getClass().getSimpleName()); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE, + null), + getClass().getSimpleName()); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER, null), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.isEmpty()) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .connected), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(disconnected) + && connectionStatusPrevious.isEmpty()) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .disconnected), + getClass().getSimpleName()); + } + } + } + + private void batteryCheckSetup(List electricityBatteryAssets) { + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + // Check if the battery is enabled + boolean allowCharging = electricityBatteryAsset.getAllowDischarging().orElse(false); + boolean allowDischarging = electricityBatteryAsset.getAllowCharging().orElse(false); + + if (!allowCharging && !allowDischarging) { + continue; + } + + String logPrefixBattery = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + electricityBatteryAsset.getAssetType(), + electricityBatteryAsset.getId(), + electricityBatteryAsset.getAssetName()); + + // Check if the following attributes are connected + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + Double power = electricityBatteryAsset.getPower().orElse(null); + StringBuilder logMessageBatteryConnect = new StringBuilder(); + + if (energyLevelPercentage == null) { + logMessageBatteryConnect.append( + String.format(" '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName())); + } + + if (power == null) { + logMessageBatteryConnect.append( + String.format(" '%s',", EmsElectricityBatteryAsset.POWER.getName())); + } + + if (!logMessageBatteryConnect.isEmpty()) { + logMessageBatteryConnect.setLength(logMessageBatteryConnect.length() - 1); + logMessageBatteryConnect.insert( + 0, + String.format( + "%s; Can't use battery for flexible power. The following attributes are not connected:", + logPrefixBattery)); + LOG.warning(logMessageBatteryConnect.toString()); + } + + // Check if the following attributes are set + Double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(null); + Double dischargePowerMaximum = + electricityBatteryAsset.getDischargePowerMaximum().orElse(null); + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + StringBuilder logMessageBatterySet = new StringBuilder(); + + if (chargePowerMaximum == null) { + logMessageBatterySet.append( + String.format(" '%s',", EmsElectricityBatteryAsset.CHARGE_POWER_MAXIMUM.getName())); + } + + if (dischargePowerMaximum == null) { + logMessageBatterySet.append( + String.format(" '%s',", EmsElectricityBatteryAsset.DISCHARGE_POWER_MAXIMUM.getName())); + } + + if (energyLevelPercentageMaximum == null) { + logMessageBatterySet.append( + String.format( + " '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName())); + } + + if (energyLevelPercentageMinimum == null) { + logMessageBatterySet.append( + String.format( + " '%s',", EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName())); + } + + if (!logMessageBatterySet.isEmpty()) { + logMessageBatterySet.setLength(logMessageBatterySet.length() - 1); + logMessageBatterySet.insert( + 0, + String.format( + "%s; Can't use battery for flexible power. The following attributes are not set:", + logPrefixBattery)); + LOG.warning(logMessageBatterySet.toString()); + } + + if (energyLevelPercentageMaximum != null + && energyLevelPercentageMinimum != null + && (energyLevelPercentageMaximum - energyLevelPercentageMinimum) + < BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL) { + int diff = energyLevelPercentageMaximum - energyLevelPercentageMinimum; + LOG.warning( + String.format( + "%s; Can't use battery for flexible power. %s - %s = %s - %s = %s < %s%%)", + logPrefixBattery, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), + energyLevelPercentageMaximum, + energyLevelPercentageMinimum, + diff, + BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)); + } + } + } + + private Map batteryCheckPowerSetpointsCurrent( + List electricityBatteryAssets, + Map powerFlexibleAvailable) { + Map powerSetpointsNew = new HashMap<>(); + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + + if (energyLevelPercentage == null) { + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + continue; + } + + double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; + double dischargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; + + // Set initial power set-point new + double powerSetpointNew = 0.0; + + // Check if power set-point current is within available power limits + if (powerSetpointCurrent > 0.0) { + powerSetpointNew = Math.min(powerSetpointCurrent, chargePowerAvailable); + } else if (powerSetpointCurrent < 0.0) { + powerSetpointNew = Math.max(powerSetpointCurrent, dischargePowerAvailable); + } + + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } - // Get battery energy level target - Integer energyLevelPercentageTarget = batteryEnergyLevelPercentageTargets.get(electricityBatteryAssetId); + return powerSetpointsNew; + } - if (energyLevelPercentageTarget == null) { - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - energyLevelPercentageTarget = batteryCalculateEnergyLevelPercentageDefault(energyLevelPercentageMaximum, energyLevelPercentageMinimum, energyOptimisationAsset); - } + private Map batteryGetEnergyLevelPercentageTargetsCurrent( + List electricityBatteryAssets, Services services) { + Map batteryEnergyLevelPercentageTargetsCurrent = new HashMap<>(); - if (energyLevelPercentage < (energyLevelPercentageTarget - BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)) { - // Start charging - double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } else if (energyLevelPercentage > (energyLevelPercentageTarget + BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)) { - // Start discharging - double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } else if (powerSetpointCurrent > 0.0 && energyLevelPercentage < energyLevelPercentageTarget) { - // Continue charging - double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } else if (powerSetpointCurrent < 0.0 && energyLevelPercentage > energyLevelPercentageTarget) { - // Continue discharging - double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } - } + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long endTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000) + (15 * 60000); - // Adjust battery power set-points in a system with power limits - double powerSetpointsNewSum = powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String batteryAssetId = electricityBatteryAsset.getId(); + AssetDatapointAllQuery assetDatapointQueryPredicted = + new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); + List> energyLevelPercentagePredictedCurrent = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + batteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), + assetDatapointQueryPredicted); - Double chargingSpace = null; - Double dischargingSpace = null; + Integer energyLevelPercentageTarget = null; - if (powerLimitMaximumBatteries != null) { - chargingSpace = powerLimitMaximumBatteries - powerConsumptionVirtual; - } + if (!energyLevelPercentagePredictedCurrent.isEmpty()) { + Double value = ((Double) energyLevelPercentagePredictedCurrent.getLast().getValue()); + energyLevelPercentageTarget = (value != null) ? value.intValue() : null; + } - if (powerLimitMinimumBatteries != null) { - dischargingSpace = powerLimitMinimumBatteries - powerConsumptionVirtual; - } + batteryEnergyLevelPercentageTargetsCurrent.put(batteryAssetId, energyLevelPercentageTarget); + } - if (chargingSpace != null && powerSetpointsNewSum > chargingSpace) { - // Adjust battery power set-points in case of charging space shortage - double powerReduction = powerSetpointsNewSum - chargingSpace; + return batteryEnergyLevelPercentageTargetsCurrent; + } + + private Map batteryRestoreEnergyLevels( + EmsEnergyOptimisationAsset energyOptimisationAsset, + List electricityBatteryAssets, + Map powerFlexibleAvailable, + Double powerNet, + Double powerSetpointsCurrentSum, + Double powerLimitMinimumBatteries, + Double powerLimitMaximumBatteries, + Map batteryEnergyLevelPercentageTargets) { + Map powerSetpointsNew = new HashMap<>(); + + // Find battery power set-points for a system without power limits + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + + // Set initial power set-point of 0 + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + + if (energyLevelPercentage == null) { + continue; + } + + double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + + // Get battery energy level target + Integer energyLevelPercentageTarget = + batteryEnergyLevelPercentageTargets.get(electricityBatteryAssetId); + + if (energyLevelPercentageTarget == null) { + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + energyLevelPercentageTarget = + batteryCalculateEnergyLevelPercentageDefault( + energyLevelPercentageMaximum, + energyLevelPercentageMinimum, + energyOptimisationAsset); + } + + if (energyLevelPercentage + < (energyLevelPercentageTarget - BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)) { + // Start charging + double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } else if (energyLevelPercentage + > (energyLevelPercentageTarget + BATTERY_ENERGY_LEVEL_PERCENTAGE_DEBOUNCE_INTERVAL)) { + // Start discharging + double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } else if (powerSetpointCurrent > 0.0 + && energyLevelPercentage < energyLevelPercentageTarget) { + // Continue charging + double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[0]; + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } else if (powerSetpointCurrent < 0.0 + && energyLevelPercentage > energyLevelPercentageTarget) { + // Continue discharging + double powerSetpointNew = powerFlexibleAvailable.get(electricityBatteryAssetId)[1]; + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } + } - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - double powerSetpointNew = powerSetpointsNew.getOrDefault(electricityBatteryAssetId, 0.0); + // Adjust battery power set-points in a system with power limits + double powerSetpointsNewSum = + powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; - // Only adjust battery power set-point for charging batteries - if (powerSetpointNew > 0.0) { - powerReduction = powerReduction - powerSetpointNew; + Double chargingSpace = null; + Double dischargingSpace = null; - if (powerReduction >= 0.0) { - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); - } else { - double powerSetpointAdjusted = round(Math.min(-powerReduction, powerSetpointNew), 3); - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointAdjusted); - break; - } - } - } - } else if (dischargingSpace != null && powerSetpointsNewSum < dischargingSpace) { - // Adjust battery power set-points in case of discharging space shortage - double powerReduction = powerSetpointsNewSum - dischargingSpace; - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - double powerSetpointNew = powerSetpointsNew.getOrDefault(electricityBatteryAssetId, 0.0); - - // Only adjust battery power set-point for discharging batteries - if (powerSetpointNew < 0.0) { - powerReduction = powerReduction - powerSetpointNew; - - if (powerReduction <= 0.0) { - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); - } else { - double powerSetpointAdjusted = Math.max(-powerReduction, powerSetpointNew); - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointAdjusted); - break; - } - } - } - } - - return powerSetpointsNew; + if (powerLimitMaximumBatteries != null) { + chargingSpace = powerLimitMaximumBatteries - powerConsumptionVirtual; } - private void batteryUpdatePowerSetpoints(List electricityBatteryAssets, Map powerSetpointsNew, Services services) { - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double powerSetpointNew = powerSetpointsNew.get(electricityBatteryAssetId); - - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER_SETPOINT, powerSetpointNew), getClass().getSimpleName()); - } + if (powerLimitMinimumBatteries != null) { + dischargingSpace = powerLimitMinimumBatteries - powerConsumptionVirtual; } - private Map calculateTariffChargeAndDischargeZones(List> tariffImportDatapoints, List> tariffExportDatapoints, int window) { - Map chargeAndDischargeZonesMap = new HashMap<>(); + if (chargingSpace != null && powerSetpointsNewSum > chargingSpace) { + // Adjust battery power set-points in case of charging space shortage + double powerReduction = powerSetpointsNewSum - chargingSpace; - // Return empty map when there is no tariff forecast present - if (tariffImportDatapoints.size() < window || tariffExportDatapoints.size() < window) { - return chargeAndDischargeZonesMap; - } + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + double powerSetpointNew = powerSetpointsNew.getOrDefault(electricityBatteryAssetId, 0.0); - // Find the best import price for each day - ZoneId zoneId = ZoneId.systemDefault(); - - List> tariffImportMovingAverage = movingAverage(tariffImportDatapoints, window); - List> tariffExportMovingAverage = movingAverage(tariffExportDatapoints, window); - - Map tariffImportDailyMinimumMap = - IntStream.range(0, tariffImportMovingAverage.size()) - .mapToObj(i -> { - ValueDatapoint dp = tariffImportMovingAverage.get(i); - return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); - }) - .collect(Collectors.toMap( - dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), - Function.identity(), - BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)) - )); - - Map tariffExportDailyMinimumMap = - IntStream.range(0, tariffExportMovingAverage.size()) - .mapToObj(i -> { - ValueDatapoint dp = tariffExportMovingAverage.get(i); - return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); - }) - .collect(Collectors.toMap( - dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), - Function.identity(), - BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)) - )); - - Map chargeZonesMap = new HashMap<>(); - Map dischargeZonesMap = new HashMap<>(); - - for (Map.Entry entry : tariffImportDailyMinimumMap.entrySet()) { - int startIndex = entry.getValue().index; - int endIndex = startIndex + window; - - for (int i = startIndex; i < endIndex; i++) { - long timeMillis = tariffImportDatapoints.get(i).getTimestamp(); - chargeZonesMap.put(timeMillis, 1); - } - } - - for (Map.Entry entry : tariffExportDailyMinimumMap.entrySet()) { - int startIndex = entry.getValue().index; - int endIndex = startIndex + window; + // Only adjust battery power set-point for charging batteries + if (powerSetpointNew > 0.0) { + powerReduction = powerReduction - powerSetpointNew; - for (int i = startIndex; i < endIndex; i++) { - long timeMillis = tariffExportDatapoints.get(i).getTimestamp(); - dischargeZonesMap.put(timeMillis, -1); - } + if (powerReduction >= 0.0) { + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + } else { + double powerSetpointAdjusted = round(Math.min(-powerReduction, powerSetpointNew), 3); + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointAdjusted); + break; + } } + } + } else if (dischargingSpace != null && powerSetpointsNewSum < dischargingSpace) { + // Adjust battery power set-points in case of discharging space shortage + double powerReduction = powerSetpointsNewSum - dischargingSpace; - for (Map.Entry entry : chargeZonesMap.entrySet()) { - if (!dischargeZonesMap.containsKey(entry.getKey())) { - chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); - } - } + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + double powerSetpointNew = powerSetpointsNew.getOrDefault(electricityBatteryAssetId, 0.0); - for (Map.Entry entry : dischargeZonesMap.entrySet()) { - if (!chargeZonesMap.containsKey(entry.getKey())) { - chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); - } + // Only adjust battery power set-point for discharging batteries + if (powerSetpointNew < 0.0) { + powerReduction = powerReduction - powerSetpointNew; + + if (powerReduction <= 0.0) { + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + } else { + double powerSetpointAdjusted = Math.max(-powerReduction, powerSetpointNew); + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointAdjusted); + break; + } } + } + } - return chargeAndDischargeZonesMap; + return powerSetpointsNew; + } + + private void batteryUpdatePowerSetpoints( + List electricityBatteryAssets, + Map powerSetpointsNew, + Services services) { + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double powerSetpointNew = powerSetpointsNew.get(electricityBatteryAssetId); + + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.POWER_SETPOINT, + powerSetpointNew), + getClass().getSimpleName()); } + } - private EmsDayAheadAsset getDayAheadAsset(EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { - // Find assets in database - List assets = services.getAssetStorageService() - .findAll(new AssetQuery().parents(energyOptimisationAsset.getId()).types(EmsDayAheadAsset.class)) - .stream() - .map(asset -> (EmsDayAheadAsset) asset) - .toList(); - - EmsDayAheadAsset asset = null; - - if (assets.size() == 1) { - asset = assets.getFirst(); - } else if (assets.size() > 1) { - String logPrefixEnergyOptimisation = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAsset.getId(), energyOptimisationAsset.getAssetName()); - LOG.warning(String.format("%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", logPrefixEnergyOptimisation, assets.size(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName())); - } + private Map calculateTariffChargeAndDischargeZones( + List> tariffImportDatapoints, + List> tariffExportDatapoints, + int window) { + Map chargeAndDischargeZonesMap = new HashMap<>(); - return asset; + // Return empty map when there is no tariff forecast present + if (tariffImportDatapoints.size() < window || tariffExportDatapoints.size() < window) { + return chargeAndDischargeZonesMap; } - private List> getTariffDayAheadDatapoints(Asset asset, String attributeName, Services services) { - // Get the start of the day (00:00) in milliseconds - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - ZoneId zoneId = ZoneId.systemDefault(); - LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); - long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); + // Find the best import price for each day + ZoneId zoneId = ZoneId.systemDefault(); + + List> tariffImportMovingAverage = + movingAverage(tariffImportDatapoints, window); + List> tariffExportMovingAverage = + movingAverage(tariffExportDatapoints, window); + + Map tariffImportDailyMinimumMap = + IntStream.range(0, tariffImportMovingAverage.size()) + .mapToObj( + i -> { + ValueDatapoint dp = tariffImportMovingAverage.get(i); + return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); + }) + .collect( + Collectors.toMap( + dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), + Function.identity(), + BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)))); + + Map tariffExportDailyMinimumMap = + IntStream.range(0, tariffExportMovingAverage.size()) + .mapToObj( + i -> { + ValueDatapoint dp = tariffExportMovingAverage.get(i); + return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); + }) + .collect( + Collectors.toMap( + dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), + Function.identity(), + BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)))); + + Map chargeZonesMap = new HashMap<>(); + Map dischargeZonesMap = new HashMap<>(); + + for (Map.Entry entry : tariffImportDailyMinimumMap.entrySet()) { + int startIndex = entry.getValue().index; + int endIndex = startIndex + window; + + for (int i = startIndex; i < endIndex; i++) { + long timeMillis = tariffImportDatapoints.get(i).getTimestamp(); + chargeZonesMap.put(timeMillis, 1); + } + } - // Get tariff data-points of yesterday, today and tomorrow - long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; - long endTimeMillis = startOfCurrentDayMillis + 2 * 24 * 60 * 60000; - AssetDatapointAllQuery assetDatapointQueryHistoric = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - List> tariffHistoric = services.getAssetDatapointService().queryDatapoints(asset.getId(), attributeName, assetDatapointQueryHistoric); + for (Map.Entry entry : tariffExportDailyMinimumMap.entrySet()) { + int startIndex = entry.getValue().index; + int endIndex = startIndex + window; - return tariffHistoric; + for (int i = startIndex; i < endIndex; i++) { + long timeMillis = tariffExportDatapoints.get(i).getTimestamp(); + dischargeZonesMap.put(timeMillis, -1); + } } - private List> getTariffDatapoints(EmsEnergyOptimisationAsset energyOptimisationAsset, String attributeName, Services services) { - // Get the start of the day (00:00) in milliseconds - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - ZoneId zoneId = ZoneId.systemDefault(); - LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); - long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); - - // Get tariff data-points of yesterday and 1 week into the future - long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; - long endTimeMillis = startOfCurrentDayMillis + 8 * 24 * 60 * 60000; - AssetDatapointAllQuery assetDatapointQueryHistoric = new AssetDatapointAllQuery(startTimeMillis, currentTimeMillis); - AssetDatapointAllQuery assetDatapointQueryPredicted = new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); - List> tariffHistoric = services.getAssetDatapointService().queryDatapoints(energyOptimisationAsset.getId(), attributeName, assetDatapointQueryHistoric); - List> tariffPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), attributeName, assetDatapointQueryPredicted); - - // Combine historic and predicted data-points into one list - List> tariffCombined = new ArrayList<>(tariffHistoric); - tariffCombined.addAll(tariffPredicted); - - return tariffCombined; + for (Map.Entry entry : chargeZonesMap.entrySet()) { + if (!dischargeZonesMap.containsKey(entry.getKey())) { + chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); + } } - public static List> intervalAverage(List> dataPoints, long intervalMillis) { - // Map - Map> valuesPerIntervalMap = new HashMap<>(); - - for (ValueDatapoint datapoint : dataPoints) { - long timestampMillis = datapoint.getTimestamp(); - Double value = (Double) datapoint.getValue(); - - if (value != null) { - // Calculate start of 15-minute interval - long intervalStartMillis = timestampMillis - timestampMillis % intervalMillis; + for (Map.Entry entry : dischargeZonesMap.entrySet()) { + if (!chargeZonesMap.containsKey(entry.getKey())) { + chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); + } + } - // Add value to corresponding interval - valuesPerIntervalMap.computeIfAbsent(intervalStartMillis, key -> new ArrayList<>()).add(value); - } - } + return chargeAndDischargeZonesMap; + } + + private EmsDayAheadAsset getDayAheadAsset( + EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { + // Find assets in database + List assets = + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .parents(energyOptimisationAsset.getId()) + .types(EmsDayAheadAsset.class)) + .stream() + .map(asset -> (EmsDayAheadAsset) asset) + .toList(); + + EmsDayAheadAsset asset = null; + + if (assets.size() == 1) { + asset = assets.getFirst(); + } else if (assets.size() > 1) { + String logPrefixEnergyOptimisation = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAsset.getId(), + energyOptimisationAsset.getAssetName()); + LOG.warning( + String.format( + "%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", + logPrefixEnergyOptimisation, + assets.size(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName())); + } - // List with average values per interval - List> averageList = new ArrayList<>(); + return asset; + } + + private List> getTariffDayAheadDatapoints( + Asset asset, String attributeName, Services services) { + // Get the start of the day (00:00) in milliseconds + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); + long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); + + // Get tariff data-points of yesterday, today and tomorrow + long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; + long endTimeMillis = startOfCurrentDayMillis + 2 * 24 * 60 * 60000; + AssetDatapointAllQuery assetDatapointQueryHistoric = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + List> tariffHistoric = + services + .getAssetDatapointService() + .queryDatapoints(asset.getId(), attributeName, assetDatapointQueryHistoric); + + return tariffHistoric; + } + + private List> getTariffDatapoints( + EmsEnergyOptimisationAsset energyOptimisationAsset, String attributeName, Services services) { + // Get the start of the day (00:00) in milliseconds + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); + long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); + + // Get tariff data-points of yesterday and 1 week into the future + long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; + long endTimeMillis = startOfCurrentDayMillis + 8 * 24 * 60 * 60000; + AssetDatapointAllQuery assetDatapointQueryHistoric = + new AssetDatapointAllQuery(startTimeMillis, currentTimeMillis); + AssetDatapointAllQuery assetDatapointQueryPredicted = + new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); + List> tariffHistoric = + services + .getAssetDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), attributeName, assetDatapointQueryHistoric); + List> tariffPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), attributeName, assetDatapointQueryPredicted); + + // Combine historic and predicted data-points into one list + List> tariffCombined = new ArrayList<>(tariffHistoric); + tariffCombined.addAll(tariffPredicted); + + return tariffCombined; + } + + public static List> intervalAverage( + List> dataPoints, long intervalMillis) { + // Map + Map> valuesPerIntervalMap = new HashMap<>(); + + for (ValueDatapoint datapoint : dataPoints) { + long timestampMillis = datapoint.getTimestamp(); + Double value = (Double) datapoint.getValue(); + + if (value != null) { + // Calculate start of 15-minute interval + long intervalStartMillis = timestampMillis - timestampMillis % intervalMillis; + + // Add value to corresponding interval + valuesPerIntervalMap + .computeIfAbsent(intervalStartMillis, key -> new ArrayList<>()) + .add(value); + } + } - for (Map.Entry> entry : valuesPerIntervalMap.entrySet()) { - Long intervalStartMillis = entry.getKey(); - List values = entry.getValue(); + // List with average values per interval + List> averageList = new ArrayList<>(); - // Compute the average - double sum = 0; - for (double value : values) { - sum += value; - } - double average = sum / values.size(); + for (Map.Entry> entry : valuesPerIntervalMap.entrySet()) { + Long intervalStartMillis = entry.getKey(); + List values = entry.getValue(); - averageList.add(new ValueDatapoint<>(intervalStartMillis, average)); - } + // Compute the average + double sum = 0; + for (double value : values) { + sum += value; + } + double average = sum / values.size(); - return averageList; + averageList.add(new ValueDatapoint<>(intervalStartMillis, average)); } - private List> intervalInterpolate(List> dataPoints, long startTimeMillis, long endTimeMillis, long intervalMillis) { - List> interpolatedList = new ArrayList<>(); + return averageList; + } - if (dataPoints == null || dataPoints.size() < 2) { - return interpolatedList; - } + private List> intervalInterpolate( + List> dataPoints, + long startTimeMillis, + long endTimeMillis, + long intervalMillis) { + List> interpolatedList = new ArrayList<>(); - int idx1 = 0; + if (dataPoints == null || dataPoints.size() < 2) { + return interpolatedList; + } - for (long intervalTimeMillis = startTimeMillis; intervalTimeMillis <= endTimeMillis; intervalTimeMillis += intervalMillis) { - // Find data-point before and after interval - while (idx1 < (dataPoints.size() - 1) && dataPoints.get(idx1 + 1).getTimestamp() < intervalTimeMillis) { - idx1++; - } + int idx1 = 0; - long timeBeforeMillis = dataPoints.get(idx1).getTimestamp(); - long timeAfterMillis = dataPoints.get(idx1 + 1).getTimestamp(); + for (long intervalTimeMillis = startTimeMillis; + intervalTimeMillis <= endTimeMillis; + intervalTimeMillis += intervalMillis) { + // Find data-point before and after interval + while (idx1 < (dataPoints.size() - 1) + && dataPoints.get(idx1 + 1).getTimestamp() < intervalTimeMillis) { + idx1++; + } - // Interpolate value - if (intervalTimeMillis >= timeBeforeMillis && intervalTimeMillis <= timeAfterMillis) { - double valueBefore = (double) dataPoints.get(idx1).getValue(); - double valueAfter = (double) dataPoints.get(idx1 + 1).getValue(); + long timeBeforeMillis = dataPoints.get(idx1).getTimestamp(); + long timeAfterMillis = dataPoints.get(idx1 + 1).getTimestamp(); - double factor = (double) (intervalTimeMillis - timeBeforeMillis) / (timeAfterMillis - timeBeforeMillis); - double interpolatedValue = valueBefore + factor * (valueAfter - valueBefore); + // Interpolate value + if (intervalTimeMillis >= timeBeforeMillis && intervalTimeMillis <= timeAfterMillis) { + double valueBefore = (double) dataPoints.get(idx1).getValue(); + double valueAfter = (double) dataPoints.get(idx1 + 1).getValue(); - interpolatedList.add(new ValueDatapoint<>(intervalTimeMillis, interpolatedValue)); - } - } + double factor = + (double) (intervalTimeMillis - timeBeforeMillis) / (timeAfterMillis - timeBeforeMillis); + double interpolatedValue = valueBefore + factor * (valueAfter - valueBefore); - return interpolatedList; + interpolatedList.add(new ValueDatapoint<>(intervalTimeMillis, interpolatedValue)); + } } - public static List> movingAverage(List> dataPoints, int window) { - List> result = new ArrayList<>(); - if (window <= 0 || dataPoints.size() < window) { - return result; - } + return interpolatedList; + } - double sum = 0.0; + public static List> movingAverage( + List> dataPoints, int window) { + List> result = new ArrayList<>(); + if (window <= 0 || dataPoints.size() < window) { + return result; + } - for (int i = 0; i < dataPoints.size(); i++) { - // Extract numeric value - Number value = (Number) dataPoints.get(i).getValue(); - sum += value.doubleValue(); + double sum = 0.0; - // Remove value exiting the sliding window - if (i >= window) { - Number oldValue = (Number) dataPoints.get(i - window).getValue(); - sum -= oldValue.doubleValue(); - } + for (int i = 0; i < dataPoints.size(); i++) { + // Extract numeric value + Number value = (Number) dataPoints.get(i).getValue(); + sum += value.doubleValue(); - // When the window is "full", generate output datapoint - if (i >= window - 1) { - double avg = sum / window; + // Remove value exiting the sliding window + if (i >= window) { + Number oldValue = (Number) dataPoints.get(i - window).getValue(); + sum -= oldValue.doubleValue(); + } - // Use the timestamp of the window end (index i) - ValueDatapoint original = dataPoints.get(i); - ValueDatapoint averaged = - new ValueDatapoint<>(original.getTimestamp(), avg); + // When the window is "full", generate output datapoint + if (i >= window - 1) { + double avg = sum / window; - result.add(averaged); - } - } + // Use the timestamp of the window end (index i) + ValueDatapoint original = dataPoints.get(i); + ValueDatapoint averaged = new ValueDatapoint<>(original.getTimestamp(), avg); - return result; + result.add(averaged); + } } - private double round(double value, int precision) { - double scale = Math.pow(10, precision); - return Math.round(value * scale) / scale; + return result; + } + + private double round(double value, int precision) { + double scale = Math.pow(10, precision); + return Math.round(value * scale) / scale; + } + + private void updateDayAheadAsset( + EmsEnergyOptimisationAsset energyOptimisationAsset, + EmsDayAheadAsset dayAheadAsset, + Services services) { + String dayAheadAssetId = dayAheadAsset.getId(); + String logPrefixDayAhead = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + dayAheadAsset.getAssetType(), dayAheadAssetId, dayAheadAsset.getAssetName()); + + String collectTimeForecasts = dayAheadAsset.getCollectTimeForecasts().orElse(""); + + if (collectTimeForecasts.isBlank()) { + LOG.warning( + String.format( + "%s, attributeName='%s'; Set time to collect day ahead forecasts", + logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName())); } - private void updateDayAheadAsset(EmsEnergyOptimisationAsset energyOptimisationAsset, EmsDayAheadAsset dayAheadAsset, Services services) { - String dayAheadAssetId = dayAheadAsset.getId(); - String logPrefixDayAhead = String.format("assetType='%s', assetId='%s', assetName='%s'", dayAheadAsset.getAssetType(), dayAheadAssetId, dayAheadAsset.getAssetName()); - - String collectTimeForecasts = dayAheadAsset.getCollectTimeForecasts().orElse(""); + // Parse the time string + LocalTime collectTime = null; + + if (!collectTimeForecasts.isBlank()) { + try { + collectTime = LocalTime.parse(collectTimeForecasts, DateTimeFormatter.ofPattern("HH:mm")); + } catch (Exception e) { + LOG.warning( + String.format( + "%s, attributeName='%s'; Error while parsing collect time; Exception: %s", + logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName(), e)); + } + } - if (collectTimeForecasts.isBlank()) { - LOG.warning(String.format("%s, attributeName='%s'; Set time to collect day ahead forecasts", logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName())); + // Collect the day ahead tariff forecasts at the desired collect time + if (collectTime != null) { + // Calculate the 15-minute interval for collecting the day ahead tariff forecasts + LocalDate currentDate = LocalDate.now(); + LocalDateTime collectDateTime = LocalDateTime.of(currentDate, collectTime); + long collectTimeMillisStart = + collectDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long collectTimeMillisEnd = collectTimeMillisStart + 15 * 60000; + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + + if (currentTimeMillis >= collectTimeMillisStart && currentTimeMillis < collectTimeMillisEnd) { + // Create asset datapoint query + LocalDate tomorrowDate = currentDate.plusDays(1); + LocalDateTime startOfNextDay = tomorrowDate.atStartOfDay(); + long startTimeMillis = + startOfNextDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long endTimeMillis = startTimeMillis + 24 * 60 * 60000 - 60000; + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + // Get the tariffs number of data-points from day ahead asset + int tariffExportDayAheadSize = + services + .getAssetDatapointService() + .queryDatapoints( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), + assetDatapointQuery) + .size(); + int tariffImportDayAheadSize = + services + .getAssetDatapointService() + .queryDatapoints( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), + assetDatapointQuery) + .size(); + + // Only update the historic datapoint table if there are no day ahead tariffs present + if (tariffExportDayAheadSize == 0) { + List> tariffExport = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), + assetDatapointQuery); + services + .getAssetDatapointService() + .upsertValues( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), + tariffExport); } - // Parse the time string - LocalTime collectTime = null; - - if (!collectTimeForecasts.isBlank()) { - try { - collectTime = LocalTime.parse(collectTimeForecasts, DateTimeFormatter.ofPattern("HH:mm")); - } catch (Exception e) { - LOG.warning(String.format("%s, attributeName='%s'; Error while parsing collect time; Exception: %s", logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName(), e)); - } + if (tariffImportDayAheadSize == 0) { + List> tariffImport = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), + assetDatapointQuery); + services + .getAssetDatapointService() + .upsertValues( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), + tariffImport); } - // Collect the day ahead tariff forecasts at the desired collect time - if (collectTime != null) { - // Calculate the 15-minute interval for collecting the day ahead tariff forecasts - LocalDate currentDate = LocalDate.now(); - LocalDateTime collectDateTime = LocalDateTime.of(currentDate, collectTime); - long collectTimeMillisStart = collectDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - long collectTimeMillisEnd = collectTimeMillisStart + 15 * 60000; - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - - if (currentTimeMillis >= collectTimeMillisStart && currentTimeMillis < collectTimeMillisEnd) { - // Create asset datapoint query - LocalDate tomorrowDate = currentDate.plusDays(1); - LocalDateTime startOfNextDay = tomorrowDate.atStartOfDay(); - long startTimeMillis = startOfNextDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - long endTimeMillis = startTimeMillis + 24 * 60 * 60000 - 60000; - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - - // Get the tariffs number of data-points from day ahead asset - int tariffExportDayAheadSize = services.getAssetDatapointService().queryDatapoints(dayAheadAssetId, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), assetDatapointQuery).size(); - int tariffImportDayAheadSize = services.getAssetDatapointService().queryDatapoints(dayAheadAssetId, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), assetDatapointQuery).size(); - - // Only update the historic datapoint table if there are no day ahead tariffs present - if (tariffExportDayAheadSize == 0) { - List> tariffExport = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), assetDatapointQuery); - services.getAssetDatapointService().upsertValues(dayAheadAssetId, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), tariffExport); - } - - if (tariffImportDayAheadSize == 0) { - List> tariffImport = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), assetDatapointQuery); - services.getAssetDatapointService().upsertValues(dayAheadAssetId, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), tariffImport); - } - - // Update the last update forecasts datetime field - String lastUpdateForecasts = dayAheadAsset.getLastUpdateForecasts().orElse(""); - String lastUpdateForecastsNew = collectDateTime.toString(); + // Update the last update forecasts datetime field + String lastUpdateForecasts = dayAheadAsset.getLastUpdateForecasts().orElse(""); + String lastUpdateForecastsNew = collectDateTime.toString(); - LocalDateTime lastUpdateDateTime = collectDateTime.plusDays(-1); + LocalDateTime lastUpdateDateTime = collectDateTime.plusDays(-1); - if (!lastUpdateForecasts.isEmpty()) { - lastUpdateDateTime = LocalDateTime.parse(lastUpdateForecasts); - } - - LocalDate nextUpdateDate = lastUpdateDateTime.plusDays(1).toLocalDate(); + if (!lastUpdateForecasts.isEmpty()) { + lastUpdateDateTime = LocalDateTime.parse(lastUpdateForecasts); + } - if (nextUpdateDate.isEqual(currentDate)) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(dayAheadAssetId, EmsDayAheadAsset.LAST_UPDATE_FORECASTS.getName(), lastUpdateForecastsNew, collectTimeMillisStart)); - } - } + LocalDate nextUpdateDate = lastUpdateDateTime.plusDays(1).toLocalDate(); + + if (nextUpdateDate.isEqual(currentDate)) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + dayAheadAssetId, + EmsDayAheadAsset.LAST_UPDATE_FORECASTS.getName(), + lastUpdateForecastsNew, + collectTimeMillisStart)); } + } } + } - record IndexedDatapoint(long timestamp, double value, int index) { - } + record IndexedDatapoint(long timestamp, double value, int index) {} } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisationBeta.java b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisationBeta.java index 008027a..9f00b6f 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisationBeta.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/EmsOptimisationBeta.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,22 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.optimisationMethods; +import static org.openremote.model.syslog.SyslogCategory.DATA; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.openremote.extension.ems.agent.EmsDayAheadAsset; import org.openremote.extension.ems.agent.EmsElectricityBatteryAsset; import org.openremote.extension.ems.agent.EmsEnergyOptimisationAsset; @@ -33,1730 +42,2522 @@ import org.openremote.model.syslog.SyslogCategory; import org.openremote.model.value.ValueType; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.logging.Logger; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.openremote.model.syslog.SyslogCategory.DATA; - public class EmsOptimisationBeta implements OptimisationMethod { - protected static final Logger LOG = SyslogCategory.getLogger(DATA, EmsOptimisationBeta.class.getName()); - private final String optimisationMethodName = EmsOptimisationBeta.class.getSimpleName(); - - // Maximum interval between data-points send by the device to be considered connected - private final int ACTIVE_PERIOD_MINUTES = 5; + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, EmsOptimisationBeta.class.getName()); + private final String optimisationMethodName = EmsOptimisationBeta.class.getSimpleName(); + + // Maximum interval between data-points send by the device to be considered connected + private final int ACTIVE_PERIOD_MINUTES = 5; + + // Default EMS power limit settings + private final int POWER_LIMIT_FLUCTUATION_MARGIN_PERCENTAGE_DEFAULT = 10; + + // Default battery settings + private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT = 50; + private final double BATTERY_POWER_SETPOINT_RESPONSIVENESS_DEFAULT = 0.5; + private final int BATTERY_TARIFF_OPTIMISATION_WINDOW_DEFAULT = 8; + + // Advanced settings attribute names + private final String POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME = + "powerLimitMaximumFluctuationMargin"; + private final String POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME = + "powerLimitMinimumFluctuationMargin"; + + private final String[][] advancedSettingsAttributesInfo = { + {POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME, ValueType.POSITIVE_NUMBER.getName()}, + {POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME, ValueType.POSITIVE_NUMBER.getName()} + }; + + @Override + public void execute(String energyOptimisationAssetId, Services services) { + runOptimisationMethodEms(energyOptimisationAssetId, services); + } + + private void runOptimisationMethodEms(String energyOptimisationAssetId, Services services) { + // Get energy optimisation asset + EmsEnergyOptimisationAsset energyOptimisationAsset = + (EmsEnergyOptimisationAsset) + services.getAssetStorageService().find(energyOptimisationAssetId); + + if (energyOptimisationAsset == null) { + return; + } - // Default EMS power limit settings - private final int POWER_LIMIT_FLUCTUATION_MARGIN_PERCENTAGE_DEFAULT = 10; + // Update Advanced settings attributes info + String advancedSettingsAttributes = + energyOptimisationAsset.getAdvancedSettingsAttributes().orElse(""); - // Default battery settings - private final int BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT = 50; - private final double BATTERY_POWER_SETPOINT_RESPONSIVENESS_DEFAULT = 0.5; - private final int BATTERY_TARIFF_OPTIMISATION_WINDOW_DEFAULT = 8; + if (advancedSettingsAttributes.isBlank()) { + StringBuilder advancedSettingsAttributesBody = new StringBuilder(); - // Advanced settings attribute names - private final String POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME = "powerLimitMaximumFluctuationMargin"; - private final String POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME = "powerLimitMinimumFluctuationMargin"; + String firstRow = String.format("Optimisation method '%s':\n", optimisationMethodName); + advancedSettingsAttributesBody.append(firstRow); - private final String[][] advancedSettingsAttributesInfo = { - {POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME, ValueType.POSITIVE_NUMBER.getName()}, - {POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME, ValueType.POSITIVE_NUMBER.getName()} - }; + for (String[] row : advancedSettingsAttributesInfo) { + advancedSettingsAttributesBody.append(String.join(",", row)).append("\n"); + } - @Override - public void execute(String energyOptimisationAssetId, Services services) { - runOptimisationMethodEms(energyOptimisationAssetId, services); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.ADVANCED_SETTINGS_ATTRIBUTES, + advancedSettingsAttributesBody.toString()), + getClass().getSimpleName()); } - private void runOptimisationMethodEms(String energyOptimisationAssetId, Services services) { - // Get energy optimisation asset - EmsEnergyOptimisationAsset energyOptimisationAsset = (EmsEnergyOptimisationAsset) services.getAssetStorageService().find(energyOptimisationAssetId); - - if (energyOptimisationAsset == null) { - return; - } + String logPrefixEnergyOptimisation = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAssetId, + energyOptimisationAsset.getAssetName()); + + // Get all battery assets + List electricityBatteryAssets = + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .parents(energyOptimisationAssetId) + .types(EmsElectricityBatteryAsset.class)) + .stream() + .map(asset -> (EmsElectricityBatteryAsset) asset) + .toList(); + + if (energyOptimisationAsset.getEnableDetailedLogging().orElse(false)) { + int allowChargingSize = + electricityBatteryAssets.stream() + .filter( + electricityBatteryAsset -> + electricityBatteryAsset.getAllowCharging().orElse(false)) + .toList() + .size(); + + int allowDischargingSize = + electricityBatteryAssets.stream() + .filter( + electricityBatteryAsset -> + electricityBatteryAsset.getAllowDischarging().orElse(false)) + .toList() + .size(); + + LOG.info( + String.format( + "%s; Energy optimisation asset has %s battery asset(s). Number of batteries with '%s'= %s and '%s'= %s", + logPrefixEnergyOptimisation, + electricityBatteryAssets.size(), + EmsElectricityBatteryAsset.ALLOW_CHARGING.getName(), + allowChargingSize, + EmsElectricityBatteryAsset.ALLOW_DISCHARGING.getName(), + allowDischargingSize)); + } - // Update Advanced settings attributes info - String advancedSettingsAttributes = energyOptimisationAsset.getAdvancedSettingsAttributes().orElse(""); + // Check if power net is connected + Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); - if (advancedSettingsAttributes.isBlank()) { - StringBuilder advancedSettingsAttributesBody = new StringBuilder(); + if (powerNet == null) { + LOG.warning( + String.format( + "%s; Failed to perform '%s' energy optimisation method. '%s' attribute is not connected", + logPrefixEnergyOptimisation, + optimisationMethodName, + EmsEnergyOptimisationAsset.POWER_NET.getName())); + } - String firstRow = String.format("Optimisation method '%s':\n", optimisationMethodName); - advancedSettingsAttributesBody.append(firstRow); + // Validate power limits + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); + Long powerLimitMaximumProfileTimestampMillis = + energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); - for (String[] row : advancedSettingsAttributesInfo) { - advancedSettingsAttributesBody.append(String.join(",", row)).append("\n"); - } + DateTimeFormatter formatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(energyOptimisationAssetId, EmsEnergyOptimisationAsset.ADVANCED_SETTINGS_ATTRIBUTES, advancedSettingsAttributesBody.toString()), getClass().getSimpleName()); - } + String powerLimitMaximumProfileDateTime = ""; - String logPrefixEnergyOptimisation = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAssetId, energyOptimisationAsset.getAssetName()); - - // Get all battery assets - List electricityBatteryAssets = services.getAssetStorageService() - .findAll(new AssetQuery().parents(energyOptimisationAssetId).types(EmsElectricityBatteryAsset.class)) - .stream() - .map(asset -> (EmsElectricityBatteryAsset) asset) - .toList(); - - if (energyOptimisationAsset.getEnableDetailedLogging().orElse(false)) { - int allowChargingSize = electricityBatteryAssets - .stream() - .filter(electricityBatteryAsset -> electricityBatteryAsset.getAllowCharging().orElse(false)) - .toList() - .size(); - - int allowDischargingSize = electricityBatteryAssets - .stream() - .filter(electricityBatteryAsset -> electricityBatteryAsset.getAllowDischarging().orElse(false)) - .toList() - .size(); - - LOG.info(String.format("%s; Energy optimisation asset has %s battery asset(s). Number of batteries with '%s'= %s and '%s'= %s", - logPrefixEnergyOptimisation, electricityBatteryAssets.size(), EmsElectricityBatteryAsset.ALLOW_CHARGING.getName(), allowChargingSize, EmsElectricityBatteryAsset.ALLOW_DISCHARGING.getName(), allowDischargingSize)); - } + if (powerLimitMaximumProfileTimestampMillis != null) { + powerLimitMaximumProfileDateTime = + formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); + } - // Check if power net is connected - Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); + if (powerLimitMaximumProfileTotal != null + && powerLimitMinimumProfileTotal != null + && powerLimitMaximumProfileTotal <= powerLimitMinimumProfileTotal) { + LOG.warning( + String.format( + "%s; Failed to perform '%s' energy optimisation method. The '%s'= %s kW is lower than or equal to '%s'= %s kW for timestamp='%s'", + logPrefixEnergyOptimisation, + optimisationMethodName, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + powerLimitMaximumProfileTotal, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + powerLimitMinimumProfileTotal, + powerLimitMaximumProfileDateTime)); + } - if (powerNet == null) { - LOG.warning(String.format("%s; Failed to perform '%s' energy optimisation method. '%s' attribute is not connected", logPrefixEnergyOptimisation, optimisationMethodName, EmsEnergyOptimisationAsset.POWER_NET.getName())); - } + // Get day ahead asset + EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); - // Validate power limits - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); - Long powerLimitMaximumProfileTimestampMillis = energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); + // Update day ahead asset at specific time of day + if (dayAheadAsset != null) { + updateDayAheadAsset(energyOptimisationAsset, dayAheadAsset, services); + } - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); + // Check for battery assets + if (electricityBatteryAssets.isEmpty()) { + return; + } - String powerLimitMaximumProfileDateTime = ""; + // Order battery assets + electricityBatteryAssets = batteryOrder(electricityBatteryAssets); - if (powerLimitMaximumProfileTimestampMillis != null) { - powerLimitMaximumProfileDateTime = formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); - } + // Check connection status of battery assets + batteryCheckConnection(electricityBatteryAssets, services); - if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal != null && powerLimitMaximumProfileTotal <= powerLimitMinimumProfileTotal) { - LOG.warning(String.format("%s; Failed to perform '%s' energy optimisation method. The '%s'= %s kW is lower than or equal to '%s'= %s kW for timestamp='%s'", - logPrefixEnergyOptimisation, optimisationMethodName, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), powerLimitMaximumProfileTotal, - EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), powerLimitMinimumProfileTotal, powerLimitMaximumProfileDateTime)); - } + // Check if all required attributes are connected/set and create log messages + batteryCheckSetup(electricityBatteryAssets); - // Get day ahead asset - EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); + // Find latest power set-point update across all batteries + long powerSetpointTimestampLatestMillis = + batteriesLatestPowerSetpointUpdate(electricityBatteryAssets); - // Update day ahead asset at specific time of day - if (dayAheadAsset != null) { - updateDayAheadAsset(energyOptimisationAsset, dayAheadAsset, services); - } + // Calculate battery energy level percentage targets + int intervalPeriodMinutes = 15; + int currentMinute = LocalDateTime.now().getMinute(); + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long forecastUpdateTimeMillis = + currentTimeMillis - currentTimeMillis % (intervalPeriodMinutes * 60 * 1000); - // Check for battery assets - if (electricityBatteryAssets.isEmpty()) { - return; - } + Map batteryEnergyLevelPercentageTargets; - // Order battery assets - electricityBatteryAssets = batteryOrder(electricityBatteryAssets); + if ((currentMinute % intervalPeriodMinutes) == 0 + || powerSetpointTimestampLatestMillis < forecastUpdateTimeMillis) { + batteryEnergyLevelPercentageTargets = + batteryCalculateForecasts(electricityBatteryAssets, energyOptimisationAsset, services); + } else { + batteryEnergyLevelPercentageTargets = + batteryGetEnergyLevelPercentageTargetsCurrent(electricityBatteryAssets, services); + } - // Check connection status of battery assets - batteryCheckConnection(electricityBatteryAssets, services); + // Calculate battery power set-points + Map powerSetpointsNew = + batteryCalculatePowerSetpoints( + energyOptimisationAsset, + electricityBatteryAssets, + powerSetpointTimestampLatestMillis, + batteryEnergyLevelPercentageTargets, + services, + logPrefixEnergyOptimisation); + + // Update battery power set-points + batteryUpdatePowerSetpoints(electricityBatteryAssets, powerSetpointsNew, services); + } + + private long batteriesLatestPowerSetpointUpdate( + List electricityBatteryAssets) { + // Find latest power set-point update across all batteries + long powerSetpointTimestampLatestMillis = 0L; + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + long powerSetpointTimestampMillis = + electricityBatteryAsset.getPowerSetpointTimestamp().orElse(0L); + + if (powerSetpointTimestampMillis > powerSetpointTimestampLatestMillis) { + powerSetpointTimestampLatestMillis = powerSetpointTimestampMillis; + } + } - // Check if all required attributes are connected/set and create log messages - batteryCheckSetup(electricityBatteryAssets); + return powerSetpointTimestampLatestMillis; + } - // Find latest power set-point update across all batteries - long powerSetpointTimestampLatestMillis = batteriesLatestPowerSetpointUpdate(electricityBatteryAssets); + private int batteryCalculateEnergyLevelPercentageDefault( + Integer energyLevelPercentageMaximumBattery, + Integer energyLevelPercentageMinimumBattery, + EmsEnergyOptimisationAsset energyOptimisationAsset) { + if (energyLevelPercentageMaximumBattery == null + || energyLevelPercentageMinimumBattery == null) { + return BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT; + } - // Calculate battery energy level percentage targets - int intervalPeriodMinutes = 15; - int currentMinute = LocalDateTime.now().getMinute(); - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long forecastUpdateTimeMillis = currentTimeMillis - currentTimeMillis % (intervalPeriodMinutes * 60 * 1000); + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); + + int energyLevelPercentageDefault; + + if (powerLimitMaximumProfileTotal == null && powerLimitMinimumProfileTotal != null) { + energyLevelPercentageDefault = energyLevelPercentageMinimumBattery; + } else if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal == null) { + energyLevelPercentageDefault = energyLevelPercentageMaximumBattery; + } else { + energyLevelPercentageDefault = + (int) + Math.round( + (double) + (energyLevelPercentageMaximumBattery + + energyLevelPercentageMinimumBattery) + / 2); + } - Map batteryEnergyLevelPercentageTargets; + return energyLevelPercentageDefault; + } + + private Map batteryCalculateForecasts( + List electricityBatteryAssets, + EmsEnergyOptimisationAsset energyOptimisationAsset, + Services services) { + Map batteryEnergyLevelPercentageTargets = new HashMap<>(); + + StringBuilder infoStr = new StringBuilder(); + infoStr.append("EMS forecast:\n"); + + // Get power consumption forecast for 1 week + long intervalMillis = 15 * 60000; + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long startTimeForecastPeriodMillis = currentTimeMillis - currentTimeMillis % intervalMillis; + long endTimeForecastPeriodMillis = + startTimeForecastPeriodMillis + - startTimeForecastPeriodMillis % (24 * 60 * 60000) + + (8 * 24 * 60 * 60000); + + String energyOptimisationAssetId = energyOptimisationAsset.getId(); + AssetDatapointAllQuery assetDatapointQueryConsumptionPredicted = + new AssetDatapointAllQuery(startTimeForecastPeriodMillis, endTimeForecastPeriodMillis); + List> energyOptimisationPowerConsumptionPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName(), + assetDatapointQueryConsumptionPredicted); + + // System.out.println("energyOptimisationPowerConsumptionPredicted = " + + // energyOptimisationPowerConsumptionPredicted); + + if (energyOptimisationPowerConsumptionPredicted.isEmpty()) { + return batteryEnergyLevelPercentageTargets; + } - if ((currentMinute % intervalPeriodMinutes) == 0 || powerSetpointTimestampLatestMillis < forecastUpdateTimeMillis) { - batteryEnergyLevelPercentageTargets = batteryCalculateForecasts(electricityBatteryAssets, energyOptimisationAsset, services); - } else { - batteryEnergyLevelPercentageTargets = batteryGetEnergyLevelPercentageTargetsCurrent(electricityBatteryAssets, services); - } + // Calculate power average for each 15-minute interval + List> totalPowerConsumptionAveraged = + intervalAverage(energyOptimisationPowerConsumptionPredicted, intervalMillis); + totalPowerConsumptionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - // Calculate battery power set-points - Map powerSetpointsNew = batteryCalculatePowerSetpoints(energyOptimisationAsset, electricityBatteryAssets, powerSetpointTimestampLatestMillis, batteryEnergyLevelPercentageTargets, services, logPrefixEnergyOptimisation); + // System.out.println("totalPowerConsumptionAveraged = " + + // totalPowerConsumptionAveraged); - // Update battery power set-points - batteryUpdatePowerSetpoints(electricityBatteryAssets, powerSetpointsNew, services); - } + long startTimeForecastDataMillis = totalPowerConsumptionAveraged.getFirst().getTimestamp(); + long endTimeForecastDataMillis = totalPowerConsumptionAveraged.getLast().getTimestamp(); - private long batteriesLatestPowerSetpointUpdate(List electricityBatteryAssets) { - // Find latest power set-point update across all batteries - long powerSetpointTimestampLatestMillis = 0L; + // Interpolate power average values for each 15-minute interval + List> totalPowerConsumptionInterpolated = + intervalInterpolate( + totalPowerConsumptionAveraged, + startTimeForecastDataMillis, + endTimeForecastDataMillis, + intervalMillis); - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - long powerSetpointTimestampMillis = electricityBatteryAsset.getPowerSetpointTimestamp().orElse(0L); + List timestampsMillisList = new ArrayList<>(); + List totalPowerConsumptionList = new ArrayList<>(); - if (powerSetpointTimestampMillis > powerSetpointTimestampLatestMillis) { - powerSetpointTimestampLatestMillis = powerSetpointTimestampMillis; - } - } + for (ValueDatapoint datapoint : totalPowerConsumptionInterpolated) { + long timestampMillis = datapoint.getTimestamp(); + Double value = (Double) datapoint.getValue(); - return powerSetpointTimestampLatestMillis; + timestampsMillisList.add(timestampMillis); + totalPowerConsumptionList.add(value); } - private int batteryCalculateEnergyLevelPercentageDefault(Integer energyLevelPercentageMaximumBattery, Integer energyLevelPercentageMinimumBattery, EmsEnergyOptimisationAsset energyOptimisationAsset) { - if (energyLevelPercentageMaximumBattery == null || energyLevelPercentageMinimumBattery == null) { - return BATTERY_ENERGY_LEVEL_PERCENTAGE_DEFAULT; - } - - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumInput().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumInput().orElse(null); + int numberOfTimestamps = timestampsMillisList.size(); - int energyLevelPercentageDefault; + infoStr.append(String.format("numberOfTimestamps = %s \n", numberOfTimestamps)); + infoStr.append(String.format("timestampsMillisList = %s \n", timestampsMillisList)); + infoStr.append(String.format("totalPowerConsumptionList = %s \n", totalPowerConsumptionList)); - if (powerLimitMaximumProfileTotal == null && powerLimitMinimumProfileTotal != null) { - energyLevelPercentageDefault = energyLevelPercentageMinimumBattery; - } else if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal == null) { - energyLevelPercentageDefault = energyLevelPercentageMaximumBattery; - } else { - energyLevelPercentageDefault = (int) Math.round((double) (energyLevelPercentageMaximumBattery + energyLevelPercentageMinimumBattery) / 2); - } + if (totalPowerConsumptionList.isEmpty()) { + return batteryEnergyLevelPercentageTargets; + } - return energyLevelPercentageDefault; + AssetDatapointAllQuery assetDatapointQueryPeriodPredicted = + new AssetDatapointAllQuery(startTimeForecastDataMillis, endTimeForecastDataMillis); + List> energyOptimisationPowerProductionPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName(), + assetDatapointQueryPeriodPredicted); + + // System.out.println("energyOptimisationPowerProductionPredicted = " + + // energyOptimisationPowerProductionPredicted); + + Map totalPowerProductionMap = new HashMap<>(); + + if (!energyOptimisationPowerProductionPredicted.isEmpty()) { + // Calculate power average for each 15-minute interval + List> totalPowerProductionAveraged = + intervalAverage(energyOptimisationPowerProductionPredicted, intervalMillis); + totalPowerProductionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + + // Interpolate power average values for each 15-minute interval + List> totalPowerProductionInterpolated = + intervalInterpolate( + totalPowerProductionAveraged, + totalPowerProductionAveraged.getFirst().getTimestamp(), + totalPowerProductionAveraged.getLast().getTimestamp(), + intervalMillis); + + totalPowerProductionMap = + totalPowerProductionInterpolated.stream() + .collect( + Collectors.toMap(ValueDatapoint::getTimestamp, dp -> ((Double) dp.getValue()))); } - private Map batteryCalculateForecasts(List electricityBatteryAssets, EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { - Map batteryEnergyLevelPercentageTargets = new HashMap<>(); + // List to store the sum of total power consumption, production and flexible + List totalPowerConsumptionProductionFlexibleList = new ArrayList<>(); - StringBuilder infoStr = new StringBuilder(); - infoStr.append("EMS forecast:\n"); + // Sum total power consumption and production + for (int i = 0; i < numberOfTimestamps; i++) { + Double powerConsumption = totalPowerConsumptionList.get(i); + Double powerProduction = totalPowerProductionMap.get(timestampsMillisList.get(i)); - // Get power consumption forecast for 1 week - long intervalMillis = 15 * 60000; - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long startTimeForecastPeriodMillis = currentTimeMillis - currentTimeMillis % intervalMillis; - long endTimeForecastPeriodMillis = startTimeForecastPeriodMillis - startTimeForecastPeriodMillis % (24 * 60 * 60000) + (8 * 24 * 60 * 60000); + if (powerProduction != null) { + double sum = powerConsumption + powerProduction; + totalPowerConsumptionProductionFlexibleList.add(sum); + } else { + totalPowerConsumptionProductionFlexibleList.add(powerConsumption); + } + } - String energyOptimisationAssetId = energyOptimisationAsset.getId(); - AssetDatapointAllQuery assetDatapointQueryConsumptionPredicted = new AssetDatapointAllQuery(startTimeForecastPeriodMillis, endTimeForecastPeriodMillis); - List> energyOptimisationPowerConsumptionPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_CONSUMPTION.getName(), assetDatapointQueryConsumptionPredicted); + infoStr.append( + String.format( + "totalPowerConsumptionProductionFlexibleList = %s \n", + totalPowerConsumptionProductionFlexibleList)); + + // Get power limit forecasts + List> energyOptimisationPowerLimitMaximumPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + assetDatapointQueryPeriodPredicted); + List> energyOptimisationPowerLimitMinimumPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAssetId, + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + assetDatapointQueryPeriodPredicted); + + Map powerLimitMaximumMap = new HashMap<>(); + Map powerLimitMinimumMap = new HashMap<>(); + + for (ValueDatapoint dp : energyOptimisationPowerLimitMaximumPredicted) { + powerLimitMaximumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + } -// System.out.println("energyOptimisationPowerConsumptionPredicted = " + energyOptimisationPowerConsumptionPredicted); + for (ValueDatapoint dp : energyOptimisationPowerLimitMinimumPredicted) { + powerLimitMinimumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + } - if (energyOptimisationPowerConsumptionPredicted.isEmpty()) { - return batteryEnergyLevelPercentageTargets; + List chargePowerAvailableTotalList = new ArrayList<>(); + List dischargePowerAvailableTotalList = new ArrayList<>(); + + // Add current available charge and discharge power which is 0 + chargePowerAvailableTotalList.add(0.0); + dischargePowerAvailableTotalList.add(0.0); + + double intervalHour = round((double) intervalMillis / (60 * 60000), 5); + int batteryPercentageRoundingPrecision = 5; + + // Calculate forecast for each battery + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String batteryAssetId = electricityBatteryAsset.getId(); + Integer chargeEfficiencyBattery = electricityBatteryAsset.getChargeEfficiency().orElse(null); + Double chargePowerMaximumBattery = + electricityBatteryAsset.getChargePowerMaximum().orElse(null); + Integer dischargeEfficiencyBattery = + electricityBatteryAsset.getDischargeEfficiency().orElse(null); + Double dischargePowerMaximumBattery = + electricityBatteryAsset.getDischargePowerMaximum().orElse(null); + Double energyCapacityBattery = electricityBatteryAsset.getEnergyCapacity().orElse(null); + Double energyLevelPercentageBattery = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + Integer energyLevelPercentageMaximumBattery = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimumBattery = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + + if (chargeEfficiencyBattery == null + || chargePowerMaximumBattery == null + || dischargeEfficiencyBattery == null + || dischargePowerMaximumBattery == null + || energyCapacityBattery == null + || energyLevelPercentageBattery == null + || energyLevelPercentageMaximumBattery == null + || energyLevelPercentageMinimumBattery == null) { + continue; + } + + // Check if the energy level percentage maximum and minimum are valid + if (energyLevelPercentageMaximumBattery <= energyLevelPercentageMinimumBattery) { + continue; + } + + // Check if the charge and discharge efficiency are valid + if (chargeEfficiencyBattery <= 0 || dischargeEfficiencyBattery <= 0) { + continue; + } + + List powerLimitMaximumVirtualList = new ArrayList<>(); + List powerLimitMinimumVirtualList = new ArrayList<>(); + + // Calculate total available charge and discharge power + for (int i = 0; i < numberOfTimestamps; i++) { + long timestampMillis = timestampsMillisList.get(i); + double totalPower = totalPowerConsumptionProductionFlexibleList.get(i); + + Double powerLimitMaximum = powerLimitMaximumMap.getOrDefault(timestampMillis, null); + Double powerLimitMinimum = powerLimitMinimumMap.getOrDefault(timestampMillis, null); + + Double powerLimitMaximumVirtual = + calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMaximum, "max"); + Double powerLimitMinimumVirtual = + calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMinimum, "min"); + + powerLimitMaximumVirtualList.add(powerLimitMaximumVirtual); + powerLimitMinimumVirtualList.add(powerLimitMinimumVirtual); + + if (powerLimitMaximumVirtual != null) { + double chargePowerTotalAvailable = powerLimitMaximumVirtual - totalPower; + chargePowerAvailableTotalList.add(chargePowerTotalAvailable); + } else { + chargePowerAvailableTotalList.add(Double.POSITIVE_INFINITY); } - // Calculate power average for each 15-minute interval - List> totalPowerConsumptionAveraged = intervalAverage(energyOptimisationPowerConsumptionPredicted, intervalMillis); - totalPowerConsumptionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - -// System.out.println("totalPowerConsumptionAveraged = " + totalPowerConsumptionAveraged); - - long startTimeForecastDataMillis = totalPowerConsumptionAveraged.getFirst().getTimestamp(); - long endTimeForecastDataMillis = totalPowerConsumptionAveraged.getLast().getTimestamp(); - - // Interpolate power average values for each 15-minute interval - List> totalPowerConsumptionInterpolated = intervalInterpolate(totalPowerConsumptionAveraged, startTimeForecastDataMillis, endTimeForecastDataMillis, intervalMillis); - - List timestampsMillisList = new ArrayList<>(); - List totalPowerConsumptionList = new ArrayList<>(); - - for (ValueDatapoint datapoint : totalPowerConsumptionInterpolated) { - long timestampMillis = datapoint.getTimestamp(); - Double value = (Double) datapoint.getValue(); - - timestampsMillisList.add(timestampMillis); - totalPowerConsumptionList.add(value); + if (powerLimitMinimumVirtual != null) { + double dischargePowerTotalAvailable = powerLimitMinimumVirtual - totalPower; + dischargePowerAvailableTotalList.add(dischargePowerTotalAvailable); + } else { + dischargePowerAvailableTotalList.add(Double.NEGATIVE_INFINITY); } - - int numberOfTimestamps = timestampsMillisList.size(); - - infoStr.append(String.format("numberOfTimestamps = %s \n", numberOfTimestamps)); - infoStr.append(String.format("timestampsMillisList = %s \n", timestampsMillisList)); - infoStr.append(String.format("totalPowerConsumptionList = %s \n", totalPowerConsumptionList)); - - if (totalPowerConsumptionList.isEmpty()) { - return batteryEnergyLevelPercentageTargets; + } + + int numberOfDataPoints = chargePowerAvailableTotalList.size(); + + infoStr.append( + String.format("powerLimitMaximumVirtualList = %s \n", powerLimitMaximumVirtualList)); + infoStr.append( + String.format("powerLimitMinimumVirtualList = %s \n", powerLimitMinimumVirtualList)); + infoStr.append("\n"); + + // System.out.println("chargePowerAvailableTotalList = " + + // chargePowerAvailableTotalList); + // System.out.println("dischargePowerAvailableTotalList = " + + // dischargePowerAvailableTotalList); + + List chargeNeededTotalList = + dischargePowerAvailableTotalList.stream().map(x -> x > 0 ? x : 0).toList(); + List dischargeNeededTotalList = + chargePowerAvailableTotalList.stream().map(x -> x < 0 ? x : 0).toList(); + + // System.out.println("chargeNeededTotalList = " + chargeNeededTotalList); + // System.out.println("dischargeNeededTotalList = " + dischargeNeededTotalList); + + List chargePowerAvailableBatteryList = + chargePowerAvailableTotalList.stream() + .map(x -> x > 0 ? Math.min(x, chargePowerMaximumBattery) : 0) + .toList(); + List dischargePowerAvailableBatteryList = + dischargePowerAvailableTotalList.stream() + .map(x -> x < 0 ? Math.max(x, dischargePowerMaximumBattery) : 0) + .toList(); + + // System.out.println("chargeAvailableBatteryList = " + + // chargePowerAvailableBatteryList); + // System.out.println("dischargeAvailableBatteryList = " + + // dischargePowerAvailableBatteryList); + // System.out.println(); + + // Convert power to energy level percentage + List chargePercentageNeededTotalList = new ArrayList<>(); + List dischargePercentageNeededTotalList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + double c = + intervalHour + * chargeNeededTotalList.get(i) + * chargeEfficiencyBattery + / energyCapacityBattery; + double d = + 10000 + * intervalHour + * dischargeNeededTotalList.get(i) + / (energyCapacityBattery * dischargeEfficiencyBattery); + chargePercentageNeededTotalList.add(round(c, batteryPercentageRoundingPrecision)); + dischargePercentageNeededTotalList.add(round(d, batteryPercentageRoundingPrecision)); + } + + // System.out.println("chargePercentageNeededTotalList = " + + // chargePercentageNeededTotalList); + // System.out.println("dischargePercentageNeededTotalList = " + + // dischargePercentageNeededTotalList); + + List chargePercentageAvailableBatteryList = new ArrayList<>(); + List dischargePercentageAvailableBatteryList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + double c = + intervalHour + * chargePowerAvailableBatteryList.get(i) + * chargeEfficiencyBattery + / energyCapacityBattery; + double d = + 10000 + * intervalHour + * dischargePowerAvailableBatteryList.get(i) + / (energyCapacityBattery * dischargeEfficiencyBattery); + chargePercentageAvailableBatteryList.add(round(c, batteryPercentageRoundingPrecision)); + dischargePercentageAvailableBatteryList.add(round(d, batteryPercentageRoundingPrecision)); + } + + // System.out.println("chargePercentageAvailableBatteryList = " + + // chargePercentageAvailableBatteryList); + // System.out.println("dischargePercentageAvailableBatteryList = " + + // dischargePercentageAvailableBatteryList); + // System.out.println(); + + // Calculate forecast when current energy level percentage is outside limits + int getToLimitIndex = 0; + double getToLimitPercentage = energyLevelPercentageBattery; + List getToLimitPercentageList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + getToLimitIndex = i; + + if (getToLimitPercentage > energyLevelPercentageMaximumBattery) { + double dischargePercentageNeeded = + energyLevelPercentageMaximumBattery - getToLimitPercentage; + double dischargePercentageAvailable = + Math.max(dischargePercentageAvailableBatteryList.get(i), dischargePercentageNeeded); + getToLimitPercentage = getToLimitPercentage + dischargePercentageAvailable; + dischargePercentageAvailableBatteryList.set( + i, + round( + dischargePercentageAvailableBatteryList.get(i) - dischargePercentageAvailable, + batteryPercentageRoundingPrecision)); + getToLimitPercentageList.add( + round(getToLimitPercentage, batteryPercentageRoundingPrecision)); + } else if (getToLimitPercentage < energyLevelPercentageMinimumBattery) { + double chargePercentageNeeded = + energyLevelPercentageMinimumBattery - getToLimitPercentage; + double chargePercentageAvailable = + Math.min(chargePercentageAvailableBatteryList.get(i), chargePercentageNeeded); + getToLimitPercentage = getToLimitPercentage + chargePercentageAvailable; + chargePercentageAvailableBatteryList.set( + i, + round( + chargePercentageAvailableBatteryList.get(i) - chargePercentageAvailable, + batteryPercentageRoundingPrecision)); + getToLimitPercentageList.add( + round(getToLimitPercentage, batteryPercentageRoundingPrecision)); + } else { + break; } - - AssetDatapointAllQuery assetDatapointQueryPeriodPredicted = new AssetDatapointAllQuery(startTimeForecastDataMillis, endTimeForecastDataMillis); - List> energyOptimisationPowerProductionPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_PRODUCTION.getName(), assetDatapointQueryPeriodPredicted); - -// System.out.println("energyOptimisationPowerProductionPredicted = " + energyOptimisationPowerProductionPredicted); - - Map totalPowerProductionMap = new HashMap<>(); - - if (!energyOptimisationPowerProductionPredicted.isEmpty()) { - // Calculate power average for each 15-minute interval - List> totalPowerProductionAveraged = intervalAverage(energyOptimisationPowerProductionPredicted, intervalMillis); - totalPowerProductionAveraged.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - - // Interpolate power average values for each 15-minute interval - List> totalPowerProductionInterpolated = intervalInterpolate(totalPowerProductionAveraged, totalPowerProductionAveraged.getFirst().getTimestamp(), totalPowerProductionAveraged.getLast().getTimestamp(), intervalMillis); - - totalPowerProductionMap = totalPowerProductionInterpolated.stream().collect(Collectors.toMap(ValueDatapoint::getTimestamp, dp -> ((Double) dp.getValue()))); + } + + // System.out.println("getToLimitIndex = " + getToLimitIndex); + // System.out.println("getToLimitPercentage = " + getToLimitPercentage); + // System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); + // System.out.println("chargePercentageAvailableBatteryList2 = " + + // chargePercentageAvailableBatteryList); + // System.out.println("dischargePercentageAvailableBatteryList2 = " + + // dischargePercentageAvailableBatteryList); + + List energyLevelPredictionList = new ArrayList<>(); + + if (getToLimitPercentage > energyLevelPercentageMaximumBattery + || getToLimitPercentage < energyLevelPercentageMinimumBattery) { + // Energy level percentage forecast when entire forecast is outside of battery percentage + // limits + energyLevelPredictionList = getToLimitPercentageList; + } else { + // Calculate energy level percentage forecast starting from value within battery percentage + // limits + List chargePercentageWantBatteryList = new ArrayList<>(); + List dischargePercentageWantBatteryList = new ArrayList<>(); + + for (int i = 0; i < numberOfDataPoints; i++) { + chargePercentageWantBatteryList.add( + Math.min( + chargePercentageNeededTotalList.get(i), + chargePercentageAvailableBatteryList.get(i))); + dischargePercentageWantBatteryList.add( + Math.max( + dischargePercentageNeededTotalList.get(i), + dischargePercentageAvailableBatteryList.get(i))); } - // List to store the sum of total power consumption, production and flexible - List totalPowerConsumptionProductionFlexibleList = new ArrayList<>(); + // System.out.println("chargePercentageWantBatteryList = " + + // chargePercentageWantBatteryList); + // System.out.println("dischargePercentageWantBatteryList = " + + // dischargePercentageWantBatteryList); - // Sum total power consumption and production - for (int i = 0; i < numberOfTimestamps; i++) { - Double powerConsumption = totalPowerConsumptionList.get(i); - Double powerProduction = totalPowerProductionMap.get(timestampsMillisList.get(i)); + List chargeAndDischargePercentageWantBatteryList = new ArrayList<>(); - if (powerProduction != null) { - double sum = powerConsumption + powerProduction; - totalPowerConsumptionProductionFlexibleList.add(sum); - } else { - totalPowerConsumptionProductionFlexibleList.add(powerConsumption); - } + for (int i = 0; i < numberOfDataPoints; i++) { + chargeAndDischargePercentageWantBatteryList.add( + round( + chargePercentageWantBatteryList.get(i) + + dischargePercentageWantBatteryList.get(i), + batteryPercentageRoundingPrecision)); } - infoStr.append(String.format("totalPowerConsumptionProductionFlexibleList = %s \n", totalPowerConsumptionProductionFlexibleList)); - - // Get power limit forecasts - List> energyOptimisationPowerLimitMaximumPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), assetDatapointQueryPeriodPredicted); - List> energyOptimisationPowerLimitMinimumPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAssetId, EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), assetDatapointQueryPeriodPredicted); + // System.out.println("chargeAndDischargePercentageWantBatteryList = " + + // chargeAndDischargePercentageWantBatteryList); + // System.out.println(); - Map powerLimitMaximumMap = new HashMap<>(); - Map powerLimitMinimumMap = new HashMap<>(); + // Calculate forecast without battery percentage limits + int startRunningSumIndex = getToLimitIndex > 0 ? getToLimitIndex - 1 : 0; + List runningSumList = new ArrayList<>(); + double sum = getToLimitPercentage; - for (ValueDatapoint dp : energyOptimisationPowerLimitMaximumPredicted) { - powerLimitMaximumMap.put(dp.getTimestamp(), (Double) dp.getValue()); + for (int i = startRunningSumIndex; i < numberOfDataPoints; i++) { + sum = sum + chargeAndDischargePercentageWantBatteryList.get(i); + runningSumList.add(round(sum, batteryPercentageRoundingPrecision)); } - for (ValueDatapoint dp : energyOptimisationPowerLimitMinimumPredicted) { - powerLimitMinimumMap.put(dp.getTimestamp(), (Double) dp.getValue()); - } - - List chargePowerAvailableTotalList = new ArrayList<>(); - List dischargePowerAvailableTotalList = new ArrayList<>(); - - // Add current available charge and discharge power which is 0 - chargePowerAvailableTotalList.add(0.0); - dischargePowerAvailableTotalList.add(0.0); - - double intervalHour = round((double) intervalMillis / (60 * 60000), 5); - int batteryPercentageRoundingPrecision = 5; - - // Calculate forecast for each battery - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String batteryAssetId = electricityBatteryAsset.getId(); - Integer chargeEfficiencyBattery = electricityBatteryAsset.getChargeEfficiency().orElse(null); - Double chargePowerMaximumBattery = electricityBatteryAsset.getChargePowerMaximum().orElse(null); - Integer dischargeEfficiencyBattery = electricityBatteryAsset.getDischargeEfficiency().orElse(null); - Double dischargePowerMaximumBattery = electricityBatteryAsset.getDischargePowerMaximum().orElse(null); - Double energyCapacityBattery = electricityBatteryAsset.getEnergyCapacity().orElse(null); - Double energyLevelPercentageBattery = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - Integer energyLevelPercentageMaximumBattery = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimumBattery = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - - if (chargeEfficiencyBattery == null || chargePowerMaximumBattery == null || dischargeEfficiencyBattery == null || dischargePowerMaximumBattery == null || energyCapacityBattery == null || - energyLevelPercentageBattery == null || energyLevelPercentageMaximumBattery == null || energyLevelPercentageMinimumBattery == null) { - continue; - } - - // Check if the energy level percentage maximum and minimum are valid - if (energyLevelPercentageMaximumBattery <= energyLevelPercentageMinimumBattery) { - continue; - } - - // Check if the charge and discharge efficiency are valid - if (chargeEfficiencyBattery <= 0 || dischargeEfficiencyBattery <= 0) { - continue; - } - - List powerLimitMaximumVirtualList = new ArrayList<>(); - List powerLimitMinimumVirtualList = new ArrayList<>(); - - // Calculate total available charge and discharge power - for (int i = 0; i < numberOfTimestamps; i++) { - long timestampMillis = timestampsMillisList.get(i); - double totalPower = totalPowerConsumptionProductionFlexibleList.get(i); - - Double powerLimitMaximum = powerLimitMaximumMap.getOrDefault(timestampMillis, null); - Double powerLimitMinimum = powerLimitMinimumMap.getOrDefault(timestampMillis, null); - - Double powerLimitMaximumVirtual = calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMaximum, "max"); - Double powerLimitMinimumVirtual = calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMinimum, "min"); - - powerLimitMaximumVirtualList.add(powerLimitMaximumVirtual); - powerLimitMinimumVirtualList.add(powerLimitMinimumVirtual); - - if (powerLimitMaximumVirtual != null) { - double chargePowerTotalAvailable = powerLimitMaximumVirtual - totalPower; - chargePowerAvailableTotalList.add(chargePowerTotalAvailable); - } else { - chargePowerAvailableTotalList.add(Double.POSITIVE_INFINITY); - } - - if (powerLimitMinimumVirtual != null) { - double dischargePowerTotalAvailable = powerLimitMinimumVirtual - totalPower; - dischargePowerAvailableTotalList.add(dischargePowerTotalAvailable); - } else { - dischargePowerAvailableTotalList.add(Double.NEGATIVE_INFINITY); - } - } - - int numberOfDataPoints = chargePowerAvailableTotalList.size(); - - infoStr.append(String.format("powerLimitMaximumVirtualList = %s \n", powerLimitMaximumVirtualList)); - infoStr.append(String.format("powerLimitMinimumVirtualList = %s \n", powerLimitMinimumVirtualList)); - infoStr.append("\n"); - -// System.out.println("chargePowerAvailableTotalList = " + chargePowerAvailableTotalList); -// System.out.println("dischargePowerAvailableTotalList = " + dischargePowerAvailableTotalList); - - List chargeNeededTotalList = dischargePowerAvailableTotalList.stream().map(x -> x > 0 ? x : 0).toList(); - List dischargeNeededTotalList = chargePowerAvailableTotalList.stream().map(x -> x < 0 ? x : 0).toList(); - -// System.out.println("chargeNeededTotalList = " + chargeNeededTotalList); -// System.out.println("dischargeNeededTotalList = " + dischargeNeededTotalList); - - List chargePowerAvailableBatteryList = chargePowerAvailableTotalList.stream().map(x -> x > 0 ? Math.min(x, chargePowerMaximumBattery) : 0).toList(); - List dischargePowerAvailableBatteryList = dischargePowerAvailableTotalList.stream().map(x -> x < 0 ? Math.max(x, dischargePowerMaximumBattery) : 0).toList(); - -// System.out.println("chargeAvailableBatteryList = " + chargePowerAvailableBatteryList); -// System.out.println("dischargeAvailableBatteryList = " + dischargePowerAvailableBatteryList); -// System.out.println(); - - // Convert power to energy level percentage - List chargePercentageNeededTotalList = new ArrayList<>(); - List dischargePercentageNeededTotalList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - double c = intervalHour * chargeNeededTotalList.get(i) * chargeEfficiencyBattery / energyCapacityBattery; - double d = 10000 * intervalHour * dischargeNeededTotalList.get(i) / (energyCapacityBattery * dischargeEfficiencyBattery); - chargePercentageNeededTotalList.add(round(c, batteryPercentageRoundingPrecision)); - dischargePercentageNeededTotalList.add(round(d, batteryPercentageRoundingPrecision)); - } - -// System.out.println("chargePercentageNeededTotalList = " + chargePercentageNeededTotalList); -// System.out.println("dischargePercentageNeededTotalList = " + dischargePercentageNeededTotalList); - - List chargePercentageAvailableBatteryList = new ArrayList<>(); - List dischargePercentageAvailableBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - double c = intervalHour * chargePowerAvailableBatteryList.get(i) * chargeEfficiencyBattery / energyCapacityBattery; - double d = 10000 * intervalHour * dischargePowerAvailableBatteryList.get(i) / (energyCapacityBattery * dischargeEfficiencyBattery); - chargePercentageAvailableBatteryList.add(round(c, batteryPercentageRoundingPrecision)); - dischargePercentageAvailableBatteryList.add(round(d, batteryPercentageRoundingPrecision)); - } - -// System.out.println("chargePercentageAvailableBatteryList = " + chargePercentageAvailableBatteryList); -// System.out.println("dischargePercentageAvailableBatteryList = " + dischargePercentageAvailableBatteryList); -// System.out.println(); - - // Calculate forecast when current energy level percentage is outside limits - int getToLimitIndex = 0; - double getToLimitPercentage = energyLevelPercentageBattery; - List getToLimitPercentageList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - getToLimitIndex = i; - - if (getToLimitPercentage > energyLevelPercentageMaximumBattery) { - double dischargePercentageNeeded = energyLevelPercentageMaximumBattery - getToLimitPercentage; - double dischargePercentageAvailable = Math.max(dischargePercentageAvailableBatteryList.get(i), dischargePercentageNeeded); - getToLimitPercentage = getToLimitPercentage + dischargePercentageAvailable; - dischargePercentageAvailableBatteryList.set(i, round(dischargePercentageAvailableBatteryList.get(i) - dischargePercentageAvailable, batteryPercentageRoundingPrecision)); - getToLimitPercentageList.add(round(getToLimitPercentage, batteryPercentageRoundingPrecision)); - } else if (getToLimitPercentage < energyLevelPercentageMinimumBattery) { - double chargePercentageNeeded = energyLevelPercentageMinimumBattery - getToLimitPercentage; - double chargePercentageAvailable = Math.min(chargePercentageAvailableBatteryList.get(i), chargePercentageNeeded); - getToLimitPercentage = getToLimitPercentage + chargePercentageAvailable; - chargePercentageAvailableBatteryList.set(i, round(chargePercentageAvailableBatteryList.get(i) - chargePercentageAvailable, batteryPercentageRoundingPrecision)); - getToLimitPercentageList.add(round(getToLimitPercentage, batteryPercentageRoundingPrecision)); - } else { - break; - } - } - -// System.out.println("getToLimitIndex = " + getToLimitIndex); -// System.out.println("getToLimitPercentage = " + getToLimitPercentage); -// System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); -// System.out.println("chargePercentageAvailableBatteryList2 = " + chargePercentageAvailableBatteryList); -// System.out.println("dischargePercentageAvailableBatteryList2 = " + dischargePercentageAvailableBatteryList); - - List energyLevelPredictionList = new ArrayList<>(); - - if (getToLimitPercentage > energyLevelPercentageMaximumBattery || getToLimitPercentage < energyLevelPercentageMinimumBattery) { - // Energy level percentage forecast when entire forecast is outside of battery percentage limits - energyLevelPredictionList = getToLimitPercentageList; - } else { - // Calculate energy level percentage forecast starting from value within battery percentage limits - List chargePercentageWantBatteryList = new ArrayList<>(); - List dischargePercentageWantBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - chargePercentageWantBatteryList.add(Math.min(chargePercentageNeededTotalList.get(i), chargePercentageAvailableBatteryList.get(i))); - dischargePercentageWantBatteryList.add(Math.max(dischargePercentageNeededTotalList.get(i), dischargePercentageAvailableBatteryList.get(i))); - } - -// System.out.println("chargePercentageWantBatteryList = " + chargePercentageWantBatteryList); -// System.out.println("dischargePercentageWantBatteryList = " + dischargePercentageWantBatteryList); - - List chargeAndDischargePercentageWantBatteryList = new ArrayList<>(); - - for (int i = 0; i < numberOfDataPoints; i++) { - chargeAndDischargePercentageWantBatteryList.add(round(chargePercentageWantBatteryList.get(i) + dischargePercentageWantBatteryList.get(i), batteryPercentageRoundingPrecision)); - } - -// System.out.println("chargeAndDischargePercentageWantBatteryList = " + chargeAndDischargePercentageWantBatteryList); -// System.out.println(); - - // Calculate forecast without battery percentage limits - int startRunningSumIndex = getToLimitIndex > 0 ? getToLimitIndex - 1 : 0; - List runningSumList = new ArrayList<>(); - double sum = getToLimitPercentage; - - for (int i = startRunningSumIndex; i < numberOfDataPoints; i++) { - sum = sum + chargeAndDischargePercentageWantBatteryList.get(i); - runningSumList.add(round(sum, batteryPercentageRoundingPrecision)); - } - -// System.out.println("getToLimitPercentageList = " + getToLimitPercentageList); -// System.out.println("runningSumList = " + runningSumList); -// System.out.println(); - - // Combine outside limits and running sum energy level percentages - if (getToLimitPercentageList.size() > 1) { - energyLevelPredictionList.addAll(getToLimitPercentageList.subList(0, getToLimitPercentageList.size() - 1)); - } - energyLevelPredictionList.addAll(runningSumList); - int energyLevelPredictionListSize = energyLevelPredictionList.size(); - - infoStr.append(String.format("energyLevelPredictionListOriginal = %s \n", energyLevelPredictionList)); - - // Calculate forecast starting within battery percentage limits - double energyLevelPredictionMaximum = Collections.max(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionListSize)); - double energyLevelPredictionMinimum = Collections.min(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionListSize)); - - long dtStart = services.getTimerService().getCurrentTimeMillis(); - long dt = 0; - long timeoutMillis = 10000; + // System.out.println("getToLimitPercentageList = " + + // getToLimitPercentageList); + // System.out.println("runningSumList = " + runningSumList); + // System.out.println(); - int intervalEndIndex = startRunningSumIndex; - int predictionListIndex = startRunningSumIndex; - - while (energyLevelPredictionMaximum > energyLevelPercentageMaximumBattery || energyLevelPredictionMinimum < energyLevelPercentageMinimumBattery) { - String chargeOrDischarge = ""; - int intervalStartIndex = startRunningSumIndex; - - for (int i = intervalEndIndex; i < energyLevelPredictionListSize; i++) { - predictionListIndex = i; - - if (energyLevelPredictionList.get(i) < energyLevelPercentageMinimumBattery) { - intervalEndIndex = i; - - for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { - if (energyLevelPredictionList.get(j) >= energyLevelPercentageMaximumBattery) { - intervalStartIndex = j; - break; - } - } - - chargeOrDischarge = "charge"; - -// System.out.println("CHARGE"); -// System.out.println("intervalStartIndex = " + intervalStartIndex); -// System.out.println("intervalEndIndex = " + intervalEndIndex); - - break; - } else if (energyLevelPredictionList.get(i) > energyLevelPercentageMaximumBattery) { - intervalEndIndex = i; - - for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { - if (energyLevelPredictionList.get(j) <= energyLevelPercentageMinimumBattery) { - intervalStartIndex = j; - break; - } - } - - chargeOrDischarge = "discharge"; - -// System.out.println("DISCHARGE"); -// System.out.println("intervalStartIndex = " + intervalStartIndex); -// System.out.println("intervalEndIndex = " + intervalEndIndex); - - break; - } - } - - int changeIndex = -1; - double energyLevelPredictionValueBefore = energyLevelPredictionList.get(intervalEndIndex); - - if (chargeOrDischarge.equals("charge")) { - double chargeAvailable = 0; - double chargeAvailableInterval = round(energyLevelPercentageMaximumBattery - Collections.max(energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)), batteryPercentageRoundingPrecision); - - if (chargeAvailableInterval > 0) { - for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { - if (i - 1 < 0) { - break; - } - - double chargeAvailableLeft = 0; - - if (dischargePercentageWantBatteryList.get(i) >= 0) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - chargeAvailableLeft = round(chargePercentageAvailableBatteryList.get(i) - chargeInUse, batteryPercentageRoundingPrecision); - } - - if (chargeAvailableLeft > 0) { - changeIndex = i; - chargeAvailable = Math.min(chargeAvailableInterval, chargeAvailableLeft); - break; - } - } - } - - double chargeNeeded = energyLevelPercentageMinimumBattery - energyLevelPredictionList.get(intervalEndIndex); - double changeValue = Math.min(chargeAvailable, chargeNeeded); - - if (changeIndex == -1) { - changeIndex = intervalEndIndex; - changeValue = chargeNeeded; - } - - for (int i = changeIndex; i < energyLevelPredictionListSize; i++) { - energyLevelPredictionList.set(i, round(energyLevelPredictionList.get(i) + changeValue, batteryPercentageRoundingPrecision)); - } - } else if (chargeOrDischarge.equals("discharge")) { - double dischargeAvailable = 0; - double dischargeAvailableInterval = round(energyLevelPercentageMinimumBattery - Collections.min(energyLevelPredictionList.subList(intervalStartIndex, intervalEndIndex)), batteryPercentageRoundingPrecision); - - if (dischargeAvailableInterval > 0) { - for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { - if (i - 1 < 0) { - break; - } - - double dischargeAvailableLeft = 0; - - if (chargePercentageWantBatteryList.get(i) <= 0) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - dischargeAvailableLeft = round(dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, batteryPercentageRoundingPrecision); - } - if (dischargeAvailableLeft < 0) { - changeIndex = i; - dischargeAvailable = Math.max(dischargeAvailableInterval, dischargeAvailableLeft); - break; - } - } - } - - double dischargeNeeded = energyLevelPercentageMaximumBattery - energyLevelPredictionList.get(intervalEndIndex); - double changeValue = Math.max(dischargeAvailable, dischargeNeeded); - - if (changeIndex == -1) { - changeIndex = intervalEndIndex; - changeValue = dischargeNeeded; - } - - for (int i = changeIndex; i < energyLevelPredictionListSize; i++) { - energyLevelPredictionList.set(i, round(energyLevelPredictionList.get(i) + changeValue, batteryPercentageRoundingPrecision)); - } - } - - if (energyLevelPredictionValueBefore == energyLevelPredictionList.get(intervalEndIndex)) { - infoStr.insert(0, String.format("Battery energy level percentage calculation error at timestamp = %s", timestampsMillisList.get(predictionListIndex))); - infoStr.append(String.format("energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); - LOG.warning(infoStr.toString()); - break; - } else if (dt > timeoutMillis) { - infoStr.insert(0, String.format("Battery energy level percentage calculation timed out during power limit optimisation at timestamp = %s", timestampsMillisList.get(predictionListIndex))); - infoStr.append(String.format("energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); - LOG.warning(infoStr.toString()); - break; - } - - energyLevelPredictionMaximum = Collections.max(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionListSize)); - energyLevelPredictionMinimum = Collections.min(energyLevelPredictionList.subList(startRunningSumIndex, energyLevelPredictionListSize)); - dt = services.getTimerService().getCurrentTimeMillis() - dtStart; - } - -// System.out.println("energyLevelPredictionListOptimisedLimits = " + energyLevelPredictionList + "\n"); - - // Get day ahead asset - EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); - boolean useDayAheadTariffs = false; - - if (dayAheadAsset != null) { - useDayAheadTariffs = dayAheadAsset.getUseTariffDayAheadForecasts().orElse(false); + // Combine outside limits and running sum energy level percentages + if (getToLimitPercentageList.size() > 1) { + energyLevelPredictionList.addAll( + getToLimitPercentageList.subList(0, getToLimitPercentageList.size() - 1)); + } + energyLevelPredictionList.addAll(runningSumList); + int energyLevelPredictionListSize = energyLevelPredictionList.size(); + + infoStr.append( + String.format("energyLevelPredictionListOriginal = %s \n", energyLevelPredictionList)); + + // Calculate forecast starting within battery percentage limits + double energyLevelPredictionMaximum = + Collections.max( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionListSize)); + double energyLevelPredictionMinimum = + Collections.min( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionListSize)); + + long dtStart = services.getTimerService().getCurrentTimeMillis(); + long dt = 0; + long timeoutMillis = 10000; + + int intervalEndIndex = startRunningSumIndex; + int predictionListIndex = startRunningSumIndex; + + while (energyLevelPredictionMaximum > energyLevelPercentageMaximumBattery + || energyLevelPredictionMinimum < energyLevelPercentageMinimumBattery) { + String chargeOrDischarge = ""; + int intervalStartIndex = startRunningSumIndex; + + for (int i = intervalEndIndex; i < energyLevelPredictionListSize; i++) { + predictionListIndex = i; + + if (energyLevelPredictionList.get(i) < energyLevelPercentageMinimumBattery) { + intervalEndIndex = i; + + for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { + if (energyLevelPredictionList.get(j) >= energyLevelPercentageMaximumBattery) { + intervalStartIndex = j; + break; } + } - // Get the tariff forecasts from energy optimisation asset for 1 week, timestamps are ordered from newest to oldest (descending order) - List> tariffExportDatapoints = getTariffDatapoints(energyOptimisationAsset, EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), services); - List> tariffImportDatapoints = getTariffDatapoints(energyOptimisationAsset, EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), services); + chargeOrDischarge = "charge"; - // Overwrite the current tariff forecasts with the day ahead tariff forecasts - if (useDayAheadTariffs) { - List> tariffExportDayAheadAssetDatapoints = getTariffDayAheadDatapoints(dayAheadAsset, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), services); - List> tariffImportDayAheadAssetDatapoints = getTariffDayAheadDatapoints(dayAheadAsset, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), services); + // System.out.println("CHARGE"); + // System.out.println("intervalStartIndex = " + + // intervalStartIndex); + // System.out.println("intervalEndIndex = " + + // intervalEndIndex); - // Combine tariff export forecasts - if (!tariffExportDayAheadAssetDatapoints.isEmpty()) { - Map> mergedMap = new HashMap<>(); + break; + } else if (energyLevelPredictionList.get(i) > energyLevelPercentageMaximumBattery) { + intervalEndIndex = i; - for (ValueDatapoint dp : tariffExportDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - for (ValueDatapoint dp : tariffExportDayAheadAssetDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - tariffExportDatapoints = new ArrayList<>(mergedMap.values()); - tariffExportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - } - - // Combine tariff import forecasts - if (!tariffImportDayAheadAssetDatapoints.isEmpty()) { - Map> mergedMap = new HashMap<>(); - - for (ValueDatapoint dp : tariffImportDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - for (ValueDatapoint dp : tariffImportDayAheadAssetDatapoints) { - mergedMap.put(dp.getTimestamp(), dp); - } - - tariffImportDatapoints = new ArrayList<>(mergedMap.values()); - tariffImportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - } + for (int j = intervalEndIndex; j >= startRunningSumIndex; j--) { + if (energyLevelPredictionList.get(j) <= energyLevelPercentageMinimumBattery) { + intervalStartIndex = j; + break; } + } - // Calculate optimal charge and discharge zone for each day based on tariffs - Map chargeAndDischargeZonesMap = calculateTariffChargeAndDischargeZones(tariffImportDatapoints, tariffExportDatapoints, BATTERY_TARIFF_OPTIMISATION_WINDOW_DEFAULT); - - // Charge zone = 1, discharge zone = -1 - List chargeAndDischargeZonesList = new ArrayList<>(Collections.nCopies(energyLevelPredictionListSize, 0)); + chargeOrDischarge = "discharge"; - for (Map.Entry entry : chargeAndDischargeZonesMap.entrySet()) { - long timestampMillis = entry.getKey(); - int value = entry.getValue(); + // System.out.println("DISCHARGE"); + // System.out.println("intervalStartIndex = " + + // intervalStartIndex); + // System.out.println("intervalEndIndex = " + + // intervalEndIndex); - int timestampIndex = timestampsMillisList.indexOf(timestampMillis); - - if (timestampIndex != -1) { - // Add 1 to align list indices - chargeAndDischargeZonesList.set(timestampIndex + 1, value); - } + break; + } + } + + int changeIndex = -1; + double energyLevelPredictionValueBefore = energyLevelPredictionList.get(intervalEndIndex); + + if (chargeOrDischarge.equals("charge")) { + double chargeAvailable = 0; + double chargeAvailableInterval = + round( + energyLevelPercentageMaximumBattery + - Collections.max( + energyLevelPredictionList.subList( + intervalStartIndex, intervalEndIndex)), + batteryPercentageRoundingPrecision); + + if (chargeAvailableInterval > 0) { + for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { + if (i - 1 < 0) { + break; } -// System.out.println("chargeAndDischargeZonesList = " + chargeAndDischargeZonesList); - - // Calculate battery energy level percentage default list - double energyLevelPercentageDefault = batteryCalculateEnergyLevelPercentageDefault(energyLevelPercentageMaximumBattery, energyLevelPercentageMinimumBattery, energyOptimisationAsset); - List energyLevelPercentageDefaultList = new ArrayList<>(Collections.nCopies(energyLevelPredictionListSize, energyLevelPercentageDefault)); + double chargeAvailableLeft = 0; - for (int i = 0; i < energyLevelPredictionListSize; i++) { - if (chargeAndDischargeZonesList.get(i) == 1) { - energyLevelPercentageDefaultList.set(i, Double.valueOf(energyLevelPercentageMaximumBattery)); - } else if (chargeAndDischargeZonesList.get(i) == -1) { - energyLevelPercentageDefaultList.set(i, Double.valueOf(energyLevelPercentageMinimumBattery)); - } + if (dischargePercentageWantBatteryList.get(i) >= 0) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + chargeAvailableLeft = + round( + chargePercentageAvailableBatteryList.get(i) - chargeInUse, + batteryPercentageRoundingPrecision); } -// System.out.println("energyLevelPercentageDefaultList = " + energyLevelPercentageDefaultList); - - // Optimise forecast based on tariffs - for (int i = 1; i < chargeAndDischargeZonesList.size() && i < energyLevelPredictionListSize; i++) { - if (chargeAndDischargeZonesList.get(i) == 1 && energyLevelPredictionList.get(i) < energyLevelPercentageDefaultList.get(i)) { - // Interval from charge zone index till end of forecast - Double energyLevelIntervalMaximum = Collections.max(energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); - double chargeSpaceOverall = round(energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum, batteryPercentageRoundingPrecision); - - if (chargeSpaceOverall > 0) { - double chargeNeeded = round(energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i), batteryPercentageRoundingPrecision); - double chargeAvailableLeft = 0; - - if (dischargePercentageWantBatteryList.get(i) >= 0) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - chargeAvailableLeft = round(chargePercentageAvailableBatteryList.get(i) - chargeInUse, batteryPercentageRoundingPrecision); - } - - if (chargeAvailableLeft > 0) { - chargeAvailableLeft = Math.min(Math.min(chargeSpaceOverall, chargeAvailableLeft), chargeNeeded); - chargeSpaceOverall = round(chargeSpaceOverall - chargeAvailableLeft, batteryPercentageRoundingPrecision); - - for (int j = i; j < energyLevelPredictionListSize; j++) { - energyLevelPredictionList.set(j, round(energyLevelPredictionList.get(j) + chargeAvailableLeft, batteryPercentageRoundingPrecision)); - } - } - } - - // Get the index of the first maximum - energyLevelIntervalMaximum = Collections.max(energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); - int energyLevelIntervalMaximumIndex = energyLevelPredictionList.indexOf(energyLevelIntervalMaximum); - - if (chargeSpaceOverall <= 0 && i < energyLevelIntervalMaximumIndex) { - double chargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - double chargeAvailableLeft = round(chargePercentageAvailableBatteryList.get(i) - chargeInUse, batteryPercentageRoundingPrecision); - - int energyLevelIntervalIndex = 0; - dt = 0; - dtStart = services.getTimerService().getCurrentTimeMillis(); - - while (chargeAvailableLeft > 0 && energyLevelIntervalIndex < energyLevelIntervalMaximumIndex) { - - for (int k = i + 1; k <= energyLevelIntervalMaximumIndex; k++) { - energyLevelIntervalIndex = k; - double chargeNeeded = round(energyLevelPredictionList.get(k) - energyLevelPredictionList.get(i), batteryPercentageRoundingPrecision); - - // Only allow moving charging moment into charge zone if no charge is wanted at index k - if (chargeNeeded > 0 && chargePercentageWantBatteryList.get(k) == 0) { - double energyLevelIntervalMaximum2 = Collections.max(energyLevelPredictionList.subList(i, k)); - double chargeSpaceInterval = round(energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum2, batteryPercentageRoundingPrecision); - - if (chargeSpaceInterval > 0) { - double chargeChange = Math.min(Math.min(chargeAvailableLeft, chargeNeeded), chargeSpaceInterval); - chargeAvailableLeft = round(chargeAvailableLeft - chargeChange, batteryPercentageRoundingPrecision); - - for (int j = i; j < k; j++) { - energyLevelPredictionList.set(j, round(energyLevelPredictionList.get(j) + chargeChange, batteryPercentageRoundingPrecision)); - } - break; - } - } - } - - if (dt > timeoutMillis) { - infoStr.insert(0, String.format("Battery energy level percentage calculation timed out during tariff charge optimisation at timestamp = %s", timestampsMillisList.get(i))); - infoStr.append(String.format("energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); - LOG.warning(infoStr.toString()); - break; - } - - dt = services.getTimerService().getCurrentTimeMillis() - dtStart; - } - } - } else if (chargeAndDischargeZonesList.get(i) == -1 && energyLevelPredictionList.get(i) > energyLevelPercentageDefaultList.get(i)) { - // Interval from discharge zone index till end of forecast - Double energyLevelIntervalMinimum = Collections.min(energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); - double dischargeSpaceOverall = round(energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum, batteryPercentageRoundingPrecision); - - if (dischargeSpaceOverall < 0) { - double dischargeNeeded = round(energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i), batteryPercentageRoundingPrecision); - double dischargeAvailableLeft = 0; - - if (chargePercentageWantBatteryList.get(i) <= 0) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - dischargeAvailableLeft = round(dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, batteryPercentageRoundingPrecision); - } - - if (dischargeAvailableLeft < 0) { - dischargeAvailableLeft = Math.max(Math.max(dischargeSpaceOverall, dischargeAvailableLeft), dischargeNeeded); - dischargeSpaceOverall = round(dischargeSpaceOverall - dischargeAvailableLeft, batteryPercentageRoundingPrecision); - - for (int j = i; j < energyLevelPredictionListSize; j++) { - energyLevelPredictionList.set(j, round(energyLevelPredictionList.get(j) + dischargeAvailableLeft, batteryPercentageRoundingPrecision)); - } - } - } - - // Get the index of the first minimum - energyLevelIntervalMinimum = Collections.min(energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); - int energyLevelIntervalMinimumIndex = energyLevelPredictionList.indexOf(energyLevelIntervalMinimum); - - if (dischargeSpaceOverall >= 0 && i < energyLevelIntervalMinimumIndex) { - double dischargeInUse = energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); - double dischargeAvailableLeft = round(dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, batteryPercentageRoundingPrecision); - - int energyLevelIntervalIndex = 0; - dt = 0; - dtStart = services.getTimerService().getCurrentTimeMillis(); - - while (dischargeAvailableLeft < 0 && energyLevelIntervalIndex < energyLevelIntervalMinimumIndex) { - - for (int k = i + 1; k <= energyLevelIntervalMinimumIndex; k++) { - energyLevelIntervalIndex = k; - double dischargeNeeded = round(energyLevelPredictionList.get(k) - energyLevelPredictionList.get(i), batteryPercentageRoundingPrecision); - - // Only allow moving discharging moment into discharge zone if no discharge is wanted at index k - if (dischargeNeeded < 0 && dischargePercentageWantBatteryList.get(k) == 0) { - double energyLevelIntervalMinimum2 = Collections.min(energyLevelPredictionList.subList(i, k)); - double dischargeSpaceInterval = round(energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum2, batteryPercentageRoundingPrecision); - - if (dischargeSpaceInterval < 0) { - double dischargeChange = Math.max(Math.max(dischargeAvailableLeft, dischargeNeeded), dischargeSpaceInterval); - dischargeAvailableLeft = round(dischargeAvailableLeft - dischargeChange, batteryPercentageRoundingPrecision); - - for (int j = i; j < k; j++) { - energyLevelPredictionList.set(j, round(energyLevelPredictionList.get(j) + dischargeChange, batteryPercentageRoundingPrecision)); - } - break; - } - } - } - - if (dt > timeoutMillis) { - infoStr.insert(0, String.format("Battery energy level percentage calculation timed out during tariff discharge optimisation at timestamp = %s", timestampsMillisList.get(i))); - infoStr.append(String.format("energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); - LOG.warning(infoStr.toString()); - break; - } - - dt = services.getTimerService().getCurrentTimeMillis() - dtStart; - } - } - } + if (chargeAvailableLeft > 0) { + changeIndex = i; + chargeAvailable = Math.min(chargeAvailableInterval, chargeAvailableLeft); + break; } + } } -// System.out.println("energyLevelPredictionListOptimisedLimitsAndTariffs = " + energyLevelPredictionList + "\n"); - - // Get the current energy level percentage target - int batteryEnergyLevelPercentageTarget = (int) Math.round(energyLevelPredictionList.get(1)); - batteryEnergyLevelPercentageTargets.put(batteryAssetId, batteryEnergyLevelPercentageTarget); - - // Calculate energy level percentage change per interval - List percentageChangeBatteryList = new ArrayList<>(); + double chargeNeeded = + energyLevelPercentageMinimumBattery + - energyLevelPredictionList.get(intervalEndIndex); + double changeValue = Math.min(chargeAvailable, chargeNeeded); - for (int i = 0; i < energyLevelPredictionList.size() - 1; i++) { - double percentageChange = energyLevelPredictionList.get(i + 1) - energyLevelPredictionList.get(i); - percentageChangeBatteryList.add(percentageChange); + if (changeIndex == -1) { + changeIndex = intervalEndIndex; + changeValue = chargeNeeded; } -// System.out.println("percentageChangeBatteryList = " + percentageChangeBatteryList); - - // Calculate total power change for the EMS - List powerChangeTotalList = new ArrayList<>(); - - for (double percentageChange : percentageChangeBatteryList) { - double power = 0; - - if (percentageChange > 0) { - power = percentageChange * energyCapacityBattery / (intervalHour * chargeEfficiencyBattery); - } else if (percentageChange < 0) { - power = percentageChange * energyCapacityBattery * dischargeEfficiencyBattery / (10000 * intervalHour); - } - - powerChangeTotalList.add(round(power, 3)); + for (int i = changeIndex; i < energyLevelPredictionListSize; i++) { + energyLevelPredictionList.set( + i, + round( + energyLevelPredictionList.get(i) + changeValue, + batteryPercentageRoundingPrecision)); } + } else if (chargeOrDischarge.equals("discharge")) { + double dischargeAvailable = 0; + double dischargeAvailableInterval = + round( + energyLevelPercentageMinimumBattery + - Collections.min( + energyLevelPredictionList.subList( + intervalStartIndex, intervalEndIndex)), + batteryPercentageRoundingPrecision); + + if (dischargeAvailableInterval > 0) { + for (int i = intervalEndIndex - 1; i >= intervalStartIndex; i--) { + if (i - 1 < 0) { + break; + } -// System.out.println("powerChangeTotalList = " + powerChangeTotalList); + double dischargeAvailableLeft = 0; - // Update list with power flexible changes - for (int i = 0; i < powerChangeTotalList.size() - 1; i++) { - totalPowerConsumptionProductionFlexibleList.set(i, totalPowerConsumptionProductionFlexibleList.get(i) - powerChangeTotalList.get(i)); + if (chargePercentageWantBatteryList.get(i) <= 0) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + dischargeAvailableLeft = + round( + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, + batteryPercentageRoundingPrecision); + } + if (dischargeAvailableLeft < 0) { + changeIndex = i; + dischargeAvailable = Math.max(dischargeAvailableInterval, dischargeAvailableLeft); + break; + } + } } -// System.out.println("totalPowerConsumptionProductionFlexibleList = " + totalPowerConsumptionProductionFlexibleList); + double dischargeNeeded = + energyLevelPercentageMaximumBattery + - energyLevelPredictionList.get(intervalEndIndex); + double changeValue = Math.max(dischargeAvailable, dischargeNeeded); - List> energyLevelPercentageForecast = new ArrayList<>(); - List> powerSetpointForecast = new ArrayList<>(); - - // Update energy level percentage forecast starting after current time - for (int i = 1; i < numberOfTimestamps; i++) { - energyLevelPercentageForecast.add(new ValueDatapoint<>(timestampsMillisList.get(i), (int) Math.round(energyLevelPredictionList.get(i)))); + if (changeIndex == -1) { + changeIndex = intervalEndIndex; + changeValue = dischargeNeeded; } - // Update power set-point starting from current power limit - for (int i = 0; i < numberOfTimestamps; i++) { - powerSetpointForecast.add(new ValueDatapoint<>(timestampsMillisList.get(i), powerChangeTotalList.get(i))); + for (int i = changeIndex; i < energyLevelPredictionListSize; i++) { + energyLevelPredictionList.set( + i, + round( + energyLevelPredictionList.get(i) + changeValue, + batteryPercentageRoundingPrecision)); } - - services.getAssetPredictedDatapointService().updateValues(batteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), energyLevelPercentageForecast); - services.getAssetPredictedDatapointService().updateValues(batteryAssetId, EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), powerSetpointForecast); + } + + if (energyLevelPredictionValueBefore == energyLevelPredictionList.get(intervalEndIndex)) { + infoStr.insert( + 0, + String.format( + "Battery energy level percentage calculation error at timestamp = %s", + timestampsMillisList.get(predictionListIndex))); + infoStr.append( + String.format( + "energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); + LOG.warning(infoStr.toString()); + break; + } else if (dt > timeoutMillis) { + infoStr.insert( + 0, + String.format( + "Battery energy level percentage calculation timed out during power limit optimisation at timestamp = %s", + timestampsMillisList.get(predictionListIndex))); + infoStr.append( + String.format( + "energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); + LOG.warning(infoStr.toString()); + break; + } + + energyLevelPredictionMaximum = + Collections.max( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionListSize)); + energyLevelPredictionMinimum = + Collections.min( + energyLevelPredictionList.subList( + startRunningSumIndex, energyLevelPredictionListSize)); + dt = services.getTimerService().getCurrentTimeMillis() - dtStart; } - return batteryEnergyLevelPercentageTargets; - } + // System.out.println("energyLevelPredictionListOptimisedLimits = " + + // energyLevelPredictionList + "\n"); - private Map batteryCalculatePowerFlexibleAvailable(List electricityBatteryAssets) { - Map powerFlexibleAvailable = new HashMap<>(); - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - boolean allowCharging = electricityBatteryAsset.getAllowCharging().orElse(false); - boolean allowDischarging = electricityBatteryAsset.getAllowDischarging().orElse(false); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + // Get day ahead asset + EmsDayAheadAsset dayAheadAsset = getDayAheadAsset(energyOptimisationAsset, services); + boolean useDayAheadTariffs = false; - double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(0.0); - double dischargePowerMaximum = electricityBatteryAsset.getDischargePowerMaximum().orElse(0.0); + if (dayAheadAsset != null) { + useDayAheadTariffs = dayAheadAsset.getUseTariffDayAheadForecasts().orElse(false); + } - if (!allowCharging || energyLevelPercentageMaximum == null || energyLevelPercentage == null) { - chargePowerMaximum = 0.0; - } else if (energyLevelPercentage >= energyLevelPercentageMaximum) { - chargePowerMaximum = 0.0; + // Get the tariff forecasts from energy optimisation asset for 1 week, timestamps are + // ordered from newest to oldest (descending order) + List> tariffExportDatapoints = + getTariffDatapoints( + energyOptimisationAsset, + EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), + services); + List> tariffImportDatapoints = + getTariffDatapoints( + energyOptimisationAsset, + EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), + services); + + // Overwrite the current tariff forecasts with the day ahead tariff forecasts + if (useDayAheadTariffs) { + List> tariffExportDayAheadAssetDatapoints = + getTariffDayAheadDatapoints( + dayAheadAsset, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), services); + List> tariffImportDayAheadAssetDatapoints = + getTariffDayAheadDatapoints( + dayAheadAsset, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), services); + + // Combine tariff export forecasts + if (!tariffExportDayAheadAssetDatapoints.isEmpty()) { + Map> mergedMap = new HashMap<>(); + + for (ValueDatapoint dp : tariffExportDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - if (!allowDischarging || energyLevelPercentageMinimum == null || energyLevelPercentage == null) { - dischargePowerMaximum = 0.0; - } else if (energyLevelPercentage <= energyLevelPercentageMinimum) { - dischargePowerMaximum = 0.0; + for (ValueDatapoint dp : tariffExportDayAheadAssetDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - powerFlexibleAvailable.put(electricityBatteryAsset.getId(), new ChargeDischarge(chargePowerMaximum, dischargePowerMaximum)); - } - - return powerFlexibleAvailable; - } + tariffExportDatapoints = new ArrayList<>(mergedMap.values()); + tariffExportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + } - private Map batteryCalculatePowerSetpoints(EmsEnergyOptimisationAsset energyOptimisationAsset, List electricityBatteryAssets, long powerSetpointTimestampMillisLatest, Map batteryEnergyLevelPercentageTargets, Services services, String logPrefixEnergyOptimisation) { - Map powerFlexibleAvailable = batteryCalculatePowerFlexibleAvailable(electricityBatteryAssets); - Map powerSetpointsNew; - - // Check if power net updated since last batteries power set-point update - Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); - long powerNetTimestampMillis = energyOptimisationAsset.getPowerNetTimestamp().orElse(0L); - - // Turn off batteries that do not have flexible power available during main power meter disconnect - if (powerSetpointTimestampMillisLatest > powerNetTimestampMillis || powerNet == null) { - powerSetpointsNew = batteryCheckPowerSetpointsCurrent(electricityBatteryAssets, powerFlexibleAvailable); - return powerSetpointsNew; - } + // Combine tariff import forecasts + if (!tariffImportDayAheadAssetDatapoints.isEmpty()) { + Map> mergedMap = new HashMap<>(); - // Check if power limits are present - Double powerLimitMaximumProfileTotal = energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); - Double powerLimitMinimumProfileTotal = energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); - - // Calculate debounce power limits - Double powerLimitMaximumVirtual = calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMaximumProfileTotal, "max"); - Double powerLimitMinimumVirtual = calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMinimumProfileTotal, "min"); - - // Send warning LOG message when too large fluctuation margins are set - if (powerLimitMaximumProfileTotal != null && powerLimitMinimumProfileTotal != null && powerLimitMaximumVirtual != null && powerLimitMinimumVirtual != null && powerLimitMaximumVirtual < powerLimitMinimumVirtual) { - double diffPowerLimit = powerLimitMaximumProfileTotal - powerLimitMinimumProfileTotal; - double fluctuationMarginSum = Math.abs(powerLimitMaximumProfileTotal - powerLimitMaximumVirtual) + Math.abs(powerLimitMinimumProfileTotal - powerLimitMinimumVirtual); - - Long powerLimitMaximumProfileTimestampMillis = energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); - String powerLimitMaximumProfileDateTime = ""; - - if (powerLimitMaximumProfileTimestampMillis != null) { - powerLimitMaximumProfileDateTime = formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); + for (ValueDatapoint dp : tariffImportDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); } - LOG.warning(String.format("%s; Failed to perform '%s' energy optimisation method. The difference between '%s' - %s = %s kW is smaller than the fluctuation margin sum = %s kW for timestamp='%s'", - logPrefixEnergyOptimisation, optimisationMethodName, EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), - EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), diffPowerLimit, fluctuationMarginSum, powerLimitMaximumProfileDateTime)); - } - - // Calculate virtual power consumption - Map powerSetpointsCurrent = new HashMap<>(); + for (ValueDatapoint dp : tariffImportDayAheadAssetDatapoints) { + mergedMap.put(dp.getTimestamp(), dp); + } - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - double powerSetpoint = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); - powerSetpointsCurrent.put(electricityBatteryAsset.getId(), powerSetpoint); + tariffImportDatapoints = new ArrayList<>(mergedMap.values()); + tariffImportDatapoints.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + } } - double powerSetpointsCurrentSum = powerSetpointsCurrent.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; + // Calculate optimal charge and discharge zone for each day based on tariffs + Map chargeAndDischargeZonesMap = + calculateTariffChargeAndDischargeZones( + tariffImportDatapoints, + tariffExportDatapoints, + BATTERY_TARIFF_OPTIMISATION_WINDOW_DEFAULT); - // Calculate new power set-points without limits - Map powerSetpointsNewWithoutLimits = batteryCalculatePowerSetpointsWithoutLimits(electricityBatteryAssets, batteryEnergyLevelPercentageTargets, energyOptimisationAsset, powerFlexibleAvailable, services); + // Charge zone = 1, discharge zone = -1 + List chargeAndDischargeZonesList = + new ArrayList<>(Collections.nCopies(energyLevelPredictionListSize, 0)); - // Apply power limits and adjust new power set-points - double powerSetpointsNewWithoutLimitsSum = powerSetpointsNewWithoutLimits.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerNetVirtualNew = powerConsumptionVirtual + powerSetpointsNewWithoutLimitsSum; + for (Map.Entry entry : chargeAndDischargeZonesMap.entrySet()) { + long timestampMillis = entry.getKey(); + int value = entry.getValue(); - double powerLimitMaximumFluctuation = calculatePowerFluctuationMargin(energyOptimisationAsset, powerLimitMaximumProfileTotal, "max"); - double powerLimitMinimumFluctuation = calculatePowerFluctuationMargin(energyOptimisationAsset, powerLimitMinimumProfileTotal, "min"); + int timestampIndex = timestampsMillisList.indexOf(timestampMillis); - if (powerLimitMaximumVirtual != null && (powerNetVirtualNew + powerLimitMaximumFluctuation) > powerLimitMaximumVirtual) { - powerSetpointsNew = batteryCalculatePowerSetpointsOnLimitBreach(powerNetVirtualNew, powerLimitMaximumVirtual, electricityBatteryAssets, powerFlexibleAvailable, powerSetpointsNewWithoutLimits); - } else if (powerLimitMinimumVirtual != null && (powerNetVirtualNew - powerLimitMinimumFluctuation) < powerLimitMinimumVirtual) { - powerSetpointsNew = batteryCalculatePowerSetpointsOnLimitBreach(powerNetVirtualNew, powerLimitMinimumVirtual, electricityBatteryAssets, powerFlexibleAvailable, powerSetpointsNewWithoutLimits); - } else { - powerSetpointsNew = powerSetpointsNewWithoutLimits; + if (timestampIndex != -1) { + // Add 1 to align list indices + chargeAndDischargeZonesList.set(timestampIndex + 1, value); + } } - // Send warning LOG message on power limit breach - double powerSetpointsNewSum = powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); - double powerNetNewVirtual = powerConsumptionVirtual + powerSetpointsNewSum; - - if (powerLimitMaximumProfileTotal != null && powerNetNewVirtual > powerLimitMaximumProfileTotal) { - double powerReductionShortage = round((powerNetNewVirtual - powerLimitMaximumProfileTotal), 3); - LOG.warning(String.format("%s; Not enough flexible power to get below power limit maximum; Shortage of %s kW", logPrefixEnergyOptimisation, powerReductionShortage)); - } else if (powerLimitMinimumProfileTotal != null && powerNetNewVirtual < powerLimitMinimumProfileTotal) { - double powerReductionShortage = round((powerNetNewVirtual - powerLimitMinimumProfileTotal), 3); - LOG.warning(String.format("%s; Not enough flexible power to get above power limit minimum; Shortage of %s kW", logPrefixEnergyOptimisation, powerReductionShortage)); + // System.out.println("chargeAndDischargeZonesList = " + + // chargeAndDischargeZonesList); + + // Calculate battery energy level percentage default list + double energyLevelPercentageDefault = + batteryCalculateEnergyLevelPercentageDefault( + energyLevelPercentageMaximumBattery, + energyLevelPercentageMinimumBattery, + energyOptimisationAsset); + List energyLevelPercentageDefaultList = + new ArrayList<>( + Collections.nCopies(energyLevelPredictionListSize, energyLevelPercentageDefault)); + + for (int i = 0; i < energyLevelPredictionListSize; i++) { + if (chargeAndDischargeZonesList.get(i) == 1) { + energyLevelPercentageDefaultList.set( + i, Double.valueOf(energyLevelPercentageMaximumBattery)); + } else if (chargeAndDischargeZonesList.get(i) == -1) { + energyLevelPercentageDefaultList.set( + i, Double.valueOf(energyLevelPercentageMinimumBattery)); + } } - return powerSetpointsNew; - } - - private Map batteryCalculatePowerSetpointsOnLimitBreach(double power, double powerLimitVirtual, List electricityBatteryAssets, Map powerFlexibleAvailable, Map powerSetpointsNewWithoutLimits) { - Map powerSetpointsNew = new HashMap<>(); - double powerChangeNeeded = round(power - powerLimitVirtual, 3); - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - - double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; - double dischargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; - double powerSetpointNewWithoutLimits = powerSetpointsNewWithoutLimits.getOrDefault(electricityBatteryAssetId, 0.0); - double chargePowerAvailableTotal = chargePowerAvailable - powerSetpointNewWithoutLimits; - double dischargePowerAvailableTotal = dischargePowerAvailable - powerSetpointNewWithoutLimits; - - double powerSetpointChange = 0.0; - - if (powerChangeNeeded > 0) { - powerSetpointChange = Math.max(-powerChangeNeeded, dischargePowerAvailableTotal); - } else if (powerChangeNeeded < 0) { - powerSetpointChange = Math.min(-powerChangeNeeded, chargePowerAvailableTotal); + // System.out.println("energyLevelPercentageDefaultList = " + + // energyLevelPercentageDefaultList); + + // Optimise forecast based on tariffs + for (int i = 1; + i < chargeAndDischargeZonesList.size() && i < energyLevelPredictionListSize; + i++) { + if (chargeAndDischargeZonesList.get(i) == 1 + && energyLevelPredictionList.get(i) < energyLevelPercentageDefaultList.get(i)) { + // Interval from charge zone index till end of forecast + Double energyLevelIntervalMaximum = + Collections.max( + energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); + double chargeSpaceOverall = + round( + energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum, + batteryPercentageRoundingPrecision); + + if (chargeSpaceOverall > 0) { + double chargeNeeded = + round( + energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i), + batteryPercentageRoundingPrecision); + double chargeAvailableLeft = 0; + + if (dischargePercentageWantBatteryList.get(i) >= 0) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + chargeAvailableLeft = + round( + chargePercentageAvailableBatteryList.get(i) - chargeInUse, + batteryPercentageRoundingPrecision); + } + + if (chargeAvailableLeft > 0) { + chargeAvailableLeft = + Math.min(Math.min(chargeSpaceOverall, chargeAvailableLeft), chargeNeeded); + chargeSpaceOverall = + round( + chargeSpaceOverall - chargeAvailableLeft, + batteryPercentageRoundingPrecision); + + for (int j = i; j < energyLevelPredictionListSize; j++) { + energyLevelPredictionList.set( + j, + round( + energyLevelPredictionList.get(j) + chargeAvailableLeft, + batteryPercentageRoundingPrecision)); + } + } } - powerChangeNeeded = round(powerChangeNeeded + powerSetpointChange, 3); - - double powerSetpointNew = round(powerSetpointNewWithoutLimits + powerSetpointChange, 3); - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } - - return powerSetpointsNew; - } - - private Map batteryCalculatePowerSetpointsWithoutLimits(List electricityBatteryAssets, Map batteryEnergyLevelPercentageTargets, EmsEnergyOptimisationAsset energyOptimisationAsset, Map powerFlexibleAvailable, Services services) { - // Find battery power set-points for a system without power limits - Map powerSetpointsNew = new HashMap<>(); - - long intervalMillis = 15 * 60000; - long endTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long startTimeMillis = endTimeMillis - endTimeMillis % intervalMillis; - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + // Get the index of the first maximum + energyLevelIntervalMaximum = + Collections.max( + energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); + int energyLevelIntervalMaximumIndex = + energyLevelPredictionList.indexOf(energyLevelIntervalMaximum); + + if (chargeSpaceOverall <= 0 && i < energyLevelIntervalMaximumIndex) { + double chargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + double chargeAvailableLeft = + round( + chargePercentageAvailableBatteryList.get(i) - chargeInUse, + batteryPercentageRoundingPrecision); + + int energyLevelIntervalIndex = 0; + dt = 0; + dtStart = services.getTimerService().getCurrentTimeMillis(); + + while (chargeAvailableLeft > 0 + && energyLevelIntervalIndex < energyLevelIntervalMaximumIndex) { + + for (int k = i + 1; k <= energyLevelIntervalMaximumIndex; k++) { + energyLevelIntervalIndex = k; + double chargeNeeded = + round( + energyLevelPredictionList.get(k) - energyLevelPredictionList.get(i), + batteryPercentageRoundingPrecision); + + // Only allow moving charging moment into charge zone if no charge is wanted at + // index k + if (chargeNeeded > 0 && chargePercentageWantBatteryList.get(k) == 0) { + double energyLevelIntervalMaximum2 = + Collections.max(energyLevelPredictionList.subList(i, k)); + double chargeSpaceInterval = + round( + energyLevelPercentageMaximumBattery - energyLevelIntervalMaximum2, + batteryPercentageRoundingPrecision); + + if (chargeSpaceInterval > 0) { + double chargeChange = + Math.min( + Math.min(chargeAvailableLeft, chargeNeeded), chargeSpaceInterval); + chargeAvailableLeft = + round( + chargeAvailableLeft - chargeChange, + batteryPercentageRoundingPrecision); + + for (int j = i; j < k; j++) { + energyLevelPredictionList.set( + j, + round( + energyLevelPredictionList.get(j) + chargeChange, + batteryPercentageRoundingPrecision)); + } + break; + } + } + } - // Set initial power set-point of 0 - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + if (dt > timeoutMillis) { + infoStr.insert( + 0, + String.format( + "Battery energy level percentage calculation timed out during tariff charge optimisation at timestamp = %s", + timestampsMillisList.get(i))); + infoStr.append( + String.format( + "energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); + LOG.warning(infoStr.toString()); + break; + } - if (energyLevelPercentage == null) { - continue; + dt = services.getTimerService().getCurrentTimeMillis() - dtStart; + } } - - double energyCapacity = electricityBatteryAsset.getEnergyCapacity().orElse(0.0); - double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); - - // Get battery energy level percentage target - Integer energyLevelPercentageTarget = batteryEnergyLevelPercentageTargets.get(electricityBatteryAssetId); - - if (energyLevelPercentageTarget == null) { - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - energyLevelPercentageTarget = batteryCalculateEnergyLevelPercentageDefault(energyLevelPercentageMaximum, energyLevelPercentageMinimum, energyOptimisationAsset); + } else if (chargeAndDischargeZonesList.get(i) == -1 + && energyLevelPredictionList.get(i) > energyLevelPercentageDefaultList.get(i)) { + // Interval from discharge zone index till end of forecast + Double energyLevelIntervalMinimum = + Collections.min( + energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); + double dischargeSpaceOverall = + round( + energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum, + batteryPercentageRoundingPrecision); + + if (dischargeSpaceOverall < 0) { + double dischargeNeeded = + round( + energyLevelPercentageDefaultList.get(i) - energyLevelPredictionList.get(i), + batteryPercentageRoundingPrecision); + double dischargeAvailableLeft = 0; + + if (chargePercentageWantBatteryList.get(i) <= 0) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + dischargeAvailableLeft = + round( + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, + batteryPercentageRoundingPrecision); + } + + if (dischargeAvailableLeft < 0) { + dischargeAvailableLeft = + Math.max( + Math.max(dischargeSpaceOverall, dischargeAvailableLeft), dischargeNeeded); + dischargeSpaceOverall = + round( + dischargeSpaceOverall - dischargeAvailableLeft, + batteryPercentageRoundingPrecision); + + for (int j = i; j < energyLevelPredictionListSize; j++) { + energyLevelPredictionList.set( + j, + round( + energyLevelPredictionList.get(j) + dischargeAvailableLeft, + batteryPercentageRoundingPrecision)); + } + } } - // Get battery power set-point target - AssetDatapointAllQuery assetDatapointQueryPredicted = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - List> powerSetpointForecastList = services.getAssetPredictedDatapointService().queryDatapoints(electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), assetDatapointQueryPredicted); - - // Calculate battery power set-point target - double energyLevelPercentageRounded = round(energyLevelPercentage, 1); - double powerNeeded = round((energyLevelPercentageTarget - energyLevelPercentageRounded) * 0.01 * energyCapacity, 3); - double powerSetpointNeeded = round(powerNeeded * 60 * BATTERY_POWER_SETPOINT_RESPONSIVENESS_DEFAULT, 3); - - if (energyLevelPercentageRounded < energyLevelPercentageTarget || (powerSetpointCurrent > 0.0 && energyLevelPercentageRounded < energyLevelPercentageTarget)) { - // Start charging or continue charging - int chargeEfficiencyPercentage = electricityBatteryAsset.getChargeEfficiency().orElse(100); - - double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; - double powerSetpointEfficiency = round(powerSetpointNeeded / (chargeEfficiencyPercentage * 0.01), 3); - double powerSetpointNew = Math.min(powerSetpointEfficiency, chargePowerAvailable); - - if (!powerSetpointForecastList.isEmpty()) { - Double powerSetpointForecast = (Double) powerSetpointForecastList.getLast().getValue(); - - if (powerSetpointForecast != null && powerSetpointForecast > 0) { - powerSetpointNew = Math.min(powerSetpointNew, powerSetpointForecast); + // Get the index of the first minimum + energyLevelIntervalMinimum = + Collections.min( + energyLevelPredictionList.subList(i, energyLevelPredictionListSize)); + int energyLevelIntervalMinimumIndex = + energyLevelPredictionList.indexOf(energyLevelIntervalMinimum); + + if (dischargeSpaceOverall >= 0 && i < energyLevelIntervalMinimumIndex) { + double dischargeInUse = + energyLevelPredictionList.get(i) - energyLevelPredictionList.get(i - 1); + double dischargeAvailableLeft = + round( + dischargePercentageAvailableBatteryList.get(i) - dischargeInUse, + batteryPercentageRoundingPrecision); + + int energyLevelIntervalIndex = 0; + dt = 0; + dtStart = services.getTimerService().getCurrentTimeMillis(); + + while (dischargeAvailableLeft < 0 + && energyLevelIntervalIndex < energyLevelIntervalMinimumIndex) { + + for (int k = i + 1; k <= energyLevelIntervalMinimumIndex; k++) { + energyLevelIntervalIndex = k; + double dischargeNeeded = + round( + energyLevelPredictionList.get(k) - energyLevelPredictionList.get(i), + batteryPercentageRoundingPrecision); + + // Only allow moving discharging moment into discharge zone if no discharge is + // wanted at index k + if (dischargeNeeded < 0 && dischargePercentageWantBatteryList.get(k) == 0) { + double energyLevelIntervalMinimum2 = + Collections.min(energyLevelPredictionList.subList(i, k)); + double dischargeSpaceInterval = + round( + energyLevelPercentageMinimumBattery - energyLevelIntervalMinimum2, + batteryPercentageRoundingPrecision); + + if (dischargeSpaceInterval < 0) { + double dischargeChange = + Math.max( + Math.max(dischargeAvailableLeft, dischargeNeeded), + dischargeSpaceInterval); + dischargeAvailableLeft = + round( + dischargeAvailableLeft - dischargeChange, + batteryPercentageRoundingPrecision); + + for (int j = i; j < k; j++) { + energyLevelPredictionList.set( + j, + round( + energyLevelPredictionList.get(j) + dischargeChange, + batteryPercentageRoundingPrecision)); + } + break; } + } } - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } else if (energyLevelPercentageRounded > energyLevelPercentageTarget || (powerSetpointCurrent < 0.0 && energyLevelPercentageRounded > energyLevelPercentageTarget)) { - // Start discharging or continue discharging - int dischargeEfficiencyPercentage = electricityBatteryAsset.getDischargeEfficiency().orElse(100); - - double dischargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; - double powerSetpointEfficiency = round(powerSetpointNeeded / (dischargeEfficiencyPercentage * 0.01), 3); - double powerSetpointNew = Math.max(powerSetpointEfficiency, dischargePowerAvailable); - - if (!powerSetpointForecastList.isEmpty()) { - Double powerSetpointForecast = (Double) powerSetpointForecastList.getLast().getValue(); - - if (powerSetpointForecast != null && powerSetpointForecast < 0) { - powerSetpointNew = Math.max(powerSetpointNew, powerSetpointForecast); - } + if (dt > timeoutMillis) { + infoStr.insert( + 0, + String.format( + "Battery energy level percentage calculation timed out during tariff discharge optimisation at timestamp = %s", + timestampsMillisList.get(i))); + infoStr.append( + String.format( + "energyLevelPredictionListOptimised = %s \n", energyLevelPredictionList)); + LOG.warning(infoStr.toString()); + break; } - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + dt = services.getTimerService().getCurrentTimeMillis() - dtStart; + } } + } + } + } + + // System.out.println("energyLevelPredictionListOptimisedLimitsAndTariffs = " + + // energyLevelPredictionList + "\n"); + + // Get the current energy level percentage target + int batteryEnergyLevelPercentageTarget = (int) Math.round(energyLevelPredictionList.get(1)); + batteryEnergyLevelPercentageTargets.put(batteryAssetId, batteryEnergyLevelPercentageTarget); + + // Calculate energy level percentage change per interval + List percentageChangeBatteryList = new ArrayList<>(); + + for (int i = 0; i < energyLevelPredictionList.size() - 1; i++) { + double percentageChange = + energyLevelPredictionList.get(i + 1) - energyLevelPredictionList.get(i); + percentageChangeBatteryList.add(percentageChange); + } + + // System.out.println("percentageChangeBatteryList = " + + // percentageChangeBatteryList); + + // Calculate total power change for the EMS + List powerChangeTotalList = new ArrayList<>(); + + for (double percentageChange : percentageChangeBatteryList) { + double power = 0; + + if (percentageChange > 0) { + power = + percentageChange * energyCapacityBattery / (intervalHour * chargeEfficiencyBattery); + } else if (percentageChange < 0) { + power = + percentageChange + * energyCapacityBattery + * dischargeEfficiencyBattery + / (10000 * intervalHour); } - return powerSetpointsNew; + powerChangeTotalList.add(round(power, 3)); + } + + // System.out.println("powerChangeTotalList = " + powerChangeTotalList); + + // Update list with power flexible changes + for (int i = 0; i < powerChangeTotalList.size() - 1; i++) { + totalPowerConsumptionProductionFlexibleList.set( + i, totalPowerConsumptionProductionFlexibleList.get(i) - powerChangeTotalList.get(i)); + } + + // System.out.println("totalPowerConsumptionProductionFlexibleList = " + + // totalPowerConsumptionProductionFlexibleList); + + List> energyLevelPercentageForecast = new ArrayList<>(); + List> powerSetpointForecast = new ArrayList<>(); + + // Update energy level percentage forecast starting after current time + for (int i = 1; i < numberOfTimestamps; i++) { + energyLevelPercentageForecast.add( + new ValueDatapoint<>( + timestampsMillisList.get(i), (int) Math.round(energyLevelPredictionList.get(i)))); + } + + // Update power set-point starting from current power limit + for (int i = 0; i < numberOfTimestamps; i++) { + powerSetpointForecast.add( + new ValueDatapoint<>(timestampsMillisList.get(i), powerChangeTotalList.get(i))); + } + + services + .getAssetPredictedDatapointService() + .updateValues( + batteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), + energyLevelPercentageForecast); + services + .getAssetPredictedDatapointService() + .updateValues( + batteryAssetId, + EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), + powerSetpointForecast); } - private void batteryCheckConnection(List electricityBatteryAssets, Services services) { - // This method checks if a battery is connected based on if the 'power' and 'energyLevelPercentage' attributes update within the active time interval - String connected = EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected.toString(); - String disconnected = EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected.toString(); - - long currentTimestampMillis = services.getTimerService().getCurrentTimeMillis(); - long activePeriodMillis = ACTIVE_PERIOD_MINUTES * 60000L; - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - - Optional connectionStatusValue = electricityBatteryAsset.getConnectionStatus(); - String connectionStatusPrevious = ""; - - if (connectionStatusValue.isPresent()) { - connectionStatusPrevious = connectionStatusValue.get().toString(); - } - - Double powerBattery = electricityBatteryAsset.getPower().orElse(null); - long powerTimestampMillisBattery = electricityBatteryAsset.getPowerTimestamp().orElse(0L); - - Double energyLevelPercentageBattery = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - long energyLevelPercentageTimestampMillisBattery = electricityBatteryAsset.getEnergyLevelPercentageTimestamp().orElse(0L); - - String connectionStatusCurrent = disconnected; - - if ((currentTimestampMillis - powerTimestampMillisBattery) < activePeriodMillis && powerBattery != null && (currentTimestampMillis - energyLevelPercentageTimestampMillisBattery) < activePeriodMillis && energyLevelPercentageBattery != null) { - connectionStatusCurrent = connected; - } - - if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.equals(disconnected)) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(disconnected) && connectionStatusPrevious.equals(connected)) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected), getClass().getSimpleName()); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE, null), getClass().getSimpleName()); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER, null), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.isEmpty()) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected), getClass().getSimpleName()); - } else if (connectionStatusCurrent.equals(disconnected) && connectionStatusPrevious.isEmpty()) { - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.CONNECTION_STATUS, EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected), getClass().getSimpleName()); - } - } + return batteryEnergyLevelPercentageTargets; + } + + private Map batteryCalculatePowerFlexibleAvailable( + List electricityBatteryAssets) { + Map powerFlexibleAvailable = new HashMap<>(); + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + boolean allowCharging = electricityBatteryAsset.getAllowCharging().orElse(false); + boolean allowDischarging = electricityBatteryAsset.getAllowDischarging().orElse(false); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + + double chargePowerMaximum = electricityBatteryAsset.getChargePowerMaximum().orElse(0.0); + double dischargePowerMaximum = electricityBatteryAsset.getDischargePowerMaximum().orElse(0.0); + + if (!allowCharging || energyLevelPercentageMaximum == null || energyLevelPercentage == null) { + chargePowerMaximum = 0.0; + } else if (energyLevelPercentage >= energyLevelPercentageMaximum) { + chargePowerMaximum = 0.0; + } + + if (!allowDischarging + || energyLevelPercentageMinimum == null + || energyLevelPercentage == null) { + dischargePowerMaximum = 0.0; + } else if (energyLevelPercentage <= energyLevelPercentageMinimum) { + dischargePowerMaximum = 0.0; + } + + powerFlexibleAvailable.put( + electricityBatteryAsset.getId(), + new ChargeDischarge(chargePowerMaximum, dischargePowerMaximum)); } - private Map batteryCheckPowerSetpointsCurrent(List electricityBatteryAssets, Map powerFlexibleAvailable) { - Map powerSetpointsNew = new HashMap<>(); - - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double energyLevelPercentage = electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); - - if (energyLevelPercentage == null) { - powerSetpointsNew.put(electricityBatteryAssetId, 0.0); - continue; - } - - double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); - double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; - double dischargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; - - // Set initial power set-point new - double powerSetpointNew = 0.0; - - // Check if power set-point current is within available power limits - if (powerSetpointCurrent > 0.0) { - powerSetpointNew = Math.min(powerSetpointCurrent, chargePowerAvailable); - } else if (powerSetpointCurrent < 0.0) { - powerSetpointNew = Math.max(powerSetpointCurrent, dischargePowerAvailable); - } - - powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); - } - - return powerSetpointsNew; + return powerFlexibleAvailable; + } + + private Map batteryCalculatePowerSetpoints( + EmsEnergyOptimisationAsset energyOptimisationAsset, + List electricityBatteryAssets, + long powerSetpointTimestampMillisLatest, + Map batteryEnergyLevelPercentageTargets, + Services services, + String logPrefixEnergyOptimisation) { + Map powerFlexibleAvailable = + batteryCalculatePowerFlexibleAvailable(electricityBatteryAssets); + Map powerSetpointsNew; + + // Check if power net updated since last batteries power set-point update + Double powerNet = energyOptimisationAsset.getPowerNet().orElse(null); + long powerNetTimestampMillis = energyOptimisationAsset.getPowerNetTimestamp().orElse(0L); + + // Turn off batteries that do not have flexible power available during main power meter + // disconnect + if (powerSetpointTimestampMillisLatest > powerNetTimestampMillis || powerNet == null) { + powerSetpointsNew = + batteryCheckPowerSetpointsCurrent(electricityBatteryAssets, powerFlexibleAvailable); + return powerSetpointsNew; } - private void batteryCheckSetup(List electricityBatteryAssets) { - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - // Check if the battery is enabled - boolean allowCharging = electricityBatteryAsset.getAllowDischarging().orElse(false); - boolean allowDischarging = electricityBatteryAsset.getAllowCharging().orElse(false); - - if (!allowCharging && !allowDischarging) { - continue; - } - - String logPrefixBattery = String.format("assetType='%s', assetId='%s', assetName='%s'", electricityBatteryAsset.getAssetType(), electricityBatteryAsset.getId(), electricityBatteryAsset.getAssetName()); - - // Check if the following attributes are connected - Map requiredFieldsConnection = new HashMap<>(); - - requiredFieldsConnection.put(EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), electricityBatteryAsset.getEnergyLevelPercentage().orElse(null)); - requiredFieldsConnection.put(EmsElectricityBatteryAsset.POWER.getName(), electricityBatteryAsset.getPower().orElse(null)); - - List missingFieldsConnection = requiredFieldsConnection.entrySet().stream() - .filter(entry -> entry.getValue() == null) - .map(Map.Entry::getKey) - .toList(); - - if (!missingFieldsConnection.isEmpty()) { - LOG.warning(String.format("%s; Can't use battery for flexible power. The following attributes are not connected: %s", - logPrefixBattery, - String.join(", ", missingFieldsConnection.stream().map(attr -> "'" + attr + "'").toList()) - )); - } - - // Check if the following attributes are set - Map requiredFieldsSetup = new HashMap<>(); - - Integer energyLevelPercentageMaximum = electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); - Integer energyLevelPercentageMinimum = electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); - Integer chargeEfficiency = electricityBatteryAsset.getChargeEfficiency().orElse(null); - Integer dischargeEfficiency = electricityBatteryAsset.getDischargeEfficiency().orElse(null); - - requiredFieldsSetup.put(EmsElectricityBatteryAsset.CHARGE_EFFICIENCY.getName(), chargeEfficiency); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.CHARGE_POWER_MAXIMUM.getName(), electricityBatteryAsset.getChargePowerMaximum().orElse(null)); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.DISCHARGE_EFFICIENCY.getName(), dischargeEfficiency); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.DISCHARGE_POWER_MAXIMUM.getName(), electricityBatteryAsset.getDischargePowerMaximum().orElse(null)); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.ENERGY_CAPACITY.getName(), electricityBatteryAsset.getEnergyCapacity().orElse(null)); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), energyLevelPercentageMaximum); - requiredFieldsSetup.put(EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), energyLevelPercentageMinimum); - - List missingFieldsSetup = requiredFieldsSetup.entrySet().stream() - .filter(entry -> entry.getValue() == null) - .map(Map.Entry::getKey) - .toList(); - - if (!missingFieldsSetup.isEmpty()) { - LOG.warning(String.format("%s; Can't use battery for flexible power. The following attributes are not set: %s", - logPrefixBattery, - String.join(", ", missingFieldsSetup.stream().map(attr -> "'" + attr + "'").toList()) - )); - } - - // Check if the following attributes are set correctly - if (energyLevelPercentageMaximum != null && energyLevelPercentageMinimum != null && energyLevelPercentageMaximum <= energyLevelPercentageMinimum) { - LOG.warning(String.format("%s; Can't use battery for flexible power. '%s' = %s%% is smaller than or equal to '%s'= %s%%)", logPrefixBattery, - EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), energyLevelPercentageMaximum, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), energyLevelPercentageMinimum)); - } + // Check if power limits are present + Double powerLimitMaximumProfileTotal = + energyOptimisationAsset.getPowerLimitMaximumProfileTotal().orElse(null); + Double powerLimitMinimumProfileTotal = + energyOptimisationAsset.getPowerLimitMinimumProfileTotal().orElse(null); + + // Calculate debounce power limits + Double powerLimitMaximumVirtual = + calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMaximumProfileTotal, "max"); + Double powerLimitMinimumVirtual = + calculatePowerLimitVirtual(energyOptimisationAsset, powerLimitMinimumProfileTotal, "min"); + + // Send warning LOG message when too large fluctuation margins are set + if (powerLimitMaximumProfileTotal != null + && powerLimitMinimumProfileTotal != null + && powerLimitMaximumVirtual != null + && powerLimitMinimumVirtual != null + && powerLimitMaximumVirtual < powerLimitMinimumVirtual) { + double diffPowerLimit = powerLimitMaximumProfileTotal - powerLimitMinimumProfileTotal; + double fluctuationMarginSum = + Math.abs(powerLimitMaximumProfileTotal - powerLimitMaximumVirtual) + + Math.abs(powerLimitMinimumProfileTotal - powerLimitMinimumVirtual); + + Long powerLimitMaximumProfileTimestampMillis = + energyOptimisationAsset.getPowerLimitMaximumProfileTotalTimestamp().orElse(null); + DateTimeFormatter formatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneId.systemDefault()); + String powerLimitMaximumProfileDateTime = ""; + + if (powerLimitMaximumProfileTimestampMillis != null) { + powerLimitMaximumProfileDateTime = + formatter.format(Instant.ofEpochMilli(powerLimitMaximumProfileTimestampMillis)); + } + + LOG.warning( + String.format( + "%s; Failed to perform '%s' energy optimisation method. The difference between '%s' - %s = %s kW is smaller than the fluctuation margin sum = %s kW for timestamp='%s'", + logPrefixEnergyOptimisation, + optimisationMethodName, + EmsEnergyOptimisationAsset.POWER_LIMIT_MAXIMUM_PROFILE_TOTAL.getName(), + EmsEnergyOptimisationAsset.POWER_LIMIT_MINIMUM_PROFILE_TOTAL.getName(), + diffPowerLimit, + fluctuationMarginSum, + powerLimitMaximumProfileDateTime)); + } - if (chargeEfficiency != null && chargeEfficiency <= 0) { - LOG.warning(String.format("The charge efficiency = %s%% is smaller than or equal to 0", chargeEfficiency)); - } + // Calculate virtual power consumption + Map powerSetpointsCurrent = new HashMap<>(); - if (dischargeEfficiency != null && dischargeEfficiency <= 0) { - LOG.warning(String.format("The discharge efficiency = %s%% is smaller than or equal to 0", dischargeEfficiency)); - } - } + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + double powerSetpoint = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + powerSetpointsCurrent.put(electricityBatteryAsset.getId(), powerSetpoint); } - private Map batteryGetEnergyLevelPercentageTargetsCurrent(List electricityBatteryAssets, Services services) { - Map batteryEnergyLevelPercentageTargetsCurrent = new HashMap<>(); - - long intervalMillis = 15 * 60000; - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - long endTimeMillis = currentTimeMillis - currentTimeMillis % intervalMillis + intervalMillis; + double powerSetpointsCurrentSum = + powerSetpointsCurrent.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerConsumptionVirtual = powerNet - powerSetpointsCurrentSum; + + // Calculate new power set-points without limits + Map powerSetpointsNewWithoutLimits = + batteryCalculatePowerSetpointsWithoutLimits( + electricityBatteryAssets, + batteryEnergyLevelPercentageTargets, + energyOptimisationAsset, + powerFlexibleAvailable, + services); + + // Apply power limits and adjust new power set-points + double powerSetpointsNewWithoutLimitsSum = + powerSetpointsNewWithoutLimits.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerNetVirtualNew = powerConsumptionVirtual + powerSetpointsNewWithoutLimitsSum; + + double powerLimitMaximumFluctuation = + calculatePowerFluctuationMargin( + energyOptimisationAsset, powerLimitMaximumProfileTotal, "max"); + double powerLimitMinimumFluctuation = + calculatePowerFluctuationMargin( + energyOptimisationAsset, powerLimitMinimumProfileTotal, "min"); + + if (powerLimitMaximumVirtual != null + && (powerNetVirtualNew + powerLimitMaximumFluctuation) > powerLimitMaximumVirtual) { + powerSetpointsNew = + batteryCalculatePowerSetpointsOnLimitBreach( + powerNetVirtualNew, + powerLimitMaximumVirtual, + electricityBatteryAssets, + powerFlexibleAvailable, + powerSetpointsNewWithoutLimits); + } else if (powerLimitMinimumVirtual != null + && (powerNetVirtualNew - powerLimitMinimumFluctuation) < powerLimitMinimumVirtual) { + powerSetpointsNew = + batteryCalculatePowerSetpointsOnLimitBreach( + powerNetVirtualNew, + powerLimitMinimumVirtual, + electricityBatteryAssets, + powerFlexibleAvailable, + powerSetpointsNewWithoutLimits); + } else { + powerSetpointsNew = powerSetpointsNewWithoutLimits; + } - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String batteryAssetId = electricityBatteryAsset.getId(); - AssetDatapointAllQuery assetDatapointQueryPredicted = new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); - List> energyLevelPercentagePredictedCurrent = services.getAssetPredictedDatapointService().queryDatapoints(batteryAssetId, EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), assetDatapointQueryPredicted); + // Send warning LOG message on power limit breach + double powerSetpointsNewSum = + powerSetpointsNew.values().stream().mapToDouble(Double::doubleValue).sum(); + double powerNetNewVirtual = powerConsumptionVirtual + powerSetpointsNewSum; + + if (powerLimitMaximumProfileTotal != null + && powerNetNewVirtual > powerLimitMaximumProfileTotal) { + double powerReductionShortage = + round((powerNetNewVirtual - powerLimitMaximumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Not enough flexible power to get below power limit maximum; Shortage of %s kW", + logPrefixEnergyOptimisation, powerReductionShortage)); + } else if (powerLimitMinimumProfileTotal != null + && powerNetNewVirtual < powerLimitMinimumProfileTotal) { + double powerReductionShortage = + round((powerNetNewVirtual - powerLimitMinimumProfileTotal), 3); + LOG.warning( + String.format( + "%s; Not enough flexible power to get above power limit minimum; Shortage of %s kW", + logPrefixEnergyOptimisation, powerReductionShortage)); + } - Integer energyLevelPercentageTarget = null; + return powerSetpointsNew; + } + + private Map batteryCalculatePowerSetpointsOnLimitBreach( + double power, + double powerLimitVirtual, + List electricityBatteryAssets, + Map powerFlexibleAvailable, + Map powerSetpointsNewWithoutLimits) { + Map powerSetpointsNew = new HashMap<>(); + double powerChangeNeeded = round(power - powerLimitVirtual, 3); + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + + double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; + double dischargePowerAvailable = + powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; + double powerSetpointNewWithoutLimits = + powerSetpointsNewWithoutLimits.getOrDefault(electricityBatteryAssetId, 0.0); + double chargePowerAvailableTotal = chargePowerAvailable - powerSetpointNewWithoutLimits; + double dischargePowerAvailableTotal = dischargePowerAvailable - powerSetpointNewWithoutLimits; + + double powerSetpointChange = 0.0; + + if (powerChangeNeeded > 0) { + powerSetpointChange = Math.max(-powerChangeNeeded, dischargePowerAvailableTotal); + } else if (powerChangeNeeded < 0) { + powerSetpointChange = Math.min(-powerChangeNeeded, chargePowerAvailableTotal); + } + + powerChangeNeeded = round(powerChangeNeeded + powerSetpointChange, 3); + + double powerSetpointNew = round(powerSetpointNewWithoutLimits + powerSetpointChange, 3); + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } - if (!energyLevelPercentagePredictedCurrent.isEmpty()) { - Double value = ((Double) energyLevelPercentagePredictedCurrent.getLast().getValue()); - energyLevelPercentageTarget = (value != null) ? value.intValue() : null; - } + return powerSetpointsNew; + } + + private Map batteryCalculatePowerSetpointsWithoutLimits( + List electricityBatteryAssets, + Map batteryEnergyLevelPercentageTargets, + EmsEnergyOptimisationAsset energyOptimisationAsset, + Map powerFlexibleAvailable, + Services services) { + // Find battery power set-points for a system without power limits + Map powerSetpointsNew = new HashMap<>(); + + long intervalMillis = 15 * 60000; + long endTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long startTimeMillis = endTimeMillis - endTimeMillis % intervalMillis; + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + + // Set initial power set-point of 0 + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + + if (energyLevelPercentage == null) { + continue; + } + + double energyCapacity = electricityBatteryAsset.getEnergyCapacity().orElse(0.0); + double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + + // Get battery energy level percentage target + Integer energyLevelPercentageTarget = + batteryEnergyLevelPercentageTargets.get(electricityBatteryAssetId); + + if (energyLevelPercentageTarget == null) { + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + energyLevelPercentageTarget = + batteryCalculateEnergyLevelPercentageDefault( + energyLevelPercentageMaximum, + energyLevelPercentageMinimum, + energyOptimisationAsset); + } + + // Get battery power set-point target + AssetDatapointAllQuery assetDatapointQueryPredicted = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + List> powerSetpointForecastList = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.POWER_SETPOINT.getName(), + assetDatapointQueryPredicted); + + // Calculate battery power set-point target + double energyLevelPercentageRounded = round(energyLevelPercentage, 1); + double powerNeeded = + round( + (energyLevelPercentageTarget - energyLevelPercentageRounded) * 0.01 * energyCapacity, + 3); + double powerSetpointNeeded = + round(powerNeeded * 60 * BATTERY_POWER_SETPOINT_RESPONSIVENESS_DEFAULT, 3); + + if (energyLevelPercentageRounded < energyLevelPercentageTarget + || (powerSetpointCurrent > 0.0 + && energyLevelPercentageRounded < energyLevelPercentageTarget)) { + // Start charging or continue charging + int chargeEfficiencyPercentage = electricityBatteryAsset.getChargeEfficiency().orElse(100); + + double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; + double powerSetpointEfficiency = + round(powerSetpointNeeded / (chargeEfficiencyPercentage * 0.01), 3); + double powerSetpointNew = Math.min(powerSetpointEfficiency, chargePowerAvailable); + + if (!powerSetpointForecastList.isEmpty()) { + Double powerSetpointForecast = (Double) powerSetpointForecastList.getLast().getValue(); + + if (powerSetpointForecast != null && powerSetpointForecast > 0) { + powerSetpointNew = Math.min(powerSetpointNew, powerSetpointForecast); + } + } - batteryEnergyLevelPercentageTargetsCurrent.put(batteryAssetId, energyLevelPercentageTarget); + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } else if (energyLevelPercentageRounded > energyLevelPercentageTarget + || (powerSetpointCurrent < 0.0 + && energyLevelPercentageRounded > energyLevelPercentageTarget)) { + // Start discharging or continue discharging + int dischargeEfficiencyPercentage = + electricityBatteryAsset.getDischargeEfficiency().orElse(100); + + double dischargePowerAvailable = + powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; + double powerSetpointEfficiency = + round(powerSetpointNeeded / (dischargeEfficiencyPercentage * 0.01), 3); + double powerSetpointNew = Math.max(powerSetpointEfficiency, dischargePowerAvailable); + + if (!powerSetpointForecastList.isEmpty()) { + Double powerSetpointForecast = (Double) powerSetpointForecastList.getLast().getValue(); + + if (powerSetpointForecast != null && powerSetpointForecast < 0) { + powerSetpointNew = Math.max(powerSetpointNew, powerSetpointForecast); + } } - return batteryEnergyLevelPercentageTargetsCurrent; + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); + } } - private List batteryOrder(List electricityBatteryAssets) { - List sorted = new ArrayList<>(electricityBatteryAssets); - - sorted.sort(Comparator - .comparing((EmsElectricityBatteryAsset b) -> b.getEnergyCapacity().isPresent() && b.getDischargePowerMaximum().orElse(0.0) != 0.0) - .reversed() - .thenComparing(b -> b.getDischargePowerMaximum().orElse(0.0) == 0 - ? null - : round(b.getEnergyCapacity().orElse(0.0) / b.getDischargePowerMaximum().orElse(0.0), 2), - Comparator.nullsLast(Comparator.naturalOrder()) - ) - .thenComparing(EmsElectricityBatteryAsset::getId) - ); - - return sorted; + return powerSetpointsNew; + } + + private void batteryCheckConnection( + List electricityBatteryAssets, Services services) { + // This method checks if a battery is connected based on if the 'power' and + // 'energyLevelPercentage' attributes update within the active time interval + String connected = + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.connected + .toString(); + String disconnected = + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType.disconnected + .toString(); + + long currentTimestampMillis = services.getTimerService().getCurrentTimeMillis(); + long activePeriodMillis = ACTIVE_PERIOD_MINUTES * 60000L; + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + + Optional + connectionStatusValue = electricityBatteryAsset.getConnectionStatus(); + String connectionStatusPrevious = ""; + + if (connectionStatusValue.isPresent()) { + connectionStatusPrevious = connectionStatusValue.get().toString(); + } + + Double powerBattery = electricityBatteryAsset.getPower().orElse(null); + long powerTimestampMillisBattery = electricityBatteryAsset.getPowerTimestamp().orElse(0L); + + Double energyLevelPercentageBattery = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + long energyLevelPercentageTimestampMillisBattery = + electricityBatteryAsset.getEnergyLevelPercentageTimestamp().orElse(0L); + + String connectionStatusCurrent = disconnected; + + if ((currentTimestampMillis - powerTimestampMillisBattery) < activePeriodMillis + && powerBattery != null + && (currentTimestampMillis - energyLevelPercentageTimestampMillisBattery) + < activePeriodMillis + && energyLevelPercentageBattery != null) { + connectionStatusCurrent = connected; + } + + if (connectionStatusCurrent.equals(connected) + && connectionStatusPrevious.equals(disconnected)) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .connected), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(disconnected) + && connectionStatusPrevious.equals(connected)) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .disconnected), + getClass().getSimpleName()); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE, + null), + getClass().getSimpleName()); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER, null), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(connected) && connectionStatusPrevious.isEmpty()) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .connected), + getClass().getSimpleName()); + } else if (connectionStatusCurrent.equals(disconnected) + && connectionStatusPrevious.isEmpty()) { + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.CONNECTION_STATUS, + EmsElectricityBatteryAsset.EmsElectricityBatteryConnectionStatusValueType + .disconnected), + getClass().getSimpleName()); + } + } + } + + private Map batteryCheckPowerSetpointsCurrent( + List electricityBatteryAssets, + Map powerFlexibleAvailable) { + Map powerSetpointsNew = new HashMap<>(); + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double energyLevelPercentage = + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null); + + if (energyLevelPercentage == null) { + powerSetpointsNew.put(electricityBatteryAssetId, 0.0); + continue; + } + + double powerSetpointCurrent = electricityBatteryAsset.getPowerSetpoint().orElse(0.0); + double chargePowerAvailable = powerFlexibleAvailable.get(electricityBatteryAssetId).charge; + double dischargePowerAvailable = + powerFlexibleAvailable.get(electricityBatteryAssetId).discharge; + + // Set initial power set-point new + double powerSetpointNew = 0.0; + + // Check if power set-point current is within available power limits + if (powerSetpointCurrent > 0.0) { + powerSetpointNew = Math.min(powerSetpointCurrent, chargePowerAvailable); + } else if (powerSetpointCurrent < 0.0) { + powerSetpointNew = Math.max(powerSetpointCurrent, dischargePowerAvailable); + } + + powerSetpointsNew.put(electricityBatteryAssetId, powerSetpointNew); } - private void batteryUpdatePowerSetpoints(List electricityBatteryAssets, Map powerSetpointsNew, Services services) { - for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { - String electricityBatteryAssetId = electricityBatteryAsset.getId(); - Double powerSetpointNew = powerSetpointsNew.get(electricityBatteryAssetId); - - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(electricityBatteryAssetId, EmsElectricityBatteryAsset.POWER_SETPOINT, powerSetpointNew), getClass().getSimpleName()); - } + return powerSetpointsNew; + } + + private void batteryCheckSetup(List electricityBatteryAssets) { + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + // Check if the battery is enabled + boolean allowCharging = electricityBatteryAsset.getAllowDischarging().orElse(false); + boolean allowDischarging = electricityBatteryAsset.getAllowCharging().orElse(false); + + if (!allowCharging && !allowDischarging) { + continue; + } + + String logPrefixBattery = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + electricityBatteryAsset.getAssetType(), + electricityBatteryAsset.getId(), + electricityBatteryAsset.getAssetName()); + + // Check if the following attributes are connected + Map requiredFieldsConnection = new HashMap<>(); + + requiredFieldsConnection.put( + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), + electricityBatteryAsset.getEnergyLevelPercentage().orElse(null)); + requiredFieldsConnection.put( + EmsElectricityBatteryAsset.POWER.getName(), + electricityBatteryAsset.getPower().orElse(null)); + + List missingFieldsConnection = + requiredFieldsConnection.entrySet().stream() + .filter(entry -> entry.getValue() == null) + .map(Map.Entry::getKey) + .toList(); + + if (!missingFieldsConnection.isEmpty()) { + LOG.warning( + String.format( + "%s; Can't use battery for flexible power. The following attributes are not connected: %s", + logPrefixBattery, + String.join( + ", ", + missingFieldsConnection.stream().map(attr -> "'" + attr + "'").toList()))); + } + + // Check if the following attributes are set + Map requiredFieldsSetup = new HashMap<>(); + + Integer energyLevelPercentageMaximum = + electricityBatteryAsset.getEnergyLevelPercentageMaximum().orElse(null); + Integer energyLevelPercentageMinimum = + electricityBatteryAsset.getEnergyLevelPercentageMinimum().orElse(null); + Integer chargeEfficiency = electricityBatteryAsset.getChargeEfficiency().orElse(null); + Integer dischargeEfficiency = electricityBatteryAsset.getDischargeEfficiency().orElse(null); + + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.CHARGE_EFFICIENCY.getName(), chargeEfficiency); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.CHARGE_POWER_MAXIMUM.getName(), + electricityBatteryAsset.getChargePowerMaximum().orElse(null)); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.DISCHARGE_EFFICIENCY.getName(), dischargeEfficiency); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.DISCHARGE_POWER_MAXIMUM.getName(), + electricityBatteryAsset.getDischargePowerMaximum().orElse(null)); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.ENERGY_CAPACITY.getName(), + electricityBatteryAsset.getEnergyCapacity().orElse(null)); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), + energyLevelPercentageMaximum); + requiredFieldsSetup.put( + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), + energyLevelPercentageMinimum); + + List missingFieldsSetup = + requiredFieldsSetup.entrySet().stream() + .filter(entry -> entry.getValue() == null) + .map(Map.Entry::getKey) + .toList(); + + if (!missingFieldsSetup.isEmpty()) { + LOG.warning( + String.format( + "%s; Can't use battery for flexible power. The following attributes are not set: %s", + logPrefixBattery, + String.join( + ", ", missingFieldsSetup.stream().map(attr -> "'" + attr + "'").toList()))); + } + + // Check if the following attributes are set correctly + if (energyLevelPercentageMaximum != null + && energyLevelPercentageMinimum != null + && energyLevelPercentageMaximum <= energyLevelPercentageMinimum) { + LOG.warning( + String.format( + "%s; Can't use battery for flexible power. '%s' = %s%% is smaller than or equal to '%s'= %s%%)", + logPrefixBattery, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MAXIMUM.getName(), + energyLevelPercentageMaximum, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE_MINIMUM.getName(), + energyLevelPercentageMinimum)); + } + + if (chargeEfficiency != null && chargeEfficiency <= 0) { + LOG.warning( + String.format( + "The charge efficiency = %s%% is smaller than or equal to 0", chargeEfficiency)); + } + + if (dischargeEfficiency != null && dischargeEfficiency <= 0) { + LOG.warning( + String.format( + "The discharge efficiency = %s%% is smaller than or equal to 0", + dischargeEfficiency)); + } + } + } + + private Map batteryGetEnergyLevelPercentageTargetsCurrent( + List electricityBatteryAssets, Services services) { + Map batteryEnergyLevelPercentageTargetsCurrent = new HashMap<>(); + + long intervalMillis = 15 * 60000; + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + long endTimeMillis = currentTimeMillis - currentTimeMillis % intervalMillis + intervalMillis; + + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String batteryAssetId = electricityBatteryAsset.getId(); + AssetDatapointAllQuery assetDatapointQueryPredicted = + new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); + List> energyLevelPercentagePredictedCurrent = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + batteryAssetId, + EmsElectricityBatteryAsset.ENERGY_LEVEL_PERCENTAGE.getName(), + assetDatapointQueryPredicted); + + Integer energyLevelPercentageTarget = null; + + if (!energyLevelPercentagePredictedCurrent.isEmpty()) { + Double value = ((Double) energyLevelPercentagePredictedCurrent.getLast().getValue()); + energyLevelPercentageTarget = (value != null) ? value.intValue() : null; + } + + batteryEnergyLevelPercentageTargetsCurrent.put(batteryAssetId, energyLevelPercentageTarget); } - private double calculatePowerFluctuationMargin(EmsEnergyOptimisationAsset energyOptimisationAsset, Double powerLimitProfileTotal, String maxOrMin) { - if (powerLimitProfileTotal == null) { - return 0.0; - } + return batteryEnergyLevelPercentageTargetsCurrent; + } + + private List batteryOrder( + List electricityBatteryAssets) { + List sorted = new ArrayList<>(electricityBatteryAssets); + + sorted.sort( + Comparator.comparing( + (EmsElectricityBatteryAsset b) -> + b.getEnergyCapacity().isPresent() + && b.getDischargePowerMaximum().orElse(0.0) != 0.0) + .reversed() + .thenComparing( + b -> + b.getDischargePowerMaximum().orElse(0.0) == 0 + ? null + : round( + b.getEnergyCapacity().orElse(0.0) + / b.getDischargePowerMaximum().orElse(0.0), + 2), + Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(EmsElectricityBatteryAsset::getId)); + + return sorted; + } + + private void batteryUpdatePowerSetpoints( + List electricityBatteryAssets, + Map powerSetpointsNew, + Services services) { + for (EmsElectricityBatteryAsset electricityBatteryAsset : electricityBatteryAssets) { + String electricityBatteryAssetId = electricityBatteryAsset.getId(); + Double powerSetpointNew = powerSetpointsNew.get(electricityBatteryAssetId); + + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + electricityBatteryAssetId, + EmsElectricityBatteryAsset.POWER_SETPOINT, + powerSetpointNew), + getClass().getSimpleName()); + } + } + + private double calculatePowerFluctuationMargin( + EmsEnergyOptimisationAsset energyOptimisationAsset, + Double powerLimitProfileTotal, + String maxOrMin) { + if (powerLimitProfileTotal == null) { + return 0.0; + } - boolean isMin = "min".equals(maxOrMin); - String fluctuationMarginAttributeName = POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME; + boolean isMin = "min".equals(maxOrMin); + String fluctuationMarginAttributeName = POWER_LIMIT_MAXIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME; - if (isMin) { - fluctuationMarginAttributeName = POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME; - } + if (isMin) { + fluctuationMarginAttributeName = POWER_LIMIT_MINIMUM_FLUCTUATION_MARGIN_ATTRIBUTE_NAME; + } - Double powerLimitFluctuationMargin = (Double) energyOptimisationAsset.getAttribute(fluctuationMarginAttributeName) + Double powerLimitFluctuationMargin = + (Double) + energyOptimisationAsset + .getAttribute(fluctuationMarginAttributeName) .flatMap(Attribute::getValue) .orElse(null); - if (powerLimitFluctuationMargin == null) { - powerLimitFluctuationMargin = powerLimitProfileTotal * POWER_LIMIT_FLUCTUATION_MARGIN_PERCENTAGE_DEFAULT * 0.01; - } - - return round(Math.abs(powerLimitFluctuationMargin), 3); + if (powerLimitFluctuationMargin == null) { + powerLimitFluctuationMargin = + powerLimitProfileTotal * POWER_LIMIT_FLUCTUATION_MARGIN_PERCENTAGE_DEFAULT * 0.01; } - private Double calculatePowerLimitVirtual(EmsEnergyOptimisationAsset energyOptimisationAsset, Double powerLimitProfileTotal, String maxOrMin) { - if (powerLimitProfileTotal == null) { - return null; - } - - double powerLimitFluctuationMargin = calculatePowerFluctuationMargin(energyOptimisationAsset, powerLimitProfileTotal, maxOrMin); - boolean isMin = "min".equals(maxOrMin); - - double powerLimitVirtual; + return round(Math.abs(powerLimitFluctuationMargin), 3); + } - if (isMin) { - powerLimitVirtual = powerLimitProfileTotal + powerLimitFluctuationMargin; - } else { - powerLimitVirtual = powerLimitProfileTotal - powerLimitFluctuationMargin; - } - - return round(powerLimitVirtual, 3); + private Double calculatePowerLimitVirtual( + EmsEnergyOptimisationAsset energyOptimisationAsset, + Double powerLimitProfileTotal, + String maxOrMin) { + if (powerLimitProfileTotal == null) { + return null; } - private Map calculateTariffChargeAndDischargeZones(List> tariffImportDatapoints, List> tariffExportDatapoints, int window) { - Map chargeAndDischargeZonesMap = new HashMap<>(); - - // Return empty map when there is no tariff forecast present - if (tariffImportDatapoints.size() < window || tariffExportDatapoints.size() < window) { - return chargeAndDischargeZonesMap; - } + double powerLimitFluctuationMargin = + calculatePowerFluctuationMargin(energyOptimisationAsset, powerLimitProfileTotal, maxOrMin); + boolean isMin = "min".equals(maxOrMin); - // Find the best import/export tariff window for each day - List> tariffImportMovingAverage = movingAverage(tariffImportDatapoints, window); - List> tariffExportMovingAverage = movingAverage(tariffExportDatapoints, window); - - ZoneId zoneId = ZoneId.systemDefault(); - - Map tariffImportDailyMinimumMap = - IntStream.range(0, tariffImportMovingAverage.size()) - .mapToObj(i -> { - ValueDatapoint dp = tariffImportMovingAverage.get(i); - return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); - }) - .collect(Collectors.toMap( - dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), - Function.identity(), - BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)) - )); - - Map tariffExportDailyMinimumMap = - IntStream.range(0, tariffExportMovingAverage.size()) - .mapToObj(i -> { - ValueDatapoint dp = tariffExportMovingAverage.get(i); - return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); - }) - .collect(Collectors.toMap( - dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), - Function.identity(), - BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)) - )); - - Map chargeZonesMap = new HashMap<>(); - Map dischargeZonesMap = new HashMap<>(); - - for (Map.Entry entry : tariffImportDailyMinimumMap.entrySet()) { - int startIndex = entry.getValue().index; - int endIndex = startIndex + window; - - for (int i = startIndex; i < endIndex; i++) { - long timeMillis = tariffImportDatapoints.get(i).getTimestamp(); - chargeZonesMap.put(timeMillis, 1); - } - } + double powerLimitVirtual; - for (Map.Entry entry : tariffExportDailyMinimumMap.entrySet()) { - int startIndex = entry.getValue().index; - int endIndex = startIndex + window; + if (isMin) { + powerLimitVirtual = powerLimitProfileTotal + powerLimitFluctuationMargin; + } else { + powerLimitVirtual = powerLimitProfileTotal - powerLimitFluctuationMargin; + } - for (int i = startIndex; i < endIndex; i++) { - long timeMillis = tariffExportDatapoints.get(i).getTimestamp(); - dischargeZonesMap.put(timeMillis, -1); - } - } + return round(powerLimitVirtual, 3); + } - for (Map.Entry entry : chargeZonesMap.entrySet()) { - if (!dischargeZonesMap.containsKey(entry.getKey())) { - chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); - } - } + private Map calculateTariffChargeAndDischargeZones( + List> tariffImportDatapoints, + List> tariffExportDatapoints, + int window) { + Map chargeAndDischargeZonesMap = new HashMap<>(); - for (Map.Entry entry : dischargeZonesMap.entrySet()) { - if (!chargeZonesMap.containsKey(entry.getKey())) { - chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); - } - } + // Return empty map when there is no tariff forecast present + if (tariffImportDatapoints.size() < window || tariffExportDatapoints.size() < window) { + return chargeAndDischargeZonesMap; + } - return chargeAndDischargeZonesMap; + // Find the best import/export tariff window for each day + List> tariffImportMovingAverage = + movingAverage(tariffImportDatapoints, window); + List> tariffExportMovingAverage = + movingAverage(tariffExportDatapoints, window); + + ZoneId zoneId = ZoneId.systemDefault(); + + Map tariffImportDailyMinimumMap = + IntStream.range(0, tariffImportMovingAverage.size()) + .mapToObj( + i -> { + ValueDatapoint dp = tariffImportMovingAverage.get(i); + return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); + }) + .collect( + Collectors.toMap( + dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), + Function.identity(), + BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)))); + + Map tariffExportDailyMinimumMap = + IntStream.range(0, tariffExportMovingAverage.size()) + .mapToObj( + i -> { + ValueDatapoint dp = tariffExportMovingAverage.get(i); + return new IndexedDatapoint(dp.getTimestamp(), (Double) dp.getValue(), i); + }) + .collect( + Collectors.toMap( + dp -> Instant.ofEpochMilli(dp.timestamp()).atZone(zoneId).toLocalDate(), + Function.identity(), + BinaryOperator.minBy(Comparator.comparing(IndexedDatapoint::value)))); + + Map chargeZonesMap = new HashMap<>(); + Map dischargeZonesMap = new HashMap<>(); + + for (Map.Entry entry : tariffImportDailyMinimumMap.entrySet()) { + int startIndex = entry.getValue().index; + int endIndex = startIndex + window; + + for (int i = startIndex; i < endIndex; i++) { + long timeMillis = tariffImportDatapoints.get(i).getTimestamp(); + chargeZonesMap.put(timeMillis, 1); + } } - private EmsDayAheadAsset getDayAheadAsset(EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { - // Find assets in database - List assets = services.getAssetStorageService() - .findAll(new AssetQuery().parents(energyOptimisationAsset.getId()).types(EmsDayAheadAsset.class)) - .stream() - .map(asset -> (EmsDayAheadAsset) asset) - .toList(); - - EmsDayAheadAsset asset = null; - - if (assets.size() == 1) { - asset = assets.getFirst(); - } else if (assets.size() > 1) { - String logPrefixEnergyOptimisation = String.format("assetType='%s', assetId='%s', assetName='%s'", energyOptimisationAsset.getAssetType(), energyOptimisationAsset.getId(), energyOptimisationAsset.getAssetName()); - LOG.warning(String.format("%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", logPrefixEnergyOptimisation, assets.size(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName(), EmsGOPACSAsset.class.getSimpleName())); - } + for (Map.Entry entry : tariffExportDailyMinimumMap.entrySet()) { + int startIndex = entry.getValue().index; + int endIndex = startIndex + window; - return asset; + for (int i = startIndex; i < endIndex; i++) { + long timeMillis = tariffExportDatapoints.get(i).getTimestamp(); + dischargeZonesMap.put(timeMillis, -1); + } } - private List> getTariffDatapoints(EmsEnergyOptimisationAsset energyOptimisationAsset, String attributeName, Services services) { - // Get the start of the day (00:00) in milliseconds - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - ZoneId zoneId = ZoneId.systemDefault(); - LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); - long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); - - // Get tariff data-points of yesterday and 1 week into the future - long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; - long endTimeMillis = startOfCurrentDayMillis + 8 * 24 * 60 * 60000; - AssetDatapointAllQuery assetDatapointQueryHistoric = new AssetDatapointAllQuery(startTimeMillis, currentTimeMillis); - AssetDatapointAllQuery assetDatapointQueryPredicted = new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); - List> tariffHistoric = services.getAssetDatapointService().queryDatapoints(energyOptimisationAsset.getId(), attributeName, assetDatapointQueryHistoric); - List> tariffPredicted = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), attributeName, assetDatapointQueryPredicted); - - // Combine historic and predicted data-points, timestamps are ordered from newest to oldest (descending order) - List> tariffCombined = new ArrayList<>(tariffPredicted); - tariffCombined.addAll(tariffHistoric); - - return tariffCombined; + for (Map.Entry entry : chargeZonesMap.entrySet()) { + if (!dischargeZonesMap.containsKey(entry.getKey())) { + chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); + } } - private List> getTariffDayAheadDatapoints(Asset asset, String attributeName, Services services) { - // Get the start of the day (00:00) in milliseconds - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - ZoneId zoneId = ZoneId.systemDefault(); - LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); - long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); - - // Get tariff data-points of yesterday, today and tomorrow - long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; - long endTimeMillis = startOfCurrentDayMillis + 2 * 24 * 60 * 60000; - AssetDatapointAllQuery assetDatapointQueryHistoric = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - List> tariffHistoric = services.getAssetDatapointService().queryDatapoints(asset.getId(), attributeName, assetDatapointQueryHistoric); - - return tariffHistoric; + for (Map.Entry entry : dischargeZonesMap.entrySet()) { + if (!chargeZonesMap.containsKey(entry.getKey())) { + chargeAndDischargeZonesMap.put(entry.getKey(), entry.getValue()); + } } - public static List> intervalAverage(List> dataPoints, long intervalMillis) { - // Map - Map> valuesPerIntervalMap = new HashMap<>(); - - for (ValueDatapoint datapoint : dataPoints) { - long timestampMillis = datapoint.getTimestamp(); - Double value = (Double) datapoint.getValue(); - - if (value != null) { - // Calculate start of 15-minute interval - long intervalStartMillis = timestampMillis - timestampMillis % intervalMillis; - - // Add value to corresponding interval - valuesPerIntervalMap.computeIfAbsent(intervalStartMillis, key -> new ArrayList<>()).add(value); - } - } + return chargeAndDischargeZonesMap; + } + + private EmsDayAheadAsset getDayAheadAsset( + EmsEnergyOptimisationAsset energyOptimisationAsset, Services services) { + // Find assets in database + List assets = + services + .getAssetStorageService() + .findAll( + new AssetQuery() + .parents(energyOptimisationAsset.getId()) + .types(EmsDayAheadAsset.class)) + .stream() + .map(asset -> (EmsDayAheadAsset) asset) + .toList(); + + EmsDayAheadAsset asset = null; + + if (assets.size() == 1) { + asset = assets.getFirst(); + } else if (assets.size() > 1) { + String logPrefixEnergyOptimisation = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + energyOptimisationAsset.getAssetType(), + energyOptimisationAsset.getId(), + energyOptimisationAsset.getAssetName()); + LOG.warning( + String.format( + "%s; Found %s '%s' assets; Only 1 '%s' asset is allowed; Remove additional '%s' assets", + logPrefixEnergyOptimisation, + assets.size(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName(), + EmsGOPACSAsset.class.getSimpleName())); + } - // List with average values per interval - List> averageList = new ArrayList<>(); + return asset; + } + + private List> getTariffDatapoints( + EmsEnergyOptimisationAsset energyOptimisationAsset, String attributeName, Services services) { + // Get the start of the day (00:00) in milliseconds + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); + long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); + + // Get tariff data-points of yesterday and 1 week into the future + long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; + long endTimeMillis = startOfCurrentDayMillis + 8 * 24 * 60 * 60000; + AssetDatapointAllQuery assetDatapointQueryHistoric = + new AssetDatapointAllQuery(startTimeMillis, currentTimeMillis); + AssetDatapointAllQuery assetDatapointQueryPredicted = + new AssetDatapointAllQuery(currentTimeMillis, endTimeMillis); + List> tariffHistoric = + services + .getAssetDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), attributeName, assetDatapointQueryHistoric); + List> tariffPredicted = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), attributeName, assetDatapointQueryPredicted); + + // Combine historic and predicted data-points, timestamps are ordered from newest to oldest + // (descending order) + List> tariffCombined = new ArrayList<>(tariffPredicted); + tariffCombined.addAll(tariffHistoric); + + return tariffCombined; + } + + private List> getTariffDayAheadDatapoints( + Asset asset, String attributeName, Services services) { + // Get the start of the day (00:00) in milliseconds + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDate date = Instant.ofEpochMilli(currentTimeMillis).atZone(zoneId).toLocalDate(); + long startOfCurrentDayMillis = date.atStartOfDay(zoneId).toInstant().toEpochMilli(); + + // Get tariff data-points of yesterday, today and tomorrow + long startTimeMillis = startOfCurrentDayMillis - 24 * 60 * 60000; + long endTimeMillis = startOfCurrentDayMillis + 2 * 24 * 60 * 60000; + AssetDatapointAllQuery assetDatapointQueryHistoric = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + List> tariffHistoric = + services + .getAssetDatapointService() + .queryDatapoints(asset.getId(), attributeName, assetDatapointQueryHistoric); + + return tariffHistoric; + } + + public static List> intervalAverage( + List> dataPoints, long intervalMillis) { + // Map + Map> valuesPerIntervalMap = new HashMap<>(); + + for (ValueDatapoint datapoint : dataPoints) { + long timestampMillis = datapoint.getTimestamp(); + Double value = (Double) datapoint.getValue(); + + if (value != null) { + // Calculate start of 15-minute interval + long intervalStartMillis = timestampMillis - timestampMillis % intervalMillis; + + // Add value to corresponding interval + valuesPerIntervalMap + .computeIfAbsent(intervalStartMillis, key -> new ArrayList<>()) + .add(value); + } + } - for (Map.Entry> entry : valuesPerIntervalMap.entrySet()) { - Long intervalStartMillis = entry.getKey(); - List values = entry.getValue(); + // List with average values per interval + List> averageList = new ArrayList<>(); - // Compute the average - double sum = 0; - for (double value : values) { - sum += value; - } - double average = sum / values.size(); + for (Map.Entry> entry : valuesPerIntervalMap.entrySet()) { + Long intervalStartMillis = entry.getKey(); + List values = entry.getValue(); - averageList.add(new ValueDatapoint<>(intervalStartMillis, average)); - } + // Compute the average + double sum = 0; + for (double value : values) { + sum += value; + } + double average = sum / values.size(); - return averageList; + averageList.add(new ValueDatapoint<>(intervalStartMillis, average)); } - private List> intervalInterpolate(List> dataPoints, long startTimeMillis, long endTimeMillis, long intervalMillis) { - List> interpolatedList = new ArrayList<>(); + return averageList; + } - if (dataPoints == null || dataPoints.size() < 2) { - return interpolatedList; - } + private List> intervalInterpolate( + List> dataPoints, + long startTimeMillis, + long endTimeMillis, + long intervalMillis) { + List> interpolatedList = new ArrayList<>(); - int idx1 = 0; + if (dataPoints == null || dataPoints.size() < 2) { + return interpolatedList; + } - for (long intervalTimeMillis = startTimeMillis; intervalTimeMillis <= endTimeMillis; intervalTimeMillis += intervalMillis) { - // Find data-point before and after interval - while (idx1 < (dataPoints.size() - 1) && dataPoints.get(idx1 + 1).getTimestamp() < intervalTimeMillis) { - idx1++; - } + int idx1 = 0; - long timeBeforeMillis = dataPoints.get(idx1).getTimestamp(); - long timeAfterMillis = dataPoints.get(idx1 + 1).getTimestamp(); + for (long intervalTimeMillis = startTimeMillis; + intervalTimeMillis <= endTimeMillis; + intervalTimeMillis += intervalMillis) { + // Find data-point before and after interval + while (idx1 < (dataPoints.size() - 1) + && dataPoints.get(idx1 + 1).getTimestamp() < intervalTimeMillis) { + idx1++; + } - // Interpolate value - if (intervalTimeMillis >= timeBeforeMillis && intervalTimeMillis <= timeAfterMillis) { - double valueBefore = (double) dataPoints.get(idx1).getValue(); - double valueAfter = (double) dataPoints.get(idx1 + 1).getValue(); + long timeBeforeMillis = dataPoints.get(idx1).getTimestamp(); + long timeAfterMillis = dataPoints.get(idx1 + 1).getTimestamp(); - double factor = (double) (intervalTimeMillis - timeBeforeMillis) / (timeAfterMillis - timeBeforeMillis); - double interpolatedValue = valueBefore + factor * (valueAfter - valueBefore); + // Interpolate value + if (intervalTimeMillis >= timeBeforeMillis && intervalTimeMillis <= timeAfterMillis) { + double valueBefore = (double) dataPoints.get(idx1).getValue(); + double valueAfter = (double) dataPoints.get(idx1 + 1).getValue(); - interpolatedList.add(new ValueDatapoint<>(intervalTimeMillis, interpolatedValue)); - } - } + double factor = + (double) (intervalTimeMillis - timeBeforeMillis) / (timeAfterMillis - timeBeforeMillis); + double interpolatedValue = valueBefore + factor * (valueAfter - valueBefore); - return interpolatedList; + interpolatedList.add(new ValueDatapoint<>(intervalTimeMillis, interpolatedValue)); + } } - public List> movingAverage(List> dataPoints, int window) { - List> result = new ArrayList<>(); - if (window <= 0 || dataPoints.size() < window) { - return result; - } + return interpolatedList; + } - double sum = 0.0; + public List> movingAverage(List> dataPoints, int window) { + List> result = new ArrayList<>(); + if (window <= 0 || dataPoints.size() < window) { + return result; + } - for (int i = 0; i < dataPoints.size(); i++) { - Double value = (Double) dataPoints.get(i).getValue(); - sum += value; + double sum = 0.0; - if (i >= window) { - Double valueOld = (Double) dataPoints.get(i - window).getValue(); - sum -= valueOld; - } + for (int i = 0; i < dataPoints.size(); i++) { + Double value = (Double) dataPoints.get(i).getValue(); + sum += value; - if (i >= window - 1) { - double avg = sum / window; + if (i >= window) { + Double valueOld = (Double) dataPoints.get(i - window).getValue(); + sum -= valueOld; + } - ValueDatapoint original = dataPoints.get(i); + if (i >= window - 1) { + double avg = sum / window; - ValueDatapoint averaged = new ValueDatapoint<>(original.getTimestamp(), round(avg, 7)); - result.add(averaged); - } - } + ValueDatapoint original = dataPoints.get(i); - return result; + ValueDatapoint averaged = + new ValueDatapoint<>(original.getTimestamp(), round(avg, 7)); + result.add(averaged); + } } - private double round(double value, int precision) { - double scale = Math.pow(10, precision); - return Math.round(value * scale) / scale; + return result; + } + + private double round(double value, int precision) { + double scale = Math.pow(10, precision); + return Math.round(value * scale) / scale; + } + + private void updateDayAheadAsset( + EmsEnergyOptimisationAsset energyOptimisationAsset, + EmsDayAheadAsset dayAheadAsset, + Services services) { + String dayAheadAssetId = dayAheadAsset.getId(); + String logPrefixDayAhead = + String.format( + "assetType='%s', assetId='%s', assetName='%s'", + dayAheadAsset.getAssetType(), dayAheadAssetId, dayAheadAsset.getAssetName()); + + String collectTimeForecasts = dayAheadAsset.getCollectTimeForecasts().orElse(""); + + if (collectTimeForecasts.isBlank()) { + LOG.warning( + String.format( + "%s, attributeName='%s'; Set time to collect day ahead forecasts", + logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName())); } - private void updateDayAheadAsset(EmsEnergyOptimisationAsset energyOptimisationAsset, EmsDayAheadAsset dayAheadAsset, Services services) { - String dayAheadAssetId = dayAheadAsset.getId(); - String logPrefixDayAhead = String.format("assetType='%s', assetId='%s', assetName='%s'", dayAheadAsset.getAssetType(), dayAheadAssetId, dayAheadAsset.getAssetName()); - - String collectTimeForecasts = dayAheadAsset.getCollectTimeForecasts().orElse(""); - - if (collectTimeForecasts.isBlank()) { - LOG.warning(String.format("%s, attributeName='%s'; Set time to collect day ahead forecasts", logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName())); - } - - // Parse the time string - LocalTime collectTime = null; - - if (!collectTimeForecasts.isBlank()) { - try { - collectTime = LocalTime.parse(collectTimeForecasts, DateTimeFormatter.ofPattern("HH:mm")); - } catch (Exception e) { - LOG.warning(String.format("%s, attributeName='%s'; Error while parsing collect time; Exception: %s", logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName(), e)); - } - } - - Long lastUpdateForecastsTimestamp = dayAheadAsset.getLastUpdateForecastsTimestamp().orElse(null); - - if (collectTime == null || lastUpdateForecastsTimestamp == null) { - return; - } - - // Calculate the 15-minute interval for collecting the day ahead tariff forecasts - LocalDate currentDate = LocalDate.now(); - LocalDateTime currentCollectDateTime = LocalDateTime.of(currentDate, collectTime); - long collectTimeStartMillis = currentCollectDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - long collectTimeEndMillis = collectTimeStartMillis + 15 * 60000; - long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - - String lastUpdateForecasts = dayAheadAsset.getLastUpdateForecasts().orElse(""); - LocalDateTime lastUpdateDateTime = currentCollectDateTime.plusDays(-1); - - if (!lastUpdateForecasts.isEmpty()) { - lastUpdateDateTime = LocalDateTime.parse(lastUpdateForecasts); - } - - LocalDate nextUpdateDate = lastUpdateDateTime.plusDays(1).toLocalDate(); + // Parse the time string + LocalTime collectTime = null; + + if (!collectTimeForecasts.isBlank()) { + try { + collectTime = LocalTime.parse(collectTimeForecasts, DateTimeFormatter.ofPattern("HH:mm")); + } catch (Exception e) { + LOG.warning( + String.format( + "%s, attributeName='%s'; Error while parsing collect time; Exception: %s", + logPrefixDayAhead, EmsDayAheadAsset.COLLECT_TIME_FORECASTS.getName(), e)); + } + } - // Collect the day ahead tariff forecasts at the desired collect time - if (currentTimeMillis >= collectTimeStartMillis && currentTimeMillis < collectTimeEndMillis && collectTimeStartMillis > lastUpdateForecastsTimestamp && currentDate.isEqual(nextUpdateDate)) { - // Create asset datapoint query - LocalDateTime startOfNextDay = currentDate.plusDays(1).atStartOfDay(); - long startTimeMillis = startOfNextDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - long endTimeMillis = startTimeMillis + 24 * 60 * 60000 - 60000; - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + Long lastUpdateForecastsTimestamp = + dayAheadAsset.getLastUpdateForecastsTimestamp().orElse(null); - // Get the tariffs number of data-points from day ahead asset - int tariffExportDayAheadSize = services.getAssetDatapointService().queryDatapoints(dayAheadAssetId, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), assetDatapointQuery).size(); - int tariffImportDayAheadSize = services.getAssetDatapointService().queryDatapoints(dayAheadAssetId, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), assetDatapointQuery).size(); + if (collectTime == null || lastUpdateForecastsTimestamp == null) { + return; + } - // Only update the historic data-point table if there are no day ahead tariffs present in the historic data-point table for current interval - if (tariffExportDayAheadSize == 0) { - List> tariffExport = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), assetDatapointQuery); - services.getAssetDatapointService().upsertValues(dayAheadAssetId, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), tariffExport); - } + // Calculate the 15-minute interval for collecting the day ahead tariff forecasts + LocalDate currentDate = LocalDate.now(); + LocalDateTime currentCollectDateTime = LocalDateTime.of(currentDate, collectTime); + long collectTimeStartMillis = + currentCollectDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long collectTimeEndMillis = collectTimeStartMillis + 15 * 60000; + long currentTimeMillis = services.getTimerService().getCurrentTimeMillis(); - if (tariffImportDayAheadSize == 0) { - List> tariffImport = services.getAssetPredictedDatapointService().queryDatapoints(energyOptimisationAsset.getId(), EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), assetDatapointQuery); - services.getAssetDatapointService().upsertValues(dayAheadAssetId, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), tariffImport); - } + String lastUpdateForecasts = dayAheadAsset.getLastUpdateForecasts().orElse(""); + LocalDateTime lastUpdateDateTime = currentCollectDateTime.plusDays(-1); - // Update the 'last update forecasts' datetime field with current update datetime - String lastUpdateForecastsNew = currentCollectDateTime.toString(); - services.getAssetProcessingService().sendAttributeEvent(new AttributeEvent(dayAheadAssetId, EmsDayAheadAsset.LAST_UPDATE_FORECASTS.getName(), lastUpdateForecastsNew, collectTimeStartMillis)); - } + if (!lastUpdateForecasts.isEmpty()) { + lastUpdateDateTime = LocalDateTime.parse(lastUpdateForecasts); } - private record ChargeDischarge(double charge, double discharge) { + LocalDate nextUpdateDate = lastUpdateDateTime.plusDays(1).toLocalDate(); + + // Collect the day ahead tariff forecasts at the desired collect time + if (currentTimeMillis >= collectTimeStartMillis + && currentTimeMillis < collectTimeEndMillis + && collectTimeStartMillis > lastUpdateForecastsTimestamp + && currentDate.isEqual(nextUpdateDate)) { + // Create asset datapoint query + LocalDateTime startOfNextDay = currentDate.plusDays(1).atStartOfDay(); + long startTimeMillis = + startOfNextDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + long endTimeMillis = startTimeMillis + 24 * 60 * 60000 - 60000; + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + + // Get the tariffs number of data-points from day ahead asset + int tariffExportDayAheadSize = + services + .getAssetDatapointService() + .queryDatapoints( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), + assetDatapointQuery) + .size(); + int tariffImportDayAheadSize = + services + .getAssetDatapointService() + .queryDatapoints( + dayAheadAssetId, + EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), + assetDatapointQuery) + .size(); + + // Only update the historic data-point table if there are no day ahead tariffs present in the + // historic data-point table for current interval + if (tariffExportDayAheadSize == 0) { + List> tariffExport = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.TARIFF_EXPORT.getName(), + assetDatapointQuery); + services + .getAssetDatapointService() + .upsertValues( + dayAheadAssetId, EmsDayAheadAsset.TARIFF_EXPORT_DAY_AHEAD.getName(), tariffExport); + } + + if (tariffImportDayAheadSize == 0) { + List> tariffImport = + services + .getAssetPredictedDatapointService() + .queryDatapoints( + energyOptimisationAsset.getId(), + EmsEnergyOptimisationAsset.TARIFF_IMPORT.getName(), + assetDatapointQuery); + services + .getAssetDatapointService() + .upsertValues( + dayAheadAssetId, EmsDayAheadAsset.TARIFF_IMPORT_DAY_AHEAD.getName(), tariffImport); + } + + // Update the 'last update forecasts' datetime field with current update datetime + String lastUpdateForecastsNew = currentCollectDateTime.toString(); + services + .getAssetProcessingService() + .sendAttributeEvent( + new AttributeEvent( + dayAheadAssetId, + EmsDayAheadAsset.LAST_UPDATE_FORECASTS.getName(), + lastUpdateForecastsNew, + collectTimeStartMillis)); } + } - private record IndexedDatapoint(long timestamp, double value, int index) { - } + private record ChargeDischarge(double charge, double discharge) {} + + private record IndexedDatapoint(long timestamp, double value, int index) {} } diff --git a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/OptimisationMethod.java b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/OptimisationMethod.java index 6f6d0fa..30c485e 100644 --- a/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/OptimisationMethod.java +++ b/ems/src/main/java/org/openremote/extension/ems/manager/optimisationMethods/OptimisationMethod.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,12 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.optimisationMethods; import org.openremote.extension.ems.manager.Services; public interface OptimisationMethod { - void execute(String energyOptimisationAssetId, Services services); + void execute(String energyOptimisationAssetId, Services services); } diff --git a/ems/src/main/resources/ems/config/asset-types.json b/ems/src/main/resources/ems/config/asset-types.json index 1bc0ad4..3a1d7a6 100644 --- a/ems/src/main/resources/ems/config/asset-types.json +++ b/ems/src/main/resources/ems/config/asset-types.json @@ -13,9 +13,7 @@ "include": [] }, "attributes": { - "include": [ - "notes" - ] + "include": ["notes"] } }, { @@ -26,9 +24,7 @@ "include": [] }, "attributes": { - "include": [ - "location" - ], + "include": ["location"], "itemConfig": { "location": { "label": "" @@ -43,11 +39,7 @@ "include": [] }, "attributes": { - "include": [ - "disableOptimisationService", - "enableDetailedLogging", - "optimisationMethod" - ] + "include": ["disableOptimisationService", "enableDetailedLogging", "optimisationMethod"] } }, { @@ -89,12 +81,7 @@ "include": [] }, "attributes": { - "include": [ - "powerConsumption", - "powerFlexible", - "powerNet", - "powerProduction" - ] + "include": ["powerConsumption", "powerFlexible", "powerNet", "powerProduction"] } }, { @@ -104,10 +91,7 @@ "include": [] }, "attributes": { - "include": [ - "energyExportTotal", - "energyImportTotal" - ] + "include": ["energyExportTotal", "energyImportTotal"] } }, { @@ -117,10 +101,7 @@ "include": [] }, "attributes": { - "include": [ - "tariffExport", - "tariffImport" - ] + "include": ["tariffExport", "tariffImport"] } }, { @@ -143,10 +124,7 @@ "include": [] }, "attributes": { - "include": [ - "contractedEAN", - "redispatchEnabled" - ] + "include": ["contractedEAN", "redispatchEnabled"] } }, { diff --git a/ems/src/main/resources/ems/rules/EmsDemoSimulationRules.groovy b/ems/src/main/resources/ems/rules/EmsDemoSimulationRules.groovy index 91f4437..4ef8e67 100644 --- a/ems/src/main/resources/ems/rules/EmsDemoSimulationRules.groovy +++ b/ems/src/main/resources/ems/rules/EmsDemoSimulationRules.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package ems.rules import org.openremote.container.persistence.PersistenceService diff --git a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerEanTest.groovy b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerEanTest.groovy index 1452cf3..a21dedc 100644 --- a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerEanTest.groovy +++ b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerEanTest.groovy @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs diff --git a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerHttpTest.groovy b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerHttpTest.groovy index 095732b..6f209fc 100644 --- a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerHttpTest.groovy +++ b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerHttpTest.groovy @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs diff --git a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerTest.groovy b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerTest.groovy index f14046d..8755d01 100644 --- a/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerTest.groovy +++ b/ems/src/test/groovy/org/openremote/extension/ems/manager/gopacs/GOPACSHandlerTest.groovy @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.ems.manager.gopacs diff --git a/energy/build.gradle b/energy/build.gradle index a23da65..9b022e4 100644 --- a/energy/build.gradle +++ b/energy/build.gradle @@ -1,91 +1,91 @@ plugins { - id 'groovy' - id 'java-library' - id 'maven-publish' - id 'signing' + id 'groovy' + id 'java-library' + id 'maven-publish' + id 'signing' } base { - archivesName = "openremote-${project.name}-extension" + archivesName = "openremote-${project.name}-extension" } dependencies { - api libs.camelCoreModel - api libs.resteasyClientApi + api libs.camelCoreModel + api libs.resteasyClientApi - api libs.openremote.manager - api libs.openremote.model + api libs.openremote.manager + api libs.openremote.model - testImplementation libs.openremote.test + testImplementation libs.openremote.test } test {} jar { - from sourceSets.main.allJava + from sourceSets.main.allJava } javadoc { - failOnError = false + failOnError = false } java { - withJavadocJar() - withSourcesJar() + withJavadocJar() + withSourcesJar() } publishing { - publications { - maven(MavenPublication) { - group = "io.openremote.extension" - artifactId = "openremote-${project.name}-extension" - from components.java - pom { - name = 'OpenRemote energy extension' - description = 'Adds the energy domain extension' - url = 'https://github.com/openremote/extensions' - licenses { - license { - name = 'GNU Affero General Public License v3.0' - url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' - } - } - developers { - developer { - id = 'developers' - name = 'Developers' - email = 'developers@openremote.io' - organization = 'OpenRemote' - organizationUrl = 'https://openremote.io' - } - } - scm { - connection = 'scm:git:git://github.com/openremote/extensions.git' - developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' - url = 'https://github.com/openremote/extensions/tree/main' - } - } + publications { + maven(MavenPublication) { + group = "io.openremote.extension" + artifactId = "openremote-${project.name}-extension" + from components.java + pom { + name = 'OpenRemote energy extension' + description = 'Adds the energy domain extension' + url = 'https://github.com/openremote/extensions' + licenses { + license { + name = 'GNU Affero General Public License v3.0' + url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + } } + developers { + developer { + id = 'developers' + name = 'Developers' + email = 'developers@openremote.io' + organization = 'OpenRemote' + organizationUrl = 'https://openremote.io' + } + } + scm { + connection = 'scm:git:git://github.com/openremote/extensions.git' + developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' + url = 'https://github.com/openremote/extensions/tree/main' + } + } } + } - repositories { - maven { - if (!version.endsWith('-LOCAL')) { - credentials { - username = findProperty("publishUsername") - password = findProperty("publishPassword") - } - } - url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") + repositories { + maven { + if (!version.endsWith('-LOCAL')) { + credentials { + username = findProperty("publishUsername") + password = findProperty("publishPassword") } + } + url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") } + } } signing { - def signingKey = findProperty("signingKey") - def signingPassword = findProperty("signingPassword") - if (signingKey && signingPassword) { - useInMemoryPgpKeys(signingKey, signingPassword) - sign publishing.publications.maven - } + def signingKey = findProperty("signingKey") + def signingPassword = findProperty("signingPassword") + if (signingKey && signingPassword) { + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.maven + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimisationService.java b/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimisationService.java index bd1e75d..b51a2dc 100644 --- a/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimisationService.java +++ b/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimisationService.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,29 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.manager; +import static java.time.temporal.ChronoUnit.HOURS; +import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; +import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; +import static org.openremote.manager.gateway.GatewayService.isNotForGateway; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.apache.camel.builder.RouteBuilder; import org.openremote.container.message.MessageBrokerService; import org.openremote.container.timer.TimerService; @@ -55,929 +71,1369 @@ import org.openremote.model.util.ValueUtil; import org.openremote.model.value.MetaItemType; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static java.time.temporal.ChronoUnit.HOURS; -import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; -import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; -import static org.openremote.manager.gateway.GatewayService.isNotForGateway; - -/** - * Handles optimisation instances for {@link EnergyOptimisationAsset}. - */ +/** Handles optimisation instances for {@link EnergyOptimisationAsset}. */ public class EnergyOptimisationService extends RouteBuilder implements ContainerService { - protected static class OptimisationInstance { - EnergyOptimisationAsset optimisationAsset; - EnergyOptimiser energyOptimiser; - ScheduledFuture optimiserFuture; - - /** - * This keeps track of a theoretical energy level of storage assets. This is used to calculate - * the theoretical un-optimised costs. - */ - Map unoptimisedStorageAssetEnergyLevels = new HashMap<>(); - - public OptimisationInstance(EnergyOptimisationAsset optimisationAsset, EnergyOptimiser energyOptimiser, ScheduledFuture optimiserFuture) { - this.optimisationAsset = optimisationAsset; - this.energyOptimiser = energyOptimiser; - this.optimiserFuture = optimiserFuture; - } - } + protected static class OptimisationInstance { + EnergyOptimisationAsset optimisationAsset; + EnergyOptimiser energyOptimiser; + ScheduledFuture optimiserFuture; - protected static final Logger LOG = Logger.getLogger(EnergyOptimisationService.class.getName()); - protected static final int OPTIMISATION_TIMEOUT_MILLIS = 60000*10; // 10 mins - protected DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC)); - protected TimerService timerService; - protected AssetProcessingService assetProcessingService; - protected AssetStorageService assetStorageService; - protected AssetPredictedDatapointService assetPredictedDatapointService; - protected MessageBrokerService messageBrokerService; - protected ClientEventService clientEventService; - protected GatewayService gatewayService; - protected ExecutorService executorService; - protected ScheduledExecutorService scheduledExecutorService; - protected final Map assetOptimisationInstanceMap = new HashMap<>(); - protected List forceChargeAssetIds = new ArrayList<>(); - - @Override - public void init(Container container) throws Exception { - timerService = container.getService(TimerService.class); - assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); - assetProcessingService = container.getService(AssetProcessingService.class); - assetStorageService = container.getService(AssetStorageService.class); - messageBrokerService = container.getService(MessageBrokerService.class); - clientEventService = container.getService(ClientEventService.class); - gatewayService = container.getService(GatewayService.class); - executorService = container.getExecutor(); - scheduledExecutorService = container.getScheduledExecutor(); - } - - @Override - public void start(Container container) throws Exception { - container.getService(MessageBrokerService.class).getContext().addRoutes(this); - - // Load all enabled optimisation assets and instantiate an optimiser for each - LOG.fine("Loading optimisation assets..."); - - List energyOptimisationAssets = assetStorageService.findAll( - new AssetQuery() - .types(EnergyOptimisationAsset.class) - ) - .stream() + /** + * This keeps track of a theoretical energy level of storage assets. This is used to calculate + * the theoretical un-optimised costs. + */ + Map unoptimisedStorageAssetEnergyLevels = new HashMap<>(); + + public OptimisationInstance( + EnergyOptimisationAsset optimisationAsset, + EnergyOptimiser energyOptimiser, + ScheduledFuture optimiserFuture) { + this.optimisationAsset = optimisationAsset; + this.energyOptimiser = energyOptimiser; + this.optimiserFuture = optimiserFuture; + } + } + + protected static final Logger LOG = Logger.getLogger(EnergyOptimisationService.class.getName()); + protected static final int OPTIMISATION_TIMEOUT_MILLIS = 60000 * 10; // 10 mins + protected DateTimeFormatter formatter = + DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC)); + protected TimerService timerService; + protected AssetProcessingService assetProcessingService; + protected AssetStorageService assetStorageService; + protected AssetPredictedDatapointService assetPredictedDatapointService; + protected MessageBrokerService messageBrokerService; + protected ClientEventService clientEventService; + protected GatewayService gatewayService; + protected ExecutorService executorService; + protected ScheduledExecutorService scheduledExecutorService; + protected final Map assetOptimisationInstanceMap = new HashMap<>(); + protected List forceChargeAssetIds = new ArrayList<>(); + + @Override + public void init(Container container) throws Exception { + timerService = container.getService(TimerService.class); + assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); + assetProcessingService = container.getService(AssetProcessingService.class); + assetStorageService = container.getService(AssetStorageService.class); + messageBrokerService = container.getService(MessageBrokerService.class); + clientEventService = container.getService(ClientEventService.class); + gatewayService = container.getService(GatewayService.class); + executorService = container.getExecutor(); + scheduledExecutorService = container.getScheduledExecutor(); + } + + @Override + public void start(Container container) throws Exception { + container.getService(MessageBrokerService.class).getContext().addRoutes(this); + + // Load all enabled optimisation assets and instantiate an optimiser for each + LOG.fine("Loading optimisation assets..."); + + List energyOptimisationAssets = + assetStorageService.findAll(new AssetQuery().types(EnergyOptimisationAsset.class)).stream() .map(asset -> (EnergyOptimisationAsset) asset) .filter(optimisationAsset -> !optimisationAsset.isOptimisationDisabled().orElse(false)) .toList(); - LOG.fine("Found enabled optimisation asset count = " + energyOptimisationAssets.size()); - - energyOptimisationAssets.forEach(this::startOptimisation); - - clientEventService.addSubscription( - AttributeEvent.class, - null, - this::processAttributeEvent); + LOG.fine("Found enabled optimisation asset count = " + energyOptimisationAssets.size()); + + energyOptimisationAssets.forEach(this::startOptimisation); + + clientEventService.addSubscription(AttributeEvent.class, null, this::processAttributeEvent); + } + + @SuppressWarnings("unchecked") + @Override + public void configure() throws Exception { + from(PERSISTENCE_TOPIC) + .routeId("Persistence-EnergyOptimisation") + .filter(isPersistenceEventForEntityType(EnergyOptimisationAsset.class)) + .filter(isNotForGateway(gatewayService)) + .process( + exchange -> + processAssetChange( + (PersistenceEvent) + exchange.getIn().getBody(PersistenceEvent.class))); + } + + @Override + public void stop(Container container) throws Exception { + new ArrayList<>(assetOptimisationInstanceMap.keySet()).forEach(this::stopOptimisation); + } + + protected void processAssetChange(PersistenceEvent persistenceEvent) { + LOG.fine("Processing optimisation asset change: " + persistenceEvent); + stopOptimisation(persistenceEvent.getEntity().getId()); + + if (persistenceEvent.getCause() != PersistenceEvent.Cause.DELETE) { + if (!persistenceEvent.getEntity().isOptimisationDisabled().orElse(false)) { + startOptimisation(persistenceEvent.getEntity()); + } } + } - @SuppressWarnings("unchecked") - @Override - public void configure() throws Exception { - from(PERSISTENCE_TOPIC) - .routeId("Persistence-EnergyOptimisation") - .filter(isPersistenceEventForEntityType(EnergyOptimisationAsset.class)) - .filter(isNotForGateway(gatewayService)) - .process(exchange -> processAssetChange((PersistenceEvent) exchange.getIn().getBody(PersistenceEvent.class))); - } + protected void processAttributeEvent(AttributeEvent attributeEvent) { + OptimisationInstance optimisationInstance = + assetOptimisationInstanceMap.get(attributeEvent.getId()); - @Override - public void stop(Container container) throws Exception { - new ArrayList<>(assetOptimisationInstanceMap.keySet()) - .forEach(this::stopOptimisation); + if (optimisationInstance != null) { + processOptimisationAssetAttributeEvent(optimisationInstance, attributeEvent); + return; } - protected void processAssetChange(PersistenceEvent persistenceEvent) { - LOG.fine("Processing optimisation asset change: " + persistenceEvent); - stopOptimisation(persistenceEvent.getEntity().getId()); - - if (persistenceEvent.getCause() != PersistenceEvent.Cause.DELETE) { - if (!persistenceEvent.getEntity().isOptimisationDisabled().orElse(false)) { - startOptimisation(persistenceEvent.getEntity()); - } - } + String attributeName = attributeEvent.getName(); + + if ((attributeName.equals(ElectricityChargerAsset.VEHICLE_CONNECTED.getName()) + || attributeName.equals(ElectricVehicleAsset.CHARGER_CONNECTED.getName())) + && (Boolean) attributeEvent.getValue().orElse(false)) { + // Look for forced charge asset + if (forceChargeAssetIds.remove(attributeEvent.getId())) { + LOG.fine( + "Previously force charged asset has now been disconnected so clearing force charge flag: " + + attributeEvent.getId()); + } + return; } - protected void processAttributeEvent(AttributeEvent attributeEvent) { - OptimisationInstance optimisationInstance = assetOptimisationInstanceMap.get(attributeEvent.getId()); - - if (optimisationInstance != null) { - processOptimisationAssetAttributeEvent(optimisationInstance, attributeEvent); - return; - } + // Check for request to force charge + if (attributeName.equals(ElectricityStorageAsset.FORCE_CHARGE.getName())) { + Asset asset = assetStorageService.find(attributeEvent.getId()); + if (!(asset instanceof ElectricityStorageAsset)) { + LOG.fine( + "Request to force charge asset will be ignored as asset not found or is not of type '" + + ElectricityStorageAsset.class.getSimpleName() + + "': " + + attributeEvent.getId()); + return; + } - String attributeName = attributeEvent.getName(); + ElectricityStorageAsset storageAsset = (ElectricityStorageAsset) asset; - if ((attributeName.equals(ElectricityChargerAsset.VEHICLE_CONNECTED.getName()) || attributeName.equals(ElectricVehicleAsset.CHARGER_CONNECTED.getName())) - && (Boolean)attributeEvent.getValue().orElse(false)) { - // Look for forced charge asset - if (forceChargeAssetIds.remove(attributeEvent.getId())) { - LOG.fine("Previously force charged asset has now been disconnected so clearing force charge flag: " + attributeEvent.getId()); - } - return; - } + if (attributeEvent.getValue().orElse(null) == AttributeExecuteStatus.REQUEST_START) { - // Check for request to force charge - if (attributeName.equals(ElectricityStorageAsset.FORCE_CHARGE.getName())) { - Asset asset = assetStorageService.find(attributeEvent.getId()); - if (!(asset instanceof ElectricityStorageAsset)) { - LOG.fine("Request to force charge asset will be ignored as asset not found or is not of type '" + ElectricityStorageAsset.class.getSimpleName() + "': " + attributeEvent.getId()); - return; - } - - ElectricityStorageAsset storageAsset = (ElectricityStorageAsset) asset; - - if (attributeEvent.getValue().orElse(null) == AttributeExecuteStatus.REQUEST_START) { - - double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); - double maxEnergyLevel = getElectricityStorageAssetEnergyLevelMax(storageAsset); - double currentEnergyLevel = storageAsset.getEnergyLevel().orElse(0d); - LOG.fine("Request to force charge asset '" + attributeEvent.getId() + "': attempting to set powerSetpoint=" + powerImportMax); - - if (forceChargeAssetIds.contains(attributeEvent.getId())) { - LOG.fine("Request to force charge asset will be ignored as force charge already requested for asset: " + storageAsset); - return; - } - - if (currentEnergyLevel >= maxEnergyLevel) { - LOG.fine("Request to force charge asset will be ignored as asset is already at or above maxEnergyLevel: " + storageAsset); - return; - } - - forceChargeAssetIds.add(attributeEvent.getId()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(storageAsset.getId(), ElectricityAsset.POWER_SETPOINT, powerImportMax), getClass().getSimpleName()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(storageAsset.getId(), ElectricityStorageAsset.FORCE_CHARGE, AttributeExecuteStatus.RUNNING), getClass().getSimpleName()); - - } else if (attributeEvent.getValue().orElse(null) == AttributeExecuteStatus.REQUEST_CANCEL) { - - if (forceChargeAssetIds.remove(attributeEvent.getId())) { - LOG.info("Request to cancel force charge asset: " + storageAsset.getId()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(storageAsset.getId(), ElectricityAsset.POWER_SETPOINT, 0d), getClass().getSimpleName()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(storageAsset.getId(), ElectricityStorageAsset.FORCE_CHARGE, AttributeExecuteStatus.CANCELLED), getClass().getSimpleName()); - } - } + double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + double maxEnergyLevel = getElectricityStorageAssetEnergyLevelMax(storageAsset); + double currentEnergyLevel = storageAsset.getEnergyLevel().orElse(0d); + LOG.fine( + "Request to force charge asset '" + + attributeEvent.getId() + + "': attempting to set powerSetpoint=" + + powerImportMax); + + if (forceChargeAssetIds.contains(attributeEvent.getId())) { + LOG.fine( + "Request to force charge asset will be ignored as force charge already requested for asset: " + + storageAsset); + return; } - } - - protected double getElectricityStorageAssetEnergyLevelMax(ElectricityStorageAsset asset) { - double energyCapacity = asset.getEnergyCapacity().orElse(0d); - int maxEnergyLevelPercentage = asset.getEnergyLevelPercentageMax().orElse(100); - return energyCapacity * ((1d*maxEnergyLevelPercentage)/100d); - } - protected synchronized void processOptimisationAssetAttributeEvent(OptimisationInstance optimisationInstance, AttributeEvent attributeEvent) { - - if (EnergyOptimisationAsset.FINANCIAL_SAVING.getName().equals(attributeEvent.getName()) - || EnergyOptimisationAsset.CARBON_SAVING.getName().equals(attributeEvent.getName())) { - // These are updated by this service - return; + if (currentEnergyLevel >= maxEnergyLevel) { + LOG.fine( + "Request to force charge asset will be ignored as asset is already at or above maxEnergyLevel: " + + storageAsset); + return; } - - if (attributeEvent.getName().equals(EnergyOptimisationAsset.OPTIMISATION_DISABLED.getName())) { - boolean disabled = (Boolean)attributeEvent.getValue().orElse(false); - if (!disabled && assetOptimisationInstanceMap.containsKey(optimisationInstance.optimisationAsset.getId())) { - // Nothing to do here - return; - } else if (disabled && !assetOptimisationInstanceMap.containsKey(optimisationInstance.optimisationAsset.getId())) { - // Nothing to do here - return; - } + forceChargeAssetIds.add(attributeEvent.getId()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + storageAsset.getId(), ElectricityAsset.POWER_SETPOINT, powerImportMax), + getClass().getSimpleName()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + storageAsset.getId(), + ElectricityStorageAsset.FORCE_CHARGE, + AttributeExecuteStatus.RUNNING), + getClass().getSimpleName()); + + } else if (attributeEvent.getValue().orElse(null) + == AttributeExecuteStatus.REQUEST_CANCEL) { + + if (forceChargeAssetIds.remove(attributeEvent.getId())) { + LOG.info("Request to cancel force charge asset: " + storageAsset.getId()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent(storageAsset.getId(), ElectricityAsset.POWER_SETPOINT, 0d), + getClass().getSimpleName()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + storageAsset.getId(), + ElectricityStorageAsset.FORCE_CHARGE, + AttributeExecuteStatus.CANCELLED), + getClass().getSimpleName()); } + } + } + } - LOG.info("Processing optimisation asset attribute event: " + attributeEvent); - stopOptimisation(attributeEvent.getId()); + protected double getElectricityStorageAssetEnergyLevelMax(ElectricityStorageAsset asset) { + double energyCapacity = asset.getEnergyCapacity().orElse(0d); + int maxEnergyLevelPercentage = asset.getEnergyLevelPercentageMax().orElse(100); + return energyCapacity * ((1d * maxEnergyLevelPercentage) / 100d); + } - // Get latest asset from storage - EnergyOptimisationAsset asset = (EnergyOptimisationAsset) assetStorageService.find(attributeEvent.getId()); + protected synchronized void processOptimisationAssetAttributeEvent( + OptimisationInstance optimisationInstance, AttributeEvent attributeEvent) { - if (asset != null && !asset.isOptimisationDisabled().orElse(false)) { - startOptimisation(asset); - } + if (EnergyOptimisationAsset.FINANCIAL_SAVING.getName().equals(attributeEvent.getName()) + || EnergyOptimisationAsset.CARBON_SAVING.getName().equals(attributeEvent.getName())) { + // These are updated by this service + return; } - protected synchronized void startOptimisation(EnergyOptimisationAsset optimisationAsset) { - LOG.fine("Initialising optimiser for optimisation asset: " + optimisationAsset); - double intervalSize = optimisationAsset.getIntervalSize().orElse(0.25d); - int financialWeighting = optimisationAsset.getFinancialWeighting().orElse(100); + if (attributeEvent.getName().equals(EnergyOptimisationAsset.OPTIMISATION_DISABLED.getName())) { + boolean disabled = (Boolean) attributeEvent.getValue().orElse(false); + if (!disabled + && assetOptimisationInstanceMap.containsKey( + optimisationInstance.optimisationAsset.getId())) { + // Nothing to do here + return; + } else if (disabled + && !assetOptimisationInstanceMap.containsKey( + optimisationInstance.optimisationAsset.getId())) { + // Nothing to do here + return; + } + } - try { - EnergyOptimiser optimiser = new EnergyOptimiser(intervalSize, ((double) financialWeighting) / 100); + LOG.info("Processing optimisation asset attribute event: " + attributeEvent); + stopOptimisation(attributeEvent.getId()); - long periodSeconds = (long) (optimiser.intervalSize * 60 * 60); + // Get latest asset from storage + EnergyOptimisationAsset asset = + (EnergyOptimisationAsset) assetStorageService.find(attributeEvent.getId()); - if (periodSeconds < 300) { - throw new IllegalStateException("Optimiser interval size is too small (minimum is 5 mins) for asset: " + optimisationAsset.getId()); + if (asset != null && !asset.isOptimisationDisabled().orElse(false)) { + startOptimisation(asset); + } + } + + protected synchronized void startOptimisation(EnergyOptimisationAsset optimisationAsset) { + LOG.fine("Initialising optimiser for optimisation asset: " + optimisationAsset); + double intervalSize = optimisationAsset.getIntervalSize().orElse(0.25d); + int financialWeighting = optimisationAsset.getFinancialWeighting().orElse(100); + + try { + EnergyOptimiser optimiser = + new EnergyOptimiser(intervalSize, ((double) financialWeighting) / 100); + + long periodSeconds = (long) (optimiser.intervalSize * 60 * 60); + + if (periodSeconds < 300) { + throw new IllegalStateException( + "Optimiser interval size is too small (minimum is 5 mins) for asset: " + + optimisationAsset.getId()); + } + + long currentMillis = timerService.getCurrentTimeMillis(); + Instant optimisationStartTime = getOptimisationStartTime(currentMillis, periodSeconds); + + // Schedule subsequent runs + long offsetSeconds = (long) (Math.random() * 30) + periodSeconds; + Duration startDuration = + Duration.between( + Instant.ofEpochMilli(currentMillis), + optimisationStartTime.plus(offsetSeconds, ChronoUnit.SECONDS)); + + ScheduledFuture optimisationFuture = + scheduleOptimisation(optimisationAsset.getId(), optimiser, startDuration, periodSeconds); + assetOptimisationInstanceMap.put( + optimisationAsset.getId(), + new OptimisationInstance(optimisationAsset, optimiser, optimisationFuture)); + + // Execute first optimisation at the period that started previous to now + LOG.finest( + getLogPrefix(optimisationAsset.getId()) + + "Running first optimisation for time '" + + formatter.format(optimisationStartTime)); + + executorService.execute( + () -> { + try { + runOptimisation(optimisationAsset.getId(), optimisationStartTime); + } catch (Exception e) { + LOG.log( + Level.SEVERE, + "Failed to run energy optimiser for asset: " + optimisationAsset.getId(), + e); } - - long currentMillis = timerService.getCurrentTimeMillis(); - Instant optimisationStartTime = getOptimisationStartTime(currentMillis, periodSeconds); - - // Schedule subsequent runs - long offsetSeconds = (long) (Math.random() * 30) + periodSeconds; - Duration startDuration = Duration.between(Instant.ofEpochMilli(currentMillis), optimisationStartTime.plus(offsetSeconds, ChronoUnit.SECONDS)); - - ScheduledFuture optimisationFuture = scheduleOptimisation(optimisationAsset.getId(), optimiser, startDuration, periodSeconds); - assetOptimisationInstanceMap.put(optimisationAsset.getId(), new OptimisationInstance(optimisationAsset, optimiser, optimisationFuture)); - - // Execute first optimisation at the period that started previous to now - LOG.finest(getLogPrefix(optimisationAsset.getId()) + "Running first optimisation for time '" + formatter.format(optimisationStartTime)); - - executorService.execute(() -> { - try { - runOptimisation(optimisationAsset.getId(), optimisationStartTime); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to run energy optimiser for asset: " + optimisationAsset.getId(), e); - } - }); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to start energy optimiser for asset: " + optimisationAsset, e); - } + }); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Failed to start energy optimiser for asset: " + optimisationAsset, e); } + } - protected synchronized void stopOptimisation(String optimisationAssetId) { - OptimisationInstance optimisationInstance = assetOptimisationInstanceMap.remove(optimisationAssetId); - - if (optimisationInstance == null || optimisationInstance.optimiserFuture == null) { - return; - } + protected synchronized void stopOptimisation(String optimisationAssetId) { + OptimisationInstance optimisationInstance = + assetOptimisationInstanceMap.remove(optimisationAssetId); - LOG.fine("Removing optimiser for optimisation asset: " + optimisationAssetId); - optimisationInstance.optimiserFuture.cancel(false); + if (optimisationInstance == null || optimisationInstance.optimiserFuture == null) { + return; } - - /** - * Schedules execution of the optimiser at the start of the interval window with up to 30s of offset randomness - * added so that multiple optimisers don't all run at exactly the same instance; the interval execution times are - * calculated relative to the hour. e.g. a 0.25h intervalSize (15min) would execute at NN:00+offset, NN:15+offset, - * NN:30+offset, NN:45+offset...It is important that intervals coincide with any change in supplier tariff so that - * the optimisation works effectively. - */ - protected ScheduledFuture scheduleOptimisation(String optimisationAssetId, EnergyOptimiser optimiser, Duration startDuration, long periodSeconds) throws IllegalStateException { - - if (optimiser == null) { - throw new IllegalStateException("Optimiser instance not found for asset: " + optimisationAssetId); - } - - return scheduledExecutorService.scheduleAtFixedRate(() -> { - try { - runOptimisation(optimisationAssetId, Instant.ofEpochMilli(timerService.getCurrentTimeMillis()).truncatedTo(ChronoUnit.MINUTES)); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Failed to run energy optimiser for asset: " + optimisationAssetId, e); - } - }, - startDuration.getSeconds(), - periodSeconds, - TimeUnit.SECONDS); + LOG.fine("Removing optimiser for optimisation asset: " + optimisationAssetId); + optimisationInstance.optimiserFuture.cancel(false); + } + + /** + * Schedules execution of the optimiser at the start of the interval window with up to 30s of + * offset randomness added so that multiple optimisers don't all run at exactly the same instance; + * the interval execution times are calculated relative to the hour. e.g. a 0.25h intervalSize + * (15min) would execute at NN:00+offset, NN:15+offset, NN:30+offset, NN:45+offset...It is + * important that intervals coincide with any change in supplier tariff so that the optimisation + * works effectively. + */ + protected ScheduledFuture scheduleOptimisation( + String optimisationAssetId, + EnergyOptimiser optimiser, + Duration startDuration, + long periodSeconds) + throws IllegalStateException { + + if (optimiser == null) { + throw new IllegalStateException( + "Optimiser instance not found for asset: " + optimisationAssetId); } - /** - * Gets the start time of the interval that the currentMillis value is within - */ - protected static Instant getOptimisationStartTime(long currentMillis, long periodSeconds) { - Instant now = Instant.ofEpochMilli(currentMillis); - - Instant optimisationStartTime = now - .truncatedTo(ChronoUnit.DAYS); - - while (optimisationStartTime.isBefore(now)) { - optimisationStartTime = optimisationStartTime.plus(periodSeconds, ChronoUnit.SECONDS); - } - - // Move to one period before - return optimisationStartTime.minus(periodSeconds, ChronoUnit.SECONDS); + return scheduledExecutorService.scheduleAtFixedRate( + () -> { + try { + runOptimisation( + optimisationAssetId, + Instant.ofEpochMilli(timerService.getCurrentTimeMillis()) + .truncatedTo(ChronoUnit.MINUTES)); + } catch (Exception e) { + LOG.log( + Level.SEVERE, + "Failed to run energy optimiser for asset: " + optimisationAssetId, + e); + } + }, + startDuration.getSeconds(), + periodSeconds, + TimeUnit.SECONDS); + } + + /** Gets the start time of the interval that the currentMillis value is within */ + protected static Instant getOptimisationStartTime(long currentMillis, long periodSeconds) { + Instant now = Instant.ofEpochMilli(currentMillis); + + Instant optimisationStartTime = now.truncatedTo(ChronoUnit.DAYS); + + while (optimisationStartTime.isBefore(now)) { + optimisationStartTime = optimisationStartTime.plus(periodSeconds, ChronoUnit.SECONDS); } - protected String getLogPrefix(String optimisationAssetId) { - return "Optimisation '" + optimisationAssetId + "': "; + // Move to one period before + return optimisationStartTime.minus(periodSeconds, ChronoUnit.SECONDS); + } + + protected String getLogPrefix(String optimisationAssetId) { + return "Optimisation '" + optimisationAssetId + "': "; + } + + protected void checkTimeoutAndThrow(String optimisationAssetId, long startTimeMillis) + throws TimeoutException { + long runtime = timerService.getCurrentTimeMillis() - startTimeMillis; + if (runtime > OPTIMISATION_TIMEOUT_MILLIS) { + String logMsg = + getLogPrefix(optimisationAssetId) + + "Optimisation has been running for " + + runtime + + "ms, timeout is at " + + OPTIMISATION_TIMEOUT_MILLIS + + "ms"; + LOG.warning(logMsg); + throw new TimeoutException(logMsg); } - - protected void checkTimeoutAndThrow(String optimisationAssetId, long startTimeMillis) throws TimeoutException { - long runtime = timerService.getCurrentTimeMillis() - startTimeMillis; - if (runtime > OPTIMISATION_TIMEOUT_MILLIS) { - String logMsg = getLogPrefix(optimisationAssetId) + "Optimisation has been running for " + runtime + "ms, timeout is at " + OPTIMISATION_TIMEOUT_MILLIS + "ms"; - LOG.warning(logMsg); - throw new TimeoutException(logMsg); - } + } + + /** + * Runs the optimisation routine for the specified time; it is important that this method does not + * throw an exception as it will cancel the scheduled task thus stopping future optimisations. + */ + protected void runOptimisation(String optimisationAssetId, Instant optimisationTime) + throws Exception { + OptimisationInstance optimisationInstance = + assetOptimisationInstanceMap.get(optimisationAssetId); + + if (optimisationInstance == null) { + return; } - /** - * Runs the optimisation routine for the specified time; it is important that this method does not throw an - * exception as it will cancel the scheduled task thus stopping future optimisations. - */ - protected void runOptimisation(String optimisationAssetId, Instant optimisationTime) throws Exception { - OptimisationInstance optimisationInstance = assetOptimisationInstanceMap.get(optimisationAssetId); - - if (optimisationInstance == null) { - return; - } - - LOG.finest(getLogPrefix(optimisationAssetId) + "Running for time '" + formatter.format(optimisationTime)); - - long startTimeMillis = timerService.getCurrentTimeMillis(); - EnergyOptimiser optimiser = optimisationInstance.energyOptimiser; - int intervalCount = optimiser.get24HourIntervalCount(); - double intervalSize = optimiser.getIntervalSize(); - - LOG.finest(getLogPrefix(optimisationAssetId) + "Fetching child assets of type '" + ElectricitySupplierAsset.class.getSimpleName() + "'"); - - List supplierAssets = assetStorageService.findAll( + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Running for time '" + + formatter.format(optimisationTime)); + + long startTimeMillis = timerService.getCurrentTimeMillis(); + EnergyOptimiser optimiser = optimisationInstance.energyOptimiser; + int intervalCount = optimiser.get24HourIntervalCount(); + double intervalSize = optimiser.getIntervalSize(); + + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Fetching child assets of type '" + + ElectricitySupplierAsset.class.getSimpleName() + + "'"); + + List supplierAssets = + assetStorageService + .findAll( new AssetQuery() .types(ElectricitySupplierAsset.class) .recursive(true) - .parents(optimisationAssetId) - ).stream() + .parents(optimisationAssetId)) + .stream() .filter(asset -> asset.hasAttribute(ElectricitySupplierAsset.TARIFF_IMPORT)) - .map(asset -> (ElectricitySupplierAsset) asset).toList(); + .map(asset -> (ElectricitySupplierAsset) asset) + .toList(); - if (supplierAssets.size() != 1) { - LOG.warning(getLogPrefix(optimisationAssetId) + "Expected exactly one " + ElectricitySupplierAsset.class.getSimpleName() + " asset with a '" + ElectricitySupplierAsset.TARIFF_IMPORT.getName() + "' attribute but found: " + supplierAssets.size()); - return; - } + if (supplierAssets.size() != 1) { + LOG.warning( + getLogPrefix(optimisationAssetId) + + "Expected exactly one " + + ElectricitySupplierAsset.class.getSimpleName() + + " asset with a '" + + ElectricitySupplierAsset.TARIFF_IMPORT.getName() + + "' attribute but found: " + + supplierAssets.size()); + return; + } - double[] powerNets = new double[intervalCount]; - ElectricitySupplierAsset supplierAsset = supplierAssets.getFirst(); + double[] powerNets = new double[intervalCount]; + ElectricitySupplierAsset supplierAsset = supplierAssets.getFirst(); - if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Found child asset of type '" + ElectricitySupplierAsset.class.getSimpleName() + "': " + supplierAsset); - } + if (LOG.isLoggable(Level.FINEST)) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Found child asset of type '" + + ElectricitySupplierAsset.class.getSimpleName() + + "': " + + supplierAsset); + } - // Do some basic validation - if (supplierAsset.getTariffImport().isPresent()) { - LOG.warning(getLogPrefix(optimisationAssetId) + ElectricitySupplierAsset.class.getSimpleName() + " asset '" + ElectricitySupplierAsset.TARIFF_IMPORT.getName() + "' attribute has no value"); - } + // Do some basic validation + if (supplierAsset.getTariffImport().isPresent()) { + LOG.warning( + getLogPrefix(optimisationAssetId) + + ElectricitySupplierAsset.class.getSimpleName() + + " asset '" + + ElectricitySupplierAsset.TARIFF_IMPORT.getName() + + "' attribute has no value"); + } - LOG.finest(getLogPrefix(optimisationAssetId) + "Fetching optimisable child assets of type '" + ElectricityStorageAsset.class.getSimpleName() + "'"); + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Fetching optimisable child assets of type '" + + ElectricityStorageAsset.class.getSimpleName() + + "'"); - List optimisableStorageAssets = assetStorageService.findAll( - new AssetQuery() - .recursive(true) - .parents(optimisationAssetId) - .types(ElectricityStorageAsset.class) - .attributes( - new LogicGroup<>( - LogicGroup.Operator.AND, - Collections.singletonList(new LogicGroup<>( - LogicGroup.Operator.OR, - new AttributePredicate(ElectricityStorageAsset.SUPPORTS_IMPORT.getName(), new BooleanPredicate(true)), - new AttributePredicate(ElectricityStorageAsset.SUPPORTS_EXPORT.getName(), new BooleanPredicate(true)) - )), - new AttributePredicate().name(new StringPredicate(ElectricityAsset.POWER_SETPOINT.getName()))) - ) - ) + List optimisableStorageAssets = + assetStorageService + .findAll( + new AssetQuery() + .recursive(true) + .parents(optimisationAssetId) + .types(ElectricityStorageAsset.class) + .attributes( + new LogicGroup<>( + LogicGroup.Operator.AND, + Collections.singletonList( + new LogicGroup<>( + LogicGroup.Operator.OR, + new AttributePredicate( + ElectricityStorageAsset.SUPPORTS_IMPORT.getName(), + new BooleanPredicate(true)), + new AttributePredicate( + ElectricityStorageAsset.SUPPORTS_EXPORT.getName(), + new BooleanPredicate(true)))), + new AttributePredicate() + .name( + new StringPredicate( + ElectricityAsset.POWER_SETPOINT.getName()))))) .stream() - .map(asset -> (ElectricityStorageAsset)asset) + .map(asset -> (ElectricityStorageAsset) asset) .collect(Collectors.toList()); - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); - List finalOptimisableStorageAssets = optimisableStorageAssets; - optimisableStorageAssets = optimisableStorageAssets - .stream() - .filter(asset -> { + List finalOptimisableStorageAssets = optimisableStorageAssets; + optimisableStorageAssets = + optimisableStorageAssets.stream() + .filter( + asset -> { - // Exclude force charged assets (so we don't mess with the setpoint) - if (forceChargeAssetIds.contains(asset.getId())) { - LOG.finest("Optimisable asset was requested to force charge so it won't be optimised: " + asset.getId()); + // Exclude force charged assets (so we don't mess with the setpoint) + if (forceChargeAssetIds.contains(asset.getId())) { + LOG.finest( + "Optimisable asset was requested to force charge so it won't be optimised: " + + asset.getId()); @SuppressWarnings("OptionalGetWithoutIsPresent") - Attribute powerAttribute = asset.getAttribute(ElectricityAsset.POWER).get(); - double[] powerLevels = get24HAttributeValues(asset.getId(), powerAttribute, optimiser.getIntervalSize(), intervalCount, optimisationTime); + Attribute powerAttribute = + asset.getAttribute(ElectricityAsset.POWER).get(); + double[] powerLevels = + get24HAttributeValues( + asset.getId(), + powerAttribute, + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); IntStream.range(0, intervalCount).forEach(i -> powerNets[i] += powerLevels[i]); double currentEnergyLevel = asset.getEnergyLevel().orElse(0d); double maxEnergyLevel = getElectricityStorageAssetEnergyLevelMax(asset); if (currentEnergyLevel >= maxEnergyLevel) { - LOG.info("Force charged asset has reached maxEnergyLevelPercentage so stopping charging: " + asset.getId()); - forceChargeAssetIds.remove(asset.getId()); - assetProcessingService.sendAttributeEvent( - new AttributeEvent(asset.getId(), ElectricityStorageAsset.POWER_SETPOINT, 0d), - getClass().getSimpleName()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(asset.getId(), ElectricityStorageAsset.FORCE_CHARGE, AttributeExecuteStatus.COMPLETED), getClass().getSimpleName()); + LOG.info( + "Force charged asset has reached maxEnergyLevelPercentage so stopping charging: " + + asset.getId()); + forceChargeAssetIds.remove(asset.getId()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + asset.getId(), ElectricityStorageAsset.POWER_SETPOINT, 0d), + getClass().getSimpleName()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + asset.getId(), + ElectricityStorageAsset.FORCE_CHARGE, + AttributeExecuteStatus.COMPLETED), + getClass().getSimpleName()); } return false; - } + } - if (asset instanceof ElectricityChargerAsset) { + if (asset instanceof ElectricityChargerAsset) { // Check if it has a child vehicle asset return finalOptimisableStorageAssets.stream() - .noneMatch(a -> { - if (a instanceof ElectricVehicleAsset && a.getParentId().equals(asset.getId())) { + .noneMatch( + a -> { + if (a instanceof ElectricVehicleAsset + && a.getParentId().equals(asset.getId())) { // Take the lowest power max from vehicle or charger - double vehiclePowerImportMax = a.getPowerImportMax().orElse(Double.MAX_VALUE); - double vehiclePowerExportMax = a.getPowerExportMax().orElse(Double.MAX_VALUE); - double chargerPowerImportMax = asset.getPowerImportMax().orElse(Double.MAX_VALUE); - double chargerPowerExportMax = asset.getPowerExportMax().orElse(Double.MAX_VALUE); - double smallestPowerImportMax = Math.min(vehiclePowerImportMax, chargerPowerImportMax); - double smallestPowerExportMax = Math.min(vehiclePowerExportMax, chargerPowerExportMax); + double vehiclePowerImportMax = + a.getPowerImportMax().orElse(Double.MAX_VALUE); + double vehiclePowerExportMax = + a.getPowerExportMax().orElse(Double.MAX_VALUE); + double chargerPowerImportMax = + asset.getPowerImportMax().orElse(Double.MAX_VALUE); + double chargerPowerExportMax = + asset.getPowerExportMax().orElse(Double.MAX_VALUE); + double smallestPowerImportMax = + Math.min(vehiclePowerImportMax, chargerPowerImportMax); + double smallestPowerExportMax = + Math.min(vehiclePowerExportMax, chargerPowerExportMax); if (smallestPowerImportMax < vehiclePowerImportMax) { - LOG.fine("Reducing vehicle power import max due to connected charger limit: vehicle=" + a.getId() + ", oldPowerImportMax=" + vehiclePowerImportMax + ", newPowerImportMax=" + smallestPowerImportMax); - a.setPowerImportMax(smallestPowerImportMax); + LOG.fine( + "Reducing vehicle power import max due to connected charger limit: vehicle=" + + a.getId() + + ", oldPowerImportMax=" + + vehiclePowerImportMax + + ", newPowerImportMax=" + + smallestPowerImportMax); + a.setPowerImportMax(smallestPowerImportMax); } if (smallestPowerExportMax < vehiclePowerExportMax) { - LOG.fine("Reducing vehicle power Export max due to connected charger limit: vehicle=" + a.getId() + ", oldPowerExportMax=" + vehiclePowerExportMax + ", newPowerExportMax=" + smallestPowerExportMax); - a.setPowerExportMax(smallestPowerExportMax); + LOG.fine( + "Reducing vehicle power Export max due to connected charger limit: vehicle=" + + a.getId() + + ", oldPowerExportMax=" + + vehiclePowerExportMax + + ", newPowerExportMax=" + + smallestPowerExportMax); + a.setPowerExportMax(smallestPowerExportMax); } - LOG.finest("Excluding charger from optimisable assets and child vehicle will be used instead: " + asset.getId()); + LOG.finest( + "Excluding charger from optimisable assets and child vehicle will be used instead: " + + asset.getId()); return true; - } - return false; - }); - } - return true; - }) - .sorted(Comparator.comparingInt(asset -> asset.getEnergyLevelSchedule().map(schedule -> 0).orElse(1))) + } + return false; + }); + } + return true; + }) + .sorted( + Comparator.comparingInt( + asset -> asset.getEnergyLevelSchedule().map(schedule -> 0).orElse(1))) .collect(Collectors.toList()); - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); - - if (optimisableStorageAssets.isEmpty()) { - LOG.warning(getLogPrefix(optimisationAssetId) + "Expected at least one optimisable '" + ElectricityStorageAsset.class.getSimpleName() + " asset with a '" + ElectricityAsset.POWER_SETPOINT.getName() + "' attribute but found none"); - return; - } - - if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Found optimisable child assets of type '" + ElectricityStorageAsset.class.getSimpleName() + "': " + optimisableStorageAssets.stream().map(Asset::getId).collect(Collectors.joining(", "))); - } + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + + if (optimisableStorageAssets.isEmpty()) { + LOG.warning( + getLogPrefix(optimisationAssetId) + + "Expected at least one optimisable '" + + ElectricityStorageAsset.class.getSimpleName() + + " asset with a '" + + ElectricityAsset.POWER_SETPOINT.getName() + + "' attribute but found none"); + return; + } - LOG.finest(getLogPrefix(optimisationAssetId) + "Fetching plain consumer and producer child assets of type '" + ElectricityProducerAsset.class.getSimpleName() + "', '" + ElectricityConsumerAsset.class.getSimpleName() + "', '" + ElectricityStorageAsset.class.getSimpleName() + "'"); + if (LOG.isLoggable(Level.FINEST)) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Found optimisable child assets of type '" + + ElectricityStorageAsset.class.getSimpleName() + + "': " + + optimisableStorageAssets.stream() + .map(Asset::getId) + .collect(Collectors.joining(", "))); + } - AtomicInteger count = new AtomicInteger(0); - assetStorageService.findAll( + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Fetching plain consumer and producer child assets of type '" + + ElectricityProducerAsset.class.getSimpleName() + + "', '" + + ElectricityConsumerAsset.class.getSimpleName() + + "', '" + + ElectricityStorageAsset.class.getSimpleName() + + "'"); + + AtomicInteger count = new AtomicInteger(0); + assetStorageService + .findAll( new AssetQuery() .recursive(true) .parents(optimisationAssetId) .types(ElectricityConsumerAsset.class, ElectricityProducerAsset.class) - .attributes(new AttributePredicate().name(new StringPredicate(ElectricityAsset.POWER.getName()))) - ) - //.stream() - //.filter(asset -> !(asset instanceof GroupAsset) || isElectricityGroupAsset(asset)) - .forEach(asset -> { - @SuppressWarnings("OptionalGetWithoutIsPresent") - Attribute powerAttribute = asset.getAttribute(ElectricityAsset.POWER).get(); - double[] powerLevels = get24HAttributeValues(asset.getId(), powerAttribute, optimiser.getIntervalSize(), intervalCount, optimisationTime); - IntStream.range(0, intervalCount).forEach(i -> powerNets[i] += powerLevels[i]); - count.incrementAndGet(); + .attributes( + new AttributePredicate() + .name(new StringPredicate(ElectricityAsset.POWER.getName())))) + // .stream() + // .filter(asset -> !(asset instanceof GroupAsset) || isElectricityGroupAsset(asset)) + .forEach( + asset -> { + @SuppressWarnings("OptionalGetWithoutIsPresent") + Attribute powerAttribute = asset.getAttribute(ElectricityAsset.POWER).get(); + double[] powerLevels = + get24HAttributeValues( + asset.getId(), + powerAttribute, + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + IntStream.range(0, intervalCount).forEach(i -> powerNets[i] += powerLevels[i]); + count.incrementAndGet(); }); - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); - // Get power of storage assets that don't support neither import or export (treat them as plain consumers/producers) - List plainStorageAssets = assetStorageService.findAll( + // Get power of storage assets that don't support neither import or export (treat them as plain + // consumers/producers) + List plainStorageAssets = + assetStorageService + .findAll( new AssetQuery() .recursive(true) .parents(optimisationAssetId) .types(ElectricityStorageAsset.class) .attributes( - new AttributePredicate().name(new StringPredicate(ElectricityAsset.POWER.getName())), - new AttributePredicate(ElectricityStorageAsset.SUPPORTS_IMPORT.getName(), new BooleanPredicate(true), true, null), - new AttributePredicate(ElectricityStorageAsset.SUPPORTS_EXPORT.getName(), new BooleanPredicate(true), true, null) - ) - ) + new AttributePredicate() + .name(new StringPredicate(ElectricityAsset.POWER.getName())), + new AttributePredicate( + ElectricityStorageAsset.SUPPORTS_IMPORT.getName(), + new BooleanPredicate(true), + true, + null), + new AttributePredicate( + ElectricityStorageAsset.SUPPORTS_EXPORT.getName(), + new BooleanPredicate(true), + true, + null))) .stream() - .map(asset -> (ElectricityStorageAsset) asset).toList(); - - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + .map(asset -> (ElectricityStorageAsset) asset) + .toList(); - // Exclude chargers with a power value != 0 and a child vehicle with a power value != 0 (avoid double counting - vehicle takes priority) - plainStorageAssets - .stream() - .filter(asset -> { - if (asset instanceof ElectricityChargerAsset) { - // Check if it has a child vehicle asset also check optimisable assets as child vehicle could be in there - return plainStorageAssets.stream() - .noneMatch(a -> { - if (a instanceof ElectricVehicleAsset && a.getParentId().equals(asset.getId())) { - LOG.finest("Excluding charger from plain consumer/producer calculations to avoid double counting power: " + asset.getId()); + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + + // Exclude chargers with a power value != 0 and a child vehicle with a power value != 0 (avoid + // double counting - vehicle takes priority) + plainStorageAssets.stream() + .filter( + asset -> { + if (asset instanceof ElectricityChargerAsset) { + // Check if it has a child vehicle asset also check optimisable assets as child + // vehicle could be in there + return plainStorageAssets.stream() + .noneMatch( + a -> { + if (a instanceof ElectricVehicleAsset + && a.getParentId().equals(asset.getId())) { + LOG.finest( + "Excluding charger from plain consumer/producer calculations to avoid double counting power: " + + asset.getId()); return true; - } - return false; - }) && finalOptimisableStorageAssets.stream() - .noneMatch(a -> { - if (a instanceof ElectricVehicleAsset && a.getParentId().equals(asset.getId())) { - LOG.finest("Excluding charger from plain consumer/producer calculations to avoid double counting power: " + asset.getId()); + } + return false; + }) + && finalOptimisableStorageAssets.stream() + .noneMatch( + a -> { + if (a instanceof ElectricVehicleAsset + && a.getParentId().equals(asset.getId())) { + LOG.finest( + "Excluding charger from plain consumer/producer calculations to avoid double counting power: " + + asset.getId()); return true; - } - return false; - }); - } - return true; + } + return false; + }); + } + return true; }) - .forEach(asset -> { - @SuppressWarnings("OptionalGetWithoutIsPresent") - Attribute powerAttribute = asset.getAttribute(ElectricityAsset.POWER).get(); - double[] powerLevels = get24HAttributeValues(asset.getId(), powerAttribute, optimiser.getIntervalSize(), intervalCount, optimisationTime); - IntStream.range(0, intervalCount).forEach(i -> powerNets[i] += powerLevels[i]); - count.incrementAndGet(); + .forEach( + asset -> { + @SuppressWarnings("OptionalGetWithoutIsPresent") + Attribute powerAttribute = asset.getAttribute(ElectricityAsset.POWER).get(); + double[] powerLevels = + get24HAttributeValues( + asset.getId(), + powerAttribute, + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + IntStream.range(0, intervalCount).forEach(i -> powerNets[i] += powerLevels[i]); + count.incrementAndGet(); }); - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); - if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Found plain consumer and producer child assets count=" + count.get()); - LOG.finest("Calculated net power of consumers and producers: " + Arrays.toString(powerNets)); - } - - // Get supplier costs for each interval - double financialWeightingImport = optimiser.getFinancialWeighting(); - double financialWeightingExport = optimiser.getFinancialWeighting(); - - if (financialWeightingImport < 1d && !supplierAsset.getCarbonImport().isPresent()) { - financialWeightingImport = 1d; - } + if (LOG.isLoggable(Level.FINEST)) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Found plain consumer and producer child assets count=" + + count.get()); + LOG.finest("Calculated net power of consumers and producers: " + Arrays.toString(powerNets)); + } - if (financialWeightingExport < 1d && !supplierAsset.getCarbonExport().isPresent()) { - financialWeightingExport = 1d; - } + // Get supplier costs for each interval + double financialWeightingImport = optimiser.getFinancialWeighting(); + double financialWeightingExport = optimiser.getFinancialWeighting(); - double[] costsImport = get24HAttributeValues(supplierAsset.getId(), supplierAsset.getAttribute(ElectricitySupplierAsset.TARIFF_IMPORT).orElse(null), optimiser.getIntervalSize(), intervalCount, optimisationTime); - double[] costsExport = get24HAttributeValues(supplierAsset.getId(), supplierAsset.getAttribute(ElectricitySupplierAsset.TARIFF_EXPORT).orElse(null), optimiser.getIntervalSize(), intervalCount, optimisationTime); + if (financialWeightingImport < 1d && !supplierAsset.getCarbonImport().isPresent()) { + financialWeightingImport = 1d; + } - if (financialWeightingImport < 1d || financialWeightingExport < 1d) { - double[] carbonImport = get24HAttributeValues(supplierAsset.getId(), supplierAsset.getAttribute(ElectricitySupplierAsset.CARBON_IMPORT).orElse(null), optimiser.getIntervalSize(), intervalCount, optimisationTime); - double[] carbonExport = get24HAttributeValues(supplierAsset.getId(), supplierAsset.getAttribute(ElectricitySupplierAsset.CARBON_EXPORT).orElse(null), optimiser.getIntervalSize(), intervalCount, optimisationTime); + if (financialWeightingExport < 1d && !supplierAsset.getCarbonExport().isPresent()) { + financialWeightingExport = 1d; + } - LOG.finest(getLogPrefix(optimisationAssetId) + "Adjusting costs to include some carbon weighting, financialWeightingImport=" + financialWeightingImport + ", financialWeightingExport=" + financialWeightingExport); + double[] costsImport = + get24HAttributeValues( + supplierAsset.getId(), + supplierAsset.getAttribute(ElectricitySupplierAsset.TARIFF_IMPORT).orElse(null), + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + double[] costsExport = + get24HAttributeValues( + supplierAsset.getId(), + supplierAsset.getAttribute(ElectricitySupplierAsset.TARIFF_EXPORT).orElse(null), + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + + if (financialWeightingImport < 1d || financialWeightingExport < 1d) { + double[] carbonImport = + get24HAttributeValues( + supplierAsset.getId(), + supplierAsset.getAttribute(ElectricitySupplierAsset.CARBON_IMPORT).orElse(null), + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + double[] carbonExport = + get24HAttributeValues( + supplierAsset.getId(), + supplierAsset.getAttribute(ElectricitySupplierAsset.CARBON_EXPORT).orElse(null), + optimiser.getIntervalSize(), + intervalCount, + optimisationTime); + + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Adjusting costs to include some carbon weighting, financialWeightingImport=" + + financialWeightingImport + + ", financialWeightingExport=" + + financialWeightingExport); + + for (int i = 0; i < costsImport.length; i++) { + costsImport[i] = + (financialWeightingImport * costsImport[i]) + + ((1 - financialWeightingImport) * carbonImport[i]); + costsExport[i] = + (financialWeightingExport * costsExport[i]) + + ((1 - financialWeightingExport) * carbonExport[i]); + } + } - for (int i = 0; i < costsImport.length; i++) { - costsImport[i] = (financialWeightingImport * costsImport[i]) + ((1-financialWeightingImport) * carbonImport[i]); - costsExport[i] = (financialWeightingExport * costsExport[i]) + ((1-financialWeightingExport) * carbonExport[i]); - } - } + if (LOG.isLoggable(Level.FINEST)) { + LOG.finest( + getLogPrefix(optimisationAssetId) + "Import costs: " + Arrays.toString(costsImport)); + LOG.finest( + getLogPrefix(optimisationAssetId) + "Export costs: " + Arrays.toString(costsExport)); + } + // Savings variables + List obsoleteUnoptimisedAssetIds = + new ArrayList<>(optimisationInstance.unoptimisedStorageAssetEnergyLevels.keySet()); + double unoptimisedPower = powerNets[0]; + double financialCost = 0d; + double carbonCost = 0d; + double unoptimisedFinancialCost = 0d; + double unoptimisedCarbonCost = 0d; + + // Optimise storage assets with priority on storage assets with an energy schedule (already + // sorted above) + double importPowerMax = supplierAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + double exportPowerMax = -1 * supplierAsset.getPowerExportMax().orElse(Double.MAX_VALUE); + double[] importPowerMaxes = new double[intervalCount]; + double[] exportPowerMaxes = new double[intervalCount]; + Arrays.fill(importPowerMaxes, importPowerMax); + Arrays.fill(exportPowerMaxes, exportPowerMax); + long periodSeconds = (long) (optimiser.getIntervalSize() * 60 * 60); + + for (ElectricityStorageAsset storageAsset : optimisableStorageAssets) { + boolean hasSetpoint = storageAsset.hasAttribute(ElectricityStorageAsset.POWER_SETPOINT); + boolean supportsExport = storageAsset.isSupportsExport().orElse(false); + boolean supportsImport = storageAsset.isSupportsImport().orElse(false); + + checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); + + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Optimising power set points for storage asset: " + + storageAsset); + + if (!supportsExport && !supportsImport) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Storage asset doesn't support import or export: " + + storageAsset.getId()); + continue; + } + + if (!hasSetpoint) { + LOG.info( + getLogPrefix(optimisationAssetId) + + "Storage asset has no '" + + ElectricityStorageAsset.POWER_SETPOINT.getName() + + "' attribute so cannot be controlled: " + + storageAsset.getId()); + continue; + } + + double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); + double energyLevel = Math.min(energyCapacity, storageAsset.getEnergyLevel().orElse(-1d)); + + if (energyCapacity <= 0d || energyLevel < 0) { + LOG.info( + getLogPrefix(optimisationAssetId) + + "Storage asset has no capacity or energy level so cannot import or export energy: " + + storageAsset.getId()); + continue; + } + + double energyLevelMax = + Math.min( + energyCapacity, + ((double) storageAsset.getEnergyLevelPercentageMax().orElse(100) / 100) + * energyCapacity); + double energyLevelMin = + Math.min( + energyCapacity, + ((double) storageAsset.getEnergyLevelPercentageMin().orElse(0) / 100) + * energyCapacity); + double[] energyLevelMins = new double[intervalCount]; + double[] energyLevelMaxs = new double[intervalCount]; + Arrays.fill(energyLevelMins, energyLevelMin); + Arrays.fill(energyLevelMaxs, energyLevelMax); + + // Does the storage support import and have an energy level schedule + Optional energyLevelScheduleOptional = storageAsset.getEnergyLevelSchedule(); + boolean hasEnergyMinRequirement = + energyLevelMin > 0 || energyLevelScheduleOptional.isPresent(); + double powerExportMax = + storageAsset.getPowerExportMax().map(power -> -1 * power).orElse(Double.MIN_VALUE); + double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + int[][] energySchedule = + energyLevelScheduleOptional + .map( + dayArr -> + Arrays.stream(dayArr) + .map( + hourArr -> + Arrays.stream(hourArr).mapToInt(i -> i != null ? i : 0).toArray()) + .toArray(int[][]::new)) + .orElse(null); + + if (energySchedule != null) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Applying energy schedule for storage asset: " + + storageAsset.getId()); + optimiser.applyEnergySchedule( + energyLevelMins, + energyLevelMaxs, + energyCapacity, + energySchedule, + Instant.ofEpochMilli(timerService.getCurrentTimeMillis()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + } + + double maxEnergyLevelMin = Arrays.stream(energyLevelMins).max().orElse(0); + boolean isConnected = storageAssetConnected(storageAsset); + + // TODO: Make these a function of energy level + Function powerImportMaxCalculator = + interval -> interval == 0 && !isConnected ? 0 : powerImportMax; + Function powerExportMaxCalculator = + interval -> interval == 0 && !isConnected ? 0 : powerExportMax; + + if (hasEnergyMinRequirement) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Normalising min energy requirements for storage asset: " + + storageAsset.getId()); + optimiser.normaliseEnergyMinRequirements( + energyLevelMins, powerImportMaxCalculator, powerExportMaxCalculator, energyLevel); if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Import costs: " + Arrays.toString(costsImport)); - LOG.finest(getLogPrefix(optimisationAssetId) + "Export costs: " + Arrays.toString(costsExport)); + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Min energy requirements for storage asset '" + + storageAsset.getId() + + "': " + + Arrays.toString(energyLevelMins)); } - - // Savings variables - List obsoleteUnoptimisedAssetIds = new ArrayList<>(optimisationInstance.unoptimisedStorageAssetEnergyLevels.keySet()); - double unoptimisedPower = powerNets[0]; - double financialCost = 0d; - double carbonCost = 0d; - double unoptimisedFinancialCost = 0d; - double unoptimisedCarbonCost = 0d; - - // Optimise storage assets with priority on storage assets with an energy schedule (already sorted above) - double importPowerMax = supplierAsset.getPowerImportMax().orElse(Double.MAX_VALUE); - double exportPowerMax = -1 * supplierAsset.getPowerExportMax().orElse(Double.MAX_VALUE); - double[] importPowerMaxes = new double[intervalCount]; - double[] exportPowerMaxes = new double[intervalCount]; - Arrays.fill(importPowerMaxes, importPowerMax); - Arrays.fill(exportPowerMaxes, exportPowerMax); - long periodSeconds = (long)(optimiser.getIntervalSize()*60*60); - - for (ElectricityStorageAsset storageAsset : optimisableStorageAssets) { - boolean hasSetpoint = storageAsset.hasAttribute(ElectricityStorageAsset.POWER_SETPOINT); - boolean supportsExport = storageAsset.isSupportsExport().orElse(false); - boolean supportsImport = storageAsset.isSupportsImport().orElse(false); - - checkTimeoutAndThrow(optimisationAssetId, startTimeMillis); - - LOG.finest(getLogPrefix(optimisationAssetId) + "Optimising power set points for storage asset: " + storageAsset); - - if (!supportsExport && !supportsImport) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Storage asset doesn't support import or export: " + storageAsset.getId()); - continue; - } - - if (!hasSetpoint) { - LOG.info(getLogPrefix(optimisationAssetId) + "Storage asset has no '" + ElectricityStorageAsset.POWER_SETPOINT.getName() + "' attribute so cannot be controlled: " + storageAsset.getId()); - continue; - } - - double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); - double energyLevel = Math.min(energyCapacity, storageAsset.getEnergyLevel().orElse(-1d)); - - if (energyCapacity <= 0d || energyLevel < 0) { - LOG.info(getLogPrefix(optimisationAssetId) + "Storage asset has no capacity or energy level so cannot import or export energy: " + storageAsset.getId()); - continue; - } - - double energyLevelMax = Math.min(energyCapacity, ((double) storageAsset.getEnergyLevelPercentageMax().orElse(100) / 100) * energyCapacity); - double energyLevelMin = Math.min(energyCapacity, ((double) storageAsset.getEnergyLevelPercentageMin().orElse(0) / 100) * energyCapacity); - double[] energyLevelMins = new double[intervalCount]; - double[] energyLevelMaxs = new double[intervalCount]; - Arrays.fill(energyLevelMins, energyLevelMin); - Arrays.fill(energyLevelMaxs, energyLevelMax); - - // Does the storage support import and have an energy level schedule - Optional energyLevelScheduleOptional = storageAsset.getEnergyLevelSchedule(); - boolean hasEnergyMinRequirement = energyLevelMin > 0 || energyLevelScheduleOptional.isPresent(); - double powerExportMax = storageAsset.getPowerExportMax().map(power -> -1*power).orElse(Double.MIN_VALUE); - double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); - int[][] energySchedule = energyLevelScheduleOptional.map(dayArr -> Arrays.stream(dayArr).map(hourArr -> Arrays.stream(hourArr).mapToInt(i -> i != null ? i : 0).toArray()).toArray(int[][]::new)).orElse(null); - - if (energySchedule != null) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Applying energy schedule for storage asset: " + storageAsset.getId()); - optimiser.applyEnergySchedule(energyLevelMins, energyLevelMaxs, energyCapacity, energySchedule, Instant.ofEpochMilli(timerService.getCurrentTimeMillis()).atZone(ZoneId.systemDefault()).toLocalDateTime()); - } - - double maxEnergyLevelMin = Arrays.stream(energyLevelMins).max().orElse(0); - boolean isConnected = storageAssetConnected(storageAsset); - - // TODO: Make these a function of energy level - Function powerImportMaxCalculator = interval -> interval == 0 && !isConnected ? 0 : powerImportMax; - Function powerExportMaxCalculator = interval -> interval == 0 && !isConnected ? 0 : powerExportMax; - - if (hasEnergyMinRequirement) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Normalising min energy requirements for storage asset: " + storageAsset.getId()); - optimiser.normaliseEnergyMinRequirements(energyLevelMins, powerImportMaxCalculator, powerExportMaxCalculator, energyLevel); - if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Min energy requirements for storage asset '" + storageAsset.getId() + "': " + Arrays.toString(energyLevelMins)); - } + } + + // Calculate the power setpoints for this asset and update power net values for each interval + double[] setpoints = + getStoragePowerSetpoints( + optimisationInstance, + storageAsset, + energyLevelMins, + energyLevelMaxs, + powerNets, + importPowerMaxes, + exportPowerMaxes, + costsImport, + costsExport); + + if (setpoints != null) { + + // Assume these setpoints will be applied so update the power net values with these + for (int i = 0; i < powerNets.length; i++) { + + if (i == 0) { + if (!storageAssetConnected(storageAsset)) { + LOG.finest( + "Optimised storage asset not connected so interval 0 will not be counted or actioned: " + + storageAsset.getId()); + setpoints[i] = 0; + continue; } - // Calculate the power setpoints for this asset and update power net values for each interval - double[] setpoints = getStoragePowerSetpoints(optimisationInstance, storageAsset, energyLevelMins, energyLevelMaxs, powerNets, importPowerMaxes, exportPowerMaxes, costsImport, costsExport); - - if (setpoints != null) { - - // Assume these setpoints will be applied so update the power net values with these - for (int i = 0; i < powerNets.length; i++) { - - if (i == 0) { - if (!storageAssetConnected(storageAsset)) { - LOG.finest("Optimised storage asset not connected so interval 0 will not be counted or actioned: " + storageAsset.getId()); - setpoints[i] = 0; - continue; - } - - // Update savings/cost data with costs specific to this asset - if (setpoints[i] > 0) { - financialCost += storageAsset.getTariffImport().orElse(0d) * setpoints[i] * intervalSize; - } else { - financialCost += storageAsset.getTariffExport().orElse(0d) * -1 * setpoints[i] * intervalSize; - } - } - - powerNets[i] += setpoints[i]; - } - - // Push the setpoints into the prediction service for the storage asset's setpoint attribute and set current setpoint - List> valuesAndTimestamps = IntStream.range(1, setpoints.length).mapToObj(i -> - new ValueDatapoint<>(optimisationTime.plus(periodSeconds * i, ChronoUnit.SECONDS).toEpochMilli(), setpoints[i]) - ).collect(Collectors.toList()); - - assetPredictedDatapointService.updateValues(storageAsset.getId(), ElectricityAsset.POWER_SETPOINT.getName(), valuesAndTimestamps); + // Update savings/cost data with costs specific to this asset + if (setpoints[i] > 0) { + financialCost += + storageAsset.getTariffImport().orElse(0d) * setpoints[i] * intervalSize; + } else { + financialCost += + storageAsset.getTariffExport().orElse(0d) * -1 * setpoints[i] * intervalSize; } + } - assetProcessingService.sendAttributeEvent(new AttributeEvent(storageAsset.getId(), ElectricityAsset.POWER_SETPOINT, setpoints != null ? setpoints[0] : null), getClass().getSimpleName()); - - // Update unoptimised power for this asset - obsoleteUnoptimisedAssetIds.remove(storageAsset.getId()); - double assetUnoptimisedPower = getStorageUnoptimisedImportPower(optimisationInstance, optimisationAssetId, storageAsset, maxEnergyLevelMin, Math.max(0, powerImportMax - unoptimisedPower)); - unoptimisedPower += assetUnoptimisedPower; - unoptimisedFinancialCost += storageAsset.getTariffImport().orElse(0d) * assetUnoptimisedPower * intervalSize; + powerNets[i] += setpoints[i]; } - // Clear out un-optimised data for not found assets - obsoleteUnoptimisedAssetIds.forEach(optimisationInstance.unoptimisedStorageAssetEnergyLevels.keySet()::remove); - - // Calculate and store savings data - carbonCost = (powerNets[0] >= 0 ? supplierAsset.getCarbonImport().orElse(0d) : -1 * supplierAsset.getCarbonExport().orElse(0d)) * powerNets[0] * intervalSize; - financialCost += (powerNets[0] >= 0 ? supplierAsset.getTariffImport().orElse(0d) : -1 * supplierAsset.getTariffExport().orElse(0d)) * powerNets[0] * intervalSize; - unoptimisedCarbonCost = (unoptimisedPower >= 0 ? supplierAsset.getCarbonImport().orElse(0d) : -1 * supplierAsset.getCarbonExport().orElse(0d)) * unoptimisedPower * intervalSize; - unoptimisedFinancialCost += (unoptimisedPower >= 0 ? supplierAsset.getTariffImport().orElse(0d) : -1 * supplierAsset.getTariffExport().orElse(0d)) * unoptimisedPower * intervalSize; - - double financialSaving = unoptimisedFinancialCost - financialCost; - double carbonSaving = unoptimisedCarbonCost - carbonCost; - - LOG.info(getLogPrefix(optimisationAssetId) + "Current interval financial saving = " + financialSaving); - LOG.info(getLogPrefix(optimisationAssetId) + "Current interval carbon saving = " + carbonSaving); - - financialSaving += optimisationInstance.optimisationAsset.getFinancialSaving().orElse(0d); - carbonSaving += optimisationInstance.optimisationAsset.getCarbonSaving().orElse(0d); - - // Update in memory asset - optimisationInstance.optimisationAsset.setFinancialSaving(financialSaving); - optimisationInstance.optimisationAsset.setCarbonSaving(carbonSaving); - - // Push new values into the DB - assetProcessingService.sendAttributeEvent(new AttributeEvent(optimisationAssetId, EnergyOptimisationAsset.FINANCIAL_SAVING, financialSaving), getClass().getSimpleName()); - assetProcessingService.sendAttributeEvent(new AttributeEvent(optimisationAssetId, EnergyOptimisationAsset.CARBON_SAVING, carbonSaving), getClass().getSimpleName()); + // Push the setpoints into the prediction service for the storage asset's setpoint attribute + // and set current setpoint + List> valuesAndTimestamps = + IntStream.range(1, setpoints.length) + .mapToObj( + i -> + new ValueDatapoint<>( + optimisationTime + .plus(periodSeconds * i, ChronoUnit.SECONDS) + .toEpochMilli(), + setpoints[i])) + .collect(Collectors.toList()); + + assetPredictedDatapointService.updateValues( + storageAsset.getId(), ElectricityAsset.POWER_SETPOINT.getName(), valuesAndTimestamps); + } + + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + storageAsset.getId(), + ElectricityAsset.POWER_SETPOINT, + setpoints != null ? setpoints[0] : null), + getClass().getSimpleName()); + + // Update unoptimised power for this asset + obsoleteUnoptimisedAssetIds.remove(storageAsset.getId()); + double assetUnoptimisedPower = + getStorageUnoptimisedImportPower( + optimisationInstance, + optimisationAssetId, + storageAsset, + maxEnergyLevelMin, + Math.max(0, powerImportMax - unoptimisedPower)); + unoptimisedPower += assetUnoptimisedPower; + unoptimisedFinancialCost += + storageAsset.getTariffImport().orElse(0d) * assetUnoptimisedPower * intervalSize; } - protected boolean isElectricityGroupAsset(Asset asset) { - if (!(asset instanceof GroupAsset)) { - return false; - } + // Clear out un-optimised data for not found assets + obsoleteUnoptimisedAssetIds.forEach( + optimisationInstance.unoptimisedStorageAssetEnergyLevels.keySet()::remove); + + // Calculate and store savings data + carbonCost = + (powerNets[0] >= 0 + ? supplierAsset.getCarbonImport().orElse(0d) + : -1 * supplierAsset.getCarbonExport().orElse(0d)) + * powerNets[0] + * intervalSize; + financialCost += + (powerNets[0] >= 0 + ? supplierAsset.getTariffImport().orElse(0d) + : -1 * supplierAsset.getTariffExport().orElse(0d)) + * powerNets[0] + * intervalSize; + unoptimisedCarbonCost = + (unoptimisedPower >= 0 + ? supplierAsset.getCarbonImport().orElse(0d) + : -1 * supplierAsset.getCarbonExport().orElse(0d)) + * unoptimisedPower + * intervalSize; + unoptimisedFinancialCost += + (unoptimisedPower >= 0 + ? supplierAsset.getTariffImport().orElse(0d) + : -1 * supplierAsset.getTariffExport().orElse(0d)) + * unoptimisedPower + * intervalSize; + + double financialSaving = unoptimisedFinancialCost - financialCost; + double carbonSaving = unoptimisedCarbonCost - carbonCost; + + LOG.info( + getLogPrefix(optimisationAssetId) + + "Current interval financial saving = " + + financialSaving); + LOG.info( + getLogPrefix(optimisationAssetId) + "Current interval carbon saving = " + carbonSaving); + + financialSaving += optimisationInstance.optimisationAsset.getFinancialSaving().orElse(0d); + carbonSaving += optimisationInstance.optimisationAsset.getCarbonSaving().orElse(0d); + + // Update in memory asset + optimisationInstance.optimisationAsset.setFinancialSaving(financialSaving); + optimisationInstance.optimisationAsset.setCarbonSaving(carbonSaving); + + // Push new values into the DB + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + optimisationAssetId, EnergyOptimisationAsset.FINANCIAL_SAVING, financialSaving), + getClass().getSimpleName()); + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + optimisationAssetId, EnergyOptimisationAsset.CARBON_SAVING, carbonSaving), + getClass().getSimpleName()); + } + + protected boolean isElectricityGroupAsset(Asset asset) { + if (!(asset instanceof GroupAsset)) { + return false; + } - Class assetClass = ValueUtil - .getAssetDescriptor(((GroupAsset)asset).getChildAssetType().orElse(null)) + Class assetClass = + ValueUtil.getAssetDescriptor(((GroupAsset) asset).getChildAssetType().orElse(null)) .map(AssetDescriptor::getType) .orElse(null); - return assetClass != null && - ElectricityAsset.class.isAssignableFrom(assetClass); - } - - protected double[] get24HAttributeValues(String assetId, Attribute attribute, double intervalSize, int intervalCount, Instant optimisationTime) { + return assetClass != null && ElectricityAsset.class.isAssignableFrom(assetClass); + } - double[] values = new double[intervalCount]; + protected double[] get24HAttributeValues( + String assetId, + Attribute attribute, + double intervalSize, + int intervalCount, + Instant optimisationTime) { - if (attribute == null) { - return values; - } + double[] values = new double[intervalCount]; - AttributeRef ref = new AttributeRef(assetId, attribute.getName()); - - if (attribute.hasMeta(MetaItemType.HAS_PREDICTED_DATA_POINTS)) { - LocalDateTime timestamp = optimisationTime.atZone(ZoneId.systemDefault()).toLocalDateTime(); - List> predictedData = assetPredictedDatapointService.queryDatapoints( - ref.getId(), - ref.getName(), - new AssetDatapointIntervalQuery( - timestamp, - timestamp.plus(24, HOURS).minus((long)(intervalSize * 60), ChronoUnit.MINUTES), - (intervalSize * 60) + " minutes", - AssetDatapointIntervalQuery.Formula.AVG, - true - ) - ); - if (predictedData.size() != values.length) { - LOG.warning("Returned predicted data point count does not match interval count: Ref=" + ref + ", expected=" + values.length + ", actual=" + predictedData.size()); - } else { + if (attribute == null) { + return values; + } - IntStream.range(0, predictedData.size()).forEach(i -> { - if (predictedData.get(i).getValue() != null) { - values[i] = (double) (Object) predictedData.get(i).getValue(); - } else { - // Average previous and next values to fill in gaps (goes up to 5 back and forward) - this fixes - // issues with resolution differences between stored predicted data and optimisation interval - Double previous = null; - Double next = null; - int j = i-1; - while (previous == null && j >= 0) { - previous = (Double) predictedData.get(j).getValue(); - j--; - } - j = i+1; - while (next == null && j < predictedData.size()) { - next = (Double) predictedData.get(j).getValue(); - j++; - } - if (next == null) { - next = previous; - } - if (previous == null) { - previous = next; - } - if (next != null) { - values[i] = (previous + next) / 2; - } + AttributeRef ref = new AttributeRef(assetId, attribute.getName()); + + if (attribute.hasMeta(MetaItemType.HAS_PREDICTED_DATA_POINTS)) { + LocalDateTime timestamp = optimisationTime.atZone(ZoneId.systemDefault()).toLocalDateTime(); + List> predictedData = + assetPredictedDatapointService.queryDatapoints( + ref.getId(), + ref.getName(), + new AssetDatapointIntervalQuery( + timestamp, + timestamp.plus(24, HOURS).minus((long) (intervalSize * 60), ChronoUnit.MINUTES), + (intervalSize * 60) + " minutes", + AssetDatapointIntervalQuery.Formula.AVG, + true)); + if (predictedData.size() != values.length) { + LOG.warning( + "Returned predicted data point count does not match interval count: Ref=" + + ref + + ", expected=" + + values.length + + ", actual=" + + predictedData.size()); + } else { + + IntStream.range(0, predictedData.size()) + .forEach( + i -> { + if (predictedData.get(i).getValue() != null) { + values[i] = (double) (Object) predictedData.get(i).getValue(); + } else { + // Average previous and next values to fill in gaps (goes up to 5 back and + // forward) - this fixes + // issues with resolution differences between stored predicted data and + // optimisation interval + Double previous = null; + Double next = null; + int j = i - 1; + while (previous == null && j >= 0) { + previous = (Double) predictedData.get(j).getValue(); + j--; + } + j = i + 1; + while (next == null && j < predictedData.size()) { + next = (Double) predictedData.get(j).getValue(); + j++; + } + if (next == null) { + next = previous; + } + if (previous == null) { + previous = next; + } + if (next != null) { + values[i] = (previous + next) / 2; } + } }); - } - } - - values[0] = attribute.getValue().orElse(0d); - return values; + } } - /** - * Returns the power setpoint calculator for the specified asset (for producers power demand will only ever be - * negative, for consumers it will only ever be positive and for storage assets that support export (i.e. supports - * producer and consumer) it can be positive or negative at a given interval. For this to work the supplied - * parameters should be updated when the system changes and not replaced so that references maintained by the - * calculator are valid and up to date. - */ - protected double[] getStoragePowerSetpoints( - OptimisationInstance optimisationInstance, - ElectricityStorageAsset storageAsset, - double[] normalisedEnergyLevelMins, - double[] energyLevelMaxs, - double[] powerNets, - double[] importPowerLimits, - double[] exportPowerLimits, - double[] costImports, - double[] costExports) { - - EnergyOptimiser optimiser = optimisationInstance.energyOptimiser; - String optimisationAssetId = optimisationInstance.optimisationAsset.getId(); - int intervalCount = optimiser.get24HourIntervalCount(); - boolean supportsExport = storageAsset.isSupportsExport().orElse(false); - boolean supportsImport = storageAsset.isSupportsImport().orElse(false); - - LOG.finest(getLogPrefix(optimisationAssetId) + "Optimising storage asset: " + storageAsset); - - double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); - double energyLevel = Math.min(energyCapacity, storageAsset.getEnergyLevel().orElse(-1d)); - double powerExportMax = storageAsset.getPowerExportMax().map(power -> -1*power).orElse(Double.MIN_VALUE); - double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); - boolean isConnected = storageAssetConnected(storageAsset); - - // TODO: Make these a function of energy level - Function powerImportMaxCalculator = interval -> interval == 0 && !isConnected ? 0 : powerImportMax; - Function powerExportMaxCalculator = interval -> interval == 0 && !isConnected ? 0 : powerExportMax; - - double[][] exportCostAndPower = null; - double[][] importCostAndPower = null; - double[] powerSetpoints = new double[intervalCount]; - - Function energyLevelCalculator = interval -> - energyLevel + IntStream.range(0, interval).mapToDouble(j -> powerSetpoints[j] * optimiser.getIntervalSize()).sum(); - - // If asset supports exporting energy (V2G, battery storage, etc.) then need to determine if there are - // opportunities to export energy to save/earn, taking into consideration the cost of exporting from this asset - if (supportsExport) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Storage asset supports export so calculating export cost and power levels for each interval: " + storageAsset.getId()); - // Find intervals that save/earn by exporting energy from this storage asset by looking at power levels - BiFunction exportOptimiser = optimiser.getExportOptimiser(powerNets, exportPowerLimits, costImports, costExports, storageAsset.getTariffExport().orElse(0d)); - exportCostAndPower = IntStream.range(0, intervalCount).mapToObj(it -> exportOptimiser.apply(it, powerExportMax)) - .toArray(double[][]::new); - } - - // If asset supports importing energy then need to determine if there are opportunities to import energy to - // save/earn, taking into consideration the cost of importing to this asset, also need to ensure that min - // energy demands are met. - if (supportsImport) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Storage asset supports import so calculating export cost and power levels for each interval: " + storageAsset.getId()); - BiFunction importOptimiser = optimiser.getImportOptimiser(powerNets, importPowerLimits, costImports, costExports, storageAsset.getTariffImport().orElse(0d)); - importCostAndPower = IntStream.range(0, intervalCount).mapToObj(it -> importOptimiser.apply(it, new double[]{0d, powerImportMax})) - .toArray(double[][]::new); - - boolean hasEnergyMinRequirement = Arrays.stream(normalisedEnergyLevelMins).anyMatch(el -> el > 0); - - if (hasEnergyMinRequirement) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Applying imports to achieve min energy level requirements for storage asset: " + storageAsset.getId()); - optimiser.applyEnergyMinImports(importCostAndPower, normalisedEnergyLevelMins, powerSetpoints, energyLevelCalculator, importOptimiser, powerImportMaxCalculator); - if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Setpoints to achieve min energy level requirements for storage asset '" + storageAsset.getId() + "': " + Arrays.toString(powerSetpoints)); - } - } - } - - optimiser.applyEarningOpportunities(importCostAndPower, exportCostAndPower, normalisedEnergyLevelMins, energyLevelMaxs, powerSetpoints, energyLevelCalculator, powerImportMaxCalculator, powerExportMaxCalculator); + values[0] = attribute.getValue().orElse(0d); + return values; + } + + /** + * Returns the power setpoint calculator for the specified asset (for producers power demand will + * only ever be negative, for consumers it will only ever be positive and for storage assets that + * support export (i.e. supports producer and consumer) it can be positive or negative at a given + * interval. For this to work the supplied parameters should be updated when the system changes + * and not replaced so that references maintained by the calculator are valid and up to date. + */ + protected double[] getStoragePowerSetpoints( + OptimisationInstance optimisationInstance, + ElectricityStorageAsset storageAsset, + double[] normalisedEnergyLevelMins, + double[] energyLevelMaxs, + double[] powerNets, + double[] importPowerLimits, + double[] exportPowerLimits, + double[] costImports, + double[] costExports) { + + EnergyOptimiser optimiser = optimisationInstance.energyOptimiser; + String optimisationAssetId = optimisationInstance.optimisationAsset.getId(); + int intervalCount = optimiser.get24HourIntervalCount(); + boolean supportsExport = storageAsset.isSupportsExport().orElse(false); + boolean supportsImport = storageAsset.isSupportsImport().orElse(false); + + LOG.finest(getLogPrefix(optimisationAssetId) + "Optimising storage asset: " + storageAsset); + + double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); + double energyLevel = Math.min(energyCapacity, storageAsset.getEnergyLevel().orElse(-1d)); + double powerExportMax = + storageAsset.getPowerExportMax().map(power -> -1 * power).orElse(Double.MIN_VALUE); + double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + boolean isConnected = storageAssetConnected(storageAsset); + + // TODO: Make these a function of energy level + Function powerImportMaxCalculator = + interval -> interval == 0 && !isConnected ? 0 : powerImportMax; + Function powerExportMaxCalculator = + interval -> interval == 0 && !isConnected ? 0 : powerExportMax; + + double[][] exportCostAndPower = null; + double[][] importCostAndPower = null; + double[] powerSetpoints = new double[intervalCount]; + + Function energyLevelCalculator = + interval -> + energyLevel + + IntStream.range(0, interval) + .mapToDouble(j -> powerSetpoints[j] * optimiser.getIntervalSize()) + .sum(); + + // If asset supports exporting energy (V2G, battery storage, etc.) then need to determine if + // there are + // opportunities to export energy to save/earn, taking into consideration the cost of exporting + // from this asset + if (supportsExport) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Storage asset supports export so calculating export cost and power levels for each interval: " + + storageAsset.getId()); + // Find intervals that save/earn by exporting energy from this storage asset by looking at + // power levels + BiFunction exportOptimiser = + optimiser.getExportOptimiser( + powerNets, + exportPowerLimits, + costImports, + costExports, + storageAsset.getTariffExport().orElse(0d)); + exportCostAndPower = + IntStream.range(0, intervalCount) + .mapToObj(it -> exportOptimiser.apply(it, powerExportMax)) + .toArray(double[][]::new); + } + // If asset supports importing energy then need to determine if there are opportunities to + // import energy to + // save/earn, taking into consideration the cost of importing to this asset, also need to ensure + // that min + // energy demands are met. + if (supportsImport) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Storage asset supports import so calculating export cost and power levels for each interval: " + + storageAsset.getId()); + BiFunction importOptimiser = + optimiser.getImportOptimiser( + powerNets, + importPowerLimits, + costImports, + costExports, + storageAsset.getTariffImport().orElse(0d)); + importCostAndPower = + IntStream.range(0, intervalCount) + .mapToObj(it -> importOptimiser.apply(it, new double[] {0d, powerImportMax})) + .toArray(double[][]::new); + + boolean hasEnergyMinRequirement = + Arrays.stream(normalisedEnergyLevelMins).anyMatch(el -> el > 0); + + if (hasEnergyMinRequirement) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Applying imports to achieve min energy level requirements for storage asset: " + + storageAsset.getId()); + optimiser.applyEnergyMinImports( + importCostAndPower, + normalisedEnergyLevelMins, + powerSetpoints, + energyLevelCalculator, + importOptimiser, + powerImportMaxCalculator); if (LOG.isLoggable(Level.FINEST)) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Calculated earning opportunity power set points for storage asset '" + storageAsset.getId() + "': " + Arrays.toString(powerSetpoints)); + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Setpoints to achieve min energy level requirements for storage asset '" + + storageAsset.getId() + + "': " + + Arrays.toString(powerSetpoints)); } - - return powerSetpoints; + } } - protected boolean storageAssetConnected(ElectricityStorageAsset storageAsset) { - if (storageAsset instanceof ElectricVehicleAsset) { - return ((ElectricVehicleAsset)storageAsset).getChargerConnected().orElse(false); - } - if (storageAsset instanceof ElectricityChargerAsset) { - return ((ElectricityChargerAsset)storageAsset).getVehicleConnected().orElse(false); - } - return true; + optimiser.applyEarningOpportunities( + importCostAndPower, + exportCostAndPower, + normalisedEnergyLevelMins, + energyLevelMaxs, + powerSetpoints, + energyLevelCalculator, + powerImportMaxCalculator, + powerExportMaxCalculator); + + if (LOG.isLoggable(Level.FINEST)) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Calculated earning opportunity power set points for storage asset '" + + storageAsset.getId() + + "': " + + Arrays.toString(powerSetpoints)); } - /** - * Gets the un-optimised import power for the first (current) interval for the supplied storage asset - */ - protected double getStorageUnoptimisedImportPower(OptimisationInstance optimisationInstance, String optimisationAssetId, ElectricityStorageAsset storageAsset, double energyLevelTarget, double remainingPowerCapacity) { - - double intervalSize = optimisationInstance.energyOptimiser.getIntervalSize(); - boolean isConnected = storageAssetConnected(storageAsset); + return powerSetpoints; + } - if (!isConnected) { - optimisationInstance.unoptimisedStorageAssetEnergyLevels.remove(storageAsset.getId()); - return 0; - } - - // Get current energy level from map or directly from the asset - double energyLevel = optimisationInstance.unoptimisedStorageAssetEnergyLevels.get(storageAsset.getId()) != null ? optimisationInstance.unoptimisedStorageAssetEnergyLevels.get(storageAsset.getId()) : storageAsset.getEnergyLevel().orElse(-1d); + protected boolean storageAssetConnected(ElectricityStorageAsset storageAsset) { + if (storageAsset instanceof ElectricVehicleAsset) { + return ((ElectricVehicleAsset) storageAsset).getChargerConnected().orElse(false); + } + if (storageAsset instanceof ElectricityChargerAsset) { + return ((ElectricityChargerAsset) storageAsset).getVehicleConnected().orElse(false); + } + return true; + } + + /** + * Gets the un-optimised import power for the first (current) interval for the supplied storage + * asset + */ + protected double getStorageUnoptimisedImportPower( + OptimisationInstance optimisationInstance, + String optimisationAssetId, + ElectricityStorageAsset storageAsset, + double energyLevelTarget, + double remainingPowerCapacity) { + + double intervalSize = optimisationInstance.energyOptimiser.getIntervalSize(); + boolean isConnected = storageAssetConnected(storageAsset); + + if (!isConnected) { + optimisationInstance.unoptimisedStorageAssetEnergyLevels.remove(storageAsset.getId()); + return 0; + } - if (energyLevel < 0) { - LOG.finest(getLogPrefix(optimisationAssetId) + "Storage asset has no energy level so cannot calculate un-optimised power demand: " + storageAsset.getId()); - return 0; - } + // Get current energy level from map or directly from the asset + double energyLevel = + optimisationInstance.unoptimisedStorageAssetEnergyLevels.get(storageAsset.getId()) != null + ? optimisationInstance.unoptimisedStorageAssetEnergyLevels.get(storageAsset.getId()) + : storageAsset.getEnergyLevel().orElse(-1d); + + if (energyLevel < 0) { + LOG.finest( + getLogPrefix(optimisationAssetId) + + "Storage asset has no energy level so cannot calculate un-optimised power demand: " + + storageAsset.getId()); + return 0; + } - // Calculate power - double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); - double remainingEnergy = Math.max(0, energyLevelTarget - energyLevel); - double toFillPower = remainingEnergy / intervalSize; - double power = Math.min(Math.min(toFillPower, powerImportMax), remainingPowerCapacity); + // Calculate power + double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + double remainingEnergy = Math.max(0, energyLevelTarget - energyLevel); + double toFillPower = remainingEnergy / intervalSize; + double power = Math.min(Math.min(toFillPower, powerImportMax), remainingPowerCapacity); - // Update energy level using previous interval power - energyLevel += power * intervalSize; - optimisationInstance.unoptimisedStorageAssetEnergyLevels.put(storageAsset.getId(), energyLevel); + // Update energy level using previous interval power + energyLevel += power * intervalSize; + optimisationInstance.unoptimisedStorageAssetEnergyLevels.put(storageAsset.getId(), energyLevel); - return power; - } + return power; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimiser.java b/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimiser.java index 920e4d6..65335c6 100644 --- a/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimiser.java +++ b/energy/src/main/java/org/openremote/extension/energy/manager/EnergyOptimiser.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,11 +12,13 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.manager; -import org.openremote.model.util.Pair; +import static org.openremote.extension.energy.manager.EnergyOptimisationService.LOG; import java.time.LocalDateTime; import java.time.OffsetDateTime; @@ -35,752 +34,972 @@ import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.IntStream; - -import static org.openremote.extension.energy.manager.EnergyOptimisationService.LOG; +import org.openremote.model.util.Pair; public class EnergyOptimiser { - protected double intervalSize; - protected double financialWeighting; - - /** - * 24 divided by intervalSize must be a whole number - */ - public EnergyOptimiser(double intervalSize, double financialWeighting) throws IllegalArgumentException { - if ((24d / intervalSize) != (int) (24d / intervalSize)) { - throw new IllegalArgumentException("24 divided by intervalSizeHours must be whole number"); - } - this.intervalSize = intervalSize; - this.financialWeighting = Math.max(0, Math.min(1d, financialWeighting)); - } + protected double intervalSize; + protected double financialWeighting; - public double getIntervalSize() { - return intervalSize; + /** 24 divided by intervalSize must be a whole number */ + public EnergyOptimiser(double intervalSize, double financialWeighting) + throws IllegalArgumentException { + if ((24d / intervalSize) != (int) (24d / intervalSize)) { + throw new IllegalArgumentException("24 divided by intervalSizeHours must be whole number"); } - - public double getFinancialWeighting() { - return financialWeighting; + this.intervalSize = intervalSize; + this.financialWeighting = Math.max(0, Math.min(1d, financialWeighting)); + } + + public double getIntervalSize() { + return intervalSize; + } + + public double getFinancialWeighting() { + return financialWeighting; + } + + public int get24HourIntervalCount() { + return (int) (24d / intervalSize); + } + + // /** + // * Function to calculate the power requirements for the given storage asset at each interval + // in the window + // * based on the provided power demand requirements and potential cost saving at each + // interval so for each interval + // * a an array of [powerDemand, gridCost] is required. For a given interval a positive value + // means importing + // * power and negative means exporting power: + // *

      + // *
    • powerDemand = The net demand of suppliers - consumers - higher priority supplier + // capabilities
    • + // *
    • gridCost = Grid cost / kWh (positive means expense, negative means income)
    • + // *
    + // */ + // // TODO: powerImportMax should be a function of energy level + // public Function getStoragePowerCalculator(ElectricityStorageAsset + // storageAsset) { + // + // return (powerExportsAndSavings) -> { + // + // double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); + // double storedEnergy = storageAsset.getEnergyLevel().orElse(0d); + // double tariffExport = storageAsset.getTariffExport().orElse(0d); + // double tariffImport = storageAsset.getTariffExport().orElse(0d); + // double carbonExport = storageAsset.getCarbonExport().orElse(0d); + // double carbonImport = storageAsset.getCarbonImport().orElse(0d); + // double costExport = financialWeighting * tariffExport + (1d-financialWeighting) * + // carbonExport; + // double costImport = financialWeighting * tariffImport + (1d-financialWeighting) * + // carbonImport; + // double powerEfficiencyImport = storageAsset.getEfficiencyImport().orElse(100); + // double powerEfficiencyExport = storageAsset.getEfficiencyExport().orElse(100); + // double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + // double powerExportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); + // int energyLevelMax = storageAsset.getEnergyLevelPercentageMax().orElse(100); + // + // + // double[] powerImport = new double[intervalCount]; + // double[] powerExport = new double[intervalCount]; + // double[] energyLevel = new double[intervalCount]; + // Arrays.fill(energyLevel, storedEnergy); + // + //// // Calculate total energy requirement + //// double totalEnergyRequired = Arrays.stream(powerExportsAndSavings) + //// .map(interval -> interval[2] * intervalSize) + //// .reduce(0d, Double::sum); + // + //// // If we have enough energy stored then just consume that (no need to import more) + //// if (totalEnergyRequired < storedEnergy) { + //// Arrays.fill(powerImport, 0d); + //// return powerImport; + //// } + // + // /* Look for storage import income opportunities (i.e. when grid pays us to import) + // */ + // + // // Order intervals based on potential income [gridCost+storageImportCost] < 0 + // (smallest first) + // Integer[] indexesSortedIncome = IntStream.range(0, + // powerExportsAndSavings.length).boxed().toArray(Integer[]::new); + // Arrays.sort( + // indexesSortedIncome, + // Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1] + costExport) + // ); + // + // for (int i=0; i= 0) { + // // No income opportunity + // break; + // } + // + // // TODO: Ensure we don't exceed power demand limits + // // Find an earlier interval + // } + // + // + // // Order intervals based on potential cost saving [gridCost-storageExportCost] + // (largest first) + // Integer[] indexesSortedSaving = IntStream.range(0, + // powerExportsAndSavings.length).boxed().toArray(Integer[]::new); + // Arrays.sort( + // indexesSortedSaving, + // Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1] - + // costExport).reversed() + // ); + // + // + // // Find an interval earlier than each ordered export interval that costs less than + // the potential saving + // Arrays.stream(indexesSortedSaving).forEach(powerExportIndex -> { + // double[] powerExportDemand = powerExportsAndSavings[powerExportIndex]; + // double powerDemand = powerExportDemand[0]; + // double saving = powerExportDemand[1] - costExport; + // + // // Order grid costs up to this interval (smallest first) + // Integer[] indexesSortedGridCost = IntStream.range(0, + // powerExportIndex).boxed().toArray(Integer[]::new); + // Arrays.sort( + // indexesSortedGridCost, + // Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1]) + // ); + // + // // Go through intervals allocating required power demand until interval reaches + // powerImportMax or storage is full + // for (int i=0; i 0 && i powerDemand) { + // // This interval can fulfill entire demand + // used += powerDemand; + // powerDemand = 0; + // } else { + // // This interval can only partially fulfill the demand + // powerDemand -= (powerImportMax - used); + // used = powerImportMax; + // } + // } + // powerImport[i] = used; + // i++; + // } + // }); + // }; + // } + + /** + * Will take the supplied 24x7 energy schedule percentages and energy level min/max values and + * apply them to the supplied energyLevelMins also adjusting for any intervalSize difference. The + * energy schedule should be in UTC time. + */ + public void applyEnergySchedule( + double[] energyLevelMins, + double[] energyLevelMaxs, + double energyCapacity, + int[][] energyLevelSchedule, + LocalDateTime currentTime) { + + if (energyLevelSchedule == null) { + return; } - public int get24HourIntervalCount() { - return (int) (24d / intervalSize); + // Extract the schedule for the next 24 hour period starting at current hour plus 1 (need to + // attain energy level by the time the hour starts) + OffsetDateTime date = currentTime.plus(1, ChronoUnit.HOURS).atOffset(ZoneOffset.UTC); + int dayIndex = date.getDayOfWeek().getValue(); + int hourIndex = date.get(ChronoField.HOUR_OF_DAY); + int i = 0; + double[] schedule = new double[24]; + + while (i < 24) { + // Convert from % to absolute value + schedule[i] = energyCapacity * energyLevelSchedule[dayIndex][hourIndex] * 0.01; + hourIndex++; + if (hourIndex > 23) { + hourIndex = 0; + dayIndex = (dayIndex + 1) % 7; + } + i++; } -// /** -// * Function to calculate the power requirements for the given storage asset at each interval in the window -// * based on the provided power demand requirements and potential cost saving at each interval so for each interval -// * a an array of [powerDemand, gridCost] is required. For a given interval a positive value means importing -// * power and negative means exporting power: -// *
      -// *
    • powerDemand = The net demand of suppliers - consumers - higher priority supplier capabilities
    • -// *
    • gridCost = Grid cost / kWh (positive means expense, negative means income)
    • -// *
    -// */ -// // TODO: powerImportMax should be a function of energy level -// public Function getStoragePowerCalculator(ElectricityStorageAsset storageAsset) { -// -// return (powerExportsAndSavings) -> { -// -// double energyCapacity = storageAsset.getEnergyCapacity().orElse(0d); -// double storedEnergy = storageAsset.getEnergyLevel().orElse(0d); -// double tariffExport = storageAsset.getTariffExport().orElse(0d); -// double tariffImport = storageAsset.getTariffExport().orElse(0d); -// double carbonExport = storageAsset.getCarbonExport().orElse(0d); -// double carbonImport = storageAsset.getCarbonImport().orElse(0d); -// double costExport = financialWeighting * tariffExport + (1d-financialWeighting) * carbonExport; -// double costImport = financialWeighting * tariffImport + (1d-financialWeighting) * carbonImport; -// double powerEfficiencyImport = storageAsset.getEfficiencyImport().orElse(100); -// double powerEfficiencyExport = storageAsset.getEfficiencyExport().orElse(100); -// double powerImportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); -// double powerExportMax = storageAsset.getPowerImportMax().orElse(Double.MAX_VALUE); -// int energyLevelMax = storageAsset.getEnergyLevelPercentageMax().orElse(100); -// -// -// double[] powerImport = new double[intervalCount]; -// double[] powerExport = new double[intervalCount]; -// double[] energyLevel = new double[intervalCount]; -// Arrays.fill(energyLevel, storedEnergy); -// -//// // Calculate total energy requirement -//// double totalEnergyRequired = Arrays.stream(powerExportsAndSavings) -//// .map(interval -> interval[2] * intervalSize) -//// .reduce(0d, Double::sum); -// -//// // If we have enough energy stored then just consume that (no need to import more) -//// if (totalEnergyRequired < storedEnergy) { -//// Arrays.fill(powerImport, 0d); -//// return powerImport; -//// } -// -// /* Look for storage import income opportunities (i.e. when grid pays us to import) */ -// -// // Order intervals based on potential income [gridCost+storageImportCost] < 0 (smallest first) -// Integer[] indexesSortedIncome = IntStream.range(0, powerExportsAndSavings.length).boxed().toArray(Integer[]::new); -// Arrays.sort( -// indexesSortedIncome, -// Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1] + costExport) -// ); -// -// for (int i=0; i= 0) { -// // No income opportunity -// break; -// } -// -// // TODO: Ensure we don't exceed power demand limits -// // Find an earlier interval -// } -// -// -// // Order intervals based on potential cost saving [gridCost-storageExportCost] (largest first) -// Integer[] indexesSortedSaving = IntStream.range(0, powerExportsAndSavings.length).boxed().toArray(Integer[]::new); -// Arrays.sort( -// indexesSortedSaving, -// Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1] - costExport).reversed() -// ); -// -// -// // Find an interval earlier than each ordered export interval that costs less than the potential saving -// Arrays.stream(indexesSortedSaving).forEach(powerExportIndex -> { -// double[] powerExportDemand = powerExportsAndSavings[powerExportIndex]; -// double powerDemand = powerExportDemand[0]; -// double saving = powerExportDemand[1] - costExport; -// -// // Order grid costs up to this interval (smallest first) -// Integer[] indexesSortedGridCost = IntStream.range(0, powerExportIndex).boxed().toArray(Integer[]::new); -// Arrays.sort( -// indexesSortedGridCost, -// Comparator.comparingDouble((i) -> powerExportsAndSavings[i][1]) -// ); -// -// // Go through intervals allocating required power demand until interval reaches powerImportMax or storage is full -// for (int i=0; i 0 && i powerDemand) { -// // This interval can fulfill entire demand -// used += powerDemand; -// powerDemand = 0; -// } else { -// // This interval can only partially fulfill the demand -// powerDemand -= (powerImportMax - used); -// used = powerImportMax; -// } -// } -// powerImport[i] = used; -// i++; -// } -// }); -// }; -// } - - /** - * Will take the supplied 24x7 energy schedule percentages and energy level min/max values and apply them to the - * supplied energyLevelMins also adjusting for any intervalSize difference. The energy schedule should be in UTC - * time. - */ - public void applyEnergySchedule(double[] energyLevelMins, double[] energyLevelMaxs, double energyCapacity, int[][] energyLevelSchedule, LocalDateTime currentTime) { - - if (energyLevelSchedule == null) { - return; - } - - // Extract the schedule for the next 24 hour period starting at current hour plus 1 (need to attain energy level by the time the hour starts) - OffsetDateTime date = currentTime.plus(1, ChronoUnit.HOURS).atOffset(ZoneOffset.UTC); - int dayIndex = date.getDayOfWeek().getValue(); - int hourIndex = date.get(ChronoField.HOUR_OF_DAY); - int i = 0; - double[] schedule = new double[24]; - - while (i < 24) { - // Convert from % to absolute value - schedule[i] = energyCapacity * energyLevelSchedule[dayIndex][hourIndex] * 0.01; - hourIndex++; - if (hourIndex > 23) { - hourIndex = 0; - dayIndex = (dayIndex + 1) % 7; - } - i++; - } - - // Convert schedule intervals to match optimisation intervals - need to look at schedule for - if (intervalSize <= 1d) { - int hourIntervals = (int) (1d / intervalSize); - - for (i = 0; i < schedule.length; i++) { - // Put energy level schedule value into first interval for the hour - energyLevelMins[(hourIntervals * i)] = Math.min(energyLevelMaxs[hourIntervals * i], Math.max(energyLevelMins[hourIntervals * i], schedule[i])); - } - } else { - int takeSize = (int) intervalSize; - int hourIntervals = (int) (24d / intervalSize); - - for (i = 0; i < hourIntervals; i++) { - // Take largest energy level for the intervals - energyLevelMins[i] = Math.min(energyLevelMaxs[i], Math.max(energyLevelMins[i], java.util.Arrays.stream(schedule, (i * takeSize), (i * takeSize) + takeSize).max().orElse(0))); - } - } + // Convert schedule intervals to match optimisation intervals - need to look at schedule for + if (intervalSize <= 1d) { + int hourIntervals = (int) (1d / intervalSize); + + for (i = 0; i < schedule.length; i++) { + // Put energy level schedule value into first interval for the hour + energyLevelMins[(hourIntervals * i)] = + Math.min( + energyLevelMaxs[hourIntervals * i], + Math.max(energyLevelMins[hourIntervals * i], schedule[i])); + } + } else { + int takeSize = (int) intervalSize; + int hourIntervals = (int) (24d / intervalSize); + + for (i = 0; i < hourIntervals; i++) { + // Take largest energy level for the intervals + energyLevelMins[i] = + Math.min( + energyLevelMaxs[i], + Math.max( + energyLevelMins[i], + java.util.Arrays.stream(schedule, (i * takeSize), (i * takeSize) + takeSize) + .max() + .orElse(0))); + } } - - /** - * Adjusts the supplied energyLevelMin values to match the physical characteristics (i.e. the charge and discharge - * rates). - */ - public void normaliseEnergyMinRequirements(double[] energyLevelMins, Function powerImportMaxCalculator, Function powerExportMaxCalculator, double energyLevel) { - - int intervalCount = get24HourIntervalCount(); - Function previousEnergyLevelCalculator = i -> (i == 0 ? energyLevel : energyLevelMins[i - 1]); - - // Adjust energy min requirements to match physical characteristics (charge/discharge rate) - IntStream.range(0, intervalCount).forEach(i -> { - double energyDelta = energyLevelMins[i] - previousEnergyLevelCalculator.apply(i); - - if (energyDelta > 0) { - - // May need to increase earlier min values until there is no energy deficit with previous interval - // If we reach interval 0 and there is still a deficit then need to reduce this energy level + } + + /** + * Adjusts the supplied energyLevelMin values to match the physical characteristics (i.e. the + * charge and discharge rates). + */ + public void normaliseEnergyMinRequirements( + double[] energyLevelMins, + Function powerImportMaxCalculator, + Function powerExportMaxCalculator, + double energyLevel) { + + int intervalCount = get24HourIntervalCount(); + Function previousEnergyLevelCalculator = + i -> (i == 0 ? energyLevel : energyLevelMins[i - 1]); + + // Adjust energy min requirements to match physical characteristics (charge/discharge rate) + IntStream.range(0, intervalCount) + .forEach( + i -> { + double energyDelta = energyLevelMins[i] - previousEnergyLevelCalculator.apply(i); + + if (energyDelta > 0) { + + // May need to increase earlier min values until there is no energy deficit with + // previous interval + // If we reach interval 0 and there is still a deficit then need to reduce this + // energy level for (int j = i; j >= 0; j--) { - double previousMin = energyLevelMins[j] - (powerImportMaxCalculator.apply(j) * intervalSize); - double previous = previousEnergyLevelCalculator.apply(j); - - if (previous < previousMin) { - if (j == 0) { - // Can't attain so shift all min values down - double shift = previous - previousMin; - for (int k = 0; k <= i; k++) { - energyLevelMins[k] += shift; - } - } else { - // Increase the previous min value - energyLevelMins[j - 1] = previousMin; - } + double previousMin = + energyLevelMins[j] - (powerImportMaxCalculator.apply(j) * intervalSize); + double previous = previousEnergyLevelCalculator.apply(j); + + if (previous < previousMin) { + if (j == 0) { + // Can't attain so shift all min values down + double shift = previous - previousMin; + for (int k = 0; k <= i; k++) { + energyLevelMins[k] += shift; + } } else { - // Already at or above min requirement - break; + // Increase the previous min value + energyLevelMins[j - 1] = previousMin; } + } else { + // Already at or above min requirement + break; + } } - } else if (energyDelta < 0) { + } else if (energyDelta < 0) { // May need to spread discharge over this and later intervals for (int j = i; j < intervalCount; j++) { - double min = previousEnergyLevelCalculator.apply(j) + (powerExportMaxCalculator.apply(j) * intervalSize); + double min = + previousEnergyLevelCalculator.apply(j) + + (powerExportMaxCalculator.apply(j) * intervalSize); - if (min > energyLevelMins[j]) { - energyLevelMins[j] = min; - } else { - // Already at or above min requirement - break; - } + if (min > energyLevelMins[j]) { + energyLevelMins[j] = min; + } else { + // Already at or above min requirement + break; + } } - } - }); - } - - /** - * Will update the powerSetpoints in order to achieve the energyLevelMin values supplied. - */ - public void applyEnergyMinImports(double[][] importCostAndPower, double[] energyLevelMins, double[] powerSetpoints, Function energyLevelCalculator, BiFunction importOptimiser, Function powerImportMaxCalculator) { - // Ensure min energy levels are attained by the end of the interval as these have priority - AtomicInteger fromInterval = new AtomicInteger(0); - - IntStream.range(0, get24HourIntervalCount()).forEach(i -> { - double intervalEnergyLevel = energyLevelCalculator.apply(i); - double energyDeficit = energyLevelMins[i] - intervalEnergyLevel; - - if (energyDeficit > 0) { + } + }); + } + + /** Will update the powerSetpoints in order to achieve the energyLevelMin values supplied. */ + public void applyEnergyMinImports( + double[][] importCostAndPower, + double[] energyLevelMins, + double[] powerSetpoints, + Function energyLevelCalculator, + BiFunction importOptimiser, + Function powerImportMaxCalculator) { + // Ensure min energy levels are attained by the end of the interval as these have priority + AtomicInteger fromInterval = new AtomicInteger(0); + + IntStream.range(0, get24HourIntervalCount()) + .forEach( + i -> { + double intervalEnergyLevel = energyLevelCalculator.apply(i); + double energyDeficit = energyLevelMins[i] - intervalEnergyLevel; + + if (energyDeficit > 0) { double energyAttainable = powerImportMaxCalculator.apply(i) * intervalSize; energyAttainable = Math.min(energyDeficit, energyAttainable); powerSetpoints[i] = energyAttainable / intervalSize; energyDeficit -= energyAttainable; if (energyDeficit > 0) { - retrospectiveEnergyAllocator(importCostAndPower, energyLevelMins, powerSetpoints, importOptimiser, powerImportMaxCalculator, energyDeficit, fromInterval.getAndSet(i), i); + retrospectiveEnergyAllocator( + importCostAndPower, + energyLevelMins, + powerSetpoints, + importOptimiser, + powerImportMaxCalculator, + energyDeficit, + fromInterval.getAndSet(i), + i); } - } - }); + } + }); + } + + /** + * Creates earlier imports between fromInterval (inclusive) and toInterval (exclusive) in order to + * meet min energy level requirement at the specified interval based on the provided energy level + * at the start of fromInterval. + */ + public void retrospectiveEnergyAllocator( + double[][] importCostAndPower, + double[] energyLevelMins, + double[] powerSetpoints, + BiFunction importOptimiser, + Function powerImportMaxCalculator, + double energyLevel, + int fromInterval, + int toInterval) { + + double energyDeficit = energyLevelMins[toInterval] - energyLevel; + + if (energyDeficit <= 0) { + return; } - /** - * Creates earlier imports between fromInterval (inclusive) and toInterval (exclusive) in order to meet min energy - * level requirement at the specified interval based on the provided energy level at the start of fromInterval. - */ - public void retrospectiveEnergyAllocator(double[][] importCostAndPower, double[] energyLevelMins, double[] powerSetpoints, BiFunction importOptimiser, Function powerImportMaxCalculator, double energyLevel, int fromInterval, int toInterval) { - - double energyDeficit = energyLevelMins[toInterval] - energyLevel; - - if (energyDeficit <= 0) { - return; - } - - // Do import until energy deficit reaches 0 or there are no more intervals - boolean canMeetDeficit = IntStream.range(fromInterval, toInterval).mapToDouble(i -> - Math.min(powerImportMaxCalculator.apply(i), importCostAndPower[i][2]) - ).sum() >= energyDeficit; - boolean morePowerAvailable = !canMeetDeficit && IntStream.range(fromInterval, toInterval).mapToObj(i -> importCostAndPower[i][2] < powerImportMaxCalculator.apply(i)).anyMatch(b -> b); - - if (!canMeetDeficit && morePowerAvailable) { - // Need to push imports beyond optimum to fulfill energy deficit - IntStream.range(fromInterval, toInterval).forEach(i -> { + // Do import until energy deficit reaches 0 or there are no more intervals + boolean canMeetDeficit = + IntStream.range(fromInterval, toInterval) + .mapToDouble( + i -> Math.min(powerImportMaxCalculator.apply(i), importCostAndPower[i][2])) + .sum() + >= energyDeficit; + boolean morePowerAvailable = + !canMeetDeficit + && IntStream.range(fromInterval, toInterval) + .mapToObj(i -> importCostAndPower[i][2] < powerImportMaxCalculator.apply(i)) + .anyMatch(b -> b); + + if (!canMeetDeficit && morePowerAvailable) { + // Need to push imports beyond optimum to fulfill energy deficit + IntStream.range(fromInterval, toInterval) + .forEach( + i -> { double powerImportMax = powerImportMaxCalculator.apply(i); if (importCostAndPower[i][2] < powerImportMax) { - importCostAndPower[i] = importOptimiser.apply(i, new double[]{0d, powerImportMax}); + importCostAndPower[i] = + importOptimiser.apply(i, new double[] {0d, powerImportMax}); } - }); - } - - // Sort import intervals by cost (lowest to highest) - List> sortedImportCostAndPower = IntStream.range(fromInterval, toInterval) - .mapToObj(i -> new Pair<>(i, importCostAndPower[i])).sorted( - Comparator.comparingDouble(pair -> pair.value[0]) - ).collect(Collectors.toList()); - - int i = 0; - while (energyDeficit > 0 && i < sortedImportCostAndPower.size()) { - double importPower = Math.min(powerImportMaxCalculator.apply(i), importCostAndPower[i][2]); - double requiredPower = energyDeficit / intervalSize; - // If we earn by importing then take the maximum power - importPower = importCostAndPower[i][0] < 0 ? importPower : Math.min(importPower, requiredPower); - powerSetpoints[i] = importPower; - energyDeficit -= importPower; - i++; - } + }); } - /** - * Will find the best earning opportunity for each interval (import or export) and will then try to apply them in - * chronological order (reallocating earlier import/exports if it cost beneficial). The powerSetpoints will be - * updated as a result. - */ - public void applyEarningOpportunities(double[][] importCostAndPower, double[][] exportCostAndPower, double[] energyLevelMins, double[] energyLevelMaxs, double[] powerSetpoints, Function energyLevelCalculator, Function powerImportMaxCalculator, Function powerExportMaxCalculator) { - LOG.finest("Applying earning opportunities"); - - // Look for import and export earning opportunities - double[][] primary = importCostAndPower != null ? importCostAndPower : exportCostAndPower; // Never null - double[][] secondary = importCostAndPower != null ? exportCostAndPower : null; // Could be null - - List> earningOpportunities = IntStream.range(0, primary.length).mapToObj(i -> { - if (secondary == null) { - return new Pair<>(i, primary[i]); - } - // Return whichever has the lowest cost - if (primary[i][0] < secondary[i][0]) { - return new Pair<>(i, primary[i]); - } - return new Pair<>(i, secondary[i]); - }) + // Sort import intervals by cost (lowest to highest) + List> sortedImportCostAndPower = + IntStream.range(fromInterval, toInterval) + .mapToObj(i -> new Pair<>(i, importCostAndPower[i])) + .sorted(Comparator.comparingDouble(pair -> pair.value[0])) + .collect(Collectors.toList()); + + int i = 0; + while (energyDeficit > 0 && i < sortedImportCostAndPower.size()) { + double importPower = Math.min(powerImportMaxCalculator.apply(i), importCostAndPower[i][2]); + double requiredPower = energyDeficit / intervalSize; + // If we earn by importing then take the maximum power + importPower = + importCostAndPower[i][0] < 0 ? importPower : Math.min(importPower, requiredPower); + powerSetpoints[i] = importPower; + energyDeficit -= importPower; + i++; + } + } + + /** + * Will find the best earning opportunity for each interval (import or export) and will then try + * to apply them in chronological order (reallocating earlier import/exports if it cost + * beneficial). The powerSetpoints will be updated as a result. + */ + public void applyEarningOpportunities( + double[][] importCostAndPower, + double[][] exportCostAndPower, + double[] energyLevelMins, + double[] energyLevelMaxs, + double[] powerSetpoints, + Function energyLevelCalculator, + Function powerImportMaxCalculator, + Function powerExportMaxCalculator) { + LOG.finest("Applying earning opportunities"); + + // Look for import and export earning opportunities + double[][] primary = + importCostAndPower != null ? importCostAndPower : exportCostAndPower; // Never null + double[][] secondary = importCostAndPower != null ? exportCostAndPower : null; // Could be null + + List> earningOpportunities = + IntStream.range(0, primary.length) + .mapToObj( + i -> { + if (secondary == null) { + return new Pair<>(i, primary[i]); + } + // Return whichever has the lowest cost + if (primary[i][0] < secondary[i][0]) { + return new Pair<>(i, primary[i]); + } + return new Pair<>(i, secondary[i]); + }) .filter(intervalCostAndPowerBand -> intervalCostAndPowerBand.value[0] < 0) .sorted(Comparator.comparingDouble(optimisedInterval -> optimisedInterval.value[0])) .collect(Collectors.toList()); - if (earningOpportunities.isEmpty()) { - LOG.finest("No earning opportunities found"); - } - - if (LOG.isLoggable(Level.FINEST)) { - earningOpportunities.forEach(op -> LOG.finest("Earning opportunity: interval=" + op.key + ", cost=" + op.value[0] + ", powerMin=" + op.value[1] + ", powerMax=" + op.value[2])); - } - - // Go through each earning opportunity and determine if it can be utilised without breaching the energy min - // levels - for (Pair earningOpportunity : earningOpportunities) { - int interval = earningOpportunity.key; - double[] costAndPower = earningOpportunity.value; - assert importCostAndPower != null; - assert exportCostAndPower != null; - - if (isImportOpportunity(costAndPower, powerSetpoints[interval], interval, powerImportMaxCalculator)) { - // import opportunity and interval still available to import power - applyImportOpportunity(importCostAndPower, exportCostAndPower, energyLevelMins, energyLevelMaxs, powerSetpoints, energyLevelCalculator, powerImportMaxCalculator, powerExportMaxCalculator, interval); - } else if (isExportOpportunity(costAndPower, powerSetpoints[interval], interval, powerExportMaxCalculator)) { - // export opportunity and interval still available to export power - applyExportOpportunity(importCostAndPower, exportCostAndPower, energyLevelMins, energyLevelMaxs, powerSetpoints, energyLevelCalculator, powerImportMaxCalculator, powerExportMaxCalculator, interval); - } - } + if (earningOpportunities.isEmpty()) { + LOG.finest("No earning opportunities found"); } - protected boolean isImportOpportunity(double[] costAndPower, double powerSetpoint, int interval, Function powerImportMaxCalculator) { - return costAndPower[2] > 0 && powerSetpoint >= 0 && powerSetpoint < Math.min(powerImportMaxCalculator.apply(interval), costAndPower[2]); + if (LOG.isLoggable(Level.FINEST)) { + earningOpportunities.forEach( + op -> + LOG.finest( + "Earning opportunity: interval=" + + op.key + + ", cost=" + + op.value[0] + + ", powerMin=" + + op.value[1] + + ", powerMax=" + + op.value[2])); } - protected boolean isExportOpportunity(double[] costAndPower, double powerSetpoint, int interval, Function powerExportMaxCalculator) { - return costAndPower[1] < 0 && powerSetpoint <= 0 && powerSetpoint > Math.max(powerExportMaxCalculator.apply(interval), costAndPower[1]); + // Go through each earning opportunity and determine if it can be utilised without breaching the + // energy min + // levels + for (Pair earningOpportunity : earningOpportunities) { + int interval = earningOpportunity.key; + double[] costAndPower = earningOpportunity.value; + assert importCostAndPower != null; + assert exportCostAndPower != null; + + if (isImportOpportunity( + costAndPower, powerSetpoints[interval], interval, powerImportMaxCalculator)) { + // import opportunity and interval still available to import power + applyImportOpportunity( + importCostAndPower, + exportCostAndPower, + energyLevelMins, + energyLevelMaxs, + powerSetpoints, + energyLevelCalculator, + powerImportMaxCalculator, + powerExportMaxCalculator, + interval); + } else if (isExportOpportunity( + costAndPower, powerSetpoints[interval], interval, powerExportMaxCalculator)) { + // export opportunity and interval still available to export power + applyExportOpportunity( + importCostAndPower, + exportCostAndPower, + energyLevelMins, + energyLevelMaxs, + powerSetpoints, + energyLevelCalculator, + powerImportMaxCalculator, + powerExportMaxCalculator, + interval); + } + } + } + + protected boolean isImportOpportunity( + double[] costAndPower, + double powerSetpoint, + int interval, + Function powerImportMaxCalculator) { + return costAndPower[2] > 0 + && powerSetpoint >= 0 + && powerSetpoint < Math.min(powerImportMaxCalculator.apply(interval), costAndPower[2]); + } + + protected boolean isExportOpportunity( + double[] costAndPower, + double powerSetpoint, + int interval, + Function powerExportMaxCalculator) { + return costAndPower[1] < 0 + && powerSetpoint <= 0 + && powerSetpoint > Math.max(powerExportMaxCalculator.apply(interval), costAndPower[1]); + } + + /** + * Tries to apply the maximum import power as defined in the importCostAndPower at the specified + * interval taking into consideration the maximum power and energy levels; if there is + * insufficient power or energy capacity at the interval then an earlier cost effective export + * opportunity will be attempted to offset the requirement. The powerSetpoints will be updated as + * a result. + */ + public void applyImportOpportunity( + double[][] importCostAndPower, + double[][] exportCostAndPower, + double[] energyLevelMins, + double[] energyLevelMaxs, + double[] powerSetpoints, + Function energyLevelCalculator, + Function powerImportMaxCalculator, + Function powerExportMaxCalculator, + int interval) { + LOG.finest("Applying import earning opportunity: interval=" + interval); + double[] costAndPower = importCostAndPower[interval]; + double impPowerMin = costAndPower[1]; + double impPowerMax = Math.min(powerImportMaxCalculator.apply(interval), costAndPower[2]); + double powerCapacity = impPowerMax - powerSetpoints[interval]; + + if (impPowerMin > powerCapacity) { + LOG.finest("Can't attain min power level to make use of this opportunity"); + return; } - /** - * Tries to apply the maximum import power as defined in the importCostAndPower at the specified interval taking - * into consideration the maximum power and energy levels; if there is insufficient power or energy capacity at the - * interval then an earlier cost effective export opportunity will be attempted to offset the requirement. The - * powerSetpoints will be updated as a result. - */ - public void applyImportOpportunity(double[][] importCostAndPower, double[][] exportCostAndPower, double[] energyLevelMins, double[] energyLevelMaxs, double[] powerSetpoints, Function energyLevelCalculator, Function powerImportMaxCalculator, Function powerExportMaxCalculator, int interval) { - LOG.finest("Applying import earning opportunity: interval=" + interval); - double[] costAndPower = importCostAndPower[interval]; - double impPowerMin = costAndPower[1]; - double impPowerMax = Math.min(powerImportMaxCalculator.apply(interval), costAndPower[2]); - double powerCapacity = impPowerMax - powerSetpoints[interval]; - - if (impPowerMin > powerCapacity) { - LOG.finest("Can't attain min power level to make use of this opportunity"); - return; - } - - double energySpace = energyLevelMaxs[interval] - energyLevelCalculator.apply(interval); - double energySpaceMax = powerCapacity * intervalSize; - double energySpaceMin = impPowerMin * intervalSize; - List> pastIntervalPowerDeltas = new ArrayList<>(); - - int k = interval; - while (k < powerSetpoints.length && energySpace > 0 && energySpace >= energySpaceMin) { - double futureEnergySpace = energyLevelMaxs[k] - energyLevelCalculator.apply(k); - energySpace = Math.min(energySpace, futureEnergySpace); - k++; - } - - if (energySpace < energySpaceMax && exportCostAndPower != null) { - // Can't maximise on opportunity without exporting earlier on so can this be done - // in a cost effective way - LOG.finest("Looking for earlier export opportunities to maximise on this import opportunity: space=" + energySpace + ", max=" + energySpaceMax); - int i = interval - 1; - List> pastOpportunities = new ArrayList<>(); - - while (i >= 0) { - if (costAndPower[0] + exportCostAndPower[i][0] < 0 && powerSetpoints[i] <= 0) { - // We can afford to export earlier and still earn from this import - pastOpportunities.add(new Pair<>(i, exportCostAndPower[i][0])); - } - i--; - } - - pastOpportunities.sort(Comparator.comparingDouble(op -> op.value)); - int j = 0; - - if (pastOpportunities.isEmpty()) { - LOG.finest("No earlier export opportunities identified"); - } - - while (energySpace < energySpaceMax && j < pastOpportunities.size()) { - // Energy level at this interval must be above energy min to consider exporting - Pair opportunity = pastOpportunities.get(j); - int pastInterval = opportunity.key; - - // Power capacity must be within the optimum power band - double[] pastCostAndPower = exportCostAndPower[pastInterval]; - double expPowerMax = Math.max(powerExportMaxCalculator.apply(pastInterval), pastCostAndPower[1]); - double expPowerCapacity = expPowerMax - powerSetpoints[pastInterval]; - - if (expPowerCapacity >= 0 || expPowerCapacity > pastCostAndPower[2]) { - LOG.finest("Power capacity is outside optimum power band so cannot use this opportunity"); - j++; - continue; - } - - double energySurplusMin = pastCostAndPower[2] * intervalSize; - double energySurplus = energyLevelMins[pastInterval] - energyLevelCalculator.apply(pastInterval); - energySurplus = Math.max(energySurplus, energySpace - energySpaceMax); - - // We have spare energy capacity and power check if we don't violate energy min for any future exports - k = pastInterval; - while (k < powerSetpoints.length && energySurplus < 0 && energySurplus <= energySurplusMin) { - double futureEnergySurplus = energyLevelCalculator.apply(k) - energyLevelMins[k]; - energySurplus = Math.max(energySurplus, -futureEnergySurplus); - if (energySurplus <= 0) { - LOG.finest("Earlier export opportunity would violate future energy min level: interval=" + j + ", futureInterval=" + k); - } - k++; - } - - expPowerCapacity = Math.max(expPowerCapacity, energySurplus / intervalSize); + double energySpace = energyLevelMaxs[interval] - energyLevelCalculator.apply(interval); + double energySpaceMax = powerCapacity * intervalSize; + double energySpaceMin = impPowerMin * intervalSize; + List> pastIntervalPowerDeltas = new ArrayList<>(); - if (expPowerCapacity < 0 && expPowerCapacity < pastCostAndPower[2]) { - // We can export in the optimum range - energySpace += (-1d * expPowerCapacity * intervalSize); - pastIntervalPowerDeltas.add(new Pair<>(pastInterval, expPowerCapacity)); - LOG.finest("Earlier export opportunity identified: interval=" + pastInterval + ", power=" + expPowerCapacity); - } + int k = interval; + while (k < powerSetpoints.length && energySpace > 0 && energySpace >= energySpaceMin) { + double futureEnergySpace = energyLevelMaxs[k] - energyLevelCalculator.apply(k); + energySpace = Math.min(energySpace, futureEnergySpace); + k++; + } - j++; - } + if (energySpace < energySpaceMax && exportCostAndPower != null) { + // Can't maximise on opportunity without exporting earlier on so can this be done + // in a cost effective way + LOG.finest( + "Looking for earlier export opportunities to maximise on this import opportunity: space=" + + energySpace + + ", max=" + + energySpaceMax); + int i = interval - 1; + List> pastOpportunities = new ArrayList<>(); + + while (i >= 0) { + if (costAndPower[0] + exportCostAndPower[i][0] < 0 && powerSetpoints[i] <= 0) { + // We can afford to export earlier and still earn from this import + pastOpportunities.add(new Pair<>(i, exportCostAndPower[i][0])); } - - // Do original import if there is enough energy space - if (energySpace > 0 && energySpace >= energySpaceMin) { - - // Adjust past interval set points as required - pastIntervalPowerDeltas.forEach(intervalAndDelta -> powerSetpoints[intervalAndDelta.key] += intervalAndDelta.value); - - energySpaceMax = Math.min(energySpaceMax, energySpace); - powerCapacity = Math.min(impPowerMax - powerSetpoints[interval], (energySpaceMax / intervalSize)); - powerSetpoints[interval] = powerSetpoints[interval] + powerCapacity; - LOG.finest("Applied import earning opportunity: set point=" + powerSetpoints[interval] + " (delta: " + powerCapacity + ")"); + i--; + } + + pastOpportunities.sort(Comparator.comparingDouble(op -> op.value)); + int j = 0; + + if (pastOpportunities.isEmpty()) { + LOG.finest("No earlier export opportunities identified"); + } + + while (energySpace < energySpaceMax && j < pastOpportunities.size()) { + // Energy level at this interval must be above energy min to consider exporting + Pair opportunity = pastOpportunities.get(j); + int pastInterval = opportunity.key; + + // Power capacity must be within the optimum power band + double[] pastCostAndPower = exportCostAndPower[pastInterval]; + double expPowerMax = + Math.max(powerExportMaxCalculator.apply(pastInterval), pastCostAndPower[1]); + double expPowerCapacity = expPowerMax - powerSetpoints[pastInterval]; + + if (expPowerCapacity >= 0 || expPowerCapacity > pastCostAndPower[2]) { + LOG.finest("Power capacity is outside optimum power band so cannot use this opportunity"); + j++; + continue; } - } - /** - * Tries to apply the maximum export power as defined in the exportCostAndPower at the specified interval taking - * into consideration the maximum power and energy levels; if there is insufficient power or energy capacity at the - * interval then an earlier cost effective import opportunity will be attempted to offset the requirement. The - * powerSetpoints will be updated as a result. - */ - public void applyExportOpportunity(double[][] importCostAndPower, double[][] exportCostAndPower, double[] energyLevelMins, double[] energyLevelMaxs, double[] powerSetpoints, Function energyLevelCalculator, Function powerImportMaxCalculator, Function powerExportMaxCalculator, int interval) { - LOG.finest("Applying export earning opportunity: interval=" + interval); - double[] costAndPower = exportCostAndPower[interval]; - double expPowerMin = costAndPower[2]; - double expPowerMax = Math.max(powerExportMaxCalculator.apply(interval), costAndPower[1]); - double powerCapacity = expPowerMax - powerSetpoints[interval]; - - if (expPowerMin < powerCapacity) { - LOG.finest("Can't attain min power level to make use of this opportunity"); - return; + double energySurplusMin = pastCostAndPower[2] * intervalSize; + double energySurplus = + energyLevelMins[pastInterval] - energyLevelCalculator.apply(pastInterval); + energySurplus = Math.max(energySurplus, energySpace - energySpaceMax); + + // We have spare energy capacity and power check if we don't violate energy min for any + // future exports + k = pastInterval; + while (k < powerSetpoints.length + && energySurplus < 0 + && energySurplus <= energySurplusMin) { + double futureEnergySurplus = energyLevelCalculator.apply(k) - energyLevelMins[k]; + energySurplus = Math.max(energySurplus, -futureEnergySurplus); + if (energySurplus <= 0) { + LOG.finest( + "Earlier export opportunity would violate future energy min level: interval=" + + j + + ", futureInterval=" + + k); + } + k++; } - double energySurplus = energyLevelCalculator.apply(interval) - energyLevelMins[interval]; - double energySurplusMin = -1d * expPowerMin * intervalSize; - double energySurplusMax = -1d * powerCapacity * intervalSize; - List> pastAndFutureIntervalPowerDeltas = new ArrayList<>(); - - int k = interval; - while (k < powerSetpoints.length && energySurplus > 0 && energySurplus >= energySurplusMin) { - - double futureEnergySurplus = energyLevelCalculator.apply(k) - energyLevelMins[k]; - - // The following is an attempt to make use of an earning opportunity that would violate future energy limits - // by allocating extra imports between 'now' and 'then' - this needs more work -// if (futureEnergySurplus < energySurplusMin || futureEnergySurplus <= 0) { -// // Try and allocate an import between this future point and the earning opportunity to prevent this deficit -// int l = k - 1; -// while (futureEnergySurplus < energySurplusMax && l > interval) { -// int finalL = l; -// if (powerSetpoints[l] >= 0 && pastAndFutureIntervalPowerDeltas.stream().noneMatch(delta -> delta.key.equals(finalL))) { -// -// double surplusDeficit = energySurplusMax - futureEnergySurplus; -// double intermediateEnergyCapacity = energyLevelMax - energyLevelCalculator.apply(l); -// double intermediatePowerCapacity = powerImportMaxCalculator.apply(l) - powerSetpoints[l]; -// intermediatePowerCapacity = Math.min(intermediatePowerCapacity, surplusDeficit / intervalSize); -// intermediatePowerCapacity = Math.min(intermediatePowerCapacity, intermediateEnergyCapacity / intervalSize); -// -// if (intermediatePowerCapacity > 0 && powerSetpoints[l] + intermediatePowerCapacity > importCostAndPower[l][1] && costAndPower[0] + importCostAndPower[l][0] < 0) { -// // There is capacity and it is cost effective to use it -// futureEnergySurplus = intermediatePowerCapacity * intervalSize; -// pastAndFutureIntervalPowerDeltas.add(new Pair<>(l, intermediatePowerCapacity)); -// } -// } -// l--; -// } -// } - - energySurplus = Math.min(energySurplus, futureEnergySurplus); - k++; - + expPowerCapacity = Math.max(expPowerCapacity, energySurplus / intervalSize); + + if (expPowerCapacity < 0 && expPowerCapacity < pastCostAndPower[2]) { + // We can export in the optimum range + energySpace += (-1d * expPowerCapacity * intervalSize); + pastIntervalPowerDeltas.add(new Pair<>(pastInterval, expPowerCapacity)); + LOG.finest( + "Earlier export opportunity identified: interval=" + + pastInterval + + ", power=" + + expPowerCapacity); } - if (energySurplus < energySurplusMax && importCostAndPower != null) { - // Can't maximise on opportunity without importing earlier on so can this be done - // in a cost effective way - LOG.finest("Looking for earlier import opportunities to maximise on this export opportunity: surplus=" + energySurplus + ", max=" + energySurplusMax); - int i = interval - 1; - List> pastOpportunities = new ArrayList<>(); - - while (i >= 0) { - - if (costAndPower[0] + importCostAndPower[i][0] < 0 && powerSetpoints[i] >= 0) { - // We can afford to import and still earn using original export - pastOpportunities.add(new Pair<>(i, importCostAndPower[i][0])); - } - - i--; - } - - pastOpportunities.sort(Comparator.comparingDouble(op -> op.value)); - int j = 0; - - if (pastOpportunities.isEmpty()) { - LOG.finest("No earlier import opportunities identified"); - } - - while (energySurplus < energySurplusMax && j < pastOpportunities.size()) { - Pair opportunity = pastOpportunities.get(j); - int pastInterval = opportunity.key; + j++; + } + } - // Power capacity must be within the optimum power band - double[] pastCostAndPower = importCostAndPower[pastInterval]; - double impPowerMax = Math.min(powerImportMaxCalculator.apply(interval), pastCostAndPower[2]); - double impPowerCapacity = impPowerMax - powerSetpoints[pastInterval]; + // Do original import if there is enough energy space + if (energySpace > 0 && energySpace >= energySpaceMin) { + + // Adjust past interval set points as required + pastIntervalPowerDeltas.forEach( + intervalAndDelta -> powerSetpoints[intervalAndDelta.key] += intervalAndDelta.value); + + energySpaceMax = Math.min(energySpaceMax, energySpace); + powerCapacity = + Math.min(impPowerMax - powerSetpoints[interval], (energySpaceMax / intervalSize)); + powerSetpoints[interval] = powerSetpoints[interval] + powerCapacity; + LOG.finest( + "Applied import earning opportunity: set point=" + + powerSetpoints[interval] + + " (delta: " + + powerCapacity + + ")"); + } + } + + /** + * Tries to apply the maximum export power as defined in the exportCostAndPower at the specified + * interval taking into consideration the maximum power and energy levels; if there is + * insufficient power or energy capacity at the interval then an earlier cost effective import + * opportunity will be attempted to offset the requirement. The powerSetpoints will be updated as + * a result. + */ + public void applyExportOpportunity( + double[][] importCostAndPower, + double[][] exportCostAndPower, + double[] energyLevelMins, + double[] energyLevelMaxs, + double[] powerSetpoints, + Function energyLevelCalculator, + Function powerImportMaxCalculator, + Function powerExportMaxCalculator, + int interval) { + LOG.finest("Applying export earning opportunity: interval=" + interval); + double[] costAndPower = exportCostAndPower[interval]; + double expPowerMin = costAndPower[2]; + double expPowerMax = Math.max(powerExportMaxCalculator.apply(interval), costAndPower[1]); + double powerCapacity = expPowerMax - powerSetpoints[interval]; + + if (expPowerMin < powerCapacity) { + LOG.finest("Can't attain min power level to make use of this opportunity"); + return; + } - if (impPowerCapacity <= 0 || impPowerCapacity < pastCostAndPower[1]) { - LOG.finest("Power capacity is outside optimum power band so cannot use this opportunity"); - j++; - continue; - } + double energySurplus = energyLevelCalculator.apply(interval) - energyLevelMins[interval]; + double energySurplusMin = -1d * expPowerMin * intervalSize; + double energySurplusMax = -1d * powerCapacity * intervalSize; + List> pastAndFutureIntervalPowerDeltas = new ArrayList<>(); + + int k = interval; + while (k < powerSetpoints.length && energySurplus > 0 && energySurplus >= energySurplusMin) { + + double futureEnergySurplus = energyLevelCalculator.apply(k) - energyLevelMins[k]; + + // The following is an attempt to make use of an earning opportunity that would violate future + // energy limits + // by allocating extra imports between 'now' and 'then' - this needs more work + // if (futureEnergySurplus < energySurplusMin || futureEnergySurplus <= 0) { + // // Try and allocate an import between this future point and the earning + // opportunity to prevent this deficit + // int l = k - 1; + // while (futureEnergySurplus < energySurplusMax && l > interval) { + // int finalL = l; + // if (powerSetpoints[l] >= 0 && + // pastAndFutureIntervalPowerDeltas.stream().noneMatch(delta -> delta.key.equals(finalL))) { + // + // double surplusDeficit = energySurplusMax - futureEnergySurplus; + // double intermediateEnergyCapacity = energyLevelMax - + // energyLevelCalculator.apply(l); + // double intermediatePowerCapacity = powerImportMaxCalculator.apply(l) + // - powerSetpoints[l]; + // intermediatePowerCapacity = Math.min(intermediatePowerCapacity, + // surplusDeficit / intervalSize); + // intermediatePowerCapacity = Math.min(intermediatePowerCapacity, + // intermediateEnergyCapacity / intervalSize); + // + // if (intermediatePowerCapacity > 0 && powerSetpoints[l] + + // intermediatePowerCapacity > importCostAndPower[l][1] && costAndPower[0] + + // importCostAndPower[l][0] < 0) { + // // There is capacity and it is cost effective to use it + // futureEnergySurplus = intermediatePowerCapacity * intervalSize; + // pastAndFutureIntervalPowerDeltas.add(new Pair<>(l, + // intermediatePowerCapacity)); + // } + // } + // l--; + // } + // } + + energySurplus = Math.min(energySurplus, futureEnergySurplus); + k++; + } - double energySpaceMin = pastCostAndPower[1] * intervalSize; - double energySpace = energyLevelMaxs[interval] - energyLevelCalculator.apply(pastInterval); - energySpace = Math.max(energySpace, energySpace - energySurplusMax); + if (energySurplus < energySurplusMax && importCostAndPower != null) { + // Can't maximise on opportunity without importing earlier on so can this be done + // in a cost effective way + LOG.finest( + "Looking for earlier import opportunities to maximise on this export opportunity: surplus=" + + energySurplus + + ", max=" + + energySurplusMax); + int i = interval - 1; + List> pastOpportunities = new ArrayList<>(); + + while (i >= 0) { + + if (costAndPower[0] + importCostAndPower[i][0] < 0 && powerSetpoints[i] >= 0) { + // We can afford to import and still earn using original export + pastOpportunities.add(new Pair<>(i, importCostAndPower[i][0])); + } - // We have spare energy capacity and power check if we don't violate energy max for any future imports - k = pastInterval; - while (k < powerSetpoints.length && energySpace > 0 && energySpace >= energySpaceMin) { + i--; + } - double futureEnergySpace = energyLevelMaxs[k] - energyLevelCalculator.apply(k); - energySpace = Math.min(energySpace, futureEnergySpace); - if (energySpace <= 0) { - LOG.finest("Earlier import opportunity would violate future energy max level: interval=" + j + ", futureInterval=" + k); - } - k++; + pastOpportunities.sort(Comparator.comparingDouble(op -> op.value)); + int j = 0; - } + if (pastOpportunities.isEmpty()) { + LOG.finest("No earlier import opportunities identified"); + } - impPowerCapacity = Math.min(impPowerCapacity, energySpace / intervalSize); + while (energySurplus < energySurplusMax && j < pastOpportunities.size()) { + Pair opportunity = pastOpportunities.get(j); + int pastInterval = opportunity.key; - if (impPowerCapacity > 0 && impPowerCapacity > pastCostAndPower[1]) { - // We can import in the optimum range - energySurplus += (impPowerCapacity * intervalSize); - pastAndFutureIntervalPowerDeltas.add(new Pair<>(pastInterval, impPowerCapacity)); - LOG.finest("Earlier import opportunity identified: interval=" + pastInterval + ", power=" + impPowerCapacity); - } + // Power capacity must be within the optimum power band + double[] pastCostAndPower = importCostAndPower[pastInterval]; + double impPowerMax = + Math.min(powerImportMaxCalculator.apply(interval), pastCostAndPower[2]); + double impPowerCapacity = impPowerMax - powerSetpoints[pastInterval]; - j++; - } + if (impPowerCapacity <= 0 || impPowerCapacity < pastCostAndPower[1]) { + LOG.finest("Power capacity is outside optimum power band so cannot use this opportunity"); + j++; + continue; } - // Do original export if there is any energy surplus - if (energySurplus > 0 && energySurplus >= energySurplusMin) { + double energySpaceMin = pastCostAndPower[1] * intervalSize; + double energySpace = energyLevelMaxs[interval] - energyLevelCalculator.apply(pastInterval); + energySpace = Math.max(energySpace, energySpace - energySurplusMax); - // Adjust past interval set points as required - pastAndFutureIntervalPowerDeltas.forEach(intervalAndDelta -> powerSetpoints[intervalAndDelta.key] += intervalAndDelta.value); + // We have spare energy capacity and power check if we don't violate energy max for any + // future imports + k = pastInterval; + while (k < powerSetpoints.length && energySpace > 0 && energySpace >= energySpaceMin) { - energySurplusMax = Math.min(energySurplusMax, energySurplus); - powerCapacity = Math.max(expPowerMax - powerSetpoints[interval], -1d * (energySurplusMax / intervalSize)); - powerSetpoints[interval] = powerSetpoints[interval] + powerCapacity; - LOG.finest("Applied export earning opportunity: interval=" + interval + ", set point=" + powerSetpoints[interval] + " (delta: " + powerCapacity + ")"); + double futureEnergySpace = energyLevelMaxs[k] - energyLevelCalculator.apply(k); + energySpace = Math.min(energySpace, futureEnergySpace); + if (energySpace <= 0) { + LOG.finest( + "Earlier import opportunity would violate future energy max level: interval=" + + j + + ", futureInterval=" + + k); + } + k++; } - } - - /** - * Returns a function that can be used to calculate any export saving (per kWh) and power band needed to achieve it - * based on requested interval index and power export max value (negative as this is for export). This is used to - * determine whether there are export opportunities for earning/saving rather than using the grid. - */ - public BiFunction getExportOptimiser(double[] powerNets, double[] powerNetLimits, double[] tariffImports, double[] tariffExports, double assetExportCost) { - - // Power max should be negative as this is export - return (interval, powerMax) -> { - double powerNet = powerNets[interval]; - double powerNetLimit = powerNetLimits[interval]; - double tariffImport = tariffImports[interval]; - double tariffExport = tariffExports[interval]; - powerMax = Math.max(powerMax, powerNetLimit - powerNet); - - if (powerMax >= 0) { - // No capacity to export - return new double[]{Double.MAX_VALUE, 0d, 0d}; - } - - if (powerNet <= 0) { - // Already net exporting so tariff will not change if we export more - return new double[]{tariffExport + assetExportCost, powerMax, 0d}; - } - - if (powerNet + powerMax > 0d) { - // Can't make tariff flip (we're reducing import hence the -1d) - return new double[]{(-1d * tariffImport) + assetExportCost, powerMax, 0d}; - } - - // We can flip tariffs if we export enough power - double powerStart = 0d; - double powerEnd = 0d - powerNet; // Inflection point where switch to export instead of import - - // If import was paying then reducing import is a loss in earnings - double cost = powerEnd * (tariffImport - assetExportCost); - - // Is it beneficial to include remaining (-ve export power) - if (tariffExport + assetExportCost < 0d || tariffExport <= (-1d * tariffImport)) { - if (Math.abs((-1d * tariffImport) - tariffExport) > Double.MIN_VALUE) { - // We need to be at power max to achieve the optimum cost - powerStart = powerMax; - } - cost += -1d * (powerMax - powerEnd) * (tariffExport + assetExportCost); - powerEnd = powerMax; - } - // Normalise the cost - cost = cost / (-1d * powerEnd); + impPowerCapacity = Math.min(impPowerCapacity, energySpace / intervalSize); + + if (impPowerCapacity > 0 && impPowerCapacity > pastCostAndPower[1]) { + // We can import in the optimum range + energySurplus += (impPowerCapacity * intervalSize); + pastAndFutureIntervalPowerDeltas.add(new Pair<>(pastInterval, impPowerCapacity)); + LOG.finest( + "Earlier import opportunity identified: interval=" + + pastInterval + + ", power=" + + impPowerCapacity); + } - return new double[]{cost, powerEnd, powerStart}; - }; + j++; + } } - /** - * Returns a function that can be used to calculate the optimum cost (per kWh) and power band needed to achieve it - * based on requested interval index, power min and power max values. The returned power band will satisfy the - * requested power min value but this could mean that cost is not optimum for that interval if a lower power could - * be used. If possible a 0 power min should be tried first for all applicable intervals and if more energy is - * required then another pass can be made with a high enough min power to allow desired energy levels to be reached. - * This is used to determine the best times and power values for importing energy to meet the requirements. - */ - public BiFunction getImportOptimiser(double[] powerNets, double[] powerNetLimits, double[] tariffImports, double[] tariffExports, double assetImportCost) { - - return (interval, powerRequiredMinMax) -> { - - double powerNet = powerNets[interval]; - double powerNetLimit = powerNetLimits[interval]; - double tariffImport = tariffImports[interval]; - double tariffExport = tariffExports[interval]; - double powerMin = powerRequiredMinMax[0]; - double powerMax = Math.min(powerRequiredMinMax[1], powerNetLimit - powerNet); - - if (powerMax <= 0d) { - // No capacity to import - return new double[]{Double.MAX_VALUE, 0d, 0d}; - } - - if (powerNet >= 0d) { - // Already net importing so tariff will not change if we import more - return new double[]{tariffImport + assetImportCost, powerMin, powerMax}; - } - - if (powerNet + powerMax < 0d) { - // Can't make tariff flip (we're reducing import hence the -1d) - return new double[]{(-1d * tariffExport) + assetImportCost, powerMin, powerMax}; - } - - // We can flip tariffs if we take enough power - double powerStart = powerMin; - double powerEnd = 0d - powerNet; // Inflection point where switch to import instead of export - - // If export was paying then reducing export is a loss in earnings i.e. a cost and vice versa hence the -1d - double cost = -1d * powerEnd * (tariffExport - assetImportCost); - - if (powerMin > powerEnd) { - // We have to flip to meet power req - cost += (powerMin - powerEnd) * (tariffImport + assetImportCost); - powerEnd = powerMin; - } - - if (powerEnd < powerMax) { - // Is it beneficial to include remaining (+ve import power) - if (tariffImport + assetImportCost < 0d || tariffImport <= (-1d * tariffExport)) { - if (Math.abs((-1d * tariffExport) - tariffImport) > Double.MIN_VALUE) { - // We need to be at power max to achieve the optimum cost - powerStart = powerMax; - } - cost += (powerMax - powerEnd) * (tariffImport + assetImportCost); - powerEnd = powerMax; - } - } + // Do original export if there is any energy surplus + if (energySurplus > 0 && energySurplus >= energySurplusMin) { + + // Adjust past interval set points as required + pastAndFutureIntervalPowerDeltas.forEach( + intervalAndDelta -> powerSetpoints[intervalAndDelta.key] += intervalAndDelta.value); + + energySurplusMax = Math.min(energySurplusMax, energySurplus); + powerCapacity = + Math.max(expPowerMax - powerSetpoints[interval], -1d * (energySurplusMax / intervalSize)); + powerSetpoints[interval] = powerSetpoints[interval] + powerCapacity; + LOG.finest( + "Applied export earning opportunity: interval=" + + interval + + ", set point=" + + powerSetpoints[interval] + + " (delta: " + + powerCapacity + + ")"); + } + } + + /** + * Returns a function that can be used to calculate any export saving (per kWh) and power band + * needed to achieve it based on requested interval index and power export max value (negative as + * this is for export). This is used to determine whether there are export opportunities for + * earning/saving rather than using the grid. + */ + public BiFunction getExportOptimiser( + double[] powerNets, + double[] powerNetLimits, + double[] tariffImports, + double[] tariffExports, + double assetExportCost) { + + // Power max should be negative as this is export + return (interval, powerMax) -> { + double powerNet = powerNets[interval]; + double powerNetLimit = powerNetLimits[interval]; + double tariffImport = tariffImports[interval]; + double tariffExport = tariffExports[interval]; + powerMax = Math.max(powerMax, powerNetLimit - powerNet); + + if (powerMax >= 0) { + // No capacity to export + return new double[] {Double.MAX_VALUE, 0d, 0d}; + } + + if (powerNet <= 0) { + // Already net exporting so tariff will not change if we export more + return new double[] {tariffExport + assetExportCost, powerMax, 0d}; + } + + if (powerNet + powerMax > 0d) { + // Can't make tariff flip (we're reducing import hence the -1d) + return new double[] {(-1d * tariffImport) + assetExportCost, powerMax, 0d}; + } + + // We can flip tariffs if we export enough power + double powerStart = 0d; + double powerEnd = 0d - powerNet; // Inflection point where switch to export instead of import + + // If import was paying then reducing import is a loss in earnings + double cost = powerEnd * (tariffImport - assetExportCost); + + // Is it beneficial to include remaining (-ve export power) + if (tariffExport + assetExportCost < 0d || tariffExport <= (-1d * tariffImport)) { + if (Math.abs((-1d * tariffImport) - tariffExport) > Double.MIN_VALUE) { + // We need to be at power max to achieve the optimum cost + powerStart = powerMax; + } + cost += -1d * (powerMax - powerEnd) * (tariffExport + assetExportCost); + powerEnd = powerMax; + } + + // Normalise the cost + cost = cost / (-1d * powerEnd); + + return new double[] {cost, powerEnd, powerStart}; + }; + } + + /** + * Returns a function that can be used to calculate the optimum cost (per kWh) and power band + * needed to achieve it based on requested interval index, power min and power max values. The + * returned power band will satisfy the requested power min value but this could mean that cost is + * not optimum for that interval if a lower power could be used. If possible a 0 power min should + * be tried first for all applicable intervals and if more energy is required then another pass + * can be made with a high enough min power to allow desired energy levels to be reached. This is + * used to determine the best times and power values for importing energy to meet the + * requirements. + */ + public BiFunction getImportOptimiser( + double[] powerNets, + double[] powerNetLimits, + double[] tariffImports, + double[] tariffExports, + double assetImportCost) { + + return (interval, powerRequiredMinMax) -> { + double powerNet = powerNets[interval]; + double powerNetLimit = powerNetLimits[interval]; + double tariffImport = tariffImports[interval]; + double tariffExport = tariffExports[interval]; + double powerMin = powerRequiredMinMax[0]; + double powerMax = Math.min(powerRequiredMinMax[1], powerNetLimit - powerNet); + + if (powerMax <= 0d) { + // No capacity to import + return new double[] {Double.MAX_VALUE, 0d, 0d}; + } + + if (powerNet >= 0d) { + // Already net importing so tariff will not change if we import more + return new double[] {tariffImport + assetImportCost, powerMin, powerMax}; + } + + if (powerNet + powerMax < 0d) { + // Can't make tariff flip (we're reducing import hence the -1d) + return new double[] {(-1d * tariffExport) + assetImportCost, powerMin, powerMax}; + } + + // We can flip tariffs if we take enough power + double powerStart = powerMin; + double powerEnd = 0d - powerNet; // Inflection point where switch to import instead of export + + // If export was paying then reducing export is a loss in earnings i.e. a cost and vice versa + // hence the -1d + double cost = -1d * powerEnd * (tariffExport - assetImportCost); + + if (powerMin > powerEnd) { + // We have to flip to meet power req + cost += (powerMin - powerEnd) * (tariffImport + assetImportCost); + powerEnd = powerMin; + } + + if (powerEnd < powerMax) { + // Is it beneficial to include remaining (+ve import power) + if (tariffImport + assetImportCost < 0d || tariffImport <= (-1d * tariffExport)) { + if (Math.abs((-1d * tariffExport) - tariffImport) > Double.MIN_VALUE) { + // We need to be at power max to achieve the optimum cost + powerStart = powerMax; + } + cost += (powerMax - powerEnd) * (tariffImport + assetImportCost); + powerEnd = powerMax; + } + } - // Normalise the cost - cost = cost / powerEnd; + // Normalise the cost + cost = cost / powerEnd; - return new double[]{cost, powerStart, powerEnd}; - }; - } + return new double[] {cost, powerStart, powerEnd}; + }; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/manager/ForecastSolarService.java b/energy/src/main/java/org/openremote/extension/energy/manager/ForecastSolarService.java index 07a1d1a..1c770e1 100644 --- a/energy/src/main/java/org/openremote/extension/energy/manager/ForecastSolarService.java +++ b/energy/src/main/java/org/openremote/extension/energy/manager/ForecastSolarService.java @@ -1,7 +1,46 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy.manager; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; +import static java.time.format.DateTimeFormatter.ISO_LOCAL_TIME; +import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; +import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; +import static org.openremote.container.web.WebTargetBuilder.getClient; +import static org.openremote.manager.gateway.GatewayService.isNotForGateway; +import static org.openremote.model.syslog.SyslogCategory.DATA; +import static org.openremote.model.util.MapAccess.getString; + import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.ws.rs.core.Response; +import java.io.IOException; +import java.net.URI; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.camel.builder.RouteBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; import org.openremote.container.message.MessageBrokerService; @@ -28,395 +67,501 @@ import org.openremote.model.query.AssetQuery; import org.openremote.model.syslog.SyslogCategory; -import java.io.IOException; -import java.net.URI; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.*; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; -import static java.time.format.DateTimeFormatter.ISO_LOCAL_TIME; -import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; -import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; -import static org.openremote.container.web.WebTargetBuilder.getClient; -import static org.openremote.manager.gateway.GatewayService.isNotForGateway; -import static org.openremote.model.syslog.SyslogCategory.DATA; -import static org.openremote.model.util.MapAccess.getString; - /** - * Fills in power forecast from ForecastSolar (https://forecast.solar) for {@link ElectricityProducerSolarAsset}. + * Fills in power forecast from ForecastSolar (https://forecast.solar) for {@link + * ElectricityProducerSolarAsset}. */ public class ForecastSolarService extends RouteBuilder implements ContainerService { - protected static class EstimateResponse { - @JsonProperty - protected Result result; + protected static class EstimateResponse { + @JsonProperty protected Result result; + } + + protected static class Result { + @JsonProperty protected Map wattHours; + @JsonProperty protected Map wattHoursDay; + @JsonProperty protected Map watts; + } + + public static final String OR_FORECAST_SOLAR_API_KEY = "OR_FORECAST_SOLAR_API_KEY"; + + protected static final DateTimeFormatter ISO_LOCAL_DATE_TIME_WITHOUT_T = + new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .append(ISO_LOCAL_DATE) + .appendLiteral(' ') + .append(ISO_LOCAL_TIME) + .toFormatter(); + + protected ScheduledExecutorService scheduledExecutorService; + protected AssetStorageService assetStorageService; + protected AssetProcessingService assetProcessingService; + protected AssetPredictedDatapointService assetPredictedDatapointService; + protected GatewayService gatewayService; + protected ClientEventService clientEventService; + protected RulesService rulesService; + protected TimerService timerService; + + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, ForecastSolarService.class.getName()); + protected ResteasyWebTarget forecastSolarTarget; + private String forecastSolarApiKey; + private final Map electricityProducerSolarAssetMap = + new HashMap<>(); + + @SuppressWarnings("unchecked") + @Override + public void configure() throws Exception { + from(PERSISTENCE_TOPIC) + .routeId("Persistence-ForecastSolar") + .filter(isPersistenceEventForEntityType(ElectricityProducerSolarAsset.class)) + .filter(isNotForGateway(gatewayService)) + .process( + exchange -> + processAssetChange( + (PersistenceEvent) + exchange.getIn().getBody(PersistenceEvent.class))); + } + + @Override + public void init(Container container) throws Exception { + assetStorageService = container.getService(AssetStorageService.class); + assetProcessingService = container.getService(AssetProcessingService.class); + gatewayService = container.getService(GatewayService.class); + assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); + clientEventService = container.getService(ClientEventService.class); + scheduledExecutorService = container.getScheduledExecutor(); + rulesService = container.getService(RulesService.class); + timerService = container.getService(TimerService.class); + + forecastSolarApiKey = getString(container.getConfig(), OR_FORECAST_SOLAR_API_KEY, null); + } + + @Override + public void start(Container container) throws Exception { + if (forecastSolarApiKey == null) { + LOG.fine("No value found for OR_FORECAST_SOLAR_API_KEY, ForecastSolarService won't start"); + return; } - protected static class Result { - @JsonProperty - protected Map wattHours; - @JsonProperty - protected Map wattHoursDay; - @JsonProperty - protected Map watts; + forecastSolarTarget = + new WebTargetBuilder( + getClient(), + URI.create("https://api.forecast.solar/" + forecastSolarApiKey + "/estimate")) + .build(); + + container.getService(MessageBrokerService.class).getContext().addRoutes(this); + + // Load all enabled producer solar assets + LOG.fine("Loading electricity producer solar assets..."); + + List electricityProducerSolarAssets = + assetStorageService + .findAll(new AssetQuery().types(ElectricityProducerSolarAsset.class)) + .stream() + .map(asset -> (ElectricityProducerSolarAsset) asset) + .filter( + electricityProducerSolarAsset -> + electricityProducerSolarAsset.isIncludeForecastSolarService().orElse(false)) + .toList(); + + LOG.fine( + "Number of electricity producer solar assets with forecast enabled = " + + electricityProducerSolarAssets.size()); + + for (ElectricityProducerSolarAsset electricityProducerSolarAsset : + electricityProducerSolarAssets) { + electricityProducerSolarAssetMap.put( + electricityProducerSolarAsset.getId(), electricityProducerSolarAsset); + getSolarForecast(electricityProducerSolarAsset); + updateSolarForecastAttribute(electricityProducerSolarAsset); } - public static final String OR_FORECAST_SOLAR_API_KEY = "OR_FORECAST_SOLAR_API_KEY"; - - protected static final DateTimeFormatter ISO_LOCAL_DATE_TIME_WITHOUT_T = new DateTimeFormatterBuilder() - .parseCaseInsensitive() - .append(ISO_LOCAL_DATE) - .appendLiteral(' ') - .append(ISO_LOCAL_TIME) - .toFormatter(); - - protected ScheduledExecutorService scheduledExecutorService; - protected AssetStorageService assetStorageService; - protected AssetProcessingService assetProcessingService; - protected AssetPredictedDatapointService assetPredictedDatapointService; - protected GatewayService gatewayService; - protected ClientEventService clientEventService; - protected RulesService rulesService; - protected TimerService timerService; - - protected static final Logger LOG = SyslogCategory.getLogger(DATA, ForecastSolarService.class.getName()); - protected ResteasyWebTarget forecastSolarTarget; - private String forecastSolarApiKey; - private final Map electricityProducerSolarAssetMap = new HashMap<>(); - - @SuppressWarnings("unchecked") - @Override - public void configure() throws Exception { - from(PERSISTENCE_TOPIC) - .routeId("Persistence-ForecastSolar") - .filter(isPersistenceEventForEntityType(ElectricityProducerSolarAsset.class)) - .filter(isNotForGateway(gatewayService)) - .process(exchange -> processAssetChange((PersistenceEvent) exchange.getIn().getBody(PersistenceEvent.class))); + // Start forecast solar thread + scheduledExecutorService.scheduleAtFixedRate(this::processSolarData, 1, 1, TimeUnit.MINUTES); + + clientEventService.addSubscription( + AttributeEvent.class, + new AssetFilter() + .setAssetClasses(Collections.singletonList(ElectricityProducerSolarAsset.class)), + this::processElectricityProducerSolarAssetAttributeEvent); + } + + @Override + public void stop(Container container) throws Exception { + // empty + } + + protected synchronized void processElectricityProducerSolarAssetAttributeEvent( + AttributeEvent attributeEvent) { + String attributeName = attributeEvent.getName(); + + // These are updated by this service + if (ElectricityProducerSolarAsset.POWER.getName().equals(attributeName) + || ElectricityProducerSolarAsset.POWER_FORECAST.getName().equals(attributeName)) { + return; } - @Override - public void init(Container container) throws Exception { - assetStorageService = container.getService(AssetStorageService.class); - assetProcessingService = container.getService(AssetProcessingService.class); - gatewayService = container.getService(GatewayService.class); - assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); - clientEventService = container.getService(ClientEventService.class); - scheduledExecutorService = container.getScheduledExecutor(); - rulesService = container.getService(RulesService.class); - timerService = container.getService(TimerService.class); - - forecastSolarApiKey = getString(container.getConfig(), OR_FORECAST_SOLAR_API_KEY, null); + // Set power attribute value with power forecast attribute value + if (attributeName.equals( + ElectricityProducerSolarAsset.SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST.getName())) { + boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); + + // Get latest asset from storage + ElectricityProducerSolarAsset asset = + (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); + + if (asset != null && enabled) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + asset.getId(), + ElectricityProducerSolarAsset.POWER, + asset.getPowerForecast().orElse(null)), + getClass().getSimpleName()); + } else if (asset != null) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent(asset.getId(), ElectricityProducerSolarAsset.POWER, null), + getClass().getSimpleName()); + } + return; } - @Override - public void start(Container container) throws Exception { - if (forecastSolarApiKey == null) { - LOG.fine("No value found for OR_FORECAST_SOLAR_API_KEY, ForecastSolarService won't start"); - return; + // Enable solar forecast + if (attributeName.equals( + ElectricityProducerSolarAsset.INCLUDE_FORECAST_SOLAR_SERVICE.getName())) { + boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); + + if (enabled && !electricityProducerSolarAssetMap.containsKey(attributeEvent.getId())) { + LOG.info( + String.format( + "Enabled solar forecast for ElectricityProducerSolarAsset: name='%s', ID='%s';", + attributeEvent.getAssetName(), attributeEvent.getId())); + + // Get latest asset from storage + ElectricityProducerSolarAsset asset = + (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); + + if (asset != null) { + electricityProducerSolarAssetMap.put(asset.getId(), asset); + getSolarForecast(asset); + updateSolarForecastAttribute(asset); } + } else if (!enabled && electricityProducerSolarAssetMap.containsKey(attributeEvent.getId())) { + LOG.info( + String.format( + "Disabled solar forecast for ElectricityProducerSolarAsset: name='%s', ID='%s';", + attributeEvent.getAssetName(), attributeEvent.getId())); + electricityProducerSolarAssetMap.remove(attributeEvent.getId()); + } + } - forecastSolarTarget = new WebTargetBuilder(getClient(), URI.create("https://api.forecast.solar/" + forecastSolarApiKey + "/estimate")).build(); - - container.getService(MessageBrokerService.class).getContext().addRoutes(this); - - // Load all enabled producer solar assets - LOG.fine("Loading electricity producer solar assets..."); - - List electricityProducerSolarAssets = assetStorageService.findAll( - new AssetQuery() - .types(ElectricityProducerSolarAsset.class) - ) - .stream() - .map(asset -> (ElectricityProducerSolarAsset) asset) - .filter(electricityProducerSolarAsset -> electricityProducerSolarAsset.isIncludeForecastSolarService().orElse(false)) - .toList(); - - LOG.fine("Number of electricity producer solar assets with forecast enabled = " + electricityProducerSolarAssets.size()); - - for (ElectricityProducerSolarAsset electricityProducerSolarAsset : electricityProducerSolarAssets) { - electricityProducerSolarAssetMap.put(electricityProducerSolarAsset.getId(), electricityProducerSolarAsset); - getSolarForecast(electricityProducerSolarAsset); - updateSolarForecastAttribute(electricityProducerSolarAsset); + // Update solar forecast + if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_AZIMUTH.getName()) + || attributeName.equals(ElectricityProducerSolarAsset.PANEL_PITCH.getName()) + || attributeName.equals(ElectricityProducerSolarAsset.POWER_EXPORT_MAX.getName()) + || attributeName.equals(ElectricityProducerSolarAsset.LOCATION.getName())) { + // Get latest asset from storage + ElectricityProducerSolarAsset asset = + (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); + + if (asset != null && asset.isIncludeForecastSolarService().orElse(false)) { + ElectricityProducerSolarAsset assetPrevious = + electricityProducerSolarAssetMap.get(asset.getId()); + + String valueStr = attributeEvent.getValue().toString(); + String valuePreviousStr = + assetPrevious + .getAttributes() + .get(attributeEvent.getName()) + .flatMap(Attribute::getValue) + .toString(); + + // Only update solar forecast on attribute value change + if (!valueStr.equals(valuePreviousStr)) { + Object value = attributeEvent.getValue().orElse(null); + + if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_AZIMUTH.getName())) { + asset.setPanelAzimuth((Integer) value); + } else if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_PITCH.getName())) { + asset.setPanelPitch((Integer) value); + } else if (attributeName.equals( + ElectricityProducerSolarAsset.POWER_EXPORT_MAX.getName())) { + asset.setPowerExportMax((Double) value); + } else if (attributeName.equals(ElectricityProducerSolarAsset.LOCATION.getName())) { + asset.setLocation((GeoJSONPoint) value); + } + + getSolarForecast(asset); + updateSolarForecastAttribute(asset); } - - // Start forecast solar thread - scheduledExecutorService.scheduleAtFixedRate(this::processSolarData, 1, 1, TimeUnit.MINUTES); - - clientEventService.addSubscription( - AttributeEvent.class, - new AssetFilter().setAssetClasses(Collections.singletonList(ElectricityProducerSolarAsset.class)), - this::processElectricityProducerSolarAssetAttributeEvent); + electricityProducerSolarAssetMap.put(asset.getId(), asset); + } } - - @Override - public void stop(Container container) throws Exception { - // empty + } + + protected void processAssetChange( + PersistenceEvent persistenceEvent) { + LOG.fine("Processing producer solar asset change: " + persistenceEvent); + + if (persistenceEvent.getCause() == PersistenceEvent.Cause.CREATE + && persistenceEvent.getEntity().isIncludeForecastSolarService().orElse(false)) { + electricityProducerSolarAssetMap.put( + persistenceEvent.getEntity().getId(), persistenceEvent.getEntity()); + getSolarForecast(persistenceEvent.getEntity()); + updateSolarForecastAttribute(persistenceEvent.getEntity()); + } else if (persistenceEvent.getCause() == PersistenceEvent.Cause.DELETE) { + electricityProducerSolarAssetMap.remove(persistenceEvent.getEntity().getId()); } + } - protected synchronized void processElectricityProducerSolarAssetAttributeEvent(AttributeEvent attributeEvent) { - String attributeName = attributeEvent.getName(); - - // These are updated by this service - if (ElectricityProducerSolarAsset.POWER.getName().equals(attributeName) - || ElectricityProducerSolarAsset.POWER_FORECAST.getName().equals(attributeName)) { - return; - } - - // Set power attribute value with power forecast attribute value - if (attributeName.equals(ElectricityProducerSolarAsset.SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST.getName())) { - boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); - - // Get latest asset from storage - ElectricityProducerSolarAsset asset = (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); - - if (asset != null && enabled) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(asset.getId(), ElectricityProducerSolarAsset.POWER, asset.getPowerForecast().orElse(null)), getClass().getSimpleName()); - } else if (asset != null) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(asset.getId(), ElectricityProducerSolarAsset.POWER, null), getClass().getSimpleName()); - } - return; - } + protected void processSolarData() { + // Check if there are any electricity producer solar assets to process + if (electricityProducerSolarAssetMap.isEmpty()) { + return; + } - // Enable solar forecast - if (attributeName.equals(ElectricityProducerSolarAsset.INCLUDE_FORECAST_SOLAR_SERVICE.getName())) { - boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); + int currentMinute = LocalDateTime.now().getMinute(); - if (enabled && !electricityProducerSolarAssetMap.containsKey(attributeEvent.getId())) { - LOG.info(String.format("Enabled solar forecast for ElectricityProducerSolarAsset: name='%s', ID='%s';", attributeEvent.getAssetName(), attributeEvent.getId())); + // Update solar forecast every hour + if (currentMinute == 0) { + electricityProducerSolarAssetMap.forEach( + (assetId, electricityProducerSolarAsset) -> + getSolarForecast(electricityProducerSolarAsset)); + } - // Get latest asset from storage - ElectricityProducerSolarAsset asset = (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); + // Update solar power forecast attribute every 15 minutes + if ((currentMinute % 15) == 0) { + electricityProducerSolarAssetMap.forEach( + (assetId, electricityProducerSolarAsset) -> + updateSolarForecastAttribute(electricityProducerSolarAsset)); + } + } + + protected void getSolarForecast(ElectricityProducerSolarAsset electricityProducerSolarAsset) { + Optional lat = + electricityProducerSolarAsset + .getAttribute(Asset.LOCATION) + .flatMap(attr -> attr.getValue().map(GeoJSONPoint::getY)); + Optional lon = + electricityProducerSolarAsset + .getAttribute(Asset.LOCATION) + .flatMap(attr -> attr.getValue().map(GeoJSONPoint::getX)); + Optional pitch = electricityProducerSolarAsset.getPanelPitch(); + Optional azimuth = electricityProducerSolarAsset.getPanelAzimuth(); + Optional kwp = electricityProducerSolarAsset.getPowerExportMax(); + + if (lat.isEmpty() || lon.isEmpty() || pitch.isEmpty() || azimuth.isEmpty() || kwp.isEmpty()) { + LOG.warning( + String.format( + "ElectricityProducerSolarAsset: name='%s', ID='%s' doesn't have all needed attributes filled in;" + + " latitude='%s', longitude='%s', panelAzimuth='%s', panelPitch='%s', powerExportMax='%s'", + electricityProducerSolarAsset.getName(), + electricityProducerSolarAsset.getId(), + lat, + lon, + azimuth, + pitch, + kwp)); + return; + } - if (asset != null) { - electricityProducerSolarAssetMap.put(asset.getId(), asset); - getSolarForecast(asset); - updateSolarForecastAttribute(asset); + try (Response response = + forecastSolarTarget + .path( + String.format( + "%f/%f/%d/%d/%f", lat.get(), lon.get(), pitch.get(), azimuth.get(), kwp.get())) + .request() + .build("GET") + .invoke()) { + if (response != null && response.getStatus() == 200) { + EstimateResponse responseModel = response.readEntity(EstimateResponse.class); + + if (responseModel != null) { + HashMap solarForecast = new HashMap<>(); + HashMap solarForecastPrevious = new HashMap<>(); + + // Get previous solar forecast from database + List solarForecastListPrevious = + assetPredictedDatapointService.getDatapoints( + new AttributeRef( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER_FORECAST.getName())); + + for (ValueDatapoint datapoint : solarForecastListPrevious) { + LocalDateTime dateTime = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(datapoint.getTimestamp()), ZoneId.systemDefault()); + Double powerKiloWatt = (Double) datapoint.getValue(); + solarForecastPrevious.put(dateTime, powerKiloWatt); + } + + // Get start and end dateTime of solar forecast + String minKey = + responseModel.result.watts.keySet().stream().min(String::compareTo).orElse(""); + String maxKey = + responseModel.result.watts.keySet().stream().max(String::compareTo).orElse(""); + LocalDateTime startDateTime = + LocalDateTime.parse(minKey, ISO_LOCAL_DATE_TIME_WITHOUT_T) + .toLocalDate() + .atStartOfDay(); + LocalDateTime endDateTime = + LocalDateTime.parse(maxKey, ISO_LOCAL_DATE_TIME_WITHOUT_T) + .toLocalDate() + .plusDays(1) + .atStartOfDay(); + + // Prepopulate solar forecast map with 15-minute intervals + for (LocalDateTime dateTime = startDateTime; + !dateTime.isAfter(endDateTime); + dateTime = dateTime.plusMinutes(15)) { + solarForecast.put(dateTime, 0.0); + } + + // Add solar forecast to solar forecast map + for (Map.Entry wattItem : responseModel.result.watts.entrySet()) { + LocalDateTime dateTime = + LocalDateTime.parse(wattItem.getKey(), ISO_LOCAL_DATE_TIME_WITHOUT_T); + Double powerKiloWatt = -wattItem.getValue() / 1000; + solarForecast.put(dateTime, powerKiloWatt); + } + + LocalDateTime currentDateTime = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(timerService.getCurrentTimeMillis()), + ZoneId.systemDefault()); + + // Update solar forecast in database + solarForecast.forEach( + (dateTime, powerKiloWatt) -> { + if (dateTime.isAfter(currentDateTime) + || solarForecastPrevious.get(dateTime) == null) { + assetPredictedDatapointService.updateValue( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER_FORECAST.getName(), + powerKiloWatt, + dateTime); + assetPredictedDatapointService.updateValue( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER.getName(), + powerKiloWatt, + dateTime); } - } else if (!enabled && electricityProducerSolarAssetMap.containsKey(attributeEvent.getId())) { - LOG.info(String.format("Disabled solar forecast for ElectricityProducerSolarAsset: name='%s', ID='%s';", attributeEvent.getAssetName(), attributeEvent.getId())); - electricityProducerSolarAssetMap.remove(attributeEvent.getId()); - } + }); } - - // Update solar forecast - if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_AZIMUTH.getName()) || - attributeName.equals(ElectricityProducerSolarAsset.PANEL_PITCH.getName()) || - attributeName.equals(ElectricityProducerSolarAsset.POWER_EXPORT_MAX.getName()) || - attributeName.equals(ElectricityProducerSolarAsset.LOCATION.getName())) { - // Get latest asset from storage - ElectricityProducerSolarAsset asset = (ElectricityProducerSolarAsset) assetStorageService.find(attributeEvent.getId()); - - if (asset != null && asset.isIncludeForecastSolarService().orElse(false)) { - ElectricityProducerSolarAsset assetPrevious = electricityProducerSolarAssetMap.get(asset.getId()); - - String valueStr = attributeEvent.getValue().toString(); - String valuePreviousStr = assetPrevious.getAttributes().get(attributeEvent.getName()).flatMap(Attribute::getValue).toString(); - - // Only update solar forecast on attribute value change - if (!valueStr.equals(valuePreviousStr)) { - Object value = attributeEvent.getValue().orElse(null); - - if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_AZIMUTH.getName())) { - asset.setPanelAzimuth((Integer) value); - } else if (attributeName.equals(ElectricityProducerSolarAsset.PANEL_PITCH.getName())) { - asset.setPanelPitch((Integer) value); - } else if (attributeName.equals(ElectricityProducerSolarAsset.POWER_EXPORT_MAX.getName())) { - asset.setPowerExportMax((Double) value); - } else if (attributeName.equals(ElectricityProducerSolarAsset.LOCATION.getName())) { - asset.setLocation((GeoJSONPoint) value); - } - - getSolarForecast(asset); - updateSolarForecastAttribute(asset); - } - electricityProducerSolarAssetMap.put(asset.getId(), asset); - } + rulesService.fireDeploymentsWithPredictedDataForAsset( + electricityProducerSolarAsset.getId()); + } else { + StringBuilder message = new StringBuilder("Unknown"); + if (response != null) { + message.setLength(0); + message.append("Status "); + message.append(response.getStatus()); + message.append(" - "); + message.append(response.readEntity(String.class)); } + LOG.warning("Request failed: " + message); + } + } catch (Throwable e) { + if (e.getCause() != null && e.getCause() instanceof IOException) { + LOG.log(Level.SEVERE, "Exception when requesting forecast solar data", e.getCause()); + } else { + LOG.log(Level.SEVERE, "Exception when requesting forecast solar data", e); + } } - - protected void processAssetChange(PersistenceEvent persistenceEvent) { - LOG.fine("Processing producer solar asset change: " + persistenceEvent); - - if (persistenceEvent.getCause() == PersistenceEvent.Cause.CREATE && persistenceEvent.getEntity().isIncludeForecastSolarService().orElse(false)) { - electricityProducerSolarAssetMap.put(persistenceEvent.getEntity().getId(), persistenceEvent.getEntity()); - getSolarForecast(persistenceEvent.getEntity()); - updateSolarForecastAttribute(persistenceEvent.getEntity()); - } else if (persistenceEvent.getCause() == PersistenceEvent.Cause.DELETE) { - electricityProducerSolarAssetMap.remove(persistenceEvent.getEntity().getId()); - } + } + + protected void updateSolarForecastAttribute( + ElectricityProducerSolarAsset electricityProducerSolarAsset) { + Optional lat = + electricityProducerSolarAsset + .getAttribute(Asset.LOCATION) + .flatMap(attr -> attr.getValue().map(GeoJSONPoint::getY)); + Optional lon = + electricityProducerSolarAsset + .getAttribute(Asset.LOCATION) + .flatMap(attr -> attr.getValue().map(GeoJSONPoint::getX)); + Optional pitch = electricityProducerSolarAsset.getPanelPitch(); + Optional azimuth = electricityProducerSolarAsset.getPanelAzimuth(); + Optional kwp = electricityProducerSolarAsset.getPowerExportMax(); + + if (lat.isEmpty() || lon.isEmpty() || pitch.isEmpty() || azimuth.isEmpty() || kwp.isEmpty()) { + return; } - - protected void processSolarData() { - // Check if there are any electricity producer solar assets to process - if (electricityProducerSolarAssetMap.isEmpty()) { - return; - } - - int currentMinute = LocalDateTime.now().getMinute(); - - // Update solar forecast every hour - if (currentMinute == 0) { - electricityProducerSolarAssetMap.forEach((assetId, electricityProducerSolarAsset) -> getSolarForecast(electricityProducerSolarAsset)); - } - - // Update solar power forecast attribute every 15 minutes - if ((currentMinute % 15) == 0) { - electricityProducerSolarAssetMap.forEach((assetId, electricityProducerSolarAsset) -> updateSolarForecastAttribute(electricityProducerSolarAsset)); - } + // Get solar forecast data-points for current 15 minute interval + long currentTimeMillis = timerService.getCurrentTimeMillis(); + long startTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000); + long endTimeMillis = startTimeMillis + 15 * 60000; + AssetDatapointAllQuery assetDatapointQuery = + new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); + List> solarForecastDatapoints = + assetPredictedDatapointService.queryDatapoints( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER_FORECAST.getName(), + assetDatapointQuery); + + if (solarForecastDatapoints == null || solarForecastDatapoints.size() < 2) { + LOG.warning( + String.format( + "ElectricityProducerSolarAsset: name='%s', ID='%s' doesn't have a solar forecast", + electricityProducerSolarAsset.getName(), electricityProducerSolarAsset.getId())); + return; } - protected void getSolarForecast(ElectricityProducerSolarAsset electricityProducerSolarAsset) { - Optional lat = electricityProducerSolarAsset.getAttribute(Asset.LOCATION).flatMap(attr -> attr.getValue().map(GeoJSONPoint::getY)); - Optional lon = electricityProducerSolarAsset.getAttribute(Asset.LOCATION).flatMap(attr -> attr.getValue().map(GeoJSONPoint::getX)); - Optional pitch = electricityProducerSolarAsset.getPanelPitch(); - Optional azimuth = electricityProducerSolarAsset.getPanelAzimuth(); - Optional kwp = electricityProducerSolarAsset.getPowerExportMax(); - - if (lat.isEmpty() || lon.isEmpty() || pitch.isEmpty() || azimuth.isEmpty() || kwp.isEmpty()) { - LOG.warning(String.format("ElectricityProducerSolarAsset: name='%s', ID='%s' doesn't have all needed attributes filled in;" + - " latitude='%s', longitude='%s', panelAzimuth='%s', panelPitch='%s', powerExportMax='%s'", - electricityProducerSolarAsset.getName(), electricityProducerSolarAsset.getId(), lat, lon, azimuth, pitch, kwp)); - return; - } - - try (Response response = forecastSolarTarget - .path(String.format("%f/%f/%d/%d/%f", lat.get(), lon.get(), pitch.get(), azimuth.get(), kwp.get())) - .request() - .build("GET") - .invoke()) { - if (response != null && response.getStatus() == 200) { - EstimateResponse responseModel = response.readEntity(EstimateResponse.class); - - if (responseModel != null) { - HashMap solarForecast = new HashMap<>(); - HashMap solarForecastPrevious = new HashMap<>(); - - // Get previous solar forecast from database - List solarForecastListPrevious = assetPredictedDatapointService.getDatapoints(new AttributeRef(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER_FORECAST.getName())); - - for (ValueDatapoint datapoint : solarForecastListPrevious) { - LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(datapoint.getTimestamp()), ZoneId.systemDefault()); - Double powerKiloWatt = (Double) datapoint.getValue(); - solarForecastPrevious.put(dateTime, powerKiloWatt); - } - - // Get start and end dateTime of solar forecast - String minKey = responseModel.result.watts.keySet().stream().min(String::compareTo).orElse(""); - String maxKey = responseModel.result.watts.keySet().stream().max(String::compareTo).orElse(""); - LocalDateTime startDateTime = LocalDateTime.parse(minKey, ISO_LOCAL_DATE_TIME_WITHOUT_T).toLocalDate().atStartOfDay(); - LocalDateTime endDateTime = LocalDateTime.parse(maxKey, ISO_LOCAL_DATE_TIME_WITHOUT_T).toLocalDate().plusDays(1).atStartOfDay(); - - // Prepopulate solar forecast map with 15-minute intervals - for (LocalDateTime dateTime = startDateTime; !dateTime.isAfter(endDateTime); dateTime = dateTime.plusMinutes(15)) { - solarForecast.put(dateTime, 0.0); - } - - // Add solar forecast to solar forecast map - for (Map.Entry wattItem : responseModel.result.watts.entrySet()) { - LocalDateTime dateTime = LocalDateTime.parse(wattItem.getKey(), ISO_LOCAL_DATE_TIME_WITHOUT_T); - Double powerKiloWatt = -wattItem.getValue() / 1000; - solarForecast.put(dateTime, powerKiloWatt); - } - - LocalDateTime currentDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timerService.getCurrentTimeMillis()), ZoneId.systemDefault()); - - // Update solar forecast in database - solarForecast.forEach((dateTime, powerKiloWatt) -> { - if (dateTime.isAfter(currentDateTime) || solarForecastPrevious.get(dateTime) == null) { - assetPredictedDatapointService.updateValue(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER_FORECAST.getName(), powerKiloWatt, dateTime); - assetPredictedDatapointService.updateValue(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER.getName(), powerKiloWatt, dateTime); - } - }); - } - rulesService.fireDeploymentsWithPredictedDataForAsset(electricityProducerSolarAsset.getId()); - } else { - StringBuilder message = new StringBuilder("Unknown"); - if (response != null) { - message.setLength(0); - message.append("Status "); - message.append(response.getStatus()); - message.append(" - "); - message.append(response.readEntity(String.class)); - } - LOG.warning("Request failed: " + message); - } - } catch (Throwable e) { - if (e.getCause() != null && e.getCause() instanceof IOException) { - LOG.log(Level.SEVERE, "Exception when requesting forecast solar data", e.getCause()); - } else { - LOG.log(Level.SEVERE, "Exception when requesting forecast solar data", e); - } - } + ValueDatapoint solarForecastDatapointMax = solarForecastDatapoints.getFirst(); + ValueDatapoint solarForecastDatapointMin = solarForecastDatapoints.getLast(); + + // Get current timestamp of power forecast attribute + ElectricityProducerSolarAsset asset = + (ElectricityProducerSolarAsset) + assetStorageService.find(electricityProducerSolarAsset.getId()); + long powerForecastAttributeTimeMillis = + asset + .getAttributes() + .get(ElectricityProducerSolarAsset.POWER_FORECAST) + .flatMap(Attribute::getTimestamp) + .orElse(0L); + + // Update power forecast attribute value + Double powerKiloWatt; + long timeMillis; + + if (solarForecastDatapointMin.getTimestamp() > powerForecastAttributeTimeMillis) { + powerKiloWatt = (Double) solarForecastDatapointMin.getValue(); + timeMillis = solarForecastDatapointMin.getTimestamp(); + } else { + long upperTimestamp = solarForecastDatapointMax.getTimestamp(); + long lowerTimestamp = solarForecastDatapointMin.getTimestamp(); + Double upperValue = (Double) solarForecastDatapointMax.getValue(); + Double lowerValue = (Double) solarForecastDatapointMin.getValue(); + + if (upperValue == null || lowerValue == null) { + return; + } + + // Interpolate value + double factor = + (double) (currentTimeMillis - lowerTimestamp) / (upperTimestamp - lowerTimestamp); + double interpolatedValue = lowerValue + factor * (upperValue - lowerValue); + powerKiloWatt = Math.round(interpolatedValue * 1000.0) / 1000.0; + timeMillis = currentTimeMillis; } - protected void updateSolarForecastAttribute(ElectricityProducerSolarAsset electricityProducerSolarAsset) { - Optional lat = electricityProducerSolarAsset.getAttribute(Asset.LOCATION).flatMap(attr -> attr.getValue().map(GeoJSONPoint::getY)); - Optional lon = electricityProducerSolarAsset.getAttribute(Asset.LOCATION).flatMap(attr -> attr.getValue().map(GeoJSONPoint::getX)); - Optional pitch = electricityProducerSolarAsset.getPanelPitch(); - Optional azimuth = electricityProducerSolarAsset.getPanelAzimuth(); - Optional kwp = electricityProducerSolarAsset.getPowerExportMax(); - - if (lat.isEmpty() || lon.isEmpty() || pitch.isEmpty() || azimuth.isEmpty() || kwp.isEmpty()) { - return; - } - - // Get solar forecast data-points for current 15 minute interval - long currentTimeMillis = timerService.getCurrentTimeMillis(); - long startTimeMillis = currentTimeMillis - currentTimeMillis % (15 * 60000); - long endTimeMillis = startTimeMillis + 15 * 60000; - AssetDatapointAllQuery assetDatapointQuery = new AssetDatapointAllQuery(startTimeMillis, endTimeMillis); - List> solarForecastDatapoints = assetPredictedDatapointService.queryDatapoints(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER_FORECAST.getName(), assetDatapointQuery); - - if (solarForecastDatapoints == null || solarForecastDatapoints.size() < 2) { - LOG.warning(String.format("ElectricityProducerSolarAsset: name='%s', ID='%s' doesn't have a solar forecast", electricityProducerSolarAsset.getName(), electricityProducerSolarAsset.getId())); - return; - } - - ValueDatapoint solarForecastDatapointMax = solarForecastDatapoints.getFirst(); - ValueDatapoint solarForecastDatapointMin = solarForecastDatapoints.getLast(); - - // Get current timestamp of power forecast attribute - ElectricityProducerSolarAsset asset = (ElectricityProducerSolarAsset) assetStorageService.find(electricityProducerSolarAsset.getId()); - long powerForecastAttributeTimeMillis = asset.getAttributes().get(ElectricityProducerSolarAsset.POWER_FORECAST).flatMap(Attribute::getTimestamp).orElse(0L); - - // Update power forecast attribute value - Double powerKiloWatt; - long timeMillis; - - if (solarForecastDatapointMin.getTimestamp() > powerForecastAttributeTimeMillis) { - powerKiloWatt = (Double) solarForecastDatapointMin.getValue(); - timeMillis = solarForecastDatapointMin.getTimestamp(); - } else { - long upperTimestamp = solarForecastDatapointMax.getTimestamp(); - long lowerTimestamp = solarForecastDatapointMin.getTimestamp(); - Double upperValue = (Double) solarForecastDatapointMax.getValue(); - Double lowerValue = (Double) solarForecastDatapointMin.getValue(); - - if (upperValue == null || lowerValue == null) { - return; - } - - // Interpolate value - double factor = (double) (currentTimeMillis - lowerTimestamp) / (upperTimestamp - lowerTimestamp); - double interpolatedValue = lowerValue + factor * (upperValue - lowerValue); - powerKiloWatt = Math.round(interpolatedValue * 1000.0) / 1000.0; - timeMillis = currentTimeMillis; - } - - // Update attributes - assetProcessingService.sendAttributeEvent(new AttributeEvent(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER_FORECAST.getName(), powerKiloWatt, timeMillis)); - - if (electricityProducerSolarAsset.isSetActualSolarValueWithForecast().orElse(false)) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(electricityProducerSolarAsset.getId(), ElectricityProducerSolarAsset.POWER.getName(), powerKiloWatt, timeMillis)); - } + // Update attributes + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER_FORECAST.getName(), + powerKiloWatt, + timeMillis)); + + if (electricityProducerSolarAsset.isSetActualSolarValueWithForecast().orElse(false)) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + electricityProducerSolarAsset.getId(), + ElectricityProducerSolarAsset.POWER.getName(), + powerKiloWatt, + timeMillis)); } + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/manager/ForecastWindService.java b/energy/src/main/java/org/openremote/extension/energy/manager/ForecastWindService.java index c002699..4daafe8 100644 --- a/energy/src/main/java/org/openremote/extension/energy/manager/ForecastWindService.java +++ b/energy/src/main/java/org/openremote/extension/energy/manager/ForecastWindService.java @@ -1,8 +1,46 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy.manager; +import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; +import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; +import static org.openremote.container.web.WebTargetBuilder.getClient; +import static org.openremote.manager.gateway.GatewayService.isNotForGateway; +import static org.openremote.model.syslog.SyslogCategory.DATA; +import static org.openremote.model.util.MapAccess.getString; + import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.UriBuilder; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; import org.apache.camel.builder.RouteBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; import org.openremote.container.message.MessageBrokerService; @@ -22,323 +60,359 @@ import org.openremote.model.query.AssetQuery; import org.openremote.model.syslog.SyslogCategory; -import java.io.IOException; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static org.openremote.container.persistence.PersistenceService.PERSISTENCE_TOPIC; -import static org.openremote.container.persistence.PersistenceService.isPersistenceEventForEntityType; -import static org.openremote.container.web.WebTargetBuilder.getClient; -import static org.openremote.manager.gateway.GatewayService.isNotForGateway; -import static org.openremote.model.syslog.SyslogCategory.DATA; -import static org.openremote.model.util.MapAccess.getString; - -/** - * Calculates power generation for {@link ElectricityProducerWindAsset}. - */ +/** Calculates power generation for {@link ElectricityProducerWindAsset}. */ public class ForecastWindService extends RouteBuilder implements ContainerService { - protected static class WeatherForecastResponseModel { + protected static class WeatherForecastResponseModel { - protected WeatherForecastModel current; + protected WeatherForecastModel current; - @JsonProperty("hourly") - protected WeatherForecastModel[] list; + @JsonProperty("hourly") + protected WeatherForecastModel[] list; - public WeatherForecastModel[] getList() { - return list; - } + public WeatherForecastModel[] getList() { + return list; } + } - protected static class WeatherForecastModel { + protected static class WeatherForecastModel { - /** - * Seconds - */ - @JsonProperty("dt") - protected long timestamp; + /** Seconds */ + @JsonProperty("dt") + protected long timestamp; - @JsonProperty("temp") - protected double tempature; + @JsonProperty("temp") + protected double tempature; - @JsonProperty("humidity") - protected int humidity; + @JsonProperty("humidity") + protected int humidity; - @JsonProperty("wind_speed") - protected double windSpeed; + @JsonProperty("wind_speed") + protected double windSpeed; - @JsonProperty("wind_deg") - protected int windDirection; + @JsonProperty("wind_deg") + protected int windDirection; - @JsonProperty("uvi") - protected double uv; + @JsonProperty("uvi") + protected double uv; - public long getTimestamp() { - return timestamp * 1000; - } - - public double getTempature() { - return tempature; - } - - public int getHumidity() { - return humidity; - } - - public double getWindSpeed() { - return windSpeed; - } + public long getTimestamp() { + return timestamp * 1000; + } - public int getWindDirection() { - return windDirection; - } + public double getTempature() { + return tempature; + } - public double getUv() { - return uv; - } + public int getHumidity() { + return humidity; } - public static final String OR_OPEN_WEATHER_API_APP_ID = "OR_OPEN_WEATHER_API_APP_ID"; - - protected static final Logger LOG = SyslogCategory.getLogger(DATA, ForecastWindService.class.getName()); - protected AssetStorageService assetStorageService; - protected AssetProcessingService assetProcessingService; - protected GatewayService gatewayService; - protected AssetPredictedDatapointService assetPredictedDatapointService; - protected ClientEventService clientEventService; - protected ScheduledExecutorService scheduledExecutorService; - protected RulesService rulesService; - private ResteasyWebTarget weatherForecastWebTarget; - private String openWeatherAppId; - - private final Map> calculationFutures = new HashMap<>(); - - @SuppressWarnings("unchecked") - @Override - public void configure() throws Exception { - from(PERSISTENCE_TOPIC) - .routeId("Persistence-ForecastWind") - .filter(isPersistenceEventForEntityType(ElectricityProducerWindAsset.class)) - .filter(isNotForGateway(gatewayService)) - .process(exchange -> processAssetChange((PersistenceEvent) exchange.getIn().getBody(PersistenceEvent.class))); + public double getWindSpeed() { + return windSpeed; } - @Override - public void init(Container container) throws Exception { - assetStorageService = container.getService(AssetStorageService.class); - assetProcessingService = container.getService(AssetProcessingService.class); - gatewayService = container.getService(GatewayService.class); - assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); - clientEventService = container.getService(ClientEventService.class); - scheduledExecutorService = container.getScheduledExecutor(); - rulesService = container.getService(RulesService.class); - - openWeatherAppId = getString(container.getConfig(), OR_OPEN_WEATHER_API_APP_ID, null); + public int getWindDirection() { + return windDirection; } - @Override - public void start(Container container) throws Exception { - if (openWeatherAppId == null) { - LOG.fine("No value found for OR_OPEN_WEATHER_API_APP_ID, ForecastWindService won't start"); - return; - } + public double getUv() { + return uv; + } + } + + public static final String OR_OPEN_WEATHER_API_APP_ID = "OR_OPEN_WEATHER_API_APP_ID"; + + protected static final Logger LOG = + SyslogCategory.getLogger(DATA, ForecastWindService.class.getName()); + protected AssetStorageService assetStorageService; + protected AssetProcessingService assetProcessingService; + protected GatewayService gatewayService; + protected AssetPredictedDatapointService assetPredictedDatapointService; + protected ClientEventService clientEventService; + protected ScheduledExecutorService scheduledExecutorService; + protected RulesService rulesService; + private ResteasyWebTarget weatherForecastWebTarget; + private String openWeatherAppId; + + private final Map> calculationFutures = new HashMap<>(); + + @SuppressWarnings("unchecked") + @Override + public void configure() throws Exception { + from(PERSISTENCE_TOPIC) + .routeId("Persistence-ForecastWind") + .filter(isPersistenceEventForEntityType(ElectricityProducerWindAsset.class)) + .filter(isNotForGateway(gatewayService)) + .process( + exchange -> + processAssetChange( + (PersistenceEvent) + exchange.getIn().getBody(PersistenceEvent.class))); + } + + @Override + public void init(Container container) throws Exception { + assetStorageService = container.getService(AssetStorageService.class); + assetProcessingService = container.getService(AssetProcessingService.class); + gatewayService = container.getService(GatewayService.class); + assetPredictedDatapointService = container.getService(AssetPredictedDatapointService.class); + clientEventService = container.getService(ClientEventService.class); + scheduledExecutorService = container.getScheduledExecutor(); + rulesService = container.getService(RulesService.class); + + openWeatherAppId = getString(container.getConfig(), OR_OPEN_WEATHER_API_APP_ID, null); + } + + @Override + public void start(Container container) throws Exception { + if (openWeatherAppId == null) { + LOG.fine("No value found for OR_OPEN_WEATHER_API_APP_ID, ForecastWindService won't start"); + return; + } - weatherForecastWebTarget = new WebTargetBuilder( + weatherForecastWebTarget = + new WebTargetBuilder( getClient(), UriBuilder.fromUri("https://api.openweathermap.org/data/2.5") - .queryParam("units", "metric") - .queryParam("exclude", "minutely,daily,alerts") - .queryParam("appid", openWeatherAppId).build()).build(); - - container.getService(MessageBrokerService.class).getContext().addRoutes(this); - - // Load all enabled producer wind assets - LOG.fine("Loading producer wind assets..."); - - List electricityProducerWindAssets = assetStorageService.findAll( - new AssetQuery() - .types(ElectricityProducerWindAsset.class) - ) - .stream() - .map(asset -> (ElectricityProducerWindAsset) asset) - .filter(electricityProducerWindAsset -> electricityProducerWindAsset.isIncludeForecastWindService().orElse(false) + .queryParam("units", "metric") + .queryParam("exclude", "minutely,daily,alerts") + .queryParam("appid", openWeatherAppId) + .build()) + .build(); + + container.getService(MessageBrokerService.class).getContext().addRoutes(this); + + // Load all enabled producer wind assets + LOG.fine("Loading producer wind assets..."); + + List electricityProducerWindAssets = + assetStorageService + .findAll(new AssetQuery().types(ElectricityProducerWindAsset.class)) + .stream() + .map(asset -> (ElectricityProducerWindAsset) asset) + .filter( + electricityProducerWindAsset -> + electricityProducerWindAsset.isIncludeForecastWindService().orElse(false) && electricityProducerWindAsset.getLocation().isPresent()) - .toList(); + .toList(); - LOG.fine("Found includes producer wind asset count = " + electricityProducerWindAssets.size()); + LOG.fine("Found includes producer wind asset count = " + electricityProducerWindAssets.size()); - electricityProducerWindAssets.forEach(this::startCalculation); + electricityProducerWindAssets.forEach(this::startCalculation); - clientEventService.addSubscription( - AttributeEvent.class, - null, - this::processAttributeEvent); - } + clientEventService.addSubscription(AttributeEvent.class, null, this::processAttributeEvent); + } - @Override - public void stop(Container container) throws Exception { - new ArrayList<>(calculationFutures.keySet()).forEach(this::stopCalculation); - } + @Override + public void stop(Container container) throws Exception { + new ArrayList<>(calculationFutures.keySet()).forEach(this::stopCalculation); + } + + protected void processAttributeEvent(AttributeEvent attributeEvent) { + processElectricityProducerWindAssetAttributeEvent(attributeEvent); + } + + protected synchronized void processElectricityProducerWindAssetAttributeEvent( + AttributeEvent attributeEvent) { - protected void processAttributeEvent(AttributeEvent attributeEvent) { - processElectricityProducerWindAssetAttributeEvent(attributeEvent); + if (ElectricityProducerWindAsset.POWER.getName().equals(attributeEvent.getName()) + || ElectricityProducerWindAsset.POWER_FORECAST.getName().equals(attributeEvent.getName())) { + // These are updated by this service + return; } - protected synchronized void processElectricityProducerWindAssetAttributeEvent(AttributeEvent attributeEvent) { + if (attributeEvent + .getName() + .equals(ElectricityProducerWindAsset.INCLUDE_FORECAST_WIND_SERVICE.getName())) { + boolean enabled = (Boolean) attributeEvent.getValue().orElse(false); + if (enabled && calculationFutures.containsKey(attributeEvent.getId())) { + // Nothing to do here + return; + } else if (!enabled && !calculationFutures.containsKey(attributeEvent.getId())) { + // Nothing to do here + return; + } + + LOG.fine("Processing producer wind asset attribute event: " + attributeEvent); + stopCalculation(attributeEvent.getId()); + + // Get latest asset from storage + ElectricityProducerWindAsset asset = + (ElectricityProducerWindAsset) assetStorageService.find(attributeEvent.getId()); + + if (asset != null + && asset.isIncludeForecastWindService().orElse(false) + && asset.getLocation().isPresent()) { + startCalculation(asset); + } + } - if (ElectricityProducerWindAsset.POWER.getName().equals(attributeEvent.getName()) - || ElectricityProducerWindAsset.POWER_FORECAST.getName().equals(attributeEvent.getName())) { - // These are updated by this service - return; + if (attributeEvent + .getName() + .equals(ElectricityProducerWindAsset.SET_ACTUAL_WIND_VALUE_WITH_FORECAST.getName())) { + // Get latest asset from storage + ElectricityProducerWindAsset asset = + (ElectricityProducerWindAsset) assetStorageService.find(attributeEvent.getId()); + + // Check if power is currently zero and set it if power forecast has an value + if (asset.getPower().orElse(0d) == 0d && asset.getPowerForecast().orElse(0d) != 0d) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + asset.getId(), + ElectricityProducerWindAsset.POWER, + asset.getPowerForecast().orElse(0d)), + getClass().getSimpleName()); + } + } + } + + protected void processAssetChange( + PersistenceEvent persistenceEvent) { + LOG.fine("Processing producer wind asset change: " + persistenceEvent); + stopCalculation(persistenceEvent.getEntity().getId()); + + if (persistenceEvent.getCause() != PersistenceEvent.Cause.DELETE) { + if (persistenceEvent.getEntity().isIncludeForecastWindService().orElse(false) + && persistenceEvent.getEntity().getLocation().isPresent()) { + startCalculation(persistenceEvent.getEntity()); + } + } + } + + protected void startCalculation(ElectricityProducerWindAsset electricityProducerWindAsset) { + LOG.fine("Starting calculation for producer wind asset: " + electricityProducerWindAsset); + calculationFutures.put( + electricityProducerWindAsset.getId(), + scheduledExecutorService.scheduleAtFixedRate( + () -> { + processWeatherData(electricityProducerWindAsset); + }, + 0, + 1, + TimeUnit.HOURS)); + } + + protected void stopCalculation(String electricityProducerWindAssetId) { + ScheduledFuture scheduledFuture = calculationFutures.remove(electricityProducerWindAssetId); + if (scheduledFuture != null) { + LOG.fine("Stopping calculation for producer wind asset: " + electricityProducerWindAssetId); + scheduledFuture.cancel(false); + } + } + + protected void processWeatherData(ElectricityProducerWindAsset electricityProducerWindAsset) { + try (Response response = + weatherForecastWebTarget + .path("onecall") + .queryParam("lat", electricityProducerWindAsset.getLocation().get().getY()) + .queryParam("lon", electricityProducerWindAsset.getLocation().get().getX()) + .request() + .build("GET") + .invoke()) { + if (response != null && response.getStatus() == 200) { + + WeatherForecastResponseModel weatherForecastResponseModel = + response.readEntity(WeatherForecastResponseModel.class); + + double currentPower = + calculatePower(electricityProducerWindAsset, weatherForecastResponseModel.current); + + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER_FORECAST.getName(), + -currentPower), + getClass().getSimpleName()); + + if (electricityProducerWindAsset.isSetActualWindValueWithForecast().orElse(false)) { + assetProcessingService.sendAttributeEvent( + new AttributeEvent( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER.getName(), + -currentPower), + getClass().getSimpleName()); } - if (attributeEvent.getName().equals(ElectricityProducerWindAsset.INCLUDE_FORECAST_WIND_SERVICE.getName())) { - boolean enabled = (Boolean)attributeEvent.getValue().orElse(false); - if (enabled && calculationFutures.containsKey(attributeEvent.getId())) { - // Nothing to do here - return; - } else if (!enabled && !calculationFutures.containsKey(attributeEvent.getId())) { - // Nothing to do here - return; - } - - LOG.fine("Processing producer wind asset attribute event: " + attributeEvent); - stopCalculation(attributeEvent.getId()); - - // Get latest asset from storage - ElectricityProducerWindAsset asset = (ElectricityProducerWindAsset) assetStorageService.find(attributeEvent.getId()); - - if (asset != null && asset.isIncludeForecastWindService().orElse(false) && asset.getLocation().isPresent()) { - startCalculation(asset); - } + for (WeatherForecastModel weatherForecastModel : weatherForecastResponseModel.getList()) { + double powerForecast = calculatePower(electricityProducerWindAsset, weatherForecastModel); + + LocalDateTime timestamp = + Instant.ofEpochMilli(weatherForecastModel.getTimestamp()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + assetPredictedDatapointService.updateValue( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER_FORECAST.getName(), + -powerForecast, + timestamp); + assetPredictedDatapointService.updateValue( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER.getName(), + -powerForecast, + timestamp); + + for (int i = 0; i < 3; i++) { + timestamp = timestamp.plusMinutes(15); + assetPredictedDatapointService.updateValue( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER_FORECAST.getName(), + -powerForecast, + timestamp); + assetPredictedDatapointService.updateValue( + electricityProducerWindAsset.getId(), + ElectricityProducerAsset.POWER.getName(), + -powerForecast, + timestamp); + } } - if (attributeEvent.getName().equals(ElectricityProducerWindAsset.SET_ACTUAL_WIND_VALUE_WITH_FORECAST.getName())) { - // Get latest asset from storage - ElectricityProducerWindAsset asset = (ElectricityProducerWindAsset) assetStorageService.find(attributeEvent.getId()); - - // Check if power is currently zero and set it if power forecast has an value - if (asset.getPower().orElse(0d) == 0d && asset.getPowerForecast().orElse(0d) != 0d) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(asset.getId(), ElectricityProducerWindAsset.POWER, asset.getPowerForecast().orElse(0d)), getClass().getSimpleName()); - } + rulesService.fireDeploymentsWithPredictedDataForAsset(electricityProducerWindAsset.getId()); + } else { + StringBuilder message = new StringBuilder("Unknown"); + if (response != null) { + message.setLength(0); + message.append("Status "); + message.append(response.getStatus()); + message.append(" - "); + message.append(response.readEntity(String.class)); } + LOG.warning("Request failed: " + message); + } + } catch (Throwable e) { + if (e.getCause() != null && e.getCause() instanceof IOException) { + LOG.log(Level.SEVERE, "Exception when requesting openweathermap data", e.getCause()); + } else { + LOG.log(Level.SEVERE, "Exception when requesting openweathermap data", e); + } } - - protected void processAssetChange(PersistenceEvent persistenceEvent) { - LOG.fine("Processing producer wind asset change: " + persistenceEvent); - stopCalculation(persistenceEvent.getEntity().getId()); - - if (persistenceEvent.getCause() != PersistenceEvent.Cause.DELETE) { - if (persistenceEvent.getEntity().isIncludeForecastWindService().orElse(false) - && persistenceEvent.getEntity().getLocation().isPresent()) { - startCalculation(persistenceEvent.getEntity()); - } - } + } + + protected double calculatePower( + ElectricityProducerWindAsset electricityProducerWindAsset, + WeatherForecastModel weatherForecastModel) { + double windSpeed = weatherForecastModel.getWindSpeed(); + double powerForecast = 0; + double windSpeedMin = electricityProducerWindAsset.getWindSpeedMin().orElse(0d); + double windSpeedMax = electricityProducerWindAsset.getWindSpeedMax().orElse(0d); + double windSpeedReference = electricityProducerWindAsset.getWindSpeedReference().orElse(0d); + double energyExportMax = electricityProducerWindAsset.getPowerExportMax().orElse(0d); + + if (windSpeed <= 0 || windSpeed < windSpeedMin) { + powerForecast = 0; } - - protected void startCalculation(ElectricityProducerWindAsset electricityProducerWindAsset) { - LOG.fine("Starting calculation for producer wind asset: " + electricityProducerWindAsset); - calculationFutures.put(electricityProducerWindAsset.getId(), scheduledExecutorService.scheduleAtFixedRate(() -> { - processWeatherData(electricityProducerWindAsset); - }, 0, 1, TimeUnit.HOURS)); + if (windSpeedMin <= windSpeed && windSpeed <= windSpeedReference) { + powerForecast = Math.pow((windSpeed / windSpeedReference), 2) * energyExportMax; } - - protected void stopCalculation(String electricityProducerWindAssetId) { - ScheduledFuture scheduledFuture = calculationFutures.remove(electricityProducerWindAssetId); - if (scheduledFuture != null) { - LOG.fine("Stopping calculation for producer wind asset: " + electricityProducerWindAssetId); - scheduledFuture.cancel(false); - } + if (windSpeedReference < windSpeed && windSpeed <= windSpeedMax) { + powerForecast = energyExportMax; } - - protected void processWeatherData(ElectricityProducerWindAsset electricityProducerWindAsset) { - try (Response response = weatherForecastWebTarget - .path("onecall") - .queryParam("lat", electricityProducerWindAsset.getLocation().get().getY()) - .queryParam("lon", electricityProducerWindAsset.getLocation().get().getX()) - .request() - .build("GET") - .invoke()) { - if (response != null && response.getStatus() == 200) { - - WeatherForecastResponseModel weatherForecastResponseModel = response.readEntity(WeatherForecastResponseModel.class); - - double currentPower = calculatePower(electricityProducerWindAsset, weatherForecastResponseModel.current); - - assetProcessingService.sendAttributeEvent(new AttributeEvent(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER_FORECAST.getName(), -currentPower), getClass().getSimpleName()); - - if (electricityProducerWindAsset.isSetActualWindValueWithForecast().orElse(false)) { - assetProcessingService.sendAttributeEvent(new AttributeEvent(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER.getName(), -currentPower), getClass().getSimpleName()); - } - - for (WeatherForecastModel weatherForecastModel : weatherForecastResponseModel.getList()) { - double powerForecast = calculatePower(electricityProducerWindAsset, weatherForecastModel); - - LocalDateTime timestamp = Instant.ofEpochMilli(weatherForecastModel.getTimestamp()).atZone(ZoneId.systemDefault()).toLocalDateTime(); - assetPredictedDatapointService.updateValue(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER_FORECAST.getName(), -powerForecast, timestamp); - assetPredictedDatapointService.updateValue(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER.getName(), -powerForecast, timestamp); - - for (int i = 0; i < 3; i++) { - timestamp = timestamp.plusMinutes(15); - assetPredictedDatapointService.updateValue(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER_FORECAST.getName(), -powerForecast, timestamp); - assetPredictedDatapointService.updateValue(electricityProducerWindAsset.getId(), ElectricityProducerAsset.POWER.getName(), -powerForecast, timestamp); - } - } - - rulesService.fireDeploymentsWithPredictedDataForAsset(electricityProducerWindAsset.getId()); - } else { - StringBuilder message = new StringBuilder("Unknown"); - if (response != null) { - message.setLength(0); - message.append("Status "); - message.append(response.getStatus()); - message.append(" - "); - message.append(response.readEntity(String.class)); - } - LOG.warning("Request failed: " + message); - } - } catch (Throwable e) { - if (e.getCause() != null && e.getCause() instanceof IOException) { - LOG.log(Level.SEVERE, "Exception when requesting openweathermap data", e.getCause()); - } else { - LOG.log(Level.SEVERE, "Exception when requesting openweathermap data", e); - } - } + if (windSpeed > windSpeedMax) { + powerForecast = 0; } - - protected double calculatePower(ElectricityProducerWindAsset electricityProducerWindAsset, WeatherForecastModel weatherForecastModel) { - double windSpeed = weatherForecastModel.getWindSpeed(); - double powerForecast = 0; - double windSpeedMin = electricityProducerWindAsset.getWindSpeedMin().orElse(0d); - double windSpeedMax = electricityProducerWindAsset.getWindSpeedMax().orElse(0d); - double windSpeedReference = electricityProducerWindAsset.getWindSpeedReference().orElse(0d); - double energyExportMax = electricityProducerWindAsset.getPowerExportMax().orElse(0d); - - if (windSpeed <= 0 || windSpeed < windSpeedMin) { - powerForecast = 0; - } - if (windSpeedMin <= windSpeed && windSpeed <= windSpeedReference) { - powerForecast = Math.pow((windSpeed / windSpeedReference), 2) * energyExportMax; - } - if (windSpeedReference < windSpeed && windSpeed <= windSpeedMax) { - powerForecast = energyExportMax; - } - if (windSpeed > windSpeedMax) { - powerForecast = 0; - } - if (powerForecast < 0) { - powerForecast = 0; - } - return powerForecast; + if (powerForecast < 0) { + powerForecast = 0; } + return powerForecast; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleAsset.java index f312f3b..0b8cdeb 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,17 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; + +import jakarta.persistence.Entity; +import java.util.Collection; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; @@ -30,322 +34,324 @@ import org.openremote.model.value.ValueDescriptor; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Collection; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class ElectricVehicleAsset extends ElectricityBatteryAsset { - public enum EnergyType { - EV, - PHEV - } - - public static final ValueDescriptor ENERGY_TYPE_VALUE = new ValueDescriptor<>("energyType", EnergyType.class); - - public static final AttributeDescriptor ENERGY_TYPE = new AttributeDescriptor<>("energyType", ENERGY_TYPE_VALUE); - public static final AttributeDescriptor CONNECTOR_TYPE = new AttributeDescriptor<>("connectorType", ElectricityChargerAsset.CONNECTOR_TYPE_VALUE); - public static final AttributeDescriptor ODOMETER = new AttributeDescriptor<>("odometer", ValueType.POSITIVE_INTEGER, - new MetaItem<>(MetaItemType.READ_ONLY)) - .withUnits(UNITS_KILO, UNITS_METRE); - public static final AttributeDescriptor CHARGER_CONNECTED = new AttributeDescriptor<>("chargerConnected", ValueType.BOOLEAN, - new MetaItem<>(MetaItemType.READ_ONLY)); - public static final AttributeDescriptor CHARGER_ID = new AttributeDescriptor<>("chargerID", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY)); - public static final AttributeDescriptor MILEAGE_CAPACITY = new AttributeDescriptor<>("mileageCapacity", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_METRE); - public static final AttributeDescriptor MILEAGE_CHARGED = new AttributeDescriptor<>("mileageCharged", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_METRE); - public static final AttributeDescriptor MILEAGE_MIN = new AttributeDescriptor<>("mileageMin", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_METRE); - public static final AttributeDescriptor VEHICLE_CATEGORY = new AttributeDescriptor<>("vehicleCategory", ValueType.TEXT); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("car-electric", "49B0D8", ElectricVehicleAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricVehicleAsset() { - } - - public ElectricVehicleAsset(String name) { - super(name); - } - - public Optional getEnergyType() { - return getAttributes().getValue(ENERGY_TYPE); - } - - public ElectricVehicleAsset setEnergyType(EnergyType value) { - getAttributes().getOrCreate(ENERGY_TYPE).setValue(value); - return this; - } - - public Optional getConnectorType() { - return getAttributes().getValue(CONNECTOR_TYPE); - } - - public ElectricVehicleAsset setConnectorType(ElectricityChargerAsset.ConnectorType value) { - getAttributes().getOrCreate(CONNECTOR_TYPE).setValue(value); - return this; - } - - public Optional getOdometer() { - return getAttributes().getValue(ODOMETER); - } - - public ElectricVehicleAsset setOdometer(Integer value) { - getAttributes().getOrCreate(ODOMETER).setValue(value); - return this; - } - - public Optional getChargerConnected() { - return getAttributes().getValue(CHARGER_CONNECTED); - } - - public ElectricVehicleAsset setChargerConnected(Boolean value) { - getAttributes().getOrCreate(CHARGER_CONNECTED).setValue(value); - return this; - } - - public Optional getChargerId() { - return getAttributes().getValue(CHARGER_ID); - } - - public ElectricVehicleAsset setChargerId(String value) { - getAttributes().getOrCreate(CHARGER_ID).setValue(value); - return this; - } - - public Optional getMileageCapacity() { - return getAttributes().getValue(MILEAGE_CAPACITY); - } - - public ElectricVehicleAsset setMileageCapacity(Integer value) { - getAttributes().getOrCreate(MILEAGE_CAPACITY).setValue(value); - return this; - } - - public Optional getMileageCharged() { - return getAttributes().getValue(MILEAGE_CHARGED); - } - - public ElectricVehicleAsset setMileageCharged(Double value) { - getAttributes().getOrCreate(MILEAGE_CHARGED).setValue(value); - return this; - } - - public Optional getMileageMin() { - return getAttributes().getValue(MILEAGE_MIN); - } - - public ElectricVehicleAsset setMileageMin(Integer value) { - getAttributes().getOrCreate(MILEAGE_MIN).setValue(value); - return this; - } - - public Optional getVehicleCategory() { - return getAttributes().getValue(VEHICLE_CATEGORY); - } - - public ElectricVehicleAsset setVehicleCategory(String value) { - getAttributes().getOrCreate(VEHICLE_CATEGORY).setValue(value); - return this; - } - - @Override - public ElectricVehicleAsset setPower(Double value) { - super.setPower(value); - return this; - } - - @Override - public ElectricVehicleAsset setPowerSetpoint(Double value) { - super.setPowerSetpoint(value); - return this; - } - - @Override - public ElectricVehicleAsset setPowerImportMin(Double value) { - super.setPowerImportMin(value); - return this; - } - - @Override - public ElectricVehicleAsset setPowerImportMax(Double value) { - super.setPowerImportMax(value); - return this; - } - - @Override - public ElectricVehicleAsset setPowerExportMin(Double value) { - super.setPowerExportMin(value); - return this; - } - - @Override - public ElectricVehicleAsset setPowerExportMax(Double value) { - super.setPowerExportMax(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyImportTotal(Double value) { - super.setEnergyImportTotal(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyExportTotal(Double value) { - super.setEnergyExportTotal(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyCapacity(Double value) { - super.setEnergyCapacity(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyLevel(Double value) { - super.setEnergyLevel(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyLevelPercentage(Integer value) { - super.setEnergyLevelPercentage(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyLevelPercentageMin(Integer value) { - super.setEnergyLevelPercentageMin(value); - return this; - } - - @Override - public ElectricVehicleAsset setEnergyLevelPercentageMax(Integer value) { - super.setEnergyLevelPercentageMax(value); - return this; - } - - @Override - public ElectricVehicleAsset setEfficiencyImport(Integer value) { - super.setEfficiencyImport(value); - return this; - } - - @Override - public ElectricVehicleAsset setEfficiencyExport(Integer value) { - super.setEfficiencyExport(value); - return this; - } - - @Override - public ElectricVehicleAsset setId(String id) { - super.setId(id); - return this; - } - - @Override - public ElectricVehicleAsset setName(String name) throws IllegalArgumentException { - super.setName(name); - return this; - } - - @Override - public ElectricVehicleAsset setAccessPublicRead(boolean accessPublicRead) { - super.setAccessPublicRead(accessPublicRead); - return this; - } - - @Override - public ElectricVehicleAsset setParent(Asset parent) { - super.setParent(parent); - return this; - } - - @Override - public ElectricVehicleAsset setParentId(String parentId) { - super.setParentId(parentId); - return this; - } - - @Override - public ElectricVehicleAsset setRealm(String realm) { - super.setRealm(realm); - return this; - } - - @Override - public ElectricVehicleAsset setAttributes(AttributeMap attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public Asset setAttributes(Attribute... attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleAsset setAttributes(Collection> attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleAsset setLocation(GeoJSONPoint location) { - super.setLocation(location); - return this; - } - - @Override - public ElectricVehicleAsset setEmail(String email) { - super.setEmail(email); - return this; - } - - @Override - public ElectricVehicleAsset setNotes(String notes) { - super.setNotes(notes); - return this; - } - - @Override - public ElectricVehicleAsset setManufacturer(String manufacturer) { - super.setManufacturer(manufacturer); - return this; - } - - @Override - public ElectricVehicleAsset setModel(String model) { - super.setModel(model); - return this; - } - - @Override - public ElectricVehicleAsset addAttributes(Attribute... attributes) { - super.addAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleAsset addOrReplaceAttributes(Attribute... attributes) { - super.addOrReplaceAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleAsset setTags(String[] tags) { - super.setTags(tags); - return this; - } + public enum EnergyType { + EV, + PHEV + } + + public static final ValueDescriptor ENERGY_TYPE_VALUE = + new ValueDescriptor<>("energyType", EnergyType.class); + + public static final AttributeDescriptor ENERGY_TYPE = + new AttributeDescriptor<>("energyType", ENERGY_TYPE_VALUE); + public static final AttributeDescriptor CONNECTOR_TYPE = + new AttributeDescriptor<>("connectorType", ElectricityChargerAsset.CONNECTOR_TYPE_VALUE); + public static final AttributeDescriptor ODOMETER = + new AttributeDescriptor<>( + "odometer", ValueType.POSITIVE_INTEGER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_METRE); + public static final AttributeDescriptor CHARGER_CONNECTED = + new AttributeDescriptor<>( + "chargerConnected", ValueType.BOOLEAN, new MetaItem<>(MetaItemType.READ_ONLY)); + public static final AttributeDescriptor CHARGER_ID = + new AttributeDescriptor<>( + "chargerID", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY)); + public static final AttributeDescriptor MILEAGE_CAPACITY = + new AttributeDescriptor<>("mileageCapacity", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_METRE); + public static final AttributeDescriptor MILEAGE_CHARGED = + new AttributeDescriptor<>( + "mileageCharged", ValueType.POSITIVE_NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_METRE); + public static final AttributeDescriptor MILEAGE_MIN = + new AttributeDescriptor<>("mileageMin", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_METRE); + public static final AttributeDescriptor VEHICLE_CATEGORY = + new AttributeDescriptor<>("vehicleCategory", ValueType.TEXT); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("car-electric", "49B0D8", ElectricVehicleAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricVehicleAsset() {} + + public ElectricVehicleAsset(String name) { + super(name); + } + + public Optional getEnergyType() { + return getAttributes().getValue(ENERGY_TYPE); + } + + public ElectricVehicleAsset setEnergyType(EnergyType value) { + getAttributes().getOrCreate(ENERGY_TYPE).setValue(value); + return this; + } + + public Optional getConnectorType() { + return getAttributes().getValue(CONNECTOR_TYPE); + } + + public ElectricVehicleAsset setConnectorType(ElectricityChargerAsset.ConnectorType value) { + getAttributes().getOrCreate(CONNECTOR_TYPE).setValue(value); + return this; + } + + public Optional getOdometer() { + return getAttributes().getValue(ODOMETER); + } + + public ElectricVehicleAsset setOdometer(Integer value) { + getAttributes().getOrCreate(ODOMETER).setValue(value); + return this; + } + + public Optional getChargerConnected() { + return getAttributes().getValue(CHARGER_CONNECTED); + } + + public ElectricVehicleAsset setChargerConnected(Boolean value) { + getAttributes().getOrCreate(CHARGER_CONNECTED).setValue(value); + return this; + } + + public Optional getChargerId() { + return getAttributes().getValue(CHARGER_ID); + } + + public ElectricVehicleAsset setChargerId(String value) { + getAttributes().getOrCreate(CHARGER_ID).setValue(value); + return this; + } + + public Optional getMileageCapacity() { + return getAttributes().getValue(MILEAGE_CAPACITY); + } + + public ElectricVehicleAsset setMileageCapacity(Integer value) { + getAttributes().getOrCreate(MILEAGE_CAPACITY).setValue(value); + return this; + } + + public Optional getMileageCharged() { + return getAttributes().getValue(MILEAGE_CHARGED); + } + + public ElectricVehicleAsset setMileageCharged(Double value) { + getAttributes().getOrCreate(MILEAGE_CHARGED).setValue(value); + return this; + } + + public Optional getMileageMin() { + return getAttributes().getValue(MILEAGE_MIN); + } + + public ElectricVehicleAsset setMileageMin(Integer value) { + getAttributes().getOrCreate(MILEAGE_MIN).setValue(value); + return this; + } + + public Optional getVehicleCategory() { + return getAttributes().getValue(VEHICLE_CATEGORY); + } + + public ElectricVehicleAsset setVehicleCategory(String value) { + getAttributes().getOrCreate(VEHICLE_CATEGORY).setValue(value); + return this; + } + + @Override + public ElectricVehicleAsset setPower(Double value) { + super.setPower(value); + return this; + } + + @Override + public ElectricVehicleAsset setPowerSetpoint(Double value) { + super.setPowerSetpoint(value); + return this; + } + + @Override + public ElectricVehicleAsset setPowerImportMin(Double value) { + super.setPowerImportMin(value); + return this; + } + + @Override + public ElectricVehicleAsset setPowerImportMax(Double value) { + super.setPowerImportMax(value); + return this; + } + + @Override + public ElectricVehicleAsset setPowerExportMin(Double value) { + super.setPowerExportMin(value); + return this; + } + + @Override + public ElectricVehicleAsset setPowerExportMax(Double value) { + super.setPowerExportMax(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyImportTotal(Double value) { + super.setEnergyImportTotal(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyExportTotal(Double value) { + super.setEnergyExportTotal(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyCapacity(Double value) { + super.setEnergyCapacity(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyLevel(Double value) { + super.setEnergyLevel(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyLevelPercentage(Integer value) { + super.setEnergyLevelPercentage(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyLevelPercentageMin(Integer value) { + super.setEnergyLevelPercentageMin(value); + return this; + } + + @Override + public ElectricVehicleAsset setEnergyLevelPercentageMax(Integer value) { + super.setEnergyLevelPercentageMax(value); + return this; + } + + @Override + public ElectricVehicleAsset setEfficiencyImport(Integer value) { + super.setEfficiencyImport(value); + return this; + } + + @Override + public ElectricVehicleAsset setEfficiencyExport(Integer value) { + super.setEfficiencyExport(value); + return this; + } + + @Override + public ElectricVehicleAsset setId(String id) { + super.setId(id); + return this; + } + + @Override + public ElectricVehicleAsset setName(String name) throws IllegalArgumentException { + super.setName(name); + return this; + } + + @Override + public ElectricVehicleAsset setAccessPublicRead(boolean accessPublicRead) { + super.setAccessPublicRead(accessPublicRead); + return this; + } + + @Override + public ElectricVehicleAsset setParent(Asset parent) { + super.setParent(parent); + return this; + } + + @Override + public ElectricVehicleAsset setParentId(String parentId) { + super.setParentId(parentId); + return this; + } + + @Override + public ElectricVehicleAsset setRealm(String realm) { + super.setRealm(realm); + return this; + } + + @Override + public ElectricVehicleAsset setAttributes(AttributeMap attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public Asset setAttributes(Attribute... attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleAsset setAttributes(Collection> attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleAsset setLocation(GeoJSONPoint location) { + super.setLocation(location); + return this; + } + + @Override + public ElectricVehicleAsset setEmail(String email) { + super.setEmail(email); + return this; + } + + @Override + public ElectricVehicleAsset setNotes(String notes) { + super.setNotes(notes); + return this; + } + + @Override + public ElectricVehicleAsset setManufacturer(String manufacturer) { + super.setManufacturer(manufacturer); + return this; + } + + @Override + public ElectricVehicleAsset setModel(String model) { + super.setModel(model); + return this; + } + + @Override + public ElectricVehicleAsset addAttributes(Attribute... attributes) { + super.addAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleAsset addOrReplaceAttributes(Attribute... attributes) { + super.addOrReplaceAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleAsset setTags(String[] tags) { + super.setTags(tags); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleFleetGroupAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleFleetGroupAsset.java index 3182dfd..b3d2db4 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleFleetGroupAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricVehicleFleetGroupAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,17 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; + +import jakarta.persistence.Entity; +import java.util.Collection; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.asset.impl.GroupAsset; @@ -28,166 +32,168 @@ import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Collection; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @Entity public class ElectricVehicleFleetGroupAsset extends GroupAsset { - public static final AttributeDescriptor FLEET_CATEGORY = new AttributeDescriptor<>("fleetCategory", ValueType.TEXT); - public static final AttributeDescriptor AVAILABLE_CHARGING_SPACES = new AttributeDescriptor<>("availableChargingSpaces", ValueType.POSITIVE_INTEGER); - public static final AttributeDescriptor AVAILABLE_DISCHARGING_SPACES = new AttributeDescriptor<>("availableDischargingSpaces", ValueType.POSITIVE_INTEGER); - public static final AttributeDescriptor POWER_IMPORT_MAX = new AttributeDescriptor<>("powerImportMax", ValueType.POSITIVE_INTEGER); - public static final AttributeDescriptor POWER_EXPORT_MAX = new AttributeDescriptor<>("powerExportMax", ValueType.POSITIVE_INTEGER); - - public static final AttributeDescriptor MILEAGE_MINIMUM = new AttributeDescriptor<>("mileageMinimum", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_KILO, UNITS_METRE); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("car-multiple", "49B0D8", ElectricVehicleFleetGroupAsset.class); - - protected ElectricVehicleFleetGroupAsset() { - } - - public ElectricVehicleFleetGroupAsset(String name) { - super(name, ElectricVehicleAsset.class); - } - - public Optional getFleetCategory() { - return getAttributes().getValue(FLEET_CATEGORY); - } - - public Optional getAvailableChargingSpaces() { - return getAttributes().getValue(AVAILABLE_CHARGING_SPACES); - } - - public Optional getAvailableDischargingSpaces() { - return getAttributes().getValue(AVAILABLE_DISCHARGING_SPACES); - } - - public Optional getPowerImportMax() { - return getAttributes().getValue(POWER_IMPORT_MAX); - } - - public Optional getPowerExportMax() { - return getAttributes().getValue(POWER_EXPORT_MAX); - } - - public Optional getMileageMinimum() { return getAttributes().getValue(MILEAGE_MINIMUM); } - - @Override - public ElectricVehicleFleetGroupAsset setId(String id) { - super.setId(id); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setVersion(long version) { - super.setVersion(version); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setName(String name) throws IllegalArgumentException { - super.setName(name); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setAccessPublicRead(boolean accessPublicRead) { - super.setAccessPublicRead(accessPublicRead); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setParent(Asset parent) { - super.setParent(parent); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setParentId(String parentId) { - super.setParentId(parentId); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setRealm(String realm) { - super.setRealm(realm); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setAttributes(AttributeMap attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public Asset setAttributes(Attribute... attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setAttributes(Collection> attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset addAttributes(Attribute... attributes) { - super.addAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset addOrReplaceAttributes(Attribute... attributes) { - super.addOrReplaceAttributes(attributes); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setLocation(GeoJSONPoint location) { - super.setLocation(location); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setTags(String[] tags) { - super.setTags(tags); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setEmail(String email) { - super.setEmail(email); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setNotes(String notes) { - super.setNotes(notes); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setManufacturer(String manufacturer) { - super.setManufacturer(manufacturer); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setModel(String model) { - super.setModel(model); - return this; - } - - @Override - public ElectricVehicleFleetGroupAsset setChildAssetType(String childAssetType) { - super.setChildAssetType(childAssetType); - return this; - } + public static final AttributeDescriptor FLEET_CATEGORY = + new AttributeDescriptor<>("fleetCategory", ValueType.TEXT); + public static final AttributeDescriptor AVAILABLE_CHARGING_SPACES = + new AttributeDescriptor<>("availableChargingSpaces", ValueType.POSITIVE_INTEGER); + public static final AttributeDescriptor AVAILABLE_DISCHARGING_SPACES = + new AttributeDescriptor<>("availableDischargingSpaces", ValueType.POSITIVE_INTEGER); + public static final AttributeDescriptor POWER_IMPORT_MAX = + new AttributeDescriptor<>("powerImportMax", ValueType.POSITIVE_INTEGER); + public static final AttributeDescriptor POWER_EXPORT_MAX = + new AttributeDescriptor<>("powerExportMax", ValueType.POSITIVE_INTEGER); + + public static final AttributeDescriptor MILEAGE_MINIMUM = + new AttributeDescriptor<>("mileageMinimum", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_KILO, UNITS_METRE); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("car-multiple", "49B0D8", ElectricVehicleFleetGroupAsset.class); + + protected ElectricVehicleFleetGroupAsset() {} + + public ElectricVehicleFleetGroupAsset(String name) { + super(name, ElectricVehicleAsset.class); + } + + public Optional getFleetCategory() { + return getAttributes().getValue(FLEET_CATEGORY); + } + + public Optional getAvailableChargingSpaces() { + return getAttributes().getValue(AVAILABLE_CHARGING_SPACES); + } + + public Optional getAvailableDischargingSpaces() { + return getAttributes().getValue(AVAILABLE_DISCHARGING_SPACES); + } + + public Optional getPowerImportMax() { + return getAttributes().getValue(POWER_IMPORT_MAX); + } + + public Optional getPowerExportMax() { + return getAttributes().getValue(POWER_EXPORT_MAX); + } + + public Optional getMileageMinimum() { + return getAttributes().getValue(MILEAGE_MINIMUM); + } + + @Override + public ElectricVehicleFleetGroupAsset setId(String id) { + super.setId(id); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setVersion(long version) { + super.setVersion(version); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setName(String name) throws IllegalArgumentException { + super.setName(name); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setAccessPublicRead(boolean accessPublicRead) { + super.setAccessPublicRead(accessPublicRead); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setParent(Asset parent) { + super.setParent(parent); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setParentId(String parentId) { + super.setParentId(parentId); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setRealm(String realm) { + super.setRealm(realm); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setAttributes(AttributeMap attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public Asset setAttributes(Attribute... attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setAttributes(Collection> attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset addAttributes(Attribute... attributes) { + super.addAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset addOrReplaceAttributes(Attribute... attributes) { + super.addOrReplaceAttributes(attributes); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setLocation(GeoJSONPoint location) { + super.setLocation(location); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setTags(String[] tags) { + super.setTags(tags); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setEmail(String email) { + super.setEmail(email); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setNotes(String notes) { + super.setNotes(notes); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setManufacturer(String manufacturer) { + super.setManufacturer(manufacturer); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setModel(String model) { + super.setModel(model); + return this; + } + + @Override + public ElectricVehicleFleetGroupAsset setChildAssetType(String childAssetType) { + super.setChildAssetType(childAssetType); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityAsset.java index 6785876..f6119cd 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,167 +12,184 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; + +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.*; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - @SuppressWarnings("unchecked") public abstract class ElectricityAsset> extends Asset { - public static final AttributeDescriptor POWER = new AttributeDescriptor<>("power", ValueType.NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT); - public static final AttributeDescriptor POWER_SETPOINT = new AttributeDescriptor<>("powerSetpoint", ValueType.NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT).withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MIN = new AttributeDescriptor<>("powerImportMin", ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT); - public static final AttributeDescriptor POWER_IMPORT_MAX = new AttributeDescriptor<>("powerImportMax", ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT); - public static final AttributeDescriptor POWER_EXPORT_MIN = new AttributeDescriptor<>("powerExportMin", ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT); - public static final AttributeDescriptor POWER_EXPORT_MAX = new AttributeDescriptor<>("powerExportMax", ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT); - - - public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = new AttributeDescriptor<>("energyImportTotal", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = new AttributeDescriptor<>("energyExportTotal", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - public static final AttributeDescriptor EFFICIENCY_IMPORT = new AttributeDescriptor<>("efficiencyImport", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - public static final AttributeDescriptor EFFICIENCY_EXPORT = new AttributeDescriptor<>("efficiencyExport", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - - public static final AttributeDescriptor TARIFF_IMPORT = new AttributeDescriptor<>("tariffImport", ValueType.NUMBER) - .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR).withOptional(true); - public static final AttributeDescriptor TARIFF_EXPORT = new AttributeDescriptor<>("tariffExport", ValueType.NUMBER) - .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR).withOptional(true); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityAsset() { - } - - public ElectricityAsset(String name) { - super(name); - } - - public Optional getPower() { - return getAttributes().getValue(POWER); - } - - public T setPower(Double value) { - getAttributes().getOrCreate(POWER).setValue(value); - return (T)this; - } - - public Optional getPowerSetpoint() { - return getAttributes().getValue(POWER_SETPOINT); - } - - public T setPowerSetpoint(Double value) { - getAttributes().getOrCreate(POWER_SETPOINT).setValue(value); - return (T)this; - } - - public Optional getPowerImportMin() { - return getAttributes().getValue(POWER_IMPORT_MIN); - } - - public T setPowerImportMin(Double value) { - getAttributes().getOrCreate(POWER_IMPORT_MIN).setValue(value); - return (T)this; - } - - public Optional getPowerImportMax() { - return getAttributes().getValue(POWER_IMPORT_MAX); - } - - public T setPowerImportMax(Double value) { - getAttributes().getOrCreate(POWER_IMPORT_MAX).setValue(value); - return (T)this; - } - - public Optional getPowerExportMin() { - return getAttributes().getValue(POWER_EXPORT_MIN); - } - - public T setPowerExportMin(Double value) { - getAttributes().getOrCreate(POWER_EXPORT_MIN).setValue(value); - return (T)this; - } - - public Optional getPowerExportMax() { - return getAttributes().getValue(POWER_EXPORT_MAX); - } - - public T setPowerExportMax(Double value) { - getAttributes().getOrCreate(POWER_EXPORT_MAX).setValue(value); - return (T)this; - } - - public Optional getEnergyImportTotal() { - return getAttributes().getValue(ENERGY_IMPORT_TOTAL); - } - - public T setEnergyImportTotal(Double value) { - getAttributes().getOrCreate(ENERGY_IMPORT_TOTAL).setValue(value); - return (T)this; - } - - public Optional getEnergyExportTotal() { - return getAttributes().getValue(ENERGY_EXPORT_TOTAL); - } - - public T setEnergyExportTotal(Double value) { - getAttributes().getOrCreate(ENERGY_EXPORT_TOTAL).setValue(value); - return (T)this; - } - - public Optional getEfficiencyImport() { - return getAttributes().getValue(EFFICIENCY_IMPORT); - } - - public T setEfficiencyImport(Integer value) { - getAttributes().getOrCreate(EFFICIENCY_IMPORT).setValue(value); - return (T)this; - } - - public Optional getEfficiencyExport() { - return getAttributes().getValue(EFFICIENCY_EXPORT); - } - - public T setEfficiencyExport(Integer value) { - getAttributes().getOrCreate(EFFICIENCY_EXPORT).setValue(value); - return (T)this; - } - - public Optional getTariffImport() { - return getAttributes().getValue(TARIFF_IMPORT); - } - - public T setTariffImport(Double value) { - getAttributes().getOrCreate(TARIFF_IMPORT).setValue(value); - return (T)this; - } - - public Optional getTariffExport() { - return getAttributes().getValue(TARIFF_EXPORT); - } - - public T setTariffExport(Double value) { - getAttributes().getOrCreate(TARIFF_EXPORT).setValue(value); - return (T)this; - } + public static final AttributeDescriptor POWER = + new AttributeDescriptor<>("power", ValueType.NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT); + public static final AttributeDescriptor POWER_SETPOINT = + new AttributeDescriptor<>("powerSetpoint", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT) + .withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MIN = + new AttributeDescriptor<>("powerImportMin", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + public static final AttributeDescriptor POWER_IMPORT_MAX = + new AttributeDescriptor<>("powerImportMax", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + public static final AttributeDescriptor POWER_EXPORT_MIN = + new AttributeDescriptor<>("powerExportMin", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + public static final AttributeDescriptor POWER_EXPORT_MAX = + new AttributeDescriptor<>("powerExportMax", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = + new AttributeDescriptor<>( + "energyImportTotal", + ValueType.POSITIVE_NUMBER, + new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = + new AttributeDescriptor<>( + "energyExportTotal", + ValueType.POSITIVE_NUMBER, + new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + public static final AttributeDescriptor EFFICIENCY_IMPORT = + new AttributeDescriptor<>("efficiencyImport", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + public static final AttributeDescriptor EFFICIENCY_EXPORT = + new AttributeDescriptor<>("efficiencyExport", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + + public static final AttributeDescriptor TARIFF_IMPORT = + new AttributeDescriptor<>("tariffImport", ValueType.NUMBER) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR) + .withOptional(true); + public static final AttributeDescriptor TARIFF_EXPORT = + new AttributeDescriptor<>("tariffExport", ValueType.NUMBER) + .withUnits("EUR", UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR) + .withOptional(true); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityAsset() {} + + public ElectricityAsset(String name) { + super(name); + } + + public Optional getPower() { + return getAttributes().getValue(POWER); + } + + public T setPower(Double value) { + getAttributes().getOrCreate(POWER).setValue(value); + return (T) this; + } + + public Optional getPowerSetpoint() { + return getAttributes().getValue(POWER_SETPOINT); + } + + public T setPowerSetpoint(Double value) { + getAttributes().getOrCreate(POWER_SETPOINT).setValue(value); + return (T) this; + } + + public Optional getPowerImportMin() { + return getAttributes().getValue(POWER_IMPORT_MIN); + } + + public T setPowerImportMin(Double value) { + getAttributes().getOrCreate(POWER_IMPORT_MIN).setValue(value); + return (T) this; + } + + public Optional getPowerImportMax() { + return getAttributes().getValue(POWER_IMPORT_MAX); + } + + public T setPowerImportMax(Double value) { + getAttributes().getOrCreate(POWER_IMPORT_MAX).setValue(value); + return (T) this; + } + + public Optional getPowerExportMin() { + return getAttributes().getValue(POWER_EXPORT_MIN); + } + + public T setPowerExportMin(Double value) { + getAttributes().getOrCreate(POWER_EXPORT_MIN).setValue(value); + return (T) this; + } + + public Optional getPowerExportMax() { + return getAttributes().getValue(POWER_EXPORT_MAX); + } + + public T setPowerExportMax(Double value) { + getAttributes().getOrCreate(POWER_EXPORT_MAX).setValue(value); + return (T) this; + } + + public Optional getEnergyImportTotal() { + return getAttributes().getValue(ENERGY_IMPORT_TOTAL); + } + + public T setEnergyImportTotal(Double value) { + getAttributes().getOrCreate(ENERGY_IMPORT_TOTAL).setValue(value); + return (T) this; + } + + public Optional getEnergyExportTotal() { + return getAttributes().getValue(ENERGY_EXPORT_TOTAL); + } + + public T setEnergyExportTotal(Double value) { + getAttributes().getOrCreate(ENERGY_EXPORT_TOTAL).setValue(value); + return (T) this; + } + + public Optional getEfficiencyImport() { + return getAttributes().getValue(EFFICIENCY_IMPORT); + } + + public T setEfficiencyImport(Integer value) { + getAttributes().getOrCreate(EFFICIENCY_IMPORT).setValue(value); + return (T) this; + } + + public Optional getEfficiencyExport() { + return getAttributes().getValue(EFFICIENCY_EXPORT); + } + + public T setEfficiencyExport(Integer value) { + getAttributes().getOrCreate(EFFICIENCY_EXPORT).setValue(value); + return (T) this; + } + + public Optional getTariffImport() { + return getAttributes().getValue(TARIFF_IMPORT); + } + + public T setTariffImport(Double value) { + getAttributes().getOrCreate(TARIFF_IMPORT).setValue(value); + return (T) this; + } + + public Optional getTariffExport() { + return getAttributes().getValue(TARIFF_EXPORT); + } + + public T setTariffExport(Double value) { + getAttributes().getOrCreate(TARIFF_EXPORT).setValue(value); + return (T) this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityBatteryAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityBatteryAsset.java index f725a40..7f61a2c 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityBatteryAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityBatteryAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,41 +12,43 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Optional; - @Entity public class ElectricityBatteryAsset extends ElectricityStorageAsset { - public static final AttributeDescriptor CHARGE_CYCLES = new AttributeDescriptor<>("chargeCycles", ValueType.POSITIVE_INTEGER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withOptional(true); + public static final AttributeDescriptor CHARGE_CYCLES = + new AttributeDescriptor<>( + "chargeCycles", ValueType.POSITIVE_INTEGER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withOptional(true); - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("battery-charging", "1B7C89", ElectricityBatteryAsset.class); + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("battery-charging", "1B7C89", ElectricityBatteryAsset.class); - protected ElectricityBatteryAsset() { - } + protected ElectricityBatteryAsset() {} - public ElectricityBatteryAsset(String name) { - super(name); - } + public ElectricityBatteryAsset(String name) { + super(name); + } - public Optional getChargeCycles() { - return getAttributes().getValue(CHARGE_CYCLES); - } + public Optional getChargeCycles() { + return getAttributes().getValue(CHARGE_CYCLES); + } - public ElectricityStorageAsset setChargeCycles(Integer value) { - getAttributes().getOrCreate(CHARGE_CYCLES).setValue(value); - return this; - } + public ElectricityStorageAsset setChargeCycles(Integer value) { + getAttributes().getOrCreate(CHARGE_CYCLES).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityChargerAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityChargerAsset.java index 88690d8..b4d0e3e 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityChargerAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityChargerAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AttributeDescriptor; @@ -26,66 +27,65 @@ import org.openremote.model.value.ValueDescriptor; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Optional; - @Entity public class ElectricityChargerAsset extends ElectricityStorageAsset { - public enum ConnectorType { - YAZAKI, - MENNEKES, - LE_GRAND, - CHADEMO, - COMBO, - SCHUKO, - ENERGYLOCK - } + public enum ConnectorType { + YAZAKI, + MENNEKES, + LE_GRAND, + CHADEMO, + COMBO, + SCHUKO, + ENERGYLOCK + } - public static final ValueDescriptor CONNECTOR_TYPE_VALUE = new ValueDescriptor<>("connectorType", ConnectorType.class); + public static final ValueDescriptor CONNECTOR_TYPE_VALUE = + new ValueDescriptor<>("connectorType", ConnectorType.class); - public static final AttributeDescriptor CONNECTOR_TYPE = new AttributeDescriptor<>("connectorType", CONNECTOR_TYPE_VALUE); - public static final AttributeDescriptor VEHICLE_CONNECTED = new AttributeDescriptor<>("vehicleConnected", ValueType.BOOLEAN, - new MetaItem<>(MetaItemType.READ_ONLY)); - public static final AttributeDescriptor VEHICLE_ID = new AttributeDescriptor<>("vehicleID", ValueType.TEXT, - new MetaItem<>(MetaItemType.READ_ONLY, true)); + public static final AttributeDescriptor CONNECTOR_TYPE = + new AttributeDescriptor<>("connectorType", CONNECTOR_TYPE_VALUE); + public static final AttributeDescriptor VEHICLE_CONNECTED = + new AttributeDescriptor<>( + "vehicleConnected", ValueType.BOOLEAN, new MetaItem<>(MetaItemType.READ_ONLY)); + public static final AttributeDescriptor VEHICLE_ID = + new AttributeDescriptor<>( + "vehicleID", ValueType.TEXT, new MetaItem<>(MetaItemType.READ_ONLY, true)); - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("ev-station", "8A293D", ElectricityChargerAsset.class); + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("ev-station", "8A293D", ElectricityChargerAsset.class); - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityChargerAsset() { - } + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityChargerAsset() {} - public ElectricityChargerAsset(String name) { - super(name); - } + public ElectricityChargerAsset(String name) { + super(name); + } - public Optional getConnectorType() { - return getAttributes().getValue(CONNECTOR_TYPE); - } + public Optional getConnectorType() { + return getAttributes().getValue(CONNECTOR_TYPE); + } - public ElectricityChargerAsset setConnectorType(ConnectorType value) { - getAttributes().getOrCreate(CONNECTOR_TYPE).setValue(value); - return this; - } + public ElectricityChargerAsset setConnectorType(ConnectorType value) { + getAttributes().getOrCreate(CONNECTOR_TYPE).setValue(value); + return this; + } - public Optional getVehicleConnected() { - return getAttributes().getValue(VEHICLE_CONNECTED); - } + public Optional getVehicleConnected() { + return getAttributes().getValue(VEHICLE_CONNECTED); + } - public ElectricityChargerAsset setVehicleConnected(boolean value) { - getAttributes().getOrCreate(VEHICLE_CONNECTED).setValue(value); - return this; - } + public ElectricityChargerAsset setVehicleConnected(boolean value) { + getAttributes().getOrCreate(VEHICLE_CONNECTED).setValue(value); + return this; + } - public Optional getVehicleID() { - return getAttributes().getValue(VEHICLE_ID); - } + public Optional getVehicleID() { + return getAttributes().getValue(VEHICLE_ID); + } - public ElectricityChargerAsset setVehicleID(String value) { - getAttributes().getOrCreate(VEHICLE_ID).setValue(value); - return this; - } + public ElectricityChargerAsset setVehicleID(String value) { + getAttributes().getOrCreate(VEHICLE_ID).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityConsumerAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityConsumerAsset.java index 8a3d4f8..d79a0e9 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityConsumerAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityConsumerAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,45 +12,56 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; -import org.openremote.model.asset.AssetDescriptor; -import org.openremote.model.value.*; - -import jakarta.persistence.Entity; - import static org.openremote.model.Constants.UNITS_KILO; import static org.openremote.model.Constants.UNITS_WATT; +import jakarta.persistence.Entity; +import org.openremote.model.asset.AssetDescriptor; +import org.openremote.model.value.*; + @Entity public class ElectricityConsumerAsset extends ElectricityAsset { - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("power-plug", "8A293D", ElectricityConsumerAsset.class); - - public static final AttributeDescriptor POWER_SETPOINT = ElectricityAsset.POWER_SETPOINT.withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MIN = ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MAX = ElectricityAsset.POWER_IMPORT_MAX.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MIN = ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MAX = ElectricityAsset.POWER_EXPORT_MAX.withOptional(true); - public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = ElectricityAsset.ENERGY_EXPORT_TOTAL.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_IMPORT = ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_EXPORT = ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); - public static final AttributeDescriptor TARIFF_IMPORT = ElectricitySupplierAsset.TARIFF_IMPORT.withOptional(true); - public static final AttributeDescriptor TARIFF_EXPORT = ElectricitySupplierAsset.TARIFF_EXPORT.withOptional(true); - public static final AttributeDescriptor CARBON_IMPORT = ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); - - public static final AttributeDescriptor POWER_FORECAST = new AttributeDescriptor<>("powerForecast", ValueType.NUMBER - ).withUnits(UNITS_KILO, UNITS_WATT); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityConsumerAsset() { - } - - public ElectricityConsumerAsset(String name) { - super(name); - } + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("power-plug", "8A293D", ElectricityConsumerAsset.class); + + public static final AttributeDescriptor POWER_SETPOINT = + ElectricityAsset.POWER_SETPOINT.withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MIN = + ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MAX = + ElectricityAsset.POWER_IMPORT_MAX.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MIN = + ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MAX = + ElectricityAsset.POWER_EXPORT_MAX.withOptional(true); + public static final AttributeDescriptor ENERGY_EXPORT_TOTAL = + ElectricityAsset.ENERGY_EXPORT_TOTAL.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_IMPORT = + ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_EXPORT = + ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); + public static final AttributeDescriptor TARIFF_IMPORT = + ElectricitySupplierAsset.TARIFF_IMPORT.withOptional(true); + public static final AttributeDescriptor TARIFF_EXPORT = + ElectricitySupplierAsset.TARIFF_EXPORT.withOptional(true); + public static final AttributeDescriptor CARBON_IMPORT = + ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); + + public static final AttributeDescriptor POWER_FORECAST = + new AttributeDescriptor<>("powerForecast", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityConsumerAsset() {} + + public ElectricityConsumerAsset(String name) { + super(name); + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerAsset.java index aef906d..be10f9c 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,53 +12,63 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.UNITS_KILO; +import static org.openremote.model.Constants.UNITS_WATT; + +import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Optional; - -import static org.openremote.model.Constants.UNITS_KILO; -import static org.openremote.model.Constants.UNITS_WATT; - @Entity public class ElectricityProducerAsset extends ElectricityAsset { - public static final AttributeDescriptor POWER_SETPOINT = ElectricityAsset.POWER_SETPOINT.withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MIN = ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MAX = ElectricityAsset.POWER_IMPORT_MAX.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MIN = ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); - public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = ElectricityAsset.ENERGY_IMPORT_TOTAL.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_IMPORT = ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_EXPORT = ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); - public static final AttributeDescriptor TARIFF_IMPORT = ElectricitySupplierAsset.TARIFF_IMPORT.withOptional(true); - public static final AttributeDescriptor TARIFF_EXPORT = ElectricitySupplierAsset.TARIFF_EXPORT.withOptional(true); - public static final AttributeDescriptor CARBON_IMPORT = ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); + public static final AttributeDescriptor POWER_SETPOINT = + ElectricityAsset.POWER_SETPOINT.withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MIN = + ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MAX = + ElectricityAsset.POWER_IMPORT_MAX.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MIN = + ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); + public static final AttributeDescriptor ENERGY_IMPORT_TOTAL = + ElectricityAsset.ENERGY_IMPORT_TOTAL.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_IMPORT = + ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_EXPORT = + ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); + public static final AttributeDescriptor TARIFF_IMPORT = + ElectricitySupplierAsset.TARIFF_IMPORT.withOptional(true); + public static final AttributeDescriptor TARIFF_EXPORT = + ElectricitySupplierAsset.TARIFF_EXPORT.withOptional(true); + public static final AttributeDescriptor CARBON_IMPORT = + ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); - public static final AttributeDescriptor POWER_FORECAST = new AttributeDescriptor<>("powerForecast", ValueType.NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT); + public static final AttributeDescriptor POWER_FORECAST = + new AttributeDescriptor<>( + "powerForecast", ValueType.NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT); - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("flash", "EABB4D", ElectricityProducerAsset.class); + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("flash", "EABB4D", ElectricityProducerAsset.class); - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityProducerAsset() { - } + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityProducerAsset() {} - public ElectricityProducerAsset(String name) { - super(name); - } + public ElectricityProducerAsset(String name) { + super(name); + } - public Optional getPowerForecast() { - return getAttributes().getOrCreate(POWER_FORECAST).getValue(); - } + public Optional getPowerForecast() { + return getAttributes().getOrCreate(POWER_FORECAST).getValue(); + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerSolarAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerSolarAsset.java index 136d3ba..303b283 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerSolarAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerSolarAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,18 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.UNITS_DEGREE; +import static org.openremote.model.value.ValueType.BOOLEAN; + +import jakarta.persistence.Entity; +import java.util.Collection; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; @@ -26,249 +31,245 @@ import org.openremote.model.geo.GeoJSONPoint; import org.openremote.model.value.*; -import jakarta.persistence.Entity; -import java.util.Collection; -import java.util.Optional; - -import static org.openremote.model.Constants.UNITS_DEGREE; -import static org.openremote.model.value.ValueType.BOOLEAN; - @Entity public class ElectricityProducerSolarAsset extends ElectricityProducerAsset { - public enum PanelOrientation { - SOUTH, - EAST_WEST - } - - public static final ValueDescriptor PANEL_ORIENTATION_VALUE = new ValueDescriptor<>("panelOrientation", PanelOrientation.class); - - public static final AttributeDescriptor PANEL_ORIENTATION = new AttributeDescriptor<>("panelOrientation", PANEL_ORIENTATION_VALUE); - public static final AttributeDescriptor PANEL_AZIMUTH = new AttributeDescriptor<>("panelAzimuth", ValueType.INTEGER - ).withUnits(UNITS_DEGREE); - public static final AttributeDescriptor PANEL_PITCH = new AttributeDescriptor<>("panelPitch", ValueType.POSITIVE_INTEGER - ).withUnits(UNITS_DEGREE); - - public static final AttributeDescriptor INCLUDE_FORECAST_SOLAR_SERVICE = new AttributeDescriptor<>("includeForecastSolarService", BOOLEAN); - - public static final AttributeDescriptor SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST = new AttributeDescriptor<>("setActualSolarValueWithForecast", BOOLEAN); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("white-balance-sunny", "EABB4D", ElectricityProducerSolarAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityProducerSolarAsset() { - } - - public ElectricityProducerSolarAsset(String name) { - super(name); - } - - public Optional getPanelOrientation() { - return getAttributes().getValue(PANEL_ORIENTATION); - } - - public Optional isIncludeForecastSolarService() { - return getAttribute(INCLUDE_FORECAST_SOLAR_SERVICE).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional isSetActualSolarValueWithForecast() { - return getAttribute(SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST).flatMap(AbstractNameValueHolder::getValue); - } - - public ElectricityProducerSolarAsset setPanelOrientation(PanelOrientation value) { - getAttributes().getOrCreate(PANEL_ORIENTATION).setValue(value); - return this; - } - - public Optional getPanelAzimuth() { - return getAttributes().getValue(PANEL_AZIMUTH); - } - - public ElectricityProducerSolarAsset setPanelAzimuth(Integer value) { - getAttributes().getOrCreate(PANEL_AZIMUTH).setValue(value); - return this; - } - - public Optional getPanelPitch() { - return getAttributes().getValue(PANEL_PITCH); - } - - public ElectricityProducerSolarAsset setPanelPitch(Integer value) { - getAttributes().getOrCreate(PANEL_PITCH).setValue(value); - return this; - } - - public ElectricityProducerSolarAsset setIncludeForecastSolarService(boolean value) { - getAttributes().getOrCreate(INCLUDE_FORECAST_SOLAR_SERVICE).setValue(value); - return this; - } - - public ElectricityProducerSolarAsset setSetActualSolarValueWithForecast(boolean value) { - getAttributes().getOrCreate(SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST).setValue(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPower(Double value) { - super.setPower(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPowerSetpoint(Double value) { - super.setPowerSetpoint(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPowerImportMin(Double value) { - super.setPowerImportMin(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPowerImportMax(Double value) { - super.setPowerImportMax(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPowerExportMin(Double value) { - super.setPowerExportMin(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setPowerExportMax(Double value) { - super.setPowerExportMax(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setEnergyImportTotal(Double value) { - super.setEnergyImportTotal(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setEnergyExportTotal(Double value) { - super.setEnergyExportTotal(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setEfficiencyImport(Integer value) { - super.setEfficiencyImport(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setEfficiencyExport(Integer value) { - super.setEfficiencyExport(value); - return this; - } - - @Override - public ElectricityProducerSolarAsset setId(String id) { - super.setId(id); - return this; - } - - @Override - public ElectricityProducerSolarAsset setName(String name) throws IllegalArgumentException { - super.setName(name); - return this; - } - - @Override - public ElectricityProducerSolarAsset setAccessPublicRead(boolean accessPublicRead) { - super.setAccessPublicRead(accessPublicRead); - return this; - } - - @Override - public ElectricityProducerSolarAsset setParent(Asset parent) { - super.setParent(parent); - return this; - } - - @Override - public ElectricityProducerSolarAsset setParentId(String parentId) { - super.setParentId(parentId); - return this; - } - - @Override - public ElectricityProducerSolarAsset setRealm(String realm) { - super.setRealm(realm); - return this; - } - - @Override - public ElectricityProducerSolarAsset setAttributes(AttributeMap attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public Asset setAttributes(Attribute... attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerSolarAsset setAttributes(Collection> attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerSolarAsset addAttributes(Attribute... attributes) { - super.addAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerSolarAsset addOrReplaceAttributes(Attribute... attributes) { - super.addOrReplaceAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerSolarAsset setLocation(GeoJSONPoint location) { - super.setLocation(location); - return this; - } - - @Override - public ElectricityProducerSolarAsset setTags(String[] tags) { - super.setTags(tags); - return this; - } - - @Override - public ElectricityProducerSolarAsset setEmail(String email) { - super.setEmail(email); - return this; - } - - @Override - public ElectricityProducerSolarAsset setNotes(String notes) { - super.setNotes(notes); - return this; - } - - @Override - public ElectricityProducerSolarAsset setManufacturer(String manufacturer) { - super.setManufacturer(manufacturer); - return this; - } - - @Override - public ElectricityProducerSolarAsset setModel(String model) { - super.setModel(model); - return this; - } + public enum PanelOrientation { + SOUTH, + EAST_WEST + } + + public static final ValueDescriptor PANEL_ORIENTATION_VALUE = + new ValueDescriptor<>("panelOrientation", PanelOrientation.class); + + public static final AttributeDescriptor PANEL_ORIENTATION = + new AttributeDescriptor<>("panelOrientation", PANEL_ORIENTATION_VALUE); + public static final AttributeDescriptor PANEL_AZIMUTH = + new AttributeDescriptor<>("panelAzimuth", ValueType.INTEGER).withUnits(UNITS_DEGREE); + public static final AttributeDescriptor PANEL_PITCH = + new AttributeDescriptor<>("panelPitch", ValueType.POSITIVE_INTEGER).withUnits(UNITS_DEGREE); + + public static final AttributeDescriptor INCLUDE_FORECAST_SOLAR_SERVICE = + new AttributeDescriptor<>("includeForecastSolarService", BOOLEAN); + + public static final AttributeDescriptor SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST = + new AttributeDescriptor<>("setActualSolarValueWithForecast", BOOLEAN); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("white-balance-sunny", "EABB4D", ElectricityProducerSolarAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityProducerSolarAsset() {} + + public ElectricityProducerSolarAsset(String name) { + super(name); + } + + public Optional getPanelOrientation() { + return getAttributes().getValue(PANEL_ORIENTATION); + } + + public Optional isIncludeForecastSolarService() { + return getAttribute(INCLUDE_FORECAST_SOLAR_SERVICE).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional isSetActualSolarValueWithForecast() { + return getAttribute(SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST) + .flatMap(AbstractNameValueHolder::getValue); + } + + public ElectricityProducerSolarAsset setPanelOrientation(PanelOrientation value) { + getAttributes().getOrCreate(PANEL_ORIENTATION).setValue(value); + return this; + } + + public Optional getPanelAzimuth() { + return getAttributes().getValue(PANEL_AZIMUTH); + } + + public ElectricityProducerSolarAsset setPanelAzimuth(Integer value) { + getAttributes().getOrCreate(PANEL_AZIMUTH).setValue(value); + return this; + } + + public Optional getPanelPitch() { + return getAttributes().getValue(PANEL_PITCH); + } + + public ElectricityProducerSolarAsset setPanelPitch(Integer value) { + getAttributes().getOrCreate(PANEL_PITCH).setValue(value); + return this; + } + + public ElectricityProducerSolarAsset setIncludeForecastSolarService(boolean value) { + getAttributes().getOrCreate(INCLUDE_FORECAST_SOLAR_SERVICE).setValue(value); + return this; + } + + public ElectricityProducerSolarAsset setSetActualSolarValueWithForecast(boolean value) { + getAttributes().getOrCreate(SET_ACTUAL_SOLAR_VALUE_WITH_FORECAST).setValue(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPower(Double value) { + super.setPower(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPowerSetpoint(Double value) { + super.setPowerSetpoint(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPowerImportMin(Double value) { + super.setPowerImportMin(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPowerImportMax(Double value) { + super.setPowerImportMax(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPowerExportMin(Double value) { + super.setPowerExportMin(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setPowerExportMax(Double value) { + super.setPowerExportMax(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setEnergyImportTotal(Double value) { + super.setEnergyImportTotal(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setEnergyExportTotal(Double value) { + super.setEnergyExportTotal(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setEfficiencyImport(Integer value) { + super.setEfficiencyImport(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setEfficiencyExport(Integer value) { + super.setEfficiencyExport(value); + return this; + } + + @Override + public ElectricityProducerSolarAsset setId(String id) { + super.setId(id); + return this; + } + + @Override + public ElectricityProducerSolarAsset setName(String name) throws IllegalArgumentException { + super.setName(name); + return this; + } + + @Override + public ElectricityProducerSolarAsset setAccessPublicRead(boolean accessPublicRead) { + super.setAccessPublicRead(accessPublicRead); + return this; + } + + @Override + public ElectricityProducerSolarAsset setParent(Asset parent) { + super.setParent(parent); + return this; + } + + @Override + public ElectricityProducerSolarAsset setParentId(String parentId) { + super.setParentId(parentId); + return this; + } + + @Override + public ElectricityProducerSolarAsset setRealm(String realm) { + super.setRealm(realm); + return this; + } + + @Override + public ElectricityProducerSolarAsset setAttributes(AttributeMap attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public Asset setAttributes(Attribute... attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerSolarAsset setAttributes(Collection> attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerSolarAsset addAttributes(Attribute... attributes) { + super.addAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerSolarAsset addOrReplaceAttributes(Attribute... attributes) { + super.addOrReplaceAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerSolarAsset setLocation(GeoJSONPoint location) { + super.setLocation(location); + return this; + } + + @Override + public ElectricityProducerSolarAsset setTags(String[] tags) { + super.setTags(tags); + return this; + } + + @Override + public ElectricityProducerSolarAsset setEmail(String email) { + super.setEmail(email); + return this; + } + + @Override + public ElectricityProducerSolarAsset setNotes(String notes) { + super.setNotes(notes); + return this; + } + + @Override + public ElectricityProducerSolarAsset setManufacturer(String manufacturer) { + super.setManufacturer(manufacturer); + return this; + } + + @Override + public ElectricityProducerSolarAsset setModel(String model) { + super.setModel(model); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerWindAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerWindAsset.java index e5d414d..b7f1479 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerWindAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityProducerWindAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,18 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; +import static org.openremote.model.value.ValueType.BOOLEAN; + +import jakarta.persistence.Entity; +import java.util.Collection; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.Attribute; @@ -28,243 +33,240 @@ import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Collection; -import java.util.Optional; - -import static org.openremote.model.Constants.*; -import static org.openremote.model.value.ValueType.BOOLEAN; - @Entity public class ElectricityProducerWindAsset extends ElectricityProducerAsset { - public static final AttributeDescriptor WIND_SPEED_REFERENCE = new AttributeDescriptor<>("windSpeedReference", ValueType.POSITIVE_NUMBER - ).withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); - public static final AttributeDescriptor WIND_SPEED_MIN = new AttributeDescriptor<>("windSpeedMin", ValueType.POSITIVE_NUMBER - ).withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); - public static final AttributeDescriptor WIND_SPEED_MAX = new AttributeDescriptor<>("windSpeedMax", ValueType.POSITIVE_NUMBER - ).withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); - - public static final AttributeDescriptor INCLUDE_FORECAST_WIND_SERVICE = new AttributeDescriptor<>("includeForecastWindService", BOOLEAN); - - public static final AttributeDescriptor SET_ACTUAL_WIND_VALUE_WITH_FORECAST = new AttributeDescriptor<>("setWindActualValueWithForecast", BOOLEAN); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("wind-turbine", "4B87EA", ElectricityProducerWindAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityProducerWindAsset() { - } - - public ElectricityProducerWindAsset(String name) { - super(name); - } - - public Optional getWindSpeedReference() { - return getAttributes().getValue(WIND_SPEED_REFERENCE); - } - - public Optional getWindSpeedMin() { - return getAttributes().getValue(WIND_SPEED_MIN); - } - - public Optional getWindSpeedMax() { - return getAttributes().getValue(WIND_SPEED_MAX); - } - - public Optional isIncludeForecastWindService() { - return getAttribute(INCLUDE_FORECAST_WIND_SERVICE).flatMap(AbstractNameValueHolder::getValue); - } - - public Optional isSetActualWindValueWithForecast() { - return getAttribute(SET_ACTUAL_WIND_VALUE_WITH_FORECAST).flatMap(AbstractNameValueHolder::getValue); - } - - @Override - public ElectricityProducerWindAsset setPower(Double value) { - super.setPower(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setPowerSetpoint(Double value) { - super.setPowerSetpoint(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setPowerImportMin(Double value) { - super.setPowerImportMin(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setPowerImportMax(Double value) { - super.setPowerImportMax(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setPowerExportMin(Double value) { - super.setPowerExportMin(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setPowerExportMax(Double value) { - super.setPowerExportMax(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setEnergyImportTotal(Double value) { - super.setEnergyImportTotal(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setEnergyExportTotal(Double value) { - super.setEnergyExportTotal(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setEfficiencyImport(Integer value) { - super.setEfficiencyImport(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setEfficiencyExport(Integer value) { - super.setEfficiencyExport(value); - return this; - } - - @Override - public ElectricityProducerWindAsset setId(String id) { - super.setId(id); - return this; - } - - @Override - public ElectricityProducerWindAsset setName(String name) throws IllegalArgumentException { - super.setName(name); - return this; - } - - @Override - public ElectricityProducerWindAsset setAccessPublicRead(boolean accessPublicRead) { - super.setAccessPublicRead(accessPublicRead); - return this; - } - - @Override - public ElectricityProducerWindAsset setParent(Asset parent) { - super.setParent(parent); - return this; - } - - @Override - public ElectricityProducerWindAsset setParentId(String parentId) { - super.setParentId(parentId); - return this; - } - - @Override - public ElectricityProducerWindAsset setRealm(String realm) { - super.setRealm(realm); - return this; - } - - @Override - public ElectricityProducerWindAsset setAttributes(AttributeMap attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public Asset setAttributes(Attribute... attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerWindAsset setAttributes(Collection> attributes) { - super.setAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerWindAsset addAttributes(Attribute... attributes) { - super.addAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerWindAsset addOrReplaceAttributes(Attribute... attributes) { - super.addOrReplaceAttributes(attributes); - return this; - } - - @Override - public ElectricityProducerWindAsset setLocation(GeoJSONPoint location) { - super.setLocation(location); - return this; - } - - @Override - public ElectricityProducerWindAsset setTags(String[] tags) { - super.setTags(tags); - return this; - } - - @Override - public ElectricityProducerWindAsset setEmail(String email) { - super.setEmail(email); - return this; - } - - @Override - public ElectricityProducerWindAsset setNotes(String notes) { - super.setNotes(notes); - return this; - } - - @Override - public ElectricityProducerWindAsset setManufacturer(String manufacturer) { - super.setManufacturer(manufacturer); - return this; - } - - @Override - public ElectricityProducerWindAsset setModel(String model) { - super.setModel(model); - return this; - } - - public ElectricityProducerWindAsset setWindSpeedMin(double value) { - getAttributes().getOrCreate(WIND_SPEED_MIN).setValue(value); - return this; - } - - public ElectricityProducerWindAsset setWindSpeedMax(double value) { - getAttributes().getOrCreate(WIND_SPEED_MAX).setValue(value); - return this; - } - - public ElectricityProducerWindAsset setWindSpeedReference(double value) { - getAttributes().getOrCreate(WIND_SPEED_REFERENCE).setValue(value); - return this; - } - - public ElectricityProducerWindAsset setIncludeForecastWindService(boolean value) { - getAttributes().getOrCreate(INCLUDE_FORECAST_WIND_SERVICE).setValue(value); - return this; - } - - public ElectricityProducerWindAsset setSetActualWindValueWithForecast(boolean value) { - getAttributes().getOrCreate(SET_ACTUAL_WIND_VALUE_WITH_FORECAST).setValue(value); - return this; - } + public static final AttributeDescriptor WIND_SPEED_REFERENCE = + new AttributeDescriptor<>("windSpeedReference", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); + public static final AttributeDescriptor WIND_SPEED_MIN = + new AttributeDescriptor<>("windSpeedMin", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); + public static final AttributeDescriptor WIND_SPEED_MAX = + new AttributeDescriptor<>("windSpeedMax", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_METRE, UNITS_PER, UNITS_SECOND); + + public static final AttributeDescriptor INCLUDE_FORECAST_WIND_SERVICE = + new AttributeDescriptor<>("includeForecastWindService", BOOLEAN); + + public static final AttributeDescriptor SET_ACTUAL_WIND_VALUE_WITH_FORECAST = + new AttributeDescriptor<>("setWindActualValueWithForecast", BOOLEAN); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("wind-turbine", "4B87EA", ElectricityProducerWindAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityProducerWindAsset() {} + + public ElectricityProducerWindAsset(String name) { + super(name); + } + + public Optional getWindSpeedReference() { + return getAttributes().getValue(WIND_SPEED_REFERENCE); + } + + public Optional getWindSpeedMin() { + return getAttributes().getValue(WIND_SPEED_MIN); + } + + public Optional getWindSpeedMax() { + return getAttributes().getValue(WIND_SPEED_MAX); + } + + public Optional isIncludeForecastWindService() { + return getAttribute(INCLUDE_FORECAST_WIND_SERVICE).flatMap(AbstractNameValueHolder::getValue); + } + + public Optional isSetActualWindValueWithForecast() { + return getAttribute(SET_ACTUAL_WIND_VALUE_WITH_FORECAST) + .flatMap(AbstractNameValueHolder::getValue); + } + + @Override + public ElectricityProducerWindAsset setPower(Double value) { + super.setPower(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setPowerSetpoint(Double value) { + super.setPowerSetpoint(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setPowerImportMin(Double value) { + super.setPowerImportMin(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setPowerImportMax(Double value) { + super.setPowerImportMax(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setPowerExportMin(Double value) { + super.setPowerExportMin(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setPowerExportMax(Double value) { + super.setPowerExportMax(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setEnergyImportTotal(Double value) { + super.setEnergyImportTotal(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setEnergyExportTotal(Double value) { + super.setEnergyExportTotal(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setEfficiencyImport(Integer value) { + super.setEfficiencyImport(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setEfficiencyExport(Integer value) { + super.setEfficiencyExport(value); + return this; + } + + @Override + public ElectricityProducerWindAsset setId(String id) { + super.setId(id); + return this; + } + + @Override + public ElectricityProducerWindAsset setName(String name) throws IllegalArgumentException { + super.setName(name); + return this; + } + + @Override + public ElectricityProducerWindAsset setAccessPublicRead(boolean accessPublicRead) { + super.setAccessPublicRead(accessPublicRead); + return this; + } + + @Override + public ElectricityProducerWindAsset setParent(Asset parent) { + super.setParent(parent); + return this; + } + + @Override + public ElectricityProducerWindAsset setParentId(String parentId) { + super.setParentId(parentId); + return this; + } + + @Override + public ElectricityProducerWindAsset setRealm(String realm) { + super.setRealm(realm); + return this; + } + + @Override + public ElectricityProducerWindAsset setAttributes(AttributeMap attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public Asset setAttributes(Attribute... attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerWindAsset setAttributes(Collection> attributes) { + super.setAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerWindAsset addAttributes(Attribute... attributes) { + super.addAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerWindAsset addOrReplaceAttributes(Attribute... attributes) { + super.addOrReplaceAttributes(attributes); + return this; + } + + @Override + public ElectricityProducerWindAsset setLocation(GeoJSONPoint location) { + super.setLocation(location); + return this; + } + + @Override + public ElectricityProducerWindAsset setTags(String[] tags) { + super.setTags(tags); + return this; + } + + @Override + public ElectricityProducerWindAsset setEmail(String email) { + super.setEmail(email); + return this; + } + + @Override + public ElectricityProducerWindAsset setNotes(String notes) { + super.setNotes(notes); + return this; + } + + @Override + public ElectricityProducerWindAsset setManufacturer(String manufacturer) { + super.setManufacturer(manufacturer); + return this; + } + + @Override + public ElectricityProducerWindAsset setModel(String model) { + super.setModel(model); + return this; + } + + public ElectricityProducerWindAsset setWindSpeedMin(double value) { + getAttributes().getOrCreate(WIND_SPEED_MIN).setValue(value); + return this; + } + + public ElectricityProducerWindAsset setWindSpeedMax(double value) { + getAttributes().getOrCreate(WIND_SPEED_MAX).setValue(value); + return this; + } + + public ElectricityProducerWindAsset setWindSpeedReference(double value) { + getAttributes().getOrCreate(WIND_SPEED_REFERENCE).setValue(value); + return this; + } + + public ElectricityProducerWindAsset setIncludeForecastWindService(boolean value) { + getAttributes().getOrCreate(INCLUDE_FORECAST_WIND_SERVICE).setValue(value); + return this; + } + + public ElectricityProducerWindAsset setSetActualWindValueWithForecast(boolean value) { + getAttributes().getOrCreate(SET_ACTUAL_WIND_VALUE_WITH_FORECAST).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityStorageAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityStorageAsset.java index 9fc17b9..f642152 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricityStorageAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricityStorageAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,15 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; + +import java.util.Optional; import org.openremote.model.attribute.AttributeExecuteStatus; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AttributeDescriptor; @@ -26,115 +28,126 @@ import org.openremote.model.value.ValueConstraint; import org.openremote.model.value.ValueType; -import java.util.Optional; - -import static org.openremote.model.Constants.*; - public abstract class ElectricityStorageAsset extends ElectricityAsset { - - public static final AttributeDescriptor SUPPORTS_EXPORT = new AttributeDescriptor<>("supportsExport", ValueType.BOOLEAN); - public static final AttributeDescriptor SUPPORTS_IMPORT = new AttributeDescriptor<>("supportsImport", ValueType.BOOLEAN); - public static final AttributeDescriptor ENERGY_LEVEL = new AttributeDescriptor<>("energyLevel", ValueType.POSITIVE_NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - public static final AttributeDescriptor ENERGY_CAPACITY = new AttributeDescriptor<>("energyCapacity", ValueType.POSITIVE_NUMBER) - .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE = new AttributeDescriptor<>("energyLevelPercentage", ValueType.POSITIVE_INTEGER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MAX = new AttributeDescriptor<>("energyLevelPercentageMax", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MIN = new AttributeDescriptor<>("energyLevelPercentageMin", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - public static final AttributeDescriptor ENERGY_LEVEL_SCHEDULE = new AttributeDescriptor<>("energyLevelSchedule", ValueType.POSITIVE_INTEGER.asArray().asArray()) - .withOptional(true); - public static final AttributeDescriptor FORCE_CHARGE = new AttributeDescriptor<>("forceCharge", ValueType.EXECUTION_STATUS); - - public static final AttributeDescriptor POWER_SETPOINT = ElectricityAsset.POWER_SETPOINT.withOptional(false); - public static final AttributeDescriptor POWER_IMPORT_MIN = ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MIN = ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); - public static final AttributeDescriptor CARBON_IMPORT = ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricityStorageAsset() { - } - - public ElectricityStorageAsset(String name) { - super(name); - } - - public Optional isSupportsExport() { - return getAttributes().getValue(SUPPORTS_EXPORT); - } - - public ElectricityStorageAsset setSupportsExport(Boolean value) { - getAttributes().getOrCreate(SUPPORTS_EXPORT).setValue(value); - return this; - } - - public Optional isSupportsImport() { - return getAttributes().getValue(SUPPORTS_IMPORT); - } - - public ElectricityStorageAsset setSupportsImport(Boolean value) { - getAttributes().getOrCreate(SUPPORTS_IMPORT).setValue(value); - return this; - } - - public Optional getEnergyCapacity() { - return getAttributes().getValue(ENERGY_CAPACITY); - } - - public ElectricityStorageAsset setEnergyCapacity(Double value) { - getAttributes().getOrCreate(ENERGY_CAPACITY).setValue(value); - return this; - } - - public Optional getEnergyLevel() { - return getAttributes().getValue(ENERGY_LEVEL); - } - - public ElectricityStorageAsset setEnergyLevel(Double value) { - getAttributes().getOrCreate(ENERGY_LEVEL).setValue(value); - return this; - } - - public Optional getEnergyLevelPercentage() { - return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE); - } - - public ElectricityStorageAsset setEnergyLevelPercentage(Integer value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE).setValue(value); - return this; - } - - public Optional getEnergyLevelPercentageMin() { - return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE_MIN); - } - - public ElectricityStorageAsset setEnergyLevelPercentageMin(Integer value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MIN).setValue(value); - return this; - } - - public Optional getEnergyLevelPercentageMax() { - return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE_MAX); - } - - public ElectricityStorageAsset setEnergyLevelPercentageMax(Integer value) { - getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MAX).setValue(value); - return this; - } - - public Optional getEnergyLevelSchedule() { - return getAttributes().getValue(ENERGY_LEVEL_SCHEDULE); - } - - public ElectricityStorageAsset setEnergyLevelSchedule(Integer[][] value) { - getAttributes().getOrCreate(ENERGY_LEVEL_SCHEDULE).setValue(value); - return this; - } + public static final AttributeDescriptor SUPPORTS_EXPORT = + new AttributeDescriptor<>("supportsExport", ValueType.BOOLEAN); + public static final AttributeDescriptor SUPPORTS_IMPORT = + new AttributeDescriptor<>("supportsImport", ValueType.BOOLEAN); + public static final AttributeDescriptor ENERGY_LEVEL = + new AttributeDescriptor<>( + "energyLevel", ValueType.POSITIVE_NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + public static final AttributeDescriptor ENERGY_CAPACITY = + new AttributeDescriptor<>("energyCapacity", ValueType.POSITIVE_NUMBER) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE = + new AttributeDescriptor<>( + "energyLevelPercentage", + ValueType.POSITIVE_INTEGER, + new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MAX = + new AttributeDescriptor<>("energyLevelPercentageMax", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + public static final AttributeDescriptor ENERGY_LEVEL_PERCENTAGE_MIN = + new AttributeDescriptor<>("energyLevelPercentageMin", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + public static final AttributeDescriptor ENERGY_LEVEL_SCHEDULE = + new AttributeDescriptor<>( + "energyLevelSchedule", ValueType.POSITIVE_INTEGER.asArray().asArray()) + .withOptional(true); + public static final AttributeDescriptor FORCE_CHARGE = + new AttributeDescriptor<>("forceCharge", ValueType.EXECUTION_STATUS); + + public static final AttributeDescriptor POWER_SETPOINT = + ElectricityAsset.POWER_SETPOINT.withOptional(false); + public static final AttributeDescriptor POWER_IMPORT_MIN = + ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MIN = + ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); + public static final AttributeDescriptor CARBON_IMPORT = + ElectricitySupplierAsset.CARBON_IMPORT.withOptional(true); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricityStorageAsset() {} + + public ElectricityStorageAsset(String name) { + super(name); + } + + public Optional isSupportsExport() { + return getAttributes().getValue(SUPPORTS_EXPORT); + } + + public ElectricityStorageAsset setSupportsExport(Boolean value) { + getAttributes().getOrCreate(SUPPORTS_EXPORT).setValue(value); + return this; + } + + public Optional isSupportsImport() { + return getAttributes().getValue(SUPPORTS_IMPORT); + } + + public ElectricityStorageAsset setSupportsImport(Boolean value) { + getAttributes().getOrCreate(SUPPORTS_IMPORT).setValue(value); + return this; + } + + public Optional getEnergyCapacity() { + return getAttributes().getValue(ENERGY_CAPACITY); + } + + public ElectricityStorageAsset setEnergyCapacity(Double value) { + getAttributes().getOrCreate(ENERGY_CAPACITY).setValue(value); + return this; + } + + public Optional getEnergyLevel() { + return getAttributes().getValue(ENERGY_LEVEL); + } + + public ElectricityStorageAsset setEnergyLevel(Double value) { + getAttributes().getOrCreate(ENERGY_LEVEL).setValue(value); + return this; + } + + public Optional getEnergyLevelPercentage() { + return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE); + } + + public ElectricityStorageAsset setEnergyLevelPercentage(Integer value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE).setValue(value); + return this; + } + + public Optional getEnergyLevelPercentageMin() { + return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE_MIN); + } + + public ElectricityStorageAsset setEnergyLevelPercentageMin(Integer value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MIN).setValue(value); + return this; + } + + public Optional getEnergyLevelPercentageMax() { + return getAttributes().getValue(ENERGY_LEVEL_PERCENTAGE_MAX); + } + + public ElectricityStorageAsset setEnergyLevelPercentageMax(Integer value) { + getAttributes().getOrCreate(ENERGY_LEVEL_PERCENTAGE_MAX).setValue(value); + return this; + } + + public Optional getEnergyLevelSchedule() { + return getAttributes().getValue(ENERGY_LEVEL_SCHEDULE); + } + + public ElectricityStorageAsset setEnergyLevelSchedule(Integer[][] value) { + getAttributes().getOrCreate(ENERGY_LEVEL_SCHEDULE).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/ElectricitySupplierAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/ElectricitySupplierAsset.java index 802dacb..854251c 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/ElectricitySupplierAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/ElectricitySupplierAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2020, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,10 +12,17 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; +import static org.openremote.model.value.ValueType.NUMBER; + +import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.AbstractNameValueHolder; @@ -26,126 +30,134 @@ import org.openremote.model.value.MetaItemType; import org.openremote.model.value.ValueType; -import jakarta.persistence.Entity; -import java.util.Optional; - -import static org.openremote.model.Constants.*; -import static org.openremote.model.value.ValueType.NUMBER; - @Entity public class ElectricitySupplierAsset extends ElectricityAsset { - public static final AttributeDescriptor FINANCIAL_COST = new AttributeDescriptor<>("financialCost", ValueType.NUMBER).withUnits("EUR"); - public static final AttributeDescriptor CARBON_COST = new AttributeDescriptor<>("carbonCost", ValueType.NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_GRAM); - public static final AttributeDescriptor ENERGY_LOCAL = new AttributeDescriptor<>("energyLocal", NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); - public static final AttributeDescriptor ENERGY_RENEWABLE_SHARE = new AttributeDescriptor<>("energyRenewableShare", NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_PERCENTAGE); - public static final AttributeDescriptor ENERGY_SELF_CONSUMPTION = new AttributeDescriptor<>("energySelfConsumption", NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_PERCENTAGE); - public static final AttributeDescriptor ENERGY_AUTARKY = new AttributeDescriptor<>("energyAutarky", NUMBER, - new MetaItem<>(MetaItemType.READ_ONLY) - ).withUnits(UNITS_PERCENTAGE); - - public static final AttributeDescriptor POWER_SETPOINT = ElectricityAsset.POWER_SETPOINT.withOptional(true); - public static final AttributeDescriptor POWER_IMPORT_MIN = ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MAX = ElectricityAsset.POWER_EXPORT_MAX.withOptional(true); - public static final AttributeDescriptor POWER_EXPORT_MIN = ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_IMPORT = ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); - public static final AttributeDescriptor EFFICIENCY_EXPORT = ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); - public static final AttributeDescriptor TARIFF_IMPORT = ElectricityAsset.TARIFF_IMPORT.withOptional(false); - public static final AttributeDescriptor TARIFF_EXPORT = ElectricityAsset.TARIFF_EXPORT.withOptional(false); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("upload-network", "9257A9", ElectricitySupplierAsset.class); - public static final AttributeDescriptor CARBON_IMPORT = new AttributeDescriptor<>("carbonImport", ValueType.NUMBER) - .withUnits(UNITS_KILO, UNITS_GRAM, UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR).withOptional(false); - public static final AttributeDescriptor CARBON_EXPORT = new AttributeDescriptor<>("carbonExport", ValueType.NUMBER) - .withUnits(UNITS_KILO, UNITS_GRAM, UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR).withOptional(false); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected ElectricitySupplierAsset() { - } - - public ElectricitySupplierAsset(String name) { - super(name); - } - - public Optional getFinancialCost() { - return getAttributes().getValue(FINANCIAL_COST); - } - - public ElectricitySupplierAsset setFinancialCost(Double value) { - getAttributes().getOrCreate(FINANCIAL_COST).setValue(value); - return this; - } - - public Optional getCarbonCost() { - return getAttributes().getValue(CARBON_COST); - } - - public ElectricitySupplierAsset setCarbonCost(Double value) { - getAttributes().getOrCreate(CARBON_COST).setValue(value); - return this; - } - - public Optional getCarbonImport() { - return getAttributes().getValue(CARBON_IMPORT); - } - - public ElectricitySupplierAsset setCarbonImport(Double value) { - getAttributes().getOrCreate(CARBON_IMPORT).setValue(value); - return this; - } - - public Optional getCarbonExport() { - return getAttributes().getValue(CARBON_EXPORT); - } - - public ElectricitySupplierAsset setCarbonExport(Double value) { - getAttributes().getOrCreate(CARBON_EXPORT).setValue(value); - return this; - } - - public Optional getEnergyLocal() { - return getAttribute(ENERGY_LOCAL).flatMap(AbstractNameValueHolder::getValue); - } - - public ElectricitySupplierAsset setEnergyLocal(Double value) { - getAttributes().getOrCreate(ENERGY_LOCAL).setValue(value); - return this; - } - - public Optional getEnergyRenewableShare() { - return getAttribute(ENERGY_RENEWABLE_SHARE).flatMap(AbstractNameValueHolder::getValue); - } - - public ElectricitySupplierAsset setEnergyRenewableShare(Double value) { - getAttributes().getOrCreate(ENERGY_RENEWABLE_SHARE).setValue(value); - return this; - } - - public Optional getEnergySelfConsumption() { - return getAttribute(ENERGY_SELF_CONSUMPTION).flatMap(AbstractNameValueHolder::getValue); - } - - public ElectricitySupplierAsset setEnergySelfConsumption(Double value) { - getAttributes().getOrCreate(ENERGY_SELF_CONSUMPTION).setValue(value); - return this; - } - - public Optional getEnergyAutarky() { - return getAttribute(ENERGY_AUTARKY).flatMap(AbstractNameValueHolder::getValue); - } - - public ElectricitySupplierAsset setEnergyAutarky(Double value) { - getAttributes().getOrCreate(ENERGY_AUTARKY).setValue(value); - return this; - } + public static final AttributeDescriptor FINANCIAL_COST = + new AttributeDescriptor<>("financialCost", ValueType.NUMBER).withUnits("EUR"); + public static final AttributeDescriptor CARBON_COST = + new AttributeDescriptor<>( + "carbonCost", ValueType.NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_GRAM); + public static final AttributeDescriptor ENERGY_LOCAL = + new AttributeDescriptor<>("energyLocal", NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_WATT, UNITS_HOUR); + public static final AttributeDescriptor ENERGY_RENEWABLE_SHARE = + new AttributeDescriptor<>( + "energyRenewableShare", NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_PERCENTAGE); + public static final AttributeDescriptor ENERGY_SELF_CONSUMPTION = + new AttributeDescriptor<>( + "energySelfConsumption", NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_PERCENTAGE); + public static final AttributeDescriptor ENERGY_AUTARKY = + new AttributeDescriptor<>("energyAutarky", NUMBER, new MetaItem<>(MetaItemType.READ_ONLY)) + .withUnits(UNITS_PERCENTAGE); + + public static final AttributeDescriptor POWER_SETPOINT = + ElectricityAsset.POWER_SETPOINT.withOptional(true); + public static final AttributeDescriptor POWER_IMPORT_MIN = + ElectricityAsset.POWER_IMPORT_MIN.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MAX = + ElectricityAsset.POWER_EXPORT_MAX.withOptional(true); + public static final AttributeDescriptor POWER_EXPORT_MIN = + ElectricityAsset.POWER_EXPORT_MIN.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_IMPORT = + ElectricityAsset.EFFICIENCY_IMPORT.withOptional(true); + public static final AttributeDescriptor EFFICIENCY_EXPORT = + ElectricityAsset.EFFICIENCY_EXPORT.withOptional(true); + public static final AttributeDescriptor TARIFF_IMPORT = + ElectricityAsset.TARIFF_IMPORT.withOptional(false); + public static final AttributeDescriptor TARIFF_EXPORT = + ElectricityAsset.TARIFF_EXPORT.withOptional(false); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("upload-network", "9257A9", ElectricitySupplierAsset.class); + public static final AttributeDescriptor CARBON_IMPORT = + new AttributeDescriptor<>("carbonImport", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_GRAM, UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR) + .withOptional(false); + public static final AttributeDescriptor CARBON_EXPORT = + new AttributeDescriptor<>("carbonExport", ValueType.NUMBER) + .withUnits(UNITS_KILO, UNITS_GRAM, UNITS_PER, UNITS_KILO, UNITS_WATT, UNITS_HOUR) + .withOptional(false); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected ElectricitySupplierAsset() {} + + public ElectricitySupplierAsset(String name) { + super(name); + } + + public Optional getFinancialCost() { + return getAttributes().getValue(FINANCIAL_COST); + } + + public ElectricitySupplierAsset setFinancialCost(Double value) { + getAttributes().getOrCreate(FINANCIAL_COST).setValue(value); + return this; + } + + public Optional getCarbonCost() { + return getAttributes().getValue(CARBON_COST); + } + + public ElectricitySupplierAsset setCarbonCost(Double value) { + getAttributes().getOrCreate(CARBON_COST).setValue(value); + return this; + } + + public Optional getCarbonImport() { + return getAttributes().getValue(CARBON_IMPORT); + } + + public ElectricitySupplierAsset setCarbonImport(Double value) { + getAttributes().getOrCreate(CARBON_IMPORT).setValue(value); + return this; + } + + public Optional getCarbonExport() { + return getAttributes().getValue(CARBON_EXPORT); + } + + public ElectricitySupplierAsset setCarbonExport(Double value) { + getAttributes().getOrCreate(CARBON_EXPORT).setValue(value); + return this; + } + + public Optional getEnergyLocal() { + return getAttribute(ENERGY_LOCAL).flatMap(AbstractNameValueHolder::getValue); + } + + public ElectricitySupplierAsset setEnergyLocal(Double value) { + getAttributes().getOrCreate(ENERGY_LOCAL).setValue(value); + return this; + } + + public Optional getEnergyRenewableShare() { + return getAttribute(ENERGY_RENEWABLE_SHARE).flatMap(AbstractNameValueHolder::getValue); + } + + public ElectricitySupplierAsset setEnergyRenewableShare(Double value) { + getAttributes().getOrCreate(ENERGY_RENEWABLE_SHARE).setValue(value); + return this; + } + + public Optional getEnergySelfConsumption() { + return getAttribute(ENERGY_SELF_CONSUMPTION).flatMap(AbstractNameValueHolder::getValue); + } + + public ElectricitySupplierAsset setEnergySelfConsumption(Double value) { + getAttributes().getOrCreate(ENERGY_SELF_CONSUMPTION).setValue(value); + return this; + } + + public Optional getEnergyAutarky() { + return getAttribute(ENERGY_AUTARKY).flatMap(AbstractNameValueHolder::getValue); + } + + public ElectricitySupplierAsset setEnergyAutarky(Double value) { + getAttributes().getOrCreate(ENERGY_AUTARKY).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/EnergyModelProvider.java b/energy/src/main/java/org/openremote/extension/energy/model/EnergyModelProvider.java index 8640a44..e9873c4 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/EnergyModelProvider.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/EnergyModelProvider.java @@ -1,9 +1,6 @@ /* * Copyright 2025, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,19 +12,19 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; import org.openremote.model.AssetModelProvider; -/** - * Provides the energy asset classes. - */ +/** Provides the energy asset classes. */ public class EnergyModelProvider implements AssetModelProvider { - @Override - public boolean useAutoScan() { - return true; - } + @Override + public boolean useAutoScan() { + return true; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/model/EnergyOptimisationAsset.java b/energy/src/main/java/org/openremote/extension/energy/model/EnergyOptimisationAsset.java index 70124ad..df7ce62 100644 --- a/energy/src/main/java/org/openremote/extension/energy/model/EnergyOptimisationAsset.java +++ b/energy/src/main/java/org/openremote/extension/energy/model/EnergyOptimisationAsset.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,87 +12,93 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.model; +import static org.openremote.model.Constants.*; +import static org.openremote.model.value.MetaItemType.READ_ONLY; +import static org.openremote.model.value.ValueType.*; + +import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.Asset; import org.openremote.model.asset.AssetDescriptor; import org.openremote.model.attribute.MetaItem; import org.openremote.model.value.*; -import jakarta.persistence.Entity; - -import java.util.Optional; - -import static org.openremote.model.Constants.*; -import static org.openremote.model.value.MetaItemType.READ_ONLY; -import static org.openremote.model.value.ValueType.*; - @Entity public class EnergyOptimisationAsset extends Asset { - public static final AttributeDescriptor FINANCIAL_WEIGHTING = new AttributeDescriptor<>("financialWeighting", ValueType.POSITIVE_INTEGER) - .withUnits(UNITS_PERCENTAGE).withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); - public static final AttributeDescriptor INTERVAL_SIZE = new AttributeDescriptor<>("intervalSize", POSITIVE_NUMBER); - public static final AttributeDescriptor OPTIMISATION_DISABLED = new AttributeDescriptor<>("optimisationDisabled", BOOLEAN, new MetaItem<>(READ_ONLY)); - public static final AttributeDescriptor FINANCIAL_SAVING = new AttributeDescriptor<>("financialSaving", NUMBER, new MetaItem<>(READ_ONLY)).withUnits("EUR"); - public static final AttributeDescriptor CARBON_SAVING = new AttributeDescriptor<>("carbonSaving", NUMBER, new MetaItem<>(READ_ONLY)).withUnits(UNITS_KILO, UNITS_GRAM); - - public static final AssetDescriptor DESCRIPTOR = new AssetDescriptor<>("flash", "C4DB0D", EnergyOptimisationAsset.class); - - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected EnergyOptimisationAsset() { - } - - public EnergyOptimisationAsset(String name) { - super(name); - } - - public Optional getFinancialWeighting() { - return getAttribute(FINANCIAL_WEIGHTING).flatMap(AbstractNameValueHolder::getValue); - } - - public EnergyOptimisationAsset setFinancialWeighting(Integer value) { - getAttributes().getOrCreate(FINANCIAL_WEIGHTING).setValue(value); - return this; - } - - public Optional getIntervalSize() { - return getAttribute(INTERVAL_SIZE).flatMap(AbstractNameValueHolder::getValue); - } - - public EnergyOptimisationAsset setIntervalSize(Double value) { - getAttributes().getOrCreate(INTERVAL_SIZE).setValue(value); - return this; - } - - public Optional isOptimisationDisabled() { - return getAttribute(OPTIMISATION_DISABLED).flatMap(AbstractNameValueHolder::getValue); - } - - public EnergyOptimisationAsset setOptimisationDisabled(Boolean value) { - getAttributes().getOrCreate(OPTIMISATION_DISABLED).setValue(value); - return this; - } - - public Optional getFinancialSaving() { - return getAttribute(FINANCIAL_SAVING).flatMap(AbstractNameValueHolder::getValue); - } - - public EnergyOptimisationAsset setFinancialSaving(Double value) { - getAttributes().getOrCreate(FINANCIAL_SAVING).setValue(value); - return this; - } - - public Optional getCarbonSaving() { - return getAttribute(CARBON_SAVING).flatMap(AbstractNameValueHolder::getValue); - } - - public EnergyOptimisationAsset setCarbonSaving(Double value) { - getAttributes().getOrCreate(CARBON_SAVING).setValue(value); - return this; - } + public static final AttributeDescriptor FINANCIAL_WEIGHTING = + new AttributeDescriptor<>("financialWeighting", ValueType.POSITIVE_INTEGER) + .withUnits(UNITS_PERCENTAGE) + .withConstraints(new ValueConstraint.Min(0), new ValueConstraint.Max(100)); + public static final AttributeDescriptor INTERVAL_SIZE = + new AttributeDescriptor<>("intervalSize", POSITIVE_NUMBER); + public static final AttributeDescriptor OPTIMISATION_DISABLED = + new AttributeDescriptor<>("optimisationDisabled", BOOLEAN, new MetaItem<>(READ_ONLY)); + public static final AttributeDescriptor FINANCIAL_SAVING = + new AttributeDescriptor<>("financialSaving", NUMBER, new MetaItem<>(READ_ONLY)) + .withUnits("EUR"); + public static final AttributeDescriptor CARBON_SAVING = + new AttributeDescriptor<>("carbonSaving", NUMBER, new MetaItem<>(READ_ONLY)) + .withUnits(UNITS_KILO, UNITS_GRAM); + + public static final AssetDescriptor DESCRIPTOR = + new AssetDescriptor<>("flash", "C4DB0D", EnergyOptimisationAsset.class); + + /** For use by hydrators (i.e. JPA/Jackson) */ + protected EnergyOptimisationAsset() {} + + public EnergyOptimisationAsset(String name) { + super(name); + } + + public Optional getFinancialWeighting() { + return getAttribute(FINANCIAL_WEIGHTING).flatMap(AbstractNameValueHolder::getValue); + } + + public EnergyOptimisationAsset setFinancialWeighting(Integer value) { + getAttributes().getOrCreate(FINANCIAL_WEIGHTING).setValue(value); + return this; + } + + public Optional getIntervalSize() { + return getAttribute(INTERVAL_SIZE).flatMap(AbstractNameValueHolder::getValue); + } + + public EnergyOptimisationAsset setIntervalSize(Double value) { + getAttributes().getOrCreate(INTERVAL_SIZE).setValue(value); + return this; + } + + public Optional isOptimisationDisabled() { + return getAttribute(OPTIMISATION_DISABLED).flatMap(AbstractNameValueHolder::getValue); + } + + public EnergyOptimisationAsset setOptimisationDisabled(Boolean value) { + getAttributes().getOrCreate(OPTIMISATION_DISABLED).setValue(value); + return this; + } + + public Optional getFinancialSaving() { + return getAttribute(FINANCIAL_SAVING).flatMap(AbstractNameValueHolder::getValue); + } + + public EnergyOptimisationAsset setFinancialSaving(Double value) { + getAttributes().getOrCreate(FINANCIAL_SAVING).setValue(value); + return this; + } + + public Optional getCarbonSaving() { + return getAttribute(CARBON_SAVING).flatMap(AbstractNameValueHolder::getValue); + } + + public EnergyOptimisationAsset setCarbonSaving(Double value) { + getAttributes().getOrCreate(CARBON_SAVING).setValue(value); + return this; + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgent.java b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgent.java index 8f85771..aa2fdbd 100644 --- a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgent.java +++ b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgent.java @@ -1,9 +1,6 @@ /* * Copyright 2017, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,34 +12,38 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.storage; +import jakarta.persistence.Entity; import org.openremote.model.asset.agent.Agent; import org.openremote.model.asset.agent.AgentDescriptor; -import jakarta.persistence.Entity; - @Entity -public class StorageSimulatorAgent extends Agent { +public class StorageSimulatorAgent + extends Agent { - public static AgentDescriptor DESCRIPTOR = new AgentDescriptor<>( - StorageSimulatorAgent.class, StorageSimulatorProtocol.class, StorageSimulatorAgentLink.class, null - ); + public static AgentDescriptor< + StorageSimulatorAgent, StorageSimulatorProtocol, StorageSimulatorAgentLink> + DESCRIPTOR = + new AgentDescriptor<>( + StorageSimulatorAgent.class, + StorageSimulatorProtocol.class, + StorageSimulatorAgentLink.class, + null); - /** - * For use by hydrators (i.e. JPA/Jackson) - */ - protected StorageSimulatorAgent() { - } + /** For use by hydrators (i.e. JPA/Jackson) */ + protected StorageSimulatorAgent() {} - public StorageSimulatorAgent(String name) { - super(name); - } + public StorageSimulatorAgent(String name) { + super(name); + } - @Override - public StorageSimulatorProtocol getProtocolInstance() { - return new StorageSimulatorProtocol(this); - } + @Override + public StorageSimulatorProtocol getProtocolInstance() { + return new StorageSimulatorProtocol(this); + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgentLink.java b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgentLink.java index 92d6975..7590cd4 100644 --- a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgentLink.java +++ b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorAgentLink.java @@ -1,9 +1,6 @@ /* * Copyright 2021, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,18 +12,19 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.storage; import org.openremote.model.asset.agent.AgentLink; public class StorageSimulatorAgentLink extends AgentLink { - // For Hydrators - protected StorageSimulatorAgentLink() { - } + // For Hydrators + protected StorageSimulatorAgentLink() {} - public StorageSimulatorAgentLink(String id) { - super(id); - } + public StorageSimulatorAgentLink(String id) { + super(id); + } } diff --git a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorProtocol.java b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorProtocol.java index b7e2e0f..9b1ff53 100644 --- a/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorProtocol.java +++ b/energy/src/main/java/org/openremote/extension/energy/storage/StorageSimulatorProtocol.java @@ -1,9 +1,6 @@ /* * Copyright 2017, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,19 +12,14 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.energy.storage; -import org.openremote.agent.protocol.AbstractProtocol; -import org.openremote.model.Container; -import org.openremote.model.asset.Asset; -import org.openremote.model.asset.agent.ConnectionStatus; -import org.openremote.extension.energy.model.ElectricityStorageAsset; -import org.openremote.model.attribute.Attribute; -import org.openremote.model.attribute.AttributeEvent; -import org.openremote.model.attribute.AttributeRef; -import org.openremote.model.syslog.SyslogCategory; +import static org.openremote.extension.energy.model.ElectricityStorageAsset.*; +import static org.openremote.model.syslog.SyslogCategory.PROTOCOL; import java.time.Duration; import java.time.Instant; @@ -39,197 +31,230 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; +import org.openremote.agent.protocol.AbstractProtocol; +import org.openremote.extension.energy.model.ElectricityStorageAsset; +import org.openremote.model.Container; +import org.openremote.model.asset.Asset; +import org.openremote.model.asset.agent.ConnectionStatus; +import org.openremote.model.attribute.Attribute; +import org.openremote.model.attribute.AttributeEvent; +import org.openremote.model.attribute.AttributeRef; +import org.openremote.model.syslog.SyslogCategory; -import static org.openremote.extension.energy.model.ElectricityStorageAsset.*; -import static org.openremote.model.syslog.SyslogCategory.PROTOCOL; - -public class StorageSimulatorProtocol extends AbstractProtocol { - - public static final String PROTOCOL_DISPLAY_NAME = "StorageSimulator"; - private static final Logger LOG = SyslogCategory.getLogger(PROTOCOL, StorageSimulatorProtocol.class); - protected final Map lastUpdateMap = new HashMap<>(); - protected final Map> simulationMap = new HashMap<>(); - protected final ReentrantLock lock = new ReentrantLock(); - - public StorageSimulatorProtocol(StorageSimulatorAgent agent) { - super(agent); - } - - @Override - public String getProtocolName() { - return PROTOCOL_DISPLAY_NAME; - } - - @Override - public String getProtocolInstanceUri() { - return "storagesimulator://" + agent.getId(); - +public class StorageSimulatorProtocol + extends AbstractProtocol { + + public static final String PROTOCOL_DISPLAY_NAME = "StorageSimulator"; + private static final Logger LOG = + SyslogCategory.getLogger(PROTOCOL, StorageSimulatorProtocol.class); + protected final Map lastUpdateMap = new HashMap<>(); + protected final Map> simulationMap = new HashMap<>(); + protected final ReentrantLock lock = new ReentrantLock(); + + public StorageSimulatorProtocol(StorageSimulatorAgent agent) { + super(agent); + } + + @Override + public String getProtocolName() { + return PROTOCOL_DISPLAY_NAME; + } + + @Override + public String getProtocolInstanceUri() { + return "storagesimulator://" + agent.getId(); + } + + @Override + protected void doStart(Container container) throws Exception { + setConnectionStatus(ConnectionStatus.CONNECTED); + } + + @Override + protected void doStop(Container container) throws Exception { + lock.lock(); + try { + new HashSet<>(simulationMap.keySet()).forEach(assetId -> stopSimulation(assetId)); + } finally { + lock.unlock(); } - - @Override - protected void doStart(Container container) throws Exception { - setConnectionStatus(ConnectionStatus.CONNECTED); + } + + @Override + protected void doLinkAttribute( + String assetId, Attribute attribute, StorageSimulatorAgentLink agentLink) + throws RuntimeException { + lock.lock(); + try { + if (checkLinkedAttributes(assetId) && !isSimulationStarted(assetId)) { + startSimulation(assetId); + } + } finally { + lock.unlock(); } - - @Override - protected void doStop(Container container) throws Exception { - lock.lock(); - try { - new HashSet<>(simulationMap.keySet()).forEach(assetId -> stopSimulation(assetId)); - } finally { - lock.unlock(); - } + } + + @Override + protected void doUnlinkAttribute( + String assetId, Attribute attribute, StorageSimulatorAgentLink agentLink) { + lock.lock(); + try { + if (!checkLinkedAttributes(assetId) && isSimulationStarted(assetId)) { + stopSimulation(assetId); + LOG.info("Stopped storage simulation for asset id: " + assetId); + } + } finally { + lock.unlock(); } + } - @Override - protected void doLinkAttribute(String assetId, Attribute attribute, StorageSimulatorAgentLink agentLink) throws RuntimeException { - lock.lock(); - try { - if (checkLinkedAttributes(assetId) && !isSimulationStarted(assetId)) { - startSimulation(assetId); - } - } finally { - lock.unlock(); - } - } + @Override + protected void doLinkedAttributeWrite( + StorageSimulatorAgentLink agentLink, AttributeEvent event, Object processedValue) { - @Override - protected void doUnlinkAttribute(String assetId, Attribute attribute, StorageSimulatorAgentLink agentLink) { - lock.lock(); - try { - if (!checkLinkedAttributes(assetId) && isSimulationStarted(assetId)) { - stopSimulation(assetId); - LOG.info("Stopped storage simulation for asset id: " + assetId); - } - } finally { - lock.unlock(); - } + // Power attribute is updated only by this protocol not by clients + if (event.getName().equals(POWER.getName())) { + return; } - @Override - protected void doLinkedAttributeWrite(StorageSimulatorAgentLink agentLink, AttributeEvent event, Object processedValue) { + updateLinkedAttribute(event.getRef(), processedValue); + } - // Power attribute is updated only by this protocol not by clients - if (event.getName().equals(POWER.getName())) { - return; - } + protected void updateStorageAsset(String assetId) { - updateLinkedAttribute(event.getRef(), processedValue); + Asset asset = assetService.findAsset(assetId); + ElectricityStorageAsset storageAsset = + asset instanceof ElectricityStorageAsset ? (ElectricityStorageAsset) asset : null; + if (storageAsset == null) { + LOG.finest("Storage asset not set so skipping update"); + return; } - protected void updateStorageAsset(String assetId) { - - Asset asset = assetService.findAsset(assetId); - ElectricityStorageAsset storageAsset = asset instanceof ElectricityStorageAsset ? (ElectricityStorageAsset)asset : null; - if (storageAsset == null) { - LOG.finest("Storage asset not set so skipping update"); - return; - } - - Instant now = Instant.now(); - Instant previousTimestamp; - try { - lock.lockInterruptibly(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - try { - previousTimestamp = lastUpdateMap.put(assetId, now); - } finally { - lock.unlock(); - } - - double setpoint = storageAsset.getPowerSetpoint().orElse(0d); - double capacity = storageAsset.getEnergyCapacity().orElse(0d); - double power = storageAsset.getPower().orElse(0d); - double level = storageAsset.getEnergyLevel().orElse(0d); - int minPercentage = storageAsset.getEnergyLevelPercentageMin().orElse(0); - int maxPercentage = storageAsset.getEnergyLevelPercentageMax().orElse(100); - capacity = Math.max(0d, capacity); - level = Math.max(0d, Math.min(capacity, level)); - double maxLevel = (((double) maxPercentage) / 100d) * capacity; - double minLevel = (((double) minPercentage) / 100d) * capacity; - - if (capacity <= 0d) { - LOG.info("Storage asset capacity is 0 so not usable: " + assetId); - level = 0d; - setpoint = 0d; - } - - if (capacity > 0 && power != 0d && previousTimestamp != null) { - - // Calculate energy delta since last execution - Duration duration = Duration.between(previousTimestamp, now); - long seconds = duration.getSeconds(); - - if (seconds > 0) { - - double deltaHours = seconds / 3600d; - double efficiency = power > 0 ? ((double) storageAsset.getEfficiencyImport().orElse(100)) / 100d : (1d / (((double) storageAsset.getEfficiencyExport().orElse(100)) / 100d)); // Export efficiency < 1 means more energy is consumed to produce requested power - double energyDelta = power * deltaHours * efficiency; - double newLevel = Math.max(0d, Math.min(capacity, level + energyDelta)); - energyDelta = newLevel - level; - level = newLevel; - - if (energyDelta > 0) { - updateLinkedAttribute(new AttributeRef(storageAsset.getId(), ElectricityStorageAsset.ENERGY_IMPORT_TOTAL.getName()), storageAsset.getEnergyImportTotal().orElse(0d) + energyDelta); - } else { - updateLinkedAttribute(new AttributeRef(storageAsset.getId(), ElectricityStorageAsset.ENERGY_EXPORT_TOTAL.getName()), storageAsset.getEnergyExportTotal().orElse(0d) - energyDelta); - } - } - } - - power = (setpoint < 0 && level <= minLevel) || (setpoint > 0 && level >= maxLevel) ? 0d : setpoint; - - if (power > 0d && !storageAsset.isSupportsImport().orElse(false)) { - LOG.fine("Setpoint is requesting power import but asset does not support it: " + storageAsset); - power = 0d; - } else if (power < 0d && !storageAsset.isSupportsExport().orElse(false)) { - LOG.fine("Setpoint is requesting power export but asset does not support it: " + storageAsset); - power = 0d; - } - - updateLinkedAttribute(new AttributeRef(assetId, POWER.getName()), power); - updateLinkedAttribute(new AttributeRef(assetId, ENERGY_LEVEL.getName()), level); - updateLinkedAttribute(new AttributeRef(assetId, ENERGY_LEVEL_PERCENTAGE.getName()), capacity <= 0d ? 0 : (int) ((level / capacity) * 100)); + Instant now = Instant.now(); + Instant previousTimestamp; + try { + lock.lockInterruptibly(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; } - - protected ScheduledFuture scheduleUpdate(String assetId) { - return scheduledExecutorService.scheduleAtFixedRate(() -> { - try { - updateStorageAsset(assetId); - } catch (Exception e) { - LOG.log(Level.SEVERE, "Exception in " + getProtocolName(), e); - setConnectionStatus(ConnectionStatus.ERROR); - } - - }, 0, 1, TimeUnit.MINUTES); + try { + previousTimestamp = lastUpdateMap.put(assetId, now); + } finally { + lock.unlock(); } - protected boolean checkLinkedAttributes(String assetId) { - return getLinkedAttributes().containsKey(new AttributeRef(assetId, POWER_SETPOINT.getName())) && - getLinkedAttributes().containsKey(new AttributeRef(assetId, POWER.getName())) && - getLinkedAttributes().containsKey(new AttributeRef(assetId, ENERGY_LEVEL.getName()))&& - getLinkedAttributes().containsKey(new AttributeRef(assetId, ENERGY_LEVEL_PERCENTAGE.getName())); + double setpoint = storageAsset.getPowerSetpoint().orElse(0d); + double capacity = storageAsset.getEnergyCapacity().orElse(0d); + double power = storageAsset.getPower().orElse(0d); + double level = storageAsset.getEnergyLevel().orElse(0d); + int minPercentage = storageAsset.getEnergyLevelPercentageMin().orElse(0); + int maxPercentage = storageAsset.getEnergyLevelPercentageMax().orElse(100); + capacity = Math.max(0d, capacity); + level = Math.max(0d, Math.min(capacity, level)); + double maxLevel = (((double) maxPercentage) / 100d) * capacity; + double minLevel = (((double) minPercentage) / 100d) * capacity; + + if (capacity <= 0d) { + LOG.info("Storage asset capacity is 0 so not usable: " + assetId); + level = 0d; + setpoint = 0d; } - protected boolean isSimulationStarted(String assetId) { - return simulationMap.containsKey(assetId); + if (capacity > 0 && power != 0d && previousTimestamp != null) { + + // Calculate energy delta since last execution + Duration duration = Duration.between(previousTimestamp, now); + long seconds = duration.getSeconds(); + + if (seconds > 0) { + + double deltaHours = seconds / 3600d; + double efficiency = + power > 0 + ? ((double) storageAsset.getEfficiencyImport().orElse(100)) / 100d + : (1d + / (((double) storageAsset.getEfficiencyExport().orElse(100)) + / 100d)); // Export efficiency < 1 means more energy is consumed to produce + // requested power + double energyDelta = power * deltaHours * efficiency; + double newLevel = Math.max(0d, Math.min(capacity, level + energyDelta)); + energyDelta = newLevel - level; + level = newLevel; + + if (energyDelta > 0) { + updateLinkedAttribute( + new AttributeRef( + storageAsset.getId(), ElectricityStorageAsset.ENERGY_IMPORT_TOTAL.getName()), + storageAsset.getEnergyImportTotal().orElse(0d) + energyDelta); + } else { + updateLinkedAttribute( + new AttributeRef( + storageAsset.getId(), ElectricityStorageAsset.ENERGY_EXPORT_TOTAL.getName()), + storageAsset.getEnergyExportTotal().orElse(0d) - energyDelta); + } + } } - protected void startSimulation(String assetId) { - LOG.info("Started storage simulation for asset id: " + assetId); - simulationMap.put(assetId, scheduleUpdate(assetId)); + power = + (setpoint < 0 && level <= minLevel) || (setpoint > 0 && level >= maxLevel) ? 0d : setpoint; + + if (power > 0d && !storageAsset.isSupportsImport().orElse(false)) { + LOG.fine( + "Setpoint is requesting power import but asset does not support it: " + storageAsset); + power = 0d; + } else if (power < 0d && !storageAsset.isSupportsExport().orElse(false)) { + LOG.fine( + "Setpoint is requesting power export but asset does not support it: " + storageAsset); + power = 0d; } - protected void stopSimulation(String assetId) { - if (isSimulationStarted(assetId)) { - lastUpdateMap.remove(assetId); - ScheduledFuture scheduledFuture = simulationMap.remove(assetId); - if (scheduledFuture != null) { - scheduledFuture.cancel(true); - } - } + updateLinkedAttribute(new AttributeRef(assetId, POWER.getName()), power); + updateLinkedAttribute(new AttributeRef(assetId, ENERGY_LEVEL.getName()), level); + updateLinkedAttribute( + new AttributeRef(assetId, ENERGY_LEVEL_PERCENTAGE.getName()), + capacity <= 0d ? 0 : (int) ((level / capacity) * 100)); + } + + protected ScheduledFuture scheduleUpdate(String assetId) { + return scheduledExecutorService.scheduleAtFixedRate( + () -> { + try { + updateStorageAsset(assetId); + } catch (Exception e) { + LOG.log(Level.SEVERE, "Exception in " + getProtocolName(), e); + setConnectionStatus(ConnectionStatus.ERROR); + } + }, + 0, + 1, + TimeUnit.MINUTES); + } + + protected boolean checkLinkedAttributes(String assetId) { + return getLinkedAttributes().containsKey(new AttributeRef(assetId, POWER_SETPOINT.getName())) + && getLinkedAttributes().containsKey(new AttributeRef(assetId, POWER.getName())) + && getLinkedAttributes().containsKey(new AttributeRef(assetId, ENERGY_LEVEL.getName())) + && getLinkedAttributes() + .containsKey(new AttributeRef(assetId, ENERGY_LEVEL_PERCENTAGE.getName())); + } + + protected boolean isSimulationStarted(String assetId) { + return simulationMap.containsKey(assetId); + } + + protected void startSimulation(String assetId) { + LOG.info("Started storage simulation for asset id: " + assetId); + simulationMap.put(assetId, scheduleUpdate(assetId)); + } + + protected void stopSimulation(String assetId) { + if (isSimulationStarted(assetId)) { + lastUpdateMap.remove(assetId); + ScheduledFuture scheduledFuture = simulationMap.remove(assetId); + if (scheduledFuture != null) { + scheduledFuture.cancel(true); + } } + } } diff --git a/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationAssetTest.groovy b/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationAssetTest.groovy index 55c41d9..d7edb6d 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationAssetTest.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationAssetTest.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import com.google.common.collect.Lists diff --git a/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationTest.groovy b/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationTest.groovy index 899800e..2389cf0 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationTest.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/EnergyOptimisationTest.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import org.openremote.extension.energy.manager.EnergyOptimiser diff --git a/energy/src/test/groovy/org/openremote/extension/energy/ForecastSolarServiceTest.groovy b/energy/src/test/groovy/org/openremote/extension/energy/ForecastSolarServiceTest.groovy index 74077dd..ecd17b8 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/ForecastSolarServiceTest.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/ForecastSolarServiceTest.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import org.openremote.container.web.WebTargetBuilder diff --git a/energy/src/test/groovy/org/openremote/extension/energy/ForecastWindServiceTest.groovy b/energy/src/test/groovy/org/openremote/extension/energy/ForecastWindServiceTest.groovy index fd4ec0c..62690f6 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/ForecastWindServiceTest.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/ForecastWindServiceTest.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import jakarta.ws.rs.client.ClientRequestContext diff --git a/energy/src/test/groovy/org/openremote/extension/energy/KeycloakTestSetup.groovy b/energy/src/test/groovy/org/openremote/extension/energy/KeycloakTestSetup.groovy index 2f94b58..db360c1 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/KeycloakTestSetup.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/KeycloakTestSetup.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import org.openremote.manager.setup.AbstractKeycloakSetup diff --git a/energy/src/test/groovy/org/openremote/extension/energy/ManagerTestSetup.groovy b/energy/src/test/groovy/org/openremote/extension/energy/ManagerTestSetup.groovy index c083bda..818cb62 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/ManagerTestSetup.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/ManagerTestSetup.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import static org.openremote.model.value.MetaItemType.* diff --git a/energy/src/test/groovy/org/openremote/extension/energy/TestSetupTasks.groovy b/energy/src/test/groovy/org/openremote/extension/energy/TestSetupTasks.groovy index da8e1de..29e3d99 100644 --- a/energy/src/test/groovy/org/openremote/extension/energy/TestSetupTasks.groovy +++ b/energy/src/test/groovy/org/openremote/extension/energy/TestSetupTasks.groovy @@ -1,3 +1,21 @@ +/* + * Copyright 2026, OpenRemote Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ package org.openremote.extension.energy import org.openremote.model.Container diff --git a/entsoe/README.md b/entsoe/README.md index 9e1dcb3..8ae49b0 100644 --- a/entsoe/README.md +++ b/entsoe/README.md @@ -2,7 +2,7 @@ ## Introduction -[ENTSO-E](https://www.entsoe.eu/data/transparency-platform/) is a European transparency platform for the energy market that provides +[ENTSO-E](https://www.entsoe.eu/data/transparency-platform/) is a European transparency platform for the energy market that provides a large collection of energy related data. This agent uses their [REST API](https://documenter.getpostman.com/view/7009892/2s93JtP3F6#3b383df0-ada2-49fe-9a50-98b1bb201c6b) to retrieve the `Energy Prices` (document type A44) data. @@ -17,8 +17,8 @@ To do so, follow the process described at [How to get security token? – Transp ### ENTSO-E Agent To get access to the data, add an ENTSO-E agent to your configuration. -On the agent, fill-in the `Security token` attribute with the token you got from ENTSO-E (see [Prerequisites](#prerequisites) above). -You can optionally add the `Polling millis` attribute to set the polling frequency. It defaults to 1h. +On the agent, fill-in the `Security token` attribute with the token you got from ENTSO-E (see [Prerequisites](#prerequisites) above). +You can optionally add the `Polling millis` attribute to set the polling frequency. It defaults to 1h. ### Getting the data diff --git a/entsoe/build.gradle b/entsoe/build.gradle index ffed810..f18562e 100644 --- a/entsoe/build.gradle +++ b/entsoe/build.gradle @@ -1,88 +1,88 @@ plugins { - id 'groovy' - id 'java-library' - id 'maven-publish' - id 'signing' + id 'groovy' + id 'java-library' + id 'maven-publish' + id 'signing' } base { - archivesName = "openremote-${project.name}-extension" + archivesName = "openremote-${project.name}-extension" } dependencies { - api libs.openremote.manager - api libs.openremote.model + api libs.openremote.manager + api libs.openremote.model - api libs.resteasyClientApi - api libs.resteasyJaxbProvider - testImplementation libs.openremote.test + api libs.resteasyClientApi + api libs.resteasyJaxbProvider + testImplementation libs.openremote.test } jar { - from sourceSets.main.allJava + from sourceSets.main.allJava } javadoc { - failOnError = false + failOnError = false } java { - withJavadocJar() - withSourcesJar() + withJavadocJar() + withSourcesJar() } publishing { - publications { - maven(MavenPublication) { - group = "io.openremote.extension" - artifactId = "openremote-${project.name}-extension" - from components.java - pom { - name = 'OpenRemote ENTSO-E extension' - description = 'Adds the ENTSO-E extension' - url = 'https://github.com/openremote/extensions' - licenses { - license { - name = 'GNU Affero General Public License v3.0' - url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' - } - } - developers { - developer { - id = 'developers' - name = 'Developers' - email = 'developers@openremote.io' - organization = 'OpenRemote' - organizationUrl = 'https://openremote.io' - } - } - scm { - connection = 'scm:git:git://github.com/openremote/extensions.git' - developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' - url = 'https://github.com/openremote/extensions/tree/main' - } - } + publications { + maven(MavenPublication) { + group = "io.openremote.extension" + artifactId = "openremote-${project.name}-extension" + from components.java + pom { + name = 'OpenRemote ENTSO-E extension' + description = 'Adds the ENTSO-E extension' + url = 'https://github.com/openremote/extensions' + licenses { + license { + name = 'GNU Affero General Public License v3.0' + url = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + } } + developers { + developer { + id = 'developers' + name = 'Developers' + email = 'developers@openremote.io' + organization = 'OpenRemote' + organizationUrl = 'https://openremote.io' + } + } + scm { + connection = 'scm:git:git://github.com/openremote/extensions.git' + developerConnection = 'scm:git:ssh://github.com:openremote/extensions.git' + url = 'https://github.com/openremote/extensions/tree/main' + } + } } + } - repositories { - maven { - if (!version.endsWith('-LOCAL')) { - credentials { - username = findProperty("publishUsername") - password = findProperty("publishPassword") - } - } - url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") + repositories { + maven { + if (!version.endsWith('-LOCAL')) { + credentials { + username = findProperty("publishUsername") + password = findProperty("publishPassword") } + } + url = version.endsWith('-LOCAL') ? layout.buildDirectory.dir('repo') : version.endsWith('-SNAPSHOT') ? findProperty("snapshotsRepoUrl") : findProperty("releasesRepoUrl") } + } } signing { - def signingKey = findProperty("signingKey") - def signingPassword = findProperty("signingPassword") - if (signingKey && signingPassword) { - useInMemoryPgpKeys(signingKey, signingPassword) - sign publishing.publications.maven - } + def signingKey = findProperty("signingKey") + def signingPassword = findProperty("signingPassword") + if (signingKey && signingPassword) { + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.maven + } } diff --git a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgent.java b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgent.java index b763253..07bf72d 100644 --- a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgent.java +++ b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgent.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,55 +12,57 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol; import jakarta.persistence.Entity; +import java.util.Optional; import org.openremote.model.asset.agent.Agent; import org.openremote.model.asset.agent.AgentDescriptor; import org.openremote.model.value.AttributeDescriptor; import org.openremote.model.value.ValueType; -import java.util.Optional; - @Entity public class EntsoeAgent extends Agent { - public static final AgentDescriptor DESCRIPTOR = new AgentDescriptor<>( - EntsoeAgent.class, EntsoeProtocol.class, EntsoeAgentLink.class); + public static final AgentDescriptor DESCRIPTOR = + new AgentDescriptor<>(EntsoeAgent.class, EntsoeProtocol.class, EntsoeAgentLink.class); - public static final AttributeDescriptor SECURITY_TOKEN = new AttributeDescriptor<>("securityToken", ValueType.TEXT); + public static final AttributeDescriptor SECURITY_TOKEN = + new AttributeDescriptor<>("securityToken", ValueType.TEXT); - public static final AttributeDescriptor BASE_URL = new AttributeDescriptor<>("baseURL", ValueType.TEXT).withOptional(true); + public static final AttributeDescriptor BASE_URL = + new AttributeDescriptor<>("baseURL", ValueType.TEXT).withOptional(true); - public EntsoeAgent() { - } + public EntsoeAgent() {} - public EntsoeAgent(String name) { - super(name); - } + public EntsoeAgent(String name) { + super(name); + } - @Override - public EntsoeProtocol getProtocolInstance() { - return new EntsoeProtocol(this); - } + @Override + public EntsoeProtocol getProtocolInstance() { + return new EntsoeProtocol(this); + } - public Optional getSecurityToken() { - return getAttributes().getValue(SECURITY_TOKEN); - } + public Optional getSecurityToken() { + return getAttributes().getValue(SECURITY_TOKEN); + } - public EntsoeAgent setSecurityToken(String value) { - getAttributes().getOrCreate(SECURITY_TOKEN).setValue(value); - return this; - } + public EntsoeAgent setSecurityToken(String value) { + getAttributes().getOrCreate(SECURITY_TOKEN).setValue(value); + return this; + } - public Optional getBaseURL() { - return getAttributes().getValue(BASE_URL); - } + public Optional getBaseURL() { + return getAttributes().getValue(BASE_URL); + } - public EntsoeAgent setBaseURL(String value) { - getAttributes().getOrCreate(BASE_URL).setValue(value); - return this; - } + public EntsoeAgent setBaseURL(String value) { + getAttributes().getOrCreate(BASE_URL).setValue(value); + return this; + } } diff --git a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentLink.java b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentLink.java index 32ff175..f490a94 100644 --- a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentLink.java +++ b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentLink.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol; @@ -26,25 +25,22 @@ public class EntsoeAgentLink extends AgentLink { - @NotNull - @JsonPropertyDescription("Energy Identification Code of zone to fetch data for") - @Pattern(regexp = "^\\d{2}[A-Z][A-Z0-9-]{12}[A-Z0-9]$") - private String zone; + @NotNull @JsonPropertyDescription("Energy Identification Code of zone to fetch data for") + @Pattern(regexp = "^\\d{2}[A-Z][A-Z0-9-]{12}[A-Z0-9]$") private String zone; - // For Hydrators - public EntsoeAgentLink() { - } + // For Hydrators + public EntsoeAgentLink() {} - public EntsoeAgentLink(String id) { - super(id); - } + public EntsoeAgentLink(String id) { + super(id); + } - public String getZone() { - return zone; - } + public String getZone() { + return zone; + } - public EntsoeAgentLink setZone(String zone) { - this.zone = zone; - return this; - } + public EntsoeAgentLink setZone(String zone) { + this.zone = zone; + return this; + } } diff --git a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentModelProvider.java b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentModelProvider.java index a6d3c7d..9a9f800 100644 --- a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentModelProvider.java +++ b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeAgentModelProvider.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol; @@ -23,8 +22,8 @@ public class EntsoeAgentModelProvider implements AssetModelProvider { - @Override - public boolean useAutoScan() { - return true; - } + @Override + public boolean useAutoScan() { + return true; + } } diff --git a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocol.java b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocol.java index 5b41433..ebd43ed 100644 --- a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocol.java +++ b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocol.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,27 +12,19 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol; +import static org.openremote.container.web.WebTargetBuilder.createClient; +import static org.openremote.model.syslog.SyslogCategory.PROTOCOL; + import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.UriBuilder; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.Unmarshaller; -import org.jboss.resteasy.client.jaxrs.ResteasyClient; -import org.openremote.agent.protocol.AbstractProtocol; -import org.openremote.model.Container; -import org.openremote.model.asset.agent.ConnectionStatus; -import org.openremote.model.attribute.Attribute; -import org.openremote.model.attribute.AttributeEvent; -import org.openremote.model.attribute.AttributeRef; -import org.openremote.model.datapoint.ValueDatapoint; -import org.openremote.model.syslog.SyslogCategory; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamReader; import java.io.StringReader; import java.math.BigDecimal; import java.time.Duration; @@ -55,406 +44,470 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; - -import static org.openremote.container.web.WebTargetBuilder.createClient; -import static org.openremote.model.syslog.SyslogCategory.PROTOCOL; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamReader; +import org.jboss.resteasy.client.jaxrs.ResteasyClient; +import org.openremote.agent.protocol.AbstractProtocol; +import org.openremote.model.Container; +import org.openremote.model.asset.agent.ConnectionStatus; +import org.openremote.model.attribute.Attribute; +import org.openremote.model.attribute.AttributeEvent; +import org.openremote.model.attribute.AttributeRef; +import org.openremote.model.datapoint.ValueDatapoint; +import org.openremote.model.syslog.SyslogCategory; public class EntsoeProtocol extends AbstractProtocol { - private static final Logger LOG = SyslogCategory.getLogger(PROTOCOL, EntsoeProtocol.class); - private static final DateTimeFormatter PERIOD_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmm").withZone(ZoneId.of("UTC")); - private static final DateTimeFormatter ENTSOE_DATETIME_FORMATTER = new DateTimeFormatterBuilder() - .appendPattern("yyyy-MM-dd'T'HH:mm") - .optionalStart().appendPattern(":ss").optionalEnd() - .appendOffsetId() - .toFormatter(); - public static final String PROTOCOL_DISPLAY_NAME = "ENTSO-E"; - private static final AtomicReference client = new AtomicReference<>(); - private static final JAXBContext PUBLICATION_MARKET_DOCUMENT_CONTEXT = createPublicationMarketDocumentContext(); - private static final ThreadLocal PUBLICATION_UNMARSHALLER = ThreadLocal.withInitial(EntsoeProtocol::createPublicationUnmarshaller); - private static final ThreadLocal XML_INPUT_FACTORY = ThreadLocal.withInitial(EntsoeProtocol::createSecureXmlInputFactory); - - // Initial delay to allow system to populate agent links - private static final int INITIAL_POLLING_DELAY_MILLIS = 3000; // 3 seconds - private static final int DEFAULT_POLLING_MILLIS = 3600000; // 1 hour - - protected ScheduledFuture pollingFuture; - - public EntsoeProtocol(EntsoeAgent agent) { - super(agent); - initClient(); + private static final Logger LOG = SyslogCategory.getLogger(PROTOCOL, EntsoeProtocol.class); + private static final DateTimeFormatter PERIOD_FORMATTER = + DateTimeFormatter.ofPattern("yyyyMMddHHmm").withZone(ZoneId.of("UTC")); + private static final DateTimeFormatter ENTSOE_DATETIME_FORMATTER = + new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd'T'HH:mm") + .optionalStart() + .appendPattern(":ss") + .optionalEnd() + .appendOffsetId() + .toFormatter(); + public static final String PROTOCOL_DISPLAY_NAME = "ENTSO-E"; + private static final AtomicReference client = new AtomicReference<>(); + private static final JAXBContext PUBLICATION_MARKET_DOCUMENT_CONTEXT = + createPublicationMarketDocumentContext(); + private static final ThreadLocal PUBLICATION_UNMARSHALLER = + ThreadLocal.withInitial(EntsoeProtocol::createPublicationUnmarshaller); + private static final ThreadLocal XML_INPUT_FACTORY = + ThreadLocal.withInitial(EntsoeProtocol::createSecureXmlInputFactory); + + // Initial delay to allow system to populate agent links + private static final int INITIAL_POLLING_DELAY_MILLIS = 3000; // 3 seconds + private static final int DEFAULT_POLLING_MILLIS = 3600000; // 1 hour + + protected ScheduledFuture pollingFuture; + + public EntsoeProtocol(EntsoeAgent agent) { + super(agent); + initClient(); + } + + @Override + protected void doStart(Container container) throws Exception { + setConnectionStatus(ConnectionStatus.CONNECTING); + + if (agent.getSecurityToken().isEmpty()) { + setConnectionStatus(ConnectionStatus.ERROR); + LOG.warning("Security token is not set"); + return; } - @Override - protected void doStart(Container container) throws Exception { - setConnectionStatus(ConnectionStatus.CONNECTING); - - if (agent.getSecurityToken().isEmpty()) { - setConnectionStatus(ConnectionStatus.ERROR); - LOG.warning("Security token is not set"); - return; - } - - if (!healthCheck()) { - setConnectionStatus(ConnectionStatus.ERROR); - LOG.warning("Could not reach ENTSO-E API, either API is unavailable or security token is invalid"); - return; - } - - restartPollingWithInitialDelay(); - - setConnectionStatus(ConnectionStatus.CONNECTED); + if (!healthCheck()) { + setConnectionStatus(ConnectionStatus.ERROR); + LOG.warning( + "Could not reach ENTSO-E API, either API is unavailable or security token is invalid"); + return; } - @Override - protected void doStop(Container container) throws Exception { - // Cancel the polling task - if (pollingFuture != null) { - pollingFuture.cancel(true); - } - } + restartPollingWithInitialDelay(); - @Override - protected void doLinkAttribute(String assetId, Attribute attribute, EntsoeAgentLink agentLink) throws RuntimeException { - if (!attribute.getType().getType().isAssignableFrom(BigDecimal.class) && !attribute.getType().getType().isAssignableFrom(Double.class)) { - LOG.warning("Linked attribute " + attribute.getName() + " of asset " + assetId + " not of supported type. Predicted data points will still be generated but inconsistent behaviour could occur."); - } - restartPollingWithInitialDelay(); - } + setConnectionStatus(ConnectionStatus.CONNECTED); + } - @Override - protected void doUnlinkAttribute(String assetId, Attribute attribute, EntsoeAgentLink agentLink) { - // Do nothing, attributes that have been unlinked will not be processed anymore when we next trigger + @Override + protected void doStop(Container container) throws Exception { + // Cancel the polling task + if (pollingFuture != null) { + pollingFuture.cancel(true); } - - protected synchronized void restartPollingWithInitialDelay() { - if (scheduledExecutorService == null) { - return; - } - - if (pollingFuture != null) { - pollingFuture.cancel(false); - } - - int pollingMillis = agent.getPollingMillis().orElse(DEFAULT_POLLING_MILLIS); - pollingFuture = scheduledExecutorService.scheduleAtFixedRate( - this::runScheduledUpdate, - INITIAL_POLLING_DELAY_MILLIS, - pollingMillis, - TimeUnit.MILLISECONDS - ); + } + + @Override + protected void doLinkAttribute(String assetId, Attribute attribute, EntsoeAgentLink agentLink) + throws RuntimeException { + if (!attribute.getType().getType().isAssignableFrom(BigDecimal.class) + && !attribute.getType().getType().isAssignableFrom(Double.class)) { + LOG.warning( + "Linked attribute " + + attribute.getName() + + " of asset " + + assetId + + " not of supported type. Predicted data points will still be generated but inconsistent behaviour could occur."); } - - protected void runScheduledUpdate() { - try { - updateAllLinkedAttributes(); - } catch (RuntimeException e) { - LOG.log(Level.WARNING, e, () -> "Scheduled ENTSO-E polling failed; keeping schedule active"); - } + restartPollingWithInitialDelay(); + } + + @Override + protected void doUnlinkAttribute( + String assetId, Attribute attribute, EntsoeAgentLink agentLink) { + // Do nothing, attributes that have been unlinked will not be processed anymore when we next + // trigger + } + + protected synchronized void restartPollingWithInitialDelay() { + if (scheduledExecutorService == null) { + return; } - @Override - protected void doLinkedAttributeWrite(EntsoeAgentLink agentLink, AttributeEvent event, Object processedValue) { - // If some external source wants to write the current value of the attribute, we're OK with that - // and relay the event with AgentService as source so it goes through. - assetService.sendAttributeEvent(event); + if (pollingFuture != null) { + pollingFuture.cancel(false); } - @Override - public String getProtocolName() { - return PROTOCOL_DISPLAY_NAME; + int pollingMillis = agent.getPollingMillis().orElse(DEFAULT_POLLING_MILLIS); + pollingFuture = + scheduledExecutorService.scheduleAtFixedRate( + this::runScheduledUpdate, + INITIAL_POLLING_DELAY_MILLIS, + pollingMillis, + TimeUnit.MILLISECONDS); + } + + protected void runScheduledUpdate() { + try { + updateAllLinkedAttributes(); + } catch (RuntimeException e) { + LOG.log(Level.WARNING, e, () -> "Scheduled ENTSO-E polling failed; keeping schedule active"); } - - @Override - public String getProtocolInstanceUri() { - return "https://transparency.entsoe.eu/"; + } + + @Override + protected void doLinkedAttributeWrite( + EntsoeAgentLink agentLink, AttributeEvent event, Object processedValue) { + // If some external source wants to write the current value of the attribute, we're OK with that + // and relay the event with AgentService as source so it goes through. + assetService.sendAttributeEvent(event); + } + + @Override + public String getProtocolName() { + return PROTOCOL_DISPLAY_NAME; + } + + @Override + public String getProtocolInstanceUri() { + return "https://transparency.entsoe.eu/"; + } + + protected void updateAllLinkedAttributes() { + LOG.fine("Updating all linked attributes with pricing information from ENTSO-E"); + + if (getLinkedAttributes().isEmpty()) { + LOG.fine("No linked attributes found, skipping pricing data update"); + return; } - protected void updateAllLinkedAttributes() { - LOG.fine("Updating all linked attributes with pricing information from ENTSO-E"); + Map>> attributesByZone = + collectLinkedAttributesByZone(); - if (getLinkedAttributes().isEmpty()) { - LOG.fine("No linked attributes found, skipping pricing data update"); - return; - } - - Map>> attributesByZone = collectLinkedAttributesByZone(); - - attributesByZone.forEach((zone, linkedAttributesForZone) -> { - PublicationMarketDocument document = fetchPricingInformation(buildApiUrl(zone)); - applyPricingInformation(zone, document, linkedAttributesForZone); + attributesByZone.forEach( + (zone, linkedAttributesForZone) -> { + PublicationMarketDocument document = fetchPricingInformation(buildApiUrl(zone)); + applyPricingInformation(zone, document, linkedAttributesForZone); }); + } + + protected Map>> collectLinkedAttributesByZone() { + Map>> attributesByZone = new LinkedHashMap<>(); + + getLinkedAttributes() + .forEach( + (attributeRef, attribute) -> { + EntsoeAgentLink agentLink = agent.getAgentLink(attribute); + attributesByZone + .computeIfAbsent(agentLink.getZone(), ignored -> new ArrayList<>()) + .add(Map.entry(attributeRef, attribute)); + }); + + return attributesByZone; + } + + protected void applyPricingInformation( + String zone, + PublicationMarketDocument document, + List> linkedAttributesForZone) { + if (document == null) { + linkedAttributesForZone.forEach( + entry -> + LOG.warning( + () -> + "No ENTSO-E publication document returned for attribute: " + + entry.getKey() + + " in zone: " + + zone)); + return; } - protected Map>> collectLinkedAttributesByZone() { - Map>> attributesByZone = new LinkedHashMap<>(); + List> predictedDatapoints = buildPredictedDatapoints(document); + if (predictedDatapoints.isEmpty()) { + linkedAttributesForZone.forEach( + entry -> + LOG.warning( + () -> + "No datapoints built from ENTSO-E publication document for attribute: " + + entry.getKey() + + " in zone: " + + zone)); + return; + } - getLinkedAttributes().forEach((attributeRef, attribute) -> { - EntsoeAgentLink agentLink = agent.getAgentLink(attribute); - attributesByZone.computeIfAbsent(agentLink.getZone(), ignored -> new ArrayList<>()) - .add(Map.entry(attributeRef, attribute)); + linkedAttributesForZone.forEach( + entry -> { + AttributeRef attributeRef = entry.getKey(); + Attribute attribute = entry.getValue(); + LOG.fine("Updating pricing information data for attribute " + attribute.getName()); + predictedDatapointService.updateValues( + attributeRef.getId(), attributeRef.getName(), predictedDatapoints); }); - - return attributesByZone; + } + + protected String buildApiUrl(String zone) { + String securityToken = + agent + .getSecurityToken() + .orElseThrow(() -> new IllegalStateException("Security token is not set")); + String baseUrl = agent.getBaseURL().orElse("https://web-api.tp.entsoe.eu/api"); + Instant start = timerService.getNow(); + Instant end = start.plus(1, ChronoUnit.DAYS); + + return UriBuilder.fromUri(baseUrl) + .queryParam("documentType", "A44") + .queryParam("contract_MarketAgreement.type", "A01") + .queryParam("periodStart", PERIOD_FORMATTER.format(start)) + .queryParam("periodEnd", PERIOD_FORMATTER.format(end)) + .queryParam("in_Domain", zone) + .queryParam("out_Domain", zone) + .queryParam("securityToken", securityToken) + .build() + .toString(); + } + + /** + * Perform a health check by sending a request to the ENTSO-E API + * + * @return true if the health check is successful, false otherwise + */ + protected boolean healthCheck() { + String apiUrl = buildApiUrl("10YBE----------2"); + try (Response response = + client.get().target(apiUrl).request(jakarta.ws.rs.core.MediaType.APPLICATION_XML).get()) { + if (response.getStatus() != 200) { + LOG.warning("Health check failed with status: " + response.getStatus()); + return false; + } else { + return true; + } + } catch (Exception e) { + LOG.log(Level.WARNING, e, () -> "Failed to perform health check"); + return false; } - - protected void applyPricingInformation(String zone, PublicationMarketDocument document, List> linkedAttributesForZone) { - if (document == null) { - linkedAttributesForZone.forEach(entry -> - LOG.warning(() -> "No ENTSO-E publication document returned for attribute: " + entry.getKey() + " in zone: " + zone)); - return; + } + + /** + * Fetch the pricing data from the ENTSO-E API for the given API URL + * + * @param apiUrl the API URL + * @return the PublicationMarketDocument from the API + */ + protected PublicationMarketDocument fetchPricingInformation(String apiUrl) { + try (Response response = + client.get().target(apiUrl).request(javax.ws.rs.core.MediaType.APPLICATION_XML).get()) { + if (response.getStatus() == 200) { + String responseXml = response.readEntity(String.class); + EntsoeXmlMeta xmlMeta = parseEntsoeXmlMeta(responseXml); + + if ("Publication_MarketDocument".equals(xmlMeta.rootElement)) { + return unmarshalPublicationMarketDocument(responseXml); } - List> predictedDatapoints = buildPredictedDatapoints(document); - if (predictedDatapoints.isEmpty()) { - linkedAttributesForZone.forEach(entry -> - LOG.warning(() -> "No datapoints built from ENTSO-E publication document for attribute: " + entry.getKey() + " in zone: " + zone)); - return; + if ("Acknowledgement_MarketDocument".equals(xmlMeta.rootElement)) { + String reason = xmlMeta.reasonText != null ? xmlMeta.reasonText : "no reason provided"; + LOG.info("No ENTSO-E pricing data available: " + reason); + return null; } - linkedAttributesForZone.forEach(entry -> { - AttributeRef attributeRef = entry.getKey(); - Attribute attribute = entry.getValue(); - LOG.fine("Updating pricing information data for attribute " + attribute.getName()); - predictedDatapointService.updateValues(attributeRef.getId(), attributeRef.getName(), predictedDatapoints); - }); + LOG.warning("Unsupported ENTSO-E response XML root element: " + xmlMeta.rootElement); + return null; + } else if (response.getStatus() == 401) { + LOG.warning( + "API request was unauthorized, either the security token is invalid or does not provide access to the API"); + return null; + } else { + LOG.warning("API request failed with status: " + response.getStatus()); + return null; + } + } catch (Exception e) { + LOG.log(Level.WARNING, e, () -> "Failed to fetch pricing data"); + return null; } - - protected String buildApiUrl(String zone) { - String securityToken = agent.getSecurityToken().orElseThrow(() -> new IllegalStateException("Security token is not set")); - String baseUrl = agent.getBaseURL().orElse("https://web-api.tp.entsoe.eu/api"); - Instant start = timerService.getNow(); - Instant end = start.plus(1, ChronoUnit.DAYS); - - return UriBuilder.fromUri(baseUrl) - .queryParam("documentType", "A44") - .queryParam("contract_MarketAgreement.type", "A01") - .queryParam("periodStart", PERIOD_FORMATTER.format(start)) - .queryParam("periodEnd", PERIOD_FORMATTER.format(end)) - .queryParam("in_Domain", zone) - .queryParam("out_Domain", zone) - .queryParam("securityToken", securityToken) - .build() - .toString(); + } + + protected static XMLInputFactory createSecureXmlInputFactory() { + try { + XMLInputFactory factory = XMLInputFactory.newFactory(); + factory.setProperty(XMLInputFactory.SUPPORT_DTD, false); + factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); + factory.setXMLResolver((publicId, systemId, baseUri, namespace) -> null); + return factory; + } catch (Exception e) { + throw new IllegalStateException("Failed to initialise secure XMLInputFactory", e); } - - /** - * Perform a health check by sending a request to the ENTSO-E API - * - * @return true if the health check is successful, false otherwise - */ - protected boolean healthCheck() { - String apiUrl = buildApiUrl("10YBE----------2"); - try (Response response = client.get().target(apiUrl).request(jakarta.ws.rs.core.MediaType.APPLICATION_XML).get()) { - if (response.getStatus() != 200) { - LOG.warning("Health check failed with status: " + response.getStatus()); - return false; - } else { - return true; - } - } catch (Exception e) { - LOG.log(Level.WARNING, e, () -> "Failed to perform health check"); - return false; - } + } + + protected static JAXBContext createPublicationMarketDocumentContext() { + try { + return JAXBContext.newInstance(PublicationMarketDocument.class); + } catch (Exception e) { + throw new IllegalStateException( + "Failed to initialise PublicationMarketDocument JAXB context", e); } - - /** - * Fetch the pricing data from the ENTSO-E API for the given API URL - * - * @param apiUrl the API URL - * @return the PublicationMarketDocument from the API - */ - protected PublicationMarketDocument fetchPricingInformation(String apiUrl) { - try (Response response = client.get().target(apiUrl).request(javax.ws.rs.core.MediaType.APPLICATION_XML).get()) { - if (response.getStatus() == 200) { - String responseXml = response.readEntity(String.class); - EntsoeXmlMeta xmlMeta = parseEntsoeXmlMeta(responseXml); - - if ("Publication_MarketDocument".equals(xmlMeta.rootElement)) { - return unmarshalPublicationMarketDocument(responseXml); - } - - if ("Acknowledgement_MarketDocument".equals(xmlMeta.rootElement)) { - String reason = xmlMeta.reasonText != null ? xmlMeta.reasonText : "no reason provided"; - LOG.info("No ENTSO-E pricing data available: " + reason); - return null; - } - - LOG.warning("Unsupported ENTSO-E response XML root element: " + xmlMeta.rootElement); - return null; - } else if (response.getStatus() == 401) { - LOG.warning("API request was unauthorized, either the security token is invalid or does not provide access to the API"); - return null; - } else { - LOG.warning("API request failed with status: " + response.getStatus()); - return null; - } - } catch (Exception e) { - LOG.log(Level.WARNING, e, () -> "Failed to fetch pricing data"); - return null; - } - } - - protected static XMLInputFactory createSecureXmlInputFactory() { - try { - XMLInputFactory factory = XMLInputFactory.newFactory(); - factory.setProperty(XMLInputFactory.SUPPORT_DTD, false); - factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); - factory.setXMLResolver((publicId, systemId, baseUri, namespace) -> null); - return factory; - } catch (Exception e) { - throw new IllegalStateException("Failed to initialise secure XMLInputFactory", e); - } + } + + protected static Unmarshaller createPublicationUnmarshaller() { + try { + return PUBLICATION_MARKET_DOCUMENT_CONTEXT.createUnmarshaller(); + } catch (Exception e) { + throw new IllegalStateException( + "Failed to initialise PublicationMarketDocument unmarshaller", e); } - - protected static JAXBContext createPublicationMarketDocumentContext() { - try { - return JAXBContext.newInstance(PublicationMarketDocument.class); - } catch (Exception e) { - throw new IllegalStateException("Failed to initialise PublicationMarketDocument JAXB context", e); - } + } + + protected PublicationMarketDocument unmarshalPublicationMarketDocument(String xml) + throws Exception { + XMLStreamReader reader = XML_INPUT_FACTORY.get().createXMLStreamReader(new StringReader(xml)); + try { + return (PublicationMarketDocument) PUBLICATION_UNMARSHALLER.get().unmarshal(reader); + } finally { + reader.close(); } - - protected static Unmarshaller createPublicationUnmarshaller() { - try { - return PUBLICATION_MARKET_DOCUMENT_CONTEXT.createUnmarshaller(); - } catch (Exception e) { - throw new IllegalStateException("Failed to initialise PublicationMarketDocument unmarshaller", e); + } + + protected EntsoeXmlMeta parseEntsoeXmlMeta(String xml) throws Exception { + XMLStreamReader reader = XML_INPUT_FACTORY.get().createXMLStreamReader(new StringReader(xml)); + String rootElement = null; + StringBuilder reasonTextBuilder = new StringBuilder(); + boolean inReason = false; + boolean inReasonText = false; + + try { + while (reader.hasNext()) { + int event = reader.next(); + + if (event == XMLStreamConstants.START_ELEMENT) { + String localName = reader.getLocalName(); + if (rootElement == null) { + rootElement = localName; + } + if ("Reason".equals(localName)) { + inReason = true; + } else if (inReason && "text".equals(localName)) { + inReasonText = true; + } + } else if (event == XMLStreamConstants.CHARACTERS && inReasonText) { + String text = reader.getText(); + if (text != null) { + reasonTextBuilder.append(text); + } + } else if (event == XMLStreamConstants.END_ELEMENT) { + String localName = reader.getLocalName(); + if ("text".equals(localName)) { + inReasonText = false; + } else if ("Reason".equals(localName)) { + inReason = false; + } } + } + } finally { + reader.close(); } - protected PublicationMarketDocument unmarshalPublicationMarketDocument(String xml) throws Exception { - XMLStreamReader reader = XML_INPUT_FACTORY.get().createXMLStreamReader(new StringReader(xml)); - try { - return (PublicationMarketDocument) PUBLICATION_UNMARSHALLER.get().unmarshal(reader); - } finally { - reader.close(); - } + String reasonText = reasonTextBuilder.toString().replaceAll("\\s+", " ").trim(); + if (reasonText.isEmpty()) { + reasonText = null; } - protected EntsoeXmlMeta parseEntsoeXmlMeta(String xml) throws Exception { - XMLStreamReader reader = XML_INPUT_FACTORY.get().createXMLStreamReader(new StringReader(xml)); - String rootElement = null; - StringBuilder reasonTextBuilder = new StringBuilder(); - boolean inReason = false; - boolean inReasonText = false; + return new EntsoeXmlMeta(rootElement, reasonText); + } - try { - while (reader.hasNext()) { - int event = reader.next(); - - if (event == XMLStreamConstants.START_ELEMENT) { - String localName = reader.getLocalName(); - if (rootElement == null) { - rootElement = localName; - } - if ("Reason".equals(localName)) { - inReason = true; - } else if (inReason && "text".equals(localName)) { - inReasonText = true; - } - } else if (event == XMLStreamConstants.CHARACTERS && inReasonText) { - String text = reader.getText(); - if (text != null) { - reasonTextBuilder.append(text); - } - } else if (event == XMLStreamConstants.END_ELEMENT) { - String localName = reader.getLocalName(); - if ("text".equals(localName)) { - inReasonText = false; - } else if ("Reason".equals(localName)) { - inReason = false; - } - } - } - } finally { - reader.close(); - } + protected static class EntsoeXmlMeta { + protected final String rootElement; + protected final String reasonText; - String reasonText = reasonTextBuilder.toString().replaceAll("\\s+", " ").trim(); - if (reasonText.isEmpty()) { - reasonText = null; - } + protected EntsoeXmlMeta(String rootElement, String reasonText) { + this.rootElement = rootElement; + this.reasonText = reasonText; + } + } - return new EntsoeXmlMeta(rootElement, reasonText); + protected List> buildPredictedDatapoints(PublicationMarketDocument document) { + List> values = new ArrayList<>(); + long nowMillis = timerService.getCurrentTimeMillis(); + if (document.getTimeSeries() == null || document.getTimeSeries().isEmpty()) { + return values; } - protected static class EntsoeXmlMeta { - protected final String rootElement; - protected final String reasonText; + for (PublicationMarketDocument.TimeSeries timeSeries : document.getTimeSeries()) { + if (timeSeries.getPeriods() == null || timeSeries.getPeriods().isEmpty()) { + continue; + } - protected EntsoeXmlMeta(String rootElement, String reasonText) { - this.rootElement = rootElement; - this.reasonText = reasonText; + for (PublicationMarketDocument.Period period : timeSeries.getPeriods()) { + if (period == null || period.getPoints() == null || period.getPoints().isEmpty()) { + continue; } - } - protected List> buildPredictedDatapoints(PublicationMarketDocument document) { - List> values = new ArrayList<>(); - long nowMillis = timerService.getCurrentTimeMillis(); - if (document.getTimeSeries() == null || document.getTimeSeries().isEmpty()) { - return values; + PublicationMarketDocument.PeriodTimeInterval timeInterval = + period.getTimeInterval() != null + ? period.getTimeInterval() + : document.getPeriodTimeInterval(); + if (timeInterval == null + || timeInterval.getStart() == null + || period.getResolution() == null) { + continue; } - for (PublicationMarketDocument.TimeSeries timeSeries : document.getTimeSeries()) { - if (timeSeries.getPeriods() == null || timeSeries.getPeriods().isEmpty()) { - continue; - } - - for (PublicationMarketDocument.Period period : timeSeries.getPeriods()) { - if (period == null || period.getPoints() == null || period.getPoints().isEmpty()) { - continue; - } - - PublicationMarketDocument.PeriodTimeInterval timeInterval = period.getTimeInterval() != null - ? period.getTimeInterval() - : document.getPeriodTimeInterval(); - if (timeInterval == null || timeInterval.getStart() == null || period.getResolution() == null) { - continue; - } - - final Instant start; - final Duration resolution; - try { - start = parseEntsoeInstant(timeInterval.getStart()); - resolution = Duration.parse(period.getResolution()); - } catch (Exception e) { - LOG.log(Level.WARNING, e, () -> "Could not parse ENTSO-E timeseries time data"); - continue; - } - - period.getPoints().stream() - .filter(point -> point.getPosition() != null && point.getPosition() > 0 && point.getPriceAmount() != null) - .sorted(Comparator.comparingInt(PublicationMarketDocument.Point::getPosition)) - .forEach(point -> { - long timestamp = start - .plus(resolution.multipliedBy(point.getPosition() - 1L)) - .toEpochMilli(); - if (timestamp >= nowMillis) { - values.add(new ValueDatapoint<>(timestamp, point.getPriceAmount())); - } - }); - } + final Instant start; + final Duration resolution; + try { + start = parseEntsoeInstant(timeInterval.getStart()); + resolution = Duration.parse(period.getResolution()); + } catch (Exception e) { + LOG.log(Level.WARNING, e, () -> "Could not parse ENTSO-E timeseries time data"); + continue; } - values.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); - return values; + period.getPoints().stream() + .filter( + point -> + point.getPosition() != null + && point.getPosition() > 0 + && point.getPriceAmount() != null) + .sorted(Comparator.comparingInt(PublicationMarketDocument.Point::getPosition)) + .forEach( + point -> { + long timestamp = + start.plus(resolution.multipliedBy(point.getPosition() - 1L)).toEpochMilli(); + if (timestamp >= nowMillis) { + values.add(new ValueDatapoint<>(timestamp, point.getPriceAmount())); + } + }); + } } - protected Instant parseEntsoeInstant(String value) { - try { - return Instant.parse(value); - } catch (Exception ignored) { - return OffsetDateTime.parse(value, ENTSOE_DATETIME_FORMATTER).toInstant(); - } - } + values.sort(Comparator.comparingLong(ValueDatapoint::getTimestamp)); + return values; + } - protected static void initClient() { - synchronized (client) { - if (client.get() == null) { - client.set(createClient(org.openremote.container.Container.SCHEDULED_EXECUTOR)); - } - } + protected Instant parseEntsoeInstant(String value) { + try { + return Instant.parse(value); + } catch (Exception ignored) { + return OffsetDateTime.parse(value, ENTSOE_DATETIME_FORMATTER).toInstant(); } + } + protected static void initClient() { + synchronized (client) { + if (client.get() == null) { + client.set(createClient(org.openremote.container.Container.SCHEDULED_EXECUTOR)); + } + } + } } diff --git a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/PublicationMarketDocument.java b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/PublicationMarketDocument.java index e555427..9d94973 100644 --- a/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/PublicationMarketDocument.java +++ b/entsoe/src/main/java/org/openremote/extension/entsoe/agent/protocol/PublicationMarketDocument.java @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol; @@ -23,74 +22,97 @@ import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; - import java.math.BigDecimal; import java.util.List; - @XmlRootElement(name = "Publication_MarketDocument", namespace = PublicationMarketDocument.NS) @XmlAccessorType(XmlAccessType.FIELD) public class PublicationMarketDocument { - public static final String NS = "urn:iec62325.351:tc57wg16:451-3:publicationdocument:7:3"; + public static final String NS = "urn:iec62325.351:tc57wg16:451-3:publicationdocument:7:3"; - @XmlElement(name = "period.timeInterval", namespace = NS) - private PeriodTimeInterval periodTimeInterval; + @XmlElement(name = "period.timeInterval", namespace = NS) + private PeriodTimeInterval periodTimeInterval; - @XmlElement(name = "TimeSeries", namespace = NS) - private List timeSeries; + @XmlElement(name = "TimeSeries", namespace = NS) + private List timeSeries; - @XmlAccessorType(XmlAccessType.FIELD) - public static class PeriodTimeInterval { - @XmlElement(name = "start", namespace = NS) - private String start; + @XmlAccessorType(XmlAccessType.FIELD) + public static class PeriodTimeInterval { + @XmlElement(name = "start", namespace = NS) + private String start; - @XmlElement(name = "end", namespace = NS) - private String end; + @XmlElement(name = "end", namespace = NS) + private String end; - public String getStart() { return start; } - public String getEnd() { return end; } + public String getStart() { + return start; } - @XmlAccessorType(XmlAccessType.FIELD) - public static class TimeSeries { + public String getEnd() { + return end; + } + } + + @XmlAccessorType(XmlAccessType.FIELD) + public static class TimeSeries { - @XmlElement(name = "Period", namespace = NS) - private List periods; + @XmlElement(name = "Period", namespace = NS) + private List periods; - public List getPeriods() { return periods; } + public List getPeriods() { + return periods; } + } - @XmlAccessorType(XmlAccessType.FIELD) - public static class Period { + @XmlAccessorType(XmlAccessType.FIELD) + public static class Period { - @XmlElement(name = "timeInterval", namespace = NS) - private PeriodTimeInterval timeInterval; + @XmlElement(name = "timeInterval", namespace = NS) + private PeriodTimeInterval timeInterval; - @XmlElement(name = "resolution", namespace = NS) - private String resolution; // e.g. PT15M + @XmlElement(name = "resolution", namespace = NS) + private String resolution; // e.g. PT15M - @XmlElement(name = "Point", namespace = NS) - private List points; + @XmlElement(name = "Point", namespace = NS) + private List points; - public PeriodTimeInterval getTimeInterval() { return timeInterval; } - public String getResolution() { return resolution; } - public List getPoints() { return points; } + public PeriodTimeInterval getTimeInterval() { + return timeInterval; } - @XmlAccessorType(XmlAccessType.FIELD) - public static class Point { + public String getResolution() { + return resolution; + } - @XmlElement(name = "position", namespace = NS) - private Integer position; + public List getPoints() { + return points; + } + } + + @XmlAccessorType(XmlAccessType.FIELD) + public static class Point { + + @XmlElement(name = "position", namespace = NS) + private Integer position; - @XmlElement(name = "price.amount", namespace = NS) - private BigDecimal priceAmount; + @XmlElement(name = "price.amount", namespace = NS) + private BigDecimal priceAmount; - public Integer getPosition() { return position; } - public BigDecimal getPriceAmount() { return priceAmount; } + public Integer getPosition() { + return position; } - public List getTimeSeries() { return timeSeries; } - public PeriodTimeInterval getPeriodTimeInterval() { return periodTimeInterval; } + public BigDecimal getPriceAmount() { + return priceAmount; + } + } + + public List getTimeSeries() { + return timeSeries; + } + + public PeriodTimeInterval getPeriodTimeInterval() { + return periodTimeInterval; + } } diff --git a/entsoe/src/test/groovy/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocolTest.groovy b/entsoe/src/test/groovy/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocolTest.groovy index 7c1bc0d..48906be 100644 --- a/entsoe/src/test/groovy/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocolTest.groovy +++ b/entsoe/src/test/groovy/org/openremote/extension/entsoe/agent/protocol/EntsoeProtocolTest.groovy @@ -1,9 +1,6 @@ /* * Copyright 2026, OpenRemote Inc. * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the @@ -15,7 +12,9 @@ * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-or-later */ package org.openremote.extension.entsoe.agent.protocol diff --git a/project.gradle b/project.gradle index 45fff13..9693e32 100644 --- a/project.gradle +++ b/project.gradle @@ -23,79 +23,84 @@ import org.jetbrains.gradle.ext.JUnit // subproject, not for its children!) configurations.all { - resolutionStrategy { - // check for changing (i.e. SNAPSHOT) updates every build - cacheChangingModulesFor 0, 'seconds' + resolutionStrategy { + // check for changing (i.e. SNAPSHOT) updates every build + cacheChangingModulesFor 0, 'seconds' - //failOnVersionConflict() + //failOnVersionConflict() - // This has been replaced with eclipse angus implementation - exclude group: "com.sun.activation", module: "jakarta.activation" + // This has been replaced with eclipse angus implementation + exclude group: "com.sun.activation", module: "jakarta.activation" - // This has been replaced with org.bouncycastle bcpkix-jdk18on - exclude group: "org.bouncycastle", module: "bcpkix-jdk15on" + // This has been replaced with org.bouncycastle bcpkix-jdk18on + exclude group: "org.bouncycastle", module: "bcpkix-jdk15on" - // This has been replaced with org.bouncycastle bcprov-jdk18on - exclude group: "org.bouncycastle", module: "bcprov-jdk15on" + // This has been replaced with org.bouncycastle bcprov-jdk18on + exclude group: "org.bouncycastle", module: "bcprov-jdk15on" - eachDependency { DependencyResolveDetails details -> - if (details.requested.group == 'org.eclipse.angus' && details.requested.name == 'angus-activation' && details.requested.version == '1.0.0') { - details.useVersion '2.0.0' - } - if (details.requested.group == 'commons-io' && details.requested.name == 'commons-io') { - details.useVersion '2.14.0' - } - } + eachDependency { DependencyResolveDetails details -> + if (details.requested.group == 'org.eclipse.angus' && details.requested.name == 'angus-activation' && details.requested.version == '1.0.0') { + details.useVersion '2.0.0' + } + if (details.requested.group == 'commons-io' && details.requested.name == 'commons-io') { + details.useVersion '2.14.0' + } } + } } subprojects { - // Give test tasks more memory (Gradle 5 reduced this to 512MB) - tasks.withType(Test) { - maxHeapSize = "2g" - } - - // Give compiler tasks more memory - tasks.withType(GroovyCompile) { - groovyOptions.forkOptions.memoryMaximumSize = '2g' // Set max heap to 2 GB - } + // Give test tasks more memory (Gradle 5 reduced this to 512MB) + tasks.withType(Test) { + maxHeapSize = "2g" + } + + // Give compiler tasks more memory + tasks.withType(GroovyCompile) { + groovyOptions.forkOptions.memoryMaximumSize = '2g' // Set max heap to 2 GB + } } tasks.configureEach { task -> - if (task.name in ['findSonatypeStagingRepository', 'closeSonatypeStagingRepository', 'releaseSonatypeStagingRepository', 'closeAndReleaseSonatypeStagingRepository']) { - // See: https://github.com/gradle-nexus/publish-plugin/issues/221 - task.notCompatibleWithConfigurationCache("Gradle Nexus Publish plugin task keeps Gradle Task/Project state") - } + if (task.name in [ + 'findSonatypeStagingRepository', + 'closeSonatypeStagingRepository', + 'releaseSonatypeStagingRepository', + 'closeAndReleaseSonatypeStagingRepository' + ]) { + // See: https://github.com/gradle-nexus/publish-plugin/issues/221 + task.notCompatibleWithConfigurationCache("Gradle Nexus Publish plugin task keeps Gradle Task/Project state") + } } // Default repositories for dependency resolution repositories { - mavenLocal() - // Needs to be above central due to org.geotools:gt-main issues - maven { - url = "https://repo.osgeo.org/repository/release/" - content { - includeGroup "it.geosolutions.jgridshift" - includeGroup "org.eclipse.imagen" - includeGroupByRegex "org\\.geotools.*" - } - } - mavenCentral() - maven { - url = "https://pkgs.dev.azure.com/OpenRemote/OpenRemote/_packaging/OpenRemote/maven/v1" - } - maven { - url = "https://central.sonatype.com/repository/maven-snapshots" - } - maven { - url = "https://repo.jenkins-ci.org/releases/" - } - maven { - url = 'https://jitpack.io' - } - maven { - url = 'https://plugins.gradle.org/m2' + mavenLocal() + // Needs to be above central due to org.geotools:gt-main issues + maven { + url = "https://repo.osgeo.org/repository/release/" + content { + includeGroup "it.geosolutions.jgridshift" + includeGroup "org.eclipse.imagen" + includeGroupByRegex "org\\.geotools.*" } + } + mavenCentral() + maven { + url = "https://pkgs.dev.azure.com/OpenRemote/OpenRemote/_packaging/OpenRemote/maven/v1" + } + maven { + url = "https://central.sonatype.com/repository/maven-snapshots" + } + maven { + url = "https://repo.jenkins-ci.org/releases/" + } + maven { + url = 'https://jitpack.io' + } + maven { + url = 'https://plugins.gradle.org/m2' + } } // Eclipse needs help @@ -105,106 +110,102 @@ pluginManager.apply('eclipse') pluginManager.apply('idea') // Use the same output directories in IDE as in gradle idea { - module { - outputDir = file('build/classes/main') - testOutputDir = file('build/classes/test') - excludeDirs += file(".node") - excludeDirs += file("node_modules") - excludeDirs += file("dist") - excludeDirs += file("lib") - excludeDirs += file("build") - } + module { + outputDir = file('build/classes/main') + testOutputDir = file('build/classes/test') + excludeDirs += file(".node") + excludeDirs += file("node_modules") + excludeDirs += file("dist") + excludeDirs += file("lib") + excludeDirs += file("build") + } } def getYarnInstallTask() { - tasks.getByPath(":yarnInstall") + tasks.getByPath(":yarnInstall") } ext { - getYarnInstallTask = this.&getYarnInstallTask + getYarnInstallTask = this.&getYarnInstallTask } // Add UI tasks ext.npmCommand = { cmd -> - isFamily(FAMILY_WINDOWS) ? "${cmd}.cmd" : cmd + isFamily(FAMILY_WINDOWS) ? "${cmd}.cmd" : cmd } // Add yarn tasks tasks.register('yarnInstall', Exec) { - commandLine npmCommand("yarn"), "install" + commandLine npmCommand("yarn"), "install" } tasks.register('yarnInstallForce', Exec) { - commandLine npmCommand("yarn"), "install", "--force" + commandLine npmCommand("yarn"), "install", "--force" } // Configure Java build plugins.withType(JavaPlugin).whenPluginAdded { - // Use Java 21 - tasks.withType(JavaCompile) { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 - def warnLogFile = file("$buildDir/${name}Warnings.log") - logging.addStandardErrorListener(new StandardOutputListener() { - void onOutput(CharSequence output) { + // Use Java 21 + tasks.withType(JavaCompile) { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + def warnLogFile = file("$buildDir/${name}Warnings.log") + logging.addStandardErrorListener(new StandardOutputListener() { + void onOutput(CharSequence output) { warnLogFile << output - } - }) - options.compilerArgs += ["-Xlint:unchecked", "-Xlint:deprecation", "-parameters"] - options.encoding = 'UTF-8' + } + }) + options.compilerArgs += ["-Xlint:unchecked", "-Xlint:deprecation", "-parameters"] + options.encoding = 'UTF-8' + } + + // Allow dependencyInsight checks across all projects + tasks.register('allDependencyInsight', DependencyInsightReportTask) {} + + base { + // JAR/ZIP base name is the fully qualified subproject name + archivesName = "${rootProject.name}${path.replaceAll(":", "-")}" + } + + pluginManager.apply(libs.plugins.testLogger.get().pluginId) + + test { + workingDir = findProject(":openremote") != null ? project(":openremote").projectDir : rootProject.projectDir + if (findProject(":openremote") == null) { + // Extension-only repos don't ship the manager UI tree expected by ManagerWebService. + // Point tests at a minimal placeholder docroot so container startup still succeeds. + environment "OR_APP_DOCROOT", rootProject.file("test-support/manager-app").absolutePath } - - // Allow dependencyInsight checks across all projects - tasks.register('allDependencyInsight', DependencyInsightReportTask) {} - - base { - // JAR/ZIP base name is the fully qualified subproject name - archivesName = "${rootProject.name}${path.replaceAll(":", "-")}" + useJUnitPlatform() + testLogging { + // set options for log level LIFECYCLE + events = [TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED] + exceptionFormat = TestExceptionFormat.FULL + showExceptions = true + showCauses = true + showStackTraces = true + + // set options for log level DEBUG and INFO + debug { + events = [ + TestLogEvent.STARTED, + TestLogEvent.FAILED, + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.STANDARD_ERROR + ] + exceptionFormat = TestExceptionFormat.FULL + } + info.events = debug.events + info.exceptionFormat = debug.exceptionFormat } - pluginManager.apply(libs.plugins.testLogger.get().pluginId) - - test { - workingDir = findProject(":openremote") != null ? project(":openremote").projectDir : rootProject.projectDir - if (findProject(":openremote") == null) { - // Extension-only repos don't ship the manager UI tree expected by ManagerWebService. - // Point tests at a minimal placeholder docroot so container startup still succeeds. - environment "OR_APP_DOCROOT", rootProject.file("test-support/manager-app").absolutePath - } - useJUnitPlatform() - testLogging { - // set options for log level LIFECYCLE - events = [ - TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED - ] - exceptionFormat = TestExceptionFormat.FULL - showExceptions = true - showCauses = true - showStackTraces = true - - // set options for log level DEBUG and INFO - debug { - events = [ - TestLogEvent.STARTED, - TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.STANDARD_ERROR - ] - exceptionFormat = TestExceptionFormat.FULL - } - info.events = debug.events - info.exceptionFormat = debug.exceptionFormat - } - - addTestListener(new TestSummaryListener()) - } + addTestListener(new TestSummaryListener()) + } } // Configure Spotless if (project == rootProject) { - apply from: "${rootDir}/spotless.gradle" + apply from: "${rootDir}/spotless.gradle" } // POM generator diff --git a/settings.gradle b/settings.gradle index 958fbad..aac2465 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ pluginManagement { - repositories { - gradlePluginPortal() - } + repositories { + gradlePluginPortal() + } } // TODO: These plugins remain here because project.gradle imports their classes, @@ -9,8 +9,8 @@ pluginManagement { // configuration into convention plugins/build logic so their versions can be // managed through libs.versions.toml. plugins { - id 'com.diffplug.spotless' version "$spotlessVersion" apply false - id 'org.jetbrains.gradle.plugin.idea-ext' version "$ideaExtPluginVersion" apply false + id 'com.diffplug.spotless' version "$spotlessVersion" apply false + id 'org.jetbrains.gradle.plugin.idea-ext' version "$ideaExtPluginVersion" apply false } rootProject.name = "$projectName" @@ -20,22 +20,22 @@ fileTree( dir: rootDir, include: "**/build.gradle", excludes: [ - ".git/**", - "**/.git/**", - ".gradle/**", - "**/.gradle/**", - "**/build/**", - "**/node_modules/**", - "**/generic_app/**", - "**/dist/**", - "**/lib/**" + ".git/**", + "**/.git/**", + ".gradle/**", + "**/.gradle/**", + "**/build/**", + "**/node_modules/**", + "**/generic_app/**", + "**/dist/**", + "**/lib/**" ] -) + ) .filter { it.parentFile != rootDir } .filter { !new File(it.parentFile, ".buildignore").exists() } .each { - include it.parentFile.canonicalPath - .replace(rootDir.canonicalPath, "") - .replace("\\", ":") - .replace("/", ":") + include it.parentFile.canonicalPath + .replace(rootDir.canonicalPath, "") + .replace("\\", ":") + .replace("/", ":") } diff --git a/spotless.gradle b/spotless.gradle index 0c6a385..8737fc1 100644 --- a/spotless.gradle +++ b/spotless.gradle @@ -106,4 +106,4 @@ spotless { def yarnInstallTask = getYarnInstallTask() tasks.matching { it.name.startsWith("spotless") }.configureEach { dependsOn yarnInstallTask -} \ No newline at end of file +} diff --git a/test-support/manager-app/index.html b/test-support/manager-app/index.html index 6dfee5b..ce5d79c 100644 --- a/test-support/manager-app/index.html +++ b/test-support/manager-app/index.html @@ -1,10 +1,10 @@ - - - OpenRemote Test Manager App - - - Test manager app placeholder. - + + + OpenRemote Test Manager App + + + Test manager app placeholder. +