UNPKG

zgapdfsigner

Version:

A javascript tool to sign a pdf or set protection to a pdf in web browser, Google Apps Script and nodejs.

84 lines (83 loc) 43.3 kB
function supplyZgaUrlFetch(e){e.isBrowser=function(){return this===globalThis.self}();e.urlFetch=function(a,b){var c=async function(){var d={method:"GET",redirect:"follow"};b&&(b.payload&&(d.body=b.payload),b.headers&&(d.headers=b.headers),b.method&&(d.method=b.method));d=await fetch(a,d);if(d.ok)return d=await d.arrayBuffer(),new Uint8Array(d);var f=await d.text();throw Error("Fetch failed."+d.status+": "+f);};return globalThis.UrlFetchApp?new Promise(function(d){var f=UrlFetchApp.fetch(a,b).getBlob(); d(new Uint8Array(f.getBytes()))}):e.isBrowser&&globalThis.self.fetch?c():null}};function supplyZgaCertsChain(e){e.fixCertAttributes=function(a){a.issuer.attributes.forEach(function(b){b.valueTagClass===forge.asn1.Type.UTF8&&(b.value=forge.util.decodeUtf8(b.value))})};e.loadCert=function(a){a="string"===typeof a?forge.asn1.fromDer(a):a;return forge.pki.certificateFromAsn1(a)};e.oidToDstr=function(a){return forge.asn1.oidToDer(a).getBytes()};e.parseAsn1=function(a,b,c){var d={},f=[];forge.asn1.validate(a,b,d,f);return 0<f.length?null:c?d.oid?Array.isArray(c)?0<=c.indexOf(d.oid)? d:null:c==d.oid?d:null:null:d};e.createAsn1=function(a,b,c){const d=forge.asn1,f=d.Class,g=d.Type;var h=null;b=b||b===g.NONE?b:-1;var k=!1;if(Array.isArray(a))k=!0;else switch(typeof a){case "string":b==g.OID?h=d.oidToDer(a).getBytes():0>b&&(b=g.OCTETSTRING);break;case "number":h=d.integerToDer(a).getBytes();0>b&&(b=g.INTEGER);break;case "boolean":h=a?1:0,0>b&&(b=g.BOOLEAN)}0>b&&(b=g.SEQUENCE);h||0===h||(h=a);return d.create(c?c:f.UNIVERSAL,b,k,h)};e.queryAsn1=async function(a,b,c){b=forge.asn1.toDer(b).getBytes(); b=e.rawToU8arr(b);return await e.urlFetch(a,{method:"POST",headers:c,payload:b})};e.sameCert=function(a,b){a=a.subject;b=b.subject;if(a.attributes.length===b.attributes.length){for(var c,d,f=0;f<a.attributes.length;f++)if(c=a.attributes[f],d=b.attributes[f],c.type!==d.type||c.value!==d.value)return!1;return!0}return!1};e.CertsChain=class{constructor(a){this.asn1=forge.asn1;this.asnc=forge.asn1.Class;this.asnt=forge.asn1.Type;this.ocsp_oid=e.oidToDstr("1.3.6.1.5.5.7.48.1");this.issuer_oid=e.oidToDstr("1.3.6.1.5.5.7.48.2"); this.ocspBasic_oid=e.oidToDstr("1.3.6.1.5.5.7.48.1.1");this.oidval_validator={name:"Seq",tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0,value:[{name:"Oid",tagClass:this.asnc.UNIVERSAL,type:this.asnt.OID,constructed:!1,capture:"oid"},{name:"Ovalue",tagClass:this.asnc.CONTEXT_SPECIFIC,type:6,constructed:!1,capture:"oval"}]};this.oresp_validator={tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0,value:[{name:"Status",tagClass:this.asnc.UNIVERSAL,type:this.asnt.ENUMERATED, constructed:!1,capture:"status"},{tagClass:this.asnc.CONTEXT_SPECIFIC,type:0,constructed:!0,value:[{tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0,value:[{name:"Oid",tagClass:this.asnc.UNIVERSAL,type:this.asnt.OID,constructed:!1,capture:"oid"},{name:"OcspBasic",tagClass:this.asnc.UNIVERSAL,type:this.asnt.OCTETSTRING,constructed:!1,capture:"ob"}]}]}]};this.ob_validator={tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0,value:[{tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE, constructed:!0},{tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0},{tagClass:this.asnc.UNIVERSAL,type:this.asnt.BITSTRING,constructed:!1},{tagClass:this.asnc.CONTEXT_SPECIFIC,type:0,constructed:!0,optional:!0,value:[{name:"Certs",tagClass:this.asnc.UNIVERSAL,type:this.asnt.SEQUENCE,constructed:!0,capture:"certs"}]}]};this.extraChains=this.ocspDatas=this.crls=this.rootCert=this.certs=null;this.ocspOk=!1;a&&this.setCerts(a)}setCerts(a){var b=this,c=[];b.certs=[];var d=null;a.forEach(function(h){d= h.issuer?h:e.loadCert(h);d.isIssuer(d)?b.rootCert=d:(h=d.getExtension("basicConstraints"))&&h.cA?c.push(d):b.certs.push(d)});a=c.length;if(1==b.certs.length)for(d=b.certs[0];0<a;)for(var f=0;f<c.length;f++)c[f]&&d.isIssuer(c[f])&&(d=c[f],b.certs.push(d),c[f]=null,a--);else if(0<a)for(b.certs.push(c.pop()),a--;0<a;)for(f=0;f<c.length;f++)if(c[f])for(var g=0;g<b.certs.length;g++)if(d=b.certs[g],d.isIssuer(c[f])){b.certs.splice(g+1,0,c[f]);c[f]=null;a--;break}else if(c[f].isIssuer(d)){b.certs.splice(g, 0,c[f]);c[f]=null;a--;break}}getSignCert(){return 0<this.certs.length?this.certs[0]:this.rootCert}isSelfSignedCert(){return 0==this.certs.length}getAllCerts(){var a=[].concat(this.certs);this.rootCert&&a.push(this.rootCert);return a}isCertInChain(a){return this.isCertInArray(this.getAllCerts(),a)}async buildChain(a){a.isIssuer(a)?(this.certs=[],this.rootCert=a):(this.certs=[a],this.rootCert=null);return await this.amendRootCert()}async prepareDSSInf(a){var b=this,c=await b.amendRootCert();if(!c)throw Error("Can't prepare DSS infomation because of unable to find the root certificate."); a?c=!1:(b.ocspDatas=[],b.extraChains=[],c=await b.checkAllOcsps(b.extraChains));var d=[],f=[];c&&(b.ocspDatas.forEach(function(h){d.push(h.resp)}),b.extraChains.forEach(function(h){h.ocspDatas.forEach(function(k){d.push(k.resp)});h.certs.forEach(function(k){b.isCertInArray(b.certs,k)||b.isCertInArray(f,k)||f.push(k)})}));a=[];if(!c){b.crls=[];for(c=0;c<b.certs.length;c++){var g=b.getExtAsn1(b.certs[c],"cRLDistributionPoints");g&&b.findCrls(g)}for(c=0;c<b.crls.length;c++)e.log("Query crl for ["+b.crls[c]+ "]"),g=b.crls[c],"ldap"!==g.slice(0,4)&&(g=await e.urlFetch(g))&&a.push(g)}c={};0<f.length&&(c.certs=f);0<d.length&&(c.ocsps=d);0<a.length&&(c.crls=a);return c}async amendRootCert(){for(;!this.rootCert;)if(!await this.queryIssuerCert(-1))return!1;return!0}async queryIssuerCert(a){var b="number"===typeof a?0>a?this.certs[this.certs.length-1]:this.certs[a]:a;b=this.getExtAsn1(b,"authorityInfoAccess");if(!b)return null;b=this.findOidValue(b,this.issuer_oid);if(!b)return null;e.log("Query certificate of ["+ b+"]");b=await e.urlFetch(b);if(!b)return null;b=e.loadCert(e.u8arrToRaw(b));"number"===typeof a&&(b.isIssuer(b)?this.rootCert=b:0>a?this.certs.push(b):this.certs[a+1]=b);return b}async checkAllOcsps(a){var b,c=0<this.certs.length;for(b=0;b<this.certs.length;b++)if(!await this.queryOcsp(b,a)){c=!1;break}return this.ocspOk=c}async queryOcsp(a,b){var c=this.certs[a];e.log("Query ocsp for ["+c.subject.getField("CN").value+"]");var d="",f=this.getExtAsn1(c,"authorityInfoAccess");f&&(d=this.findOidValue(f, this.ocsp_oid));if(!d)return e.log("Can't find the url of ocsp."),!1;c=e.u8arrToRaw(forge.util.binary.hex.decode(c.serialNumber));f=a+1;var g=f<this.certs.length?this.certs[f]:this.rootCert;f=forge.pki.distinguishedNameToAsn1(g.subject);g=forge.pki.publicKeyToRSAPublicKey(g.publicKey);f=this.sha1(f);g=this.sha1(g);var h=forge.random.getBytesSync(16);h=this.asn1.toDer(e.createAsn1(h)).getBytes();c=e.createAsn1([e.createAsn1([e.createAsn1([e.createAsn1([e.createAsn1([e.createAsn1([e.createAsn1(forge.oids.sha1, this.asnt.OID),e.createAsn1("",this.asnt.NULL)]),e.createAsn1(f),e.createAsn1(g),e.createAsn1(c,this.asnt.INTEGER)])])]),e.createAsn1([e.createAsn1([e.createAsn1([e.createAsn1("1.3.6.1.5.5.7.48.1.2",this.asnt.OID),e.createAsn1(h)])])],2,this.asnc.CONTEXT_SPECIFIC)])]);d=await e.queryAsn1(d,c,{"Content-Type":"application/ocsp-request"});c=this.asn1.fromDer(e.u8arrToRaw(d));if(f=e.parseAsn1(c,this.oresp_validator,this.ocspBasic_oid)){if(c=f.status.charCodeAt(0),0!=c){a="ocsp response is not successful. "; switch(c){case 1:a+="malformedRequest";break;case 2:a+="internalError";break;case 3:a+="tryLater";break;case 5:a+="sigRequired";break;case 6:a+="unauthorized";break;default:a+="unknown error"}e.log(a+("("+c+")"));return!1}}else return e.log("ocsp response is an unknown format."),!1;if(f.ob){c=this.asn1.fromDer(f.ob);if(c=e.parseAsn1(c,this.ob_validator)){this.ocspDatas[a]={resp:d};if(c.certs){d=new e.CertsChain(c.certs);for(c=c=0;c<b.length;c++)if(b[c].isCertInChain(d.getSignCert())){d=null;break}this.ocspDatas[a].cchainIdx= c;if(d){var k=!0;d.certs.forEach(function(l){k&&!l.getExtension({id:"1.3.6.1.5.5.7.48.1.5"})&&(k=!1)});k?d.ocspOk=!0:(b.push(d),await d.amendRootCert(),await d.checkAllOcsps(b))}else d=b[c];return d.ocspOk}return!0}e.log("ocsp basic is an unknown format.");return!1}e.log("There is no ocsp basic in ocsp response.");return!1}getExtAsn1(a,b){return(a=a.getExtension(b))?this.asn1.fromDer(a.value):null}findCrls(a){var b=this;Array.isArray(a.value)?a.value.forEach(function(c){b.findCrls(c)}):(a=a.value, 0>b.crls.indexOf(a)&&b.crls.push(a))}findOidValue(a,b){var c=e.parseAsn1(a,this.oidval_validator,b);if(c&&c.oval)return c.oval;c="";if(Array.isArray(a.value))for(var d=0;d<a.value.length&&!(c=this.findOidValue(a.value[d],b));d++);return c}sha1(a){var b=forge.md.sha1.create();b.update(this.asn1.toDer(a).getBytes());return b.digest().getBytes()}isCertInArray(a,b){var c;for(c=0;c<a.length;c++)if(e.sameCert(a[c],b))return!0;return!1}};e.TsaFetcher=class{constructor(a){this.asn1=forge.asn1;this.asnc=forge.asn1.Class; this.asnt=forge.asn1.Type;this.url=a.url;this.len=a.len?a.len:0;this.headers=a.headers;this.respAsn1=null}async queryTsa(a){var b=forge.md.sha256.create();b.update(a);a=e.createAsn1([e.createAsn1(1),e.createAsn1([e.createAsn1([e.createAsn1(forge.oids.sha256,this.asnt.OID),e.createAsn1("",this.asnt.NULL)]),e.createAsn1(b.digest().getBytes())]),e.createAsn1(!0)]);b=this.headers?this.headers:{};b["Content-Type"]||(b["Content-Type"]="application/timestamp-query");a=await e.queryAsn1(this.url,a,b);a=e.u8arrToRaw(a); this.respAsn1=this.asn1.fromDer(a);a=this.respAsn1.value[0].value[0].value;if("\x00"==a)return"";b=this.respAsn1.value[0].value[1].value[0];var c=b.value;b.type==this.asnt.UTF8&&(c=forge.util.decodeUtf8(c));return c+"("+a.charCodeAt(0)+")"}getToken(a){var b=this.respAsn1.value[1];return a?e.createAsn1([e.createAsn1([e.createAsn1("1.2.840.113549.1.9.16.2.14",this.asnt.OID),e.createAsn1([b],this.asnt.SET)])],1,this.asnc.CONTEXT_SPECIFIC):b}getCertsChain(){if(!this.respAsn1)throw Error("You must query tsa first."); for(var a=this.respAsn1.value[1].value[1].value[0].value,b=null,c=3;c<a.length;c++){var d=e.parseAsn1(a[c],{name:"Certs",tagClass:this.asnc.CONTEXT_SPECIFIC,type:this.asnt.NONE,constructed:!0,capture:"certs"});if(d){b=d.certs;break}}return b?new e.CertsChain(b):null}}};function supplyZgaCryptor(e){e.loadPdf=async function(a){return a.addPage?a:Array.isArray(a)?await PDFLib.PDFDocument.load(new Uint8Array(a)):await PDFLib.PDFDocument.load(a)};e.Crypto={Mode:{RC4_40:0,RC4_128:1,AES_128:2,AES_256:3},Permission:{copy:2,print:4,modify:8,"copy-extract":16,"annot-forms":32,"fill-forms":256,extract:512,assemble:1024,"print-high":2048},EncPadding:atob("KL9OXk51ikFkAE5W//oBCC4uALbQaD6ALwyp/mRTaXo="),_escape:function(a){if(!a)return a;const b=["\\","(",")"];for(var c=[],d= 0;d<a.length;d++){var f=a.charAt(d);"\r"==f?c.push("\\r"):(0<=b.indexOf(f)&&c.push("\\"),c.push(f))}return c.join("")},getRandomSeed:function(a){var b=forge.random.getBytesSync(256);a&&(b+=a);return b+=(new Date).getTime()},_RC4:function(a,b,c){var d,f=0;if(c.enckey!=a){var g=a.repeat(256/a.length+1);var h=Array(256);for(d=0;d<h.length;d++)h[d]=d;for(d=0;d<h.length;d++){var k=h[d];f=f+k+g.charCodeAt(d)&255;h[d]=h[f];h[f]=k}c.enckey=a;c.enckeyc=[].concat(h)}else h=[].concat(c.enckeyc);a=b.length;f= c=0;var l="";for(d=0;d<a;d++)c=c+1&255,k=h[c],f=f+k&255,h[c]=h[f],h[f]=k,g=h[h[c]+h[f]&255],l+=String.fromCharCode(b.charCodeAt(d)^g);return l},getUserPermissionCode:function(a,b){var c=2147422012;a&&a.forEach(function(d){var f=e.Crypto.Permission[d];f&&"copy"!=d&&(0<b||32>=f)&&(c=2==f?c+f:c-f)});return c},getUserPermissionsString:function(a){var b=new forge.util.ByteStringBuffer;b.putInt32Le(a);return b.getBytes()},getCertPermissionsString:function(a){var b=65535;a&&a.forEach(function(c){(c=e.Crypto.Permission[c])&& (b-=c)});a=new forge.util.ByteStringBuffer;a.fillWithByte(255,2);a.putInt16(b);return a.getBytes()},_md5_16:function(a){var b=forge.md.md5.create();b.update(a);return b.digest().getBytes()},_AES:function(a,b){var c=16-(b.length&15);b=forge.util.createBuffer(b);b.fillWithByte(c,c);c=forge.random.getBytesSync(16);a=forge.util.createBuffer(a);a=forge.cipher.createCipher("AES-CBC",a);a.start({iv:c});a.update(b);a.finish();return c+a.output.truncate(16).getBytes()},_AESnopad:function(a,b){b=forge.util.createBuffer(b); var c=String.fromCharCode(0).repeat(16);a=forge.util.createBuffer(a);a=forge.cipher.createCipher("AES-CBC",a);a.start({iv:c});a.update(b);a.finish();return a.output.truncate(16).getBytes()}};e.PdfCryptor=class{constructor(a){this.key=this.fileid="";this.pubkeys=a.pubkeys;this.mode=a.mode;this.permissions=a.permissions;this.ownerpwd=this.userpwd="";this.Filter="Standard";this.StrF=this.StmF="StdCF";this.V=1;this.Length=0;this.CF=null;this.SubFilter="";this.Recipients=null;this.OE=this.O=this.OKS=this.OVS= this.UE=this.U=this.UKS=this.UVS="";this.P=0;this.perms="";this.rc4inf={enckey:"",enckeyc:null};if(this.pubkeys){if(0==this.pubkeys.length)throw Error("Public key information is not specified.");this.mode==e.Crypto.Mode.RC4_40&&(this.mode=e.Crypto.Mode.RC4_128);this.Filter="Adobe.PubSec";this.StrF=this.StmF="DefaultCryptFilter"}a.userpwd&&(this.userpwd=a.userpwd);a.ownerpwd?this.ownerpwd=a.ownerpwd:(a=forge.md.md5.create(),a.update(e.Crypto.getRandomSeed()),this.ownerpwd=a.digest().toHex());switch(this.mode){case e.Crypto.Mode.RC4_40:this.V= 1;this.Length=40;this.CF={CFM:"V2"};break;case e.Crypto.Mode.RC4_128:this.V=2;this.Length=128;this.CF={CFM:"V2"};this.pubkeys&&(this.SubFilter="adbe.pkcs7.s4",this.Recipients=[]);break;case e.Crypto.Mode.AES_128:this.V=4;this.Length=128;this.CF={CFM:"AESV2",Length:128};this.pubkeys&&(this.SubFilter="adbe.pkcs7.s5",this.Recipients=[]);break;case e.Crypto.Mode.AES_256:this.V=5;this.Length=256;this.CF={CFM:"AESV3",Length:256};this.pubkeys&&(this.SubFilter="adbe.pkcs7.s5",this.Recipients=[]);break;default:throw Error("Unknown crypto mode. "+ this.mode);}}async encryptPdf(a,b){const c=this;var d=await e.loadPdf(a);d!==a||b||await d.flush();a=d.context;var f=c.prepareEncrypt(a);a.enumerateIndirectObjects().forEach(function(g){c.encryptObject(g[0].objectNumber,g[1])});b?a.assign(b,f):b=a.register(f);a.trailerInfo.Encrypt=b;return d}encryptObject(a,b){if(b instanceof PDFLib.PDFContentStream){var c=b.contentsCache.access();c&&(b.contentsCache.value=this.encryptU8arr(a,c))}else b instanceof PDFLib.PDFStream?b.contents&&(b.contents=this.encryptU8arr(a, b.contents)):b instanceof PDFLib.PDFHexString?b.value&&(b.value=this.encryptHexstr(a,b.value)):b instanceof PDFLib.PDFString&&b.value&&(b.value=e.Crypto._escape(this._encrypt_data(a,b.value)));if(b.dict instanceof Map)for(b=b.dict.entries(),c=b.next();!c.done;)this.encryptObject(a,c.value[1]),c=b.next()}prepareEncrypt(a){if(a.trailerInfo.ID)this.fileid=forge.util.hexToBytes(a.trailerInfo.ID.get(0).value);else{var b=forge.md.md5.create();b.update(e.Crypto.getRandomSeed());var c=b.digest();b=c.toHex(); this.fileid=c.getBytes();c=new PDFLib.PDFArray(a);c.push(PDFLib.PDFHexString.of(b));c.push(PDFLib.PDFHexString.of(b));a.trailerInfo.ID=c}this._generateencryptionkey();b={};b.Filter=this.Filter;this.SubFilter&&(b.SubFilter=this.SubFilter);b.V=this.V;b.Length=this.Length;if(4<=this.V){if(this.CF){c={Type:"CryptFilter"};if(this.CF.CFM){if(c.CFM=this.CF.CFM,this.pubkeys){var d=new PDFLib.PDFArray(a);this.Recipients.forEach(function(g){d.push(PDFLib.PDFHexString.of(g))});c.Recipients=d;c.EncryptMetadata= "boolean"!=typeof this.CF.EncryptMetadata||this.CF.EncryptMetadata?!0:!1}}else c.CFM="None";c.AuthEvent=this.CF.AuthEvent?this.CF.AuthEvent:"DocOpen";this.CF.Length&&(c.Length=this.CF.Length);c={[this.StmF]:a.obj(c)};b.CF=a.obj(c)}b.StmF=this.StmF;b.StrF=this.StrF}if(this.pubkeys){if(4>this.V&&this.Recipients&&0<this.Recipients.length){var f=new PDFLib.PDFArray(a);this.Recipients.forEach(function(g){f.push(PDFLib.PDFHexString.of(g))});b.Recipients=f}}else 5==this.V?(b.R=5,b.OE=PDFLib.PDFString.of(e.Crypto._escape(this.OE)), b.UE=PDFLib.PDFString.of(e.Crypto._escape(this.UE)),b.Perms=PDFLib.PDFString.of(e.Crypto._escape(this.perms))):b.R=4==this.V?4:2>this.V?2:3,b.O=PDFLib.PDFString.of(e.Crypto._escape(this.O)),b.U=PDFLib.PDFString.of(e.Crypto._escape(this.U)),b.P=this.P,b.EncryptMetadata="boolean"!=typeof this.EncryptMetadata||this.EncryptMetadata?!0:!1;return a.obj(b)}encryptU8arr(a,b){b=e.u8arrToRaw(b);a=this._encrypt_data(a,b);return e.rawToU8arr(a)}encryptHexstr(a,b){b=forge.util.hexToBytes(b);a=this._encrypt_data(a, b);return forge.util.createBuffer(a).toHex()}_objectkey(a){var b=forge.util.createBuffer(this.key);b.putInt24Le(a);b.putBytes(String.fromCharCode(0)+String.fromCharCode(0));this.mode==e.Crypto.Mode.AES_128&&b.putBytes("sAlT");a=forge.md.md5.create();a.update(b.getBytes());return a.digest().getBytes().substr(0,Math.min(16,this.Length/8+5))}_encrypt_data(a,b){switch(this.mode){case e.Crypto.Mode.RC4_40:case e.Crypto.Mode.RC4_128:b=e.Crypto._RC4(this._objectkey(a),b,this.rc4inf);break;case e.Crypto.Mode.AES_128:b= e.Crypto._AES(this._objectkey(a),b);break;case e.Crypto.Mode.AES_256:b=e.Crypto._AES(this.key,b)}return b}_Uvalue(){var a="";if(this.mode==e.Crypto.Mode.RC4_40)a=e.Crypto._RC4(this.key,e.Crypto.EncPadding,this.rc4inf);else if(this.mode<e.Crypto.Mode.AES_256){var b=e.Crypto._md5_16(e.Crypto.EncPadding+this.fileid);a=e.Crypto._RC4(this.key,b,this.rc4inf);b=b.length;for(var c=1;19>=c;c++){for(var d="",f=0;f<b;f++)d+=String.fromCharCode(this.key.charCodeAt(f)^c);a=e.Crypto._RC4(d,a,this.rc4inf)}a+=String.fromCharCode(0).repeat(16); a=a.substr(0,32)}else this.mode==e.Crypto.Mode.AES_256&&(a=e.Crypto._md5_16(e.Crypto.getRandomSeed()),this.UVS=a.substr(0,8),this.UKS=a.substr(8,16),a=forge.md.sha256.create(),a.update(this.userpwd+this.UVS),a=a.digest().getBytes()+this.UVS+this.UKS);return a}_UEvalue(){var a=forge.md.sha256.create();a.update(this.userpwd+this.UKS);return e.Crypto._AESnopad(a.digest().getBytes(),this.key)}_Ovalue(){var a="";if(this.mode<e.Crypto.Mode.AES_256){a=e.Crypto._md5_16(this.ownerpwd);if(this.mode>e.Crypto.Mode.RC4_40)for(var b= 0;50>b;b++)a=e.Crypto._md5_16(a);var c=a.substr(0,this.Length/8);a=e.Crypto._RC4(c,this.userpwd,this.rc4inf);if(this.mode>e.Crypto.Mode.RC4_40){var d=c.length;for(b=1;19>=b;b++){for(var f="",g=0;g<d;g++)f+=String.fromCharCode(c.charCodeAt(g)^b);a=e.Crypto._RC4(f,a,this.rc4inf)}}}else this.mode==e.Crypto.Mode.AES_256&&(b=e.Crypto._md5_16(e.Crypto.getRandomSeed()),this.OVS=b.substr(0,8),this.OKS=b.substr(8,16),b=forge.md.sha256.create(),b.update(this.ownerpwd+this.OVS+this.U),a=b.digest().getBytes()+ this.OVS+this.OKS);return a}_OEvalue(){var a=forge.md.sha256.create();a.update(this.ownerpwd+this.OKS+this.U);return e.Crypto._AESnopad(a.digest().getBytes(),this.key)}_fixAES256Password(a){return a.substr(0,127)}_generateencryptionkey(){var a=this.Length/8,b=null;if(this.pubkeys){b=forge.md.sha1.create();b.update(e.Crypto.getRandomSeed());var c=b.digest().getBytes(),d="",f=e.Crypto.getCertPermissionsString(this.permissions);this.pubkeys.forEach(function(k){var l=f;k.p&&(l=e.Crypto.getCertPermissionsString(k.p)); l=c+l;if(k.c)k.c.issuer?k=k.c:(k="string"==typeof k.c?k.c:e.u8arrToRaw(new Uint8Array(k.c)),k=e.loadCert(k),e.fixCertAttributes(k));else throw Error("We need a certificate.");var n=forge.pkcs7.createEnvelopedData();n.addRecipient(k);n.content=forge.util.createBuffer(l);n.encrypt();l=forge.asn1.toDer(n.toAsn1());k=l.toHex();this.Recipients.push(k);d+=l.getBytes()}.bind(this));b=this.mode==e.Crypto.Mode.AES_256?forge.md.sha256.create():forge.md.sha1.create();b.update(c+d);this.key=b.digest().getBytes().substr(0, a)}else{var g=e.Crypto.getUserPermissionCode(this.permissions,this.mode);if(this.mode==e.Crypto.Mode.AES_256)b=forge.md.sha256.create(),b.update(e.Crypto.getRandomSeed()),this.key=b.digest().getBytes().substr(0,a),this.userpwd=this._fixAES256Password(this.userpwd),this.ownerpwd=this._fixAES256Password(this.ownerpwd),this.U=this._Uvalue(),this.UE=this._UEvalue(),this.O=this._Ovalue(),this.OE=this._OEvalue(),this.P=g,a=e.Crypto.getUserPermissionsString(g),a+=String.fromCharCode(255).repeat(4),a="boolean"!= typeof this.CF.EncryptMetadata||this.CF.EncryptMetadata?a+"T":a+"F",this.perms=e.Crypto._AESnopad(this.key,a+"adbnick");else{this.userpwd=(this.userpwd+e.Crypto.EncPadding).substr(0,32);this.ownerpwd=(this.ownerpwd+e.Crypto.EncPadding).substr(0,32);this.O=this._Ovalue();b=e.Crypto.getUserPermissionsString(g);b=e.Crypto._md5_16(this.userpwd+this.O+b+this.fileid);if(this.mode>e.Crypto.Mode.RC4_40)for(var h=0;50>h;h++)b=e.Crypto._md5_16(b.substr(0,a));this.key=b.substr(0,a);this.U=this._Uvalue();this.P= g}}}}};function supplyZgaSigner(e){e.TSAURLS={1:{url:"http://ts.ssl.com",len:12100},2:{url:"http://timestamp.digicert.com",len:11900},3:{url:"http://timestamp.sectigo.com",len:9900},4:{url:"http://timestamp.entrust.net/TSS/RFC3161sha2TS",len:10850},5:{url:"http://timestamp.apple.com/ts01",len:8600},6:{url:"http://www.langedge.jp/tsa",len:5700},7:{url:"https://freetsa.org/tsr",len:11E3}};e.NewRef=class{constructor(a,b,c){this.oriNumber=a.objectNumber;this.oriGeneration=a.generationNumber;this.name=c?c:""; this.newNumber=b?b:0}setNewNumber(a){this.newNumber=a}changeNumber(a){if(!this.newNumber){if(a)return;throw Error("Can NOT change number since new number is not set.");}var b=PDFLib.PDFRef.of(this.oriNumber,this.oriGeneration);b.objectNumber=a?this.oriNumber:this.newNumber;b.tag=b.objectNumber+" "+this.oriGeneration+" R"}toString(){return this.name+" -> old:"+this.oriNumber+", new:"+this.newNumber}};e.NewRefMap=class extends Map{constructor(){super();this.idx=0;this.pdfcont=null;this.oriLastOnum= 0}reorderPdfRefs(a,b){const c=this;c.pdfcont=a.context;b=b?c.pdfcont.nextRef():null;a.getPages().forEach(function(d){c.addAndFindRelates(d.ref,"Page")});c.addAndFindRelates(c.pdfcont.trailerInfo.Root,"Catalog");b&&c.addAndFindRelates(b,"Encrypt");c.pdfcont.enumerateIndirectObjects().forEach(function(d){var f=d[0].tag,g=c.get(f);g||(g=new e.NewRef(d[0],++c.idx),c.set(f,g))});c.changeAll();c.oriLastOnum=c.pdfcont.largestObjectNumber;c.pdfcont.largestObjectNumber=c.idx;return b}restoreAll(){this.changeAll(!0); this.pdfcont.largestObjectNumber=this.oriLastOnum;this.clear();this.oriLastOnum=this.idx=0;this.pdfcont=null}addAndFindRelates(a,b){this.get(a.tag)||(this.set(a.tag,new e.NewRef(a,++this.idx,b)),this.findRefs(this.pdfcont.lookup(a),b))}findRefs(a,b){if(a&&"/Parent"!=b)if(a instanceof PDFLib.PDFRef)this.addAndFindRelates(a,b);else if(a.array&&(a=a.array),Array.isArray(a))a.forEach(function(d){this.findRefs(d,b)}.bind(this));else{a instanceof PDFLib.PDFPage&&(a=a.node);for(;a.dict&&!(a instanceof Map);)a= a.dict;if(a instanceof Map){a=a.entries();for(var c=a.next();!c.done;)this.findRefs(c.value[1],c.value[0].encodedName),c=a.next()}}}changeAll(a){for(var b=this.entries(),c=b.next();!c.done;)c.value[1].changeNumber(a),c=b.next()}};e.newRefs=new e.NewRefMap;e.PdfSigner=class{constructor(a){this.cyptr=this.tsaFetcher=null;this.DEFAULT_BYTE_RANGE_PLACEHOLDER="**********";this.NEWLINE=10;this.opt=a;this.cchain=this.privateKey=null;this.signature="";this.siglen=0;this.fonts=this.apobjs=this.oriU8pdf=this.sigContents= null;"boolean"==typeof this.opt.debug?e.debug=this.opt.debug:globalThis.debug&&(e.debug=!0);if(!globalThis.PDFLib&&!PDFLib)throw Error("pdf-lib is not imported.");if(!globalThis.forge&&!forge)throw Error("node-forge is not imported.");e.ver&&e.log("ZgaPdfSigner Version:",e.ver);var b=null;a.signdate&&("string"==typeof a.signdate?b={url:a.signdate}:a.signdate.url&&(b=Object.assign({},a.signdate)));if(b){if(!e.urlFetch)throw Error("No fetch method found in this environment.");if(e.TSAURLS[b.url])Object.assign(b, e.TSAURLS[b.url]);else if(!b.url||!e.isBrowser&&!RegExp("^https?://").test(b.url))throw Error("Unknown tsa data. "+JSON.stringify(b));b.len||(b.len=16E3);this.tsaFetcher=new e.TsaFetcher(b)}if(a.ltv&&!e.urlFetch)throw Error("Because of the CORS security restrictions, signing with LTV is not supported in web browser.");}async sign(a,b){if(b&&!e.PdfCryptor)throw Error("ZgaPdfCryptor is not imported.");var c=null;a.addPage?c=a:(Array.isArray(a)?this.oriU8pdf=new Uint8Array(a):this.oriU8pdf=PDFLib.toUint8Array(a), c=await PDFLib.PDFDocument.load(this.oriU8pdf));this.opt.drawinf&&this.opt.drawinf.imgData&&!this.opt.drawinf.imgInfo&&(this.opt.drawinf.imgInfo={imgData:this.opt.drawinf.imgData,imgType:this.opt.drawinf.imgType});if(this.opt.drawinf&&this.opt.drawinf.imgInfo&&!this.opt.drawinf.img)if(a=null,a=Array.isArray(this.opt.drawinf.imgInfo.imgData)?new Uint8Array(this.opt.drawinf.imgInfo.imgData):this.opt.drawinf.imgInfo.imgData,"png"==this.opt.drawinf.imgInfo.imgType)this.opt.drawinf.img=await c.embedPng(a); else if("jpg"==this.opt.drawinf.imgInfo.imgType)this.opt.drawinf.img=await c.embedJpg(a);else throw Error("Unkown image type. "+this.opt.drawinf.imgInfo.imgType);this.opt.drawinf&&this.opt.drawinf.textInfo&&!this.opt.drawinf.font&&(this.fonts=await e.PdfFonts.from(c),this.opt.drawinf.font=await this.fonts.getEmbeddedFont(this.opt.drawinf.textInfo.fontData,this.opt.drawinf.textInfo.subset));var d=this.loadP12cert(this.opt.p12cert,this.opt.pwd);a=null;if(d)e.urlFetch&&(a=new e.CertsChain,await a.buildChain(d)&& (this.cchain=a)),e.fixCertAttributes(d);else if(this.tsaFetcher)e.log("No certificate is specified, so only add a document timestamp.");else throw Error("Nothing to do because no certificate nor tsa is specified.");a=this.addSignHolder(c);e.log("A signature holder has been added to the pdf.");1!=this.opt.permission||1!=this.opt.ltv&&2!=this.opt.ltv?await c.flush():(this.cchain||await this.queryTsa("dummy"),await this.addDss(c)?e.log("In order to enable LTV, DSS informations has been added to the pdf."): await c.flush(),this.opt.ltv=0);if(a){if(this.oriU8pdf)e.log("The pdf has been signed already, so we add a new signature to it.");else throw Error("When adding a new signature to a signed pdf, the original literal datas are necessary.");await this.findChangedObjects(c)}else a=e.newRefs.reorderPdfRefs(c,b?!0:!1),b&&(b.pubkeys&&(0==b.pubkeys.length?b.pubkeys.push({c:d}):b.pubkeys.forEach(function(f){f.c||(f.c=d)})),this.cyptr=new e.PdfCryptor(b),b=await this.cyptr.encryptPdf(c,a),console.log(b===c), e.log("Pdf data has been encrypted."));b=await this.saveAndSign(c);b||(e.log("Change size of signature's placeholder and retry."),this.sigContents.value="0".repeat(this.siglen+10),b=await this.saveAndSign(c));0<e.newRefs.size&&e.newRefs.restoreAll();if(b)e.log("Pdf has been signed.");else throw Error("Failed to sign the pdf.");if(c=await this.addDss(b))await this.findChangedObjects(c,!0),b=this.appendIncrement(c),e.log("LTV has been enabled.");return b}async saveAndSign(a){a=this.apobjs&&0<this.apobjs.length? this.appendIncrement(a):await a.save({useObjectStreams:!1});a=e.u8arrToRaw(a)+String.fromCharCode(this.NEWLINE);return await this.signPdf(a)}async findChangedObjects(a,b){const c=this;var d=await PDFLib.PDFDocument.load(c.oriU8pdf,{ignoreEncryption:!0});c.apobjs=[];a.context.enumerateIndirectObjects().forEach(function(f){if(!b||f[0]!=a.context.trailerInfo.Info){var g=d.context.lookup(f[0]);g&&c.isamePdfObject(f[1],g)||(c.cyptr&&c.cyptr.encryptObject(f[0].objectNumber,f[1]),c.apobjs.push(f))}})}appendIncrement(a){const b= this;var c=PDFLib.PDFCrossRefSection.create(),d=b.oriU8pdf.length,f=[];f[0]=b.NEWLINE;d++;b.apobjs.forEach(function(g){var h=b.objEntryToBytes(g,f);c.addEntry(g[0],d);d+=h});c.copyBytesInto(f,f.length);a=PDFLib.PDFWriter.forContext(a.context,0).createTrailerDict();a.set(PDFLib.PDFName.of("Prev"),PDFLib.PDFNumber.of(b.findPrev(b.oriU8pdf)));PDFLib.PDFTrailerDict.of(a).copyBytesInto(f,f.length);f.push(b.NEWLINE);PDFLib.PDFTrailer.forLastCrossRefSectionOffset(d).copyBytesInto(f,f.length);a=new Uint8Array(b.oriU8pdf.length+ f.length);a.set(b.oriU8pdf);a.set(new Uint8Array(f),b.oriU8pdf.length);return a}findPrev(a){const b=e.rawToU8arr("%%EOF");for(var c=0,d="",f=a.length-b.length;0<=f;f--){switch(c){case 0:for(var g=!0,h=0;h<b.length;h++)if(a[f+h]!=b[h]){g=!1;break}g&&(c=1);break;case 1:48<=a[f]&&57>=a[f]&&(d=String.fromCharCode(a[f]),c=2);break;case 2:48<=a[f]&&57>=a[f]?d=String.fromCharCode(a[f])+d:c=9}if(9<=c)break}return parseInt(d,10)}isamePdfObject(a,b){var c=[];a.copyBytesInto(c,0);a=[];b.copyBytesInto(a,0);if(c.length!= a.length)return!1;for(b=0;b<c.length;b++)if(c[b]!=a[b])return!1;return!0}objEntryToBytes(a,b){var c=b.length;a[0].copyBytesInto(b,b.length);PDFLib.copyStringIntoBuffer("obj",b,b.length-1);b[b.length]=this.NEWLINE;a[1].copyBytesInto(b,b.length);b[b.length]=this.NEWLINE;PDFLib.copyStringIntoBuffer("endobj",b,b.length);b[b.length]=this.NEWLINE;return b.length-c}loadP12cert(a,b){const c=this;if(a)"string"!==typeof a&&(a=e.u8arrToRaw(new Uint8Array(a)));else return null;a=forge.asn1.fromDer(a);b=forge.pkcs12.pkcs12FromAsn1(a, !0,b);var d=b.getBags({bagType:forge.pki.oids.certBag})[forge.pki.oids.certBag];b=b.getBags({bagType:forge.pki.oids.pkcs8ShroudedKeyBag})[forge.pki.oids.pkcs8ShroudedKeyBag];c.privateKey=b[0].key;var f=[],g=-1;d&&Object.keys(d).forEach(function(h){h=d[h].cert;f.push(h);0===c.privateKey.n.compareTo(h.publicKey.n)&&0===c.privateKey.e.compareTo(h.publicKey.e)&&(g=f.length)});if(0<g){g--;c.cchain=new e.CertsChain(f);if(c.cchain.getSignCert()!=f[g])throw Error("Chain of certificates is invalid.");return f[g]}throw Error("Failed to find a certificate."); }addSignHolder(a){const b=this.cchain&&1<=this.opt.permission&&3>=this.opt.permission?this.opt.permission:0,c=a.context;var d=new e.SignatureCreator(this.opt.drawinf,a.getPageCount()),f=d.getPageIndexes();const g=a.getPages()[f[0]];var h=d.createStream(a,this.opt.signame);b&&!h&&(h=d.createEmptyField(c),f=[f[0]]);var k=[],l=a.catalog.getOrCreateAcroForm();l.getAllFields().forEach(function(r){r[0]instanceof PDFLib.PDFAcroSignature&&(r=r[0].T(),r instanceof PDFLib.PDFString?k.push(r.asString()):r instanceof PDFLib.PDFHexString&&k.push(r.decodeText()))});if(0<k.length&&b)throw Error("Since the pdf has been signed, can NOT sign with DocMDP. Because the signature field that contains DocMDP must be the first signed field in the document.");var n=this.fixSigName(k,this.opt.signame),m=new Date;this.opt.signdate instanceof Date&&!this.tsaFetcher&&(m=this.opt.signdate);var p=new PDFLib.PDFArray(c);p.push(PDFLib.PDFNumber.of(0));p.push(PDFLib.PDFName.of(this.DEFAULT_BYTE_RANGE_PLACEHOLDER));p.push(PDFLib.PDFName.of(this.DEFAULT_BYTE_RANGE_PLACEHOLDER)); p.push(PDFLib.PDFName.of(this.DEFAULT_BYTE_RANGE_PLACEHOLDER));this.siglen=this.tsaFetcher?this.tsaFetcher.len:3322;this.sigContents=PDFLib.PDFHexString.of("0".repeat(this.siglen));p={Type:"Sig",Filter:"Adobe.PPKLite",SubFilter:"adbe.pkcs7.detached",ByteRange:p,Contents:this.sigContents,Prop_Build:c.obj({App:c.obj({Name:"ZgaPdfSinger"})})};this.cchain?p.M=PDFLib.PDFString.fromDate(m):(p.Type="DocTimeStamp",p.SubFilter="ETSI.RFC3161");b&&(m=new PDFLib.PDFArray(c),m.push(c.obj({Type:"SigRef",TransformMethod:"DocMDP", TransformParams:c.obj({Type:"TransformParams",P:b,V:"1.2"})})),p.Reference=m);this.opt.reason&&(p.Reason=this.convToPDFString(this.opt.reason));this.opt.signame&&(p.Name=this.convToPDFString(this.opt.signame));this.opt.location&&(p.Location=this.convToPDFString(this.opt.location));this.opt.contact&&(p.ContactInfo=this.convToPDFString(this.opt.contact));m=c.register(c.obj(p));d={Type:"Annot",Subtype:"Widget",FT:"Sig",Rect:d.getSignRect(),V:m,T:this.convToPDFString(n),F:132,P:g.ref};h&&(d.AP=c.obj({N:h})); var u=c.register(c.obj(d));f.forEach(function(r){r=a.getPages()[r];var t=r.node.Annots();t||(t=new PDFLib.PDFArray(c),r.node.set(PDFLib.PDFName.Annots,t));t.push(u)});l.dict.lookup(PDFLib.PDFName.of("SigFlags"))||l.dict.set(PDFLib.PDFName.of("SigFlags"),PDFLib.PDFNumber.of(3));l.addField(u);b&&a.catalog.set(PDFLib.PDFName.of("Perms"),c.obj({DocMDP:m}));return 0<k.length}fixSigName(a,b,c){b||(b="Signature",c=1);var d=b;c?d+=c:c=0;return 0<=a.indexOf(d)?this.fixSigName(a,b,c+1):d}convToPDFString(a){for(var b= !1,c=0;c<a.length;c++)if(255<a.charCodeAt(c)){b=!0;break}return b?PDFLib.PDFHexString.fromText(a):PDFLib.PDFString.of(a)}async signPdf(a){const b=this;var c=a.match(/\/ByteRange\s*\[{1}\s*(?:(?:\d*|\/\*{10})\s+){3}(?:\d+|\/\*{10}){1}\s*]{1}/g).find(function(m){return m.includes("/"+b.DEFAULT_BYTE_RANGE_PLACEHOLDER)});if(!c)throw Error("no signature placeholder");var d=a.indexOf(c),f=d+c.length,g=a.indexOf("/Contents ",f),h=a.indexOf("<",g),k=a.indexOf(">",h)+1-h;g=k-2;var l=[0,0,0,0];l[1]=h;l[2]= l[1]+k;l[3]=a.length-l[2];h="/ByteRange ["+l.join(" ")+"]";h+=" ".repeat(c.length-h.length);a=a.slice(0,d)+h+a.slice(f);a=a.slice(0,l[1])+a.slice(l[2],l[2]+l[3]);c=null;if(b.cchain){c=new Date;b.opt.signdate instanceof Date&&!b.tsaFetcher&&(c=b.opt.signdate);var n=null;n=forge.pkcs7.createSignedData();n.content=forge.util.createBuffer(a);b.cchain.getAllCerts().forEach(function(m){n.addCertificate(m)});n.addSigner({key:b.privateKey,certificate:b.cchain.getSignCert(),digestAlgorithm:forge.pki.oids.sha256, authenticatedAttributes:[{type:forge.pki.oids.contentType,value:forge.pki.oids.data},{type:forge.pki.oids.signingTime,value:c},{type:forge.pki.oids.messageDigest}]});n.sign({detached:!0});b.tsaFetcher&&(c=await b.queryTsa(n.signers[0].signature,!0),n.signerInfos[0].value.push(c));c=n.toAsn1()}else c=await b.queryTsa(a);c=forge.asn1.toDer(c);d=c.toHex();b.signature=c.getBytes();e.log("Size of signature is "+d.length+"/"+g);if(d.length>g)return b.siglen=d.length,null;d+="0".repeat(g-d.length);a=a.slice(0, l[1])+"<"+d+">"+a.slice(l[1]);return e.rawToU8arr(a)}async queryTsa(a,b){if(a=await this.tsaFetcher.queryTsa(a))throw Error(a);b=this.tsaFetcher.getToken(b);e.log("Timestamp from "+this.tsaFetcher.url+" has been obtained.");return b}async addDss(a){if(1!=this.opt.ltv&&2!=this.opt.ltv)return null;var b=this.cchain?this.cchain:this.tsaFetcher.getCertsChain();if(b.isSelfSignedCert())return e.log("No need to enable LTV because the certificate is a self signed one."),null;var c=await b.prepareDSSInf(2== this.opt.ltv);if(!c)return null;b=null;a.addPage?b=a:(this.oriU8pdf=a,b=await PDFLib.PDFDocument.load(this.oriU8pdf,{ignoreEncryption:!0}));var d=b.context,f=null,g=null,h=null;c&&c.ocsps&&0<c.ocsps.length&&(g=[],c.ocsps.forEach(function(q){q=d.flateStream(q);g.push(d.register(q))}));c&&c.crls&&0<c.crls.length&&(h=[],c.crls.forEach(function(q){q=d.flateStream(q);h.push(d.register(q))}));if(!g&&!h)return null;c&&c.certs&&0<c.certs.length&&(f=[],c.certs.forEach(function(q){q=forge.pki.certificateToAsn1(q); q=d.flateStream(forge.asn1.toDer(q).getBytes());f.push(d.register(q))}));a="";this.signature&&(a=forge.md.sha1.create(),a.update(this.signature),a=a.digest().toHex().toUpperCase());c=b.catalog.lookupMaybe(PDFLib.PDFName.of("DSS"),PDFLib.PDFDict);var k=null,l=null,n=null,m=null,p=null;a&&(p={TU:PDFLib.PDFString.fromDate(new Date)});var u=null,r=null,t=null;c?(k=c.lookupMaybe(PDFLib.PDFName.of("Certs"),PDFLib.PDFArray),n=c.lookupMaybe(PDFLib.PDFName.of("CRLs"),PDFLib.PDFArray),l=c.lookupMaybe(PDFLib.PDFName.of("OCSPs"), PDFLib.PDFArray),m=c.lookupMaybe(PDFLib.PDFName.of("VRI"),PDFLib.PDFDict)):(c=d.obj({}),b.catalog.set(PDFLib.PDFName.of("DSS"),d.register(c)));f&&(p&&(u=new PDFLib.PDFArray(d),p.Cert=u),k||(k=new PDFLib.PDFArray(d),c.set(PDFLib.PDFName.of("Certs"),d.register(k))),f.forEach(function(q){u&&u.push(q);k.push(q)}));g&&(p&&(r=new PDFLib.PDFArray(d),p.OCSP=r),l||(l=new PDFLib.PDFArray(d),c.set(PDFLib.PDFName.of("OCSPs"),d.register(l))),g.forEach(function(q){r&&r.push(q);l.push(q)}));h&&(p&&(t=new PDFLib.PDFArray(d), p.CRL=t),n||(n=new PDFLib.PDFArray(d),c.set(PDFLib.PDFName.of("CRLs"),d.register(n))),h.forEach(function(q){t&&t.push(q);n.push(q)}));a&&p&&(m||(m=d.obj({}),c.set(PDFLib.PDFName.of("VRI"),d.register(m))),m.set(PDFLib.PDFName.of(a),d.register(d.obj(p))));await b.flush();return b}};e.SignatureCreator=class{constructor(a,b){this.pgidxs=[];this.rect=[0,0,0,0];this.drawinf=null;if(a)if(this.drawinf=a,"string"==typeof this.drawinf.pageidx){a=this.drawinf.pageidx.split(",");var c;for(c=0;c<a.length;c++)if(a[c]){var d= a[c].split("-"),f=d[0]?parseInt(d[0],10):0;for(d=d[d.length-1]?parseInt(d[d.length-1],10):b?b-1:f;f<=d;)this.pgidxs.push(f),f++}}else this.drawinf.pageidx&&(this.pgidxs=[this.drawinf.pageidx]);0==this.pgidxs.length&&(this.pgidxs=[0])}getPageIndexes(){return this.pgidxs}getSignRect(){return this.rect}createEmptyField(a){return a.register(a.obj({Type:"XObject",Subtype:"Form",FormType:1,BBox:[0,0,0,0]}))}createStream(a,b){if(!this.drawinf||!this.drawinf.img&&!this.drawinf.textInfo)return null;var c= a.getPages();if(this.pgidxs[0]<c.length)var d=c[this.pgidxs[0]];else throw Error("Page index is overflow to pdf pages.");c=d.getRotation();c.angle=PDFLib.toDegrees(c)%360;c.type=PDFLib.RotationTypes.Degrees;d=d.getSize();var f=this.drawinf.area,g={},h=b?b.concat("Img"):"SigImg",k=b?b.concat("Font"):"SigFont";b=[];this.drawinf.textInfo&&(g.Font={[k]:this.drawinf.font.ref},b=this.createDrawTextOper(a,c,k,f));k=[];this.drawinf.img&&(g.XObject={[h]:this.drawinf.img.ref},k=PDFLib.drawImage(h,this.calcDrawImgInf(c, this.drawinf.img.size(),f,0==b.length)));f=this.calcAreaInf(d,c.angle,f);this.rect=this.calcRect(c.angle,f);c=a.context.obj({Type:"XObject",Subtype:"Form",FormType:1,BBox:[0,0,f.wDraw,f.hDraw],Resources:g});c=PDFLib.PDFContentStream.of(c,k.concat(b),!0);return a.context.register(c)}calcAreaInf(a,b,c){var d=Object.assign({},c);switch(b){case 90:d.wDraw=c.hDraw;d.hDraw=c.wDraw;d.x=c.y+c.hDraw;d.y=c.x;break;case 180:case -180:d.x=a.width-c.x;d.y=c.y+c.hDraw;break;case 270:case -90:d.wDraw=c.hDraw;d.hDraw= c.wDraw;d.x=a.width-c.y-c.hDraw;d.y=a.height-c.x;break;default:d.y=a.height-c.y-c.hDraw}return d}calcRect(a,b){var c=[0,0,0,0];c[0]=b.x;c[1]=b.y;switch(a){case 90:c[2]=b.x-b.wDraw;c[3]=b.y+b.hDraw;break;case 180:case -180:c[2]=b.x-b.wDraw;c[3]=b.y-b.hDraw;break;case 270:case -90:c[2]=b.x+b.wDraw;c[3]=b.y-b.hDraw;break;default:c[2]=b.x+b.wDraw,c[3]=b.y+b.hDraw}return c}calcDrawImgInf(a,b,c,d){c.wDraw||(c.wDraw=c.w?c.w:b.width);c.hDraw||(c.hDraw=c.h?c.h:b.height);var f=c.wDraw,g=c.hDraw;if(f!=b.width&& g!=b.height){var h=f*b.height/b.width;h<=g?g=h:f=g*b.width/b.height}d&&(c.wDraw=f,c.hDraw=g);b={x:0,y:0,width:f,height:g,rotate:a,xSkew:PDFLib.degrees(0),ySkew:PDFLib.degrees(0)};switch(a.angle){case 0:b.y=c.hDraw-g-b.y;break;case 90:b.x+=g;break;case 180:case -180:b.x=c.wDraw-b.x;b.y+=g;break;case 270:case -90:b.x=c.hDraw-g-b.x,b.y=c.wDraw-b.y}return b}createDrawTextOper(a,b,c,d){const f=this;var g=f.drawinf.textInfo,h=f.drawinf.font,k={x:g.xOffset||0,y:g.yOffset||0,color:f.hexToColor(g.color),font:c, lineHeight:g.lineHeight||h.heightAtSize(g.size,{descender:!0}),size:g.size,rotate:b,xSkew:PDFLib.degrees(0),ySkew:PDFLib.degrees(0)},l=function(t){return h.widthOfTextAtSize(t,g.size)};a=[];var n=!1,m=g.wMax||d.w||0;m?a=f.breakTextIntoLines(g.text,m,l,g.noBreaks):(a=PDFLib.lineSplit(PDFLib.cleanText(g.text)),n=!0);var p=[],u=a.map(function(t){var q=0;t=t.trim();if(n||g.align)q=l(t),p.push(q);n&&(m=Math.max(m,q));return h.encodeText(t)});d.wDraw=d.w?d.w:m+k.x;d.hDraw=d.h?d.h:a.length*k.lineHeight+ k.y;var r=[];g.align?p.forEach(function(t,q){r=r.concat(PDFLib.drawLinesOfText([u[q]],f.calcTextPos(k,d.wDraw,d.hDraw,q,1==g.align?(m-t)/2+k.x:m-t+k.x)))}):r=PDFLib.drawLinesOfText(u,f.calcTextPos(k,d.wDraw,d.hDraw));return r}hexToColor(a){var b=[0,0,0];if(a)if("#"==a.charAt(0)&&(a=a.substring(1)),3==a.length)b[0]=parseInt(a.charAt(0)+a.charAt(0),16),b[1]=parseInt(a.charAt(1)+a.charAt(1),16),b[2]=parseInt(a.charAt(2)+a.charAt(2),16);else if(6==a.length)b[0]=parseInt(a.substring(0,2),16),b[1]=parseInt(a.substring(2, 4),16),b[2]=parseInt(a.substring(4,6),16);else throw Error("The hex string is not a valid color.");return PDFLib.rgb(b[0]/255,b[1]/255,b[2]/255)}breakTextIntoLines(a,b,c,d){var f=PDFLib.cleanText(a);a="";var g=0,h=[],k=new RegExp(d||"[A-Za-z0-9]");d=[];for(var l=0,n=f.length;l<n;){var m=f.charAt(l);k.test(m)?a+=m:(a&&d.push(a),a="",d.push(m));"\r"==m&&l+1<n&&"\n"==f.charAt(l+1)&&l++;l++}a&&d.push(a);a="";l=0;for(n=d.length;l<n;)f=d[l],PDFLib.isNewlineChar(f)?(h.push(a),a="",g=0):(k=c(f),k>b?(0<l&& (h.push(a),a="",g=0),k=this.splitLongWord(f,k,b,c),h=h.concat(k.words),f=k.lastWord,k=k.lastWidth):g+k>b&&(h.push(a),a="",g=0),a+=f,g+=k),l++;a&&h.push(a);return h}splitLongWord(a,b,c,d){for(var f=[],g=a.length;b>c;){var h=Math.floor(g*c/b)-1,k=d(a.substring(0,h+1));if(k>c){for(;k>c;)h--,k-=d(a.charAt(h));h++}else for(;k<c;)if(h++,h<g){var l=k+d(a.charAt(h));if(l>c)break;else k=l}else break;f.push(a.substring(0,h));a=a.substring(h);g-=h;b-=k}return{words:f,lastWord:a,lastWidth:b}}calcTextPos(a,b, c,d,f){var g=Object.assign({},a);d=d||0;f=f||a.x;switch(a.rotate.angle){case 0:g.x=f;g.y=c-a.lineHeight-a.y-a.lineHeight*d;break;case 90:g.x=a.lineHeight+a.y+a.lineHeight*d;g.y=f;break;case 180:case -180:g.x=b-f;g.y=a.lineHeight+a.y+a.lineHeight*d;break;case 270:case -90:g.x=c-a.lineHeight-a.y-a.lineHeight*d,g.y=b-f}return g}};e.PdfFonts=class{constructor(a,b){this.doc=a;this.fonts=b}static async from(a){for(var b=function(m,p){if(m=m.lookupMaybe(PDFLib.PDFName.of(p),PDFLib.PDFName))return m.asString()}, c=[],d=a.context.enumerateIndirectObjects(),f=0;f<d.length;){var g=d[f];f++;if(g[1]instanceof PDFLib.PDFDict&&"/Font"===b(g[1],"Type")){var h=b(g[1],"BaseFont");if(h)if(h=h.substring(1),PDFLib.isStandardFont(h))c.push({font:PDFLib.PDFFont.of(g[0],a,PDFLib.StandardFontEmbedder.for(h))});else{var k=g[1].lookupMaybe(PDFLib.PDFName.of("DescendantFonts"),PDFLib.PDFArray);if(k&&k.size()&&(k=k.lookupMaybe(0,PDFLib.PDFDict))&&(k=k.lookupMaybe(PDFLib.PDFName.of("FontDescriptor"),PDFLib.PDFDict))&&(k=k.lookupMaybe(PDFLib.PDFName.of("FontFile2"), PDFLib.PDFRawStream))){var l=k.getContents();"/FlateDecode"==b(k.dict,"Filter")&&(l=pako.inflate(l));try{var n=await PDFLib.CustomFontEmbedder.for(fontkit,l);c.push({font:PDFLib.PDFFont.of(g[0],a,n),data:l})}catch(m){e.log(h,m.message)}}}}}return new e.PdfFonts(a,c)}async getEmbeddedFont(a,b){if(!a){if(this.fonts.length)return e.log("Use existing default font.",this.fonts[0].font.name),this.fonts[0].font;a="Helvetica";e.log("Use default font.",a)}if("string"==typeof a)return this.getStandardFont(a); a=a instanceof Uint8Array?a:new Uint8Array(a);return await this.getCustomFont(a,b||!1)}getStandardFont(a){for(var b=0;b<this.fonts.length;){var c=this.fonts[b];b++;if(!c.data&&c.font.name==a)return e.log("Existing font found.",c.font.name),c.font}return this.doc.embedStandardFont(a)}async getCustomFont(a,b){for(var c=0;c<this.fonts.length;){var d=this.fonts[c];c++;if(d.data&&this.isSameData(d.data,a))return e.log("Existing font found.",d.font.name),d.font}this.doc.registerFontkit(fontkit);return await this.doc.embedFont(a, {subset:b})}isSameData(a,b){if(a.length!=b.length)return!1;for(var c=0;c<a.length;){if(a[c]!=b[c])return!1;c++}return!0}}};function genZga(){const e={ver:"2.7.5",log:function(...a){e.debug&&console.log(...a)},u8arrToRaw:function(a){for(var b=[],c=0;c<a.length;c++)b.push(String.fromCharCode(a[c]));return b.join("")},rawToU8arr:function(a){for(var b=new Uint8Array(a.length),c=0;c<a.length;c++)b[c]=a.charCodeAt(c);return b}};return e}globalThis.Zga||(globalThis.Zga=genZga(),supplyZgaUrlFetch(globalThis.Zga),supplyZgaCertsChain(globalThis.Zga),supplyZgaCryptor(globalThis.Zga),supplyZgaSigner(globalThis.Zga));