import manifestJSON from '__STATIC_CONTENT_MANIFEST'; import Url from 'url'; import require$$1$1 from 'fs'; import require$$6$1 from 'buffer'; import require$$0, { deprecate, inspect as inspect$2 } from 'util'; import * as crypto__default from 'crypto'; import crypto__default__default from 'crypto'; import * as process$1 from 'process'; import Stream from 'stream'; import require$$0$1 from 'assert'; import require$$4$1 from 'net'; import http from 'http'; import require$$10 from 'stream/web'; import require$$1$2 from 'perf_hooks'; import require$$4$2 from 'util/types'; import require$$0$2 from 'events'; import require$$4$3 from 'tls'; import require$$3 from 'async_hooks'; import require$$1$3 from 'console'; import zlib from 'zlib'; import require$$0$3 from 'punycode'; import https from 'https'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function getAugmentedNamespace(n) { var f = n.default; if (typeof f == "function") { var a = function () { return f.apply(this, arguments); }; a.prototype = f.prototype; } else a = {}; Object.defineProperty(a, '__esModule', {value: true}); Object.keys(n).forEach(function (k) { var d = Object.getOwnPropertyDescriptor(n, k); Object.defineProperty(a, k, d.get ? d : { enumerable: true, get: function () { return n[k]; } }); }); return a; } var dist = {}; /** * @param typeMap [Object] Map of MIME type -> Array[extensions] * @param ... */ function Mime$1() { this._types = Object.create(null); this._extensions = Object.create(null); for (let i = 0; i < arguments.length; i++) { this.define(arguments[i]); } this.define = this.define.bind(this); this.getType = this.getType.bind(this); this.getExtension = this.getExtension.bind(this); } /** * Define mimetype -> extension mappings. Each key is a mime-type that maps * to an array of extensions associated with the type. The first extension is * used as the default extension for the type. * * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); * * If a type declares an extension that has already been defined, an error will * be thrown. To suppress this error and force the extension to be associated * with the new type, pass `force`=true. Alternatively, you may prefix the * extension with "*" to map the type to extension, without mapping the * extension to the type. * * e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']}); * * * @param map (Object) type definitions * @param force (Boolean) if true, force overriding of existing definitions */ Mime$1.prototype.define = function(typeMap, force) { for (let type in typeMap) { let extensions = typeMap[type].map(function(t) { return t.toLowerCase(); }); type = type.toLowerCase(); for (let i = 0; i < extensions.length; i++) { const ext = extensions[i]; // '*' prefix = not the preferred type for this extension. So fixup the // extension, and skip it. if (ext[0] === '*') { continue; } if (!force && (ext in this._types)) { throw new Error( 'Attempt to change mapping for "' + ext + '" extension from "' + this._types[ext] + '" to "' + type + '". Pass `force=true` to allow this, otherwise remove "' + ext + '" from the list of extensions for "' + type + '".' ); } this._types[ext] = type; } // Use first extension as default if (force || !this._extensions[type]) { const ext = extensions[0]; this._extensions[type] = (ext[0] !== '*') ? ext : ext.substr(1); } } }; /** * Lookup a mime type based on extension */ Mime$1.prototype.getType = function(path) { path = String(path); let last = path.replace(/^.*[/\\]/, '').toLowerCase(); let ext = last.replace(/^.*\./, '').toLowerCase(); let hasPath = last.length < path.length; let hasDot = ext.length < last.length - 1; return (hasDot || !hasPath) && this._types[ext] || null; }; /** * Return file extension associated with a mime type */ Mime$1.prototype.getExtension = function(type) { type = /^\s*([^;\s]*)/.test(type) && RegExp.$1; return type && this._extensions[type.toLowerCase()] || null; }; var Mime_1 = Mime$1; var standard = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]}; var other = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}; let Mime = Mime_1; var mime = new Mime(standard, other); var types = {}; Object.defineProperty(types, "__esModule", { value: true }); types.InternalError = types.NotFoundError = types.MethodNotAllowedError = types.KVError = void 0; class KVError extends Error { constructor(message, status = 500) { super(message); // see: typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain this.name = KVError.name; // stack traces display correctly now this.status = status; } } types.KVError = KVError; class MethodNotAllowedError extends KVError { constructor(message = `Not a valid request method`, status = 405) { super(message, status); } } types.MethodNotAllowedError = MethodNotAllowedError; class NotFoundError extends KVError { constructor(message = `Not Found`, status = 404) { super(message, status); } } types.NotFoundError = NotFoundError; class InternalError extends KVError { constructor(message = `Internal Error in KV Asset Handler`, status = 500) { super(message, status); } } types.InternalError = InternalError; (function (exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.InternalError = exports.NotFoundError = exports.MethodNotAllowedError = exports.serveSinglePageApp = exports.mapRequestToAsset = exports.getAssetFromKV = void 0; const mime$1 = mime; const types_1 = types; Object.defineProperty(exports, "MethodNotAllowedError", { enumerable: true, get: function () { return types_1.MethodNotAllowedError; } }); Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return types_1.NotFoundError; } }); Object.defineProperty(exports, "InternalError", { enumerable: true, get: function () { return types_1.InternalError; } }); const defaultCacheControl = { browserTTL: null, edgeTTL: 2 * 60 * 60 * 24, bypassCache: false, // do not bypass Cloudflare's cache }; const parseStringAsObject = (maybeString) => typeof maybeString === 'string' ? JSON.parse(maybeString) : maybeString; const getAssetFromKVDefaultOptions = { ASSET_NAMESPACE: typeof __STATIC_CONTENT !== 'undefined' ? __STATIC_CONTENT : undefined, ASSET_MANIFEST: typeof __STATIC_CONTENT_MANIFEST !== 'undefined' ? parseStringAsObject(__STATIC_CONTENT_MANIFEST) : {}, cacheControl: defaultCacheControl, defaultMimeType: 'text/plain', defaultDocument: 'index.html', pathIsEncoded: false, }; function assignOptions(options) { // Assign any missing options passed in to the default // options.mapRequestToAsset is handled manually later return Object.assign({}, getAssetFromKVDefaultOptions, options); } /** * maps the path of incoming request to the request pathKey to look up * in bucket and in cache * e.g. for a path '/' returns '/index.html' which serves * the content of bucket/index.html * @param {Request} request incoming request */ const mapRequestToAsset = (request, options) => { options = assignOptions(options); const parsedUrl = new URL(request.url); let pathname = parsedUrl.pathname; if (pathname.endsWith('/')) { // If path looks like a directory append options.defaultDocument // e.g. If path is /about/ -> /about/index.html pathname = pathname.concat(options.defaultDocument); } else if (!mime$1.getType(pathname)) { // If path doesn't look like valid content // e.g. /about.me -> /about.me/index.html pathname = pathname.concat('/' + options.defaultDocument); } parsedUrl.pathname = pathname; return new Request(parsedUrl.toString(), request); }; exports.mapRequestToAsset = mapRequestToAsset; /** * maps the path of incoming request to /index.html if it evaluates to * any HTML file. * @param {Request} request incoming request */ function serveSinglePageApp(request, options) { options = assignOptions(options); // First apply the default handler, which already has logic to detect // paths that should map to HTML files. request = mapRequestToAsset(request, options); const parsedUrl = new URL(request.url); // Detect if the default handler decided to map to // a HTML file in some specific directory. if (parsedUrl.pathname.endsWith('.html')) { // If expected HTML file was missing, just return the root index.html (or options.defaultDocument) return new Request(`${parsedUrl.origin}/${options.defaultDocument}`, request); } else { // The default handler decided this is not an HTML page. It's probably // an image, CSS, or JS file. Leave it as-is. return request; } } exports.serveSinglePageApp = serveSinglePageApp; const getAssetFromKV = async (event, options) => { options = assignOptions(options); const request = event.request; const ASSET_NAMESPACE = options.ASSET_NAMESPACE; const ASSET_MANIFEST = parseStringAsObject(options.ASSET_MANIFEST); if (typeof ASSET_NAMESPACE === 'undefined') { throw new types_1.InternalError(`there is no KV namespace bound to the script`); } const rawPathKey = new URL(request.url).pathname.replace(/^\/+/, ''); // strip any preceding /'s let pathIsEncoded = options.pathIsEncoded; let requestKey; // if options.mapRequestToAsset is explicitly passed in, always use it and assume user has own intentions // otherwise handle request as normal, with default mapRequestToAsset below if (options.mapRequestToAsset) { requestKey = options.mapRequestToAsset(request); } else if (ASSET_MANIFEST[rawPathKey]) { requestKey = request; } else if (ASSET_MANIFEST[decodeURIComponent(rawPathKey)]) { pathIsEncoded = true; requestKey = request; } else { const mappedRequest = mapRequestToAsset(request); const mappedRawPathKey = new URL(mappedRequest.url).pathname.replace(/^\/+/, ''); if (ASSET_MANIFEST[decodeURIComponent(mappedRawPathKey)]) { pathIsEncoded = true; requestKey = mappedRequest; } else { // use default mapRequestToAsset requestKey = mapRequestToAsset(request, options); } } const SUPPORTED_METHODS = ['GET', 'HEAD']; if (!SUPPORTED_METHODS.includes(requestKey.method)) { throw new types_1.MethodNotAllowedError(`${requestKey.method} is not a valid request method`); } const parsedUrl = new URL(requestKey.url); const pathname = pathIsEncoded ? decodeURIComponent(parsedUrl.pathname) : parsedUrl.pathname; // decode percentage encoded path only when necessary // pathKey is the file path to look up in the manifest let pathKey = pathname.replace(/^\/+/, ''); // remove prepended / // @ts-ignore const cache = caches.default; let mimeType = mime$1.getType(pathKey) || options.defaultMimeType; if (mimeType.startsWith('text') || mimeType === 'application/javascript') { mimeType += '; charset=utf-8'; } let shouldEdgeCache = false; // false if storing in KV by raw file path i.e. no hash // check manifest for map from file path to hash if (typeof ASSET_MANIFEST !== 'undefined') { if (ASSET_MANIFEST[pathKey]) { pathKey = ASSET_MANIFEST[pathKey]; // if path key is in asset manifest, we can assume it contains a content hash and can be cached shouldEdgeCache = true; } } // TODO this excludes search params from cache, investigate ideal behavior let cacheKey = new Request(`${parsedUrl.origin}/${pathKey}`, request); // if argument passed in for cacheControl is a function then // evaluate that function. otherwise return the Object passed in // or default Object const evalCacheOpts = (() => { switch (typeof options.cacheControl) { case 'function': return options.cacheControl(request); case 'object': return options.cacheControl; default: return defaultCacheControl; } })(); // formats the etag depending on the response context. if the entityId // is invalid, returns an empty string (instead of null) to prevent the // the potentially disastrous scenario where the value of the Etag resp // header is "null". Could be modified in future to base64 encode etc const formatETag = (entityId = pathKey, validatorType = 'strong') => { if (!entityId) { return ''; } switch (validatorType) { case 'weak': if (!entityId.startsWith('W/')) { return `W/${entityId}`; } return entityId; case 'strong': if (entityId.startsWith(`W/"`)) { entityId = entityId.replace('W/', ''); } if (!entityId.endsWith(`"`)) { entityId = `"${entityId}"`; } return entityId; default: return ''; } }; options.cacheControl = Object.assign({}, defaultCacheControl, evalCacheOpts); // override shouldEdgeCache if options say to bypassCache if (options.cacheControl.bypassCache || options.cacheControl.edgeTTL === null || request.method == 'HEAD') { shouldEdgeCache = false; } // only set max-age if explicitly passed in a number as an arg const shouldSetBrowserCache = typeof options.cacheControl.browserTTL === 'number'; let response = null; if (shouldEdgeCache) { response = await cache.match(cacheKey); } if (response) { if (response.status > 300 && response.status < 400) { if (response.body && 'cancel' in Object.getPrototypeOf(response.body)) { // Body exists and environment supports readable streams response.body.cancel(); } response = new Response(null, response); } else { // fixes #165 let opts = { headers: new Headers(response.headers), status: 0, statusText: '', }; opts.headers.set('cf-cache-status', 'HIT'); if (response.status) { opts.status = response.status; opts.statusText = response.statusText; } else if (opts.headers.has('Content-Range')) { opts.status = 206; opts.statusText = 'Partial Content'; } else { opts.status = 200; opts.statusText = 'OK'; } response = new Response(response.body, opts); } } else { const body = await ASSET_NAMESPACE.get(pathKey, 'arrayBuffer'); if (body === null) { throw new types_1.NotFoundError(`could not find ${pathKey} in your content namespace`); } response = new Response(body); if (shouldEdgeCache) { response.headers.set('Accept-Ranges', 'bytes'); response.headers.set('Content-Length', body.length); // set etag before cache insertion if (!response.headers.has('etag')) { response.headers.set('etag', formatETag(pathKey, 'strong')); } // determine Cloudflare cache behavior response.headers.set('Cache-Control', `max-age=${options.cacheControl.edgeTTL}`); event.waitUntil(cache.put(cacheKey, response.clone())); response.headers.set('CF-Cache-Status', 'MISS'); } } response.headers.set('Content-Type', mimeType); if (response.status === 304) { let etag = formatETag(response.headers.get('etag'), 'strong'); let ifNoneMatch = cacheKey.headers.get('if-none-match'); let proxyCacheStatus = response.headers.get('CF-Cache-Status'); if (etag) { if (ifNoneMatch && ifNoneMatch === etag && proxyCacheStatus === 'MISS') { response.headers.set('CF-Cache-Status', 'EXPIRED'); } else { response.headers.set('CF-Cache-Status', 'REVALIDATED'); } response.headers.set('etag', formatETag(etag, 'weak')); } } if (shouldSetBrowserCache) { response.headers.set('Cache-Control', `max-age=${options.cacheControl.browserTTL}`); } else { response.headers.delete('Cache-Control'); } return response; }; exports.getAssetFromKV = getAssetFromKV; } (dist)); var manifest = { "/*404": [ { type: "script", href: "/assets/_...404_.ac850218.js" }, { type: "script", href: "/assets/entry-client.32008a39.js" }, { type: "style", href: "/assets/entry-client.d870915a.css" } ], "/": [ { type: "script", href: "/assets/index.e5bc4111.js" }, { type: "script", href: "/assets/entry-client.32008a39.js" }, { type: "style", href: "/assets/entry-client.d870915a.css" }, { type: "style", href: "/assets/index.fdb6b3cf.css" } ], "entry-client": [ { type: "script", href: "/assets/entry-client.32008a39.js" }, { type: "style", href: "/assets/entry-client.d870915a.css" } ], "index.html": [ ] }; const ERROR = Symbol("error"); const BRANCH = Symbol("branch"); function castError(err) { if (err instanceof Error || typeof err === "string") return err; return new Error("Unknown error"); } function handleError$1(err) { err = castError(err); const fns = lookup(Owner, ERROR); if (!fns) throw err; for (const f of fns) f(err); } const UNOWNED = { context: null, owner: null }; let Owner = null; function createRoot(fn, detachedOwner) { detachedOwner && (Owner = detachedOwner); const owner = Owner, root = fn.length === 0 ? UNOWNED : { context: null, owner }; Owner = root; let result; try { result = fn(() => {}); } catch (err) { handleError$1(err); } finally { Owner = owner; } return result; } function createSignal(value, options) { return [() => value, v => { return value = typeof v === "function" ? v(value) : v; }]; } function createComputed(fn, value) { Owner = { owner: Owner, context: null }; try { fn(value); } catch (err) { handleError$1(err); } finally { Owner = Owner.owner; } } const createRenderEffect = createComputed; function createMemo(fn, value) { Owner = { owner: Owner, context: null }; let v; try { v = fn(value); } catch (err) { handleError$1(err); } finally { Owner = Owner.owner; } return () => v; } function batch(fn) { return fn(); } const untrack = batch; function on(deps, fn, options = {}) { const isArray = Array.isArray(deps); const defer = options.defer; return () => { if (defer) return undefined; let value; if (isArray) { value = []; for (let i = 0; i < deps.length; i++) value.push(deps[i]()); } else value = deps(); return fn(value); }; } function onCleanup(fn) { let node; if (Owner && (node = lookup(Owner, BRANCH))) { if (!node.cleanups) node.cleanups = [fn];else node.cleanups.push(fn); } return fn; } function cleanNode(node) { if (node.cleanups) { for (let i = 0; i < node.cleanups.length; i++) node.cleanups[i](); node.cleanups = undefined; } } function onError(fn) { if (Owner) { if (Owner.context === null) Owner.context = { [ERROR]: [fn] };else if (!Owner.context[ERROR]) Owner.context[ERROR] = [fn];else Owner.context[ERROR].push(fn); } } function createContext(defaultValue) { const id = Symbol("context"); return { id, Provider: createProvider(id), defaultValue }; } function useContext(context) { let ctx; return (ctx = lookup(Owner, context.id)) !== undefined ? ctx : context.defaultValue; } function getOwner() { return Owner; } function children(fn) { const memo = createMemo(() => resolveChildren(fn())); memo.toArray = () => { const c = memo(); return Array.isArray(c) ? c : c != null ? [c] : []; }; return memo; } function runWithOwner(o, fn) { const prev = Owner; Owner = o; try { return fn(); } catch (err) { handleError$1(err); } finally { Owner = prev; } } function lookup(owner, key) { return owner ? owner.context && owner.context[key] !== undefined ? owner.context[key] : lookup(owner.owner, key) : undefined; } function resolveChildren(children) { if (typeof children === "function" && !children.length) return resolveChildren(children()); if (Array.isArray(children)) { const results = []; for (let i = 0; i < children.length; i++) { const result = resolveChildren(children[i]); Array.isArray(result) ? results.push.apply(results, result) : results.push(result); } return results; } return children; } function createProvider(id) { return function provider(props) { return createMemo(() => { Owner.context = { [id]: props.value }; return children(() => props.children); }); }; } function resolveSSRNode$1(node) { const t = typeof node; if (t === "string") return node; if (node == null || t === "boolean") return ""; if (Array.isArray(node)) { let mapped = ""; for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode$1(node[i]); return mapped; } if (t === "object") return node.t; if (t === "function") return resolveSSRNode$1(node()); return String(node); } const sharedConfig = {}; function setHydrateContext(context) { sharedConfig.context = context; } function nextHydrateContext() { return sharedConfig.context ? { ...sharedConfig.context, id: `${sharedConfig.context.id}${sharedConfig.context.count++}-`, count: 0 } : undefined; } function createUniqueId() { const ctx = sharedConfig.context; if (!ctx) throw new Error(`createUniqueId cannot be used under non-hydrating context`); return `${ctx.id}${ctx.count++}`; } function createComponent(Comp, props) { if (sharedConfig.context && !sharedConfig.context.noHydrate) { const c = sharedConfig.context; setHydrateContext(nextHydrateContext()); const r = Comp(props || {}); setHydrateContext(c); return r; } return Comp(props || {}); } function Show(props) { let c; return props.when ? typeof (c = props.children) === "function" ? c(props.when) : c : props.fallback || ""; } function ErrorBoundary$1(props) { let error, res, clean, sync = true; const ctx = sharedConfig.context; const id = ctx.id + ctx.count; function displayFallback() { cleanNode(clean); ctx.writeResource(id, error, true); setHydrateContext({ ...ctx, count: 0 }); const f = props.fallback; return typeof f === "function" && f.length ? f(error, () => {}) : f; } onError(err => { error = err; !sync && ctx.replace("e" + id, displayFallback); sync = true; }); onCleanup(() => cleanNode(clean)); createMemo(() => { Owner.context = { [BRANCH]: clean = {} }; return res = props.children; }); if (error) return displayFallback(); sync = false; return { t: `${resolveSSRNode$1(res)}` }; } const SuspenseContext = createContext(); function suspenseComplete(c) { for (const r of c.resources.values()) { if (r.loading) return false; } return true; } function useTransition() { return [() => false, fn => { fn(); }]; } function Suspense(props) { let done; let clean; const ctx = sharedConfig.context; const id = ctx.id + ctx.count; const o = Owner; if (o) { if (o.context) o.context[BRANCH] = clean = {};else o.context = { [BRANCH]: clean = {} }; } const value = ctx.suspense[id] || (ctx.suspense[id] = { resources: new Map(), completed: () => { const res = runSuspense(); if (suspenseComplete(value)) { done(resolveSSRNode$1(res)); } } }); function runSuspense() { setHydrateContext({ ...ctx, count: 0 }); return runWithOwner(o, () => { return createComponent(SuspenseContext.Provider, { value, get children() { clean && cleanNode(clean); return props.children; } }); }); } const res = runSuspense(); if (suspenseComplete(value)) return res; onError(err => { if (!done || !done(undefined, err)) { if (o) runWithOwner(o.owner, () => { throw err; });else throw err; } }); done = ctx.async ? ctx.registerFragment(id) : undefined; if (ctx.async) { setHydrateContext({ ...ctx, count: 0, id: ctx.id + "0.f", noHydrate: true }); const res = { t: `${resolveSSRNode$1(props.fallback)}` }; setHydrateContext(ctx); return res; } setHydrateContext({ ...ctx, count: 0, id: ctx.id + "0.f" }); ctx.writeResource(id, "$$f"); return props.fallback; } const booleans = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected"]; const BooleanAttributes = /*#__PURE__*/new Set(booleans); /*#__PURE__*/new Set(["className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans]); const ChildProperties = /*#__PURE__*/new Set(["innerHTML", "textContent", "innerText", "children"]); const Aliases = { className: "class", htmlFor: "for" }; const { hasOwnProperty: hasOwnProperty$1 } = Object.prototype; const REF_START_CHARS = "hjkmoquxzABCDEFGHIJKLNPQRTUVWXYZ$_"; const REF_START_CHARS_LEN = REF_START_CHARS.length; const REF_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$_"; const REF_CHARS_LEN = REF_CHARS.length; const STACK = []; const BUFFER$1 = [""]; let ASSIGNMENTS = new Map(); let INDEX_OR_REF = new WeakMap(); let REF_COUNT = 0; BUFFER$1.pop(); function stringify(root) { if (writeProp(root, "")) { let result = BUFFER$1[0]; for (let i = 1, len = BUFFER$1.length; i < len; i++) { result += BUFFER$1[i]; } if (REF_COUNT) { if (ASSIGNMENTS.size) { let ref = INDEX_OR_REF.get(root); if (typeof ref === "number") { ref = toRefParam(REF_COUNT++); result = ref + "=" + result; } for (const [assignmentRef, assignments] of ASSIGNMENTS) { result += ";" + assignments + assignmentRef; } result += ";return " + ref; ASSIGNMENTS = new Map(); } else { result = "return " + result; } result = "(function(" + refParamsString() + "){" + result + "}())"; } else if (root && root.constructor === Object) { result = "(" + result + ")"; } BUFFER$1.length = 0; INDEX_OR_REF = new WeakMap(); return result; } return "void 0"; } function writeProp(cur, accessor) { switch (typeof cur) { case "string": BUFFER$1.push(quote(cur, 0)); break; case "number": BUFFER$1.push(cur + ""); break; case "boolean": BUFFER$1.push(cur ? "!0" : "!1"); break; case "object": if (cur === null) { BUFFER$1.push("null"); } else { const ref = getRef(cur, accessor); switch (ref) { case true: return false; case false: switch (cur.constructor) { case Object: writeObject(cur); break; case Array: writeArray(cur); break; case Date: BUFFER$1.push('new Date("' + cur.toISOString() + '")'); break; case RegExp: BUFFER$1.push(cur + ""); break; case Map: BUFFER$1.push("new Map("); writeArray(Array.from(cur)); BUFFER$1.push(")"); break; case Set: BUFFER$1.push("new Set("); writeArray(Array.from(cur)); BUFFER$1.push(")"); break; case undefined: BUFFER$1.push("Object.assign(Object.create(null),"); writeObject(cur); BUFFER$1.push("))"); break; default: return false; } break; default: BUFFER$1.push(ref); break; } } break; default: return false; } return true; } function writeObject(obj) { let sep = "{"; STACK.push(obj); for (const key in obj) { if (hasOwnProperty$1.call(obj, key)) { const val = obj[key]; const escapedKey = toObjectKey(key); BUFFER$1.push(sep + escapedKey + ":"); if (writeProp(val, escapedKey)) { sep = ","; } else { BUFFER$1.pop(); } } } if (sep === "{") { BUFFER$1.push("{}"); } else { BUFFER$1.push("}"); } STACK.pop(); } function writeArray(arr) { BUFFER$1.push("["); STACK.push(arr); writeProp(arr[0], 0); for (let i = 1, len = arr.length; i < len; i++) { BUFFER$1.push(","); writeProp(arr[i], i); } STACK.pop(); BUFFER$1.push("]"); } function getRef(cur, accessor) { let ref = INDEX_OR_REF.get(cur); if (ref === undefined) { INDEX_OR_REF.set(cur, BUFFER$1.length); return false; } if (typeof ref === "number") { ref = insertAndGetRef(cur, ref); } if (STACK.includes(cur)) { const parent = STACK[STACK.length - 1]; let parentRef = INDEX_OR_REF.get(parent); if (typeof parentRef === "number") { parentRef = insertAndGetRef(parent, parentRef); } ASSIGNMENTS.set(ref, (ASSIGNMENTS.get(ref) || "") + toAssignment(parentRef, accessor) + "="); return true; } return ref; } function toObjectKey(name) { const invalidIdentifierPos = getInvalidIdentifierPos(name); return invalidIdentifierPos === -1 ? name : quote(name, invalidIdentifierPos); } function toAssignment(parent, key) { return parent + (typeof key === "number" || key[0] === '"' ? "[" + key + "]" : "." + key); } function getInvalidIdentifierPos(name) { let char = name[0]; if (!(char >= "a" && char <= "z" || char >= "A" && char <= "Z" || char === "$" || char === "_")) { return 0; } for (let i = 1, len = name.length; i < len; i++) { char = name[i]; if (!(char >= "a" && char <= "z" || char >= "A" && char <= "Z" || char >= "0" && char <= "9" || char === "$" || char === "_")) { return i; } } return -1; } function quote(str, startPos) { let result = ""; let lastPos = 0; for (let i = startPos, len = str.length; i < len; i++) { let replacement; switch (str[i]) { case '"': replacement = '\\"'; break; case "\\": replacement = "\\\\"; break; case "<": replacement = "\\x3C"; break; case "\n": replacement = "\\n"; break; case "\r": replacement = "\\r"; break; case "\u2028": replacement = "\\u2028"; break; case "\u2029": replacement = "\\u2029"; break; default: continue; } result += str.slice(lastPos, i) + replacement; lastPos = i + 1; } if (lastPos === startPos) { result = str; } else { result += str.slice(lastPos); } return '"' + result + '"'; } function insertAndGetRef(obj, pos) { const ref = toRefParam(REF_COUNT++); INDEX_OR_REF.set(obj, ref); if (pos) { BUFFER$1[pos - 1] += ref + "="; } else { BUFFER$1[pos] = ref + "=" + BUFFER$1[pos]; } return ref; } function refParamsString() { let result = REF_START_CHARS[0]; for (let i = 1; i < REF_COUNT; i++) { result += "," + toRefParam(i); } REF_COUNT = 0; return result; } function toRefParam(index) { let mod = index % REF_START_CHARS_LEN; let ref = REF_START_CHARS[mod]; index = (index - mod) / REF_START_CHARS_LEN; while (index > 0) { mod = index % REF_CHARS_LEN; ref += REF_CHARS[mod]; index = (index - mod) / REF_CHARS_LEN; } return ref; } const REPLACE_SCRIPT = `function $df(e,t,d,l){d=document.getElementById(e),(l=document.getElementById("pl-"+e))&&l.replaceWith(...d.childNodes),d.remove(),_$HY.set(e,t)}`; function renderToStringAsync(code, options = {}) { const { timeoutMs = 30000 } = options; let timeoutHandle; const timeout = new Promise((_, reject) => { timeoutHandle = setTimeout(() => reject("renderToString timed out"), timeoutMs); }); return Promise.race([renderToStream(code, options), timeout]).then(html => { clearTimeout(timeoutHandle); return html; }); } function renderToStream(code, options = {}) { let { nonce, onCompleteShell, onCompleteAll, renderId } = options; const blockingResources = []; const registry = new Map(); const dedupe = new WeakMap(); const checkEnd = () => { if (!registry.size && !completed) { writeTasks(); onCompleteAll && onCompleteAll({ write(v) { !completed && buffer.write(v); } }); writable && writable.end(); completed = true; } }; const pushTask = task => { tasks += task + ";"; if (!scheduled && firstFlushed) { Promise.resolve().then(writeTasks); scheduled = true; } }; const writeTasks = () => { if (tasks.length && !completed && firstFlushed) { buffer.write(`${tasks}`); tasks = ""; } scheduled = false; }; let context; let writable; let tmp = ""; let tasks = ""; let firstFlushed = false; let completed = false; let scriptFlushed = false; let scheduled = true; let buffer = { write(payload) { tmp += payload; } }; sharedConfig.context = context = { id: renderId || "", count: 0, async: true, resources: {}, suspense: {}, assets: [], nonce, block(p) { if (!firstFlushed) blockingResources.push(p); }, replace(id, payloadFn) { if (firstFlushed) return; const placeholder = ``; const first = html.indexOf(placeholder); if (first === -1) return; const last = html.indexOf(``, first + placeholder.length); html = html.replace(html.slice(first, last + placeholder.length + 1), resolveSSRNode(payloadFn())); }, writeResource(id, p, error, wait) { if (error) return pushTask(serializeSet(dedupe, id, p, serializeError)); if (!p || typeof p !== "object" || !("then" in p)) return pushTask(serializeSet(dedupe, id, p)); if (!firstFlushed) wait && blockingResources.push(p);else pushTask(`_$HY.init("${id}")`); p.then(d => { !completed && pushTask(serializeSet(dedupe, id, d)); }).catch(() => { !completed && pushTask(`_$HY.set("${id}", {})`); }); }, registerFragment(key) { if (!registry.has(key)) { registry.set(key, []); firstFlushed && pushTask(`_$HY.init("${key}")`); } return (value, error) => { if (registry.has(key)) { const keys = registry.get(key); registry.delete(key); if (waitForFragments(registry, key)) return; if ((value !== undefined || error) && !completed) { if (!firstFlushed) { Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : "")); error && pushTask(serializeSet(dedupe, key, error, serializeError)); } else { buffer.write(``); pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + serializeError(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`); scriptFlushed = true; } } } if (!registry.size) Promise.resolve().then(checkEnd); return firstFlushed; }; } }; let html = resolveSSRNode(escape$1(code())); function doShell() { sharedConfig.context = context; context.noHydrate = true; html = injectAssets(context.assets, html); for (const key in context.resources) { if (!("data" in context.resources[key] || context.resources[key].ref[0].error)) pushTask(`_$HY.init("${key}")`); } for (const key of registry.keys()) pushTask(`_$HY.init("${key}")`); if (tasks.length) html = injectScripts(html, tasks, nonce); buffer.write(html); tasks = ""; scheduled = false; onCompleteShell && onCompleteShell({ write(v) { !completed && buffer.write(v); } }); } return { then(fn) { function complete() { doShell(); fn(tmp); } if (onCompleteAll) { ogComplete = onCompleteAll; onCompleteAll = options => { ogComplete(options); complete(); }; } else onCompleteAll = complete; if (!registry.size) Promise.resolve().then(checkEnd); }, pipe(w) { Promise.allSettled(blockingResources).then(() => { doShell(); buffer = writable = w; buffer.write(tmp); firstFlushed = true; if (completed) writable.end();else setTimeout(checkEnd); }); }, pipeTo(w) { Promise.allSettled(blockingResources).then(() => { doShell(); const encoder = new TextEncoder(); const writer = w.getWriter(); writable = { end() { writer.releaseLock(); w.close(); } }; buffer = { write(payload) { writer.write(encoder.encode(payload)); } }; buffer.write(tmp); firstFlushed = true; if (completed) writable.end();else setTimeout(checkEnd); }); } }; } function Assets(props) { useAssets(() => props.children); } function HydrationScript(props) { const { nonce } = sharedConfig.context; return ssr(generateHydrationScript({ nonce, ...props })); } function NoHydration(props) { const c = sharedConfig.context; c.noHydrate = true; const children = props.children; c.noHydrate = false; return children; } function ssr(t, ...nodes) { if (nodes.length) { let result = ""; for (let i = 0; i < nodes.length; i++) { result += t[i]; const node = nodes[i]; if (node !== undefined) result += resolveSSRNode(node); } t = result + t[nodes.length]; } return { t }; } function ssrClassList(value) { if (!value) return ""; let classKeys = Object.keys(value), result = ""; for (let i = 0, len = classKeys.length; i < len; i++) { const key = classKeys[i], classValue = !!value[key]; if (!key || !classValue) continue; i && (result += " "); result += key; } return result; } function ssrStyle(value) { if (!value) return ""; if (typeof value === "string") return value; let result = ""; const k = Object.keys(value); for (let i = 0; i < k.length; i++) { const s = k[i]; if (i) result += ";"; result += `${s}:${escape$1(value[s], true)}`; } return result; } function ssrElement(tag, props, children, needsId) { let result = `<${tag}${needsId ? ssrHydrationKey() : ""} `; if (props == null) props = {};else if (typeof props === "function") props = props(); const keys = Object.keys(props); let classResolved; for (let i = 0; i < keys.length; i++) { const prop = keys[i]; if (ChildProperties.has(prop)) { if (children === undefined) children = prop === "innerHTML" ? props[prop] : escape$1(props[prop]); continue; } const value = props[prop]; if (prop === "style") { result += `style="${ssrStyle(value)}"`; } else if (prop === "class" || prop === "className" || prop === "classList") { if (classResolved) continue; let n; result += `class="${(n = props.class) ? n + " " : ""}${(n = props.className) ? n + " " : ""}${ssrClassList(props.classList)}"`; classResolved = true; } else if (BooleanAttributes.has(prop)) { if (value) result += prop;else continue; } else if (value == undefined || prop === "ref" || prop.slice(0, 2) === "on") { continue; } else { result += `${Aliases[prop] || prop}="${escape$1(value, true)}"`; } if (i !== keys.length - 1) result += " "; } return { t: result + `>${resolveSSRNode(children)}` }; } function ssrAttribute(key, value, isBoolean) { return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : ""; } function ssrHydrationKey() { const hk = getHydrationKey(); return hk ? ` data-hk="${hk}"` : ""; } function escape$1(s, attr) { const t = typeof s; if (t !== "string") { if (!attr && t === "function") return escape$1(s(), attr); if (!attr && Array.isArray(s)) { let r = ""; for (let i = 0; i < s.length; i++) r += resolveSSRNode(escape$1(s[i], attr)); return { t: r }; } if (attr && t === "boolean") return String(s); return s; } const delim = attr ? '"' : "<"; const escDelim = attr ? """ : "<"; let iDelim = s.indexOf(delim); let iAmp = s.indexOf("&"); if (iDelim < 0 && iAmp < 0) return s; let left = 0, out = ""; while (iDelim >= 0 && iAmp >= 0) { if (iDelim < iAmp) { if (left < iDelim) out += s.substring(left, iDelim); out += escDelim; left = iDelim + 1; iDelim = s.indexOf(delim, left); } else { if (left < iAmp) out += s.substring(left, iAmp); out += "&"; left = iAmp + 1; iAmp = s.indexOf("&", left); } } if (iDelim >= 0) { do { if (left < iDelim) out += s.substring(left, iDelim); out += escDelim; left = iDelim + 1; iDelim = s.indexOf(delim, left); } while (iDelim >= 0); } else while (iAmp >= 0) { if (left < iAmp) out += s.substring(left, iAmp); out += "&"; left = iAmp + 1; iAmp = s.indexOf("&", left); } return left < s.length ? out + s.substring(left) : out; } function resolveSSRNode(node) { const t = typeof node; if (t === "string") return node; if (node == null || t === "boolean") return ""; if (Array.isArray(node)) { let mapped = ""; for (let i = 0, len = node.length; i < len; i++) mapped += resolveSSRNode(node[i]); return mapped; } if (t === "object") return node.t; if (t === "function") return resolveSSRNode(node()); return String(node); } function getHydrationKey() { const hydrate = sharedConfig.context; return hydrate && !hydrate.noHydrate && `${hydrate.id}${hydrate.count++}`; } function useAssets(fn) { sharedConfig.context.assets.push(() => resolveSSRNode(fn())); } function generateHydrationScript({ eventNames = ["click", "input"], nonce } = {}) { return `var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=t=>e.r[t];`; } function injectAssets(assets, html) { if (!assets || !assets.length) return html; let out = ""; for (let i = 0, len = assets.length; i < len; i++) out += assets[i](); return html.replace(``, out + ``); } function injectScripts(html, scripts, nonce) { const tag = `${scripts}`; const index = html.indexOf(""); if (index > -1) { return html.slice(0, index) + tag + html.slice(index); } return html + tag; } function serializeError(error) { if (error.message) { const fields = {}; const keys = Object.getOwnPropertyNames(error); for (let i = 0; i < keys.length; i++) { const key = keys[i]; const value = error[key]; if (!value || key !== "message" && typeof value !== "function") { fields[key] = value; } } return `Object.assign(new Error(${stringify(error.message)}), ${stringify(fields)})`; } return stringify(error); } function waitForFragments(registry, key) { for (const k of [...registry.keys()].reverse()) { if (key.startsWith(k)) { registry.get(k).push(key); return true; } } return false; } function serializeSet(registry, key, value, serializer = stringify) { const exist = registry.get(value); if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`; value !== null && typeof value === "object" && registry.set(value, key); return `_$HY.set("${key}", ${serializer(value)})`; } function replacePlaceholder(html, key, value) { const nextRegex = /(<[/]?span[^>]*>)/g; const marker = ``; const first = html.indexOf(marker); if (first === -1) return html; nextRegex.lastIndex = first + marker.length; let match; let open = 0, close = 0; while (match = nextRegex.exec(html)) { if (match[0][1] === "/") { close++; if (close > open) break; } else open++; } return html.slice(0, first) + value + html.slice(nextRegex.lastIndex); } const isServer = true; /** * This enum is used only internally in order to create nominal type for the disabled plugin */ var EnableIfBranded; (function (EnableIfBranded) { EnableIfBranded[EnableIfBranded["DisabledPlugin"] = 0] = "DisabledPlugin"; })(EnableIfBranded || (EnableIfBranded = {})); function isPluginEnabled(t) { return t !== EnableIfBranded.DisabledPlugin && t !== null; } /** * Utility function to enable a plugin. */ function enableIf(condition, plugin) { if (condition) { return typeof plugin === 'function' ? plugin() : plugin; } return EnableIfBranded.DisabledPlugin; } // Note: This file is autogenerated using "resources/gen-version.js" script and /** * An object containing the components of the GraphQL.js version string */ const versionInfo = Object.freeze({ major: 16, minor: 6, patch: 0, preReleaseTag: null, }); function devAssert(condition, message) { const booleanCondition = Boolean(condition); if (!booleanCondition) { throw new Error(message); } } /** * Returns true if the value acts like a Promise, i.e. has a "then" function, * otherwise returns false. */ function isPromise(value) { return ( typeof (value === null || value === void 0 ? void 0 : value.then) === 'function' ); } /** * Return true if `value` is object-like. A value is object-like if it's not * `null` and has a `typeof` result of "object". */ function isObjectLike(value) { return typeof value == 'object' && value !== null; } function invariant$1(condition, message) { const booleanCondition = Boolean(condition); if (!booleanCondition) { throw new Error( message != null ? message : 'Unexpected invariant triggered.', ); } } const LineRegExp = /\r\n|[\n\r]/g; /** * Represents a location in a Source. */ /** * Takes a Source and a UTF-8 character offset, and returns the corresponding * line and column as a SourceLocation. */ function getLocation(source, position) { let lastLineStart = 0; let line = 1; for (const match of source.body.matchAll(LineRegExp)) { typeof match.index === 'number' || invariant$1(false); if (match.index >= position) { break; } lastLineStart = match.index + match[0].length; line += 1; } return { line, column: position + 1 - lastLineStart, }; } /** * Render a helpful description of the location in the GraphQL Source document. */ function printLocation(location) { return printSourceLocation( location.source, getLocation(location.source, location.start), ); } /** * Render a helpful description of the location in the GraphQL Source document. */ function printSourceLocation(source, sourceLocation) { const firstLineColumnOffset = source.locationOffset.column - 1; const body = ''.padStart(firstLineColumnOffset) + source.body; const lineIndex = sourceLocation.line - 1; const lineOffset = source.locationOffset.line - 1; const lineNum = sourceLocation.line + lineOffset; const columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0; const columnNum = sourceLocation.column + columnOffset; const locationStr = `${source.name}:${lineNum}:${columnNum}\n`; const lines = body.split(/\r\n|[\n\r]/g); const locationLine = lines[lineIndex]; // Special case for minified documents if (locationLine.length > 120) { const subLineIndex = Math.floor(columnNum / 80); const subLineColumnNum = columnNum % 80; const subLines = []; for (let i = 0; i < locationLine.length; i += 80) { subLines.push(locationLine.slice(i, i + 80)); } return ( locationStr + printPrefixedLines([ [`${lineNum} |`, subLines[0]], ...subLines.slice(1, subLineIndex + 1).map((subLine) => ['|', subLine]), ['|', '^'.padStart(subLineColumnNum)], ['|', subLines[subLineIndex + 1]], ]) ); } return ( locationStr + printPrefixedLines([ // Lines specified like this: ["prefix", "string"], [`${lineNum - 1} |`, lines[lineIndex - 1]], [`${lineNum} |`, locationLine], ['|', '^'.padStart(columnNum)], [`${lineNum + 1} |`, lines[lineIndex + 1]], ]) ); } function printPrefixedLines(lines) { const existingLines = lines.filter(([_, line]) => line !== undefined); const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length)); return existingLines .map(([prefix, line]) => prefix.padStart(padLen) + (line ? ' ' + line : '')) .join('\n'); } function toNormalizedOptions(args) { const firstArg = args[0]; if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { return { nodes: firstArg, source: args[1], positions: args[2], path: args[3], originalError: args[4], extensions: args[5], }; } return firstArg; } /** * A GraphQLError describes an Error found during the parse, validate, or * execute phases of performing a GraphQL operation. In addition to a message * and stack trace, it also includes information about the locations in a * GraphQL document and/or execution result that correspond to the Error. */ class GraphQLError extends Error { /** * An array of `{ line, column }` locations within the source GraphQL document * which correspond to this error. * * Errors during validation often contain multiple locations, for example to * point out two things with the same name. Errors during execution include a * single location, the field which produced the error. * * Enumerable, and appears in the result of JSON.stringify(). */ /** * An array describing the JSON-path into the execution response which * corresponds to this error. Only included for errors during execution. * * Enumerable, and appears in the result of JSON.stringify(). */ /** * An array of GraphQL AST Nodes corresponding to this error. */ /** * The source GraphQL document for the first location of this error. * * Note that if this Error represents more than one node, the source may not * represent nodes after the first node. */ /** * An array of character offsets within the source GraphQL document * which correspond to this error. */ /** * The original error thrown from a field resolver during execution. */ /** * Extension fields to add to the formatted error. */ /** * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. */ constructor(message, ...rawArgs) { var _this$nodes, _nodeLocations$, _ref; const { nodes, source, positions, path, originalError, extensions } = toNormalizedOptions(rawArgs); super(message); this.name = 'GraphQLError'; this.path = path !== null && path !== void 0 ? path : undefined; this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; // Compute list of blame nodes. this.nodes = undefinedIfEmpty( Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined, ); const nodeLocations = undefinedIfEmpty( (_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map((node) => node.loc).filter((loc) => loc != null), ); // Compute locations in the source for the given nodes/positions. this.source = source !== null && source !== void 0 ? source : nodeLocations === null || nodeLocations === void 0 ? void 0 : (_nodeLocations$ = nodeLocations[0]) === null || _nodeLocations$ === void 0 ? void 0 : _nodeLocations$.source; this.positions = positions !== null && positions !== void 0 ? positions : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map((loc) => loc.start); this.locations = positions && source ? positions.map((pos) => getLocation(source, pos)) : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map((loc) => getLocation(loc.source, loc.start)); const originalExtensions = isObjectLike( originalError === null || originalError === void 0 ? void 0 : originalError.extensions, ) ? originalError === null || originalError === void 0 ? void 0 : originalError.extensions : undefined; this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); // Only properties prescribed by the spec should be enumerable. // Keep the rest as non-enumerable. Object.defineProperties(this, { message: { writable: true, enumerable: true, }, name: { enumerable: false, }, nodes: { enumerable: false, }, source: { enumerable: false, }, positions: { enumerable: false, }, originalError: { enumerable: false, }, }); // Include (non-enumerable) stack trace. /* c8 ignore start */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 if ( originalError !== null && originalError !== void 0 && originalError.stack ) { Object.defineProperty(this, 'stack', { value: originalError.stack, writable: true, configurable: true, }); } else if (Error.captureStackTrace) { Error.captureStackTrace(this, GraphQLError); } else { Object.defineProperty(this, 'stack', { value: Error().stack, writable: true, configurable: true, }); } /* c8 ignore stop */ } get [Symbol.toStringTag]() { return 'GraphQLError'; } toString() { let output = this.message; if (this.nodes) { for (const node of this.nodes) { if (node.loc) { output += '\n\n' + printLocation(node.loc); } } } else if (this.source && this.locations) { for (const location of this.locations) { output += '\n\n' + printSourceLocation(this.source, location); } } return output; } toJSON() { const formattedError = { message: this.message, }; if (this.locations != null) { formattedError.locations = this.locations; } if (this.path != null) { formattedError.path = this.path; } if (this.extensions != null && Object.keys(this.extensions).length > 0) { formattedError.extensions = this.extensions; } return formattedError; } } function undefinedIfEmpty(array) { return array === undefined || array.length === 0 ? undefined : array; } /** * Produces a GraphQLError representing a syntax error, containing useful * descriptive information about the syntax error's position in the source. */ function syntaxError(source, position, description) { return new GraphQLError(`Syntax Error: ${description}`, { source, positions: [position], }); } /** * Contains a range of UTF-8 character offsets and token references that * identify the region of the source from which the AST derived. */ class Location { /** * The character offset at which this Node begins. */ /** * The character offset at which this Node ends. */ /** * The Token at which this Node begins. */ /** * The Token at which this Node ends. */ /** * The Source document the AST represents. */ constructor(startToken, endToken, source) { this.start = startToken.start; this.end = endToken.end; this.startToken = startToken; this.endToken = endToken; this.source = source; } get [Symbol.toStringTag]() { return 'Location'; } toJSON() { return { start: this.start, end: this.end, }; } } /** * Represents a range of characters represented by a lexical token * within a Source. */ class Token { /** * The kind of Token. */ /** * The character offset at which this Node begins. */ /** * The character offset at which this Node ends. */ /** * The 1-indexed line number on which this Token appears. */ /** * The 1-indexed column number at which this Token begins. */ /** * For non-punctuation tokens, represents the interpreted value of the token. * * Note: is undefined for punctuation tokens, but typed as string for * convenience in the parser. */ /** * Tokens exist as nodes in a double-linked-list amongst all tokens * including ignored tokens. is always the first node and * the last. */ constructor(kind, start, end, line, column, value) { this.kind = kind; this.start = start; this.end = end; this.line = line; this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.value = value; this.prev = null; this.next = null; } get [Symbol.toStringTag]() { return 'Token'; } toJSON() { return { kind: this.kind, value: this.value, line: this.line, column: this.column, }; } } /** * The list of all possible AST node types. */ /** * @internal */ const QueryDocumentKeys = { Name: [], Document: ['definitions'], OperationDefinition: [ 'name', 'variableDefinitions', 'directives', 'selectionSet', ], VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], Argument: ['name', 'value'], FragmentSpread: ['name', 'directives'], InlineFragment: ['typeCondition', 'directives', 'selectionSet'], FragmentDefinition: [ 'name', // Note: fragment variable definitions are deprecated and will removed in v17.0.0 'variableDefinitions', 'typeCondition', 'directives', 'selectionSet', ], IntValue: [], FloatValue: [], StringValue: [], BooleanValue: [], NullValue: [], EnumValue: [], ListValue: ['values'], ObjectValue: ['fields'], ObjectField: ['name', 'value'], Directive: ['name', 'arguments'], NamedType: ['name'], ListType: ['type'], NonNullType: ['type'], SchemaDefinition: ['description', 'directives', 'operationTypes'], OperationTypeDefinition: ['type'], ScalarTypeDefinition: ['description', 'name', 'directives'], ObjectTypeDefinition: [ 'description', 'name', 'interfaces', 'directives', 'fields', ], FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'], InputValueDefinition: [ 'description', 'name', 'type', 'defaultValue', 'directives', ], InterfaceTypeDefinition: [ 'description', 'name', 'interfaces', 'directives', 'fields', ], UnionTypeDefinition: ['description', 'name', 'directives', 'types'], EnumTypeDefinition: ['description', 'name', 'directives', 'values'], EnumValueDefinition: ['description', 'name', 'directives'], InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'], DirectiveDefinition: ['description', 'name', 'arguments', 'locations'], SchemaExtension: ['directives', 'operationTypes'], ScalarTypeExtension: ['name', 'directives'], ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'], InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'], UnionTypeExtension: ['name', 'directives', 'types'], EnumTypeExtension: ['name', 'directives', 'values'], InputObjectTypeExtension: ['name', 'directives', 'fields'], }; const kindValues = new Set(Object.keys(QueryDocumentKeys)); /** * @internal */ function isNode(maybeNode) { const maybeKind = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; return typeof maybeKind === 'string' && kindValues.has(maybeKind); } /** Name */ var OperationTypeNode; (function (OperationTypeNode) { OperationTypeNode['QUERY'] = 'query'; OperationTypeNode['MUTATION'] = 'mutation'; OperationTypeNode['SUBSCRIPTION'] = 'subscription'; })(OperationTypeNode || (OperationTypeNode = {})); /** * The set of allowed directive location values. */ var DirectiveLocation$1; (function (DirectiveLocation) { DirectiveLocation['QUERY'] = 'QUERY'; DirectiveLocation['MUTATION'] = 'MUTATION'; DirectiveLocation['SUBSCRIPTION'] = 'SUBSCRIPTION'; DirectiveLocation['FIELD'] = 'FIELD'; DirectiveLocation['FRAGMENT_DEFINITION'] = 'FRAGMENT_DEFINITION'; DirectiveLocation['FRAGMENT_SPREAD'] = 'FRAGMENT_SPREAD'; DirectiveLocation['INLINE_FRAGMENT'] = 'INLINE_FRAGMENT'; DirectiveLocation['VARIABLE_DEFINITION'] = 'VARIABLE_DEFINITION'; DirectiveLocation['SCHEMA'] = 'SCHEMA'; DirectiveLocation['SCALAR'] = 'SCALAR'; DirectiveLocation['OBJECT'] = 'OBJECT'; DirectiveLocation['FIELD_DEFINITION'] = 'FIELD_DEFINITION'; DirectiveLocation['ARGUMENT_DEFINITION'] = 'ARGUMENT_DEFINITION'; DirectiveLocation['INTERFACE'] = 'INTERFACE'; DirectiveLocation['UNION'] = 'UNION'; DirectiveLocation['ENUM'] = 'ENUM'; DirectiveLocation['ENUM_VALUE'] = 'ENUM_VALUE'; DirectiveLocation['INPUT_OBJECT'] = 'INPUT_OBJECT'; DirectiveLocation['INPUT_FIELD_DEFINITION'] = 'INPUT_FIELD_DEFINITION'; })(DirectiveLocation$1 || (DirectiveLocation$1 = {})); /** * The enum type representing the directive location values. * * @deprecated Please use `DirectiveLocation`. Will be remove in v17. */ /** * The set of allowed kind values for AST nodes. */ var Kind; (function (Kind) { Kind['NAME'] = 'Name'; Kind['DOCUMENT'] = 'Document'; Kind['OPERATION_DEFINITION'] = 'OperationDefinition'; Kind['VARIABLE_DEFINITION'] = 'VariableDefinition'; Kind['SELECTION_SET'] = 'SelectionSet'; Kind['FIELD'] = 'Field'; Kind['ARGUMENT'] = 'Argument'; Kind['FRAGMENT_SPREAD'] = 'FragmentSpread'; Kind['INLINE_FRAGMENT'] = 'InlineFragment'; Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition'; Kind['VARIABLE'] = 'Variable'; Kind['INT'] = 'IntValue'; Kind['FLOAT'] = 'FloatValue'; Kind['STRING'] = 'StringValue'; Kind['BOOLEAN'] = 'BooleanValue'; Kind['NULL'] = 'NullValue'; Kind['ENUM'] = 'EnumValue'; Kind['LIST'] = 'ListValue'; Kind['OBJECT'] = 'ObjectValue'; Kind['OBJECT_FIELD'] = 'ObjectField'; Kind['DIRECTIVE'] = 'Directive'; Kind['NAMED_TYPE'] = 'NamedType'; Kind['LIST_TYPE'] = 'ListType'; Kind['NON_NULL_TYPE'] = 'NonNullType'; Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition'; Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition'; Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition'; Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition'; Kind['FIELD_DEFINITION'] = 'FieldDefinition'; Kind['INPUT_VALUE_DEFINITION'] = 'InputValueDefinition'; Kind['INTERFACE_TYPE_DEFINITION'] = 'InterfaceTypeDefinition'; Kind['UNION_TYPE_DEFINITION'] = 'UnionTypeDefinition'; Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition'; Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition'; Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition'; Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition'; Kind['SCHEMA_EXTENSION'] = 'SchemaExtension'; Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension'; Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension'; Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension'; Kind['UNION_TYPE_EXTENSION'] = 'UnionTypeExtension'; Kind['ENUM_TYPE_EXTENSION'] = 'EnumTypeExtension'; Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension'; })(Kind || (Kind = {})); /** * The enum type representing the possible kind values of AST nodes. * * @deprecated Please use `Kind`. Will be remove in v17. */ /** * ``` * WhiteSpace :: * - "Horizontal Tab (U+0009)" * - "Space (U+0020)" * ``` * @internal */ function isWhiteSpace(code) { return code === 0x0009 || code === 0x0020; } /** * ``` * Digit :: one of * - `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` * ``` * @internal */ function isDigit$1(code) { return code >= 0x0030 && code <= 0x0039; } /** * ``` * Letter :: one of * - `A` `B` `C` `D` `E` `F` `G` `H` `I` `J` `K` `L` `M` * - `N` `O` `P` `Q` `R` `S` `T` `U` `V` `W` `X` `Y` `Z` * - `a` `b` `c` `d` `e` `f` `g` `h` `i` `j` `k` `l` `m` * - `n` `o` `p` `q` `r` `s` `t` `u` `v` `w` `x` `y` `z` * ``` * @internal */ function isLetter(code) { return ( (code >= 0x0061 && code <= 0x007a) || // A-Z (code >= 0x0041 && code <= 0x005a) // a-z ); } /** * ``` * NameStart :: * - Letter * - `_` * ``` * @internal */ function isNameStart(code) { return isLetter(code) || code === 0x005f; } /** * ``` * NameContinue :: * - Letter * - Digit * - `_` * ``` * @internal */ function isNameContinue(code) { return isLetter(code) || isDigit$1(code) || code === 0x005f; } /** * Produces the value of a block string from its parsed raw value, similar to * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc. * * This implements the GraphQL spec's BlockStringValue() static algorithm. * * @internal */ function dedentBlockStringLines(lines) { var _firstNonEmptyLine2; let commonIndent = Number.MAX_SAFE_INTEGER; let firstNonEmptyLine = null; let lastNonEmptyLine = -1; for (let i = 0; i < lines.length; ++i) { var _firstNonEmptyLine; const line = lines[i]; const indent = leadingWhitespace$1(line); if (indent === line.length) { continue; // skip empty lines } firstNonEmptyLine = (_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : i; lastNonEmptyLine = i; if (i !== 0 && indent < commonIndent) { commonIndent = indent; } } return lines // Remove common indentation from all lines but first. .map((line, i) => (i === 0 ? line : line.slice(commonIndent))) // Remove leading and trailing blank lines. .slice( (_firstNonEmptyLine2 = firstNonEmptyLine) !== null && _firstNonEmptyLine2 !== void 0 ? _firstNonEmptyLine2 : 0, lastNonEmptyLine + 1, ); } function leadingWhitespace$1(str) { let i = 0; while (i < str.length && isWhiteSpace(str.charCodeAt(i))) { ++i; } return i; } /** * Print a block string in the indented block form by adding a leading and * trailing blank line. However, if a block string starts with whitespace and is * a single-line, adding a leading blank line would strip that whitespace. * * @internal */ function printBlockString$1(value, options) { const escapedValue = value.replace(/"""/g, '\\"""'); // Expand a block string's raw value into independent lines. const lines = escapedValue.split(/\r\n|[\n\r]/g); const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line const forceLeadingNewLine = lines.length > 1 && lines .slice(1) .every((line) => line.length === 0 || isWhiteSpace(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); // Trailing quote (single or double) or slash forces trailing new line const hasTrailingQuote = value.endsWith('"') && !hasTrailingTripleQuotes; const hasTrailingSlash = value.endsWith('\\'); const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash; const printAsMultipleLines = !(options !== null && options !== void 0 && options.minimize) && // add leading and trailing new lines only if it improves readability (!isSingleLine || value.length > 70 || forceTrailingNewline || forceLeadingNewLine || hasTrailingTripleQuotes); let result = ''; // Format a multi-line block quote to account for leading space. const skipLeadingNewLine = isSingleLine && isWhiteSpace(value.charCodeAt(0)); if ((printAsMultipleLines && !skipLeadingNewLine) || forceLeadingNewLine) { result += '\n'; } result += escapedValue; if (printAsMultipleLines || forceTrailingNewline) { result += '\n'; } return '"""' + result + '"""'; } /** * An exported enum describing the different kinds of tokens that the * lexer emits. */ var TokenKind; (function (TokenKind) { TokenKind['SOF'] = ''; TokenKind['EOF'] = ''; TokenKind['BANG'] = '!'; TokenKind['DOLLAR'] = '$'; TokenKind['AMP'] = '&'; TokenKind['PAREN_L'] = '('; TokenKind['PAREN_R'] = ')'; TokenKind['SPREAD'] = '...'; TokenKind['COLON'] = ':'; TokenKind['EQUALS'] = '='; TokenKind['AT'] = '@'; TokenKind['BRACKET_L'] = '['; TokenKind['BRACKET_R'] = ']'; TokenKind['BRACE_L'] = '{'; TokenKind['PIPE'] = '|'; TokenKind['BRACE_R'] = '}'; TokenKind['NAME'] = 'Name'; TokenKind['INT'] = 'Int'; TokenKind['FLOAT'] = 'Float'; TokenKind['STRING'] = 'String'; TokenKind['BLOCK_STRING'] = 'BlockString'; TokenKind['COMMENT'] = 'Comment'; })(TokenKind || (TokenKind = {})); /** * The enum type representing the token kinds values. * * @deprecated Please use `TokenKind`. Will be remove in v17. */ /** * Given a Source object, creates a Lexer for that source. * A Lexer is a stateful stream generator in that every time * it is advanced, it returns the next token in the Source. Assuming the * source lexes, the final Token emitted by the lexer will be of kind * EOF, after which the lexer will repeatedly return the same EOF token * whenever called. */ class Lexer { /** * The previously focused non-ignored token. */ /** * The currently focused non-ignored token. */ /** * The (1-indexed) line containing the current token. */ /** * The character offset at which the current line begins. */ constructor(source) { const startOfFileToken = new Token(TokenKind.SOF, 0, 0, 0, 0); this.source = source; this.lastToken = startOfFileToken; this.token = startOfFileToken; this.line = 1; this.lineStart = 0; } get [Symbol.toStringTag]() { return 'Lexer'; } /** * Advances the token stream to the next non-ignored token. */ advance() { this.lastToken = this.token; const token = (this.token = this.lookahead()); return token; } /** * Looks ahead and returns the next non-ignored token, but does not change * the state of Lexer. */ lookahead() { let token = this.token; if (token.kind !== TokenKind.EOF) { do { if (token.next) { token = token.next; } else { // Read the next token and form a link in the token linked-list. const nextToken = readNextToken(this, token.end); // @ts-expect-error next is only mutable during parsing. token.next = nextToken; // @ts-expect-error prev is only mutable during parsing. nextToken.prev = token; token = nextToken; } } while (token.kind === TokenKind.COMMENT); } return token; } } /** * @internal */ function isPunctuatorTokenKind(kind) { return ( kind === TokenKind.BANG || kind === TokenKind.DOLLAR || kind === TokenKind.AMP || kind === TokenKind.PAREN_L || kind === TokenKind.PAREN_R || kind === TokenKind.SPREAD || kind === TokenKind.COLON || kind === TokenKind.EQUALS || kind === TokenKind.AT || kind === TokenKind.BRACKET_L || kind === TokenKind.BRACKET_R || kind === TokenKind.BRACE_L || kind === TokenKind.PIPE || kind === TokenKind.BRACE_R ); } /** * A Unicode scalar value is any Unicode code point except surrogate code * points. In other words, the inclusive ranges of values 0x0000 to 0xD7FF and * 0xE000 to 0x10FFFF. * * SourceCharacter :: * - "Any Unicode scalar value" */ function isUnicodeScalarValue(code) { return ( (code >= 0x0000 && code <= 0xd7ff) || (code >= 0xe000 && code <= 0x10ffff) ); } /** * The GraphQL specification defines source text as a sequence of unicode scalar * values (which Unicode defines to exclude surrogate code points). However * JavaScript defines strings as a sequence of UTF-16 code units which may * include surrogates. A surrogate pair is a valid source character as it * encodes a supplementary code point (above U+FFFF), but unpaired surrogate * code points are not valid source characters. */ function isSupplementaryCodePoint(body, location) { return ( isLeadingSurrogate(body.charCodeAt(location)) && isTrailingSurrogate(body.charCodeAt(location + 1)) ); } function isLeadingSurrogate(code) { return code >= 0xd800 && code <= 0xdbff; } function isTrailingSurrogate(code) { return code >= 0xdc00 && code <= 0xdfff; } /** * Prints the code point (or end of file reference) at a given location in a * source for use in error messages. * * Printable ASCII is printed quoted, while other points are printed in Unicode * code point form (ie. U+1234). */ function printCodePointAt(lexer, location) { const code = lexer.source.body.codePointAt(location); if (code === undefined) { return TokenKind.EOF; } else if (code >= 0x0020 && code <= 0x007e) { // Printable ASCII const char = String.fromCodePoint(code); return char === '"' ? "'\"'" : `"${char}"`; } // Unicode code point return 'U+' + code.toString(16).toUpperCase().padStart(4, '0'); } /** * Create a token with line and column location information. */ function createToken(lexer, kind, start, end, value) { const line = lexer.line; const col = 1 + start - lexer.lineStart; return new Token(kind, start, end, line, col, value); } /** * Gets the next token from the source starting at the given position. * * This skips over whitespace until it finds the next lexable token, then lexes * punctuators immediately or calls the appropriate helper function for more * complicated tokens. */ function readNextToken(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start; while (position < bodyLength) { const code = body.charCodeAt(position); // SourceCharacter switch (code) { // Ignored :: // - UnicodeBOM // - WhiteSpace // - LineTerminator // - Comment // - Comma // // UnicodeBOM :: "Byte Order Mark (U+FEFF)" // // WhiteSpace :: // - "Horizontal Tab (U+0009)" // - "Space (U+0020)" // // Comma :: , case 0xfeff: // case 0x0009: // \t case 0x0020: // case 0x002c: // , ++position; continue; // LineTerminator :: // - "New Line (U+000A)" // - "Carriage Return (U+000D)" [lookahead != "New Line (U+000A)"] // - "Carriage Return (U+000D)" "New Line (U+000A)" case 0x000a: // \n ++position; ++lexer.line; lexer.lineStart = position; continue; case 0x000d: // \r if (body.charCodeAt(position + 1) === 0x000a) { position += 2; } else { ++position; } ++lexer.line; lexer.lineStart = position; continue; // Comment case 0x0023: // # return readComment(lexer, position); // Token :: // - Punctuator // - Name // - IntValue // - FloatValue // - StringValue // // Punctuator :: one of ! $ & ( ) ... : = @ [ ] { | } case 0x0021: // ! return createToken(lexer, TokenKind.BANG, position, position + 1); case 0x0024: // $ return createToken(lexer, TokenKind.DOLLAR, position, position + 1); case 0x0026: // & return createToken(lexer, TokenKind.AMP, position, position + 1); case 0x0028: // ( return createToken(lexer, TokenKind.PAREN_L, position, position + 1); case 0x0029: // ) return createToken(lexer, TokenKind.PAREN_R, position, position + 1); case 0x002e: // . if ( body.charCodeAt(position + 1) === 0x002e && body.charCodeAt(position + 2) === 0x002e ) { return createToken(lexer, TokenKind.SPREAD, position, position + 3); } break; case 0x003a: // : return createToken(lexer, TokenKind.COLON, position, position + 1); case 0x003d: // = return createToken(lexer, TokenKind.EQUALS, position, position + 1); case 0x0040: // @ return createToken(lexer, TokenKind.AT, position, position + 1); case 0x005b: // [ return createToken(lexer, TokenKind.BRACKET_L, position, position + 1); case 0x005d: // ] return createToken(lexer, TokenKind.BRACKET_R, position, position + 1); case 0x007b: // { return createToken(lexer, TokenKind.BRACE_L, position, position + 1); case 0x007c: // | return createToken(lexer, TokenKind.PIPE, position, position + 1); case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); // StringValue case 0x0022: // " if ( body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 ) { return readBlockString(lexer, position); } return readString(lexer, position); } // IntValue | FloatValue (Digit | -) if (isDigit$1(code) || code === 0x002d) { return readNumber(lexer, position, code); } // Name if (isNameStart(code)) { return readName(lexer, position); } throw syntaxError( lexer.source, position, code === 0x0027 ? 'Unexpected single quote character (\'), did you mean to use a double quote (")?' : isUnicodeScalarValue(code) || isSupplementaryCodePoint(body, position) ? `Unexpected character: ${printCodePointAt(lexer, position)}.` : `Invalid character: ${printCodePointAt(lexer, position)}.`, ); } return createToken(lexer, TokenKind.EOF, bodyLength, bodyLength); } /** * Reads a comment token from the source file. * * ``` * Comment :: # CommentChar* [lookahead != CommentChar] * * CommentChar :: SourceCharacter but not LineTerminator * ``` */ function readComment(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { const code = body.charCodeAt(position); // LineTerminator (\n | \r) if (code === 0x000a || code === 0x000d) { break; } // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { position += 2; } else { break; } } return createToken( lexer, TokenKind.COMMENT, start, position, body.slice(start + 1, position), ); } /** * Reads a number token from the source file, either a FloatValue or an IntValue * depending on whether a FractionalPart or ExponentPart is encountered. * * ``` * IntValue :: IntegerPart [lookahead != {Digit, `.`, NameStart}] * * IntegerPart :: * - NegativeSign? 0 * - NegativeSign? NonZeroDigit Digit* * * NegativeSign :: - * * NonZeroDigit :: Digit but not `0` * * FloatValue :: * - IntegerPart FractionalPart ExponentPart [lookahead != {Digit, `.`, NameStart}] * - IntegerPart FractionalPart [lookahead != {Digit, `.`, NameStart}] * - IntegerPart ExponentPart [lookahead != {Digit, `.`, NameStart}] * * FractionalPart :: . Digit+ * * ExponentPart :: ExponentIndicator Sign? Digit+ * * ExponentIndicator :: one of `e` `E` * * Sign :: one of + - * ``` */ function readNumber(lexer, start, firstCode) { const body = lexer.source.body; let position = start; let code = firstCode; let isFloat = false; // NegativeSign (-) if (code === 0x002d) { code = body.charCodeAt(++position); } // Zero (0) if (code === 0x0030) { code = body.charCodeAt(++position); if (isDigit$1(code)) { throw syntaxError( lexer.source, position, `Invalid number, unexpected digit after 0: ${printCodePointAt( lexer, position, )}.`, ); } } else { position = readDigits(lexer, position, code); code = body.charCodeAt(position); } // Full stop (.) if (code === 0x002e) { isFloat = true; code = body.charCodeAt(++position); position = readDigits(lexer, position, code); code = body.charCodeAt(position); } // E e if (code === 0x0045 || code === 0x0065) { isFloat = true; code = body.charCodeAt(++position); // + - if (code === 0x002b || code === 0x002d) { code = body.charCodeAt(++position); } position = readDigits(lexer, position, code); code = body.charCodeAt(position); } // Numbers cannot be followed by . or NameStart if (code === 0x002e || isNameStart(code)) { throw syntaxError( lexer.source, position, `Invalid number, expected digit but got: ${printCodePointAt( lexer, position, )}.`, ); } return createToken( lexer, isFloat ? TokenKind.FLOAT : TokenKind.INT, start, position, body.slice(start, position), ); } /** * Returns the new position in the source after reading one or more digits. */ function readDigits(lexer, start, firstCode) { if (!isDigit$1(firstCode)) { throw syntaxError( lexer.source, start, `Invalid number, expected digit but got: ${printCodePointAt( lexer, start, )}.`, ); } const body = lexer.source.body; let position = start + 1; // +1 to skip first firstCode while (isDigit$1(body.charCodeAt(position))) { ++position; } return position; } /** * Reads a single-quote string token from the source file. * * ``` * StringValue :: * - `""` [lookahead != `"`] * - `"` StringCharacter+ `"` * * StringCharacter :: * - SourceCharacter but not `"` or `\` or LineTerminator * - `\u` EscapedUnicode * - `\` EscapedCharacter * * EscapedUnicode :: * - `{` HexDigit+ `}` * - HexDigit HexDigit HexDigit HexDigit * * EscapedCharacter :: one of `"` `\` `/` `b` `f` `n` `r` `t` * ``` */ function readString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; let chunkStart = position; let value = ''; while (position < bodyLength) { const code = body.charCodeAt(position); // Closing Quote (") if (code === 0x0022) { value += body.slice(chunkStart, position); return createToken(lexer, TokenKind.STRING, start, position + 1, value); } // Escape Sequence (\) if (code === 0x005c) { value += body.slice(chunkStart, position); const escape = body.charCodeAt(position + 1) === 0x0075 // u ? body.charCodeAt(position + 2) === 0x007b // { ? readEscapedUnicodeVariableWidth(lexer, position) : readEscapedUnicodeFixedWidth(lexer, position) : readEscapedCharacter(lexer, position); value += escape.value; position += escape.size; chunkStart = position; continue; } // LineTerminator (\n | \r) if (code === 0x000a || code === 0x000d) { break; } // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { position += 2; } else { throw syntaxError( lexer.source, position, `Invalid character within String: ${printCodePointAt( lexer, position, )}.`, ); } } throw syntaxError(lexer.source, position, 'Unterminated string.'); } // The string value and lexed size of an escape sequence. function readEscapedUnicodeVariableWidth(lexer, position) { const body = lexer.source.body; let point = 0; let size = 3; // Cannot be larger than 12 chars (\u{00000000}). while (size < 12) { const code = body.charCodeAt(position + size++); // Closing Brace (}) if (code === 0x007d) { // Must be at least 5 chars (\u{0}) and encode a Unicode scalar value. if (size < 5 || !isUnicodeScalarValue(point)) { break; } return { value: String.fromCodePoint(point), size, }; } // Append this hex digit to the code point. point = (point << 4) | readHexDigit(code); if (point < 0) { break; } } throw syntaxError( lexer.source, position, `Invalid Unicode escape sequence: "${body.slice( position, position + size, )}".`, ); } function readEscapedUnicodeFixedWidth(lexer, position) { const body = lexer.source.body; const code = read16BitHexCode(body, position + 2); if (isUnicodeScalarValue(code)) { return { value: String.fromCodePoint(code), size: 6, }; } // GraphQL allows JSON-style surrogate pair escape sequences, but only when // a valid pair is formed. if (isLeadingSurrogate(code)) { // \u if ( body.charCodeAt(position + 6) === 0x005c && body.charCodeAt(position + 7) === 0x0075 ) { const trailingCode = read16BitHexCode(body, position + 8); if (isTrailingSurrogate(trailingCode)) { // JavaScript defines strings as a sequence of UTF-16 code units and // encodes Unicode code points above U+FFFF using a surrogate pair of // code units. Since this is a surrogate pair escape sequence, just // include both codes into the JavaScript string value. Had JavaScript // not been internally based on UTF-16, then this surrogate pair would // be decoded to retrieve the supplementary code point. return { value: String.fromCodePoint(code, trailingCode), size: 12, }; } } } throw syntaxError( lexer.source, position, `Invalid Unicode escape sequence: "${body.slice(position, position + 6)}".`, ); } /** * Reads four hexadecimal characters and returns the positive integer that 16bit * hexadecimal string represents. For example, "000f" will return 15, and "dead" * will return 57005. * * Returns a negative number if any char was not a valid hexadecimal digit. */ function read16BitHexCode(body, position) { // readHexDigit() returns -1 on error. ORing a negative value with any other // value always produces a negative value. return ( (readHexDigit(body.charCodeAt(position)) << 12) | (readHexDigit(body.charCodeAt(position + 1)) << 8) | (readHexDigit(body.charCodeAt(position + 2)) << 4) | readHexDigit(body.charCodeAt(position + 3)) ); } /** * Reads a hexadecimal character and returns its positive integer value (0-15). * * '0' becomes 0, '9' becomes 9 * 'A' becomes 10, 'F' becomes 15 * 'a' becomes 10, 'f' becomes 15 * * Returns -1 if the provided character code was not a valid hexadecimal digit. * * HexDigit :: one of * - `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` * - `A` `B` `C` `D` `E` `F` * - `a` `b` `c` `d` `e` `f` */ function readHexDigit(code) { return code >= 0x0030 && code <= 0x0039 // 0-9 ? code - 0x0030 : code >= 0x0041 && code <= 0x0046 // A-F ? code - 0x0037 : code >= 0x0061 && code <= 0x0066 // a-f ? code - 0x0057 : -1; } /** * | Escaped Character | Code Point | Character Name | * | ----------------- | ---------- | ---------------------------- | * | `"` | U+0022 | double quote | * | `\` | U+005C | reverse solidus (back slash) | * | `/` | U+002F | solidus (forward slash) | * | `b` | U+0008 | backspace | * | `f` | U+000C | form feed | * | `n` | U+000A | line feed (new line) | * | `r` | U+000D | carriage return | * | `t` | U+0009 | horizontal tab | */ function readEscapedCharacter(lexer, position) { const body = lexer.source.body; const code = body.charCodeAt(position + 1); switch (code) { case 0x0022: // " return { value: '\u0022', size: 2, }; case 0x005c: // \ return { value: '\u005c', size: 2, }; case 0x002f: // / return { value: '\u002f', size: 2, }; case 0x0062: // b return { value: '\u0008', size: 2, }; case 0x0066: // f return { value: '\u000c', size: 2, }; case 0x006e: // n return { value: '\u000a', size: 2, }; case 0x0072: // r return { value: '\u000d', size: 2, }; case 0x0074: // t return { value: '\u0009', size: 2, }; } throw syntaxError( lexer.source, position, `Invalid character escape sequence: "${body.slice( position, position + 2, )}".`, ); } /** * Reads a block string token from the source file. * * ``` * StringValue :: * - `"""` BlockStringCharacter* `"""` * * BlockStringCharacter :: * - SourceCharacter but not `"""` or `\"""` * - `\"""` * ``` */ function readBlockString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let lineStart = lexer.lineStart; let position = start + 3; let chunkStart = position; let currentLine = ''; const blockLines = []; while (position < bodyLength) { const code = body.charCodeAt(position); // Closing Triple-Quote (""") if ( code === 0x0022 && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 ) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); const token = createToken( lexer, TokenKind.BLOCK_STRING, start, position + 3, // Return a string of the lines joined with U+000A. dedentBlockStringLines(blockLines).join('\n'), ); lexer.line += blockLines.length - 1; lexer.lineStart = lineStart; return token; } // Escaped Triple-Quote (\""") if ( code === 0x005c && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 && body.charCodeAt(position + 3) === 0x0022 ) { currentLine += body.slice(chunkStart, position); chunkStart = position + 1; // skip only slash position += 4; continue; } // LineTerminator if (code === 0x000a || code === 0x000d) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); if (code === 0x000d && body.charCodeAt(position + 1) === 0x000a) { position += 2; } else { ++position; } currentLine = ''; chunkStart = position; lineStart = position; continue; } // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { position += 2; } else { throw syntaxError( lexer.source, position, `Invalid character within String: ${printCodePointAt( lexer, position, )}.`, ); } } throw syntaxError(lexer.source, position, 'Unterminated string.'); } /** * Reads an alphanumeric + underscore name from the source. * * ``` * Name :: * - NameStart NameContinue* [lookahead != NameContinue] * ``` */ function readName(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { const code = body.charCodeAt(position); if (isNameContinue(code)) { ++position; } else { break; } } return createToken( lexer, TokenKind.NAME, start, position, body.slice(start, position), ); } const MAX_ARRAY_LENGTH = 10; const MAX_RECURSIVE_DEPTH$1 = 2; /** * Used to print values in error messages. */ function inspect$1(value) { return formatValue$1(value, []); } function formatValue$1(value, seenValues) { switch (typeof value) { case 'string': return JSON.stringify(value); case 'function': return value.name ? `[function ${value.name}]` : '[function]'; case 'object': return formatObjectValue$1(value, seenValues); default: return String(value); } } function formatObjectValue$1(value, previouslySeenValues) { if (value === null) { return 'null'; } if (previouslySeenValues.includes(value)) { return '[Circular]'; } const seenValues = [...previouslySeenValues, value]; if (isJSONable$1(value)) { const jsonValue = value.toJSON(); // check for infinite recursion if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue$1(jsonValue, seenValues); } } else if (Array.isArray(value)) { return formatArray$1(value, seenValues); } return formatObject$1(value, seenValues); } function isJSONable$1(value) { return typeof value.toJSON === 'function'; } function formatObject$1(object, seenValues) { const entries = Object.entries(object); if (entries.length === 0) { return '{}'; } if (seenValues.length > MAX_RECURSIVE_DEPTH$1) { return '[' + getObjectTag$1(object) + ']'; } const properties = entries.map( ([key, value]) => key + ': ' + formatValue$1(value, seenValues), ); return '{ ' + properties.join(', ') + ' }'; } function formatArray$1(array, seenValues) { if (array.length === 0) { return '[]'; } if (seenValues.length > MAX_RECURSIVE_DEPTH$1) { return '[Array]'; } const len = Math.min(MAX_ARRAY_LENGTH, array.length); const remaining = array.length - len; const items = []; for (let i = 0; i < len; ++i) { items.push(formatValue$1(array[i], seenValues)); } if (remaining === 1) { items.push('... 1 more item'); } else if (remaining > 1) { items.push(`... ${remaining} more items`); } return '[' + items.join(', ') + ']'; } function getObjectTag$1(object) { const tag = Object.prototype.toString .call(object) .replace(/^\[object /, '') .replace(/]$/, ''); if (tag === 'Object' && typeof object.constructor === 'function') { const name = object.constructor.name; if (typeof name === 'string' && name !== '') { return name; } } return tag; } /** * A replacement for instanceof which includes an error warning when multi-realm * constructors are detected. * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production * See: https://webpack.js.org/guides/production/ */ const instanceOf = /* c8 ignore next 6 */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 // eslint-disable-next-line no-undef process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { return value instanceof constructor; } : function instanceOf(value, constructor) { if (value instanceof constructor) { return true; } if (typeof value === 'object' && value !== null) { var _value$constructor; // Prefer Symbol.toStringTag since it is immune to minification. const className = constructor.prototype[Symbol.toStringTag]; const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library. Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009 ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; if (className === valueClassName) { const stringifiedValue = inspect$1(value); throw new Error(`Cannot use ${className} "${stringifiedValue}" from another module or realm. Ensure that there is only one instance of "graphql" in the node_modules directory. If different versions of "graphql" are the dependencies of other relied on modules, use "resolutions" to ensure only one version is installed. https://yarnpkg.com/en/docs/selective-version-resolutions Duplicate "graphql" modules cannot be used at the same time since different versions may have different capabilities and behavior. The data from one version used in the function from another could produce confusing and spurious results.`); } } return false; }; /** * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are * optional, but they are useful for clients who store GraphQL documents in source files. * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might * be useful for `name` to be `"Foo.graphql"` and location to be `{ line: 40, column: 1 }`. * The `line` and `column` properties in `locationOffset` are 1-indexed. */ class Source { constructor( body, name = 'GraphQL request', locationOffset = { line: 1, column: 1, }, ) { typeof body === 'string' || devAssert(false, `Body must be a string. Received: ${inspect$1(body)}.`); this.body = body; this.name = name; this.locationOffset = locationOffset; this.locationOffset.line > 0 || devAssert( false, 'line in locationOffset is 1-indexed and must be positive.', ); this.locationOffset.column > 0 || devAssert( false, 'column in locationOffset is 1-indexed and must be positive.', ); } get [Symbol.toStringTag]() { return 'Source'; } } /** * Test if the given value is a Source object. * * @internal */ function isSource(source) { return instanceOf(source, Source); } /** * Configuration options to control parser behavior */ /** * Given a GraphQL source, parses it into a Document. * Throws GraphQLError if a syntax error is encountered. */ function parse(source, options) { const parser = new Parser(source, options); return parser.parseDocument(); } /** * This class is exported only to assist people in implementing their own parsers * without duplicating too much code and should be used only as last resort for cases * such as experimental syntax or if certain features could not be contributed upstream. * * It is still part of the internal API and is versioned, so any changes to it are never * considered breaking changes. If you still need to support multiple versions of the * library, please use the `versionInfo` variable for version detection. * * @internal */ class Parser { constructor(source, options = {}) { const sourceObj = isSource(source) ? source : new Source(source); this._lexer = new Lexer(sourceObj); this._options = options; this._tokenCounter = 0; } /** * Converts a name lex token into a name parse node. */ parseName() { const token = this.expectToken(TokenKind.NAME); return this.node(token, { kind: Kind.NAME, value: token.value, }); } // Implements the parsing rules in the Document section. /** * Document : Definition+ */ parseDocument() { return this.node(this._lexer.token, { kind: Kind.DOCUMENT, definitions: this.many( TokenKind.SOF, this.parseDefinition, TokenKind.EOF, ), }); } /** * Definition : * - ExecutableDefinition * - TypeSystemDefinition * - TypeSystemExtension * * ExecutableDefinition : * - OperationDefinition * - FragmentDefinition * * TypeSystemDefinition : * - SchemaDefinition * - TypeDefinition * - DirectiveDefinition * * TypeDefinition : * - ScalarTypeDefinition * - ObjectTypeDefinition * - InterfaceTypeDefinition * - UnionTypeDefinition * - EnumTypeDefinition * - InputObjectTypeDefinition */ parseDefinition() { if (this.peek(TokenKind.BRACE_L)) { return this.parseOperationDefinition(); } // Many definitions begin with a description and require a lookahead. const hasDescription = this.peekDescription(); const keywordToken = hasDescription ? this._lexer.lookahead() : this._lexer.token; if (keywordToken.kind === TokenKind.NAME) { switch (keywordToken.value) { case 'schema': return this.parseSchemaDefinition(); case 'scalar': return this.parseScalarTypeDefinition(); case 'type': return this.parseObjectTypeDefinition(); case 'interface': return this.parseInterfaceTypeDefinition(); case 'union': return this.parseUnionTypeDefinition(); case 'enum': return this.parseEnumTypeDefinition(); case 'input': return this.parseInputObjectTypeDefinition(); case 'directive': return this.parseDirectiveDefinition(); } if (hasDescription) { throw syntaxError( this._lexer.source, this._lexer.token.start, 'Unexpected description, descriptions are supported only on type definitions.', ); } switch (keywordToken.value) { case 'query': case 'mutation': case 'subscription': return this.parseOperationDefinition(); case 'fragment': return this.parseFragmentDefinition(); case 'extend': return this.parseTypeSystemExtension(); } } throw this.unexpected(keywordToken); } // Implements the parsing rules in the Operations section. /** * OperationDefinition : * - SelectionSet * - OperationType Name? VariableDefinitions? Directives? SelectionSet */ parseOperationDefinition() { const start = this._lexer.token; if (this.peek(TokenKind.BRACE_L)) { return this.node(start, { kind: Kind.OPERATION_DEFINITION, operation: OperationTypeNode.QUERY, name: undefined, variableDefinitions: [], directives: [], selectionSet: this.parseSelectionSet(), }); } const operation = this.parseOperationType(); let name; if (this.peek(TokenKind.NAME)) { name = this.parseName(); } return this.node(start, { kind: Kind.OPERATION_DEFINITION, operation, name, variableDefinitions: this.parseVariableDefinitions(), directives: this.parseDirectives(false), selectionSet: this.parseSelectionSet(), }); } /** * OperationType : one of query mutation subscription */ parseOperationType() { const operationToken = this.expectToken(TokenKind.NAME); switch (operationToken.value) { case 'query': return OperationTypeNode.QUERY; case 'mutation': return OperationTypeNode.MUTATION; case 'subscription': return OperationTypeNode.SUBSCRIPTION; } throw this.unexpected(operationToken); } /** * VariableDefinitions : ( VariableDefinition+ ) */ parseVariableDefinitions() { return this.optionalMany( TokenKind.PAREN_L, this.parseVariableDefinition, TokenKind.PAREN_R, ); } /** * VariableDefinition : Variable : Type DefaultValue? Directives[Const]? */ parseVariableDefinition() { return this.node(this._lexer.token, { kind: Kind.VARIABLE_DEFINITION, variable: this.parseVariable(), type: (this.expectToken(TokenKind.COLON), this.parseTypeReference()), defaultValue: this.expectOptionalToken(TokenKind.EQUALS) ? this.parseConstValueLiteral() : undefined, directives: this.parseConstDirectives(), }); } /** * Variable : $ Name */ parseVariable() { const start = this._lexer.token; this.expectToken(TokenKind.DOLLAR); return this.node(start, { kind: Kind.VARIABLE, name: this.parseName(), }); } /** * ``` * SelectionSet : { Selection+ } * ``` */ parseSelectionSet() { return this.node(this._lexer.token, { kind: Kind.SELECTION_SET, selections: this.many( TokenKind.BRACE_L, this.parseSelection, TokenKind.BRACE_R, ), }); } /** * Selection : * - Field * - FragmentSpread * - InlineFragment */ parseSelection() { return this.peek(TokenKind.SPREAD) ? this.parseFragment() : this.parseField(); } /** * Field : Alias? Name Arguments? Directives? SelectionSet? * * Alias : Name : */ parseField() { const start = this._lexer.token; const nameOrAlias = this.parseName(); let alias; let name; if (this.expectOptionalToken(TokenKind.COLON)) { alias = nameOrAlias; name = this.parseName(); } else { name = nameOrAlias; } return this.node(start, { kind: Kind.FIELD, alias, name, arguments: this.parseArguments(false), directives: this.parseDirectives(false), selectionSet: this.peek(TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined, }); } /** * Arguments[Const] : ( Argument[?Const]+ ) */ parseArguments(isConst) { const item = isConst ? this.parseConstArgument : this.parseArgument; return this.optionalMany(TokenKind.PAREN_L, item, TokenKind.PAREN_R); } /** * Argument[Const] : Name : Value[?Const] */ parseArgument(isConst = false) { const start = this._lexer.token; const name = this.parseName(); this.expectToken(TokenKind.COLON); return this.node(start, { kind: Kind.ARGUMENT, name, value: this.parseValueLiteral(isConst), }); } parseConstArgument() { return this.parseArgument(true); } // Implements the parsing rules in the Fragments section. /** * Corresponds to both FragmentSpread and InlineFragment in the spec. * * FragmentSpread : ... FragmentName Directives? * * InlineFragment : ... TypeCondition? Directives? SelectionSet */ parseFragment() { const start = this._lexer.token; this.expectToken(TokenKind.SPREAD); const hasTypeCondition = this.expectOptionalKeyword('on'); if (!hasTypeCondition && this.peek(TokenKind.NAME)) { return this.node(start, { kind: Kind.FRAGMENT_SPREAD, name: this.parseFragmentName(), directives: this.parseDirectives(false), }); } return this.node(start, { kind: Kind.INLINE_FRAGMENT, typeCondition: hasTypeCondition ? this.parseNamedType() : undefined, directives: this.parseDirectives(false), selectionSet: this.parseSelectionSet(), }); } /** * FragmentDefinition : * - fragment FragmentName on TypeCondition Directives? SelectionSet * * TypeCondition : NamedType */ parseFragmentDefinition() { const start = this._lexer.token; this.expectKeyword('fragment'); // Legacy support for defining variables within fragments changes // the grammar of FragmentDefinition: // - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet if (this._options.allowLegacyFragmentVariables === true) { return this.node(start, { kind: Kind.FRAGMENT_DEFINITION, name: this.parseFragmentName(), variableDefinitions: this.parseVariableDefinitions(), typeCondition: (this.expectKeyword('on'), this.parseNamedType()), directives: this.parseDirectives(false), selectionSet: this.parseSelectionSet(), }); } return this.node(start, { kind: Kind.FRAGMENT_DEFINITION, name: this.parseFragmentName(), typeCondition: (this.expectKeyword('on'), this.parseNamedType()), directives: this.parseDirectives(false), selectionSet: this.parseSelectionSet(), }); } /** * FragmentName : Name but not `on` */ parseFragmentName() { if (this._lexer.token.value === 'on') { throw this.unexpected(); } return this.parseName(); } // Implements the parsing rules in the Values section. /** * Value[Const] : * - [~Const] Variable * - IntValue * - FloatValue * - StringValue * - BooleanValue * - NullValue * - EnumValue * - ListValue[?Const] * - ObjectValue[?Const] * * BooleanValue : one of `true` `false` * * NullValue : `null` * * EnumValue : Name but not `true`, `false` or `null` */ parseValueLiteral(isConst) { const token = this._lexer.token; switch (token.kind) { case TokenKind.BRACKET_L: return this.parseList(isConst); case TokenKind.BRACE_L: return this.parseObject(isConst); case TokenKind.INT: this.advanceLexer(); return this.node(token, { kind: Kind.INT, value: token.value, }); case TokenKind.FLOAT: this.advanceLexer(); return this.node(token, { kind: Kind.FLOAT, value: token.value, }); case TokenKind.STRING: case TokenKind.BLOCK_STRING: return this.parseStringLiteral(); case TokenKind.NAME: this.advanceLexer(); switch (token.value) { case 'true': return this.node(token, { kind: Kind.BOOLEAN, value: true, }); case 'false': return this.node(token, { kind: Kind.BOOLEAN, value: false, }); case 'null': return this.node(token, { kind: Kind.NULL, }); default: return this.node(token, { kind: Kind.ENUM, value: token.value, }); } case TokenKind.DOLLAR: if (isConst) { this.expectToken(TokenKind.DOLLAR); if (this._lexer.token.kind === TokenKind.NAME) { const varName = this._lexer.token.value; throw syntaxError( this._lexer.source, token.start, `Unexpected variable "$${varName}" in constant value.`, ); } else { throw this.unexpected(token); } } return this.parseVariable(); default: throw this.unexpected(); } } parseConstValueLiteral() { return this.parseValueLiteral(true); } parseStringLiteral() { const token = this._lexer.token; this.advanceLexer(); return this.node(token, { kind: Kind.STRING, value: token.value, block: token.kind === TokenKind.BLOCK_STRING, }); } /** * ListValue[Const] : * - [ ] * - [ Value[?Const]+ ] */ parseList(isConst) { const item = () => this.parseValueLiteral(isConst); return this.node(this._lexer.token, { kind: Kind.LIST, values: this.any(TokenKind.BRACKET_L, item, TokenKind.BRACKET_R), }); } /** * ``` * ObjectValue[Const] : * - { } * - { ObjectField[?Const]+ } * ``` */ parseObject(isConst) { const item = () => this.parseObjectField(isConst); return this.node(this._lexer.token, { kind: Kind.OBJECT, fields: this.any(TokenKind.BRACE_L, item, TokenKind.BRACE_R), }); } /** * ObjectField[Const] : Name : Value[?Const] */ parseObjectField(isConst) { const start = this._lexer.token; const name = this.parseName(); this.expectToken(TokenKind.COLON); return this.node(start, { kind: Kind.OBJECT_FIELD, name, value: this.parseValueLiteral(isConst), }); } // Implements the parsing rules in the Directives section. /** * Directives[Const] : Directive[?Const]+ */ parseDirectives(isConst) { const directives = []; while (this.peek(TokenKind.AT)) { directives.push(this.parseDirective(isConst)); } return directives; } parseConstDirectives() { return this.parseDirectives(true); } /** * ``` * Directive[Const] : @ Name Arguments[?Const]? * ``` */ parseDirective(isConst) { const start = this._lexer.token; this.expectToken(TokenKind.AT); return this.node(start, { kind: Kind.DIRECTIVE, name: this.parseName(), arguments: this.parseArguments(isConst), }); } // Implements the parsing rules in the Types section. /** * Type : * - NamedType * - ListType * - NonNullType */ parseTypeReference() { const start = this._lexer.token; let type; if (this.expectOptionalToken(TokenKind.BRACKET_L)) { const innerType = this.parseTypeReference(); this.expectToken(TokenKind.BRACKET_R); type = this.node(start, { kind: Kind.LIST_TYPE, type: innerType, }); } else { type = this.parseNamedType(); } if (this.expectOptionalToken(TokenKind.BANG)) { return this.node(start, { kind: Kind.NON_NULL_TYPE, type, }); } return type; } /** * NamedType : Name */ parseNamedType() { return this.node(this._lexer.token, { kind: Kind.NAMED_TYPE, name: this.parseName(), }); } // Implements the parsing rules in the Type Definition section. peekDescription() { return this.peek(TokenKind.STRING) || this.peek(TokenKind.BLOCK_STRING); } /** * Description : StringValue */ parseDescription() { if (this.peekDescription()) { return this.parseStringLiteral(); } } /** * ``` * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } * ``` */ parseSchemaDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('schema'); const directives = this.parseConstDirectives(); const operationTypes = this.many( TokenKind.BRACE_L, this.parseOperationTypeDefinition, TokenKind.BRACE_R, ); return this.node(start, { kind: Kind.SCHEMA_DEFINITION, description, directives, operationTypes, }); } /** * OperationTypeDefinition : OperationType : NamedType */ parseOperationTypeDefinition() { const start = this._lexer.token; const operation = this.parseOperationType(); this.expectToken(TokenKind.COLON); const type = this.parseNamedType(); return this.node(start, { kind: Kind.OPERATION_TYPE_DEFINITION, operation, type, }); } /** * ScalarTypeDefinition : Description? scalar Name Directives[Const]? */ parseScalarTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('scalar'); const name = this.parseName(); const directives = this.parseConstDirectives(); return this.node(start, { kind: Kind.SCALAR_TYPE_DEFINITION, description, name, directives, }); } /** * ObjectTypeDefinition : * Description? * type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? */ parseObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('type'); const name = this.parseName(); const interfaces = this.parseImplementsInterfaces(); const directives = this.parseConstDirectives(); const fields = this.parseFieldsDefinition(); return this.node(start, { kind: Kind.OBJECT_TYPE_DEFINITION, description, name, interfaces, directives, fields, }); } /** * ImplementsInterfaces : * - implements `&`? NamedType * - ImplementsInterfaces & NamedType */ parseImplementsInterfaces() { return this.expectOptionalKeyword('implements') ? this.delimitedMany(TokenKind.AMP, this.parseNamedType) : []; } /** * ``` * FieldsDefinition : { FieldDefinition+ } * ``` */ parseFieldsDefinition() { return this.optionalMany( TokenKind.BRACE_L, this.parseFieldDefinition, TokenKind.BRACE_R, ); } /** * FieldDefinition : * - Description? Name ArgumentsDefinition? : Type Directives[Const]? */ parseFieldDefinition() { const start = this._lexer.token; const description = this.parseDescription(); const name = this.parseName(); const args = this.parseArgumentDefs(); this.expectToken(TokenKind.COLON); const type = this.parseTypeReference(); const directives = this.parseConstDirectives(); return this.node(start, { kind: Kind.FIELD_DEFINITION, description, name, arguments: args, type, directives, }); } /** * ArgumentsDefinition : ( InputValueDefinition+ ) */ parseArgumentDefs() { return this.optionalMany( TokenKind.PAREN_L, this.parseInputValueDef, TokenKind.PAREN_R, ); } /** * InputValueDefinition : * - Description? Name : Type DefaultValue? Directives[Const]? */ parseInputValueDef() { const start = this._lexer.token; const description = this.parseDescription(); const name = this.parseName(); this.expectToken(TokenKind.COLON); const type = this.parseTypeReference(); let defaultValue; if (this.expectOptionalToken(TokenKind.EQUALS)) { defaultValue = this.parseConstValueLiteral(); } const directives = this.parseConstDirectives(); return this.node(start, { kind: Kind.INPUT_VALUE_DEFINITION, description, name, type, defaultValue, directives, }); } /** * InterfaceTypeDefinition : * - Description? interface Name Directives[Const]? FieldsDefinition? */ parseInterfaceTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('interface'); const name = this.parseName(); const interfaces = this.parseImplementsInterfaces(); const directives = this.parseConstDirectives(); const fields = this.parseFieldsDefinition(); return this.node(start, { kind: Kind.INTERFACE_TYPE_DEFINITION, description, name, interfaces, directives, fields, }); } /** * UnionTypeDefinition : * - Description? union Name Directives[Const]? UnionMemberTypes? */ parseUnionTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('union'); const name = this.parseName(); const directives = this.parseConstDirectives(); const types = this.parseUnionMemberTypes(); return this.node(start, { kind: Kind.UNION_TYPE_DEFINITION, description, name, directives, types, }); } /** * UnionMemberTypes : * - = `|`? NamedType * - UnionMemberTypes | NamedType */ parseUnionMemberTypes() { return this.expectOptionalToken(TokenKind.EQUALS) ? this.delimitedMany(TokenKind.PIPE, this.parseNamedType) : []; } /** * EnumTypeDefinition : * - Description? enum Name Directives[Const]? EnumValuesDefinition? */ parseEnumTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('enum'); const name = this.parseName(); const directives = this.parseConstDirectives(); const values = this.parseEnumValuesDefinition(); return this.node(start, { kind: Kind.ENUM_TYPE_DEFINITION, description, name, directives, values, }); } /** * ``` * EnumValuesDefinition : { EnumValueDefinition+ } * ``` */ parseEnumValuesDefinition() { return this.optionalMany( TokenKind.BRACE_L, this.parseEnumValueDefinition, TokenKind.BRACE_R, ); } /** * EnumValueDefinition : Description? EnumValue Directives[Const]? */ parseEnumValueDefinition() { const start = this._lexer.token; const description = this.parseDescription(); const name = this.parseEnumValueName(); const directives = this.parseConstDirectives(); return this.node(start, { kind: Kind.ENUM_VALUE_DEFINITION, description, name, directives, }); } /** * EnumValue : Name but not `true`, `false` or `null` */ parseEnumValueName() { if ( this._lexer.token.value === 'true' || this._lexer.token.value === 'false' || this._lexer.token.value === 'null' ) { throw syntaxError( this._lexer.source, this._lexer.token.start, `${getTokenDesc( this._lexer.token, )} is reserved and cannot be used for an enum value.`, ); } return this.parseName(); } /** * InputObjectTypeDefinition : * - Description? input Name Directives[Const]? InputFieldsDefinition? */ parseInputObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('input'); const name = this.parseName(); const directives = this.parseConstDirectives(); const fields = this.parseInputFieldsDefinition(); return this.node(start, { kind: Kind.INPUT_OBJECT_TYPE_DEFINITION, description, name, directives, fields, }); } /** * ``` * InputFieldsDefinition : { InputValueDefinition+ } * ``` */ parseInputFieldsDefinition() { return this.optionalMany( TokenKind.BRACE_L, this.parseInputValueDef, TokenKind.BRACE_R, ); } /** * TypeSystemExtension : * - SchemaExtension * - TypeExtension * * TypeExtension : * - ScalarTypeExtension * - ObjectTypeExtension * - InterfaceTypeExtension * - UnionTypeExtension * - EnumTypeExtension * - InputObjectTypeDefinition */ parseTypeSystemExtension() { const keywordToken = this._lexer.lookahead(); if (keywordToken.kind === TokenKind.NAME) { switch (keywordToken.value) { case 'schema': return this.parseSchemaExtension(); case 'scalar': return this.parseScalarTypeExtension(); case 'type': return this.parseObjectTypeExtension(); case 'interface': return this.parseInterfaceTypeExtension(); case 'union': return this.parseUnionTypeExtension(); case 'enum': return this.parseEnumTypeExtension(); case 'input': return this.parseInputObjectTypeExtension(); } } throw this.unexpected(keywordToken); } /** * ``` * SchemaExtension : * - extend schema Directives[Const]? { OperationTypeDefinition+ } * - extend schema Directives[Const] * ``` */ parseSchemaExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('schema'); const directives = this.parseConstDirectives(); const operationTypes = this.optionalMany( TokenKind.BRACE_L, this.parseOperationTypeDefinition, TokenKind.BRACE_R, ); if (directives.length === 0 && operationTypes.length === 0) { throw this.unexpected(); } return this.node(start, { kind: Kind.SCHEMA_EXTENSION, directives, operationTypes, }); } /** * ScalarTypeExtension : * - extend scalar Name Directives[Const] */ parseScalarTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('scalar'); const name = this.parseName(); const directives = this.parseConstDirectives(); if (directives.length === 0) { throw this.unexpected(); } return this.node(start, { kind: Kind.SCALAR_TYPE_EXTENSION, name, directives, }); } /** * ObjectTypeExtension : * - extend type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition * - extend type Name ImplementsInterfaces? Directives[Const] * - extend type Name ImplementsInterfaces */ parseObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('type'); const name = this.parseName(); const interfaces = this.parseImplementsInterfaces(); const directives = this.parseConstDirectives(); const fields = this.parseFieldsDefinition(); if ( interfaces.length === 0 && directives.length === 0 && fields.length === 0 ) { throw this.unexpected(); } return this.node(start, { kind: Kind.OBJECT_TYPE_EXTENSION, name, interfaces, directives, fields, }); } /** * InterfaceTypeExtension : * - extend interface Name ImplementsInterfaces? Directives[Const]? FieldsDefinition * - extend interface Name ImplementsInterfaces? Directives[Const] * - extend interface Name ImplementsInterfaces */ parseInterfaceTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('interface'); const name = this.parseName(); const interfaces = this.parseImplementsInterfaces(); const directives = this.parseConstDirectives(); const fields = this.parseFieldsDefinition(); if ( interfaces.length === 0 && directives.length === 0 && fields.length === 0 ) { throw this.unexpected(); } return this.node(start, { kind: Kind.INTERFACE_TYPE_EXTENSION, name, interfaces, directives, fields, }); } /** * UnionTypeExtension : * - extend union Name Directives[Const]? UnionMemberTypes * - extend union Name Directives[Const] */ parseUnionTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('union'); const name = this.parseName(); const directives = this.parseConstDirectives(); const types = this.parseUnionMemberTypes(); if (directives.length === 0 && types.length === 0) { throw this.unexpected(); } return this.node(start, { kind: Kind.UNION_TYPE_EXTENSION, name, directives, types, }); } /** * EnumTypeExtension : * - extend enum Name Directives[Const]? EnumValuesDefinition * - extend enum Name Directives[Const] */ parseEnumTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('enum'); const name = this.parseName(); const directives = this.parseConstDirectives(); const values = this.parseEnumValuesDefinition(); if (directives.length === 0 && values.length === 0) { throw this.unexpected(); } return this.node(start, { kind: Kind.ENUM_TYPE_EXTENSION, name, directives, values, }); } /** * InputObjectTypeExtension : * - extend input Name Directives[Const]? InputFieldsDefinition * - extend input Name Directives[Const] */ parseInputObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); this.expectKeyword('input'); const name = this.parseName(); const directives = this.parseConstDirectives(); const fields = this.parseInputFieldsDefinition(); if (directives.length === 0 && fields.length === 0) { throw this.unexpected(); } return this.node(start, { kind: Kind.INPUT_OBJECT_TYPE_EXTENSION, name, directives, fields, }); } /** * ``` * DirectiveDefinition : * - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations * ``` */ parseDirectiveDefinition() { const start = this._lexer.token; const description = this.parseDescription(); this.expectKeyword('directive'); this.expectToken(TokenKind.AT); const name = this.parseName(); const args = this.parseArgumentDefs(); const repeatable = this.expectOptionalKeyword('repeatable'); this.expectKeyword('on'); const locations = this.parseDirectiveLocations(); return this.node(start, { kind: Kind.DIRECTIVE_DEFINITION, description, name, arguments: args, repeatable, locations, }); } /** * DirectiveLocations : * - `|`? DirectiveLocation * - DirectiveLocations | DirectiveLocation */ parseDirectiveLocations() { return this.delimitedMany(TokenKind.PIPE, this.parseDirectiveLocation); } /* * DirectiveLocation : * - ExecutableDirectiveLocation * - TypeSystemDirectiveLocation * * ExecutableDirectiveLocation : one of * `QUERY` * `MUTATION` * `SUBSCRIPTION` * `FIELD` * `FRAGMENT_DEFINITION` * `FRAGMENT_SPREAD` * `INLINE_FRAGMENT` * * TypeSystemDirectiveLocation : one of * `SCHEMA` * `SCALAR` * `OBJECT` * `FIELD_DEFINITION` * `ARGUMENT_DEFINITION` * `INTERFACE` * `UNION` * `ENUM` * `ENUM_VALUE` * `INPUT_OBJECT` * `INPUT_FIELD_DEFINITION` */ parseDirectiveLocation() { const start = this._lexer.token; const name = this.parseName(); if (Object.prototype.hasOwnProperty.call(DirectiveLocation$1, name.value)) { return name; } throw this.unexpected(start); } // Core parsing utility functions /** * Returns a node that, if configured to do so, sets a "loc" field as a * location object, used to identify the place in the source that created a * given parsed object. */ node(startToken, node) { if (this._options.noLocation !== true) { node.loc = new Location( startToken, this._lexer.lastToken, this._lexer.source, ); } return node; } /** * Determines if the next token is of a given kind */ peek(kind) { return this._lexer.token.kind === kind; } /** * If the next token is of the given kind, return that token after advancing the lexer. * Otherwise, do not change the parser state and throw an error. */ expectToken(kind) { const token = this._lexer.token; if (token.kind === kind) { this.advanceLexer(); return token; } throw syntaxError( this._lexer.source, token.start, `Expected ${getTokenKindDesc(kind)}, found ${getTokenDesc(token)}.`, ); } /** * If the next token is of the given kind, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ expectOptionalToken(kind) { const token = this._lexer.token; if (token.kind === kind) { this.advanceLexer(); return true; } return false; } /** * If the next token is a given keyword, advance the lexer. * Otherwise, do not change the parser state and throw an error. */ expectKeyword(value) { const token = this._lexer.token; if (token.kind === TokenKind.NAME && token.value === value) { this.advanceLexer(); } else { throw syntaxError( this._lexer.source, token.start, `Expected "${value}", found ${getTokenDesc(token)}.`, ); } } /** * If the next token is a given keyword, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ expectOptionalKeyword(value) { const token = this._lexer.token; if (token.kind === TokenKind.NAME && token.value === value) { this.advanceLexer(); return true; } return false; } /** * Helper function for creating an error when an unexpected lexed token is encountered. */ unexpected(atToken) { const token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token; return syntaxError( this._lexer.source, token.start, `Unexpected ${getTokenDesc(token)}.`, ); } /** * Returns a possibly empty list of parse nodes, determined by the parseFn. * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ any(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; while (!this.expectOptionalToken(closeKind)) { nodes.push(parseFn.call(this)); } return nodes; } /** * Returns a list of parse nodes, determined by the parseFn. * It can be empty only if open token is missing otherwise it will always return non-empty list * that begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ optionalMany(openKind, parseFn, closeKind) { if (this.expectOptionalToken(openKind)) { const nodes = []; do { nodes.push(parseFn.call(this)); } while (!this.expectOptionalToken(closeKind)); return nodes; } return []; } /** * Returns a non-empty list of parse nodes, determined by the parseFn. * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ many(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; do { nodes.push(parseFn.call(this)); } while (!this.expectOptionalToken(closeKind)); return nodes; } /** * Returns a non-empty list of parse nodes, determined by the parseFn. * This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. * Advances the parser to the next lex token after last item in the list. */ delimitedMany(delimiterKind, parseFn) { this.expectOptionalToken(delimiterKind); const nodes = []; do { nodes.push(parseFn.call(this)); } while (this.expectOptionalToken(delimiterKind)); return nodes; } advanceLexer() { const { maxTokens } = this._options; const token = this._lexer.advance(); if (maxTokens !== undefined && token.kind !== TokenKind.EOF) { ++this._tokenCounter; if (this._tokenCounter > maxTokens) { throw syntaxError( this._lexer.source, token.start, `Document contains more that ${maxTokens} tokens. Parsing aborted.`, ); } } } } /** * A helper function to describe a token as a string for debugging. */ function getTokenDesc(token) { const value = token.value; return getTokenKindDesc(token.kind) + (value != null ? ` "${value}"` : ''); } /** * A helper function to describe a token kind as a string for debugging. */ function getTokenKindDesc(kind) { return isPunctuatorTokenKind(kind) ? `"${kind}"` : kind; } const MAX_SUGGESTIONS = 5; /** * Given [ A, B, C ] return ' Did you mean A, B, or C?'. */ function didYouMean(firstArg, secondArg) { const [subMessage, suggestionsArg] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; let message = ' Did you mean '; if (subMessage) { message += subMessage + ' '; } const suggestions = suggestionsArg.map((x) => `"${x}"`); switch (suggestions.length) { case 0: return ''; case 1: return message + suggestions[0] + '?'; case 2: return message + suggestions[0] + ' or ' + suggestions[1] + '?'; } const selected = suggestions.slice(0, MAX_SUGGESTIONS); const lastItem = selected.pop(); return message + selected.join(', ') + ', or ' + lastItem + '?'; } /** * Returns the first argument it receives. */ function identityFunc(x) { return x; } /** * Creates a keyed JS object from an array, given a function to produce the keys * for each value in the array. * * This provides a convenient lookup for the array items if the key function * produces unique results. * ```ts * const phoneBook = [ * { name: 'Jon', num: '555-1234' }, * { name: 'Jenny', num: '867-5309' } * ] * * const entriesByName = keyMap( * phoneBook, * entry => entry.name * ) * * // { * // Jon: { name: 'Jon', num: '555-1234' }, * // Jenny: { name: 'Jenny', num: '867-5309' } * // } * * const jennyEntry = entriesByName['Jenny'] * * // { name: 'Jenny', num: '857-6309' } * ``` */ function keyMap(list, keyFn) { const result = Object.create(null); for (const item of list) { result[keyFn(item)] = item; } return result; } /** * Creates a keyed JS object from an array, given a function to produce the keys * and a function to produce the values from each item in the array. * ```ts * const phoneBook = [ * { name: 'Jon', num: '555-1234' }, * { name: 'Jenny', num: '867-5309' } * ] * * // { Jon: '555-1234', Jenny: '867-5309' } * const phonesByName = keyValMap( * phoneBook, * entry => entry.name, * entry => entry.num * ) * ``` */ function keyValMap(list, keyFn, valFn) { const result = Object.create(null); for (const item of list) { result[keyFn(item)] = valFn(item); } return result; } /** * Creates an object map with the same keys as `map` and values generated by * running each value of `map` thru `fn`. */ function mapValue(map, fn) { const result = Object.create(null); for (const key of Object.keys(map)) { result[key] = fn(map[key], key); } return result; } /** * Returns a number indicating whether a reference string comes before, or after, * or is the same as the given string in natural sort order. * * See: https://en.wikipedia.org/wiki/Natural_sort_order * */ function naturalCompare(aStr, bStr) { let aIndex = 0; let bIndex = 0; while (aIndex < aStr.length && bIndex < bStr.length) { let aChar = aStr.charCodeAt(aIndex); let bChar = bStr.charCodeAt(bIndex); if (isDigit(aChar) && isDigit(bChar)) { let aNum = 0; do { ++aIndex; aNum = aNum * 10 + aChar - DIGIT_0; aChar = aStr.charCodeAt(aIndex); } while (isDigit(aChar) && aNum > 0); let bNum = 0; do { ++bIndex; bNum = bNum * 10 + bChar - DIGIT_0; bChar = bStr.charCodeAt(bIndex); } while (isDigit(bChar) && bNum > 0); if (aNum < bNum) { return -1; } if (aNum > bNum) { return 1; } } else { if (aChar < bChar) { return -1; } if (aChar > bChar) { return 1; } ++aIndex; ++bIndex; } } return aStr.length - bStr.length; } const DIGIT_0 = 48; const DIGIT_9 = 57; function isDigit(code) { return !isNaN(code) && DIGIT_0 <= code && code <= DIGIT_9; } /** * Given an invalid input string and a list of valid options, returns a filtered * list of valid options sorted based on their similarity with the input. */ function suggestionList(input, options) { const optionsByDistance = Object.create(null); const lexicalDistance = new LexicalDistance(input); const threshold = Math.floor(input.length * 0.4) + 1; for (const option of options) { const distance = lexicalDistance.measure(option, threshold); if (distance !== undefined) { optionsByDistance[option] = distance; } } return Object.keys(optionsByDistance).sort((a, b) => { const distanceDiff = optionsByDistance[a] - optionsByDistance[b]; return distanceDiff !== 0 ? distanceDiff : naturalCompare(a, b); }); } /** * Computes the lexical distance between strings A and B. * * The "distance" between two strings is given by counting the minimum number * of edits needed to transform string A into string B. An edit can be an * insertion, deletion, or substitution of a single character, or a swap of two * adjacent characters. * * Includes a custom alteration from Damerau-Levenshtein to treat case changes * as a single edit which helps identify mis-cased values with an edit distance * of 1. * * This distance can be useful for detecting typos in input or sorting */ class LexicalDistance { constructor(input) { this._input = input; this._inputLowerCase = input.toLowerCase(); this._inputArray = stringToArray(this._inputLowerCase); this._rows = [ new Array(input.length + 1).fill(0), new Array(input.length + 1).fill(0), new Array(input.length + 1).fill(0), ]; } measure(option, threshold) { if (this._input === option) { return 0; } const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit if (this._inputLowerCase === optionLowerCase) { return 1; } let a = stringToArray(optionLowerCase); let b = this._inputArray; if (a.length < b.length) { const tmp = a; a = b; b = tmp; } const aLength = a.length; const bLength = b.length; if (aLength - bLength > threshold) { return undefined; } const rows = this._rows; for (let j = 0; j <= bLength; j++) { rows[0][j] = j; } for (let i = 1; i <= aLength; i++) { const upRow = rows[(i - 1) % 3]; const currentRow = rows[i % 3]; let smallestCell = (currentRow[0] = i); for (let j = 1; j <= bLength; j++) { const cost = a[i - 1] === b[j - 1] ? 0 : 1; let currentCell = Math.min( upRow[j] + 1, // delete currentRow[j - 1] + 1, // insert upRow[j - 1] + cost, // substitute ); if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { // transposition const doubleDiagonalCell = rows[(i - 2) % 3][j - 2]; currentCell = Math.min(currentCell, doubleDiagonalCell + 1); } if (currentCell < smallestCell) { smallestCell = currentCell; } currentRow[j] = currentCell; } // Early exit, since distance can't go smaller than smallest element of the previous row. if (smallestCell > threshold) { return undefined; } } const distance = rows[aLength % 3][bLength]; return distance <= threshold ? distance : undefined; } } function stringToArray(str) { const strLength = str.length; const array = new Array(strLength); for (let i = 0; i < strLength; ++i) { array[i] = str.charCodeAt(i); } return array; } function toObjMap(obj) { if (obj == null) { return Object.create(null); } if (Object.getPrototypeOf(obj) === null) { return obj; } const map = Object.create(null); for (const [key, value] of Object.entries(obj)) { map[key] = value; } return map; } /** * Prints a string as a GraphQL StringValue literal. Replaces control characters * and excluded characters (" U+0022 and \\ U+005C) with escape sequences. */ function printString(str) { return `"${str.replace(escapedRegExp, escapedReplacer)}"`; } // eslint-disable-next-line no-control-regex const escapedRegExp = /[\x00-\x1f\x22\x5c\x7f-\x9f]/g; function escapedReplacer(str) { return escapeSequences[str.charCodeAt(0)]; } // prettier-ignore const escapeSequences = [ '\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', // 2F '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', // 3F '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', // 4F '', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', // 5F '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', // 6F '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F', ]; /** * A visitor is provided to visit, it contains the collection of * relevant functions to be called during the visitor's traversal. */ const BREAK = Object.freeze({}); /** * visit() will walk through an AST using a depth-first traversal, calling * the visitor's enter function at each node in the traversal, and calling the * leave function after visiting that node and all of its child nodes. * * By returning different values from the enter and leave functions, the * behavior of the visitor can be altered, including skipping over a sub-tree of * the AST (by returning false), editing the AST by returning a value or null * to remove the value, or to stop the whole traversal by returning BREAK. * * When using visit() to edit an AST, the original AST will not be modified, and * a new version of the AST with the changes applied will be returned from the * visit function. * * ```ts * const editedAST = visit(ast, { * enter(node, key, parent, path, ancestors) { * // @return * // undefined: no action * // false: skip visiting this node * // visitor.BREAK: stop visiting altogether * // null: delete this node * // any value: replace this node with the returned value * }, * leave(node, key, parent, path, ancestors) { * // @return * // undefined: no action * // false: no action * // visitor.BREAK: stop visiting altogether * // null: delete this node * // any value: replace this node with the returned value * } * }); * ``` * * Alternatively to providing enter() and leave() functions, a visitor can * instead provide functions named the same as the kinds of AST nodes, or * enter/leave visitors at a named key, leading to three permutations of the * visitor API: * * 1) Named visitors triggered when entering a node of a specific kind. * * ```ts * visit(ast, { * Kind(node) { * // enter the "Kind" node * } * }) * ``` * * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. * * ```ts * visit(ast, { * Kind: { * enter(node) { * // enter the "Kind" node * } * leave(node) { * // leave the "Kind" node * } * } * }) * ``` * * 3) Generic visitors that trigger upon entering and leaving any node. * * ```ts * visit(ast, { * enter(node) { * // enter any node * }, * leave(node) { * // leave any node * } * }) * ``` */ function visit(root, visitor, visitorKeys = QueryDocumentKeys) { const enterLeaveMap = new Map(); for (const kind of Object.values(Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } /* eslint-disable no-undef-init */ let stack = undefined; let inArray = Array.isArray(root); let keys = [root]; let index = -1; let edits = []; let node = root; let key = undefined; let parent = undefined; const path = []; const ancestors = []; /* eslint-enable no-undef-init */ do { index++; const isLeaving = index === keys.length; const isEdited = isLeaving && edits.length !== 0; if (isLeaving) { key = ancestors.length === 0 ? undefined : path[path.length - 1]; node = parent; parent = ancestors.pop(); if (isEdited) { if (inArray) { node = node.slice(); let editOffset = 0; for (const [editKey, editValue] of edits) { const arrayKey = editKey - editOffset; if (editValue === null) { node.splice(arrayKey, 1); editOffset++; } else { node[arrayKey] = editValue; } } } else { node = Object.defineProperties( {}, Object.getOwnPropertyDescriptors(node), ); for (const [editKey, editValue] of edits) { node[editKey] = editValue; } } } index = stack.index; keys = stack.keys; edits = stack.edits; inArray = stack.inArray; stack = stack.prev; } else if (parent) { key = inArray ? index : keys[index]; node = parent[key]; if (node === null || node === undefined) { continue; } path.push(key); } let result; if (!Array.isArray(node)) { var _enterLeaveMap$get, _enterLeaveMap$get2; isNode(node) || devAssert(false, `Invalid AST Node: ${inspect$1(node)}.`); const visitFn = isLeaving ? (_enterLeaveMap$get = enterLeaveMap.get(node.kind)) === null || _enterLeaveMap$get === void 0 ? void 0 : _enterLeaveMap$get.leave : (_enterLeaveMap$get2 = enterLeaveMap.get(node.kind)) === null || _enterLeaveMap$get2 === void 0 ? void 0 : _enterLeaveMap$get2.enter; result = visitFn === null || visitFn === void 0 ? void 0 : visitFn.call(visitor, node, key, parent, path, ancestors); if (result === BREAK) { break; } if (result === false) { if (!isLeaving) { path.pop(); continue; } } else if (result !== undefined) { edits.push([key, result]); if (!isLeaving) { if (isNode(result)) { node = result; } else { path.pop(); continue; } } } } if (result === undefined && isEdited) { edits.push([key, node]); } if (isLeaving) { path.pop(); } else { var _node$kind; stack = { inArray, index, keys, edits, prev: stack, }; inArray = Array.isArray(node); keys = inArray ? node : (_node$kind = visitorKeys[node.kind]) !== null && _node$kind !== void 0 ? _node$kind : []; index = -1; edits = []; if (parent) { ancestors.push(parent); } parent = node; } } while (stack !== undefined); if (edits.length !== 0) { // New root return edits[edits.length - 1][1]; } return root; } /** * Creates a new visitor instance which delegates to many visitors to run in * parallel. Each visitor will be visited for each node before moving on. * * If a prior visitor edits a node, no following visitors will see that node. */ function visitInParallel(visitors) { const skipping = new Array(visitors.length).fill(null); const mergedVisitor = Object.create(null); for (const kind of Object.values(Kind)) { let hasVisitor = false; const enterList = new Array(visitors.length).fill(undefined); const leaveList = new Array(visitors.length).fill(undefined); for (let i = 0; i < visitors.length; ++i) { const { enter, leave } = getEnterLeaveForKind(visitors[i], kind); hasVisitor || (hasVisitor = enter != null || leave != null); enterList[i] = enter; leaveList[i] = leave; } if (!hasVisitor) { continue; } const mergedEnterLeave = { enter(...args) { const node = args[0]; for (let i = 0; i < visitors.length; i++) { if (skipping[i] === null) { var _enterList$i; const result = (_enterList$i = enterList[i]) === null || _enterList$i === void 0 ? void 0 : _enterList$i.apply(visitors[i], args); if (result === false) { skipping[i] = node; } else if (result === BREAK) { skipping[i] = BREAK; } else if (result !== undefined) { return result; } } } }, leave(...args) { const node = args[0]; for (let i = 0; i < visitors.length; i++) { if (skipping[i] === null) { var _leaveList$i; const result = (_leaveList$i = leaveList[i]) === null || _leaveList$i === void 0 ? void 0 : _leaveList$i.apply(visitors[i], args); if (result === BREAK) { skipping[i] = BREAK; } else if (result !== undefined && result !== false) { return result; } } else if (skipping[i] === node) { skipping[i] = null; } } }, }; mergedVisitor[kind] = mergedEnterLeave; } return mergedVisitor; } /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ function getEnterLeaveForKind(visitor, kind) { const kindVisitor = visitor[kind]; if (typeof kindVisitor === 'object') { // { Kind: { enter() {}, leave() {} } } return kindVisitor; } else if (typeof kindVisitor === 'function') { // { Kind() {} } return { enter: kindVisitor, leave: undefined, }; } // { enter() {}, leave() {} } return { enter: visitor.enter, leave: visitor.leave, }; } /** * Converts an AST into a string, using one set of reasonable * formatting rules. */ function print(ast) { return visit(ast, printDocASTReducer$1); } const MAX_LINE_LENGTH$1 = 80; const printDocASTReducer$1 = { Name: { leave: (node) => node.value, }, Variable: { leave: (node) => '$' + node.name, }, // Document Document: { leave: (node) => join$1(node.definitions, '\n\n'), }, OperationDefinition: { leave(node) { const varDefs = wrap$1('(', join$1(node.variableDefinitions, ', '), ')'); const prefix = join$1( [ node.operation, join$1([node.name, varDefs]), join$1(node.directives, ' '), ], ' ', ); // Anonymous queries with no directives or variable definitions can use // the query short form. return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet; }, }, VariableDefinition: { leave: ({ variable, type, defaultValue, directives }) => variable + ': ' + type + wrap$1(' = ', defaultValue) + wrap$1(' ', join$1(directives, ' ')), }, SelectionSet: { leave: ({ selections }) => block$1(selections), }, Field: { leave({ alias, name, arguments: args, directives, selectionSet }) { const prefix = wrap$1('', alias, ': ') + name; let argsLine = prefix + wrap$1('(', join$1(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH$1) { argsLine = prefix + wrap$1('(\n', indent$1(join$1(args, '\n')), '\n)'); } return join$1([argsLine, join$1(directives, ' '), selectionSet], ' '); }, }, Argument: { leave: ({ name, value }) => name + ': ' + value, }, // Fragments FragmentSpread: { leave: ({ name, directives }) => '...' + name + wrap$1(' ', join$1(directives, ' ')), }, InlineFragment: { leave: ({ typeCondition, directives, selectionSet }) => join$1( [ '...', wrap$1('on ', typeCondition), join$1(directives, ' '), selectionSet, ], ' ', ), }, FragmentDefinition: { leave: ( { name, typeCondition, variableDefinitions, directives, selectionSet }, // Note: fragment variable definitions are experimental and may be changed ) => // or removed in the future. `fragment ${name}${wrap$1('(', join$1(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap$1('', join$1(directives, ' '), ' ')}` + selectionSet, }, // Value IntValue: { leave: ({ value }) => value, }, FloatValue: { leave: ({ value }) => value, }, StringValue: { leave: ({ value, block: isBlockString }) => isBlockString ? printBlockString$1(value) : printString(value), }, BooleanValue: { leave: ({ value }) => (value ? 'true' : 'false'), }, NullValue: { leave: () => 'null', }, EnumValue: { leave: ({ value }) => value, }, ListValue: { leave: ({ values }) => '[' + join$1(values, ', ') + ']', }, ObjectValue: { leave: ({ fields }) => '{' + join$1(fields, ', ') + '}', }, ObjectField: { leave: ({ name, value }) => name + ': ' + value, }, // Directive Directive: { leave: ({ name, arguments: args }) => '@' + name + wrap$1('(', join$1(args, ', '), ')'), }, // Type NamedType: { leave: ({ name }) => name, }, ListType: { leave: ({ type }) => '[' + type + ']', }, NonNullType: { leave: ({ type }) => type + '!', }, // Type System Definitions SchemaDefinition: { leave: ({ description, directives, operationTypes }) => wrap$1('', description, '\n') + join$1(['schema', join$1(directives, ' '), block$1(operationTypes)], ' '), }, OperationTypeDefinition: { leave: ({ operation, type }) => operation + ': ' + type, }, ScalarTypeDefinition: { leave: ({ description, name, directives }) => wrap$1('', description, '\n') + join$1(['scalar', name, join$1(directives, ' ')], ' '), }, ObjectTypeDefinition: { leave: ({ description, name, interfaces, directives, fields }) => wrap$1('', description, '\n') + join$1( [ 'type', name, wrap$1('implements ', join$1(interfaces, ' & ')), join$1(directives, ' '), block$1(fields), ], ' ', ), }, FieldDefinition: { leave: ({ description, name, arguments: args, type, directives }) => wrap$1('', description, '\n') + name + (hasMultilineItems$1(args) ? wrap$1('(\n', indent$1(join$1(args, '\n')), '\n)') : wrap$1('(', join$1(args, ', '), ')')) + ': ' + type + wrap$1(' ', join$1(directives, ' ')), }, InputValueDefinition: { leave: ({ description, name, type, defaultValue, directives }) => wrap$1('', description, '\n') + join$1( [name + ': ' + type, wrap$1('= ', defaultValue), join$1(directives, ' ')], ' ', ), }, InterfaceTypeDefinition: { leave: ({ description, name, interfaces, directives, fields }) => wrap$1('', description, '\n') + join$1( [ 'interface', name, wrap$1('implements ', join$1(interfaces, ' & ')), join$1(directives, ' '), block$1(fields), ], ' ', ), }, UnionTypeDefinition: { leave: ({ description, name, directives, types }) => wrap$1('', description, '\n') + join$1( ['union', name, join$1(directives, ' '), wrap$1('= ', join$1(types, ' | '))], ' ', ), }, EnumTypeDefinition: { leave: ({ description, name, directives, values }) => wrap$1('', description, '\n') + join$1(['enum', name, join$1(directives, ' '), block$1(values)], ' '), }, EnumValueDefinition: { leave: ({ description, name, directives }) => wrap$1('', description, '\n') + join$1([name, join$1(directives, ' ')], ' '), }, InputObjectTypeDefinition: { leave: ({ description, name, directives, fields }) => wrap$1('', description, '\n') + join$1(['input', name, join$1(directives, ' '), block$1(fields)], ' '), }, DirectiveDefinition: { leave: ({ description, name, arguments: args, repeatable, locations }) => wrap$1('', description, '\n') + 'directive @' + name + (hasMultilineItems$1(args) ? wrap$1('(\n', indent$1(join$1(args, '\n')), '\n)') : wrap$1('(', join$1(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join$1(locations, ' | '), }, SchemaExtension: { leave: ({ directives, operationTypes }) => join$1( ['extend schema', join$1(directives, ' '), block$1(operationTypes)], ' ', ), }, ScalarTypeExtension: { leave: ({ name, directives }) => join$1(['extend scalar', name, join$1(directives, ' ')], ' '), }, ObjectTypeExtension: { leave: ({ name, interfaces, directives, fields }) => join$1( [ 'extend type', name, wrap$1('implements ', join$1(interfaces, ' & ')), join$1(directives, ' '), block$1(fields), ], ' ', ), }, InterfaceTypeExtension: { leave: ({ name, interfaces, directives, fields }) => join$1( [ 'extend interface', name, wrap$1('implements ', join$1(interfaces, ' & ')), join$1(directives, ' '), block$1(fields), ], ' ', ), }, UnionTypeExtension: { leave: ({ name, directives, types }) => join$1( [ 'extend union', name, join$1(directives, ' '), wrap$1('= ', join$1(types, ' | ')), ], ' ', ), }, EnumTypeExtension: { leave: ({ name, directives, values }) => join$1(['extend enum', name, join$1(directives, ' '), block$1(values)], ' '), }, InputObjectTypeExtension: { leave: ({ name, directives, fields }) => join$1(['extend input', name, join$1(directives, ' '), block$1(fields)], ' '), }, }; /** * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ function join$1(maybeArray, separator = '') { var _maybeArray$filter$jo; return (_maybeArray$filter$jo = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter((x) => x).join(separator)) !== null && _maybeArray$filter$jo !== void 0 ? _maybeArray$filter$jo : ''; } /** * Given array, print each item on its own line, wrapped in an indented `{ }` block. */ function block$1(array) { return wrap$1('{\n', indent$1(join$1(array, '\n')), '\n}'); } /** * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string. */ function wrap$1(start, maybeString, end = '') { return maybeString != null && maybeString !== '' ? start + maybeString + end : ''; } function indent$1(str) { return wrap$1(' ', str.replace(/\n/g, '\n ')); } function hasMultilineItems$1(maybeArray) { var _maybeArray$some; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ return (_maybeArray$some = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some((str) => str.includes('\n'))) !== null && _maybeArray$some !== void 0 ? _maybeArray$some : false; } /** * Produces a JavaScript value given a GraphQL Value AST. * * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value * will reflect the provided GraphQL value AST. * * | GraphQL Value | JavaScript Value | * | -------------------- | ---------------- | * | Input Object | Object | * | List | Array | * | Boolean | Boolean | * | String / Enum | String | * | Int / Float | Number | * | Null | null | * */ function valueFromASTUntyped(valueNode, variables) { switch (valueNode.kind) { case Kind.NULL: return null; case Kind.INT: return parseInt(valueNode.value, 10); case Kind.FLOAT: return parseFloat(valueNode.value); case Kind.STRING: case Kind.ENUM: case Kind.BOOLEAN: return valueNode.value; case Kind.LIST: return valueNode.values.map((node) => valueFromASTUntyped(node, variables), ); case Kind.OBJECT: return keyValMap( valueNode.fields, (field) => field.name.value, (field) => valueFromASTUntyped(field.value, variables), ); case Kind.VARIABLE: return variables === null || variables === void 0 ? void 0 : variables[valueNode.name.value]; } } /** * Upholds the spec rules about naming. */ function assertName(name) { name != null || devAssert(false, 'Must provide name.'); typeof name === 'string' || devAssert(false, 'Expected name to be a string.'); if (name.length === 0) { throw new GraphQLError('Expected name to be a non-empty string.'); } for (let i = 1; i < name.length; ++i) { if (!isNameContinue(name.charCodeAt(i))) { throw new GraphQLError( `Names must only contain [_a-zA-Z0-9] but "${name}" does not.`, ); } } if (!isNameStart(name.charCodeAt(0))) { throw new GraphQLError( `Names must start with [_a-zA-Z] but "${name}" does not.`, ); } return name; } /** * Upholds the spec rules about naming enum values. * * @internal */ function assertEnumValueName(name) { if (name === 'true' || name === 'false' || name === 'null') { throw new GraphQLError(`Enum values cannot be named: ${name}`); } return assertName(name); } function isType(type) { return ( isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type) || isListType(type) || isNonNullType(type) ); } /** * There are predicates for each kind of GraphQL type. */ function isScalarType(type) { return instanceOf(type, GraphQLScalarType); } function isObjectType(type) { return instanceOf(type, GraphQLObjectType); } function isInterfaceType(type) { return instanceOf(type, GraphQLInterfaceType); } function isUnionType(type) { return instanceOf(type, GraphQLUnionType); } function isEnumType(type) { return instanceOf(type, GraphQLEnumType); } function isInputObjectType(type) { return instanceOf(type, GraphQLInputObjectType); } function isListType(type) { return instanceOf(type, GraphQLList); } function isNonNullType(type) { return instanceOf(type, GraphQLNonNull); } /** * These types may be used as input types for arguments and directives. */ function isInputType(type) { return ( isScalarType(type) || isEnumType(type) || isInputObjectType(type) || (isWrappingType(type) && isInputType(type.ofType)) ); } /** * These types may be used as output types as the result of fields. */ function isOutputType(type) { return ( isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || (isWrappingType(type) && isOutputType(type.ofType)) ); } /** * These types may describe types which may be leaf values. */ function isLeafType(type) { return isScalarType(type) || isEnumType(type); } /** * These types may describe the parent context of a selection set. */ function isCompositeType(type) { return isObjectType(type) || isInterfaceType(type) || isUnionType(type); } /** * These types may describe the parent context of a selection set. */ function isAbstractType(type) { return isInterfaceType(type) || isUnionType(type); } /** * List Type Wrapper * * A list is a wrapping type which points to another type. * Lists are often created within the context of defining the fields of * an object type. * * Example: * * ```ts * const PersonType = new GraphQLObjectType({ * name: 'Person', * fields: () => ({ * parents: { type: new GraphQLList(PersonType) }, * children: { type: new GraphQLList(PersonType) }, * }) * }) * ``` */ class GraphQLList { constructor(ofType) { isType(ofType) || devAssert(false, `Expected ${inspect$1(ofType)} to be a GraphQL type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { return 'GraphQLList'; } toString() { return '[' + String(this.ofType) + ']'; } toJSON() { return this.toString(); } } /** * Non-Null Type Wrapper * * A non-null is a wrapping type which points to another type. * Non-null types enforce that their values are never null and can ensure * an error is raised if this ever occurs during a request. It is useful for * fields which you can make a strong guarantee on non-nullability, for example * usually the id field of a database row will never be null. * * Example: * * ```ts * const RowType = new GraphQLObjectType({ * name: 'Row', * fields: () => ({ * id: { type: new GraphQLNonNull(GraphQLString) }, * }) * }) * ``` * Note: the enforcement of non-nullability occurs within the executor. */ class GraphQLNonNull { constructor(ofType) { isNullableType(ofType) || devAssert( false, `Expected ${inspect$1(ofType)} to be a GraphQL nullable type.`, ); this.ofType = ofType; } get [Symbol.toStringTag]() { return 'GraphQLNonNull'; } toString() { return String(this.ofType) + '!'; } toJSON() { return this.toString(); } } /** * These types wrap and modify other types */ function isWrappingType(type) { return isListType(type) || isNonNullType(type); } /** * These types can all accept null as a value. */ function isNullableType(type) { return isType(type) && !isNonNullType(type); } function getNullableType(type) { if (type) { return isNonNullType(type) ? type.ofType : type; } } /** * These named types do not include modifiers like List or NonNull. */ function isNamedType(type) { return ( isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type) ); } function getNamedType(type) { if (type) { let unwrappedType = type; while (isWrappingType(unwrappedType)) { unwrappedType = unwrappedType.ofType; } return unwrappedType; } } /** * Used while defining GraphQL types to allow for circular references in * otherwise immutable type definitions. */ function resolveReadonlyArrayThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } function resolveObjMapThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } /** * Custom extensions * * @remarks * Use a unique identifier name for your extension, for example the name of * your library or project. Do not use a shortened identifier as this increases * the risk of conflicts. We recommend you add at most one extension field, * an object which can contain all the values you need. */ /** * Scalar Type Definition * * The leaf values of any request and input values to arguments are * Scalars (or Enums) and are defined with a name and a series of functions * used to parse input from ast or variables and to ensure validity. * * If a type's serialize function returns `null` or does not return a value * (i.e. it returns `undefined`) then an error will be raised and a `null` * value will be returned in the response. It is always better to validate * * Example: * * ```ts * const OddType = new GraphQLScalarType({ * name: 'Odd', * serialize(value) { * if (!Number.isFinite(value)) { * throw new Error( * `Scalar "Odd" cannot represent "${value}" since it is not a finite number.`, * ); * } * * if (value % 2 === 0) { * throw new Error(`Scalar "Odd" cannot represent "${value}" since it is even.`); * } * return value; * } * }); * ``` */ class GraphQLScalarType { constructor(config) { var _config$parseValue, _config$serialize, _config$parseLiteral, _config$extensionASTN; const parseValue = (_config$parseValue = config.parseValue) !== null && _config$parseValue !== void 0 ? _config$parseValue : identityFunc; this.name = assertName(config.name); this.description = config.description; this.specifiedByURL = config.specifiedByURL; this.serialize = (_config$serialize = config.serialize) !== null && _config$serialize !== void 0 ? _config$serialize : identityFunc; this.parseValue = parseValue; this.parseLiteral = (_config$parseLiteral = config.parseLiteral) !== null && _config$parseLiteral !== void 0 ? _config$parseLiteral : (node, variables) => parseValue(valueFromASTUntyped(node, variables)); this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; config.specifiedByURL == null || typeof config.specifiedByURL === 'string' || devAssert( false, `${this.name} must provide "specifiedByURL" as a string, ` + `but got: ${inspect$1(config.specifiedByURL)}.`, ); config.serialize == null || typeof config.serialize === 'function' || devAssert( false, `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`, ); if (config.parseLiteral) { (typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function') || devAssert( false, `${this.name} must provide both "parseValue" and "parseLiteral" functions.`, ); } } get [Symbol.toStringTag]() { return 'GraphQLScalarType'; } toConfig() { return { name: this.name, description: this.description, specifiedByURL: this.specifiedByURL, serialize: this.serialize, parseValue: this.parseValue, parseLiteral: this.parseLiteral, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } /** * Object Type Definition * * Almost all of the GraphQL types you define will be object types. Object types * have a name, but most importantly describe their fields. * * Example: * * ```ts * const AddressType = new GraphQLObjectType({ * name: 'Address', * fields: { * street: { type: GraphQLString }, * number: { type: GraphQLInt }, * formatted: { * type: GraphQLString, * resolve(obj) { * return obj.number + ' ' + obj.street * } * } * } * }); * ``` * * When two types need to refer to each other, or a type needs to refer to * itself in a field, you can use a function expression (aka a closure or a * thunk) to supply the fields lazily. * * Example: * * ```ts * const PersonType = new GraphQLObjectType({ * name: 'Person', * fields: () => ({ * name: { type: GraphQLString }, * bestFriend: { type: PersonType }, * }) * }); * ``` */ class GraphQLObjectType { constructor(config) { var _config$extensionASTN2; this.name = assertName(config.name); this.description = config.description; this.isTypeOf = config.isTypeOf; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN2 = config.extensionASTNodes) !== null && _config$extensionASTN2 !== void 0 ? _config$extensionASTN2 : []; this._fields = () => defineFieldMap(config); this._interfaces = () => defineInterfaces(config); config.isTypeOf == null || typeof config.isTypeOf === 'function' || devAssert( false, `${this.name} must provide "isTypeOf" as a function, ` + `but got: ${inspect$1(config.isTypeOf)}.`, ); } get [Symbol.toStringTag]() { return 'GraphQLObjectType'; } getFields() { if (typeof this._fields === 'function') { this._fields = this._fields(); } return this._fields; } getInterfaces() { if (typeof this._interfaces === 'function') { this._interfaces = this._interfaces(); } return this._interfaces; } toConfig() { return { name: this.name, description: this.description, interfaces: this.getInterfaces(), fields: fieldsToFieldsConfig(this.getFields()), isTypeOf: this.isTypeOf, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } function defineInterfaces(config) { var _config$interfaces; const interfaces = resolveReadonlyArrayThunk( (_config$interfaces = config.interfaces) !== null && _config$interfaces !== void 0 ? _config$interfaces : [], ); Array.isArray(interfaces) || devAssert( false, `${config.name} interfaces must be an Array or a function which returns an Array.`, ); return interfaces; } function defineFieldMap(config) { const fieldMap = resolveObjMapThunk(config.fields); isPlainObj(fieldMap) || devAssert( false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`, ); return mapValue(fieldMap, (fieldConfig, fieldName) => { var _fieldConfig$args; isPlainObj(fieldConfig) || devAssert( false, `${config.name}.${fieldName} field config must be an object.`, ); fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || devAssert( false, `${config.name}.${fieldName} field resolver must be a function if ` + `provided, but got: ${inspect$1(fieldConfig.resolve)}.`, ); const argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {}; isPlainObj(argsConfig) || devAssert( false, `${config.name}.${fieldName} args must be an object with argument names as keys.`, ); return { name: assertName(fieldName), description: fieldConfig.description, type: fieldConfig.type, args: defineArguments(argsConfig), resolve: fieldConfig.resolve, subscribe: fieldConfig.subscribe, deprecationReason: fieldConfig.deprecationReason, extensions: toObjMap(fieldConfig.extensions), astNode: fieldConfig.astNode, }; }); } function defineArguments(config) { return Object.entries(config).map(([argName, argConfig]) => ({ name: assertName(argName), description: argConfig.description, type: argConfig.type, defaultValue: argConfig.defaultValue, deprecationReason: argConfig.deprecationReason, extensions: toObjMap(argConfig.extensions), astNode: argConfig.astNode, })); } function isPlainObj(obj) { return isObjectLike(obj) && !Array.isArray(obj); } function fieldsToFieldsConfig(fields) { return mapValue(fields, (field) => ({ description: field.description, type: field.type, args: argsToArgsConfig(field.args), resolve: field.resolve, subscribe: field.subscribe, deprecationReason: field.deprecationReason, extensions: field.extensions, astNode: field.astNode, })); } /** * @internal */ function argsToArgsConfig(args) { return keyValMap( args, (arg) => arg.name, (arg) => ({ description: arg.description, type: arg.type, defaultValue: arg.defaultValue, deprecationReason: arg.deprecationReason, extensions: arg.extensions, astNode: arg.astNode, }), ); } function isRequiredArgument(arg) { return isNonNullType(arg.type) && arg.defaultValue === undefined; } /** * Interface Type Definition * * When a field can return one of a heterogeneous set of types, a Interface type * is used to describe what types are possible, what fields are in common across * all types, as well as a function to determine which type is actually used * when the field is resolved. * * Example: * * ```ts * const EntityType = new GraphQLInterfaceType({ * name: 'Entity', * fields: { * name: { type: GraphQLString } * } * }); * ``` */ class GraphQLInterfaceType { constructor(config) { var _config$extensionASTN3; this.name = assertName(config.name); this.description = config.description; this.resolveType = config.resolveType; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN3 = config.extensionASTNodes) !== null && _config$extensionASTN3 !== void 0 ? _config$extensionASTN3 : []; this._fields = defineFieldMap.bind(undefined, config); this._interfaces = defineInterfaces.bind(undefined, config); config.resolveType == null || typeof config.resolveType === 'function' || devAssert( false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${inspect$1(config.resolveType)}.`, ); } get [Symbol.toStringTag]() { return 'GraphQLInterfaceType'; } getFields() { if (typeof this._fields === 'function') { this._fields = this._fields(); } return this._fields; } getInterfaces() { if (typeof this._interfaces === 'function') { this._interfaces = this._interfaces(); } return this._interfaces; } toConfig() { return { name: this.name, description: this.description, interfaces: this.getInterfaces(), fields: fieldsToFieldsConfig(this.getFields()), resolveType: this.resolveType, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } /** * Union Type Definition * * When a field can return one of a heterogeneous set of types, a Union type * is used to describe what types are possible as well as providing a function * to determine which type is actually used when the field is resolved. * * Example: * * ```ts * const PetType = new GraphQLUnionType({ * name: 'Pet', * types: [ DogType, CatType ], * resolveType(value) { * if (value instanceof Dog) { * return DogType; * } * if (value instanceof Cat) { * return CatType; * } * } * }); * ``` */ class GraphQLUnionType { constructor(config) { var _config$extensionASTN4; this.name = assertName(config.name); this.description = config.description; this.resolveType = config.resolveType; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN4 = config.extensionASTNodes) !== null && _config$extensionASTN4 !== void 0 ? _config$extensionASTN4 : []; this._types = defineTypes.bind(undefined, config); config.resolveType == null || typeof config.resolveType === 'function' || devAssert( false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${inspect$1(config.resolveType)}.`, ); } get [Symbol.toStringTag]() { return 'GraphQLUnionType'; } getTypes() { if (typeof this._types === 'function') { this._types = this._types(); } return this._types; } toConfig() { return { name: this.name, description: this.description, types: this.getTypes(), resolveType: this.resolveType, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } function defineTypes(config) { const types = resolveReadonlyArrayThunk(config.types); Array.isArray(types) || devAssert( false, `Must provide Array of types or a function which returns such an array for Union ${config.name}.`, ); return types; } /** * Enum Type Definition * * Some leaf values of requests and input values are Enums. GraphQL serializes * Enum values as strings, however internally Enums can be represented by any * kind of type, often integers. * * Example: * * ```ts * const RGBType = new GraphQLEnumType({ * name: 'RGB', * values: { * RED: { value: 0 }, * GREEN: { value: 1 }, * BLUE: { value: 2 } * } * }); * ``` * * Note: If a value is not provided in a definition, the name of the enum value * will be used as its internal value. */ class GraphQLEnumType { /* */ constructor(config) { var _config$extensionASTN5; this.name = assertName(config.name); this.description = config.description; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN5 = config.extensionASTNodes) !== null && _config$extensionASTN5 !== void 0 ? _config$extensionASTN5 : []; this._values = defineEnumValues(this.name, config.values); this._valueLookup = new Map( this._values.map((enumValue) => [enumValue.value, enumValue]), ); this._nameLookup = keyMap(this._values, (value) => value.name); } get [Symbol.toStringTag]() { return 'GraphQLEnumType'; } getValues() { return this._values; } getValue(name) { return this._nameLookup[name]; } serialize(outputValue) { const enumValue = this._valueLookup.get(outputValue); if (enumValue === undefined) { throw new GraphQLError( `Enum "${this.name}" cannot represent value: ${inspect$1(outputValue)}`, ); } return enumValue.name; } parseValue(inputValue) /* T */ { if (typeof inputValue !== 'string') { const valueStr = inspect$1(inputValue); throw new GraphQLError( `Enum "${this.name}" cannot represent non-string value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr), ); } const enumValue = this.getValue(inputValue); if (enumValue == null) { throw new GraphQLError( `Value "${inputValue}" does not exist in "${this.name}" enum.` + didYouMeanEnumValue(this, inputValue), ); } return enumValue.value; } parseLiteral(valueNode, _variables) /* T */ { // Note: variables will be resolved to a value before calling this function. if (valueNode.kind !== Kind.ENUM) { const valueStr = print(valueNode); throw new GraphQLError( `Enum "${this.name}" cannot represent non-enum value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr), { nodes: valueNode, }, ); } const enumValue = this.getValue(valueNode.value); if (enumValue == null) { const valueStr = print(valueNode); throw new GraphQLError( `Value "${valueStr}" does not exist in "${this.name}" enum.` + didYouMeanEnumValue(this, valueStr), { nodes: valueNode, }, ); } return enumValue.value; } toConfig() { const values = keyValMap( this.getValues(), (value) => value.name, (value) => ({ description: value.description, value: value.value, deprecationReason: value.deprecationReason, extensions: value.extensions, astNode: value.astNode, }), ); return { name: this.name, description: this.description, values, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } function didYouMeanEnumValue(enumType, unknownValueStr) { const allNames = enumType.getValues().map((value) => value.name); const suggestedValues = suggestionList(unknownValueStr, allNames); return didYouMean('the enum value', suggestedValues); } function defineEnumValues(typeName, valueMap) { isPlainObj(valueMap) || devAssert( false, `${typeName} values must be an object with value names as keys.`, ); return Object.entries(valueMap).map(([valueName, valueConfig]) => { isPlainObj(valueConfig) || devAssert( false, `${typeName}.${valueName} must refer to an object with a "value" key ` + `representing an internal value but got: ${inspect$1(valueConfig)}.`, ); return { name: assertEnumValueName(valueName), description: valueConfig.description, value: valueConfig.value !== undefined ? valueConfig.value : valueName, deprecationReason: valueConfig.deprecationReason, extensions: toObjMap(valueConfig.extensions), astNode: valueConfig.astNode, }; }); } /** * Input Object Type Definition * * An input object defines a structured collection of fields which may be * supplied to a field argument. * * Using `NonNull` will ensure that a value must be provided by the query * * Example: * * ```ts * const GeoPoint = new GraphQLInputObjectType({ * name: 'GeoPoint', * fields: { * lat: { type: new GraphQLNonNull(GraphQLFloat) }, * lon: { type: new GraphQLNonNull(GraphQLFloat) }, * alt: { type: GraphQLFloat, defaultValue: 0 }, * } * }); * ``` */ class GraphQLInputObjectType { constructor(config) { var _config$extensionASTN6; this.name = assertName(config.name); this.description = config.description; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN6 = config.extensionASTNodes) !== null && _config$extensionASTN6 !== void 0 ? _config$extensionASTN6 : []; this._fields = defineInputFieldMap.bind(undefined, config); } get [Symbol.toStringTag]() { return 'GraphQLInputObjectType'; } getFields() { if (typeof this._fields === 'function') { this._fields = this._fields(); } return this._fields; } toConfig() { const fields = mapValue(this.getFields(), (field) => ({ description: field.description, type: field.type, defaultValue: field.defaultValue, deprecationReason: field.deprecationReason, extensions: field.extensions, astNode: field.astNode, })); return { name: this.name, description: this.description, fields, extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, }; } toString() { return this.name; } toJSON() { return this.toString(); } } function defineInputFieldMap(config) { const fieldMap = resolveObjMapThunk(config.fields); isPlainObj(fieldMap) || devAssert( false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`, ); return mapValue(fieldMap, (fieldConfig, fieldName) => { !('resolve' in fieldConfig) || devAssert( false, `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`, ); return { name: assertName(fieldName), description: fieldConfig.description, type: fieldConfig.type, defaultValue: fieldConfig.defaultValue, deprecationReason: fieldConfig.deprecationReason, extensions: toObjMap(fieldConfig.extensions), astNode: fieldConfig.astNode, }; }); } function isRequiredInputField(field) { return isNonNullType(field.type) && field.defaultValue === undefined; } /** * Provided two types, return true if the types are equal (invariant). */ function isEqualType(typeA, typeB) { // Equivalent types are equal. if (typeA === typeB) { return true; } // If either type is non-null, the other must also be non-null. if (isNonNullType(typeA) && isNonNullType(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); } // If either type is a list, the other must also be a list. if (isListType(typeA) && isListType(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); } // Otherwise the types are not equal. return false; } /** * Provided a type and a super type, return true if the first type is either * equal or a subset of the second super type (covariant). */ function isTypeSubTypeOf(schema, maybeSubType, superType) { // Equivalent type is a valid subtype if (maybeSubType === superType) { return true; } // If superType is non-null, maybeSubType must also be non-null. if (isNonNullType(superType)) { if (isNonNullType(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); } return false; } if (isNonNullType(maybeSubType)) { // If superType is nullable, maybeSubType may be non-null or nullable. return isTypeSubTypeOf(schema, maybeSubType.ofType, superType); } // If superType type is a list, maybeSubType type must also be a list. if (isListType(superType)) { if (isListType(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); } return false; } if (isListType(maybeSubType)) { // If superType is not a list, maybeSubType must also be not a list. return false; } // If superType type is an abstract type, check if it is super type of maybeSubType. // Otherwise, the child type is not a valid subtype of the parent type. return ( isAbstractType(superType) && (isInterfaceType(maybeSubType) || isObjectType(maybeSubType)) && schema.isSubType(superType, maybeSubType) ); } /** * Provided two composite types, determine if they "overlap". Two composite * types overlap when the Sets of possible concrete types for each intersect. * * This is often used to determine if a fragment of a given type could possibly * be visited in a context of another type. * * This function is commutative. */ function doTypesOverlap(schema, typeA, typeB) { // Equivalent types overlap if (typeA === typeB) { return true; } if (isAbstractType(typeA)) { if (isAbstractType(typeB)) { // If both types are abstract, then determine if there is any intersection // between possible concrete types of each. return schema .getPossibleTypes(typeA) .some((type) => schema.isSubType(typeB, type)); } // Determine if the latter type is a possible concrete type of the former. return schema.isSubType(typeA, typeB); } if (isAbstractType(typeB)) { // Determine if the former type is a possible concrete type of the latter. return schema.isSubType(typeB, typeA); } // Otherwise the types do not overlap. return false; } /** * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 * */ const GRAPHQL_MAX_INT = 2147483647; /** * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) * */ const GRAPHQL_MIN_INT = -2147483648; const GraphQLInt = new GraphQLScalarType({ name: 'Int', description: 'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.', serialize(outputValue) { const coercedValue = serializeObject(outputValue); if (typeof coercedValue === 'boolean') { return coercedValue ? 1 : 0; } let num = coercedValue; if (typeof coercedValue === 'string' && coercedValue !== '') { num = Number(coercedValue); } if (typeof num !== 'number' || !Number.isInteger(num)) { throw new GraphQLError( `Int cannot represent non-integer value: ${inspect$1(coercedValue)}`, ); } if (num > GRAPHQL_MAX_INT || num < GRAPHQL_MIN_INT) { throw new GraphQLError( 'Int cannot represent non 32-bit signed integer value: ' + inspect$1(coercedValue), ); } return num; }, parseValue(inputValue) { if (typeof inputValue !== 'number' || !Number.isInteger(inputValue)) { throw new GraphQLError( `Int cannot represent non-integer value: ${inspect$1(inputValue)}`, ); } if (inputValue > GRAPHQL_MAX_INT || inputValue < GRAPHQL_MIN_INT) { throw new GraphQLError( `Int cannot represent non 32-bit signed integer value: ${inputValue}`, ); } return inputValue; }, parseLiteral(valueNode) { if (valueNode.kind !== Kind.INT) { throw new GraphQLError( `Int cannot represent non-integer value: ${print(valueNode)}`, { nodes: valueNode, }, ); } const num = parseInt(valueNode.value, 10); if (num > GRAPHQL_MAX_INT || num < GRAPHQL_MIN_INT) { throw new GraphQLError( `Int cannot represent non 32-bit signed integer value: ${valueNode.value}`, { nodes: valueNode, }, ); } return num; }, }); const GraphQLFloat = new GraphQLScalarType({ name: 'Float', description: 'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).', serialize(outputValue) { const coercedValue = serializeObject(outputValue); if (typeof coercedValue === 'boolean') { return coercedValue ? 1 : 0; } let num = coercedValue; if (typeof coercedValue === 'string' && coercedValue !== '') { num = Number(coercedValue); } if (typeof num !== 'number' || !Number.isFinite(num)) { throw new GraphQLError( `Float cannot represent non numeric value: ${inspect$1(coercedValue)}`, ); } return num; }, parseValue(inputValue) { if (typeof inputValue !== 'number' || !Number.isFinite(inputValue)) { throw new GraphQLError( `Float cannot represent non numeric value: ${inspect$1(inputValue)}`, ); } return inputValue; }, parseLiteral(valueNode) { if (valueNode.kind !== Kind.FLOAT && valueNode.kind !== Kind.INT) { throw new GraphQLError( `Float cannot represent non numeric value: ${print(valueNode)}`, valueNode, ); } return parseFloat(valueNode.value); }, }); const GraphQLString = new GraphQLScalarType({ name: 'String', description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.', serialize(outputValue) { const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not // attempt to coerce object, function, symbol, or other types as strings. if (typeof coercedValue === 'string') { return coercedValue; } if (typeof coercedValue === 'boolean') { return coercedValue ? 'true' : 'false'; } if (typeof coercedValue === 'number' && Number.isFinite(coercedValue)) { return coercedValue.toString(); } throw new GraphQLError( `String cannot represent value: ${inspect$1(outputValue)}`, ); }, parseValue(inputValue) { if (typeof inputValue !== 'string') { throw new GraphQLError( `String cannot represent a non string value: ${inspect$1(inputValue)}`, ); } return inputValue; }, parseLiteral(valueNode) { if (valueNode.kind !== Kind.STRING) { throw new GraphQLError( `String cannot represent a non string value: ${print(valueNode)}`, { nodes: valueNode, }, ); } return valueNode.value; }, }); const GraphQLBoolean = new GraphQLScalarType({ name: 'Boolean', description: 'The `Boolean` scalar type represents `true` or `false`.', serialize(outputValue) { const coercedValue = serializeObject(outputValue); if (typeof coercedValue === 'boolean') { return coercedValue; } if (Number.isFinite(coercedValue)) { return coercedValue !== 0; } throw new GraphQLError( `Boolean cannot represent a non boolean value: ${inspect$1(coercedValue)}`, ); }, parseValue(inputValue) { if (typeof inputValue !== 'boolean') { throw new GraphQLError( `Boolean cannot represent a non boolean value: ${inspect$1(inputValue)}`, ); } return inputValue; }, parseLiteral(valueNode) { if (valueNode.kind !== Kind.BOOLEAN) { throw new GraphQLError( `Boolean cannot represent a non boolean value: ${print(valueNode)}`, { nodes: valueNode, }, ); } return valueNode.value; }, }); const GraphQLID = new GraphQLScalarType({ name: 'ID', description: 'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.', serialize(outputValue) { const coercedValue = serializeObject(outputValue); if (typeof coercedValue === 'string') { return coercedValue; } if (Number.isInteger(coercedValue)) { return String(coercedValue); } throw new GraphQLError( `ID cannot represent value: ${inspect$1(outputValue)}`, ); }, parseValue(inputValue) { if (typeof inputValue === 'string') { return inputValue; } if (typeof inputValue === 'number' && Number.isInteger(inputValue)) { return inputValue.toString(); } throw new GraphQLError(`ID cannot represent value: ${inspect$1(inputValue)}`); }, parseLiteral(valueNode) { if (valueNode.kind !== Kind.STRING && valueNode.kind !== Kind.INT) { throw new GraphQLError( 'ID cannot represent a non-string and non-integer value: ' + print(valueNode), { nodes: valueNode, }, ); } return valueNode.value; }, }); const specifiedScalarTypes = Object.freeze([ GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLID, ]); function isSpecifiedScalarType(type) { return specifiedScalarTypes.some(({ name }) => type.name === name); } // Support serializing objects with custom valueOf() or toJSON() functions - // a common way to represent a complex value which can be represented as // a string (ex: MongoDB id objects). function serializeObject(outputValue) { if (isObjectLike(outputValue)) { if (typeof outputValue.valueOf === 'function') { const valueOfResult = outputValue.valueOf(); if (!isObjectLike(valueOfResult)) { return valueOfResult; } } if (typeof outputValue.toJSON === 'function') { return outputValue.toJSON(); } } return outputValue; } /** * Test if the given value is a GraphQL directive. */ function isDirective(directive) { return instanceOf(directive, GraphQLDirective); } /** * Custom extensions * * @remarks * Use a unique identifier name for your extension, for example the name of * your library or project. Do not use a shortened identifier as this increases * the risk of conflicts. We recommend you add at most one extension field, * an object which can contain all the values you need. */ /** * Directives are used by the GraphQL runtime as a way of modifying execution * behavior. Type system creators will usually not create these directly. */ class GraphQLDirective { constructor(config) { var _config$isRepeatable, _config$args; this.name = assertName(config.name); this.description = config.description; this.locations = config.locations; this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; Array.isArray(config.locations) || devAssert(false, `@${config.name} locations must be an Array.`); const args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {}; (isObjectLike(args) && !Array.isArray(args)) || devAssert( false, `@${config.name} args must be an object with argument names as keys.`, ); this.args = defineArguments(args); } get [Symbol.toStringTag]() { return 'GraphQLDirective'; } toConfig() { return { name: this.name, description: this.description, locations: this.locations, args: argsToArgsConfig(this.args), isRepeatable: this.isRepeatable, extensions: this.extensions, astNode: this.astNode, }; } toString() { return '@' + this.name; } toJSON() { return this.toString(); } } /** * Used to conditionally include fields or fragments. */ const GraphQLIncludeDirective = new GraphQLDirective({ name: 'include', description: 'Directs the executor to include this field or fragment only when the `if` argument is true.', locations: [ DirectiveLocation$1.FIELD, DirectiveLocation$1.FRAGMENT_SPREAD, DirectiveLocation$1.INLINE_FRAGMENT, ], args: { if: { type: new GraphQLNonNull(GraphQLBoolean), description: 'Included when true.', }, }, }); /** * Used to conditionally skip (exclude) fields or fragments. */ const GraphQLSkipDirective = new GraphQLDirective({ name: 'skip', description: 'Directs the executor to skip this field or fragment when the `if` argument is true.', locations: [ DirectiveLocation$1.FIELD, DirectiveLocation$1.FRAGMENT_SPREAD, DirectiveLocation$1.INLINE_FRAGMENT, ], args: { if: { type: new GraphQLNonNull(GraphQLBoolean), description: 'Skipped when true.', }, }, }); /** * Constant string used for default reason for a deprecation. */ const DEFAULT_DEPRECATION_REASON = 'No longer supported'; /** * Used to declare element of a GraphQL schema as deprecated. */ const GraphQLDeprecatedDirective = new GraphQLDirective({ name: 'deprecated', description: 'Marks an element of a GraphQL schema as no longer supported.', locations: [ DirectiveLocation$1.FIELD_DEFINITION, DirectiveLocation$1.ARGUMENT_DEFINITION, DirectiveLocation$1.INPUT_FIELD_DEFINITION, DirectiveLocation$1.ENUM_VALUE, ], args: { reason: { type: GraphQLString, description: 'Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).', defaultValue: DEFAULT_DEPRECATION_REASON, }, }, }); /** * Used to provide a URL for specifying the behavior of custom scalar definitions. */ const GraphQLSpecifiedByDirective = new GraphQLDirective({ name: 'specifiedBy', description: 'Exposes a URL that specifies the behavior of this scalar.', locations: [DirectiveLocation$1.SCALAR], args: { url: { type: new GraphQLNonNull(GraphQLString), description: 'The URL that specifies the behavior of this scalar.', }, }, }); /** * The full list of specified directives. */ const specifiedDirectives = Object.freeze([ GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, ]); function isSpecifiedDirective(directive) { return specifiedDirectives.some(({ name }) => name === directive.name); } /** * Returns true if the provided object is an Object (i.e. not a string literal) * and implements the Iterator protocol. * * This may be used in place of [Array.isArray()][isArray] to determine if * an object should be iterated-over e.g. Array, Map, Set, Int8Array, * TypedArray, etc. but excludes string literals. * * @example * ```ts * isIterableObject([ 1, 2, 3 ]) // true * isIterableObject(new Map()) // true * isIterableObject('ABC') // false * isIterableObject({ key: 'value' }) // false * isIterableObject({ length: 1, 0: 'Alpha' }) // false * ``` */ function isIterableObject(maybeIterable) { return ( typeof maybeIterable === 'object' && typeof (maybeIterable === null || maybeIterable === void 0 ? void 0 : maybeIterable[Symbol.iterator]) === 'function' ); } /** * Produces a GraphQL Value AST given a JavaScript object. * Function will match JavaScript/JSON values to GraphQL AST schema format * by using suggested GraphQLInputType. For example: * * astFromValue("value", GraphQLString) * * A GraphQL type must be provided, which will be used to interpret different * JavaScript values. * * | JSON Value | GraphQL Value | * | ------------- | -------------------- | * | Object | Input Object | * | Array | List | * | Boolean | Boolean | * | String | String / Enum Value | * | Number | Int / Float | * | Unknown | Enum Value | * | null | NullValue | * */ function astFromValue(value, type) { if (isNonNullType(type)) { const astValue = astFromValue(value, type.ofType); if ( (astValue === null || astValue === void 0 ? void 0 : astValue.kind) === Kind.NULL ) { return null; } return astValue; } // only explicit null, not undefined, NaN if (value === null) { return { kind: Kind.NULL, }; } // undefined if (value === undefined) { return null; } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. if (isListType(type)) { const itemType = type.ofType; if (isIterableObject(value)) { const valuesNodes = []; for (const item of value) { const itemNode = astFromValue(item, itemType); if (itemNode != null) { valuesNodes.push(itemNode); } } return { kind: Kind.LIST, values: valuesNodes, }; } return astFromValue(value, itemType); } // Populate the fields of the input object by creating ASTs from each value // in the JavaScript object according to the fields in the input type. if (isInputObjectType(type)) { if (!isObjectLike(value)) { return null; } const fieldNodes = []; for (const field of Object.values(type.getFields())) { const fieldValue = astFromValue(value[field.name], field.type); if (fieldValue) { fieldNodes.push({ kind: Kind.OBJECT_FIELD, name: { kind: Kind.NAME, value: field.name, }, value: fieldValue, }); } } return { kind: Kind.OBJECT, fields: fieldNodes, }; } if (isLeafType(type)) { // Since value is an internally represented value, it must be serialized // to an externally represented value before converting into an AST. const serialized = type.serialize(value); if (serialized == null) { return null; } // Others serialize based on their corresponding JavaScript scalar types. if (typeof serialized === 'boolean') { return { kind: Kind.BOOLEAN, value: serialized, }; } // JavaScript numbers can be Int or Float values. if (typeof serialized === 'number' && Number.isFinite(serialized)) { const stringNum = String(serialized); return integerStringRegExp$1.test(stringNum) ? { kind: Kind.INT, value: stringNum, } : { kind: Kind.FLOAT, value: stringNum, }; } if (typeof serialized === 'string') { // Enum types use Enum literals. if (isEnumType(type)) { return { kind: Kind.ENUM, value: serialized, }; } // ID types can use Int literals. if (type === GraphQLID && integerStringRegExp$1.test(serialized)) { return { kind: Kind.INT, value: serialized, }; } return { kind: Kind.STRING, value: serialized, }; } throw new TypeError(`Cannot convert value to AST: ${inspect$1(serialized)}.`); } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. invariant$1(false, 'Unexpected input type: ' + inspect$1(type)); } /** * IntValue: * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ const integerStringRegExp$1 = /^-?(?:0|[1-9][0-9]*)$/; const __Schema = new GraphQLObjectType({ name: '__Schema', description: 'A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.', fields: () => ({ description: { type: GraphQLString, resolve: (schema) => schema.description, }, types: { description: 'A list of all types supported by this server.', type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(__Type))), resolve(schema) { return Object.values(schema.getTypeMap()); }, }, queryType: { description: 'The type that query operations will be rooted at.', type: new GraphQLNonNull(__Type), resolve: (schema) => schema.getQueryType(), }, mutationType: { description: 'If this server supports mutation, the type that mutation operations will be rooted at.', type: __Type, resolve: (schema) => schema.getMutationType(), }, subscriptionType: { description: 'If this server support subscription, the type that subscription operations will be rooted at.', type: __Type, resolve: (schema) => schema.getSubscriptionType(), }, directives: { description: 'A list of all directives supported by this server.', type: new GraphQLNonNull( new GraphQLList(new GraphQLNonNull(__Directive)), ), resolve: (schema) => schema.getDirectives(), }, }), }); const __Directive = new GraphQLObjectType({ name: '__Directive', description: "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", fields: () => ({ name: { type: new GraphQLNonNull(GraphQLString), resolve: (directive) => directive.name, }, description: { type: GraphQLString, resolve: (directive) => directive.description, }, isRepeatable: { type: new GraphQLNonNull(GraphQLBoolean), resolve: (directive) => directive.isRepeatable, }, locations: { type: new GraphQLNonNull( new GraphQLList(new GraphQLNonNull(__DirectiveLocation)), ), resolve: (directive) => directive.locations, }, args: { type: new GraphQLNonNull( new GraphQLList(new GraphQLNonNull(__InputValue)), ), args: { includeDeprecated: { type: GraphQLBoolean, defaultValue: false, }, }, resolve(field, { includeDeprecated }) { return includeDeprecated ? field.args : field.args.filter((arg) => arg.deprecationReason == null); }, }, }), }); const __DirectiveLocation = new GraphQLEnumType({ name: '__DirectiveLocation', description: 'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.', values: { QUERY: { value: DirectiveLocation$1.QUERY, description: 'Location adjacent to a query operation.', }, MUTATION: { value: DirectiveLocation$1.MUTATION, description: 'Location adjacent to a mutation operation.', }, SUBSCRIPTION: { value: DirectiveLocation$1.SUBSCRIPTION, description: 'Location adjacent to a subscription operation.', }, FIELD: { value: DirectiveLocation$1.FIELD, description: 'Location adjacent to a field.', }, FRAGMENT_DEFINITION: { value: DirectiveLocation$1.FRAGMENT_DEFINITION, description: 'Location adjacent to a fragment definition.', }, FRAGMENT_SPREAD: { value: DirectiveLocation$1.FRAGMENT_SPREAD, description: 'Location adjacent to a fragment spread.', }, INLINE_FRAGMENT: { value: DirectiveLocation$1.INLINE_FRAGMENT, description: 'Location adjacent to an inline fragment.', }, VARIABLE_DEFINITION: { value: DirectiveLocation$1.VARIABLE_DEFINITION, description: 'Location adjacent to a variable definition.', }, SCHEMA: { value: DirectiveLocation$1.SCHEMA, description: 'Location adjacent to a schema definition.', }, SCALAR: { value: DirectiveLocation$1.SCALAR, description: 'Location adjacent to a scalar definition.', }, OBJECT: { value: DirectiveLocation$1.OBJECT, description: 'Location adjacent to an object type definition.', }, FIELD_DEFINITION: { value: DirectiveLocation$1.FIELD_DEFINITION, description: 'Location adjacent to a field definition.', }, ARGUMENT_DEFINITION: { value: DirectiveLocation$1.ARGUMENT_DEFINITION, description: 'Location adjacent to an argument definition.', }, INTERFACE: { value: DirectiveLocation$1.INTERFACE, description: 'Location adjacent to an interface definition.', }, UNION: { value: DirectiveLocation$1.UNION, description: 'Location adjacent to a union definition.', }, ENUM: { value: DirectiveLocation$1.ENUM, description: 'Location adjacent to an enum definition.', }, ENUM_VALUE: { value: DirectiveLocation$1.ENUM_VALUE, description: 'Location adjacent to an enum value definition.', }, INPUT_OBJECT: { value: DirectiveLocation$1.INPUT_OBJECT, description: 'Location adjacent to an input object type definition.', }, INPUT_FIELD_DEFINITION: { value: DirectiveLocation$1.INPUT_FIELD_DEFINITION, description: 'Location adjacent to an input object field definition.', }, }, }); const __Type = new GraphQLObjectType({ name: '__Type', description: 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.', fields: () => ({ kind: { type: new GraphQLNonNull(__TypeKind), resolve(type) { if (isScalarType(type)) { return TypeKind.SCALAR; } if (isObjectType(type)) { return TypeKind.OBJECT; } if (isInterfaceType(type)) { return TypeKind.INTERFACE; } if (isUnionType(type)) { return TypeKind.UNION; } if (isEnumType(type)) { return TypeKind.ENUM; } if (isInputObjectType(type)) { return TypeKind.INPUT_OBJECT; } if (isListType(type)) { return TypeKind.LIST; } if (isNonNullType(type)) { return TypeKind.NON_NULL; } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered) invariant$1(false, `Unexpected type: "${inspect$1(type)}".`); }, }, name: { type: GraphQLString, resolve: (type) => ('name' in type ? type.name : undefined), }, description: { type: GraphQLString, resolve: ( type, // FIXME: add test case ) => /* c8 ignore next */ 'description' in type ? type.description : undefined, }, specifiedByURL: { type: GraphQLString, resolve: (obj) => 'specifiedByURL' in obj ? obj.specifiedByURL : undefined, }, fields: { type: new GraphQLList(new GraphQLNonNull(__Field)), args: { includeDeprecated: { type: GraphQLBoolean, defaultValue: false, }, }, resolve(type, { includeDeprecated }) { if (isObjectType(type) || isInterfaceType(type)) { const fields = Object.values(type.getFields()); return includeDeprecated ? fields : fields.filter((field) => field.deprecationReason == null); } }, }, interfaces: { type: new GraphQLList(new GraphQLNonNull(__Type)), resolve(type) { if (isObjectType(type) || isInterfaceType(type)) { return type.getInterfaces(); } }, }, possibleTypes: { type: new GraphQLList(new GraphQLNonNull(__Type)), resolve(type, _args, _context, { schema }) { if (isAbstractType(type)) { return schema.getPossibleTypes(type); } }, }, enumValues: { type: new GraphQLList(new GraphQLNonNull(__EnumValue)), args: { includeDeprecated: { type: GraphQLBoolean, defaultValue: false, }, }, resolve(type, { includeDeprecated }) { if (isEnumType(type)) { const values = type.getValues(); return includeDeprecated ? values : values.filter((field) => field.deprecationReason == null); } }, }, inputFields: { type: new GraphQLList(new GraphQLNonNull(__InputValue)), args: { includeDeprecated: { type: GraphQLBoolean, defaultValue: false, }, }, resolve(type, { includeDeprecated }) { if (isInputObjectType(type)) { const values = Object.values(type.getFields()); return includeDeprecated ? values : values.filter((field) => field.deprecationReason == null); } }, }, ofType: { type: __Type, resolve: (type) => ('ofType' in type ? type.ofType : undefined), }, }), }); const __Field = new GraphQLObjectType({ name: '__Field', description: 'Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.', fields: () => ({ name: { type: new GraphQLNonNull(GraphQLString), resolve: (field) => field.name, }, description: { type: GraphQLString, resolve: (field) => field.description, }, args: { type: new GraphQLNonNull( new GraphQLList(new GraphQLNonNull(__InputValue)), ), args: { includeDeprecated: { type: GraphQLBoolean, defaultValue: false, }, }, resolve(field, { includeDeprecated }) { return includeDeprecated ? field.args : field.args.filter((arg) => arg.deprecationReason == null); }, }, type: { type: new GraphQLNonNull(__Type), resolve: (field) => field.type, }, isDeprecated: { type: new GraphQLNonNull(GraphQLBoolean), resolve: (field) => field.deprecationReason != null, }, deprecationReason: { type: GraphQLString, resolve: (field) => field.deprecationReason, }, }), }); const __InputValue = new GraphQLObjectType({ name: '__InputValue', description: 'Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.', fields: () => ({ name: { type: new GraphQLNonNull(GraphQLString), resolve: (inputValue) => inputValue.name, }, description: { type: GraphQLString, resolve: (inputValue) => inputValue.description, }, type: { type: new GraphQLNonNull(__Type), resolve: (inputValue) => inputValue.type, }, defaultValue: { type: GraphQLString, description: 'A GraphQL-formatted string representing the default value for this input value.', resolve(inputValue) { const { type, defaultValue } = inputValue; const valueAST = astFromValue(defaultValue, type); return valueAST ? print(valueAST) : null; }, }, isDeprecated: { type: new GraphQLNonNull(GraphQLBoolean), resolve: (field) => field.deprecationReason != null, }, deprecationReason: { type: GraphQLString, resolve: (obj) => obj.deprecationReason, }, }), }); const __EnumValue = new GraphQLObjectType({ name: '__EnumValue', description: 'One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.', fields: () => ({ name: { type: new GraphQLNonNull(GraphQLString), resolve: (enumValue) => enumValue.name, }, description: { type: GraphQLString, resolve: (enumValue) => enumValue.description, }, isDeprecated: { type: new GraphQLNonNull(GraphQLBoolean), resolve: (enumValue) => enumValue.deprecationReason != null, }, deprecationReason: { type: GraphQLString, resolve: (enumValue) => enumValue.deprecationReason, }, }), }); var TypeKind; (function (TypeKind) { TypeKind['SCALAR'] = 'SCALAR'; TypeKind['OBJECT'] = 'OBJECT'; TypeKind['INTERFACE'] = 'INTERFACE'; TypeKind['UNION'] = 'UNION'; TypeKind['ENUM'] = 'ENUM'; TypeKind['INPUT_OBJECT'] = 'INPUT_OBJECT'; TypeKind['LIST'] = 'LIST'; TypeKind['NON_NULL'] = 'NON_NULL'; })(TypeKind || (TypeKind = {})); const __TypeKind = new GraphQLEnumType({ name: '__TypeKind', description: 'An enum describing what kind of type a given `__Type` is.', values: { SCALAR: { value: TypeKind.SCALAR, description: 'Indicates this type is a scalar.', }, OBJECT: { value: TypeKind.OBJECT, description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.', }, INTERFACE: { value: TypeKind.INTERFACE, description: 'Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.', }, UNION: { value: TypeKind.UNION, description: 'Indicates this type is a union. `possibleTypes` is a valid field.', }, ENUM: { value: TypeKind.ENUM, description: 'Indicates this type is an enum. `enumValues` is a valid field.', }, INPUT_OBJECT: { value: TypeKind.INPUT_OBJECT, description: 'Indicates this type is an input object. `inputFields` is a valid field.', }, LIST: { value: TypeKind.LIST, description: 'Indicates this type is a list. `ofType` is a valid field.', }, NON_NULL: { value: TypeKind.NON_NULL, description: 'Indicates this type is a non-null. `ofType` is a valid field.', }, }, }); /** * Note that these are GraphQLField and not GraphQLFieldConfig, * so the format for args is different. */ const SchemaMetaFieldDef = { name: '__schema', type: new GraphQLNonNull(__Schema), description: 'Access the current type schema of this server.', args: [], resolve: (_source, _args, _context, { schema }) => schema, deprecationReason: undefined, extensions: Object.create(null), astNode: undefined, }; const TypeMetaFieldDef = { name: '__type', type: __Type, description: 'Request the type information of a single type.', args: [ { name: 'name', description: undefined, type: new GraphQLNonNull(GraphQLString), defaultValue: undefined, deprecationReason: undefined, extensions: Object.create(null), astNode: undefined, }, ], resolve: (_source, { name }, _context, { schema }) => schema.getType(name), deprecationReason: undefined, extensions: Object.create(null), astNode: undefined, }; const TypeNameMetaFieldDef = { name: '__typename', type: new GraphQLNonNull(GraphQLString), description: 'The name of the current Object type at runtime.', args: [], resolve: (_source, _args, _context, { parentType }) => parentType.name, deprecationReason: undefined, extensions: Object.create(null), astNode: undefined, }; const introspectionTypes = Object.freeze([ __Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind, ]); function isIntrospectionType(type) { return introspectionTypes.some(({ name }) => type.name === name); } /** * Test if the given value is a GraphQL schema. */ function isSchema(schema) { return instanceOf(schema, GraphQLSchema); } function assertSchema(schema) { if (!isSchema(schema)) { throw new Error(`Expected ${inspect$1(schema)} to be a GraphQL schema.`); } return schema; } /** * Custom extensions * * @remarks * Use a unique identifier name for your extension, for example the name of * your library or project. Do not use a shortened identifier as this increases * the risk of conflicts. We recommend you add at most one extension field, * an object which can contain all the values you need. */ /** * Schema Definition * * A Schema is created by supplying the root types of each type of operation, * query and mutation (optional). A schema definition is then supplied to the * validator and executor. * * Example: * * ```ts * const MyAppSchema = new GraphQLSchema({ * query: MyAppQueryRootType, * mutation: MyAppMutationRootType, * }) * ``` * * Note: When the schema is constructed, by default only the types that are * reachable by traversing the root types are included, other types must be * explicitly referenced. * * Example: * * ```ts * const characterInterface = new GraphQLInterfaceType({ * name: 'Character', * ... * }); * * const humanType = new GraphQLObjectType({ * name: 'Human', * interfaces: [characterInterface], * ... * }); * * const droidType = new GraphQLObjectType({ * name: 'Droid', * interfaces: [characterInterface], * ... * }); * * const schema = new GraphQLSchema({ * query: new GraphQLObjectType({ * name: 'Query', * fields: { * hero: { type: characterInterface, ... }, * } * }), * ... * // Since this schema references only the `Character` interface it's * // necessary to explicitly list the types that implement it if * // you want them to be included in the final schema. * types: [humanType, droidType], * }) * ``` * * Note: If an array of `directives` are provided to GraphQLSchema, that will be * the exact list of directives represented and allowed. If `directives` is not * provided then a default set of the specified directives (e.g. `@include` and * `@skip`) will be used. If you wish to provide *additional* directives to these * specified directives, you must explicitly declare them. Example: * * ```ts * const MyAppSchema = new GraphQLSchema({ * ... * directives: specifiedDirectives.concat([ myCustomDirective ]), * }) * ``` */ class GraphQLSchema { // Used as a cache for validateSchema(). constructor(config) { var _config$extensionASTN, _config$directives; // If this schema was built from a source known to be valid, then it may be // marked with assumeValid to avoid an additional type system validation. this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors. isObjectLike(config) || devAssert(false, 'Must provide configuration object.'); !config.types || Array.isArray(config.types) || devAssert( false, `"types" must be Array if provided but got: ${inspect$1(config.types)}.`, ); !config.directives || Array.isArray(config.directives) || devAssert( false, '"directives" must be Array if provided but got: ' + `${inspect$1(config.directives)}.`, ); this.description = config.description; this.extensions = toObjMap(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; this._queryType = config.query; this._mutationType = config.mutation; this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default. this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : specifiedDirectives; // To preserve order of user-provided types, we add first to add them to // the set of "collected" types, so `collectReferencedTypes` ignore them. const allReferencedTypes = new Set(config.types); if (config.types != null) { for (const type of config.types) { // When we ready to process this type, we remove it from "collected" types // and then add it together with all dependent types in the correct position. allReferencedTypes.delete(type); collectReferencedTypes(type, allReferencedTypes); } } if (this._queryType != null) { collectReferencedTypes(this._queryType, allReferencedTypes); } if (this._mutationType != null) { collectReferencedTypes(this._mutationType, allReferencedTypes); } if (this._subscriptionType != null) { collectReferencedTypes(this._subscriptionType, allReferencedTypes); } for (const directive of this._directives) { // Directives are not validated until validateSchema() is called. if (isDirective(directive)) { for (const arg of directive.args) { collectReferencedTypes(arg.type, allReferencedTypes); } } } collectReferencedTypes(__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema. this._typeMap = Object.create(null); this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name. this._implementationsMap = Object.create(null); for (const namedType of allReferencedTypes) { if (namedType == null) { continue; } const typeName = namedType.name; typeName || devAssert( false, 'One of the provided types for building the Schema is missing a name.', ); if (this._typeMap[typeName] !== undefined) { throw new Error( `Schema must contain uniquely named types but contains multiple types named "${typeName}".`, ); } this._typeMap[typeName] = namedType; if (isInterfaceType(namedType)) { // Store implementations by interface. for (const iface of namedType.getInterfaces()) { if (isInterfaceType(iface)) { let implementations = this._implementationsMap[iface.name]; if (implementations === undefined) { implementations = this._implementationsMap[iface.name] = { objects: [], interfaces: [], }; } implementations.interfaces.push(namedType); } } } else if (isObjectType(namedType)) { // Store implementations by objects. for (const iface of namedType.getInterfaces()) { if (isInterfaceType(iface)) { let implementations = this._implementationsMap[iface.name]; if (implementations === undefined) { implementations = this._implementationsMap[iface.name] = { objects: [], interfaces: [], }; } implementations.objects.push(namedType); } } } } } get [Symbol.toStringTag]() { return 'GraphQLSchema'; } getQueryType() { return this._queryType; } getMutationType() { return this._mutationType; } getSubscriptionType() { return this._subscriptionType; } getRootType(operation) { switch (operation) { case OperationTypeNode.QUERY: return this.getQueryType(); case OperationTypeNode.MUTATION: return this.getMutationType(); case OperationTypeNode.SUBSCRIPTION: return this.getSubscriptionType(); } } getTypeMap() { return this._typeMap; } getType(name) { return this.getTypeMap()[name]; } getPossibleTypes(abstractType) { return isUnionType(abstractType) ? abstractType.getTypes() : this.getImplementations(abstractType).objects; } getImplementations(interfaceType) { const implementations = this._implementationsMap[interfaceType.name]; return implementations !== null && implementations !== void 0 ? implementations : { objects: [], interfaces: [], }; } isSubType(abstractType, maybeSubType) { let map = this._subTypeMap[abstractType.name]; if (map === undefined) { map = Object.create(null); if (isUnionType(abstractType)) { for (const type of abstractType.getTypes()) { map[type.name] = true; } } else { const implementations = this.getImplementations(abstractType); for (const type of implementations.objects) { map[type.name] = true; } for (const type of implementations.interfaces) { map[type.name] = true; } } this._subTypeMap[abstractType.name] = map; } return map[maybeSubType.name] !== undefined; } getDirectives() { return this._directives; } getDirective(name) { return this.getDirectives().find((directive) => directive.name === name); } toConfig() { return { description: this.description, query: this.getQueryType(), mutation: this.getMutationType(), subscription: this.getSubscriptionType(), types: Object.values(this.getTypeMap()), directives: this.getDirectives(), extensions: this.extensions, astNode: this.astNode, extensionASTNodes: this.extensionASTNodes, assumeValid: this.__validationErrors !== undefined, }; } } function collectReferencedTypes(type, typeSet) { const namedType = getNamedType(type); if (!typeSet.has(namedType)) { typeSet.add(namedType); if (isUnionType(namedType)) { for (const memberType of namedType.getTypes()) { collectReferencedTypes(memberType, typeSet); } } else if (isObjectType(namedType) || isInterfaceType(namedType)) { for (const interfaceType of namedType.getInterfaces()) { collectReferencedTypes(interfaceType, typeSet); } for (const field of Object.values(namedType.getFields())) { collectReferencedTypes(field.type, typeSet); for (const arg of field.args) { collectReferencedTypes(arg.type, typeSet); } } } else if (isInputObjectType(namedType)) { for (const field of Object.values(namedType.getFields())) { collectReferencedTypes(field.type, typeSet); } } } return typeSet; } /** * Implements the "Type Validation" sub-sections of the specification's * "Type System" section. * * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the Schema is valid. */ function validateSchema(schema) { // First check to ensure the provided value is in fact a GraphQLSchema. assertSchema(schema); // If this Schema has already been validated, return the previous results. if (schema.__validationErrors) { return schema.__validationErrors; } // Validate the schema, producing a list of errors. const context = new SchemaValidationContext(schema); validateRootTypes(context); validateDirectives(context); validateTypes(context); // Persist the results of validation before returning to ensure validation // does not run multiple times for this schema. const errors = context.getErrors(); schema.__validationErrors = errors; return errors; } /** * Utility function which asserts a schema is valid by throwing an error if * it is invalid. */ function assertValidSchema(schema) { const errors = validateSchema(schema); if (errors.length !== 0) { throw new Error(errors.map((error) => error.message).join('\n\n')); } } class SchemaValidationContext { constructor(schema) { this._errors = []; this.schema = schema; } reportError(message, nodes) { const _nodes = Array.isArray(nodes) ? nodes.filter(Boolean) : nodes; this._errors.push( new GraphQLError(message, { nodes: _nodes, }), ); } getErrors() { return this._errors; } } function validateRootTypes(context) { const schema = context.schema; const queryType = schema.getQueryType(); if (!queryType) { context.reportError('Query root type must be provided.', schema.astNode); } else if (!isObjectType(queryType)) { var _getOperationTypeNode; context.reportError( `Query root type must be Object type, it cannot be ${inspect$1( queryType, )}.`, (_getOperationTypeNode = getOperationTypeNode( schema, OperationTypeNode.QUERY, )) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : queryType.astNode, ); } const mutationType = schema.getMutationType(); if (mutationType && !isObjectType(mutationType)) { var _getOperationTypeNode2; context.reportError( 'Mutation root type must be Object type if provided, it cannot be ' + `${inspect$1(mutationType)}.`, (_getOperationTypeNode2 = getOperationTypeNode( schema, OperationTypeNode.MUTATION, )) !== null && _getOperationTypeNode2 !== void 0 ? _getOperationTypeNode2 : mutationType.astNode, ); } const subscriptionType = schema.getSubscriptionType(); if (subscriptionType && !isObjectType(subscriptionType)) { var _getOperationTypeNode3; context.reportError( 'Subscription root type must be Object type if provided, it cannot be ' + `${inspect$1(subscriptionType)}.`, (_getOperationTypeNode3 = getOperationTypeNode( schema, OperationTypeNode.SUBSCRIPTION, )) !== null && _getOperationTypeNode3 !== void 0 ? _getOperationTypeNode3 : subscriptionType.astNode, ); } } function getOperationTypeNode(schema, operation) { var _flatMap$find; return (_flatMap$find = [schema.astNode, ...schema.extensionASTNodes] .flatMap( // FIXME: https://github.com/graphql/graphql-js/issues/2203 (schemaNode) => { var _schemaNode$operation; return ( /* c8 ignore next */ (_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : [] ); }, ) .find((operationNode) => operationNode.operation === operation)) === null || _flatMap$find === void 0 ? void 0 : _flatMap$find.type; } function validateDirectives(context) { for (const directive of context.schema.getDirectives()) { // Ensure all directives are in fact GraphQL directives. if (!isDirective(directive)) { context.reportError( `Expected directive but got: ${inspect$1(directive)}.`, directive === null || directive === void 0 ? void 0 : directive.astNode, ); continue; } // Ensure they are named correctly. validateName$1(context, directive); // TODO: Ensure proper locations. // Ensure the arguments are valid. for (const arg of directive.args) { // Ensure they are named correctly. validateName$1(context, arg); // Ensure the type is an input type. if (!isInputType(arg.type)) { context.reportError( `The type of @${directive.name}(${arg.name}:) must be Input Type ` + `but got: ${inspect$1(arg.type)}.`, arg.astNode, ); } if (isRequiredArgument(arg) && arg.deprecationReason != null) { var _arg$astNode; context.reportError( `Required argument @${directive.name}(${arg.name}:) cannot be deprecated.`, [ getDeprecatedDirectiveNode(arg.astNode), (_arg$astNode = arg.astNode) === null || _arg$astNode === void 0 ? void 0 : _arg$astNode.type, ], ); } } } } function validateName$1(context, node) { // Ensure names are valid, however introspection types opt out. if (node.name.startsWith('__')) { context.reportError( `Name "${node.name}" must not begin with "__", which is reserved by GraphQL introspection.`, node.astNode, ); } } function validateTypes(context) { const validateInputObjectCircularRefs = createInputObjectCircularRefsValidator(context); const typeMap = context.schema.getTypeMap(); for (const type of Object.values(typeMap)) { // Ensure all provided types are in fact GraphQL type. if (!isNamedType(type)) { context.reportError( `Expected GraphQL named type but got: ${inspect$1(type)}.`, type.astNode, ); continue; } // Ensure it is named correctly (excluding introspection types). if (!isIntrospectionType(type)) { validateName$1(context, type); } if (isObjectType(type)) { // Ensure fields are valid validateFields(context, type); // Ensure objects implement the interfaces they claim to. validateInterfaces(context, type); } else if (isInterfaceType(type)) { // Ensure fields are valid. validateFields(context, type); // Ensure interfaces implement the interfaces they claim to. validateInterfaces(context, type); } else if (isUnionType(type)) { // Ensure Unions include valid member types. validateUnionMembers(context, type); } else if (isEnumType(type)) { // Ensure Enums have valid values. validateEnumValues(context, type); } else if (isInputObjectType(type)) { // Ensure Input Object fields are valid. validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references validateInputObjectCircularRefs(type); } } } function validateFields(context, type) { const fields = Object.values(type.getFields()); // Objects and Interfaces both must define one or more fields. if (fields.length === 0) { context.reportError(`Type ${type.name} must define one or more fields.`, [ type.astNode, ...type.extensionASTNodes, ]); } for (const field of fields) { // Ensure they are named correctly. validateName$1(context, field); // Ensure the type is an output type if (!isOutputType(field.type)) { var _field$astNode; context.reportError( `The type of ${type.name}.${field.name} must be Output Type ` + `but got: ${inspect$1(field.type)}.`, (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type, ); } // Ensure the arguments are valid for (const arg of field.args) { const argName = arg.name; // Ensure they are named correctly. validateName$1(context, arg); // Ensure the type is an input type if (!isInputType(arg.type)) { var _arg$astNode2; context.reportError( `The type of ${type.name}.${field.name}(${argName}:) must be Input ` + `Type but got: ${inspect$1(arg.type)}.`, (_arg$astNode2 = arg.astNode) === null || _arg$astNode2 === void 0 ? void 0 : _arg$astNode2.type, ); } if (isRequiredArgument(arg) && arg.deprecationReason != null) { var _arg$astNode3; context.reportError( `Required argument ${type.name}.${field.name}(${argName}:) cannot be deprecated.`, [ getDeprecatedDirectiveNode(arg.astNode), (_arg$astNode3 = arg.astNode) === null || _arg$astNode3 === void 0 ? void 0 : _arg$astNode3.type, ], ); } } } } function validateInterfaces(context, type) { const ifaceTypeNames = Object.create(null); for (const iface of type.getInterfaces()) { if (!isInterfaceType(iface)) { context.reportError( `Type ${inspect$1(type)} must only implement Interface types, ` + `it cannot implement ${inspect$1(iface)}.`, getAllImplementsInterfaceNodes(type, iface), ); continue; } if (type === iface) { context.reportError( `Type ${type.name} cannot implement itself because it would create a circular reference.`, getAllImplementsInterfaceNodes(type, iface), ); continue; } if (ifaceTypeNames[iface.name]) { context.reportError( `Type ${type.name} can only implement ${iface.name} once.`, getAllImplementsInterfaceNodes(type, iface), ); continue; } ifaceTypeNames[iface.name] = true; validateTypeImplementsAncestors(context, type, iface); validateTypeImplementsInterface(context, type, iface); } } function validateTypeImplementsInterface(context, type, iface) { const typeFieldMap = type.getFields(); // Assert each interface field is implemented. for (const ifaceField of Object.values(iface.getFields())) { const fieldName = ifaceField.name; const typeField = typeFieldMap[fieldName]; // Assert interface field exists on type. if (!typeField) { context.reportError( `Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`, [ifaceField.astNode, type.astNode, ...type.extensionASTNodes], ); continue; } // Assert interface field type is satisfied by type field type, by being // a valid subtype. (covariant) if (!isTypeSubTypeOf(context.schema, typeField.type, ifaceField.type)) { var _ifaceField$astNode, _typeField$astNode; context.reportError( `Interface field ${iface.name}.${fieldName} expects type ` + `${inspect$1(ifaceField.type)} but ${type.name}.${fieldName} ` + `is type ${inspect$1(typeField.type)}.`, [ (_ifaceField$astNode = ifaceField.astNode) === null || _ifaceField$astNode === void 0 ? void 0 : _ifaceField$astNode.type, (_typeField$astNode = typeField.astNode) === null || _typeField$astNode === void 0 ? void 0 : _typeField$astNode.type, ], ); } // Assert each interface field arg is implemented. for (const ifaceArg of ifaceField.args) { const argName = ifaceArg.name; const typeArg = typeField.args.find((arg) => arg.name === argName); // Assert interface field arg exists on object field. if (!typeArg) { context.reportError( `Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`, [ifaceArg.astNode, typeField.astNode], ); continue; } // Assert interface field arg type matches object field arg type. // (invariant) // TODO: change to contravariant? if (!isEqualType(ifaceArg.type, typeArg.type)) { var _ifaceArg$astNode, _typeArg$astNode; context.reportError( `Interface field argument ${iface.name}.${fieldName}(${argName}:) ` + `expects type ${inspect$1(ifaceArg.type)} but ` + `${type.name}.${fieldName}(${argName}:) is type ` + `${inspect$1(typeArg.type)}.`, [ (_ifaceArg$astNode = ifaceArg.astNode) === null || _ifaceArg$astNode === void 0 ? void 0 : _ifaceArg$astNode.type, (_typeArg$astNode = typeArg.astNode) === null || _typeArg$astNode === void 0 ? void 0 : _typeArg$astNode.type, ], ); } // TODO: validate default values? } // Assert additional arguments must not be required. for (const typeArg of typeField.args) { const argName = typeArg.name; const ifaceArg = ifaceField.args.find((arg) => arg.name === argName); if (!ifaceArg && isRequiredArgument(typeArg)) { context.reportError( `Object field ${type.name}.${fieldName} includes required argument ${argName} that is missing from the Interface field ${iface.name}.${fieldName}.`, [typeArg.astNode, ifaceField.astNode], ); } } } } function validateTypeImplementsAncestors(context, type, iface) { const ifaceInterfaces = type.getInterfaces(); for (const transitive of iface.getInterfaces()) { if (!ifaceInterfaces.includes(transitive)) { context.reportError( transitive === type ? `Type ${type.name} cannot implement ${iface.name} because it would create a circular reference.` : `Type ${type.name} must implement ${transitive.name} because it is implemented by ${iface.name}.`, [ ...getAllImplementsInterfaceNodes(iface, transitive), ...getAllImplementsInterfaceNodes(type, iface), ], ); } } } function validateUnionMembers(context, union) { const memberTypes = union.getTypes(); if (memberTypes.length === 0) { context.reportError( `Union type ${union.name} must define one or more member types.`, [union.astNode, ...union.extensionASTNodes], ); } const includedTypeNames = Object.create(null); for (const memberType of memberTypes) { if (includedTypeNames[memberType.name]) { context.reportError( `Union type ${union.name} can only include type ${memberType.name} once.`, getUnionMemberTypeNodes(union, memberType.name), ); continue; } includedTypeNames[memberType.name] = true; if (!isObjectType(memberType)) { context.reportError( `Union type ${union.name} can only include Object types, ` + `it cannot include ${inspect$1(memberType)}.`, getUnionMemberTypeNodes(union, String(memberType)), ); } } } function validateEnumValues(context, enumType) { const enumValues = enumType.getValues(); if (enumValues.length === 0) { context.reportError( `Enum type ${enumType.name} must define one or more values.`, [enumType.astNode, ...enumType.extensionASTNodes], ); } for (const enumValue of enumValues) { // Ensure valid name. validateName$1(context, enumValue); } } function validateInputFields(context, inputObj) { const fields = Object.values(inputObj.getFields()); if (fields.length === 0) { context.reportError( `Input Object type ${inputObj.name} must define one or more fields.`, [inputObj.astNode, ...inputObj.extensionASTNodes], ); } // Ensure the arguments are valid for (const field of fields) { // Ensure they are named correctly. validateName$1(context, field); // Ensure the type is an input type if (!isInputType(field.type)) { var _field$astNode2; context.reportError( `The type of ${inputObj.name}.${field.name} must be Input Type ` + `but got: ${inspect$1(field.type)}.`, (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type, ); } if (isRequiredInputField(field) && field.deprecationReason != null) { var _field$astNode3; context.reportError( `Required input field ${inputObj.name}.${field.name} cannot be deprecated.`, [ getDeprecatedDirectiveNode(field.astNode), (_field$astNode3 = field.astNode) === null || _field$astNode3 === void 0 ? void 0 : _field$astNode3.type, ], ); } } } function createInputObjectCircularRefsValidator(context) { // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'. // Tracks already visited types to maintain O(N) and to ensure that cycles // are not redundantly reported. const visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors const fieldPath = []; // Position in the type path const fieldPathIndexByTypeName = Object.create(null); return detectCycleRecursive; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. function detectCycleRecursive(inputObj) { if (visitedTypes[inputObj.name]) { return; } visitedTypes[inputObj.name] = true; fieldPathIndexByTypeName[inputObj.name] = fieldPath.length; const fields = Object.values(inputObj.getFields()); for (const field of fields) { if (isNonNullType(field.type) && isInputObjectType(field.type.ofType)) { const fieldType = field.type.ofType; const cycleIndex = fieldPathIndexByTypeName[fieldType.name]; fieldPath.push(field); if (cycleIndex === undefined) { detectCycleRecursive(fieldType); } else { const cyclePath = fieldPath.slice(cycleIndex); const pathStr = cyclePath.map((fieldObj) => fieldObj.name).join('.'); context.reportError( `Cannot reference Input Object "${fieldType.name}" within itself through a series of non-null fields: "${pathStr}".`, cyclePath.map((fieldObj) => fieldObj.astNode), ); } fieldPath.pop(); } } fieldPathIndexByTypeName[inputObj.name] = undefined; } } function getAllImplementsInterfaceNodes(type, iface) { const { astNode, extensionASTNodes } = type; const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 return nodes .flatMap((typeNode) => { var _typeNode$interfaces; return ( /* c8 ignore next */ (_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : [] ); }) .filter((ifaceNode) => ifaceNode.name.value === iface.name); } function getUnionMemberTypeNodes(union, typeName) { const { astNode, extensionASTNodes } = union; const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 return nodes .flatMap((unionNode) => { var _unionNode$types; return ( /* c8 ignore next */ (_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : [] ); }) .filter((typeNode) => typeNode.name.value === typeName); } function getDeprecatedDirectiveNode(definitionNode) { var _definitionNode$direc; return definitionNode === null || definitionNode === void 0 ? void 0 : (_definitionNode$direc = definitionNode.directives) === null || _definitionNode$direc === void 0 ? void 0 : _definitionNode$direc.find( (node) => node.name.value === GraphQLDeprecatedDirective.name, ); } function typeFromAST(schema, typeNode) { switch (typeNode.kind) { case Kind.LIST_TYPE: { const innerType = typeFromAST(schema, typeNode.type); return innerType && new GraphQLList(innerType); } case Kind.NON_NULL_TYPE: { const innerType = typeFromAST(schema, typeNode.type); return innerType && new GraphQLNonNull(innerType); } case Kind.NAMED_TYPE: return schema.getType(typeNode.name.value); } } /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track * of the current field and type definitions at any point in a GraphQL document * AST during a recursive descent by calling `enter(node)` and `leave(node)`. */ class TypeInfo { constructor( schema, /** * Initial type may be provided in rare cases to facilitate traversals * beginning somewhere other than documents. */ initialType, /** @deprecated will be removed in 17.0.0 */ getFieldDefFn, ) { this._schema = schema; this._typeStack = []; this._parentTypeStack = []; this._inputTypeStack = []; this._fieldDefStack = []; this._defaultValueStack = []; this._directive = null; this._argument = null; this._enumValue = null; this._getFieldDef = getFieldDefFn !== null && getFieldDefFn !== void 0 ? getFieldDefFn : getFieldDef$1; if (initialType) { if (isInputType(initialType)) { this._inputTypeStack.push(initialType); } if (isCompositeType(initialType)) { this._parentTypeStack.push(initialType); } if (isOutputType(initialType)) { this._typeStack.push(initialType); } } } get [Symbol.toStringTag]() { return 'TypeInfo'; } getType() { if (this._typeStack.length > 0) { return this._typeStack[this._typeStack.length - 1]; } } getParentType() { if (this._parentTypeStack.length > 0) { return this._parentTypeStack[this._parentTypeStack.length - 1]; } } getInputType() { if (this._inputTypeStack.length > 0) { return this._inputTypeStack[this._inputTypeStack.length - 1]; } } getParentInputType() { if (this._inputTypeStack.length > 1) { return this._inputTypeStack[this._inputTypeStack.length - 2]; } } getFieldDef() { if (this._fieldDefStack.length > 0) { return this._fieldDefStack[this._fieldDefStack.length - 1]; } } getDefaultValue() { if (this._defaultValueStack.length > 0) { return this._defaultValueStack[this._defaultValueStack.length - 1]; } } getDirective() { return this._directive; } getArgument() { return this._argument; } getEnumValue() { return this._enumValue; } enter(node) { const schema = this._schema; // Note: many of the types below are explicitly typed as "unknown" to drop // any assumptions of a valid schema to ensure runtime types are properly // checked before continuing since TypeInfo is used as part of validation // which occurs before guarantees of schema and document validity. switch (node.kind) { case Kind.SELECTION_SET: { const namedType = getNamedType(this.getType()); this._parentTypeStack.push( isCompositeType(namedType) ? namedType : undefined, ); break; } case Kind.FIELD: { const parentType = this.getParentType(); let fieldDef; let fieldType; if (parentType) { fieldDef = this._getFieldDef(schema, parentType, node); if (fieldDef) { fieldType = fieldDef.type; } } this._fieldDefStack.push(fieldDef); this._typeStack.push(isOutputType(fieldType) ? fieldType : undefined); break; } case Kind.DIRECTIVE: this._directive = schema.getDirective(node.name.value); break; case Kind.OPERATION_DEFINITION: { const rootType = schema.getRootType(node.operation); this._typeStack.push(isObjectType(rootType) ? rootType : undefined); break; } case Kind.INLINE_FRAGMENT: case Kind.FRAGMENT_DEFINITION: { const typeConditionAST = node.typeCondition; const outputType = typeConditionAST ? typeFromAST(schema, typeConditionAST) : getNamedType(this.getType()); this._typeStack.push(isOutputType(outputType) ? outputType : undefined); break; } case Kind.VARIABLE_DEFINITION: { const inputType = typeFromAST(schema, node.type); this._inputTypeStack.push( isInputType(inputType) ? inputType : undefined, ); break; } case Kind.ARGUMENT: { var _this$getDirective; let argDef; let argType; const fieldOrDirective = (_this$getDirective = this.getDirective()) !== null && _this$getDirective !== void 0 ? _this$getDirective : this.getFieldDef(); if (fieldOrDirective) { argDef = fieldOrDirective.args.find( (arg) => arg.name === node.name.value, ); if (argDef) { argType = argDef.type; } } this._argument = argDef; this._defaultValueStack.push(argDef ? argDef.defaultValue : undefined); this._inputTypeStack.push(isInputType(argType) ? argType : undefined); break; } case Kind.LIST: { const listType = getNullableType(this.getInputType()); const itemType = isListType(listType) ? listType.ofType : listType; // List positions never have a default value. this._defaultValueStack.push(undefined); this._inputTypeStack.push(isInputType(itemType) ? itemType : undefined); break; } case Kind.OBJECT_FIELD: { const objectType = getNamedType(this.getInputType()); let inputFieldType; let inputField; if (isInputObjectType(objectType)) { inputField = objectType.getFields()[node.name.value]; if (inputField) { inputFieldType = inputField.type; } } this._defaultValueStack.push( inputField ? inputField.defaultValue : undefined, ); this._inputTypeStack.push( isInputType(inputFieldType) ? inputFieldType : undefined, ); break; } case Kind.ENUM: { const enumType = getNamedType(this.getInputType()); let enumValue; if (isEnumType(enumType)) { enumValue = enumType.getValue(node.value); } this._enumValue = enumValue; break; } } } leave(node) { switch (node.kind) { case Kind.SELECTION_SET: this._parentTypeStack.pop(); break; case Kind.FIELD: this._fieldDefStack.pop(); this._typeStack.pop(); break; case Kind.DIRECTIVE: this._directive = null; break; case Kind.OPERATION_DEFINITION: case Kind.INLINE_FRAGMENT: case Kind.FRAGMENT_DEFINITION: this._typeStack.pop(); break; case Kind.VARIABLE_DEFINITION: this._inputTypeStack.pop(); break; case Kind.ARGUMENT: this._argument = null; this._defaultValueStack.pop(); this._inputTypeStack.pop(); break; case Kind.LIST: case Kind.OBJECT_FIELD: this._defaultValueStack.pop(); this._inputTypeStack.pop(); break; case Kind.ENUM: this._enumValue = null; break; } } } /** * Not exactly the same as the executor's definition of getFieldDef, in this * statically evaluated environment we do not always have an Object type, * and need to handle Interface and Union types. */ function getFieldDef$1(schema, parentType, fieldNode) { const name = fieldNode.name.value; if ( name === SchemaMetaFieldDef.name && schema.getQueryType() === parentType ) { return SchemaMetaFieldDef; } if (name === TypeMetaFieldDef.name && schema.getQueryType() === parentType) { return TypeMetaFieldDef; } if (name === TypeNameMetaFieldDef.name && isCompositeType(parentType)) { return TypeNameMetaFieldDef; } if (isObjectType(parentType) || isInterfaceType(parentType)) { return parentType.getFields()[name]; } } /** * Creates a new visitor instance which maintains a provided TypeInfo instance * along with visiting visitor. */ function visitWithTypeInfo(typeInfo, visitor) { return { enter(...args) { const node = args[0]; typeInfo.enter(node); const fn = getEnterLeaveForKind(visitor, node.kind).enter; if (fn) { const result = fn.apply(visitor, args); if (result !== undefined) { typeInfo.leave(node); if (isNode(result)) { typeInfo.enter(result); } } return result; } }, leave(...args) { const node = args[0]; const fn = getEnterLeaveForKind(visitor, node.kind).leave; let result; if (fn) { result = fn.apply(visitor, args); } typeInfo.leave(node); return result; }, }; } function isDefinitionNode(node) { return ( isExecutableDefinitionNode(node) || isTypeSystemDefinitionNode(node) || isTypeSystemExtensionNode(node) ); } function isExecutableDefinitionNode(node) { return ( node.kind === Kind.OPERATION_DEFINITION || node.kind === Kind.FRAGMENT_DEFINITION ); } function isTypeSystemDefinitionNode(node) { return ( node.kind === Kind.SCHEMA_DEFINITION || isTypeDefinitionNode(node) || node.kind === Kind.DIRECTIVE_DEFINITION ); } function isTypeDefinitionNode(node) { return ( node.kind === Kind.SCALAR_TYPE_DEFINITION || node.kind === Kind.OBJECT_TYPE_DEFINITION || node.kind === Kind.INTERFACE_TYPE_DEFINITION || node.kind === Kind.UNION_TYPE_DEFINITION || node.kind === Kind.ENUM_TYPE_DEFINITION || node.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ); } function isTypeSystemExtensionNode(node) { return node.kind === Kind.SCHEMA_EXTENSION || isTypeExtensionNode(node); } function isTypeExtensionNode(node) { return ( node.kind === Kind.SCALAR_TYPE_EXTENSION || node.kind === Kind.OBJECT_TYPE_EXTENSION || node.kind === Kind.INTERFACE_TYPE_EXTENSION || node.kind === Kind.UNION_TYPE_EXTENSION || node.kind === Kind.ENUM_TYPE_EXTENSION || node.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION ); } /** * Executable definitions * * A GraphQL document is only valid for execution if all definitions are either * operation or fragment definitions. * * See https://spec.graphql.org/draft/#sec-Executable-Definitions */ function ExecutableDefinitionsRule(context) { return { Document(node) { for (const definition of node.definitions) { if (!isExecutableDefinitionNode(definition)) { const defName = definition.kind === Kind.SCHEMA_DEFINITION || definition.kind === Kind.SCHEMA_EXTENSION ? 'schema' : '"' + definition.name.value + '"'; context.reportError( new GraphQLError(`The ${defName} definition is not executable.`, { nodes: definition, }), ); } } return false; }, }; } /** * Fields on correct type * * A GraphQL document is only valid if all fields selected are defined by the * parent type, or are an allowed meta field such as __typename. * * See https://spec.graphql.org/draft/#sec-Field-Selections */ function FieldsOnCorrectTypeRule(context) { return { Field(node) { const type = context.getParentType(); if (type) { const fieldDef = context.getFieldDef(); if (!fieldDef) { // This field doesn't exist, lets look for suggestions. const schema = context.getSchema(); const fieldName = node.name.value; // First determine if there are any suggested types to condition on. let suggestion = didYouMean( 'to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName), ); // If there are no suggested types, then perhaps this was a typo? if (suggestion === '') { suggestion = didYouMean(getSuggestedFieldNames(type, fieldName)); } // Report an error, including helpful suggestions. context.reportError( new GraphQLError( `Cannot query field "${fieldName}" on type "${type.name}".` + suggestion, { nodes: node, }, ), ); } } }, }; } /** * Go through all of the implementations of type, as well as the interfaces that * they implement. If any of those types include the provided field, suggest them, * sorted by how often the type is referenced. */ function getSuggestedTypeNames(schema, type, fieldName) { if (!isAbstractType(type)) { // Must be an Object type, which does not have possible fields. return []; } const suggestedTypes = new Set(); const usageCount = Object.create(null); for (const possibleType of schema.getPossibleTypes(type)) { if (!possibleType.getFields()[fieldName]) { continue; } // This object type defines this field. suggestedTypes.add(possibleType); usageCount[possibleType.name] = 1; for (const possibleInterface of possibleType.getInterfaces()) { var _usageCount$possibleI; if (!possibleInterface.getFields()[fieldName]) { continue; } // This interface type defines this field. suggestedTypes.add(possibleInterface); usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1; } } return [...suggestedTypes] .sort((typeA, typeB) => { // Suggest both interface and object types based on how common they are. const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name]; if (usageCountDiff !== 0) { return usageCountDiff; } // Suggest super types first followed by subtypes if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) { return -1; } if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) { return 1; } return naturalCompare(typeA.name, typeB.name); }) .map((x) => x.name); } /** * For the field name provided, determine if there are any similar field names * that may be the result of a typo. */ function getSuggestedFieldNames(type, fieldName) { if (isObjectType(type) || isInterfaceType(type)) { const possibleFieldNames = Object.keys(type.getFields()); return suggestionList(fieldName, possibleFieldNames); } // Otherwise, must be a Union type, which does not define fields. return []; } /** * Fragments on composite type * * Fragments use a type condition to determine if they apply, since fragments * can only be spread into a composite type (object, interface, or union), the * type condition must also be a composite type. * * See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types */ function FragmentsOnCompositeTypesRule(context) { return { InlineFragment(node) { const typeCondition = node.typeCondition; if (typeCondition) { const type = typeFromAST(context.getSchema(), typeCondition); if (type && !isCompositeType(type)) { const typeStr = print(typeCondition); context.reportError( new GraphQLError( `Fragment cannot condition on non composite type "${typeStr}".`, { nodes: typeCondition, }, ), ); } } }, FragmentDefinition(node) { const type = typeFromAST(context.getSchema(), node.typeCondition); if (type && !isCompositeType(type)) { const typeStr = print(node.typeCondition); context.reportError( new GraphQLError( `Fragment "${node.name.value}" cannot condition on non composite type "${typeStr}".`, { nodes: node.typeCondition, }, ), ); } }, }; } /** * Known argument names * * A GraphQL field is only valid if all supplied arguments are defined by * that field. * * See https://spec.graphql.org/draft/#sec-Argument-Names * See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations */ function KnownArgumentNamesRule(context) { return { // eslint-disable-next-line new-cap ...KnownArgumentNamesOnDirectivesRule(context), Argument(argNode) { const argDef = context.getArgument(); const fieldDef = context.getFieldDef(); const parentType = context.getParentType(); if (!argDef && fieldDef && parentType) { const argName = argNode.name.value; const knownArgsNames = fieldDef.args.map((arg) => arg.name); const suggestions = suggestionList(argName, knownArgsNames); context.reportError( new GraphQLError( `Unknown argument "${argName}" on field "${parentType.name}.${fieldDef.name}".` + didYouMean(suggestions), { nodes: argNode, }, ), ); } }, }; } /** * @internal */ function KnownArgumentNamesOnDirectivesRule(context) { const directiveArgs = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : specifiedDirectives; for (const directive of definedDirectives) { directiveArgs[directive.name] = directive.args.map((arg) => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === Kind.DIRECTIVE_DEFINITION) { var _def$arguments; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; directiveArgs[def.name.value] = argsNodes.map((arg) => arg.name.value); } } return { Directive(directiveNode) { const directiveName = directiveNode.name.value; const knownArgs = directiveArgs[directiveName]; if (directiveNode.arguments && knownArgs) { for (const argNode of directiveNode.arguments) { const argName = argNode.name.value; if (!knownArgs.includes(argName)) { const suggestions = suggestionList(argName, knownArgs); context.reportError( new GraphQLError( `Unknown argument "${argName}" on directive "@${directiveName}".` + didYouMean(suggestions), { nodes: argNode, }, ), ); } } } return false; }, }; } /** * Known directives * * A GraphQL document is only valid if all `@directives` are known by the * schema and legally positioned. * * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined */ function KnownDirectivesRule(context) { const locationsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : specifiedDirectives; for (const directive of definedDirectives) { locationsMap[directive.name] = directive.locations; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === Kind.DIRECTIVE_DEFINITION) { locationsMap[def.name.value] = def.locations.map((name) => name.value); } } return { Directive(node, _key, _parent, _path, ancestors) { const name = node.name.value; const locations = locationsMap[name]; if (!locations) { context.reportError( new GraphQLError(`Unknown directive "@${name}".`, { nodes: node, }), ); return; } const candidateLocation = getDirectiveLocationForASTPath(ancestors); if (candidateLocation && !locations.includes(candidateLocation)) { context.reportError( new GraphQLError( `Directive "@${name}" may not be used on ${candidateLocation}.`, { nodes: node, }, ), ); } }, }; } function getDirectiveLocationForASTPath(ancestors) { const appliedTo = ancestors[ancestors.length - 1]; 'kind' in appliedTo || invariant$1(false); switch (appliedTo.kind) { case Kind.OPERATION_DEFINITION: return getDirectiveLocationForOperation(appliedTo.operation); case Kind.FIELD: return DirectiveLocation$1.FIELD; case Kind.FRAGMENT_SPREAD: return DirectiveLocation$1.FRAGMENT_SPREAD; case Kind.INLINE_FRAGMENT: return DirectiveLocation$1.INLINE_FRAGMENT; case Kind.FRAGMENT_DEFINITION: return DirectiveLocation$1.FRAGMENT_DEFINITION; case Kind.VARIABLE_DEFINITION: return DirectiveLocation$1.VARIABLE_DEFINITION; case Kind.SCHEMA_DEFINITION: case Kind.SCHEMA_EXTENSION: return DirectiveLocation$1.SCHEMA; case Kind.SCALAR_TYPE_DEFINITION: case Kind.SCALAR_TYPE_EXTENSION: return DirectiveLocation$1.SCALAR; case Kind.OBJECT_TYPE_DEFINITION: case Kind.OBJECT_TYPE_EXTENSION: return DirectiveLocation$1.OBJECT; case Kind.FIELD_DEFINITION: return DirectiveLocation$1.FIELD_DEFINITION; case Kind.INTERFACE_TYPE_DEFINITION: case Kind.INTERFACE_TYPE_EXTENSION: return DirectiveLocation$1.INTERFACE; case Kind.UNION_TYPE_DEFINITION: case Kind.UNION_TYPE_EXTENSION: return DirectiveLocation$1.UNION; case Kind.ENUM_TYPE_DEFINITION: case Kind.ENUM_TYPE_EXTENSION: return DirectiveLocation$1.ENUM; case Kind.ENUM_VALUE_DEFINITION: return DirectiveLocation$1.ENUM_VALUE; case Kind.INPUT_OBJECT_TYPE_DEFINITION: case Kind.INPUT_OBJECT_TYPE_EXTENSION: return DirectiveLocation$1.INPUT_OBJECT; case Kind.INPUT_VALUE_DEFINITION: { const parentNode = ancestors[ancestors.length - 3]; 'kind' in parentNode || invariant$1(false); return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? DirectiveLocation$1.INPUT_FIELD_DEFINITION : DirectiveLocation$1.ARGUMENT_DEFINITION; } // Not reachable, all possible types have been considered. /* c8 ignore next */ default: invariant$1(false, 'Unexpected kind: ' + inspect$1(appliedTo.kind)); } } function getDirectiveLocationForOperation(operation) { switch (operation) { case OperationTypeNode.QUERY: return DirectiveLocation$1.QUERY; case OperationTypeNode.MUTATION: return DirectiveLocation$1.MUTATION; case OperationTypeNode.SUBSCRIPTION: return DirectiveLocation$1.SUBSCRIPTION; } } /** * Known fragment names * * A GraphQL document is only valid if all `...Fragment` fragment spreads refer * to fragments defined in the same document. * * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-defined */ function KnownFragmentNamesRule(context) { return { FragmentSpread(node) { const fragmentName = node.name.value; const fragment = context.getFragment(fragmentName); if (!fragment) { context.reportError( new GraphQLError(`Unknown fragment "${fragmentName}".`, { nodes: node.name, }), ); } }, }; } /** * Known type names * * A GraphQL document is only valid if referenced types (specifically * variable definitions and fragment conditions) are defined by the type schema. * * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence */ function KnownTypeNamesRule(context) { const schema = context.getSchema(); const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); const definedTypes = Object.create(null); for (const def of context.getDocument().definitions) { if (isTypeDefinitionNode(def)) { definedTypes[def.name.value] = true; } } const typeNames = [ ...Object.keys(existingTypesMap), ...Object.keys(definedTypes), ]; return { NamedType(node, _1, parent, _2, ancestors) { const typeName = node.name.value; if (!existingTypesMap[typeName] && !definedTypes[typeName]) { var _ancestors$; const definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent; const isSDL = definitionNode != null && isSDLNode(definitionNode); if (isSDL && standardTypeNames.includes(typeName)) { return; } const suggestedTypes = suggestionList( typeName, isSDL ? standardTypeNames.concat(typeNames) : typeNames, ); context.reportError( new GraphQLError( `Unknown type "${typeName}".` + didYouMean(suggestedTypes), { nodes: node, }, ), ); } }, }; } const standardTypeNames = [...specifiedScalarTypes, ...introspectionTypes].map( (type) => type.name, ); function isSDLNode(value) { return ( 'kind' in value && (isTypeSystemDefinitionNode(value) || isTypeSystemExtensionNode(value)) ); } /** * Lone anonymous operation * * A GraphQL document is only valid if when it contains an anonymous operation * (the query short-hand) that it contains only that one operation definition. * * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation */ function LoneAnonymousOperationRule(context) { let operationCount = 0; return { Document(node) { operationCount = node.definitions.filter( (definition) => definition.kind === Kind.OPERATION_DEFINITION, ).length; }, OperationDefinition(node) { if (!node.name && operationCount > 1) { context.reportError( new GraphQLError( 'This anonymous operation must be the only defined operation.', { nodes: node, }, ), ); } }, }; } /** * Lone Schema definition * * A GraphQL document is only valid if it contains only one schema definition. */ function LoneSchemaDefinitionRule(context) { var _ref, _ref2, _oldSchema$astNode; const oldSchema = context.getSchema(); const alreadyDefined = (_ref = (_ref2 = (_oldSchema$astNode = oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.astNode) !== null && _oldSchema$astNode !== void 0 ? _oldSchema$astNode : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getQueryType()) !== null && _ref2 !== void 0 ? _ref2 : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getMutationType()) !== null && _ref !== void 0 ? _ref : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getSubscriptionType(); let schemaDefinitionsCount = 0; return { SchemaDefinition(node) { if (alreadyDefined) { context.reportError( new GraphQLError( 'Cannot define a new schema within a schema extension.', { nodes: node, }, ), ); return; } if (schemaDefinitionsCount > 0) { context.reportError( new GraphQLError('Must provide only one schema definition.', { nodes: node, }), ); } ++schemaDefinitionsCount; }, }; } /** * No fragment cycles * * The graph of fragment spreads must not form any cycles including spreading itself. * Otherwise an operation could infinitely spread or infinitely execute on cycles in the underlying data. * * See https://spec.graphql.org/draft/#sec-Fragment-spreads-must-not-form-cycles */ function NoFragmentCyclesRule(context) { // Tracks already visited fragments to maintain O(N) and to ensure that cycles // are not redundantly reported. const visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors const spreadPath = []; // Position in the spread path const spreadPathIndexByName = Object.create(null); return { OperationDefinition: () => false, FragmentDefinition(node) { detectCycleRecursive(node); return false; }, }; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. function detectCycleRecursive(fragment) { if (visitedFrags[fragment.name.value]) { return; } const fragmentName = fragment.name.value; visitedFrags[fragmentName] = true; const spreadNodes = context.getFragmentSpreads(fragment.selectionSet); if (spreadNodes.length === 0) { return; } spreadPathIndexByName[fragmentName] = spreadPath.length; for (const spreadNode of spreadNodes) { const spreadName = spreadNode.name.value; const cycleIndex = spreadPathIndexByName[spreadName]; spreadPath.push(spreadNode); if (cycleIndex === undefined) { const spreadFragment = context.getFragment(spreadName); if (spreadFragment) { detectCycleRecursive(spreadFragment); } } else { const cyclePath = spreadPath.slice(cycleIndex); const viaPath = cyclePath .slice(0, -1) .map((s) => '"' + s.name.value + '"') .join(', '); context.reportError( new GraphQLError( `Cannot spread fragment "${spreadName}" within itself` + (viaPath !== '' ? ` via ${viaPath}.` : '.'), { nodes: cyclePath, }, ), ); } spreadPath.pop(); } spreadPathIndexByName[fragmentName] = undefined; } } /** * No undefined variables * * A GraphQL operation is only valid if all variables encountered, both directly * and via fragment spreads, are defined by that operation. * * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined */ function NoUndefinedVariablesRule(context) { let variableNameDefined = Object.create(null); return { OperationDefinition: { enter() { variableNameDefined = Object.create(null); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); for (const { node } of usages) { const varName = node.name.value; if (variableNameDefined[varName] !== true) { context.reportError( new GraphQLError( operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { nodes: [node, operation], }, ), ); } } }, }, VariableDefinition(node) { variableNameDefined[node.variable.name.value] = true; }, }; } /** * No unused fragments * * A GraphQL document is only valid if all fragment definitions are spread * within operations, or spread within other fragments spread within operations. * * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used */ function NoUnusedFragmentsRule(context) { const operationDefs = []; const fragmentDefs = []; return { OperationDefinition(node) { operationDefs.push(node); return false; }, FragmentDefinition(node) { fragmentDefs.push(node); return false; }, Document: { leave() { const fragmentNameUsed = Object.create(null); for (const operation of operationDefs) { for (const fragment of context.getRecursivelyReferencedFragments( operation, )) { fragmentNameUsed[fragment.name.value] = true; } } for (const fragmentDef of fragmentDefs) { const fragName = fragmentDef.name.value; if (fragmentNameUsed[fragName] !== true) { context.reportError( new GraphQLError(`Fragment "${fragName}" is never used.`, { nodes: fragmentDef, }), ); } } }, }, }; } /** * No unused variables * * A GraphQL operation is only valid if all variables defined by an operation * are used, either directly or within a spread fragment. * * See https://spec.graphql.org/draft/#sec-All-Variables-Used */ function NoUnusedVariablesRule(context) { let variableDefs = []; return { OperationDefinition: { enter() { variableDefs = []; }, leave(operation) { const variableNameUsed = Object.create(null); const usages = context.getRecursiveVariableUsages(operation); for (const { node } of usages) { variableNameUsed[node.name.value] = true; } for (const variableDef of variableDefs) { const variableName = variableDef.variable.name.value; if (variableNameUsed[variableName] !== true) { context.reportError( new GraphQLError( operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { nodes: variableDef, }, ), ); } } }, }, VariableDefinition(def) { variableDefs.push(def); }, }; } /** * Sort ValueNode. * * This function returns a sorted copy of the given ValueNode. * * @internal */ function sortValueNode(valueNode) { switch (valueNode.kind) { case Kind.OBJECT: return { ...valueNode, fields: sortFields(valueNode.fields) }; case Kind.LIST: return { ...valueNode, values: valueNode.values.map(sortValueNode) }; case Kind.INT: case Kind.FLOAT: case Kind.STRING: case Kind.BOOLEAN: case Kind.NULL: case Kind.ENUM: case Kind.VARIABLE: return valueNode; } } function sortFields(fields) { return fields .map((fieldNode) => ({ ...fieldNode, value: sortValueNode(fieldNode.value), })) .sort((fieldA, fieldB) => naturalCompare(fieldA.name.value, fieldB.name.value), ); } function reasonMessage(reason) { if (Array.isArray(reason)) { return reason .map( ([responseName, subReason]) => `subfields "${responseName}" conflict because ` + reasonMessage(subReason), ) .join(' and '); } return reason; } /** * Overlapping fields can be merged * * A selection set is only valid if all fields (including spreading any * fragments) either correspond to distinct response names or can be merged * without ambiguity. * * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging */ function OverlappingFieldsCanBeMergedRule(context) { // A memoization for when two fragments are compared "between" each other for // conflicts. Two fragments may be compared many times, so memoizing this can // dramatically improve the performance of this validator. const comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given // selection set. Selection sets may be asked for this information multiple // times, so this improves the performance of this validator. const cachedFieldsAndFragmentNames = new Map(); return { SelectionSet(selectionSet) { const conflicts = findConflictsWithinSelectionSet( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, context.getParentType(), selectionSet, ); for (const [[responseName, reason], fields1, fields2] of conflicts) { const reasonMsg = reasonMessage(reason); context.reportError( new GraphQLError( `Fields "${responseName}" conflict because ${reasonMsg}. Use different aliases on the fields to fetch both if this was intentional.`, { nodes: fields1.concat(fields2), }, ), ); } }, }; } /** * Algorithm: * * Conflicts occur when two fields exist in a query which will produce the same * response name, but represent differing values, thus creating a conflict. * The algorithm below finds all conflicts via making a series of comparisons * between fields. In order to compare as few fields as possible, this makes * a series of comparisons "within" sets of fields and "between" sets of fields. * * Given any selection set, a collection produces both a set of fields by * also including all inline fragments, as well as a list of fragments * referenced by fragment spreads. * * A) Each selection set represented in the document first compares "within" its * collected set of fields, finding any conflicts between every pair of * overlapping fields. * Note: This is the *only time* that a the fields "within" a set are compared * to each other. After this only fields "between" sets are compared. * * B) Also, if any fragment is referenced in a selection set, then a * comparison is made "between" the original set of fields and the * referenced fragment. * * C) Also, if multiple fragments are referenced, then comparisons * are made "between" each referenced fragment. * * D) When comparing "between" a set of fields and a referenced fragment, first * a comparison is made between each field in the original set of fields and * each field in the the referenced set of fields. * * E) Also, if any fragment is referenced in the referenced selection set, * then a comparison is made "between" the original set of fields and the * referenced fragment (recursively referring to step D). * * F) When comparing "between" two fragments, first a comparison is made between * each field in the first referenced set of fields and each field in the the * second referenced set of fields. * * G) Also, any fragments referenced by the first must be compared to the * second, and any fragments referenced by the second must be compared to the * first (recursively referring to step F). * * H) When comparing two fields, if both have selection sets, then a comparison * is made "between" both selection sets, first comparing the set of fields in * the first selection set with the set of fields in the second. * * I) Also, if any fragment is referenced in either selection set, then a * comparison is made "between" the other set of fields and the * referenced fragment. * * J) Also, if two fragments are referenced in both selection sets, then a * comparison is made "between" the two fragments. * */ // Find all conflicts found "within" a selection set, including those found // via spreading in fragments. Called when visiting each SelectionSet in the // GraphQL Document. function findConflictsWithinSelectionSet( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet, ) { const conflicts = []; const [fieldMap, fragmentNames] = getFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, parentType, selectionSet, ); // (A) Find find all conflicts "within" the fields of this selection set. // Note: this is the *only place* `collectConflictsWithin` is called. collectConflictsWithin( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap, ); if (fragmentNames.length !== 0) { // (B) Then collect conflicts between these fields and those represented by // each spread fragment name found. for (let i = 0; i < fragmentNames.length; i++) { collectConflictsBetweenFieldsAndFragment( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i], ); // (C) Then compare this fragment with all other fragments found in this // selection set to collect conflicts between fragments spread together. // This compares each item in the list of fragment names to every other // item in that same list (except for itself). for (let j = i + 1; j < fragmentNames.length; j++) { collectConflictsBetweenFragments( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j], ); } } } return conflicts; } // Collect all conflicts found between a set of fields and a fragment reference // including via spreading in any nested fragments. function collectConflictsBetweenFieldsAndFragment( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName, ) { const fragment = context.getFragment(fragmentName); if (!fragment) { return; } const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, fragment, ); // Do not compare a fragment's fieldMap to itself. if (fieldMap === fieldMap2) { return; } // (D) First collect any conflicts between the provided collection of fields // and the collection of fields represented by the given fragment. collectConflictsBetween( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2, ); // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. for (const referencedFragmentName of referencedFragmentNames) { // Memoize so two fragments are not compared for conflicts more than once. if ( comparedFragmentPairs.has( referencedFragmentName, fragmentName, areMutuallyExclusive, ) ) { continue; } comparedFragmentPairs.add( referencedFragmentName, fragmentName, areMutuallyExclusive, ); collectConflictsBetweenFieldsAndFragment( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, referencedFragmentName, ); } } // Collect all conflicts found between two fragments, including via spreading in // any nested fragments. function collectConflictsBetweenFragments( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2, ) { // No need to compare a fragment to itself. if (fragmentName1 === fragmentName2) { return; } // Memoize so two fragments are not compared for conflicts more than once. if ( comparedFragmentPairs.has( fragmentName1, fragmentName2, areMutuallyExclusive, ) ) { return; } comparedFragmentPairs.add(fragmentName1, fragmentName2, areMutuallyExclusive); const fragment1 = context.getFragment(fragmentName1); const fragment2 = context.getFragment(fragmentName2); if (!fragment1 || !fragment2) { return; } const [fieldMap1, referencedFragmentNames1] = getReferencedFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, fragment1, ); const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, fragment2, ); // (F) First, collect all conflicts between these two collections of fields // (not including any nested fragments). collectConflictsBetween( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2, ); // (G) Then collect conflicts between the first fragment and any nested // fragments spread in the second fragment. for (const referencedFragmentName2 of referencedFragmentNames2) { collectConflictsBetweenFragments( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, referencedFragmentName2, ); } // (G) Then collect conflicts between the second fragment and any nested // fragments spread in the first fragment. for (const referencedFragmentName1 of referencedFragmentNames1) { collectConflictsBetweenFragments( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, referencedFragmentName1, fragmentName2, ); } } // Find all conflicts found between two selection sets, including those found // via spreading in fragments. Called when determining if conflicts exist // between the sub-fields of two overlapping fields. function findConflictsBetweenSubSelectionSets( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2, ) { const conflicts = []; const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, parentType1, selectionSet1, ); const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, parentType2, selectionSet2, ); // (H) First, collect all conflicts between these two collections of field. collectConflictsBetween( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2, ); // (I) Then collect conflicts between the first collection of fields and // those referenced by each fragment name associated with the second. for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFieldsAndFragment( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentName2, ); } // (I) Then collect conflicts between the second collection of fields and // those referenced by each fragment name associated with the first. for (const fragmentName1 of fragmentNames1) { collectConflictsBetweenFieldsAndFragment( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentName1, ); } // (J) Also collect conflicts between any fragment names by the first and // fragment names by the second. This compares each item in the first set of // names to each item in the second set of names. for (const fragmentName1 of fragmentNames1) { for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFragments( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2, ); } } return conflicts; } // Collect all Conflicts "within" one collection of fields. function collectConflictsWithin( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap, ) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For every response name, if there are multiple fields, they // must be compared to find a potential conflict. for (const [responseName, fields] of Object.entries(fieldMap)) { // This compares every field in the list to every other field in this list // (except to itself). If the list only has one item, nothing needs to // be compared. if (fields.length > 1) { for (let i = 0; i < fields.length; i++) { for (let j = i + 1; j < fields.length; j++) { const conflict = findConflict( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, // within one collection is never mutually exclusive responseName, fields[i], fields[j], ); if (conflict) { conflicts.push(conflict); } } } } } } // Collect all Conflicts between two collections of fields. This is similar to, // but different from the `collectConflictsWithin` function above. This check // assumes that `collectConflictsWithin` has already been called on each // provided collection of fields. This is true because this validator traverses // each individual selection set. function collectConflictsBetween( context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2, ) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For any response name which appears in both provided field // maps, each field from the first field map must be compared to every field // in the second field map to find potential conflicts. for (const [responseName, fields1] of Object.entries(fieldMap1)) { const fields2 = fieldMap2[responseName]; if (fields2) { for (const field1 of fields1) { for (const field2 of fields2) { const conflict = findConflict( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2, ); if (conflict) { conflicts.push(conflict); } } } } } } // Determines if there is a conflict between two particular fields, including // comparing their sub-fields. function findConflict( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2, ) { const [parentType1, node1, def1] = field1; const [parentType2, node2, def2] = field2; // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity // by differing. // It is known that two parent types could never overlap if they are // different Object types. Interface or Union types might overlap - if not // in the current state of the schema, then perhaps in some future version, // thus may not safely diverge. const areMutuallyExclusive = parentFieldsAreMutuallyExclusive || (parentType1 !== parentType2 && isObjectType(parentType1) && isObjectType(parentType2)); if (!areMutuallyExclusive) { // Two aliases must refer to the same field. const name1 = node1.name.value; const name2 = node2.name.value; if (name1 !== name2) { return [ [responseName, `"${name1}" and "${name2}" are different fields`], [node1], [node2], ]; } // Two field calls must have the same arguments. if (stringifyArguments(node1) !== stringifyArguments(node2)) { return [ [responseName, 'they have differing arguments'], [node1], [node2], ]; } } // The return type for each field. const type1 = def1 === null || def1 === void 0 ? void 0 : def1.type; const type2 = def2 === null || def2 === void 0 ? void 0 : def2.type; if (type1 && type2 && doTypesConflict(type1, type2)) { return [ [ responseName, `they return conflicting types "${inspect$1(type1)}" and "${inspect$1( type2, )}"`, ], [node1], [node2], ]; } // Collect and compare sub-fields. Use the same "visited fragment names" list // for both collections so fields in a fragment reference are never // compared to themselves. const selectionSet1 = node1.selectionSet; const selectionSet2 = node2.selectionSet; if (selectionSet1 && selectionSet2) { const conflicts = findConflictsBetweenSubSelectionSets( context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, getNamedType(type1), selectionSet1, getNamedType(type2), selectionSet2, ); return subfieldConflicts(conflicts, responseName, node1, node2); } } function stringifyArguments(fieldNode) { var _fieldNode$arguments; // FIXME https://github.com/graphql/graphql-js/issues/2203 const args = /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) !== null && _fieldNode$arguments !== void 0 ? _fieldNode$arguments : []; const inputObjectWithArgs = { kind: Kind.OBJECT, fields: args.map((argNode) => ({ kind: Kind.OBJECT_FIELD, name: argNode.name, value: argNode.value, })), }; return print(sortValueNode(inputObjectWithArgs)); } // Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. function doTypesConflict(type1, type2) { if (isListType(type1)) { return isListType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; } if (isListType(type2)) { return true; } if (isNonNullType(type1)) { return isNonNullType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; } if (isNonNullType(type2)) { return true; } if (isLeafType(type1) || isLeafType(type2)) { return type1 !== type2; } return false; } // Given a selection set, return the collection of fields (a mapping of response // name to field nodes and definitions) as well as a list of fragment names // referenced via fragment spreads. function getFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, parentType, selectionSet, ) { const cached = cachedFieldsAndFragmentNames.get(selectionSet); if (cached) { return cached; } const nodeAndDefs = Object.create(null); const fragmentNames = Object.create(null); _collectFieldsAndFragmentNames( context, parentType, selectionSet, nodeAndDefs, fragmentNames, ); const result = [nodeAndDefs, Object.keys(fragmentNames)]; cachedFieldsAndFragmentNames.set(selectionSet, result); return result; } // Given a reference to a fragment, return the represented collection of fields // as well as a list of nested fragment names referenced via fragment spreads. function getReferencedFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, fragment, ) { // Short-circuit building a type from the node if possible. const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet); if (cached) { return cached; } const fragmentType = typeFromAST(context.getSchema(), fragment.typeCondition); return getFieldsAndFragmentNames( context, cachedFieldsAndFragmentNames, fragmentType, fragment.selectionSet, ); } function _collectFieldsAndFragmentNames( context, parentType, selectionSet, nodeAndDefs, fragmentNames, ) { for (const selection of selectionSet.selections) { switch (selection.kind) { case Kind.FIELD: { const fieldName = selection.name.value; let fieldDef; if (isObjectType(parentType) || isInterfaceType(parentType)) { fieldDef = parentType.getFields()[fieldName]; } const responseName = selection.alias ? selection.alias.value : fieldName; if (!nodeAndDefs[responseName]) { nodeAndDefs[responseName] = []; } nodeAndDefs[responseName].push([parentType, selection, fieldDef]); break; } case Kind.FRAGMENT_SPREAD: fragmentNames[selection.name.value] = true; break; case Kind.INLINE_FRAGMENT: { const typeCondition = selection.typeCondition; const inlineFragmentType = typeCondition ? typeFromAST(context.getSchema(), typeCondition) : parentType; _collectFieldsAndFragmentNames( context, inlineFragmentType, selection.selectionSet, nodeAndDefs, fragmentNames, ); break; } } } } // Given a series of Conflicts which occurred between two sub-fields, generate // a single Conflict. function subfieldConflicts(conflicts, responseName, node1, node2) { if (conflicts.length > 0) { return [ [responseName, conflicts.map(([reason]) => reason)], [node1, ...conflicts.map(([, fields1]) => fields1).flat()], [node2, ...conflicts.map(([, , fields2]) => fields2).flat()], ]; } } /** * A way to keep track of pairs of things when the ordering of the pair does not matter. */ class PairSet { constructor() { this._data = new Map(); } has(a, b, areMutuallyExclusive) { var _this$_data$get; const [key1, key2] = a < b ? [a, b] : [b, a]; const result = (_this$_data$get = this._data.get(key1)) === null || _this$_data$get === void 0 ? void 0 : _this$_data$get.get(key2); if (result === undefined) { return false; } // areMutuallyExclusive being false is a superset of being true, hence if // we want to know if this PairSet "has" these two with no exclusivity, // we have to ensure it was added as such. return areMutuallyExclusive ? true : areMutuallyExclusive === result; } add(a, b, areMutuallyExclusive) { const [key1, key2] = a < b ? [a, b] : [b, a]; const map = this._data.get(key1); if (map === undefined) { this._data.set(key1, new Map([[key2, areMutuallyExclusive]])); } else { map.set(key2, areMutuallyExclusive); } } } /** * Possible fragment spread * * A fragment spread is only valid if the type condition could ever possibly * be true: if there is a non-empty intersection of the possible parent types, * and possible types which pass the type condition. */ function PossibleFragmentSpreadsRule(context) { return { InlineFragment(node) { const fragType = context.getType(); const parentType = context.getParentType(); if ( isCompositeType(fragType) && isCompositeType(parentType) && !doTypesOverlap(context.getSchema(), fragType, parentType) ) { const parentTypeStr = inspect$1(parentType); const fragTypeStr = inspect$1(fragType); context.reportError( new GraphQLError( `Fragment cannot be spread here as objects of type "${parentTypeStr}" can never be of type "${fragTypeStr}".`, { nodes: node, }, ), ); } }, FragmentSpread(node) { const fragName = node.name.value; const fragType = getFragmentType(context, fragName); const parentType = context.getParentType(); if ( fragType && parentType && !doTypesOverlap(context.getSchema(), fragType, parentType) ) { const parentTypeStr = inspect$1(parentType); const fragTypeStr = inspect$1(fragType); context.reportError( new GraphQLError( `Fragment "${fragName}" cannot be spread here as objects of type "${parentTypeStr}" can never be of type "${fragTypeStr}".`, { nodes: node, }, ), ); } }, }; } function getFragmentType(context, name) { const frag = context.getFragment(name); if (frag) { const type = typeFromAST(context.getSchema(), frag.typeCondition); if (isCompositeType(type)) { return type; } } } /** * Possible type extension * * A type extension is only valid if the type is defined and has the same kind. */ function PossibleTypeExtensionsRule(context) { const schema = context.getSchema(); const definedTypes = Object.create(null); for (const def of context.getDocument().definitions) { if (isTypeDefinitionNode(def)) { definedTypes[def.name.value] = def; } } return { ScalarTypeExtension: checkExtension, ObjectTypeExtension: checkExtension, InterfaceTypeExtension: checkExtension, UnionTypeExtension: checkExtension, EnumTypeExtension: checkExtension, InputObjectTypeExtension: checkExtension, }; function checkExtension(node) { const typeName = node.name.value; const defNode = definedTypes[typeName]; const existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); let expectedKind; if (defNode) { expectedKind = defKindToExtKind[defNode.kind]; } else if (existingType) { expectedKind = typeToExtKind(existingType); } if (expectedKind) { if (expectedKind !== node.kind) { const kindStr = extensionKindToTypeName(node.kind); context.reportError( new GraphQLError(`Cannot extend non-${kindStr} type "${typeName}".`, { nodes: defNode ? [defNode, node] : node, }), ); } } else { const allTypeNames = Object.keys({ ...definedTypes, ...(schema === null || schema === void 0 ? void 0 : schema.getTypeMap()), }); const suggestedTypes = suggestionList(typeName, allTypeNames); context.reportError( new GraphQLError( `Cannot extend type "${typeName}" because it is not defined.` + didYouMean(suggestedTypes), { nodes: node.name, }, ), ); } } } const defKindToExtKind = { [Kind.SCALAR_TYPE_DEFINITION]: Kind.SCALAR_TYPE_EXTENSION, [Kind.OBJECT_TYPE_DEFINITION]: Kind.OBJECT_TYPE_EXTENSION, [Kind.INTERFACE_TYPE_DEFINITION]: Kind.INTERFACE_TYPE_EXTENSION, [Kind.UNION_TYPE_DEFINITION]: Kind.UNION_TYPE_EXTENSION, [Kind.ENUM_TYPE_DEFINITION]: Kind.ENUM_TYPE_EXTENSION, [Kind.INPUT_OBJECT_TYPE_DEFINITION]: Kind.INPUT_OBJECT_TYPE_EXTENSION, }; function typeToExtKind(type) { if (isScalarType(type)) { return Kind.SCALAR_TYPE_EXTENSION; } if (isObjectType(type)) { return Kind.OBJECT_TYPE_EXTENSION; } if (isInterfaceType(type)) { return Kind.INTERFACE_TYPE_EXTENSION; } if (isUnionType(type)) { return Kind.UNION_TYPE_EXTENSION; } if (isEnumType(type)) { return Kind.ENUM_TYPE_EXTENSION; } if (isInputObjectType(type)) { return Kind.INPUT_OBJECT_TYPE_EXTENSION; } /* c8 ignore next 3 */ // Not reachable. All possible types have been considered invariant$1(false, 'Unexpected type: ' + inspect$1(type)); } function extensionKindToTypeName(kind) { switch (kind) { case Kind.SCALAR_TYPE_EXTENSION: return 'scalar'; case Kind.OBJECT_TYPE_EXTENSION: return 'object'; case Kind.INTERFACE_TYPE_EXTENSION: return 'interface'; case Kind.UNION_TYPE_EXTENSION: return 'union'; case Kind.ENUM_TYPE_EXTENSION: return 'enum'; case Kind.INPUT_OBJECT_TYPE_EXTENSION: return 'input object'; // Not reachable. All possible types have been considered /* c8 ignore next */ default: invariant$1(false, 'Unexpected kind: ' + inspect$1(kind)); } } /** * Provided required arguments * * A field or directive is only valid if all required (non-null without a * default value) field arguments have been provided. */ function ProvidedRequiredArgumentsRule(context) { return { // eslint-disable-next-line new-cap ...ProvidedRequiredArgumentsOnDirectivesRule(context), Field: { // Validate on leave to allow for deeper errors to appear first. leave(fieldNode) { var _fieldNode$arguments; const fieldDef = context.getFieldDef(); if (!fieldDef) { return false; } const providedArgs = new Set( // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) === null || _fieldNode$arguments === void 0 ? void 0 : _fieldNode$arguments.map((arg) => arg.name.value), ); for (const argDef of fieldDef.args) { if (!providedArgs.has(argDef.name) && isRequiredArgument(argDef)) { const argTypeStr = inspect$1(argDef.type); context.reportError( new GraphQLError( `Field "${fieldDef.name}" argument "${argDef.name}" of type "${argTypeStr}" is required, but it was not provided.`, { nodes: fieldNode, }, ), ); } } }, }, }; } /** * @internal */ function ProvidedRequiredArgumentsOnDirectivesRule(context) { var _schema$getDirectives; const requiredArgsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = (_schema$getDirectives = schema === null || schema === void 0 ? void 0 : schema.getDirectives()) !== null && _schema$getDirectives !== void 0 ? _schema$getDirectives : specifiedDirectives; for (const directive of definedDirectives) { requiredArgsMap[directive.name] = keyMap( directive.args.filter(isRequiredArgument), (arg) => arg.name, ); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === Kind.DIRECTIVE_DEFINITION) { var _def$arguments; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; requiredArgsMap[def.name.value] = keyMap( argNodes.filter(isRequiredArgumentNode), (arg) => arg.name.value, ); } } return { Directive: { // Validate on leave to allow for deeper errors to appear first. leave(directiveNode) { const directiveName = directiveNode.name.value; const requiredArgs = requiredArgsMap[directiveName]; if (requiredArgs) { var _directiveNode$argume; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; const argNodeMap = new Set(argNodes.map((arg) => arg.name.value)); for (const [argName, argDef] of Object.entries(requiredArgs)) { if (!argNodeMap.has(argName)) { const argType = isType(argDef.type) ? inspect$1(argDef.type) : print(argDef.type); context.reportError( new GraphQLError( `Directive "@${directiveName}" argument "${argName}" of type "${argType}" is required, but it was not provided.`, { nodes: directiveNode, }, ), ); } } } }, }, }; } function isRequiredArgumentNode(arg) { return arg.type.kind === Kind.NON_NULL_TYPE && arg.defaultValue == null; } /** * Scalar leafs * * A GraphQL document is valid only if all leaf fields (fields without * sub selections) are of scalar or enum types. */ function ScalarLeafsRule(context) { return { Field(node) { const type = context.getType(); const selectionSet = node.selectionSet; if (type) { if (isLeafType(getNamedType(type))) { if (selectionSet) { const fieldName = node.name.value; const typeStr = inspect$1(type); context.reportError( new GraphQLError( `Field "${fieldName}" must not have a selection since type "${typeStr}" has no subfields.`, { nodes: selectionSet, }, ), ); } } else if (!selectionSet) { const fieldName = node.name.value; const typeStr = inspect$1(type); context.reportError( new GraphQLError( `Field "${fieldName}" of type "${typeStr}" must have a selection of subfields. Did you mean "${fieldName} { ... }"?`, { nodes: node, }, ), ); } } }, }; } /** * Build a string describing the path. */ function printPathArray(path) { return path .map((key) => typeof key === 'number' ? '[' + key.toString() + ']' : '.' + key, ) .join(''); } /** * Given a Path and a key, return a new Path containing the new key. */ function addPath(prev, key, typename) { return { prev, key, typename, }; } /** * Given a Path, return an Array of the path keys. */ function pathToArray(path) { const flattened = []; let curr = path; while (curr) { flattened.push(curr.key); curr = curr.prev; } return flattened.reverse(); } /** * Coerces a JavaScript value given a GraphQL Input Type. */ function coerceInputValue(inputValue, type, onError = defaultOnError) { return coerceInputValueImpl(inputValue, type, onError, undefined); } function defaultOnError(path, invalidValue, error) { let errorPrefix = 'Invalid value ' + inspect$1(invalidValue); if (path.length > 0) { errorPrefix += ` at "value${printPathArray(path)}"`; } error.message = errorPrefix + ': ' + error.message; throw error; } function coerceInputValueImpl(inputValue, type, onError, path) { if (isNonNullType(type)) { if (inputValue != null) { return coerceInputValueImpl(inputValue, type.ofType, onError, path); } onError( pathToArray(path), inputValue, new GraphQLError( `Expected non-nullable type "${inspect$1(type)}" not to be null.`, ), ); return; } if (inputValue == null) { // Explicitly return the value null. return null; } if (isListType(type)) { const itemType = type.ofType; if (isIterableObject(inputValue)) { return Array.from(inputValue, (itemValue, index) => { const itemPath = addPath(path, index, undefined); return coerceInputValueImpl(itemValue, itemType, onError, itemPath); }); } // Lists accept a non-list value as a list of one. return [coerceInputValueImpl(inputValue, itemType, onError, path)]; } if (isInputObjectType(type)) { if (!isObjectLike(inputValue)) { onError( pathToArray(path), inputValue, new GraphQLError(`Expected type "${type.name}" to be an object.`), ); return; } const coercedValue = {}; const fieldDefs = type.getFields(); for (const field of Object.values(fieldDefs)) { const fieldValue = inputValue[field.name]; if (fieldValue === undefined) { if (field.defaultValue !== undefined) { coercedValue[field.name] = field.defaultValue; } else if (isNonNullType(field.type)) { const typeStr = inspect$1(field.type); onError( pathToArray(path), inputValue, new GraphQLError( `Field "${field.name}" of required type "${typeStr}" was not provided.`, ), ); } continue; } coercedValue[field.name] = coerceInputValueImpl( fieldValue, field.type, onError, addPath(path, field.name, type.name), ); } // Ensure every provided field is defined. for (const fieldName of Object.keys(inputValue)) { if (!fieldDefs[fieldName]) { const suggestions = suggestionList( fieldName, Object.keys(type.getFields()), ); onError( pathToArray(path), inputValue, new GraphQLError( `Field "${fieldName}" is not defined by type "${type.name}".` + didYouMean(suggestions), ), ); } } return coercedValue; } if (isLeafType(type)) { let parseResult; // Scalars and Enums determine if a input value is valid via parseValue(), // which can throw to indicate failure. If it throws, maintain a reference // to the original error. try { parseResult = type.parseValue(inputValue); } catch (error) { if (error instanceof GraphQLError) { onError(pathToArray(path), inputValue, error); } else { onError( pathToArray(path), inputValue, new GraphQLError(`Expected type "${type.name}". ` + error.message, { originalError: error, }), ); } return; } if (parseResult === undefined) { onError( pathToArray(path), inputValue, new GraphQLError(`Expected type "${type.name}".`), ); } return parseResult; } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. invariant$1(false, 'Unexpected input type: ' + inspect$1(type)); } /** * Produces a JavaScript value given a GraphQL Value AST. * * A GraphQL type must be provided, which will be used to interpret different * GraphQL Value literals. * * Returns `undefined` when the value could not be validly coerced according to * the provided type. * * | GraphQL Value | JSON Value | * | -------------------- | ------------- | * | Input Object | Object | * | List | Array | * | Boolean | Boolean | * | String | String | * | Int / Float | Number | * | Enum Value | Unknown | * | NullValue | null | * */ function valueFromAST(valueNode, type, variables) { if (!valueNode) { // When there is no node, then there is also no value. // Importantly, this is different from returning the value null. return; } if (valueNode.kind === Kind.VARIABLE) { const variableName = valueNode.name.value; if (variables == null || variables[variableName] === undefined) { // No valid return value. return; } const variableValue = variables[variableName]; if (variableValue === null && isNonNullType(type)) { return; // Invalid: intentionally return no value. } // Note: This does no further checking that this variable is correct. // This assumes that this query has been validated and the variable // usage here is of the correct type. return variableValue; } if (isNonNullType(type)) { if (valueNode.kind === Kind.NULL) { return; // Invalid: intentionally return no value. } return valueFromAST(valueNode, type.ofType, variables); } if (valueNode.kind === Kind.NULL) { // This is explicitly returning the value null. return null; } if (isListType(type)) { const itemType = type.ofType; if (valueNode.kind === Kind.LIST) { const coercedValues = []; for (const itemNode of valueNode.values) { if (isMissingVariable(itemNode, variables)) { // If an array contains a missing variable, it is either coerced to // null or if the item type is non-null, it considered invalid. if (isNonNullType(itemType)) { return; // Invalid: intentionally return no value. } coercedValues.push(null); } else { const itemValue = valueFromAST(itemNode, itemType, variables); if (itemValue === undefined) { return; // Invalid: intentionally return no value. } coercedValues.push(itemValue); } } return coercedValues; } const coercedValue = valueFromAST(valueNode, itemType, variables); if (coercedValue === undefined) { return; // Invalid: intentionally return no value. } return [coercedValue]; } if (isInputObjectType(type)) { if (valueNode.kind !== Kind.OBJECT) { return; // Invalid: intentionally return no value. } const coercedObj = Object.create(null); const fieldNodes = keyMap(valueNode.fields, (field) => field.name.value); for (const field of Object.values(type.getFields())) { const fieldNode = fieldNodes[field.name]; if (!fieldNode || isMissingVariable(fieldNode.value, variables)) { if (field.defaultValue !== undefined) { coercedObj[field.name] = field.defaultValue; } else if (isNonNullType(field.type)) { return; // Invalid: intentionally return no value. } continue; } const fieldValue = valueFromAST(fieldNode.value, field.type, variables); if (fieldValue === undefined) { return; // Invalid: intentionally return no value. } coercedObj[field.name] = fieldValue; } return coercedObj; } if (isLeafType(type)) { // Scalars and Enums fulfill parsing a literal value via parseLiteral(). // Invalid values represent a failure to parse correctly, in which case // no value is returned. let result; try { result = type.parseLiteral(valueNode, variables); } catch (_error) { return; // Invalid: intentionally return no value. } if (result === undefined) { return; // Invalid: intentionally return no value. } return result; } /* c8 ignore next 3 */ // Not reachable, all possible input types have been considered. invariant$1(false, 'Unexpected input type: ' + inspect$1(type)); } // Returns true if the provided valueNode is a variable which is not defined // in the set of variables. function isMissingVariable(valueNode, variables) { return ( valueNode.kind === Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined) ); } /** * Prepares an object map of variableValues of the correct type based on the * provided variable definitions and arbitrary input. If the input cannot be * parsed to match the variable definitions, a GraphQLError will be thrown. * * Note: The returned value is a plain Object with a prototype, since it is * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ function getVariableValues(schema, varDefNodes, inputs, options) { const errors = []; const maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors; try { const coerced = coerceVariableValues( schema, varDefNodes, inputs, (error) => { if (maxErrors != null && errors.length >= maxErrors) { throw new GraphQLError( 'Too many errors processing variables, error limit reached. Execution aborted.', ); } errors.push(error); }, ); if (errors.length === 0) { return { coerced, }; } } catch (error) { errors.push(error); } return { errors, }; } function coerceVariableValues(schema, varDefNodes, inputs, onError) { const coercedValues = {}; for (const varDefNode of varDefNodes) { const varName = varDefNode.variable.name.value; const varType = typeFromAST(schema, varDefNode.type); if (!isInputType(varType)) { // Must use input types for variables. This should be caught during // validation, however is checked again here for safety. const varTypeStr = print(varDefNode.type); onError( new GraphQLError( `Variable "$${varName}" expected value of type "${varTypeStr}" which cannot be used as an input type.`, { nodes: varDefNode.type, }, ), ); continue; } if (!hasOwnProperty(inputs, varName)) { if (varDefNode.defaultValue) { coercedValues[varName] = valueFromAST(varDefNode.defaultValue, varType); } else if (isNonNullType(varType)) { const varTypeStr = inspect$1(varType); onError( new GraphQLError( `Variable "$${varName}" of required type "${varTypeStr}" was not provided.`, { nodes: varDefNode, }, ), ); } continue; } const value = inputs[varName]; if (value === null && isNonNullType(varType)) { const varTypeStr = inspect$1(varType); onError( new GraphQLError( `Variable "$${varName}" of non-null type "${varTypeStr}" must not be null.`, { nodes: varDefNode, }, ), ); continue; } coercedValues[varName] = coerceInputValue( value, varType, (path, invalidValue, error) => { let prefix = `Variable "$${varName}" got invalid value ` + inspect$1(invalidValue); if (path.length > 0) { prefix += ` at "${varName}${printPathArray(path)}"`; } onError( new GraphQLError(prefix + '; ' + error.message, { nodes: varDefNode, originalError: error.originalError, }), ); }, ); } return coercedValues; } /** * Prepares an object map of argument values given a list of argument * definitions and list of argument AST nodes. * * Note: The returned value is a plain Object with a prototype, since it is * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ function getArgumentValues(def, node, variableValues) { var _node$arguments; const coercedValues = {}; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : []; const argNodeMap = keyMap(argumentNodes, (arg) => arg.name.value); for (const argDef of def.args) { const name = argDef.name; const argType = argDef.type; const argumentNode = argNodeMap[name]; if (!argumentNode) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if (isNonNullType(argType)) { throw new GraphQLError( `Argument "${name}" of required type "${inspect$1(argType)}" ` + 'was not provided.', { nodes: node, }, ); } continue; } const valueNode = argumentNode.value; let isNull = valueNode.kind === Kind.NULL; if (valueNode.kind === Kind.VARIABLE) { const variableName = valueNode.name.value; if ( variableValues == null || !hasOwnProperty(variableValues, variableName) ) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if (isNonNullType(argType)) { throw new GraphQLError( `Argument "${name}" of required type "${inspect$1(argType)}" ` + `was provided the variable "$${variableName}" which was not provided a runtime value.`, { nodes: valueNode, }, ); } continue; } isNull = variableValues[variableName] == null; } if (isNull && isNonNullType(argType)) { throw new GraphQLError( `Argument "${name}" of non-null type "${inspect$1(argType)}" ` + 'must not be null.', { nodes: valueNode, }, ); } const coercedValue = valueFromAST(valueNode, argType, variableValues); if (coercedValue === undefined) { // Note: ValuesOfCorrectTypeRule validation should catch this before // execution. This is a runtime check to ensure execution does not // continue with an invalid argument value. throw new GraphQLError( `Argument "${name}" has invalid value ${print(valueNode)}.`, { nodes: valueNode, }, ); } coercedValues[name] = coercedValue; } return coercedValues; } /** * Prepares an object map of argument values given a directive definition * and a AST node which may contain directives. Optionally also accepts a map * of variable values. * * If the directive does not exist on the node, returns undefined. * * Note: The returned value is a plain Object with a prototype, since it is * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ function getDirectiveValues(directiveDef, node, variableValues) { var _node$directives; const directiveNode = (_node$directives = node.directives) === null || _node$directives === void 0 ? void 0 : _node$directives.find( (directive) => directive.name.value === directiveDef.name, ); if (directiveNode) { return getArgumentValues(directiveDef, directiveNode, variableValues); } } function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /** * Given a selectionSet, collects all of the fields and returns them. * * CollectFields requires the "runtime type" of an object. For a field that * returns an Interface or Union type, the "runtime type" will be the actual * object type returned by that field. * * @internal */ function collectFields( schema, fragments, variableValues, runtimeType, selectionSet, ) { const fields = new Map(); collectFieldsImpl( schema, fragments, variableValues, runtimeType, selectionSet, fields, new Set(), ); return fields; } /** * Given an array of field nodes, collects all of the subfields of the passed * in fields, and returns them at the end. * * CollectSubFields requires the "return type" of an object. For a field that * returns an Interface or Union type, the "return type" will be the actual * object type returned by that field. * * @internal */ function collectSubfields$1( schema, fragments, variableValues, returnType, fieldNodes, ) { const subFieldNodes = new Map(); const visitedFragmentNames = new Set(); for (const node of fieldNodes) { if (node.selectionSet) { collectFieldsImpl( schema, fragments, variableValues, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames, ); } } return subFieldNodes; } function collectFieldsImpl( schema, fragments, variableValues, runtimeType, selectionSet, fields, visitedFragmentNames, ) { for (const selection of selectionSet.selections) { switch (selection.kind) { case Kind.FIELD: { if (!shouldIncludeNode(variableValues, selection)) { continue; } const name = getFieldEntryKey(selection); const fieldList = fields.get(name); if (fieldList !== undefined) { fieldList.push(selection); } else { fields.set(name, [selection]); } break; } case Kind.INLINE_FRAGMENT: { if ( !shouldIncludeNode(variableValues, selection) || !doesFragmentConditionMatch(schema, selection, runtimeType) ) { continue; } collectFieldsImpl( schema, fragments, variableValues, runtimeType, selection.selectionSet, fields, visitedFragmentNames, ); break; } case Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; if ( visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection) ) { continue; } visitedFragmentNames.add(fragName); const fragment = fragments[fragName]; if ( !fragment || !doesFragmentConditionMatch(schema, fragment, runtimeType) ) { continue; } collectFieldsImpl( schema, fragments, variableValues, runtimeType, fragment.selectionSet, fields, visitedFragmentNames, ); break; } } } } /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. */ function shouldIncludeNode(variableValues, node) { const skip = getDirectiveValues(GraphQLSkipDirective, node, variableValues); if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) { return false; } const include = getDirectiveValues( GraphQLIncludeDirective, node, variableValues, ); if ( (include === null || include === void 0 ? void 0 : include.if) === false ) { return false; } return true; } /** * Determines if a fragment is applicable to the given type. */ function doesFragmentConditionMatch(schema, fragment, type) { const typeConditionNode = fragment.typeCondition; if (!typeConditionNode) { return true; } const conditionalType = typeFromAST(schema, typeConditionNode); if (conditionalType === type) { return true; } if (isAbstractType(conditionalType)) { return schema.isSubType(conditionalType, type); } return false; } /** * Implements the logic to compute the key of a given field's entry */ function getFieldEntryKey(node) { return node.alias ? node.alias.value : node.name.value; } /** * Subscriptions must only include a non-introspection field. * * A GraphQL subscription is valid only if it contains a single root field and * that root field is not an introspection field. * * See https://spec.graphql.org/draft/#sec-Single-root-field */ function SingleFieldSubscriptionsRule(context) { return { OperationDefinition(node) { if (node.operation === 'subscription') { const schema = context.getSchema(); const subscriptionType = schema.getSubscriptionType(); if (subscriptionType) { const operationName = node.name ? node.name.value : null; const variableValues = Object.create(null); const document = context.getDocument(); const fragments = Object.create(null); for (const definition of document.definitions) { if (definition.kind === Kind.FRAGMENT_DEFINITION) { fragments[definition.name.value] = definition; } } const fields = collectFields( schema, fragments, variableValues, subscriptionType, node.selectionSet, ); if (fields.size > 1) { const fieldSelectionLists = [...fields.values()]; const extraFieldSelectionLists = fieldSelectionLists.slice(1); const extraFieldSelections = extraFieldSelectionLists.flat(); context.reportError( new GraphQLError( operationName != null ? `Subscription "${operationName}" must select only one top level field.` : 'Anonymous Subscription must select only one top level field.', { nodes: extraFieldSelections, }, ), ); } for (const fieldNodes of fields.values()) { const field = fieldNodes[0]; const fieldName = field.name.value; if (fieldName.startsWith('__')) { context.reportError( new GraphQLError( operationName != null ? `Subscription "${operationName}" must not select an introspection top level field.` : 'Anonymous Subscription must not select an introspection top level field.', { nodes: fieldNodes, }, ), ); } } } } }, }; } /** * Groups array items into a Map, given a function to produce grouping key. */ function groupBy(list, keyFn) { const result = new Map(); for (const item of list) { const key = keyFn(item); const group = result.get(key); if (group === undefined) { result.set(key, [item]); } else { group.push(item); } } return result; } /** * Unique argument definition names * * A GraphQL Object or Interface type is only valid if all its fields have uniquely named arguments. * A GraphQL Directive is only valid if all its arguments are uniquely named. */ function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { var _directiveNode$argume; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argumentNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); }, InterfaceTypeDefinition: checkArgUniquenessPerField, InterfaceTypeExtension: checkArgUniquenessPerField, ObjectTypeDefinition: checkArgUniquenessPerField, ObjectTypeExtension: checkArgUniquenessPerField, }; function checkArgUniquenessPerField(typeNode) { var _typeNode$fields; const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const fieldNodes = (_typeNode$fields = typeNode.fields) !== null && _typeNode$fields !== void 0 ? _typeNode$fields : []; for (const fieldDef of fieldNodes) { var _fieldDef$arguments; const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argumentNodes = (_fieldDef$arguments = fieldDef.arguments) !== null && _fieldDef$arguments !== void 0 ? _fieldDef$arguments : []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } return false; } function checkArgUniqueness(parentName, argumentNodes) { const seenArgs = groupBy(argumentNodes, (arg) => arg.name.value); for (const [argName, argNodes] of seenArgs) { if (argNodes.length > 1) { context.reportError( new GraphQLError( `Argument "${parentName}(${argName}:)" can only be defined once.`, { nodes: argNodes.map((node) => node.name), }, ), ); } } return false; } } /** * Unique argument names * * A GraphQL field or directive is only valid if all supplied arguments are * uniquely named. * * See https://spec.graphql.org/draft/#sec-Argument-Names */ function UniqueArgumentNamesRule(context) { return { Field: checkArgUniqueness, Directive: checkArgUniqueness, }; function checkArgUniqueness(parentNode) { var _parentNode$arguments; // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const argumentNodes = (_parentNode$arguments = parentNode.arguments) !== null && _parentNode$arguments !== void 0 ? _parentNode$arguments : []; const seenArgs = groupBy(argumentNodes, (arg) => arg.name.value); for (const [argName, argNodes] of seenArgs) { if (argNodes.length > 1) { context.reportError( new GraphQLError( `There can be only one argument named "${argName}".`, { nodes: argNodes.map((node) => node.name), }, ), ); } } } } /** * Unique directive names * * A GraphQL document is only valid if all defined directives have unique names. */ function UniqueDirectiveNamesRule(context) { const knownDirectiveNames = Object.create(null); const schema = context.getSchema(); return { DirectiveDefinition(node) { const directiveName = node.name.value; if ( schema !== null && schema !== void 0 && schema.getDirective(directiveName) ) { context.reportError( new GraphQLError( `Directive "@${directiveName}" already exists in the schema. It cannot be redefined.`, { nodes: node.name, }, ), ); return; } if (knownDirectiveNames[directiveName]) { context.reportError( new GraphQLError( `There can be only one directive named "@${directiveName}".`, { nodes: [knownDirectiveNames[directiveName], node.name], }, ), ); } else { knownDirectiveNames[directiveName] = node.name; } return false; }, }; } /** * Unique directive names per location * * A GraphQL document is only valid if all non-repeatable directives at * a given location are uniquely named. * * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location */ function UniqueDirectivesPerLocationRule(context) { const uniqueDirectiveMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : specifiedDirectives; for (const directive of definedDirectives) { uniqueDirectiveMap[directive.name] = !directive.isRepeatable; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === Kind.DIRECTIVE_DEFINITION) { uniqueDirectiveMap[def.name.value] = !def.repeatable; } } const schemaDirectives = Object.create(null); const typeDirectivesMap = Object.create(null); return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it // defines any directives. enter(node) { if (!('directives' in node) || !node.directives) { return; } let seenDirectives; if ( node.kind === Kind.SCHEMA_DEFINITION || node.kind === Kind.SCHEMA_EXTENSION ) { seenDirectives = schemaDirectives; } else if (isTypeDefinitionNode(node) || isTypeExtensionNode(node)) { const typeName = node.name.value; seenDirectives = typeDirectivesMap[typeName]; if (seenDirectives === undefined) { typeDirectivesMap[typeName] = seenDirectives = Object.create(null); } } else { seenDirectives = Object.create(null); } for (const directive of node.directives) { const directiveName = directive.name.value; if (uniqueDirectiveMap[directiveName]) { if (seenDirectives[directiveName]) { context.reportError( new GraphQLError( `The directive "@${directiveName}" can only be used once at this location.`, { nodes: [seenDirectives[directiveName], directive], }, ), ); } else { seenDirectives[directiveName] = directive; } } } }, }; } /** * Unique enum value names * * A GraphQL enum type is only valid if all its values are uniquely named. */ function UniqueEnumValueNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); const knownValueNames = Object.create(null); return { EnumTypeDefinition: checkValueUniqueness, EnumTypeExtension: checkValueUniqueness, }; function checkValueUniqueness(node) { var _node$values; const typeName = node.name.value; if (!knownValueNames[typeName]) { knownValueNames[typeName] = Object.create(null); } // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; const valueNames = knownValueNames[typeName]; for (const valueDef of valueNodes) { const valueName = valueDef.name.value; const existingType = existingTypeMap[typeName]; if (isEnumType(existingType) && existingType.getValue(valueName)) { context.reportError( new GraphQLError( `Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: valueDef.name, }, ), ); } else if (valueNames[valueName]) { context.reportError( new GraphQLError( `Enum value "${typeName}.${valueName}" can only be defined once.`, { nodes: [valueNames[valueName], valueDef.name], }, ), ); } else { valueNames[valueName] = valueDef.name; } } return false; } } /** * Unique field definition names * * A GraphQL complex type is only valid if all its fields are uniquely named. */ function UniqueFieldDefinitionNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); const knownFieldNames = Object.create(null); return { InputObjectTypeDefinition: checkFieldUniqueness, InputObjectTypeExtension: checkFieldUniqueness, InterfaceTypeDefinition: checkFieldUniqueness, InterfaceTypeExtension: checkFieldUniqueness, ObjectTypeDefinition: checkFieldUniqueness, ObjectTypeExtension: checkFieldUniqueness, }; function checkFieldUniqueness(node) { var _node$fields; const typeName = node.name.value; if (!knownFieldNames[typeName]) { knownFieldNames[typeName] = Object.create(null); } // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; const fieldNames = knownFieldNames[typeName]; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; if (hasField(existingTypeMap[typeName], fieldName)) { context.reportError( new GraphQLError( `Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: fieldDef.name, }, ), ); } else if (fieldNames[fieldName]) { context.reportError( new GraphQLError( `Field "${typeName}.${fieldName}" can only be defined once.`, { nodes: [fieldNames[fieldName], fieldDef.name], }, ), ); } else { fieldNames[fieldName] = fieldDef.name; } } return false; } } function hasField(type, fieldName) { if (isObjectType(type) || isInterfaceType(type) || isInputObjectType(type)) { return type.getFields()[fieldName] != null; } return false; } /** * Unique fragment names * * A GraphQL document is only valid if all defined fragments have unique names. * * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness */ function UniqueFragmentNamesRule(context) { const knownFragmentNames = Object.create(null); return { OperationDefinition: () => false, FragmentDefinition(node) { const fragmentName = node.name.value; if (knownFragmentNames[fragmentName]) { context.reportError( new GraphQLError( `There can be only one fragment named "${fragmentName}".`, { nodes: [knownFragmentNames[fragmentName], node.name], }, ), ); } else { knownFragmentNames[fragmentName] = node.name; } return false; }, }; } /** * Unique input field names * * A GraphQL input object value is only valid if all supplied fields are * uniquely named. * * See https://spec.graphql.org/draft/#sec-Input-Object-Field-Uniqueness */ function UniqueInputFieldNamesRule(context) { const knownNameStack = []; let knownNames = Object.create(null); return { ObjectValue: { enter() { knownNameStack.push(knownNames); knownNames = Object.create(null); }, leave() { const prevKnownNames = knownNameStack.pop(); prevKnownNames || invariant$1(false); knownNames = prevKnownNames; }, }, ObjectField(node) { const fieldName = node.name.value; if (knownNames[fieldName]) { context.reportError( new GraphQLError( `There can be only one input field named "${fieldName}".`, { nodes: [knownNames[fieldName], node.name], }, ), ); } else { knownNames[fieldName] = node.name; } }, }; } /** * Unique operation names * * A GraphQL document is only valid if all defined operations have unique names. * * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness */ function UniqueOperationNamesRule(context) { const knownOperationNames = Object.create(null); return { OperationDefinition(node) { const operationName = node.name; if (operationName) { if (knownOperationNames[operationName.value]) { context.reportError( new GraphQLError( `There can be only one operation named "${operationName.value}".`, { nodes: [ knownOperationNames[operationName.value], operationName, ], }, ), ); } else { knownOperationNames[operationName.value] = operationName; } } return false; }, FragmentDefinition: () => false, }; } /** * Unique operation types * * A GraphQL document is only valid if it has only one type per operation. */ function UniqueOperationTypesRule(context) { const schema = context.getSchema(); const definedOperationTypes = Object.create(null); const existingOperationTypes = schema ? { query: schema.getQueryType(), mutation: schema.getMutationType(), subscription: schema.getSubscriptionType(), } : {}; return { SchemaDefinition: checkOperationTypes, SchemaExtension: checkOperationTypes, }; function checkOperationTypes(node) { var _node$operationTypes; // See: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { const operation = operationType.operation; const alreadyDefinedOperationType = definedOperationTypes[operation]; if (existingOperationTypes[operation]) { context.reportError( new GraphQLError( `Type for ${operation} already defined in the schema. It cannot be redefined.`, { nodes: operationType, }, ), ); } else if (alreadyDefinedOperationType) { context.reportError( new GraphQLError( `There can be only one ${operation} type in schema.`, { nodes: [alreadyDefinedOperationType, operationType], }, ), ); } else { definedOperationTypes[operation] = operationType; } } return false; } } /** * Unique type names * * A GraphQL document is only valid if all defined types have unique names. */ function UniqueTypeNamesRule(context) { const knownTypeNames = Object.create(null); const schema = context.getSchema(); return { ScalarTypeDefinition: checkTypeName, ObjectTypeDefinition: checkTypeName, InterfaceTypeDefinition: checkTypeName, UnionTypeDefinition: checkTypeName, EnumTypeDefinition: checkTypeName, InputObjectTypeDefinition: checkTypeName, }; function checkTypeName(node) { const typeName = node.name.value; if (schema !== null && schema !== void 0 && schema.getType(typeName)) { context.reportError( new GraphQLError( `Type "${typeName}" already exists in the schema. It cannot also be defined in this type definition.`, { nodes: node.name, }, ), ); return; } if (knownTypeNames[typeName]) { context.reportError( new GraphQLError(`There can be only one type named "${typeName}".`, { nodes: [knownTypeNames[typeName], node.name], }), ); } else { knownTypeNames[typeName] = node.name; } return false; } } /** * Unique variable names * * A GraphQL operation is only valid if all its variables are uniquely named. */ function UniqueVariableNamesRule(context) { return { OperationDefinition(operationNode) { var _operationNode$variab; // See: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const variableDefinitions = (_operationNode$variab = operationNode.variableDefinitions) !== null && _operationNode$variab !== void 0 ? _operationNode$variab : []; const seenVariableDefinitions = groupBy( variableDefinitions, (node) => node.variable.name.value, ); for (const [variableName, variableNodes] of seenVariableDefinitions) { if (variableNodes.length > 1) { context.reportError( new GraphQLError( `There can be only one variable named "$${variableName}".`, { nodes: variableNodes.map((node) => node.variable.name), }, ), ); } } }, }; } /** * Value literals of correct type * * A GraphQL document is only valid if all value literals are of the type * expected at their position. * * See https://spec.graphql.org/draft/#sec-Values-of-Correct-Type */ function ValuesOfCorrectTypeRule(context) { return { ListValue(node) { // Note: TypeInfo will traverse into a list's item type, so look to the // parent input type to check if it is a list. const type = getNullableType(context.getParentInputType()); if (!isListType(type)) { isValidValueNode(context, node); return false; // Don't traverse further. } }, ObjectValue(node) { const type = getNamedType(context.getInputType()); if (!isInputObjectType(type)) { isValidValueNode(context, node); return false; // Don't traverse further. } // Ensure every required field exists. const fieldNodeMap = keyMap(node.fields, (field) => field.name.value); for (const fieldDef of Object.values(type.getFields())) { const fieldNode = fieldNodeMap[fieldDef.name]; if (!fieldNode && isRequiredInputField(fieldDef)) { const typeStr = inspect$1(fieldDef.type); context.reportError( new GraphQLError( `Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`, { nodes: node, }, ), ); } } }, ObjectField(node) { const parentType = getNamedType(context.getParentInputType()); const fieldType = context.getInputType(); if (!fieldType && isInputObjectType(parentType)) { const suggestions = suggestionList( node.name.value, Object.keys(parentType.getFields()), ); context.reportError( new GraphQLError( `Field "${node.name.value}" is not defined by type "${parentType.name}".` + didYouMean(suggestions), { nodes: node, }, ), ); } }, NullValue(node) { const type = context.getInputType(); if (isNonNullType(type)) { context.reportError( new GraphQLError( `Expected value of type "${inspect$1(type)}", found ${print(node)}.`, { nodes: node, }, ), ); } }, EnumValue: (node) => isValidValueNode(context, node), IntValue: (node) => isValidValueNode(context, node), FloatValue: (node) => isValidValueNode(context, node), StringValue: (node) => isValidValueNode(context, node), BooleanValue: (node) => isValidValueNode(context, node), }; } /** * Any value literal may be a valid representation of a Scalar, depending on * that scalar type. */ function isValidValueNode(context, node) { // Report any error at the full type expected by the location. const locationType = context.getInputType(); if (!locationType) { return; } const type = getNamedType(locationType); if (!isLeafType(type)) { const typeStr = inspect$1(locationType); context.reportError( new GraphQLError( `Expected value of type "${typeStr}", found ${print(node)}.`, { nodes: node, }, ), ); return; } // Scalars and Enums determine if a literal value is valid via parseLiteral(), // which may throw or return an invalid value to indicate failure. try { const parseResult = type.parseLiteral( node, undefined, /* variables */ ); if (parseResult === undefined) { const typeStr = inspect$1(locationType); context.reportError( new GraphQLError( `Expected value of type "${typeStr}", found ${print(node)}.`, { nodes: node, }, ), ); } } catch (error) { const typeStr = inspect$1(locationType); if (error instanceof GraphQLError) { context.reportError(error); } else { context.reportError( new GraphQLError( `Expected value of type "${typeStr}", found ${print(node)}; ` + error.message, { nodes: node, originalError: error, }, ), ); } } } /** * Variables are input types * * A GraphQL operation is only valid if all the variables it defines are of * input types (scalar, enum, or input object). * * See https://spec.graphql.org/draft/#sec-Variables-Are-Input-Types */ function VariablesAreInputTypesRule(context) { return { VariableDefinition(node) { const type = typeFromAST(context.getSchema(), node.type); if (type !== undefined && !isInputType(type)) { const variableName = node.variable.name.value; const typeName = print(node.type); context.reportError( new GraphQLError( `Variable "$${variableName}" cannot be non-input type "${typeName}".`, { nodes: node.type, }, ), ); } }, }; } /** * Variables in allowed position * * Variable usages must be compatible with the arguments they are passed to. * * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed */ function VariablesInAllowedPositionRule(context) { let varDefMap = Object.create(null); return { OperationDefinition: { enter() { varDefMap = Object.create(null); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); for (const { node, type, defaultValue } of usages) { const varName = node.name.value; const varDef = varDefMap[varName]; if (varDef && type) { // A var type is allowed if it is the same or more strict (e.g. is // a subtype of) than the expected type. It can be more strict if // the variable type is non-null when the expected type is nullable. // If both are list types, the variable item type can be more strict // than the expected item type (contravariant). const schema = context.getSchema(); const varType = typeFromAST(schema, varDef.type); if ( varType && !allowedVariableUsage( schema, varType, varDef.defaultValue, type, defaultValue, ) ) { const varTypeStr = inspect$1(varType); const typeStr = inspect$1(type); context.reportError( new GraphQLError( `Variable "$${varName}" of type "${varTypeStr}" used in position expecting type "${typeStr}".`, { nodes: [varDef, node], }, ), ); } } } }, }, VariableDefinition(node) { varDefMap[node.variable.name.value] = node; }, }; } /** * Returns true if the variable is allowed in the location it was found, * which includes considering if default values exist for either the variable * or the location at which it is located. */ function allowedVariableUsage( schema, varType, varDefaultValue, locationType, locationDefaultValue, ) { if (isNonNullType(locationType) && !isNonNullType(varType)) { const hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== Kind.NULL; const hasLocationDefaultValue = locationDefaultValue !== undefined; if (!hasNonNullVariableDefaultValue && !hasLocationDefaultValue) { return false; } const nullableLocationType = locationType.ofType; return isTypeSubTypeOf(schema, varType, nullableLocationType); } return isTypeSubTypeOf(schema, varType, locationType); } // Spec Section: "Executable Definitions" /** * This set includes all validation rules defined by the GraphQL spec. * * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ const specifiedRules = Object.freeze([ ExecutableDefinitionsRule, UniqueOperationNamesRule, LoneAnonymousOperationRule, SingleFieldSubscriptionsRule, KnownTypeNamesRule, FragmentsOnCompositeTypesRule, VariablesAreInputTypesRule, ScalarLeafsRule, FieldsOnCorrectTypeRule, UniqueFragmentNamesRule, KnownFragmentNamesRule, NoUnusedFragmentsRule, PossibleFragmentSpreadsRule, NoFragmentCyclesRule, UniqueVariableNamesRule, NoUndefinedVariablesRule, NoUnusedVariablesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, KnownArgumentNamesRule, UniqueArgumentNamesRule, ValuesOfCorrectTypeRule, ProvidedRequiredArgumentsRule, VariablesInAllowedPositionRule, OverlappingFieldsCanBeMergedRule, UniqueInputFieldNamesRule, ]); /** * @internal */ const specifiedSDLRules = Object.freeze([ LoneSchemaDefinitionRule, UniqueOperationTypesRule, UniqueTypeNamesRule, UniqueEnumValueNamesRule, UniqueFieldDefinitionNamesRule, UniqueArgumentDefinitionNamesRule, UniqueDirectiveNamesRule, KnownTypeNamesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, PossibleTypeExtensionsRule, KnownArgumentNamesOnDirectivesRule, UniqueArgumentNamesRule, UniqueInputFieldNamesRule, ProvidedRequiredArgumentsOnDirectivesRule, ]); /** * An instance of this class is passed as the "this" context to all validators, * allowing access to commonly useful contextual information from within a * validation rule. */ class ASTValidationContext { constructor(ast, onError) { this._ast = ast; this._fragments = undefined; this._fragmentSpreads = new Map(); this._recursivelyReferencedFragments = new Map(); this._onError = onError; } get [Symbol.toStringTag]() { return 'ASTValidationContext'; } reportError(error) { this._onError(error); } getDocument() { return this._ast; } getFragment(name) { let fragments; if (this._fragments) { fragments = this._fragments; } else { fragments = Object.create(null); for (const defNode of this.getDocument().definitions) { if (defNode.kind === Kind.FRAGMENT_DEFINITION) { fragments[defNode.name.value] = defNode; } } this._fragments = fragments; } return fragments[name]; } getFragmentSpreads(node) { let spreads = this._fragmentSpreads.get(node); if (!spreads) { spreads = []; const setsToVisit = [node]; let set; while ((set = setsToVisit.pop())) { for (const selection of set.selections) { if (selection.kind === Kind.FRAGMENT_SPREAD) { spreads.push(selection); } else if (selection.selectionSet) { setsToVisit.push(selection.selectionSet); } } } this._fragmentSpreads.set(node, spreads); } return spreads; } getRecursivelyReferencedFragments(operation) { let fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; const collectedNames = Object.create(null); const nodesToVisit = [operation.selectionSet]; let node; while ((node = nodesToVisit.pop())) { for (const spread of this.getFragmentSpreads(node)) { const fragName = spread.name.value; if (collectedNames[fragName] !== true) { collectedNames[fragName] = true; const fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); nodesToVisit.push(fragment.selectionSet); } } } } this._recursivelyReferencedFragments.set(operation, fragments); } return fragments; } } class SDLValidationContext extends ASTValidationContext { constructor(ast, schema, onError) { super(ast, onError); this._schema = schema; } get [Symbol.toStringTag]() { return 'SDLValidationContext'; } getSchema() { return this._schema; } } class ValidationContext extends ASTValidationContext { constructor(schema, ast, typeInfo, onError) { super(ast, onError); this._schema = schema; this._typeInfo = typeInfo; this._variableUsages = new Map(); this._recursiveVariableUsages = new Map(); } get [Symbol.toStringTag]() { return 'ValidationContext'; } getSchema() { return this._schema; } getVariableUsages(node) { let usages = this._variableUsages.get(node); if (!usages) { const newUsages = []; const typeInfo = new TypeInfo(this._schema); visit( node, visitWithTypeInfo(typeInfo, { VariableDefinition: () => false, Variable(variable) { newUsages.push({ node: variable, type: typeInfo.getInputType(), defaultValue: typeInfo.getDefaultValue(), }); }, }), ); usages = newUsages; this._variableUsages.set(node, usages); } return usages; } getRecursiveVariableUsages(operation) { let usages = this._recursiveVariableUsages.get(operation); if (!usages) { usages = this.getVariableUsages(operation); for (const frag of this.getRecursivelyReferencedFragments(operation)) { usages = usages.concat(this.getVariableUsages(frag)); } this._recursiveVariableUsages.set(operation, usages); } return usages; } getType() { return this._typeInfo.getType(); } getParentType() { return this._typeInfo.getParentType(); } getInputType() { return this._typeInfo.getInputType(); } getParentInputType() { return this._typeInfo.getParentInputType(); } getFieldDef() { return this._typeInfo.getFieldDef(); } getDirective() { return this._typeInfo.getDirective(); } getArgument() { return this._typeInfo.getArgument(); } getEnumValue() { return this._typeInfo.getEnumValue(); } } /** * Implements the "Validation" section of the spec. * * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the document is valid. * * A list of specific validation rules may be provided. If not provided, the * default list of rules defined by the GraphQL specification will be used. * * Each validation rules is a function which returns a visitor * (see the language/visitor API). Visitor methods are expected to return * GraphQLErrors, or Arrays of GraphQLErrors when invalid. * * Validate will stop validation after a `maxErrors` limit has been reached. * Attackers can send pathologically invalid queries to induce a DoS attack, * so by default `maxErrors` set to 100 errors. * * Optionally a custom TypeInfo instance may be provided. If not provided, one * will be created from the provided schema. */ function validate( schema, documentAST, rules = specifiedRules, options, /** @deprecated will be removed in 17.0.0 */ typeInfo = new TypeInfo(schema), ) { var _options$maxErrors; const maxErrors = (_options$maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors) !== null && _options$maxErrors !== void 0 ? _options$maxErrors : 100; documentAST || devAssert(false, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. assertValidSchema(schema); const abortObj = Object.freeze({}); const errors = []; const context = new ValidationContext( schema, documentAST, typeInfo, (error) => { if (errors.length >= maxErrors) { errors.push( new GraphQLError( 'Too many validation errors, error limit reached. Validation aborted.', ), ); // eslint-disable-next-line @typescript-eslint/no-throw-literal throw abortObj; } errors.push(error); }, ); // This uses a specialized visitor which runs multiple visitors in parallel, // while maintaining the visitor skip and break API. const visitor = visitInParallel(rules.map((rule) => rule(context))); // Visit the whole document with each instance of all provided rules. try { visit(documentAST, visitWithTypeInfo(typeInfo, visitor)); } catch (e) { if (e !== abortObj) { throw e; } } return errors; } /** * @internal */ function validateSDL( documentAST, schemaToExtend, rules = specifiedSDLRules, ) { const errors = []; const context = new SDLValidationContext( documentAST, schemaToExtend, (error) => { errors.push(error); }, ); const visitors = rules.map((rule) => rule(context)); visit(documentAST, visitInParallel(visitors)); return errors; } /** * Utility function which asserts a SDL document is valid by throwing an error * if it is invalid. * * @internal */ function assertValidSDL(documentAST) { const errors = validateSDL(documentAST); if (errors.length !== 0) { throw new Error(errors.map((error) => error.message).join('\n\n')); } } /** * Memoizes the provided three-argument function. */ function memoize3(fn) { let cache0; return function memoized(a1, a2, a3) { if (cache0 === undefined) { cache0 = new WeakMap(); } let cache1 = cache0.get(a1); if (cache1 === undefined) { cache1 = new WeakMap(); cache0.set(a1, cache1); } let cache2 = cache1.get(a2); if (cache2 === undefined) { cache2 = new WeakMap(); cache1.set(a2, cache2); } let fnResult = cache2.get(a3); if (fnResult === undefined) { fnResult = fn(a1, a2, a3); cache2.set(a3, fnResult); } return fnResult; }; } /** * This function transforms a JS object `ObjMap>` into * a `Promise>` * * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ function promiseForObject(object) { return Promise.all(Object.values(object)).then((resolvedValues) => { const resolvedObject = Object.create(null); for (const [i, key] of Object.keys(object).entries()) { resolvedObject[key] = resolvedValues[i]; } return resolvedObject; }); } /** * Similar to Array.prototype.reduce(), however the reducing callback may return * a Promise, in which case reduction will continue after each promise resolves. * * If the callback does not return a Promise, then this function will also not * return a Promise. */ function promiseReduce(values, callbackFn, initialValue) { let accumulator = initialValue; for (const value of values) { accumulator = isPromise(accumulator) ? accumulator.then((resolved) => callbackFn(resolved, value)) : callbackFn(accumulator, value); } return accumulator; } /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. */ function toError(thrownValue) { return thrownValue instanceof Error ? thrownValue : new NonErrorThrown(thrownValue); } class NonErrorThrown extends Error { constructor(thrownValue) { super('Unexpected error value: ' + inspect$1(thrownValue)); this.name = 'NonErrorThrown'; this.thrownValue = thrownValue; } } /** * Given an arbitrary value, presumably thrown while attempting to execute a * GraphQL operation, produce a new GraphQLError aware of the location in the * document responsible for the original Error. */ function locatedError(rawOriginalError, nodes, path) { var _nodes; const originalError = toError(rawOriginalError); // Note: this uses a brand-check to support GraphQL errors originating from other contexts. if (isLocatedGraphQLError(originalError)) { return originalError; } return new GraphQLError(originalError.message, { nodes: (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, source: originalError.source, positions: originalError.positions, path, originalError, }); } function isLocatedGraphQLError(error) { return Array.isArray(error.path); } /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ const collectSubfields = memoize3((exeContext, returnType, fieldNodes) => collectSubfields$1( exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes, ), ); /** * Terminology * * "Definitions" are the generic name for top-level statements in the document. * Examples of this include: * 1) Operations (such as a query) * 2) Fragments * * "Operations" are a generic name for requests in the document. * Examples of this include: * 1) query, * 2) mutation * * "Selections" are the definitions that can appear legally and at * single level of the query. These include: * 1) field references e.g `a` * 2) fragment "spreads" e.g. `...c` * 3) inline fragment "spreads" e.g. `...on Type { a }` */ /** * Data that must be available at all points during query execution. * * Namely, schema of the type system that is currently executing, * and the fragments defined in the query document */ /** * Implements the "Executing requests" section of the GraphQL specification. * * Returns either a synchronous ExecutionResult (if all encountered resolvers * are synchronous), or a Promise of an ExecutionResult that will eventually be * resolved and never rejected. * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. */ function execute$1(args) { // Temporary for v15 to v16 migration. Remove in v17 arguments.length < 2 || devAssert( false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.', ); const { schema, document, variableValues, rootValue } = args; // If arguments are missing or incorrect, throw an error. assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. if (!('schema' in exeContext)) { return { errors: exeContext, }; } // Return a Promise that will eventually resolve to the data described by // The "Response" section of the GraphQL specification. // // If errors are encountered while executing a GraphQL field, only that // field and its descendants will be omitted, and sibling fields will still // be executed. An execution which encounters errors will still result in a // resolved Promise. // // Errors from sub-fields of a NonNull type may propagate to the top level, // at which point we still log the error and null the parent field, which // in this case is the entire response. try { const { operation } = exeContext; const result = executeOperation(exeContext, operation, rootValue); if (isPromise(result)) { return result.then( (data) => buildResponse(data, exeContext.errors), (error) => { exeContext.errors.push(error); return buildResponse(null, exeContext.errors); }, ); } return buildResponse(result, exeContext.errors); } catch (error) { exeContext.errors.push(error); return buildResponse(null, exeContext.errors); } } /** * Given a completed execution context and data, build the `{ errors, data }` * response defined by the "Response" section of the GraphQL specification. */ function buildResponse(data, errors) { return errors.length === 0 ? { data, } : { errors, data, }; } /** * Essential assertions before executing to provide developer feedback for * improper use of the GraphQL library. * * @internal */ function assertValidExecutionArguments( schema, document, rawVariableValues, ) { document || devAssert(false, 'Must provide document.'); // If the schema used for execution is invalid, throw an error. assertValidSchema(schema); // Variables, if provided, must be an object. rawVariableValues == null || isObjectLike(rawVariableValues) || devAssert( false, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.', ); } /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * * @internal */ function buildExecutionContext(args) { var _definition$name, _operation$variableDe; const { schema, document, rootValue, contextValue, variableValues: rawVariableValues, operationName, fieldResolver, typeResolver, subscribeFieldResolver, } = args; let operation; const fragments = Object.create(null); for (const definition of document.definitions) { switch (definition.kind) { case Kind.OPERATION_DEFINITION: if (operationName == null) { if (operation !== undefined) { return [ new GraphQLError( 'Must provide operation name if query contains multiple operations.', ), ]; } operation = definition; } else if ( ((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName ) { operation = definition; } break; case Kind.FRAGMENT_DEFINITION: fragments[definition.name.value] = definition; break; } } if (!operation) { if (operationName != null) { return [new GraphQLError(`Unknown operation named "${operationName}".`)]; } return [new GraphQLError('Must provide an operation.')]; } // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; const coercedVariableValues = getVariableValues( schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, { maxErrors: 50, }, ); if (coercedVariableValues.errors) { return coercedVariableValues.errors; } return { schema, fragments, rootValue, contextValue, operation, variableValues: coercedVariableValues.coerced, fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver, typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver !== null && subscribeFieldResolver !== void 0 ? subscribeFieldResolver : defaultFieldResolver, errors: [], }; } /** * Implements the "Executing operations" section of the spec. */ function executeOperation(exeContext, operation, rootValue) { const rootType = exeContext.schema.getRootType(operation.operation); if (rootType == null) { throw new GraphQLError( `Schema is not configured to execute ${operation.operation} operation.`, { nodes: operation, }, ); } const rootFields = collectFields( exeContext.schema, exeContext.fragments, exeContext.variableValues, rootType, operation.selectionSet, ); const path = undefined; switch (operation.operation) { case OperationTypeNode.QUERY: return executeFields(exeContext, rootType, rootValue, path, rootFields); case OperationTypeNode.MUTATION: return executeFieldsSerially( exeContext, rootType, rootValue, path, rootFields, ); case OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together return executeFields(exeContext, rootType, rootValue, path, rootFields); } } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ function executeFieldsSerially( exeContext, parentType, sourceValue, path, fields, ) { return promiseReduce( fields.entries(), (results, [responseName, fieldNodes]) => { const fieldPath = addPath(path, responseName, parentType.name); const result = executeField( exeContext, parentType, sourceValue, fieldNodes, fieldPath, ); if (result === undefined) { return results; } if (isPromise(result)) { return result.then((resolvedResult) => { results[responseName] = resolvedResult; return results; }); } results[responseName] = result; return results; }, Object.create(null), ); } /** * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ function executeFields(exeContext, parentType, sourceValue, path, fields) { const results = Object.create(null); let containsPromise = false; for (const [responseName, fieldNodes] of fields.entries()) { const fieldPath = addPath(path, responseName, parentType.name); const result = executeField( exeContext, parentType, sourceValue, fieldNodes, fieldPath, ); if (result !== undefined) { results[responseName] = result; if (isPromise(result)) { containsPromise = true; } } } // If there are no promises, we can just return the object if (!containsPromise) { return results; } // Otherwise, results is a map from field name to the result of resolving that // field, which is possibly a promise. Return a promise that will return this // same map, but with any promises replaced with the values they resolved to. return promiseForObject(results); } /** * Implements the "Executing fields" section of the spec * In particular, this function figures out the value that the field returns by * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. */ function executeField(exeContext, parentType, source, fieldNodes, path) { var _fieldDef$resolve; const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); if (!fieldDef) { return; } const returnType = fieldDef.type; const resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver; const info = buildResolveInfo( exeContext, fieldDef, fieldNodes, parentType, path, ); // Get the resolve function, regardless of if its result is normal or abrupt (error). try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. const args = getArgumentValues( fieldDef, fieldNodes[0], exeContext.variableValues, ); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. const contextValue = exeContext.contextValue; const result = resolveFn(source, args, contextValue, info); let completed; if (isPromise(result)) { completed = result.then((resolved) => completeValue(exeContext, returnType, fieldNodes, info, path, resolved), ); } else { completed = completeValue( exeContext, returnType, fieldNodes, info, path, result, ); } if (isPromise(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, (rawError) => { const error = locatedError(rawError, fieldNodes, pathToArray(path)); return handleFieldError(error, returnType, exeContext); }); } return completed; } catch (rawError) { const error = locatedError(rawError, fieldNodes, pathToArray(path)); return handleFieldError(error, returnType, exeContext); } } /** * @internal */ function buildResolveInfo( exeContext, fieldDef, fieldNodes, parentType, path, ) { // The resolve function's optional fourth argument is a collection of // information about the current execution state. return { fieldName: fieldDef.name, fieldNodes, returnType: fieldDef.type, parentType, path, schema: exeContext.schema, fragments: exeContext.fragments, rootValue: exeContext.rootValue, operation: exeContext.operation, variableValues: exeContext.variableValues, }; } function handleFieldError(error, returnType, exeContext) { // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if (isNonNullType(returnType)) { throw error; } // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. exeContext.errors.push(error); return null; } /** * Implements the instructions for completeValue as defined in the * "Value Completion" section of the spec. * * If the field type is Non-Null, then this recursively completes the value * for the inner type. It throws a field error if that completion returns null, * as per the "Nullability" section of the spec. * * If the field type is a List, then this recursively completes the value * for the inner type on each item in the list. * * If the field type is a Scalar or Enum, ensures the completed value is a legal * value of the type by calling the `serialize` method of GraphQL type * definition. * * If the field is an abstract type, determine the runtime type of the value * and then complete based on that type * * Otherwise, the field type expects a sub-selection set, and will complete the * value by executing all sub-selections. */ function completeValue(exeContext, returnType, fieldNodes, info, path, result) { // If result is an Error, throw a located error. if (result instanceof Error) { throw result; } // If field type is NonNull, complete for inner type, and throw field error // if result is null. if (isNonNullType(returnType)) { const completed = completeValue( exeContext, returnType.ofType, fieldNodes, info, path, result, ); if (completed === null) { throw new Error( `Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`, ); } return completed; } // If result value is null or undefined then return null. if (result == null) { return null; } // If field type is List, complete each item in the list with the inner type if (isListType(returnType)) { return completeListValue( exeContext, returnType, fieldNodes, info, path, result, ); } // If field type is a leaf type, Scalar or Enum, serialize to a valid value, // returning null if serialization is not possible. if (isLeafType(returnType)) { return completeLeafValue(returnType, result); } // If field type is an abstract type, Interface or Union, determine the // runtime Object type and complete for that type. if (isAbstractType(returnType)) { return completeAbstractValue( exeContext, returnType, fieldNodes, info, path, result, ); } // If field type is Object, execute and complete all sub-selections. if (isObjectType(returnType)) { return completeObjectValue( exeContext, returnType, fieldNodes, info, path, result, ); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. invariant$1( false, 'Cannot complete value of unexpected output type: ' + inspect$1(returnType), ); } /** * Complete a list value by completing each item in the list with the * inner type */ function completeListValue( exeContext, returnType, fieldNodes, info, path, result, ) { if (!isIterableObject(result)) { throw new GraphQLError( `Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`, ); } // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. const itemType = returnType.ofType; let containsPromise = false; const completedResults = Array.from(result, (item, index) => { // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = addPath(path, index, undefined); try { let completedItem; if (isPromise(item)) { completedItem = item.then((resolved) => completeValue( exeContext, itemType, fieldNodes, info, itemPath, resolved, ), ); } else { completedItem = completeValue( exeContext, itemType, fieldNodes, info, itemPath, item, ); } if (isPromise(completedItem)) { containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completedItem.then(undefined, (rawError) => { const error = locatedError( rawError, fieldNodes, pathToArray(itemPath), ); return handleFieldError(error, itemType, exeContext); }); } return completedItem; } catch (rawError) { const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); return handleFieldError(error, itemType, exeContext); } }); return containsPromise ? Promise.all(completedResults) : completedResults; } /** * Complete a Scalar or Enum by serializing to a valid value, returning * null if serialization is not possible. */ function completeLeafValue(returnType, result) { const serializedResult = returnType.serialize(result); if (serializedResult == null) { throw new Error( `Expected \`${inspect$1(returnType)}.serialize(${inspect$1(result)})\` to ` + `return non-nullable value, returned: ${inspect$1(serializedResult)}`, ); } return serializedResult; } /** * Complete a value of an abstract type by determining the runtime object type * of that value, then complete the value for that type. */ function completeAbstractValue( exeContext, returnType, fieldNodes, info, path, result, ) { var _returnType$resolveTy; const resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver; const contextValue = exeContext.contextValue; const runtimeType = resolveTypeFn(result, contextValue, info, returnType); if (isPromise(runtimeType)) { return runtimeType.then((resolvedRuntimeType) => completeObjectValue( exeContext, ensureValidRuntimeType( resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result, ), fieldNodes, info, path, result, ), ); } return completeObjectValue( exeContext, ensureValidRuntimeType( runtimeType, exeContext, returnType, fieldNodes, info, result, ), fieldNodes, info, path, result, ); } function ensureValidRuntimeType( runtimeTypeName, exeContext, returnType, fieldNodes, info, result, ) { if (runtimeTypeName == null) { throw new GraphQLError( `Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, fieldNodes, ); } // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` // TODO: remove in 17.0.0 release if (isObjectType(runtimeTypeName)) { throw new GraphQLError( 'Support for returning GraphQLObjectType from resolveType was removed in graphql-js@16.0.0 please return type name instead.', ); } if (typeof runtimeTypeName !== 'string') { throw new GraphQLError( `Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}" with ` + `value ${inspect$1(result)}, received "${inspect$1(runtimeTypeName)}".`, ); } const runtimeType = exeContext.schema.getType(runtimeTypeName); if (runtimeType == null) { throw new GraphQLError( `Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, { nodes: fieldNodes, }, ); } if (!isObjectType(runtimeType)) { throw new GraphQLError( `Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, { nodes: fieldNodes, }, ); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw new GraphQLError( `Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, { nodes: fieldNodes, }, ); } return runtimeType; } /** * Complete an Object value by executing all sub-selections. */ function completeObjectValue( exeContext, returnType, fieldNodes, info, path, result, ) { // Collect sub-fields to execute to complete this value. const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. if (returnType.isTypeOf) { const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info); if (isPromise(isTypeOf)) { return isTypeOf.then((resolvedIsTypeOf) => { if (!resolvedIsTypeOf) { throw invalidReturnTypeError(returnType, result, fieldNodes); } return executeFields( exeContext, returnType, result, path, subFieldNodes, ); }); } if (!isTypeOf) { throw invalidReturnTypeError(returnType, result, fieldNodes); } } return executeFields(exeContext, returnType, result, path, subFieldNodes); } function invalidReturnTypeError(returnType, result, fieldNodes) { return new GraphQLError( `Expected value of type "${returnType.name}" but got: ${inspect$1(result)}.`, { nodes: fieldNodes, }, ); } /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: * * First, See if the provided value has a `__typename` field defined, if so, use * that value as name of the resolved type. * * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ const defaultTypeResolver = function ( value, contextValue, info, abstractType, ) { // First, look for `__typename`. if (isObjectLike(value) && typeof value.__typename === 'string') { return value.__typename; } // Otherwise, test each possible type. const possibleTypes = info.schema.getPossibleTypes(abstractType); const promisedIsTypeOfResults = []; for (let i = 0; i < possibleTypes.length; i++) { const type = possibleTypes[i]; if (type.isTypeOf) { const isTypeOfResult = type.isTypeOf(value, contextValue, info); if (isPromise(isTypeOfResult)) { promisedIsTypeOfResults[i] = isTypeOfResult; } else if (isTypeOfResult) { return type.name; } } } if (promisedIsTypeOfResults.length) { return Promise.all(promisedIsTypeOfResults).then((isTypeOfResults) => { for (let i = 0; i < isTypeOfResults.length; i++) { if (isTypeOfResults[i]) { return possibleTypes[i].name; } } }); } }; /** * If a resolve function is not given, then a default resolve behavior is used * which takes the property of the source object of the same name as the field * and returns it as the result, or if it's a function, returns the result * of calling that function while passing along args and context value. */ const defaultFieldResolver = function ( source, args, contextValue, info, ) { // ensure source is a value for which property access is acceptable. if (isObjectLike(source) || typeof source === 'function') { const property = source[info.fieldName]; if (typeof property === 'function') { return source[info.fieldName](args, contextValue, info); } return property; } }; /** * This method looks up the field on the given type definition. * It has special casing for the three introspection fields, * __schema, __type and __typename. __typename is special because * it can always be queried as a field, even in situations where no * other fields are allowed, like on a Union. __schema and __type * could get automatically added to the query type, but that would * require mutating type definitions, which would cause issues. * * @internal */ function getFieldDef(schema, parentType, fieldNode) { const fieldName = fieldNode.name.value; if ( fieldName === SchemaMetaFieldDef.name && schema.getQueryType() === parentType ) { return SchemaMetaFieldDef; } else if ( fieldName === TypeMetaFieldDef.name && schema.getQueryType() === parentType ) { return TypeMetaFieldDef; } else if (fieldName === TypeNameMetaFieldDef.name) { return TypeNameMetaFieldDef; } return parentType.getFields()[fieldName]; } /** * Returns true if the provided object implements the AsyncIterator protocol via * implementing a `Symbol.asyncIterator` method. */ function isAsyncIterable$2(maybeAsyncIterable) { return ( typeof (maybeAsyncIterable === null || maybeAsyncIterable === void 0 ? void 0 : maybeAsyncIterable[Symbol.asyncIterator]) === 'function' ); } /** * Given an AsyncIterable and a callback function, return an AsyncIterator * which produces values mapped via calling the callback function. */ function mapAsyncIterator$1(iterable, callback) { const iterator = iterable[Symbol.asyncIterator](); async function mapResult(result) { if (result.done) { return result; } try { return { value: await callback(result.value), done: false, }; } catch (error) { /* c8 ignore start */ // FIXME: add test case if (typeof iterator.return === 'function') { try { await iterator.return(); } catch (_e) { /* ignore error */ } } throw error; /* c8 ignore stop */ } } return { async next() { return mapResult(await iterator.next()); }, async return() { // If iterator.return() does not exist, then type R must be undefined. return typeof iterator.return === 'function' ? mapResult(await iterator.return()) : { value: undefined, done: true, }; }, async throw(error) { if (typeof iterator.throw === 'function') { return mapResult(await iterator.throw(error)); } throw error; }, [Symbol.asyncIterator]() { return this; }, }; } /** * Implements the "Subscribe" algorithm described in the GraphQL specification. * * Returns a Promise which resolves to either an AsyncIterator (if successful) * or an ExecutionResult (error). The promise will be rejected if the schema or * other arguments to this function are invalid, or if the resolved event stream * is not an async iterable. * * If the client-provided arguments to this function do not result in a * compliant subscription, a GraphQL Response (ExecutionResult) with * descriptive errors and no data will be returned. * * If the source stream could not be created due to faulty subscription * resolver logic or underlying systems, the promise will resolve to a single * ExecutionResult containing `errors` and no `data`. * * If the operation succeeded, the promise resolves to an AsyncIterator, which * yields a stream of ExecutionResults representing the response stream. * * Accepts either an object with named arguments, or individual arguments. */ async function subscribe(args) { // Temporary for v15 to v16 migration. Remove in v17 arguments.length < 2 || devAssert( false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.', ); const resultOrStream = await createSourceEventStream(args); if (!isAsyncIterable$2(resultOrStream)) { return resultOrStream; } // For each payload yielded from a subscription, map it over the normal // GraphQL `execute` function, with `payload` as the rootValue. // This implements the "MapSourceToResponseEvent" algorithm described in // the GraphQL specification. The `execute` function provides the // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the // "ExecuteQuery" algorithm, for which `execute` is also used. const mapSourceToResponse = (payload) => execute$1({ ...args, rootValue: payload }); // Map every source value to a ExecutionResult value as described above. return mapAsyncIterator$1(resultOrStream, mapSourceToResponse); } function toNormalizedArgs(args) { const firstArg = args[0]; if (firstArg && 'document' in firstArg) { return firstArg; } return { schema: firstArg, // FIXME: when underlying TS bug fixed, see https://github.com/microsoft/TypeScript/issues/31613 document: args[1], rootValue: args[2], contextValue: args[3], variableValues: args[4], operationName: args[5], subscribeFieldResolver: args[6], }; } /** * Implements the "CreateSourceEventStream" algorithm described in the * GraphQL specification, resolving the subscription source event stream. * * Returns a Promise which resolves to either an AsyncIterable (if successful) * or an ExecutionResult (error). The promise will be rejected if the schema or * other arguments to this function are invalid, or if the resolved event stream * is not an async iterable. * * If the client-provided arguments to this function do not result in a * compliant subscription, a GraphQL Response (ExecutionResult) with * descriptive errors and no data will be returned. * * If the the source stream could not be created due to faulty subscription * resolver logic or underlying systems, the promise will resolve to a single * ExecutionResult containing `errors` and no `data`. * * If the operation succeeded, the promise resolves to the AsyncIterable for the * event stream returned by the resolver. * * A Source Event Stream represents a sequence of events, each of which triggers * a GraphQL execution for that event. * * This may be useful when hosting the stateful subscription service in a * different process or machine than the stateless GraphQL execution engine, * or otherwise separating these two steps. For more on this, see the * "Supporting Subscriptions at Scale" information in the GraphQL specification. */ async function createSourceEventStream(...rawArgs) { const args = toNormalizedArgs(rawArgs); const { schema, document, variableValues } = args; // If arguments are missing or incorrectly typed, this is an internal // developer mistake which should throw an early error. assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. if (!('schema' in exeContext)) { return { errors: exeContext, }; } try { const eventStream = await executeSubscription(exeContext); // Assert field returned an event stream, otherwise yield an error. if (!isAsyncIterable$2(eventStream)) { throw new Error( 'Subscription field must return Async Iterable. ' + `Received: ${inspect$1(eventStream)}.`, ); } return eventStream; } catch (error) { // If it GraphQLError, report it as an ExecutionResult, containing only errors and no data. // Otherwise treat the error as a system-class error and re-throw it. if (error instanceof GraphQLError) { return { errors: [error], }; } throw error; } } async function executeSubscription(exeContext) { const { schema, fragments, operation, variableValues, rootValue } = exeContext; const rootType = schema.getSubscriptionType(); if (rootType == null) { throw new GraphQLError( 'Schema is not configured to execute subscription operation.', { nodes: operation, }, ); } const rootFields = collectFields( schema, fragments, variableValues, rootType, operation.selectionSet, ); const [responseName, fieldNodes] = [...rootFields.entries()][0]; const fieldDef = getFieldDef(schema, rootType, fieldNodes[0]); if (!fieldDef) { const fieldName = fieldNodes[0].name.value; throw new GraphQLError( `The subscription field "${fieldName}" is not defined.`, { nodes: fieldNodes, }, ); } const path = addPath(undefined, responseName, rootType.name); const info = buildResolveInfo( exeContext, fieldDef, fieldNodes, rootType, path, ); try { var _fieldDef$subscribe; // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. const args = getArgumentValues(fieldDef, fieldNodes[0], variableValues); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. const contextValue = exeContext.contextValue; // Call the `subscribe()` resolver or the default resolver to produce an // AsyncIterable yielding raw payloads. const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; const eventStream = await resolveFn(rootValue, args, contextValue, info); if (eventStream instanceof Error) { throw eventStream; } return eventStream; } catch (error) { throw locatedError(error, fieldNodes, pathToArray(path)); } } /** * Returns an operation AST given a document AST and optionally an operation * name. If a name is not provided, an operation is only returned if only one is * provided in the document. */ function getOperationAST(documentAST, operationName) { let operation = null; for (const definition of documentAST.definitions) { if (definition.kind === Kind.OPERATION_DEFINITION) { var _definition$name; if (operationName == null) { // If no operation name was provided, only return an Operation if there // is one defined in the document. Upon encountering the second, return // null. if (operation) { return null; } operation = definition; } else if ( ((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName ) { return definition; } } } return operation; } /** * @internal */ function extendSchemaImpl(schemaConfig, documentAST, options) { var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid; // Collect the type definitions and extensions found in the document. const typeDefs = []; const typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can // have the same name. For example, a type named "skip". const directiveDefs = []; let schemaDef; // Schema extensions are collected which may add additional operation types. const schemaExtensions = []; for (const def of documentAST.definitions) { if (def.kind === Kind.SCHEMA_DEFINITION) { schemaDef = def; } else if (def.kind === Kind.SCHEMA_EXTENSION) { schemaExtensions.push(def); } else if (isTypeDefinitionNode(def)) { typeDefs.push(def); } else if (isTypeExtensionNode(def)) { const extendedTypeName = def.name.value; const existingTypeExtensions = typeExtensionsMap[extendedTypeName]; typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def]; } else if (def.kind === Kind.DIRECTIVE_DEFINITION) { directiveDefs.push(def); } } // If this document contains no new types, extensions, or directives then // return the same unmodified GraphQLSchema instance. if ( Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null ) { return schemaConfig; } const typeMap = Object.create(null); for (const existingType of schemaConfig.types) { typeMap[existingType.name] = extendNamedType(existingType); } for (const typeNode of typeDefs) { var _stdTypeMap$name; const name = typeNode.name.value; typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode); } const operationTypes = { // Get the extended root operation types. query: schemaConfig.query && replaceNamedType(schemaConfig.query), mutation: schemaConfig.mutation && replaceNamedType(schemaConfig.mutation), subscription: schemaConfig.subscription && replaceNamedType(schemaConfig.subscription), // Then, incorporate schema definition and all schema extensions. ...(schemaDef && getOperationTypes([schemaDef])), ...getOperationTypes(schemaExtensions), }; // Then produce and return a Schema config with these types. return { description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value, ...operationTypes, types: Object.values(typeMap), directives: [ ...schemaConfig.directives.map(replaceDirective), ...directiveDefs.map(buildDirective), ], extensions: Object.create(null), astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode, extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions), assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false, }; // Below are functions used for producing this schema that have closed over // this scope and have access to the schema, cache, and newly defined types. function replaceType(type) { if (isListType(type)) { // @ts-expect-error return new GraphQLList(replaceType(type.ofType)); } if (isNonNullType(type)) { // @ts-expect-error return new GraphQLNonNull(replaceType(type.ofType)); } // @ts-expect-error FIXME return replaceNamedType(type); } function replaceNamedType(type) { // Note: While this could make early assertions to get the correctly // typed values, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. return typeMap[type.name]; } function replaceDirective(directive) { const config = directive.toConfig(); return new GraphQLDirective({ ...config, args: mapValue(config.args, extendArg), }); } function extendNamedType(type) { if (isIntrospectionType(type) || isSpecifiedScalarType(type)) { // Builtin types are not extended. return type; } if (isScalarType(type)) { return extendScalarType(type); } if (isObjectType(type)) { return extendObjectType(type); } if (isInterfaceType(type)) { return extendInterfaceType(type); } if (isUnionType(type)) { return extendUnionType(type); } if (isEnumType(type)) { return extendEnumType(type); } if (isInputObjectType(type)) { return extendInputObjectType(type); } /* c8 ignore next 3 */ // Not reachable, all possible type definition nodes have been considered. invariant$1(false, 'Unexpected type: ' + inspect$1(type)); } function extendInputObjectType(type) { var _typeExtensionsMap$co; const config = type.toConfig(); const extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : []; return new GraphQLInputObjectType({ ...config, fields: () => ({ ...mapValue(config.fields, (field) => ({ ...field, type: replaceType(field.type), })), ...buildInputFieldMap(extensions), }), extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendEnumType(type) { var _typeExtensionsMap$ty; const config = type.toConfig(); const extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : []; return new GraphQLEnumType({ ...config, values: { ...config.values, ...buildEnumValueMap(extensions) }, extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendScalarType(type) { var _typeExtensionsMap$co2; const config = type.toConfig(); const extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : []; let specifiedByURL = config.specifiedByURL; for (const extensionNode of extensions) { var _getSpecifiedByURL; specifiedByURL = (_getSpecifiedByURL = getSpecifiedByURL(extensionNode)) !== null && _getSpecifiedByURL !== void 0 ? _getSpecifiedByURL : specifiedByURL; } return new GraphQLScalarType({ ...config, specifiedByURL, extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendObjectType(type) { var _typeExtensionsMap$co3; const config = type.toConfig(); const extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : []; return new GraphQLObjectType({ ...config, interfaces: () => [ ...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions), ], fields: () => ({ ...mapValue(config.fields, extendField), ...buildFieldMap(extensions), }), extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendInterfaceType(type) { var _typeExtensionsMap$co4; const config = type.toConfig(); const extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : []; return new GraphQLInterfaceType({ ...config, interfaces: () => [ ...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions), ], fields: () => ({ ...mapValue(config.fields, extendField), ...buildFieldMap(extensions), }), extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendUnionType(type) { var _typeExtensionsMap$co5; const config = type.toConfig(); const extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : []; return new GraphQLUnionType({ ...config, types: () => [ ...type.getTypes().map(replaceNamedType), ...buildUnionTypes(extensions), ], extensionASTNodes: config.extensionASTNodes.concat(extensions), }); } function extendField(field) { return { ...field, type: replaceType(field.type), args: field.args && mapValue(field.args, extendArg), }; } function extendArg(arg) { return { ...arg, type: replaceType(arg.type) }; } function getOperationTypes(nodes) { const opTypes = {}; for (const node of nodes) { var _node$operationTypes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 const operationTypesNodes = /* c8 ignore next */ (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. // @ts-expect-error opTypes[operationType.operation] = getNamedType(operationType.type); } } return opTypes; } function getNamedType(node) { var _stdTypeMap$name2; const name = node.name.value; const type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name]; if (type === undefined) { throw new Error(`Unknown type: "${name}".`); } return type; } function getWrappedType(node) { if (node.kind === Kind.LIST_TYPE) { return new GraphQLList(getWrappedType(node.type)); } if (node.kind === Kind.NON_NULL_TYPE) { return new GraphQLNonNull(getWrappedType(node.type)); } return getNamedType(node); } function buildDirective(node) { var _node$description; return new GraphQLDirective({ name: node.name.value, description: (_node$description = node.description) === null || _node$description === void 0 ? void 0 : _node$description.value, // @ts-expect-error locations: node.locations.map(({ value }) => value), isRepeatable: node.repeatable, args: buildArgumentMap(node.arguments), astNode: node, }); } function buildFieldMap(nodes) { const fieldConfigMap = Object.create(null); for (const node of nodes) { var _node$fields; // FIXME: https://github.com/graphql/graphql-js/issues/2203 const nodeFields = /* c8 ignore next */ (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; for (const field of nodeFields) { var _field$description; fieldConfigMap[field.name.value] = { // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. type: getWrappedType(field.type), description: (_field$description = field.description) === null || _field$description === void 0 ? void 0 : _field$description.value, args: buildArgumentMap(field.arguments), deprecationReason: getDeprecationReason(field), astNode: field, }; } } return fieldConfigMap; } function buildArgumentMap(args) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 const argsNodes = /* c8 ignore next */ args !== null && args !== void 0 ? args : []; const argConfigMap = Object.create(null); for (const arg of argsNodes) { var _arg$description; // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. const type = getWrappedType(arg.type); argConfigMap[arg.name.value] = { type, description: (_arg$description = arg.description) === null || _arg$description === void 0 ? void 0 : _arg$description.value, defaultValue: valueFromAST(arg.defaultValue, type), deprecationReason: getDeprecationReason(arg), astNode: arg, }; } return argConfigMap; } function buildInputFieldMap(nodes) { const inputFieldMap = Object.create(null); for (const node of nodes) { var _node$fields2; // FIXME: https://github.com/graphql/graphql-js/issues/2203 const fieldsNodes = /* c8 ignore next */ (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; for (const field of fieldsNodes) { var _field$description2; // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. const type = getWrappedType(field.type); inputFieldMap[field.name.value] = { type, description: (_field$description2 = field.description) === null || _field$description2 === void 0 ? void 0 : _field$description2.value, defaultValue: valueFromAST(field.defaultValue, type), deprecationReason: getDeprecationReason(field), astNode: field, }; } } return inputFieldMap; } function buildEnumValueMap(nodes) { const enumValueMap = Object.create(null); for (const node of nodes) { var _node$values; // FIXME: https://github.com/graphql/graphql-js/issues/2203 const valuesNodes = /* c8 ignore next */ (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; for (const value of valuesNodes) { var _value$description; enumValueMap[value.name.value] = { description: (_value$description = value.description) === null || _value$description === void 0 ? void 0 : _value$description.value, deprecationReason: getDeprecationReason(value), astNode: value, }; } } return enumValueMap; } function buildInterfaces(nodes) { // Note: While this could make assertions to get the correctly typed // values below, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. // @ts-expect-error return nodes.flatMap( // FIXME: https://github.com/graphql/graphql-js/issues/2203 (node) => { var _node$interfaces$map, _node$interfaces; return ( /* c8 ignore next */ (_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : [] ); }, ); } function buildUnionTypes(nodes) { // Note: While this could make assertions to get the correctly typed // values below, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. // @ts-expect-error return nodes.flatMap( // FIXME: https://github.com/graphql/graphql-js/issues/2203 (node) => { var _node$types$map, _node$types; return ( /* c8 ignore next */ (_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : [] ); }, ); } function buildType(astNode) { var _typeExtensionsMap$na; const name = astNode.name.value; const extensionASTNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : []; switch (astNode.kind) { case Kind.OBJECT_TYPE_DEFINITION: { var _astNode$description; const allNodes = [astNode, ...extensionASTNodes]; return new GraphQLObjectType({ name, description: (_astNode$description = astNode.description) === null || _astNode$description === void 0 ? void 0 : _astNode$description.value, interfaces: () => buildInterfaces(allNodes), fields: () => buildFieldMap(allNodes), astNode, extensionASTNodes, }); } case Kind.INTERFACE_TYPE_DEFINITION: { var _astNode$description2; const allNodes = [astNode, ...extensionASTNodes]; return new GraphQLInterfaceType({ name, description: (_astNode$description2 = astNode.description) === null || _astNode$description2 === void 0 ? void 0 : _astNode$description2.value, interfaces: () => buildInterfaces(allNodes), fields: () => buildFieldMap(allNodes), astNode, extensionASTNodes, }); } case Kind.ENUM_TYPE_DEFINITION: { var _astNode$description3; const allNodes = [astNode, ...extensionASTNodes]; return new GraphQLEnumType({ name, description: (_astNode$description3 = astNode.description) === null || _astNode$description3 === void 0 ? void 0 : _astNode$description3.value, values: buildEnumValueMap(allNodes), astNode, extensionASTNodes, }); } case Kind.UNION_TYPE_DEFINITION: { var _astNode$description4; const allNodes = [astNode, ...extensionASTNodes]; return new GraphQLUnionType({ name, description: (_astNode$description4 = astNode.description) === null || _astNode$description4 === void 0 ? void 0 : _astNode$description4.value, types: () => buildUnionTypes(allNodes), astNode, extensionASTNodes, }); } case Kind.SCALAR_TYPE_DEFINITION: { var _astNode$description5; return new GraphQLScalarType({ name, description: (_astNode$description5 = astNode.description) === null || _astNode$description5 === void 0 ? void 0 : _astNode$description5.value, specifiedByURL: getSpecifiedByURL(astNode), astNode, extensionASTNodes, }); } case Kind.INPUT_OBJECT_TYPE_DEFINITION: { var _astNode$description6; const allNodes = [astNode, ...extensionASTNodes]; return new GraphQLInputObjectType({ name, description: (_astNode$description6 = astNode.description) === null || _astNode$description6 === void 0 ? void 0 : _astNode$description6.value, fields: () => buildInputFieldMap(allNodes), astNode, extensionASTNodes, }); } } } } const stdTypeMap = keyMap( [...specifiedScalarTypes, ...introspectionTypes], (type) => type.name, ); /** * Given a field or enum value node, returns the string value for the * deprecation reason. */ function getDeprecationReason(node) { const deprecated = getDirectiveValues(GraphQLDeprecatedDirective, node); // @ts-expect-error validated by `getDirectiveValues` return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason; } /** * Given a scalar node, returns the string value for the specifiedByURL. */ function getSpecifiedByURL(node) { const specifiedBy = getDirectiveValues(GraphQLSpecifiedByDirective, node); // @ts-expect-error validated by `getDirectiveValues` return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url; } /** * This takes the ast of a schema document produced by the parse function in * src/language/parser.js. * * If no schema definition is provided, then it will look for types named Query, * Mutation and Subscription. * * Given that AST it constructs a GraphQLSchema. The resulting schema * has no resolve methods, so execution will use default resolvers. */ function buildASTSchema(documentAST, options) { (documentAST != null && documentAST.kind === Kind.DOCUMENT) || devAssert(false, 'Must provide valid Document AST.'); if ( (options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true ) { assertValidSDL(documentAST); } const emptySchemaConfig = { description: undefined, types: [], directives: [], extensions: Object.create(null), extensionASTNodes: [], assumeValid: false, }; const config = extendSchemaImpl(emptySchemaConfig, documentAST, options); if (config.astNode == null) { for (const type of config.types) { switch (type.name) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. case 'Query': // @ts-expect-error validated in `validateSchema` config.query = type; break; case 'Mutation': // @ts-expect-error validated in `validateSchema` config.mutation = type; break; case 'Subscription': // @ts-expect-error validated in `validateSchema` config.subscription = type; break; } } } const directives = [ ...config.directives, // If specified directives were not explicitly declared, add them. ...specifiedDirectives.filter((stdDirective) => config.directives.every( (directive) => directive.name !== stdDirective.name, ), ), ]; return new GraphQLSchema({ ...config, directives }); } /** * A helper function to build a GraphQLSchema directly from a source * document. */ function buildSchema(source, options) { const document = parse(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, allowLegacyFragmentVariables: options === null || options === void 0 ? void 0 : options.allowLegacyFragmentVariables, }); return buildASTSchema(document, { assumeValidSDL: options === null || options === void 0 ? void 0 : options.assumeValidSDL, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid, }); } const trackedSchemaSymbol = Symbol('TRACKED_SCHEMA'); const resolversHooksSymbol = Symbol('RESOLVERS_HOOKS'); function prepareTracedSchema(schema) { if (!schema || schema[trackedSchemaSymbol]) { return; } schema[trackedSchemaSymbol] = true; const entries = Object.values(schema.getTypeMap()); for (const type of entries) { if (!isIntrospectionType(type) && isObjectType(type)) { const fields = Object.values(type.getFields()); for (const field of fields) { let resolverFn = (field.resolve || defaultFieldResolver); field.resolve = async (root, args, context, info) => { if (context && context[resolversHooksSymbol]) { const hooks = context[resolversHooksSymbol]; const afterCalls = []; for (const hook of hooks) { const afterFn = await hook({ root, args, context, info, resolverFn, replaceResolverFn: newFn => { resolverFn = newFn; }, }); afterFn && afterCalls.push(afterFn); } try { let result = await resolverFn(root, args, context, info); for (const afterFn of afterCalls) { afterFn({ result, setResult: newResult => { result = newResult; }, }); } return result; } catch (e) { let resultErr = e; for (const afterFn of afterCalls) { afterFn({ result: resultErr, setResult: newResult => { resultErr = newResult; }, }); } throw resultErr; } } else { return resolverFn(root, args, context, info); } }; } } } } const envelopIsIntrospectionSymbol = Symbol('ENVELOP_IS_INTROSPECTION'); function isIntrospectionOperationString(operation) { return (typeof operation === 'string' ? operation : operation.body).indexOf('__schema') !== -1; } function getSubscribeArgs(args) { return args.length === 1 ? args[0] : { schema: args[0], document: args[1], rootValue: args[2], contextValue: args[3], variableValues: args[4], operationName: args[5], fieldResolver: args[6], subscribeFieldResolver: args[7], }; } /** * Utility function for making a subscribe function that handles polymorphic arguments. */ const makeSubscribe = (subscribeFn) => ((...polyArgs) => subscribeFn(getSubscribeArgs(polyArgs))); function mapAsyncIterator(source, mapper) { const iterator = source[Symbol.asyncIterator](); async function mapResult(result) { var _a; if (result.done) { return result; } try { return { value: await mapper(result.value), done: false }; } catch (error) { try { await ((_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator)); } catch (_error) { /* ignore error */ } throw error; } } const stream = { [Symbol.asyncIterator]() { return stream; }, async next() { return await mapResult(await iterator.next()); }, async return() { var _a; const promise = (_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator); return promise ? await mapResult(await promise) : { value: undefined, done: true }; }, async throw(error) { var _a; const promise = (_a = iterator.throw) === null || _a === void 0 ? void 0 : _a.call(iterator); if (promise) { return await mapResult(await promise); } // if the source has no throw method we just re-throw error // usually throw is not called anyways throw error; }, }; return stream; } function getExecuteArgs(args) { return args.length === 1 ? args[0] : { schema: args[0], document: args[1], rootValue: args[2], contextValue: args[3], variableValues: args[4], operationName: args[5], fieldResolver: args[6], typeResolver: args[7], }; } /** * Utility function for making a execute function that handles polymorphic arguments. */ const makeExecute = (executeFn) => ((...polyArgs) => executeFn(getExecuteArgs(polyArgs))); /** * Returns true if the provided object implements the AsyncIterator protocol via * implementing a `Symbol.asyncIterator` method. * * Source: https://github.com/graphql/graphql-js/blob/main/src/jsutils/isAsyncIterable.ts */ function isAsyncIterable$1(maybeAsyncIterable) { return (typeof maybeAsyncIterable === 'object' && maybeAsyncIterable != null && typeof maybeAsyncIterable[Symbol.asyncIterator] === 'function'); } /** * A utility function for handling `onExecuteDone` hook result, for simplifying the handling of AsyncIterable returned from `execute`. * * @param payload The payload send to `onExecuteDone` hook function * @param fn The handler to be executed on each result * @returns a subscription for streamed results, or undefined in case of an non-async */ function handleStreamOrSingleExecutionResult(payload, fn) { if (isAsyncIterable$1(payload.result)) { return { onNext: fn }; } fn({ args: payload.args, result: payload.result, setResult: payload.setResult, }); return undefined; } function finalAsyncIterator(source, onFinal) { const iterator = source[Symbol.asyncIterator](); let isDone = false; const stream = { [Symbol.asyncIterator]() { return stream; }, async next() { const result = await iterator.next(); if (result.done && isDone === false) { isDone = true; onFinal(); } return result; }, async return() { var _a; const promise = (_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator); if (isDone === false) { isDone = true; onFinal(); } return promise ? await promise : { done: true, value: undefined }; }, async throw(error) { var _a; const promise = (_a = iterator.throw) === null || _a === void 0 ? void 0 : _a.call(iterator); if (promise) { return await promise; } // if the source has no throw method we just re-throw error // usually throw is not called anyways throw error; }, }; return stream; } function errorAsyncIterator(source, onError) { const iterator = source[Symbol.asyncIterator](); const stream = { [Symbol.asyncIterator]() { return stream; }, async next() { try { return await iterator.next(); } catch (error) { onError(error); return { done: true, value: undefined }; } }, async return() { var _a; const promise = (_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator); return promise ? await promise : { done: true, value: undefined }; }, async throw(error) { var _a; const promise = (_a = iterator.throw) === null || _a === void 0 ? void 0 : _a.call(iterator); if (promise) { return await promise; } // if the source has no throw method we just re-throw error // usually throw is not called anyways throw error; }, }; return stream; } function createEnvelopOrchestrator(plugins) { let schema = null; let initDone = false; const onResolversHandlers = []; for (const plugin of plugins) { if (plugin.onResolverCalled) { onResolversHandlers.push(plugin.onResolverCalled); } } // Define the initial method for replacing the GraphQL schema, this is needed in order // to allow setting the schema from the onPluginInit callback. We also need to make sure // here not to call the same plugin that initiated the schema switch. const replaceSchema = (newSchema, ignorePluginIndex = -1) => { if (onResolversHandlers.length) { prepareTracedSchema(newSchema); } schema = newSchema; if (initDone) { for (const [i, plugin] of plugins.entries()) { if (i !== ignorePluginIndex) { plugin.onSchemaChange && plugin.onSchemaChange({ schema, replaceSchema: schemaToSet => { replaceSchema(schemaToSet, i); }, }); } } } }; const contextErrorHandlers = []; // Iterate all plugins and trigger onPluginInit for (const [i, plugin] of plugins.entries()) { plugin.onPluginInit && plugin.onPluginInit({ plugins, addPlugin: newPlugin => { plugins.push(newPlugin); }, setSchema: modifiedSchema => replaceSchema(modifiedSchema, i), registerContextErrorHandler: handler => contextErrorHandlers.push(handler), }); } // A set of before callbacks defined here in order to allow it to be used later const beforeCallbacks = { init: [], parse: [], validate: [], subscribe: [], execute: [], context: [], }; for (const { onContextBuilding, onExecute, onParse, onSubscribe, onValidate, onEnveloped } of plugins) { onEnveloped && beforeCallbacks.init.push(onEnveloped); onContextBuilding && beforeCallbacks.context.push(onContextBuilding); onExecute && beforeCallbacks.execute.push(onExecute); onParse && beforeCallbacks.parse.push(onParse); onSubscribe && beforeCallbacks.subscribe.push(onSubscribe); onValidate && beforeCallbacks.validate.push(onValidate); } const init = initialContext => { for (const [i, onEnveloped] of beforeCallbacks.init.entries()) { onEnveloped({ context: initialContext, extendContext: extension => { if (!initialContext) { return; } Object.assign(initialContext, extension); }, setSchema: modifiedSchema => replaceSchema(modifiedSchema, i), }); } }; const customParse = beforeCallbacks.parse.length ? initialContext => (source, parseOptions) => { let result = null; let parseFn = parse; const context = initialContext; const afterCalls = []; for (const onParse of beforeCallbacks.parse) { const afterFn = onParse({ context, extendContext: extension => { Object.assign(context, extension); }, params: { source, options: parseOptions }, parseFn, setParseFn: newFn => { parseFn = newFn; }, setParsedDocument: newDoc => { result = newDoc; }, }); afterFn && afterCalls.push(afterFn); } if (result === null) { try { result = parseFn(source, parseOptions); } catch (e) { result = e; } } for (const afterCb of afterCalls) { afterCb({ context, extendContext: extension => { Object.assign(context, extension); }, replaceParseResult: newResult => { result = newResult; }, result, }); } if (result === null) { throw new Error(`Failed to parse document.`); } if (result instanceof Error) { throw result; } return result; } : () => parse; const customValidate = beforeCallbacks.validate.length ? initialContext => (schema, documentAST, rules, typeInfo, validationOptions) => { let actualRules = rules ? [...rules] : undefined; let validateFn = validate; let result = null; const context = initialContext; const afterCalls = []; for (const onValidate of beforeCallbacks.validate) { const afterFn = onValidate({ context, extendContext: extension => { Object.assign(context, extension); }, params: { schema, documentAST, rules: actualRules, typeInfo, options: validationOptions, }, validateFn, addValidationRule: rule => { if (!actualRules) { actualRules = [...specifiedRules]; } actualRules.push(rule); }, setValidationFn: newFn => { validateFn = newFn; }, setResult: newResults => { result = newResults; }, }); afterFn && afterCalls.push(afterFn); } if (!result) { result = validateFn(schema, documentAST, actualRules, typeInfo, validationOptions); } const valid = result.length === 0; for (const afterCb of afterCalls) { afterCb({ valid, result, context, extendContext: extension => { Object.assign(context, extension); }, setResult: newResult => { result = newResult; }, }); } return result; } : () => validate; const customContextFactory = beforeCallbacks.context .length ? initialContext => async (orchestratorCtx) => { const afterCalls = []; // In order to have access to the "last working" context object we keep this outside of the try block: let context = orchestratorCtx ? { ...initialContext, ...orchestratorCtx } : initialContext; try { let isBreakingContextBuilding = false; for (const onContext of beforeCallbacks.context) { const afterHookResult = await onContext({ context, extendContext: extension => { context = { ...context, ...extension }; }, breakContextBuilding: () => { isBreakingContextBuilding = true; }, }); if (typeof afterHookResult === 'function') { afterCalls.push(afterHookResult); } if (isBreakingContextBuilding === true) { break; } } for (const afterCb of afterCalls) { afterCb({ context, extendContext: extension => { context = { ...context, ...extension }; }, }); } return context; } catch (err) { let error = err; for (const errorCb of contextErrorHandlers) { errorCb({ context, error, setError: err => { error = err; }, }); } throw error; } } : initialContext => orchestratorCtx => orchestratorCtx ? { ...initialContext, ...orchestratorCtx } : initialContext; const useCustomSubscribe = beforeCallbacks.subscribe.length || onResolversHandlers.length; const customSubscribe = useCustomSubscribe ? makeSubscribe(async (args) => { let subscribeFn = subscribe; const afterCalls = []; const subscribeErrorHandlers = []; let context = args.contextValue || {}; let result; for (const onSubscribe of beforeCallbacks.subscribe) { const after = await onSubscribe({ subscribeFn, setSubscribeFn: newSubscribeFn => { subscribeFn = newSubscribeFn; }, extendContext: extension => { context = { ...context, ...extension }; }, args: args, setResultAndStopExecution: stopResult => { result = stopResult; }, }); if (after) { if (after.onSubscribeResult) { afterCalls.push(after.onSubscribeResult); } if (after.onSubscribeError) { subscribeErrorHandlers.push(after.onSubscribeError); } } if (result !== undefined) { break; } } if (onResolversHandlers.length) { context[resolversHooksSymbol] = onResolversHandlers; } if (result === undefined) { result = await subscribeFn({ ...args, contextValue: context, // Casted for GraphQL.js 15 compatibility // Can be removed once we drop support for GraphQL.js 15 }); } const onNextHandler = []; const onEndHandler = []; for (const afterCb of afterCalls) { const hookResult = afterCb({ args: args, result, setResult: newResult => { result = newResult; }, }); if (hookResult) { if (hookResult.onNext) { onNextHandler.push(hookResult.onNext); } if (hookResult.onEnd) { onEndHandler.push(hookResult.onEnd); } } } if (onNextHandler.length && isAsyncIterable$1(result)) { result = mapAsyncIterator(result, async (result) => { for (const onNext of onNextHandler) { await onNext({ args: args, result, setResult: newResult => (result = newResult), }); } return result; }); } if (onEndHandler.length && isAsyncIterable$1(result)) { result = finalAsyncIterator(result, () => { for (const onEnd of onEndHandler) { onEnd(); } }); } if (subscribeErrorHandlers.length && isAsyncIterable$1(result)) { result = errorAsyncIterator(result, err => { let error = err; for (const handler of subscribeErrorHandlers) { handler({ error, setError: err => { error = err; }, }); } throw error; }); } return result; }) : makeSubscribe(subscribe); const useCustomExecute = beforeCallbacks.execute.length || onResolversHandlers.length; const customExecute = useCustomExecute ? makeExecute(async (args) => { let executeFn = execute$1; let result; const afterCalls = []; let context = args.contextValue || {}; for (const onExecute of beforeCallbacks.execute) { const after = await onExecute({ executeFn, setExecuteFn: newExecuteFn => { executeFn = newExecuteFn; }, setResultAndStopExecution: stopResult => { result = stopResult; }, extendContext: extension => { if (typeof extension === 'object') { context = { ...context, ...extension, }; } else { throw new Error(`Invalid context extension provided! Expected "object", got: "${JSON.stringify(extension)}" (${typeof extension})`); } }, args: args, }); if (after === null || after === void 0 ? void 0 : after.onExecuteDone) { afterCalls.push(after.onExecuteDone); } if (result !== undefined) { break; } } if (onResolversHandlers.length) { context[resolversHooksSymbol] = onResolversHandlers; } if (result === undefined) { result = (await executeFn({ ...args, contextValue: context, })); } const onNextHandler = []; const onEndHandler = []; for (const afterCb of afterCalls) { const hookResult = await afterCb({ args: args, result, setResult: newResult => { result = newResult; }, }); if (hookResult) { if (hookResult.onNext) { onNextHandler.push(hookResult.onNext); } if (hookResult.onEnd) { onEndHandler.push(hookResult.onEnd); } } } if (onNextHandler.length && isAsyncIterable$1(result)) { result = mapAsyncIterator(result, async (result) => { for (const onNext of onNextHandler) { await onNext({ args: args, result, setResult: newResult => { result = newResult; }, }); } return result; }); } if (onEndHandler.length && isAsyncIterable$1(result)) { result = finalAsyncIterator(result, () => { for (const onEnd of onEndHandler) { onEnd(); } }); } return result; }) : makeExecute(execute$1); initDone = true; // This is done in order to trigger the first schema available, to allow plugins that needs the schema // eagerly to have it. if (schema) { for (const [i, plugin] of plugins.entries()) { plugin.onSchemaChange && plugin.onSchemaChange({ schema, replaceSchema: modifiedSchema => replaceSchema(modifiedSchema, i), }); } } return { getCurrentSchema() { return schema; }, init, parse: customParse, validate: customValidate, execute: customExecute, subscribe: customSubscribe, contextFactory: customContextFactory, }; } var _a$y; const getTimestamp = typeof globalThis !== 'undefined' && ((_a$y = globalThis === null || globalThis === void 0 ? void 0 : globalThis.performance) === null || _a$y === void 0 ? void 0 : _a$y.now) ? () => globalThis.performance.now() : () => Date.now(); const measure = () => { const start = getTimestamp(); return () => { const end = getTimestamp(); return end - start; }; }; const tracingSymbol = Symbol('envelopTracing'); function traceOrchestrator(orchestrator) { const createTracer = (name, ctx) => { const end = measure(); return () => { ctx[tracingSymbol][name] = end(); }; }; return { ...orchestrator, init: (ctx = {}) => { ctx[tracingSymbol] = ctx[tracingSymbol] || {}; const done = createTracer('init', ctx || {}); try { return orchestrator.init(ctx); } finally { done(); } }, parse: (ctx = {}) => { ctx[tracingSymbol] = ctx[tracingSymbol] || {}; const actualFn = orchestrator.parse(ctx); return (...args) => { const done = createTracer('parse', ctx); try { return actualFn(...args); } finally { done(); } }; }, validate: (ctx = {}) => { ctx[tracingSymbol] = ctx[tracingSymbol] || {}; const actualFn = orchestrator.validate(ctx); return (...args) => { const done = createTracer('validate', ctx); try { return actualFn(...args); } finally { done(); } }; }, execute: async (argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) => { const args = argsOrSchema instanceof GraphQLSchema ? { schema: argsOrSchema, document: document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver, } : argsOrSchema; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore GraphQL.js types contextValue as unknown const done = createTracer('execute', args.contextValue || {}); try { const result = await orchestrator.execute(args); done(); if (!isAsyncIterable$1(result)) { result.extensions = result.extensions || {}; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore GraphQL.js types contextValue as unknown result.extensions.envelopTracing = args.contextValue[tracingSymbol]; } else { // eslint-disable-next-line no-console console.warn(`"traceOrchestrator" encountered a AsyncIterator which is not supported yet, so tracing data is not available for the operation.`); } return result; } catch (e) { done(); throw e; } }, subscribe: async (argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, subscribeFieldResolver) => { const args = argsOrSchema instanceof GraphQLSchema ? { schema: argsOrSchema, document: document, rootValue, contextValue, variableValues, operationName, fieldResolver, subscribeFieldResolver, } : argsOrSchema; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore GraphQL.js types contextValue as unknown const done = createTracer('subscribe', args.contextValue || {}); try { return await orchestrator.subscribe(args); } finally { done(); } }, contextFactory: (ctx = {}) => { const actualFn = orchestrator.contextFactory(ctx); return async (childCtx) => { const done = createTracer('contextFactory', ctx); try { return await actualFn(childCtx); } finally { done(); } }; }, }; } function envelop(options) { const plugins = options.plugins.filter(isPluginEnabled); let orchestrator = createEnvelopOrchestrator(plugins); if (options.enableInternalTracing) { orchestrator = traceOrchestrator(orchestrator); } const getEnveloped = (initialContext = {}) => { const typedOrchestrator = orchestrator; typedOrchestrator.init(initialContext); return { parse: typedOrchestrator.parse(initialContext), validate: typedOrchestrator.validate(initialContext), contextFactory: typedOrchestrator.contextFactory(initialContext), execute: typedOrchestrator.execute, subscribe: typedOrchestrator.subscribe, schema: typedOrchestrator.getCurrentSchema(), }; }; getEnveloped._plugins = plugins; return getEnveloped; } const DEFAULT_OPTIONS = { logFn: console.log, }; const useLogger = (rawOptions = DEFAULT_OPTIONS) => { const options = { DEFAULT_OPTIONS, ...rawOptions, }; return { onParse({ extendContext, params }) { if (options.skipIntrospection && isIntrospectionOperationString(params.source)) { extendContext({ [envelopIsIntrospectionSymbol]: true, }); } }, onExecute({ args }) { if (args.contextValue[envelopIsIntrospectionSymbol]) { return; } options.logFn('execute-start', { args }); return { onExecuteDone: ({ result }) => { options.logFn('execute-end', { args, result }); }, }; }, onSubscribe({ args }) { if (args.contextValue[envelopIsIntrospectionSymbol]) { return; } options.logFn('subscribe-start', { args }); return { onSubscribeResult: ({ result }) => { options.logFn('subscribe-end', { args, result }); }, }; }, }; }; const useSchema = (schema) => { return { onPluginInit({ setSchema }) { setSchema(schema); }, }; }; const useExtendContext = (contextFactory) => ({ async onContextBuilding({ context, extendContext }) { extendContext((await contextFactory(context))); }, }); const DEFAULT_ERROR_MESSAGE = 'Unexpected error.'; class EnvelopError extends GraphQLError { constructor(message, extensions) { super(message, undefined, undefined, undefined, undefined, undefined, extensions); } } const formatError$1 = (err, message, isDev) => { var _a, _b, _c, _d; if (err instanceof GraphQLError) { if ( /** execution error */ (err.originalError && err.originalError instanceof EnvelopError === false) || /** validate and parse errors */ (err.originalError === undefined && err instanceof EnvelopError === false)) { return new GraphQLError(message, err.nodes, err.source, err.positions, err.path, undefined, isDev ? { originalError: { message: (_b = (_a = err.originalError) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : err.message, stack: (_d = (_c = err.originalError) === null || _c === void 0 ? void 0 : _c.stack) !== null && _d !== void 0 ? _d : err.stack, }, } : undefined); } return err; } return new GraphQLError(message); }; const makeHandleResult = (format, message, isDev) => ({ result, setResult }) => { if (result.errors != null) { setResult({ ...result, errors: result.errors.map(error => format(error, message, isDev)) }); } }; const useMaskedErrors = (opts) => { var _a, _b; const format = (_a = opts === null || opts === void 0 ? void 0 : opts.formatError) !== null && _a !== void 0 ? _a : formatError$1; const message = (opts === null || opts === void 0 ? void 0 : opts.errorMessage) || DEFAULT_ERROR_MESSAGE; // eslint-disable-next-line dot-notation const isDev = (_b = opts === null || opts === void 0 ? void 0 : opts.isDev) !== null && _b !== void 0 ? _b : (typeof process !== 'undefined' ? process.env['NODE_ENV'] === 'development' : false); const handleResult = makeHandleResult(format, message, isDev); return { onParse: (opts === null || opts === void 0 ? void 0 : opts.handleParseErrors) === true ? function onParse() { return function onParseEnd({ result, replaceParseResult }) { if (result instanceof Error) { replaceParseResult(format(result, message, isDev)); } }; } : undefined, onValidate: (opts === null || opts === void 0 ? void 0 : opts.handleValidationErrors) === true ? function onValidate() { return function onValidateEnd({ valid, result, setResult }) { if (valid === false) { setResult(result.map(error => format(error, message, isDev))); } }; } : undefined, onPluginInit(context) { context.registerContextErrorHandler(({ error, setError }) => { if (error instanceof GraphQLError === false && error instanceof Error) { error = new GraphQLError(error.message, undefined, undefined, undefined, undefined, error); } setError(format(error, message, isDev)); }); }, onExecute() { return { onExecuteDone(payload) { return handleStreamOrSingleExecutionResult(payload, handleResult); }, }; }, onSubscribe() { return { onSubscribeResult(payload) { return handleStreamOrSingleExecutionResult(payload, handleResult); }, onSubscribeError({ error, setError }) { setError(format(error, message, isDev)); }, }; }, }; }; const ANSI_CODES = { black: '\x1b[30m', red: '\x1b[31m', green: '\x1b[32m', yellow: '\x1b[33m', blue: '\x1b[34m', magenta: '\x1b[35m', cyan: '\x1b[36m', white: '\x1b[37m', reset: '\x1b[0m', bold: '\x1b[1m', orange: '\x1b[48:5:166m', }; const titleBold = (msg) => ANSI_CODES.bold + msg + ANSI_CODES.reset; const LEVEL_COLOR = { warn: ANSI_CODES.orange, info: ANSI_CODES.cyan, error: ANSI_CODES.red, debug: ANSI_CODES.magenta, title: ANSI_CODES.bold, reset: ANSI_CODES.reset, }; const isDebug = () => typeof process === 'object' ? process.env.DEBUG : // @ts-expect-error typeof DEBUG !== 'undefined' ? true : false; const prefix = [LEVEL_COLOR.title, `🧘 Yoga -`, LEVEL_COLOR.reset]; const defaultYogaLogger = { debug(...args) { if (isDebug()) { const fullMessage = [ `🐛 `, ...prefix, LEVEL_COLOR.debug, ...args, LEVEL_COLOR.reset, ]; // Some environments don't have other console methods if (console.debug) { console.debug(...fullMessage); } else { console.log(...fullMessage); } } }, info(...args) { const fullMessage = [ `💡 `, ...prefix, LEVEL_COLOR.info, ...args, LEVEL_COLOR.reset, ]; if (console.info) { console.info(...fullMessage); } else { console.log(...fullMessage); } }, warn(...args) { const fullMessage = [ `⚠️ `, ...prefix, LEVEL_COLOR.warn, ...args, LEVEL_COLOR.reset, ]; if (console.warn) { console.warn(...fullMessage); } else { console.log(...fullMessage); } }, error(...args) { const fullMessage = [ `❌ `, ...prefix, LEVEL_COLOR.error, ...args, LEVEL_COLOR.reset, ]; if (console.error) { console.error(...fullMessage); } else { console.log(...fullMessage); } }, }; var iterator; var hasRequiredIterator; function requireIterator () { if (hasRequiredIterator) return iterator; hasRequiredIterator = 1; iterator = function (Yallist) { Yallist.prototype[Symbol.iterator] = function* () { for (let walker = this.head; walker; walker = walker.next) { yield walker.value; } }; }; return iterator; } var yallist = Yallist$1; Yallist$1.Node = Node; Yallist$1.create = Yallist$1; function Yallist$1 (list) { var self = this; if (!(self instanceof Yallist$1)) { self = new Yallist$1(); } self.tail = null; self.head = null; self.length = 0; if (list && typeof list.forEach === 'function') { list.forEach(function (item) { self.push(item); }); } else if (arguments.length > 0) { for (var i = 0, l = arguments.length; i < l; i++) { self.push(arguments[i]); } } return self } Yallist$1.prototype.removeNode = function (node) { if (node.list !== this) { throw new Error('removing node which does not belong to this list') } var next = node.next; var prev = node.prev; if (next) { next.prev = prev; } if (prev) { prev.next = next; } if (node === this.head) { this.head = next; } if (node === this.tail) { this.tail = prev; } node.list.length--; node.next = null; node.prev = null; node.list = null; return next }; Yallist$1.prototype.unshiftNode = function (node) { if (node === this.head) { return } if (node.list) { node.list.removeNode(node); } var head = this.head; node.list = this; node.next = head; if (head) { head.prev = node; } this.head = node; if (!this.tail) { this.tail = node; } this.length++; }; Yallist$1.prototype.pushNode = function (node) { if (node === this.tail) { return } if (node.list) { node.list.removeNode(node); } var tail = this.tail; node.list = this; node.prev = tail; if (tail) { tail.next = node; } this.tail = node; if (!this.head) { this.head = node; } this.length++; }; Yallist$1.prototype.push = function () { for (var i = 0, l = arguments.length; i < l; i++) { push$1(this, arguments[i]); } return this.length }; Yallist$1.prototype.unshift = function () { for (var i = 0, l = arguments.length; i < l; i++) { unshift(this, arguments[i]); } return this.length }; Yallist$1.prototype.pop = function () { if (!this.tail) { return undefined } var res = this.tail.value; this.tail = this.tail.prev; if (this.tail) { this.tail.next = null; } else { this.head = null; } this.length--; return res }; Yallist$1.prototype.shift = function () { if (!this.head) { return undefined } var res = this.head.value; this.head = this.head.next; if (this.head) { this.head.prev = null; } else { this.tail = null; } this.length--; return res }; Yallist$1.prototype.forEach = function (fn, thisp) { thisp = thisp || this; for (var walker = this.head, i = 0; walker !== null; i++) { fn.call(thisp, walker.value, i, this); walker = walker.next; } }; Yallist$1.prototype.forEachReverse = function (fn, thisp) { thisp = thisp || this; for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { fn.call(thisp, walker.value, i, this); walker = walker.prev; } }; Yallist$1.prototype.get = function (n) { for (var i = 0, walker = this.head; walker !== null && i < n; i++) { // abort out of the list early if we hit a cycle walker = walker.next; } if (i === n && walker !== null) { return walker.value } }; Yallist$1.prototype.getReverse = function (n) { for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { // abort out of the list early if we hit a cycle walker = walker.prev; } if (i === n && walker !== null) { return walker.value } }; Yallist$1.prototype.map = function (fn, thisp) { thisp = thisp || this; var res = new Yallist$1(); for (var walker = this.head; walker !== null;) { res.push(fn.call(thisp, walker.value, this)); walker = walker.next; } return res }; Yallist$1.prototype.mapReverse = function (fn, thisp) { thisp = thisp || this; var res = new Yallist$1(); for (var walker = this.tail; walker !== null;) { res.push(fn.call(thisp, walker.value, this)); walker = walker.prev; } return res }; Yallist$1.prototype.reduce = function (fn, initial) { var acc; var walker = this.head; if (arguments.length > 1) { acc = initial; } else if (this.head) { walker = this.head.next; acc = this.head.value; } else { throw new TypeError('Reduce of empty list with no initial value') } for (var i = 0; walker !== null; i++) { acc = fn(acc, walker.value, i); walker = walker.next; } return acc }; Yallist$1.prototype.reduceReverse = function (fn, initial) { var acc; var walker = this.tail; if (arguments.length > 1) { acc = initial; } else if (this.tail) { walker = this.tail.prev; acc = this.tail.value; } else { throw new TypeError('Reduce of empty list with no initial value') } for (var i = this.length - 1; walker !== null; i--) { acc = fn(acc, walker.value, i); walker = walker.prev; } return acc }; Yallist$1.prototype.toArray = function () { var arr = new Array(this.length); for (var i = 0, walker = this.head; walker !== null; i++) { arr[i] = walker.value; walker = walker.next; } return arr }; Yallist$1.prototype.toArrayReverse = function () { var arr = new Array(this.length); for (var i = 0, walker = this.tail; walker !== null; i++) { arr[i] = walker.value; walker = walker.prev; } return arr }; Yallist$1.prototype.slice = function (from, to) { to = to || this.length; if (to < 0) { to += this.length; } from = from || 0; if (from < 0) { from += this.length; } var ret = new Yallist$1(); if (to < from || to < 0) { return ret } if (from < 0) { from = 0; } if (to > this.length) { to = this.length; } for (var i = 0, walker = this.head; walker !== null && i < from; i++) { walker = walker.next; } for (; walker !== null && i < to; i++, walker = walker.next) { ret.push(walker.value); } return ret }; Yallist$1.prototype.sliceReverse = function (from, to) { to = to || this.length; if (to < 0) { to += this.length; } from = from || 0; if (from < 0) { from += this.length; } var ret = new Yallist$1(); if (to < from || to < 0) { return ret } if (from < 0) { from = 0; } if (to > this.length) { to = this.length; } for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { walker = walker.prev; } for (; walker !== null && i > from; i--, walker = walker.prev) { ret.push(walker.value); } return ret }; Yallist$1.prototype.splice = function (start, deleteCount, ...nodes) { if (start > this.length) { start = this.length - 1; } if (start < 0) { start = this.length + start; } for (var i = 0, walker = this.head; walker !== null && i < start; i++) { walker = walker.next; } var ret = []; for (var i = 0; walker && i < deleteCount; i++) { ret.push(walker.value); walker = this.removeNode(walker); } if (walker === null) { walker = this.tail; } if (walker !== this.head && walker !== this.tail) { walker = walker.prev; } for (var i = 0; i < nodes.length; i++) { walker = insert(this, walker, nodes[i]); } return ret; }; Yallist$1.prototype.reverse = function () { var head = this.head; var tail = this.tail; for (var walker = head; walker !== null; walker = walker.prev) { var p = walker.prev; walker.prev = walker.next; walker.next = p; } this.head = tail; this.tail = head; return this }; function insert (self, node, value) { var inserted = node === self.head ? new Node(value, null, node, self) : new Node(value, node, node.next, self); if (inserted.next === null) { self.tail = inserted; } if (inserted.prev === null) { self.head = inserted; } self.length++; return inserted } function push$1 (self, item) { self.tail = new Node(item, self.tail, null, self); if (!self.head) { self.head = self.tail; } self.length++; } function unshift (self, item) { self.head = new Node(item, null, self.head, self); if (!self.tail) { self.tail = self.head; } self.length++; } function Node (value, prev, next, list) { if (!(this instanceof Node)) { return new Node(value, prev, next, list) } this.list = list; this.value = value; if (prev) { prev.next = this; this.prev = prev; } else { this.prev = null; } if (next) { next.prev = this; this.next = next; } else { this.next = null; } } try { // add if support for Symbol.iterator is present requireIterator()(Yallist$1); } catch (er) {} // A linked list to keep track of recently-used-ness const Yallist = yallist; const MAX = Symbol('max'); const LENGTH = Symbol('length'); const LENGTH_CALCULATOR = Symbol('lengthCalculator'); const ALLOW_STALE = Symbol('allowStale'); const MAX_AGE = Symbol('maxAge'); const DISPOSE = Symbol('dispose'); const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet'); const LRU_LIST = Symbol('lruList'); const CACHE = Symbol('cache'); const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet'); const naiveLength = () => 1; // lruList is a yallist where the head is the youngest // item, and the tail is the oldest. the list contains the Hit // objects as the entries. // Each Hit object has a reference to its Yallist.Node. This // never changes. // // cache is a Map (or PseudoMap) that matches the keys to // the Yallist.Node object. class LRUCache { constructor (options) { if (typeof options === 'number') options = { max: options }; if (!options) options = {}; if (options.max && (typeof options.max !== 'number' || options.max < 0)) throw new TypeError('max must be a non-negative number') // Kind of weird to have a default max of Infinity, but oh well. this[MAX] = options.max || Infinity; const lc = options.length || naiveLength; this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc; this[ALLOW_STALE] = options.stale || false; if (options.maxAge && typeof options.maxAge !== 'number') throw new TypeError('maxAge must be a number') this[MAX_AGE] = options.maxAge || 0; this[DISPOSE] = options.dispose; this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false; this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false; this.reset(); } // resize the cache when the max changes. set max (mL) { if (typeof mL !== 'number' || mL < 0) throw new TypeError('max must be a non-negative number') this[MAX] = mL || Infinity; trim(this); } get max () { return this[MAX] } set allowStale (allowStale) { this[ALLOW_STALE] = !!allowStale; } get allowStale () { return this[ALLOW_STALE] } set maxAge (mA) { if (typeof mA !== 'number') throw new TypeError('maxAge must be a non-negative number') this[MAX_AGE] = mA; trim(this); } get maxAge () { return this[MAX_AGE] } // resize the cache when the lengthCalculator changes. set lengthCalculator (lC) { if (typeof lC !== 'function') lC = naiveLength; if (lC !== this[LENGTH_CALCULATOR]) { this[LENGTH_CALCULATOR] = lC; this[LENGTH] = 0; this[LRU_LIST].forEach(hit => { hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key); this[LENGTH] += hit.length; }); } trim(this); } get lengthCalculator () { return this[LENGTH_CALCULATOR] } get length () { return this[LENGTH] } get itemCount () { return this[LRU_LIST].length } rforEach (fn, thisp) { thisp = thisp || this; for (let walker = this[LRU_LIST].tail; walker !== null;) { const prev = walker.prev; forEachStep(this, fn, walker, thisp); walker = prev; } } forEach (fn, thisp) { thisp = thisp || this; for (let walker = this[LRU_LIST].head; walker !== null;) { const next = walker.next; forEachStep(this, fn, walker, thisp); walker = next; } } keys () { return this[LRU_LIST].toArray().map(k => k.key) } values () { return this[LRU_LIST].toArray().map(k => k.value) } reset () { if (this[DISPOSE] && this[LRU_LIST] && this[LRU_LIST].length) { this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)); } this[CACHE] = new Map(); // hash of items by key this[LRU_LIST] = new Yallist(); // list of items in order of use recency this[LENGTH] = 0; // length of items in the list } dump () { return this[LRU_LIST].map(hit => isStale(this, hit) ? false : { k: hit.key, v: hit.value, e: hit.now + (hit.maxAge || 0) }).toArray().filter(h => h) } dumpLru () { return this[LRU_LIST] } set (key, value, maxAge) { maxAge = maxAge || this[MAX_AGE]; if (maxAge && typeof maxAge !== 'number') throw new TypeError('maxAge must be a number') const now = maxAge ? Date.now() : 0; const len = this[LENGTH_CALCULATOR](value, key); if (this[CACHE].has(key)) { if (len > this[MAX]) { del(this, this[CACHE].get(key)); return false } const node = this[CACHE].get(key); const item = node.value; // dispose of the old one before overwriting // split out into 2 ifs for better coverage tracking if (this[DISPOSE]) { if (!this[NO_DISPOSE_ON_SET]) this[DISPOSE](key, item.value); } item.now = now; item.maxAge = maxAge; item.value = value; this[LENGTH] += len - item.length; item.length = len; this.get(key); trim(this); return true } const hit = new Entry(key, value, len, now, maxAge); // oversized objects fall out of cache automatically. if (hit.length > this[MAX]) { if (this[DISPOSE]) this[DISPOSE](key, value); return false } this[LENGTH] += hit.length; this[LRU_LIST].unshift(hit); this[CACHE].set(key, this[LRU_LIST].head); trim(this); return true } has (key) { if (!this[CACHE].has(key)) return false const hit = this[CACHE].get(key).value; return !isStale(this, hit) } get (key) { return get$1(this, key, true) } peek (key) { return get$1(this, key, false) } pop () { const node = this[LRU_LIST].tail; if (!node) return null del(this, node); return node.value } del (key) { del(this, this[CACHE].get(key)); } load (arr) { // reset the cache this.reset(); const now = Date.now(); // A previous serialized cache has the most recent items first for (let l = arr.length - 1; l >= 0; l--) { const hit = arr[l]; const expiresAt = hit.e || 0; if (expiresAt === 0) // the item was created without expiration in a non aged cache this.set(hit.k, hit.v); else { const maxAge = expiresAt - now; // dont add already expired items if (maxAge > 0) { this.set(hit.k, hit.v, maxAge); } } } } prune () { this[CACHE].forEach((value, key) => get$1(this, key, false)); } } const get$1 = (self, key, doUse) => { const node = self[CACHE].get(key); if (node) { const hit = node.value; if (isStale(self, hit)) { del(self, node); if (!self[ALLOW_STALE]) return undefined } else { if (doUse) { if (self[UPDATE_AGE_ON_GET]) node.value.now = Date.now(); self[LRU_LIST].unshiftNode(node); } } return hit.value } }; const isStale = (self, hit) => { if (!hit || (!hit.maxAge && !self[MAX_AGE])) return false const diff = Date.now() - hit.now; return hit.maxAge ? diff > hit.maxAge : self[MAX_AGE] && (diff > self[MAX_AGE]) }; const trim = self => { if (self[LENGTH] > self[MAX]) { for (let walker = self[LRU_LIST].tail; self[LENGTH] > self[MAX] && walker !== null;) { // We know that we're about to delete this one, and also // what the next least recently used key will be, so just // go ahead and set it now. const prev = walker.prev; del(self, walker); walker = prev; } } }; const del = (self, node) => { if (node) { const hit = node.value; if (self[DISPOSE]) self[DISPOSE](hit.key, hit.value); self[LENGTH] -= hit.length; self[CACHE].delete(hit.key); self[LRU_LIST].removeNode(node); } }; class Entry { constructor (key, value, length, now, maxAge) { this.key = key; this.value = value; this.length = length; this.now = now; this.maxAge = maxAge || 0; } } const forEachStep = (self, fn, node, thisp) => { let hit = node.value; if (isStale(self, hit)) { del(self, node); if (!self[ALLOW_STALE]) hit = undefined; } if (hit) fn.call(thisp, hit.value, hit.key, self); }; var lruCache = LRUCache; const DEFAULT_MAX$1 = 1000; const DEFAULT_TTL$1 = 3600000; const rawDocumentSymbol = Symbol('rawDocument'); const useValidationCache = (pluginOptions = {}) => { const resultCache = typeof pluginOptions.cache !== 'undefined' ? pluginOptions.cache : new lruCache({ max: DEFAULT_MAX$1, maxAge: DEFAULT_TTL$1, }); return { onSchemaChange() { var _a, _b; if (resultCache.reset) { (_a = resultCache.reset) === null || _a === void 0 ? void 0 : _a.call(resultCache); } else if ('clear' in resultCache) { (_b = resultCache.clear) === null || _b === void 0 ? void 0 : _b.call(resultCache); } }, onParse({ params, extendContext }) { extendContext({ [rawDocumentSymbol]: params.source.toString() }); }, onValidate({ params, context, setResult }) { var _a; const key = (_a = context[rawDocumentSymbol]) !== null && _a !== void 0 ? _a : print(params.documentAST); const cachedResult = resultCache.get(key); if (cachedResult !== undefined) { setResult(cachedResult); } return ({ result }) => { resultCache.set(key, result); }; }, }; }; const DEFAULT_MAX = 1000; const DEFAULT_TTL = 3600000; const useParserCache = (pluginOptions = {}) => { const documentCache = typeof pluginOptions.documentCache !== 'undefined' ? pluginOptions.documentCache : new lruCache({ max: DEFAULT_MAX, maxAge: DEFAULT_TTL }); const errorCache = typeof pluginOptions.errorCache !== 'undefined' ? pluginOptions.errorCache : new lruCache({ max: DEFAULT_MAX, maxAge: DEFAULT_TTL }); return { onParse({ params, setParsedDocument }) { const { source } = params; const key = source instanceof Source ? source.body : source; const cachedError = errorCache.get(key); if (cachedError !== undefined) { throw cachedError; } const cachedDocument = documentCache.get(key); if (cachedDocument !== undefined) { setParsedDocument(cachedDocument); } return ({ result }) => { if (result instanceof Error) { errorCache.set(key, result); } else if (result !== null) { documentCache.set(key, result); } }; }, }; }; const asArray$1 = (fns) => (Array.isArray(fns) ? fns : fns ? [fns] : []); function compareStrings(a, b) { if (String(a) < String(b)) { return -1; } if (String(a) > String(b)) { return 1; } return 0; } function nodeToString(a) { var _a, _b; let name; if ('alias' in a) { name = (_a = a.alias) === null || _a === void 0 ? void 0 : _a.value; } if (name == null && 'name' in a) { name = (_b = a.name) === null || _b === void 0 ? void 0 : _b.value; } if (name == null) { name = a.kind; } return name; } function compareNodes(a, b, customFn) { const aStr = nodeToString(a); const bStr = nodeToString(b); if (typeof customFn === 'function') { return customFn(aStr, bStr); } return compareStrings(aStr, bStr); } function isSome(input) { return input != null; } function createGraphQLError(message, options) { if (versionInfo.major >= 17) { return new GraphQLError(message, options); } return new GraphQLError(message, options === null || options === void 0 ? void 0 : options.nodes, options === null || options === void 0 ? void 0 : options.source, options === null || options === void 0 ? void 0 : options.positions, options === null || options === void 0 ? void 0 : options.path, options === null || options === void 0 ? void 0 : options.originalError, options === null || options === void 0 ? void 0 : options.extensions); } let AggregateErrorImpl; if (typeof AggregateError === 'undefined') { class AggregateErrorClass extends Error { constructor(errors, message = '') { super(message); this.errors = errors; this.name = 'AggregateError'; Error.captureStackTrace(this, AggregateErrorClass); } } AggregateErrorImpl = function (errors, message) { return new AggregateErrorClass(errors, message); }; } else { AggregateErrorImpl = AggregateError; } function isAggregateError$1(error) { return 'errors' in error && Array.isArray(error['errors']); } // Taken from graphql-js const MAX_RECURSIVE_DEPTH = 3; /** * Used to print values in error messages. */ function inspect(value) { return formatValue(value, []); } function formatValue(value, seenValues) { switch (typeof value) { case 'string': return JSON.stringify(value); case 'function': return value.name ? `[function ${value.name}]` : '[function]'; case 'object': return formatObjectValue(value, seenValues); default: return String(value); } } function formatError(value) { if (value instanceof GraphQLError) { return value.toString(); } return `${value.name}: ${value.message};\n ${value.stack}`; } function formatObjectValue(value, previouslySeenValues) { if (value === null) { return 'null'; } if (value instanceof Error) { if (isAggregateError$1(value)) { return formatError(value) + '\n' + formatArray(value.errors, previouslySeenValues); } return formatError(value); } if (previouslySeenValues.includes(value)) { return '[Circular]'; } const seenValues = [...previouslySeenValues, value]; if (isJSONable(value)) { const jsonValue = value.toJSON(); // check for infinite recursion if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue(jsonValue, seenValues); } } else if (Array.isArray(value)) { return formatArray(value, seenValues); } return formatObject(value, seenValues); } function isJSONable(value) { return typeof value.toJSON === 'function'; } function formatObject(object, seenValues) { const entries = Object.entries(object); if (entries.length === 0) { return '{}'; } if (seenValues.length > MAX_RECURSIVE_DEPTH) { return '[' + getObjectTag(object) + ']'; } const properties = entries.map(([key, value]) => key + ': ' + formatValue(value, seenValues)); return '{ ' + properties.join(', ') + ' }'; } function formatArray(array, seenValues) { if (array.length === 0) { return '[]'; } if (seenValues.length > MAX_RECURSIVE_DEPTH) { return '[Array]'; } const len = array.length; const remaining = array.length; const items = []; for (let i = 0; i < len; ++i) { items.push(formatValue(array[i], seenValues)); } if (remaining === 1) { items.push('... 1 more item'); } else if (remaining > 1) { items.push(`... ${remaining} more items`); } return '[' + items.join(', ') + ']'; } function getObjectTag(object) { const tag = Object.prototype.toString .call(object) .replace(/^\[object /, '') .replace(/]$/, ''); if (tag === 'Object' && typeof object.constructor === 'function') { const name = object.constructor.name; if (typeof name === 'string' && name !== '') { return name; } } return tag; } function getDirectivesInExtensions(node, pathToDirectivesInExtensions = ['directives']) { return pathToDirectivesInExtensions.reduce((acc, pathSegment) => (acc == null ? acc : acc[pathSegment]), node === null || node === void 0 ? void 0 : node.extensions); } function astFromType(type) { if (isNonNullType(type)) { const innerType = astFromType(type.ofType); if (innerType.kind === Kind.NON_NULL_TYPE) { throw new Error(`Invalid type node ${inspect(type)}. Inner type of non-null type cannot be a non-null type.`); } return { kind: Kind.NON_NULL_TYPE, type: innerType, }; } else if (isListType(type)) { return { kind: Kind.LIST_TYPE, type: astFromType(type.ofType), }; } return { kind: Kind.NAMED_TYPE, name: { kind: Kind.NAME, value: type.name, }, }; } /** * Produces a GraphQL Value AST given a JavaScript object. * Function will match JavaScript/JSON values to GraphQL AST schema format * by using the following mapping. * * | JSON Value | GraphQL Value | * | ------------- | -------------------- | * | Object | Input Object | * | Array | List | * | Boolean | Boolean | * | String | String | * | Number | Int / Float | * | null | NullValue | * */ function astFromValueUntyped(value) { // only explicit null, not undefined, NaN if (value === null) { return { kind: Kind.NULL }; } // undefined if (value === undefined) { return null; } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. if (Array.isArray(value)) { const valuesNodes = []; for (const item of value) { const itemNode = astFromValueUntyped(item); if (itemNode != null) { valuesNodes.push(itemNode); } } return { kind: Kind.LIST, values: valuesNodes }; } if (typeof value === 'object') { const fieldNodes = []; for (const fieldName in value) { const fieldValue = value[fieldName]; const ast = astFromValueUntyped(fieldValue); if (ast) { fieldNodes.push({ kind: Kind.OBJECT_FIELD, name: { kind: Kind.NAME, value: fieldName }, value: ast, }); } } return { kind: Kind.OBJECT, fields: fieldNodes }; } // Others serialize based on their corresponding JavaScript scalar types. if (typeof value === 'boolean') { return { kind: Kind.BOOLEAN, value }; } // JavaScript numbers can be Int or Float values. if (typeof value === 'number' && isFinite(value)) { const stringNum = String(value); return integerStringRegExp.test(stringNum) ? { kind: Kind.INT, value: stringNum } : { kind: Kind.FLOAT, value: stringNum }; } if (typeof value === 'string') { return { kind: Kind.STRING, value }; } throw new TypeError(`Cannot convert value to AST: ${value}.`); } /** * IntValue: * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; function memoize1(fn) { const memoize1cache = new WeakMap(); return function memoized(a1) { const cachedValue = memoize1cache.get(a1); if (cachedValue === undefined) { const newValue = fn(a1); memoize1cache.set(a1, newValue); return newValue; } return cachedValue; }; } const getRootTypeMap = memoize1(function getRootTypeMap(schema) { const rootTypeMap = new Map(); const queryType = schema.getQueryType(); if (queryType) { rootTypeMap.set('query', queryType); } const mutationType = schema.getMutationType(); if (mutationType) { rootTypeMap.set('mutation', mutationType); } const subscriptionType = schema.getSubscriptionType(); if (subscriptionType) { rootTypeMap.set('subscription', subscriptionType); } return rootTypeMap; }); function getDocumentNodeFromSchema(schema, options = {}) { const pathToDirectivesInExtensions = options.pathToDirectivesInExtensions; const typesMap = schema.getTypeMap(); const schemaNode = astFromSchema(schema, pathToDirectivesInExtensions); const definitions = schemaNode != null ? [schemaNode] : []; const directives = schema.getDirectives(); for (const directive of directives) { if (isSpecifiedDirective(directive)) { continue; } definitions.push(astFromDirective(directive, schema, pathToDirectivesInExtensions)); } for (const typeName in typesMap) { const type = typesMap[typeName]; const isPredefinedScalar = isSpecifiedScalarType(type); const isIntrospection = isIntrospectionType(type); if (isPredefinedScalar || isIntrospection) { continue; } if (isObjectType(type)) { definitions.push(astFromObjectType(type, schema, pathToDirectivesInExtensions)); } else if (isInterfaceType(type)) { definitions.push(astFromInterfaceType(type, schema, pathToDirectivesInExtensions)); } else if (isUnionType(type)) { definitions.push(astFromUnionType(type, schema, pathToDirectivesInExtensions)); } else if (isInputObjectType(type)) { definitions.push(astFromInputObjectType(type, schema, pathToDirectivesInExtensions)); } else if (isEnumType(type)) { definitions.push(astFromEnumType(type, schema, pathToDirectivesInExtensions)); } else if (isScalarType(type)) { definitions.push(astFromScalarType(type, schema, pathToDirectivesInExtensions)); } else { throw new Error(`Unknown type ${type}.`); } } return { kind: Kind.DOCUMENT, definitions, }; } function astFromSchema(schema, pathToDirectivesInExtensions) { var _a, _b; const operationTypeMap = new Map([ ['query', undefined], ['mutation', undefined], ['subscription', undefined], ]); const nodes = []; if (schema.astNode != null) { nodes.push(schema.astNode); } if (schema.extensionASTNodes != null) { for (const extensionASTNode of schema.extensionASTNodes) { nodes.push(extensionASTNode); } } for (const node of nodes) { if (node.operationTypes) { for (const operationTypeDefinitionNode of node.operationTypes) { operationTypeMap.set(operationTypeDefinitionNode.operation, operationTypeDefinitionNode); } } } const rootTypeMap = getRootTypeMap(schema); for (const [operationTypeNode, operationTypeDefinitionNode] of operationTypeMap) { const rootType = rootTypeMap.get(operationTypeNode); if (rootType != null) { const rootTypeAST = astFromType(rootType); if (operationTypeDefinitionNode != null) { operationTypeDefinitionNode.type = rootTypeAST; } else { operationTypeMap.set(operationTypeNode, { kind: Kind.OPERATION_TYPE_DEFINITION, operation: operationTypeNode, type: rootTypeAST, }); } } } const operationTypes = [...operationTypeMap.values()].filter(isSome); const directives = getDirectiveNodes(schema, schema, pathToDirectivesInExtensions); if (!operationTypes.length && !directives.length) { return null; } const schemaNode = { kind: operationTypes != null ? Kind.SCHEMA_DEFINITION : Kind.SCHEMA_EXTENSION, operationTypes, // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: directives, }; // This code is so weird because it needs to support GraphQL.js 14 // In GraphQL.js 14 there is no `description` value on schemaNode schemaNode.description = ((_b = (_a = schema.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : schema.description != null) ? { kind: Kind.STRING, value: schema.description, block: true, } : undefined; return schemaNode; } function astFromDirective(directive, schema, pathToDirectivesInExtensions) { var _a, _b, _c, _d; return { kind: Kind.DIRECTIVE_DEFINITION, description: (_b = (_a = directive.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (directive.description ? { kind: Kind.STRING, value: directive.description, } : undefined), name: { kind: Kind.NAME, value: directive.name, }, arguments: (_c = directive.args) === null || _c === void 0 ? void 0 : _c.map(arg => astFromArg(arg, schema, pathToDirectivesInExtensions)), repeatable: directive.isRepeatable, locations: ((_d = directive.locations) === null || _d === void 0 ? void 0 : _d.map(location => ({ kind: Kind.NAME, value: location, }))) || [], }; } function getDirectiveNodes(entity, schema, pathToDirectivesInExtensions) { const directivesInExtensions = getDirectivesInExtensions(entity, pathToDirectivesInExtensions); let nodes = []; if (entity.astNode != null) { nodes.push(entity.astNode); } if ('extensionASTNodes' in entity && entity.extensionASTNodes != null) { nodes = nodes.concat(entity.extensionASTNodes); } let directives; if (directivesInExtensions != null) { directives = makeDirectiveNodes(schema, directivesInExtensions); } else { directives = []; for (const node of nodes) { if (node.directives) { directives.push(...node.directives); } } } return directives; } function getDeprecatableDirectiveNodes(entity, schema, pathToDirectivesInExtensions) { var _a, _b; let directiveNodesBesidesDeprecated = []; let deprecatedDirectiveNode = null; const directivesInExtensions = getDirectivesInExtensions(entity, pathToDirectivesInExtensions); let directives; if (directivesInExtensions != null) { directives = makeDirectiveNodes(schema, directivesInExtensions); } else { directives = (_a = entity.astNode) === null || _a === void 0 ? void 0 : _a.directives; } if (directives != null) { directiveNodesBesidesDeprecated = directives.filter(directive => directive.name.value !== 'deprecated'); if (entity.deprecationReason != null) { deprecatedDirectiveNode = (_b = directives.filter(directive => directive.name.value === 'deprecated')) === null || _b === void 0 ? void 0 : _b[0]; } } if (entity.deprecationReason != null && deprecatedDirectiveNode == null) { deprecatedDirectiveNode = makeDeprecatedDirective(entity.deprecationReason); } return deprecatedDirectiveNode == null ? directiveNodesBesidesDeprecated : [deprecatedDirectiveNode].concat(directiveNodesBesidesDeprecated); } function astFromArg(arg, schema, pathToDirectivesInExtensions) { var _a, _b, _c; return { kind: Kind.INPUT_VALUE_DEFINITION, description: (_b = (_a = arg.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (arg.description ? { kind: Kind.STRING, value: arg.description, block: true, } : undefined), name: { kind: Kind.NAME, value: arg.name, }, type: astFromType(arg.type), // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility defaultValue: arg.defaultValue !== undefined ? (_c = astFromValue(arg.defaultValue, arg.type)) !== null && _c !== void 0 ? _c : undefined : undefined, directives: getDeprecatableDirectiveNodes(arg, schema, pathToDirectivesInExtensions), }; } function astFromObjectType(type, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.OBJECT_TYPE_DEFINITION, description: (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, fields: Object.values(type.getFields()).map(field => astFromField(field, schema, pathToDirectivesInExtensions)), interfaces: Object.values(type.getInterfaces()).map(iFace => astFromType(iFace)), directives: getDirectiveNodes(type, schema, pathToDirectivesInExtensions), }; } function astFromInterfaceType(type, schema, pathToDirectivesInExtensions) { var _a, _b; const node = { kind: Kind.INTERFACE_TYPE_DEFINITION, description: (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, fields: Object.values(type.getFields()).map(field => astFromField(field, schema, pathToDirectivesInExtensions)), directives: getDirectiveNodes(type, schema, pathToDirectivesInExtensions), }; if ('getInterfaces' in type) { node.interfaces = Object.values(type.getInterfaces()).map(iFace => astFromType(iFace)); } return node; } function astFromUnionType(type, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.UNION_TYPE_DEFINITION, description: (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDirectiveNodes(type, schema, pathToDirectivesInExtensions), types: type.getTypes().map(type => astFromType(type)), }; } function astFromInputObjectType(type, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.INPUT_OBJECT_TYPE_DEFINITION, description: (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, fields: Object.values(type.getFields()).map(field => astFromInputField(field, schema, pathToDirectivesInExtensions)), // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDirectiveNodes(type, schema, pathToDirectivesInExtensions), }; } function astFromEnumType(type, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.ENUM_TYPE_DEFINITION, description: (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, values: Object.values(type.getValues()).map(value => astFromEnumValue(value, schema, pathToDirectivesInExtensions)), // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDirectiveNodes(type, schema, pathToDirectivesInExtensions), }; } function astFromScalarType(type, schema, pathToDirectivesInExtensions) { var _a, _b, _c; const directivesInExtensions = getDirectivesInExtensions(type, pathToDirectivesInExtensions); const directives = directivesInExtensions ? makeDirectiveNodes(schema, directivesInExtensions) : ((_a = type.astNode) === null || _a === void 0 ? void 0 : _a.directives) || []; const specifiedByValue = (type['specifiedByUrl'] || type['specifiedByURL']); if (specifiedByValue && !directives.some(directiveNode => directiveNode.name.value === 'specifiedBy')) { const specifiedByArgs = { url: specifiedByValue, }; directives.push(makeDirectiveNode('specifiedBy', specifiedByArgs)); } return { kind: Kind.SCALAR_TYPE_DEFINITION, description: (_c = (_b = type.astNode) === null || _b === void 0 ? void 0 : _b.description) !== null && _c !== void 0 ? _c : (type.description ? { kind: Kind.STRING, value: type.description, block: true, } : undefined), name: { kind: Kind.NAME, value: type.name, }, // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: directives, }; } function astFromField(field, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.FIELD_DEFINITION, description: (_b = (_a = field.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (field.description ? { kind: Kind.STRING, value: field.description, block: true, } : undefined), name: { kind: Kind.NAME, value: field.name, }, arguments: field.args.map(arg => astFromArg(arg, schema, pathToDirectivesInExtensions)), type: astFromType(field.type), // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDeprecatableDirectiveNodes(field, schema, pathToDirectivesInExtensions), }; } function astFromInputField(field, schema, pathToDirectivesInExtensions) { var _a, _b, _c; return { kind: Kind.INPUT_VALUE_DEFINITION, description: (_b = (_a = field.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (field.description ? { kind: Kind.STRING, value: field.description, block: true, } : undefined), name: { kind: Kind.NAME, value: field.name, }, type: astFromType(field.type), // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDeprecatableDirectiveNodes(field, schema, pathToDirectivesInExtensions), defaultValue: (_c = astFromValue(field.defaultValue, field.type)) !== null && _c !== void 0 ? _c : undefined, }; } function astFromEnumValue(value, schema, pathToDirectivesInExtensions) { var _a, _b; return { kind: Kind.ENUM_VALUE_DEFINITION, description: (_b = (_a = value.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : (value.description ? { kind: Kind.STRING, value: value.description, block: true, } : undefined), name: { kind: Kind.NAME, value: value.name, }, // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: getDeprecatableDirectiveNodes(value, schema, pathToDirectivesInExtensions), }; } function makeDeprecatedDirective(deprecationReason) { return makeDirectiveNode('deprecated', { reason: deprecationReason }, GraphQLDeprecatedDirective); } function makeDirectiveNode(name, args, directive) { const directiveArguments = []; if (directive != null) { for (const arg of directive.args) { const argName = arg.name; const argValue = args[argName]; if (argValue !== undefined) { const value = astFromValue(argValue, arg.type); if (value) { directiveArguments.push({ kind: Kind.ARGUMENT, name: { kind: Kind.NAME, value: argName, }, value, }); } } } } else { for (const argName in args) { const argValue = args[argName]; const value = astFromValueUntyped(argValue); if (value) { directiveArguments.push({ kind: Kind.ARGUMENT, name: { kind: Kind.NAME, value: argName, }, value, }); } } } return { kind: Kind.DIRECTIVE, name: { kind: Kind.NAME, value: name, }, arguments: directiveArguments, }; } function makeDirectiveNodes(schema, directiveValues) { const directiveNodes = []; for (const directiveName in directiveValues) { const arrayOrSingleValue = directiveValues[directiveName]; const directive = schema === null || schema === void 0 ? void 0 : schema.getDirective(directiveName); if (Array.isArray(arrayOrSingleValue)) { for (const value of arrayOrSingleValue) { directiveNodes.push(makeDirectiveNode(directiveName, value, directive)); } } else { directiveNodes.push(makeDirectiveNode(directiveName, arrayOrSingleValue, directive)); } } return directiveNodes; } const MAX_LINE_LENGTH = 80; let commentsRegistry = {}; function resetComments() { commentsRegistry = {}; } function collectComment(node) { var _a; const entityName = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value; if (entityName == null) { return; } pushComment(node, entityName); switch (node.kind) { case 'EnumTypeDefinition': if (node.values) { for (const value of node.values) { pushComment(value, entityName, value.name.value); } } break; case 'ObjectTypeDefinition': case 'InputObjectTypeDefinition': case 'InterfaceTypeDefinition': if (node.fields) { for (const field of node.fields) { pushComment(field, entityName, field.name.value); if (isFieldDefinitionNode(field) && field.arguments) { for (const arg of field.arguments) { pushComment(arg, entityName, field.name.value, arg.name.value); } } } } break; } } function pushComment(node, entity, field, argument) { const comment = getComment(node); if (typeof comment !== 'string' || comment.length === 0) { return; } const keys = [entity]; if (field) { keys.push(field); if (argument) { keys.push(argument); } } const path = keys.join('.'); if (!commentsRegistry[path]) { commentsRegistry[path] = []; } commentsRegistry[path].push(comment); } function printComment(comment) { return '\n# ' + comment.replace(/\n/g, '\n# '); } /** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /** * NOTE: ==> This file has been modified just to add comments to the printed AST * This is a temp measure, we will move to using the original non modified printer.js ASAP. */ /** * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ function join(maybeArray, separator) { return maybeArray ? maybeArray.filter(x => x).join(separator || '') : ''; } function hasMultilineItems(maybeArray) { var _a; return (_a = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some(str => str.includes('\n'))) !== null && _a !== void 0 ? _a : false; } function addDescription(cb) { return (node, _key, _parent, path, ancestors) => { var _a; const keys = []; const parent = path.reduce((prev, key) => { if (['fields', 'arguments', 'values'].includes(key) && prev.name) { keys.push(prev.name.value); } return prev[key]; }, ancestors[0]); const key = [...keys, (_a = parent === null || parent === void 0 ? void 0 : parent.name) === null || _a === void 0 ? void 0 : _a.value].filter(Boolean).join('.'); const items = []; if (node.kind.includes('Definition') && commentsRegistry[key]) { items.push(...commentsRegistry[key]); } return join([...items.map(printComment), node.description, cb(node, _key, _parent, path, ancestors)], '\n'); }; } function indent(maybeString) { return maybeString && ` ${maybeString.replace(/\n/g, '\n ')}`; } /** * Given array, print each item on its own line, wrapped in an * indented "{ }" block. */ function block(array) { return array && array.length !== 0 ? `{\n${indent(join(array, '\n'))}\n}` : ''; } /** * If maybeString is not null or empty, then wrap with start and end, otherwise * print an empty string. */ function wrap(start, maybeString, end) { return maybeString ? start + maybeString + (end || '') : ''; } /** * Print a block string in the indented block form by adding a leading and * trailing blank line. However, if a block string starts with whitespace and is * a single-line, adding a leading blank line would strip that whitespace. */ function printBlockString(value, isDescription = false) { const escaped = value.replace(/"""/g, '\\"""'); return (value[0] === ' ' || value[0] === '\t') && value.indexOf('\n') === -1 ? `"""${escaped.replace(/"$/, '"\n')}"""` : `"""\n${isDescription ? escaped : indent(escaped)}\n"""`; } const printDocASTReducer = { Name: { leave: node => node.value }, Variable: { leave: node => '$' + node.name }, // Document Document: { leave: node => join(node.definitions, '\n\n'), }, OperationDefinition: { leave: node => { const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')'); const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); // the query short form. return prefix + ' ' + node.selectionSet; }, }, VariableDefinition: { leave: ({ variable, type, defaultValue, directives }) => variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' ')), }, SelectionSet: { leave: ({ selections }) => block(selections) }, Field: { leave({ alias, name, arguments: args, directives, selectionSet }) { const prefix = wrap('', alias, ': ') + name; let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); } return join([argsLine, join(directives, ' '), selectionSet], ' '); }, }, Argument: { leave: ({ name, value }) => name + ': ' + value }, // Fragments FragmentSpread: { leave: ({ name, directives }) => '...' + name + wrap(' ', join(directives, ' ')), }, InlineFragment: { leave: ({ typeCondition, directives, selectionSet }) => join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' '), }, FragmentDefinition: { leave: ({ name, typeCondition, variableDefinitions, directives, selectionSet }) => // Note: fragment variable definitions are experimental and may be changed // or removed in the future. `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet, }, // Value IntValue: { leave: ({ value }) => value }, FloatValue: { leave: ({ value }) => value }, StringValue: { leave: ({ value, block: isBlockString }) => { if (isBlockString) { return printBlockString(value); } return JSON.stringify(value); }, }, BooleanValue: { leave: ({ value }) => (value ? 'true' : 'false') }, NullValue: { leave: () => 'null' }, EnumValue: { leave: ({ value }) => value }, ListValue: { leave: ({ values }) => '[' + join(values, ', ') + ']' }, ObjectValue: { leave: ({ fields }) => '{' + join(fields, ', ') + '}' }, ObjectField: { leave: ({ name, value }) => name + ': ' + value }, // Directive Directive: { leave: ({ name, arguments: args }) => '@' + name + wrap('(', join(args, ', '), ')'), }, // Type NamedType: { leave: ({ name }) => name }, ListType: { leave: ({ type }) => '[' + type + ']' }, NonNullType: { leave: ({ type }) => type + '!' }, // Type System Definitions SchemaDefinition: { leave: ({ directives, operationTypes }) => join(['schema', join(directives, ' '), block(operationTypes)], ' '), }, OperationTypeDefinition: { leave: ({ operation, type }) => operation + ': ' + type, }, ScalarTypeDefinition: { leave: ({ name, directives }) => join(['scalar', name, join(directives, ' ')], ' '), }, ObjectTypeDefinition: { leave: ({ name, interfaces, directives, fields }) => join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '), }, FieldDefinition: { leave: ({ name, arguments: args, type, directives }) => name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' ')), }, InputValueDefinition: { leave: ({ name, type, defaultValue, directives }) => join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' '), }, InterfaceTypeDefinition: { leave: ({ name, interfaces, directives, fields }) => join(['interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '), }, UnionTypeDefinition: { leave: ({ name, directives, types }) => join(['union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' '), }, EnumTypeDefinition: { leave: ({ name, directives, values }) => join(['enum', name, join(directives, ' '), block(values)], ' '), }, EnumValueDefinition: { leave: ({ name, directives }) => join([name, join(directives, ' ')], ' '), }, InputObjectTypeDefinition: { leave: ({ name, directives, fields }) => join(['input', name, join(directives, ' '), block(fields)], ' '), }, DirectiveDefinition: { leave: ({ name, arguments: args, repeatable, locations }) => 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | '), }, SchemaExtension: { leave: ({ directives, operationTypes }) => join(['extend schema', join(directives, ' '), block(operationTypes)], ' '), }, ScalarTypeExtension: { leave: ({ name, directives }) => join(['extend scalar', name, join(directives, ' ')], ' '), }, ObjectTypeExtension: { leave: ({ name, interfaces, directives, fields }) => join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '), }, InterfaceTypeExtension: { leave: ({ name, interfaces, directives, fields }) => join(['extend interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '), }, UnionTypeExtension: { leave: ({ name, directives, types }) => join(['extend union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' '), }, EnumTypeExtension: { leave: ({ name, directives, values }) => join(['extend enum', name, join(directives, ' '), block(values)], ' '), }, InputObjectTypeExtension: { leave: ({ name, directives, fields }) => join(['extend input', name, join(directives, ' '), block(fields)], ' '), }, }; const printDocASTReducerWithComments = Object.keys(printDocASTReducer).reduce((prev, key) => ({ ...prev, [key]: { leave: addDescription(printDocASTReducer[key].leave), }, }), {}); /** * Converts an AST into a string, using one set of reasonable * formatting rules. */ function printWithComments(ast) { return visit(ast, printDocASTReducerWithComments); } function isFieldDefinitionNode(node) { return node.kind === 'FieldDefinition'; } function getComment(node) { const rawValue = getLeadingCommentBlock(node); if (rawValue !== undefined) { return dedentBlockStringValue(`\n${rawValue}`); } } function getLeadingCommentBlock(node) { const loc = node.loc; if (!loc) { return; } const comments = []; let token = loc.startToken.prev; while (token != null && token.kind === TokenKind.COMMENT && token.next != null && token.prev != null && token.line + 1 === token.next.line && token.line !== token.prev.line) { const value = String(token.value); comments.push(value); token = token.prev; } return comments.length > 0 ? comments.reverse().join('\n') : undefined; } function dedentBlockStringValue(rawString) { // Expand a block string's raw value into independent lines. const lines = rawString.split(/\r\n|[\n\r]/g); // Remove common indentation from all lines but first. const commonIndent = getBlockStringIndentation(lines); if (commonIndent !== 0) { for (let i = 1; i < lines.length; i++) { lines[i] = lines[i].slice(commonIndent); } } // Remove leading and trailing blank lines. while (lines.length > 0 && isBlank(lines[0])) { lines.shift(); } while (lines.length > 0 && isBlank(lines[lines.length - 1])) { lines.pop(); } // Return a string of the lines joined with U+000A. return lines.join('\n'); } /** * @internal */ function getBlockStringIndentation(lines) { let commonIndent = null; for (let i = 1; i < lines.length; i++) { const line = lines[i]; const indent = leadingWhitespace(line); if (indent === line.length) { continue; // skip empty lines } if (commonIndent === null || indent < commonIndent) { commonIndent = indent; if (commonIndent === 0) { break; } } } return commonIndent === null ? 0 : commonIndent; } function leadingWhitespace(str) { let i = 0; while (i < str.length && (str[i] === ' ' || str[i] === '\t')) { i++; } return i; } function isBlank(str) { return leadingWhitespace(str) === str.length; } var DirectiveLocation; (function (DirectiveLocation) { /** Request Definitions */ DirectiveLocation["QUERY"] = "QUERY"; DirectiveLocation["MUTATION"] = "MUTATION"; DirectiveLocation["SUBSCRIPTION"] = "SUBSCRIPTION"; DirectiveLocation["FIELD"] = "FIELD"; DirectiveLocation["FRAGMENT_DEFINITION"] = "FRAGMENT_DEFINITION"; DirectiveLocation["FRAGMENT_SPREAD"] = "FRAGMENT_SPREAD"; DirectiveLocation["INLINE_FRAGMENT"] = "INLINE_FRAGMENT"; DirectiveLocation["VARIABLE_DEFINITION"] = "VARIABLE_DEFINITION"; /** Type System Definitions */ DirectiveLocation["SCHEMA"] = "SCHEMA"; DirectiveLocation["SCALAR"] = "SCALAR"; DirectiveLocation["OBJECT"] = "OBJECT"; DirectiveLocation["FIELD_DEFINITION"] = "FIELD_DEFINITION"; DirectiveLocation["ARGUMENT_DEFINITION"] = "ARGUMENT_DEFINITION"; DirectiveLocation["INTERFACE"] = "INTERFACE"; DirectiveLocation["UNION"] = "UNION"; DirectiveLocation["ENUM"] = "ENUM"; DirectiveLocation["ENUM_VALUE"] = "ENUM_VALUE"; DirectiveLocation["INPUT_OBJECT"] = "INPUT_OBJECT"; DirectiveLocation["INPUT_FIELD_DEFINITION"] = "INPUT_FIELD_DEFINITION"; })(DirectiveLocation || (DirectiveLocation = {})); var MapperKind; (function (MapperKind) { MapperKind["TYPE"] = "MapperKind.TYPE"; MapperKind["SCALAR_TYPE"] = "MapperKind.SCALAR_TYPE"; MapperKind["ENUM_TYPE"] = "MapperKind.ENUM_TYPE"; MapperKind["COMPOSITE_TYPE"] = "MapperKind.COMPOSITE_TYPE"; MapperKind["OBJECT_TYPE"] = "MapperKind.OBJECT_TYPE"; MapperKind["INPUT_OBJECT_TYPE"] = "MapperKind.INPUT_OBJECT_TYPE"; MapperKind["ABSTRACT_TYPE"] = "MapperKind.ABSTRACT_TYPE"; MapperKind["UNION_TYPE"] = "MapperKind.UNION_TYPE"; MapperKind["INTERFACE_TYPE"] = "MapperKind.INTERFACE_TYPE"; MapperKind["ROOT_OBJECT"] = "MapperKind.ROOT_OBJECT"; MapperKind["QUERY"] = "MapperKind.QUERY"; MapperKind["MUTATION"] = "MapperKind.MUTATION"; MapperKind["SUBSCRIPTION"] = "MapperKind.SUBSCRIPTION"; MapperKind["DIRECTIVE"] = "MapperKind.DIRECTIVE"; MapperKind["FIELD"] = "MapperKind.FIELD"; MapperKind["COMPOSITE_FIELD"] = "MapperKind.COMPOSITE_FIELD"; MapperKind["OBJECT_FIELD"] = "MapperKind.OBJECT_FIELD"; MapperKind["ROOT_FIELD"] = "MapperKind.ROOT_FIELD"; MapperKind["QUERY_ROOT_FIELD"] = "MapperKind.QUERY_ROOT_FIELD"; MapperKind["MUTATION_ROOT_FIELD"] = "MapperKind.MUTATION_ROOT_FIELD"; MapperKind["SUBSCRIPTION_ROOT_FIELD"] = "MapperKind.SUBSCRIPTION_ROOT_FIELD"; MapperKind["INTERFACE_FIELD"] = "MapperKind.INTERFACE_FIELD"; MapperKind["INPUT_OBJECT_FIELD"] = "MapperKind.INPUT_OBJECT_FIELD"; MapperKind["ARGUMENT"] = "MapperKind.ARGUMENT"; MapperKind["ENUM_VALUE"] = "MapperKind.ENUM_VALUE"; })(MapperKind || (MapperKind = {})); function getObjectTypeFromTypeMap(typeMap, type) { if (type) { const maybeObjectType = typeMap[type.name]; if (isObjectType(maybeObjectType)) { return maybeObjectType; } } } function isNamedStub(type) { if ('getFields' in type) { const fields = type.getFields(); // eslint-disable-next-line no-unreachable-loop for (const fieldName in fields) { const field = fields[fieldName]; return field.name === '_fake'; } } return false; } function getBuiltInForStub(type) { switch (type.name) { case GraphQLInt.name: return GraphQLInt; case GraphQLFloat.name: return GraphQLFloat; case GraphQLString.name: return GraphQLString; case GraphQLBoolean.name: return GraphQLBoolean; case GraphQLID.name: return GraphQLID; default: return type; } } function rewireTypes(originalTypeMap, directives) { const referenceTypeMap = Object.create(null); for (const typeName in originalTypeMap) { referenceTypeMap[typeName] = originalTypeMap[typeName]; } const newTypeMap = Object.create(null); for (const typeName in referenceTypeMap) { const namedType = referenceTypeMap[typeName]; if (namedType == null || typeName.startsWith('__')) { continue; } const newName = namedType.name; if (newName.startsWith('__')) { continue; } if (newTypeMap[newName] != null) { console.warn(`Duplicate schema type name ${newName} found; keeping the existing one found in the schema`); continue; } newTypeMap[newName] = namedType; } for (const typeName in newTypeMap) { newTypeMap[typeName] = rewireNamedType(newTypeMap[typeName]); } const newDirectives = directives.map(directive => rewireDirective(directive)); return { typeMap: newTypeMap, directives: newDirectives, }; function rewireDirective(directive) { if (isSpecifiedDirective(directive)) { return directive; } const directiveConfig = directive.toConfig(); directiveConfig.args = rewireArgs(directiveConfig.args); return new GraphQLDirective(directiveConfig); } function rewireArgs(args) { const rewiredArgs = {}; for (const argName in args) { const arg = args[argName]; const rewiredArgType = rewireType(arg.type); if (rewiredArgType != null) { arg.type = rewiredArgType; rewiredArgs[argName] = arg; } } return rewiredArgs; } function rewireNamedType(type) { if (isObjectType(type)) { const config = type.toConfig(); const newConfig = { ...config, fields: () => rewireFields(config.fields), interfaces: () => rewireNamedTypes(config.interfaces), }; return new GraphQLObjectType(newConfig); } else if (isInterfaceType(type)) { const config = type.toConfig(); const newConfig = { ...config, fields: () => rewireFields(config.fields), }; if ('interfaces' in newConfig) { newConfig.interfaces = () => rewireNamedTypes(config.interfaces); } return new GraphQLInterfaceType(newConfig); } else if (isUnionType(type)) { const config = type.toConfig(); const newConfig = { ...config, types: () => rewireNamedTypes(config.types), }; return new GraphQLUnionType(newConfig); } else if (isInputObjectType(type)) { const config = type.toConfig(); const newConfig = { ...config, fields: () => rewireInputFields(config.fields), }; return new GraphQLInputObjectType(newConfig); } else if (isEnumType(type)) { const enumConfig = type.toConfig(); return new GraphQLEnumType(enumConfig); } else if (isScalarType(type)) { if (isSpecifiedScalarType(type)) { return type; } const scalarConfig = type.toConfig(); return new GraphQLScalarType(scalarConfig); } throw new Error(`Unexpected schema type: ${type}`); } function rewireFields(fields) { const rewiredFields = {}; for (const fieldName in fields) { const field = fields[fieldName]; const rewiredFieldType = rewireType(field.type); if (rewiredFieldType != null && field.args) { field.type = rewiredFieldType; field.args = rewireArgs(field.args); rewiredFields[fieldName] = field; } } return rewiredFields; } function rewireInputFields(fields) { const rewiredFields = {}; for (const fieldName in fields) { const field = fields[fieldName]; const rewiredFieldType = rewireType(field.type); if (rewiredFieldType != null) { field.type = rewiredFieldType; rewiredFields[fieldName] = field; } } return rewiredFields; } function rewireNamedTypes(namedTypes) { const rewiredTypes = []; for (const namedType of namedTypes) { const rewiredType = rewireType(namedType); if (rewiredType != null) { rewiredTypes.push(rewiredType); } } return rewiredTypes; } function rewireType(type) { if (isListType(type)) { const rewiredType = rewireType(type.ofType); return rewiredType != null ? new GraphQLList(rewiredType) : null; } else if (isNonNullType(type)) { const rewiredType = rewireType(type.ofType); return rewiredType != null ? new GraphQLNonNull(rewiredType) : null; } else if (isNamedType(type)) { let rewiredType = referenceTypeMap[type.name]; if (rewiredType === undefined) { rewiredType = isNamedStub(type) ? getBuiltInForStub(type) : rewireNamedType(type); newTypeMap[rewiredType.name] = referenceTypeMap[type.name] = rewiredType; } return rewiredType != null ? newTypeMap[rewiredType.name] : null; } return null; } } function transformInputValue(type, value, inputLeafValueTransformer = null, inputObjectValueTransformer = null) { if (value == null) { return value; } const nullableType = getNullableType(type); if (isLeafType(nullableType)) { return inputLeafValueTransformer != null ? inputLeafValueTransformer(nullableType, value) : value; } else if (isListType(nullableType)) { return value.map((listMember) => transformInputValue(nullableType.ofType, listMember, inputLeafValueTransformer, inputObjectValueTransformer)); } else if (isInputObjectType(nullableType)) { const fields = nullableType.getFields(); const newValue = {}; for (const key in value) { const field = fields[key]; if (field != null) { newValue[key] = transformInputValue(field.type, value[key], inputLeafValueTransformer, inputObjectValueTransformer); } } return inputObjectValueTransformer != null ? inputObjectValueTransformer(nullableType, newValue) : newValue; } // unreachable, no other possible return value } function serializeInputValue(type, value) { return transformInputValue(type, value, (t, v) => { try { return t.serialize(v); } catch (_a) { return v; } }); } function parseInputValue(type, value) { return transformInputValue(type, value, (t, v) => { try { return t.parseValue(v); } catch (_a) { return v; } }); } function mapSchema(schema, schemaMapper = {}) { const newTypeMap = mapArguments(mapFields(mapTypes(mapDefaultValues(mapEnumValues(mapTypes(mapDefaultValues(schema.getTypeMap(), schema, serializeInputValue), schema, schemaMapper, type => isLeafType(type)), schema, schemaMapper), schema, parseInputValue), schema, schemaMapper, type => !isLeafType(type)), schema, schemaMapper), schema, schemaMapper); const originalDirectives = schema.getDirectives(); const newDirectives = mapDirectives(originalDirectives, schema, schemaMapper); const { typeMap, directives } = rewireTypes(newTypeMap, newDirectives); return new GraphQLSchema({ ...schema.toConfig(), query: getObjectTypeFromTypeMap(typeMap, getObjectTypeFromTypeMap(newTypeMap, schema.getQueryType())), mutation: getObjectTypeFromTypeMap(typeMap, getObjectTypeFromTypeMap(newTypeMap, schema.getMutationType())), subscription: getObjectTypeFromTypeMap(typeMap, getObjectTypeFromTypeMap(newTypeMap, schema.getSubscriptionType())), types: Object.values(typeMap), directives, }); } function mapTypes(originalTypeMap, schema, schemaMapper, testFn = () => true) { const newTypeMap = {}; for (const typeName in originalTypeMap) { if (!typeName.startsWith('__')) { const originalType = originalTypeMap[typeName]; if (originalType == null || !testFn(originalType)) { newTypeMap[typeName] = originalType; continue; } const typeMapper = getTypeMapper(schema, schemaMapper, typeName); if (typeMapper == null) { newTypeMap[typeName] = originalType; continue; } const maybeNewType = typeMapper(originalType, schema); if (maybeNewType === undefined) { newTypeMap[typeName] = originalType; continue; } newTypeMap[typeName] = maybeNewType; } } return newTypeMap; } function mapEnumValues(originalTypeMap, schema, schemaMapper) { const enumValueMapper = getEnumValueMapper(schemaMapper); if (!enumValueMapper) { return originalTypeMap; } return mapTypes(originalTypeMap, schema, { [MapperKind.ENUM_TYPE]: type => { const config = type.toConfig(); const originalEnumValueConfigMap = config.values; const newEnumValueConfigMap = {}; for (const externalValue in originalEnumValueConfigMap) { const originalEnumValueConfig = originalEnumValueConfigMap[externalValue]; const mappedEnumValue = enumValueMapper(originalEnumValueConfig, type.name, schema, externalValue); if (mappedEnumValue === undefined) { newEnumValueConfigMap[externalValue] = originalEnumValueConfig; } else if (Array.isArray(mappedEnumValue)) { const [newExternalValue, newEnumValueConfig] = mappedEnumValue; newEnumValueConfigMap[newExternalValue] = newEnumValueConfig === undefined ? originalEnumValueConfig : newEnumValueConfig; } else if (mappedEnumValue !== null) { newEnumValueConfigMap[externalValue] = mappedEnumValue; } } return correctASTNodes(new GraphQLEnumType({ ...config, values: newEnumValueConfigMap, })); }, }, type => isEnumType(type)); } function mapDefaultValues(originalTypeMap, schema, fn) { const newTypeMap = mapArguments(originalTypeMap, schema, { [MapperKind.ARGUMENT]: argumentConfig => { if (argumentConfig.defaultValue === undefined) { return argumentConfig; } const maybeNewType = getNewType(originalTypeMap, argumentConfig.type); if (maybeNewType != null) { return { ...argumentConfig, defaultValue: fn(maybeNewType, argumentConfig.defaultValue), }; } }, }); return mapFields(newTypeMap, schema, { [MapperKind.INPUT_OBJECT_FIELD]: inputFieldConfig => { if (inputFieldConfig.defaultValue === undefined) { return inputFieldConfig; } const maybeNewType = getNewType(newTypeMap, inputFieldConfig.type); if (maybeNewType != null) { return { ...inputFieldConfig, defaultValue: fn(maybeNewType, inputFieldConfig.defaultValue), }; } }, }); } function getNewType(newTypeMap, type) { if (isListType(type)) { const newType = getNewType(newTypeMap, type.ofType); return newType != null ? new GraphQLList(newType) : null; } else if (isNonNullType(type)) { const newType = getNewType(newTypeMap, type.ofType); return newType != null ? new GraphQLNonNull(newType) : null; } else if (isNamedType(type)) { const newType = newTypeMap[type.name]; return newType != null ? newType : null; } return null; } function mapFields(originalTypeMap, schema, schemaMapper) { const newTypeMap = {}; for (const typeName in originalTypeMap) { if (!typeName.startsWith('__')) { const originalType = originalTypeMap[typeName]; if (!isObjectType(originalType) && !isInterfaceType(originalType) && !isInputObjectType(originalType)) { newTypeMap[typeName] = originalType; continue; } const fieldMapper = getFieldMapper(schema, schemaMapper, typeName); if (fieldMapper == null) { newTypeMap[typeName] = originalType; continue; } const config = originalType.toConfig(); const originalFieldConfigMap = config.fields; const newFieldConfigMap = {}; for (const fieldName in originalFieldConfigMap) { const originalFieldConfig = originalFieldConfigMap[fieldName]; const mappedField = fieldMapper(originalFieldConfig, fieldName, typeName, schema); if (mappedField === undefined) { newFieldConfigMap[fieldName] = originalFieldConfig; } else if (Array.isArray(mappedField)) { const [newFieldName, newFieldConfig] = mappedField; if (newFieldConfig.astNode != null) { newFieldConfig.astNode = { ...newFieldConfig.astNode, name: { ...newFieldConfig.astNode.name, value: newFieldName, }, }; } newFieldConfigMap[newFieldName] = newFieldConfig === undefined ? originalFieldConfig : newFieldConfig; } else if (mappedField !== null) { newFieldConfigMap[fieldName] = mappedField; } } if (isObjectType(originalType)) { newTypeMap[typeName] = correctASTNodes(new GraphQLObjectType({ ...config, fields: newFieldConfigMap, })); } else if (isInterfaceType(originalType)) { newTypeMap[typeName] = correctASTNodes(new GraphQLInterfaceType({ ...config, fields: newFieldConfigMap, })); } else { newTypeMap[typeName] = correctASTNodes(new GraphQLInputObjectType({ ...config, fields: newFieldConfigMap, })); } } } return newTypeMap; } function mapArguments(originalTypeMap, schema, schemaMapper) { const newTypeMap = {}; for (const typeName in originalTypeMap) { if (!typeName.startsWith('__')) { const originalType = originalTypeMap[typeName]; if (!isObjectType(originalType) && !isInterfaceType(originalType)) { newTypeMap[typeName] = originalType; continue; } const argumentMapper = getArgumentMapper(schemaMapper); if (argumentMapper == null) { newTypeMap[typeName] = originalType; continue; } const config = originalType.toConfig(); const originalFieldConfigMap = config.fields; const newFieldConfigMap = {}; for (const fieldName in originalFieldConfigMap) { const originalFieldConfig = originalFieldConfigMap[fieldName]; const originalArgumentConfigMap = originalFieldConfig.args; if (originalArgumentConfigMap == null) { newFieldConfigMap[fieldName] = originalFieldConfig; continue; } const argumentNames = Object.keys(originalArgumentConfigMap); if (!argumentNames.length) { newFieldConfigMap[fieldName] = originalFieldConfig; continue; } const newArgumentConfigMap = {}; for (const argumentName of argumentNames) { const originalArgumentConfig = originalArgumentConfigMap[argumentName]; const mappedArgument = argumentMapper(originalArgumentConfig, fieldName, typeName, schema); if (mappedArgument === undefined) { newArgumentConfigMap[argumentName] = originalArgumentConfig; } else if (Array.isArray(mappedArgument)) { const [newArgumentName, newArgumentConfig] = mappedArgument; newArgumentConfigMap[newArgumentName] = newArgumentConfig; } else if (mappedArgument !== null) { newArgumentConfigMap[argumentName] = mappedArgument; } } newFieldConfigMap[fieldName] = { ...originalFieldConfig, args: newArgumentConfigMap, }; } if (isObjectType(originalType)) { newTypeMap[typeName] = new GraphQLObjectType({ ...config, fields: newFieldConfigMap, }); } else if (isInterfaceType(originalType)) { newTypeMap[typeName] = new GraphQLInterfaceType({ ...config, fields: newFieldConfigMap, }); } else { newTypeMap[typeName] = new GraphQLInputObjectType({ ...config, fields: newFieldConfigMap, }); } } } return newTypeMap; } function mapDirectives(originalDirectives, schema, schemaMapper) { const directiveMapper = getDirectiveMapper(schemaMapper); if (directiveMapper == null) { return originalDirectives.slice(); } const newDirectives = []; for (const directive of originalDirectives) { const mappedDirective = directiveMapper(directive, schema); if (mappedDirective === undefined) { newDirectives.push(directive); } else if (mappedDirective !== null) { newDirectives.push(mappedDirective); } } return newDirectives; } function getTypeSpecifiers(schema, typeName) { var _a, _b, _c; const type = schema.getType(typeName); const specifiers = [MapperKind.TYPE]; if (isObjectType(type)) { specifiers.push(MapperKind.COMPOSITE_TYPE, MapperKind.OBJECT_TYPE); if (typeName === ((_a = schema.getQueryType()) === null || _a === void 0 ? void 0 : _a.name)) { specifiers.push(MapperKind.ROOT_OBJECT, MapperKind.QUERY); } else if (typeName === ((_b = schema.getMutationType()) === null || _b === void 0 ? void 0 : _b.name)) { specifiers.push(MapperKind.ROOT_OBJECT, MapperKind.MUTATION); } else if (typeName === ((_c = schema.getSubscriptionType()) === null || _c === void 0 ? void 0 : _c.name)) { specifiers.push(MapperKind.ROOT_OBJECT, MapperKind.SUBSCRIPTION); } } else if (isInputObjectType(type)) { specifiers.push(MapperKind.INPUT_OBJECT_TYPE); } else if (isInterfaceType(type)) { specifiers.push(MapperKind.COMPOSITE_TYPE, MapperKind.ABSTRACT_TYPE, MapperKind.INTERFACE_TYPE); } else if (isUnionType(type)) { specifiers.push(MapperKind.COMPOSITE_TYPE, MapperKind.ABSTRACT_TYPE, MapperKind.UNION_TYPE); } else if (isEnumType(type)) { specifiers.push(MapperKind.ENUM_TYPE); } else if (isScalarType(type)) { specifiers.push(MapperKind.SCALAR_TYPE); } return specifiers; } function getTypeMapper(schema, schemaMapper, typeName) { const specifiers = getTypeSpecifiers(schema, typeName); let typeMapper; const stack = [...specifiers]; while (!typeMapper && stack.length > 0) { // It is safe to use the ! operator here as we check the length. const next = stack.pop(); typeMapper = schemaMapper[next]; } return typeMapper != null ? typeMapper : null; } function getFieldSpecifiers(schema, typeName) { var _a, _b, _c; const type = schema.getType(typeName); const specifiers = [MapperKind.FIELD]; if (isObjectType(type)) { specifiers.push(MapperKind.COMPOSITE_FIELD, MapperKind.OBJECT_FIELD); if (typeName === ((_a = schema.getQueryType()) === null || _a === void 0 ? void 0 : _a.name)) { specifiers.push(MapperKind.ROOT_FIELD, MapperKind.QUERY_ROOT_FIELD); } else if (typeName === ((_b = schema.getMutationType()) === null || _b === void 0 ? void 0 : _b.name)) { specifiers.push(MapperKind.ROOT_FIELD, MapperKind.MUTATION_ROOT_FIELD); } else if (typeName === ((_c = schema.getSubscriptionType()) === null || _c === void 0 ? void 0 : _c.name)) { specifiers.push(MapperKind.ROOT_FIELD, MapperKind.SUBSCRIPTION_ROOT_FIELD); } } else if (isInterfaceType(type)) { specifiers.push(MapperKind.COMPOSITE_FIELD, MapperKind.INTERFACE_FIELD); } else if (isInputObjectType(type)) { specifiers.push(MapperKind.INPUT_OBJECT_FIELD); } return specifiers; } function getFieldMapper(schema, schemaMapper, typeName) { const specifiers = getFieldSpecifiers(schema, typeName); let fieldMapper; const stack = [...specifiers]; while (!fieldMapper && stack.length > 0) { // It is safe to use the ! operator here as we check the length. const next = stack.pop(); // TODO: fix this as unknown cast fieldMapper = schemaMapper[next]; } return fieldMapper !== null && fieldMapper !== void 0 ? fieldMapper : null; } function getArgumentMapper(schemaMapper) { const argumentMapper = schemaMapper[MapperKind.ARGUMENT]; return argumentMapper != null ? argumentMapper : null; } function getDirectiveMapper(schemaMapper) { const directiveMapper = schemaMapper[MapperKind.DIRECTIVE]; return directiveMapper != null ? directiveMapper : null; } function getEnumValueMapper(schemaMapper) { const enumValueMapper = schemaMapper[MapperKind.ENUM_VALUE]; return enumValueMapper != null ? enumValueMapper : null; } function correctASTNodes(type) { if (isObjectType(type)) { const config = type.toConfig(); if (config.astNode != null) { const fields = []; for (const fieldName in config.fields) { const fieldConfig = config.fields[fieldName]; if (fieldConfig.astNode != null) { fields.push(fieldConfig.astNode); } } config.astNode = { ...config.astNode, kind: Kind.OBJECT_TYPE_DEFINITION, fields, }; } if (config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.map(node => ({ ...node, kind: Kind.OBJECT_TYPE_EXTENSION, fields: undefined, })); } return new GraphQLObjectType(config); } else if (isInterfaceType(type)) { const config = type.toConfig(); if (config.astNode != null) { const fields = []; for (const fieldName in config.fields) { const fieldConfig = config.fields[fieldName]; if (fieldConfig.astNode != null) { fields.push(fieldConfig.astNode); } } config.astNode = { ...config.astNode, kind: Kind.INTERFACE_TYPE_DEFINITION, fields, }; } if (config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.map(node => ({ ...node, kind: Kind.INTERFACE_TYPE_EXTENSION, fields: undefined, })); } return new GraphQLInterfaceType(config); } else if (isInputObjectType(type)) { const config = type.toConfig(); if (config.astNode != null) { const fields = []; for (const fieldName in config.fields) { const fieldConfig = config.fields[fieldName]; if (fieldConfig.astNode != null) { fields.push(fieldConfig.astNode); } } config.astNode = { ...config.astNode, kind: Kind.INPUT_OBJECT_TYPE_DEFINITION, fields, }; } if (config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.map(node => ({ ...node, kind: Kind.INPUT_OBJECT_TYPE_EXTENSION, fields: undefined, })); } return new GraphQLInputObjectType(config); } else if (isEnumType(type)) { const config = type.toConfig(); if (config.astNode != null) { const values = []; for (const enumKey in config.values) { const enumValueConfig = config.values[enumKey]; if (enumValueConfig.astNode != null) { values.push(enumValueConfig.astNode); } } config.astNode = { ...config.astNode, values, }; } if (config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.map(node => ({ ...node, values: undefined, })); } return new GraphQLEnumType(config); } else { return type; } } // Update any references to named schema types that disagree with the named // types found in schema.getTypeMap(). // // healSchema and its callers (visitSchema/visitSchemaDirectives) all modify the schema in place. // Therefore, private variables (such as the stored implementation map and the proper root types) // are not updated. // // If this causes issues, the schema could be more aggressively healed as follows: // // healSchema(schema); // const config = schema.toConfig() // const healedSchema = new GraphQLSchema({ // ...config, // query: schema.getType(''), // mutation: schema.getType(''), // subscription: schema.getType(''), // }); // // One can then also -- if necessary -- assign the correct private variables to the initial schema // as follows: // Object.assign(schema, healedSchema); // // These steps are not taken automatically to preserve backwards compatibility with graphql-tools v4. // See https://github.com/ardatan/graphql-tools/issues/1462 // // They were briefly taken in v5, but can now be phased out as they were only required when other // areas of the codebase were using healSchema and visitSchema more extensively. // function healSchema(schema) { healTypes(schema.getTypeMap(), schema.getDirectives()); return schema; } function healTypes(originalTypeMap, directives) { const actualNamedTypeMap = Object.create(null); // If any of the .name properties of the GraphQLNamedType objects in // schema.getTypeMap() have changed, the keys of the type map need to // be updated accordingly. for (const typeName in originalTypeMap) { const namedType = originalTypeMap[typeName]; if (namedType == null || typeName.startsWith('__')) { continue; } const actualName = namedType.name; if (actualName.startsWith('__')) { continue; } if (actualNamedTypeMap[actualName] != null) { console.warn(`Duplicate schema type name ${actualName} found; keeping the existing one found in the schema`); continue; } actualNamedTypeMap[actualName] = namedType; // Note: we are deliberately leaving namedType in the schema by its // original name (which might be different from actualName), so that // references by that name can be healed. } // Now add back every named type by its actual name. for (const typeName in actualNamedTypeMap) { const namedType = actualNamedTypeMap[typeName]; originalTypeMap[typeName] = namedType; } // Directive declaration argument types can refer to named types. for (const decl of directives) { decl.args = decl.args.filter(arg => { arg.type = healType(arg.type); return arg.type !== null; }); } for (const typeName in originalTypeMap) { const namedType = originalTypeMap[typeName]; // Heal all named types, except for dangling references, kept only to redirect. if (!typeName.startsWith('__') && typeName in actualNamedTypeMap) { if (namedType != null) { healNamedType(namedType); } } } for (const typeName in originalTypeMap) { if (!typeName.startsWith('__') && !(typeName in actualNamedTypeMap)) { delete originalTypeMap[typeName]; } } function healNamedType(type) { if (isObjectType(type)) { healFields(type); healInterfaces(type); return; } else if (isInterfaceType(type)) { healFields(type); if ('getInterfaces' in type) { healInterfaces(type); } return; } else if (isUnionType(type)) { healUnderlyingTypes(type); return; } else if (isInputObjectType(type)) { healInputFields(type); return; } else if (isLeafType(type)) { return; } throw new Error(`Unexpected schema type: ${type}`); } function healFields(type) { const fieldMap = type.getFields(); for (const [key, field] of Object.entries(fieldMap)) { field.args .map(arg => { arg.type = healType(arg.type); return arg.type === null ? null : arg; }) .filter(Boolean); field.type = healType(field.type); if (field.type === null) { delete fieldMap[key]; } } } function healInterfaces(type) { if ('getInterfaces' in type) { const interfaces = type.getInterfaces(); interfaces.push(...interfaces .splice(0) .map(iface => healType(iface)) .filter(Boolean)); } } function healInputFields(type) { const fieldMap = type.getFields(); for (const [key, field] of Object.entries(fieldMap)) { field.type = healType(field.type); if (field.type === null) { delete fieldMap[key]; } } } function healUnderlyingTypes(type) { const types = type.getTypes(); types.push(...types .splice(0) .map(t => healType(t)) .filter(Boolean)); } function healType(type) { // Unwrap the two known wrapper types if (isListType(type)) { const healedType = healType(type.ofType); return healedType != null ? new GraphQLList(healedType) : null; } else if (isNonNullType(type)) { const healedType = healType(type.ofType); return healedType != null ? new GraphQLNonNull(healedType) : null; } else if (isNamedType(type)) { // If a type annotation on a field or an argument or a union member is // any `GraphQLNamedType` with a `name`, then it must end up identical // to `schema.getType(name)`, since `schema.getTypeMap()` is the source // of truth for all named schema types. // Note that new types can still be simply added by adding a field, as // the official type will be undefined, not null. const officialType = originalTypeMap[type.name]; if (officialType && type !== officialType) { return officialType; } } return type; } } function forEachField(schema, fn) { const typeMap = schema.getTypeMap(); for (const typeName in typeMap) { const type = typeMap[typeName]; // TODO: maybe have an option to include these? if (!getNamedType(type).name.startsWith('__') && isObjectType(type)) { const fields = type.getFields(); for (const fieldName in fields) { const field = fields[fieldName]; fn(field, typeName, fieldName); } } } } function forEachDefaultValue(schema, fn) { const typeMap = schema.getTypeMap(); for (const typeName in typeMap) { const type = typeMap[typeName]; if (!getNamedType(type).name.startsWith('__')) { if (isObjectType(type)) { const fields = type.getFields(); for (const fieldName in fields) { const field = fields[fieldName]; for (const arg of field.args) { arg.defaultValue = fn(arg.type, arg.defaultValue); } } } else if (isInputObjectType(type)) { const fields = type.getFields(); for (const fieldName in fields) { const field = fields[fieldName]; field.defaultValue = fn(field.type, field.defaultValue); } } } } } function mergeDeep(sources, respectPrototype = false) { const target = sources[0] || {}; const output = {}; if (respectPrototype) { Object.setPrototypeOf(output, Object.create(Object.getPrototypeOf(target))); } for (const source of sources) { if (isObject$2(target) && isObject$2(source)) { if (respectPrototype) { const outputPrototype = Object.getPrototypeOf(output); const sourcePrototype = Object.getPrototypeOf(source); if (sourcePrototype) { for (const key of Object.getOwnPropertyNames(sourcePrototype)) { const descriptor = Object.getOwnPropertyDescriptor(sourcePrototype, key); if (isSome(descriptor)) { Object.defineProperty(outputPrototype, key, descriptor); } } } } for (const key in source) { if (isObject$2(source[key])) { if (!(key in output)) { Object.assign(output, { [key]: source[key] }); } else { output[key] = mergeDeep([output[key], source[key]], respectPrototype); } } else { Object.assign(output, { [key]: source[key] }); } } } } return output; } function isObject$2(item) { return item && typeof item === 'object' && !Array.isArray(item); } function isAsyncIterable(value) { return (typeof value === 'object' && value != null && Symbol.asyncIterator in value && typeof value[Symbol.asyncIterator] === 'function'); } function isDocumentNode(object) { return object && typeof object === 'object' && 'kind' in object && object.kind === Kind.DOCUMENT; } function assertResolversPresent(schema, resolverValidationOptions = {}) { const { requireResolversForArgs, requireResolversForNonScalar, requireResolversForAllFields } = resolverValidationOptions; if (requireResolversForAllFields && (requireResolversForArgs || requireResolversForNonScalar)) { throw new TypeError('requireResolversForAllFields takes precedence over the more specific assertions. ' + 'Please configure either requireResolversForAllFields or requireResolversForArgs / ' + 'requireResolversForNonScalar, but not a combination of them.'); } forEachField(schema, (field, typeName, fieldName) => { // requires a resolver for *every* field. if (requireResolversForAllFields) { expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName); } // requires a resolver on every field that has arguments if (requireResolversForArgs && field.args.length > 0) { expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName); } // requires a resolver on every field that returns a non-scalar type if (requireResolversForNonScalar !== 'ignore' && !isScalarType(getNamedType(field.type))) { expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName); } }); } function expectResolver(validator, behavior, field, typeName, fieldName) { if (!field.resolve) { const message = `Resolver missing for "${typeName}.${fieldName}". To disable this validator, use: resolverValidationOptions: { ${validator}: 'ignore' }`; if (behavior === 'error') { throw new Error(message); } if (behavior === 'warn') { console.warn(message); } return; } if (typeof field.resolve !== 'function') { throw new Error(`Resolver "${typeName}.${fieldName}" must be a function`); } } // If we have any union or interface types throw if no there is no resolveType resolver function checkForResolveTypeResolver(schema, requireResolversForResolveType) { mapSchema(schema, { [MapperKind.ABSTRACT_TYPE]: type => { if (!type.resolveType) { const message = `Type "${type.name}" is missing a "__resolveType" resolver. Pass 'ignore' into ` + '"resolverValidationOptions.requireResolversForResolveType" to disable this error.'; if (requireResolversForResolveType === 'error') { throw new Error(message); } if (requireResolversForResolveType === 'warn') { console.warn(message); } } return undefined; }, }); } function extendResolversFromInterfaces(schema, resolvers) { const extendedResolvers = {}; const typeMap = schema.getTypeMap(); for (const typeName in typeMap) { const type = typeMap[typeName]; if ('getInterfaces' in type) { extendedResolvers[typeName] = {}; for (const iFace of type.getInterfaces()) { if (resolvers[iFace.name]) { for (const fieldName in resolvers[iFace.name]) { if (fieldName === '__isTypeOf' || !fieldName.startsWith('__')) { extendedResolvers[typeName][fieldName] = resolvers[iFace.name][fieldName]; } } } } const typeResolvers = resolvers[typeName]; extendedResolvers[typeName] = { ...extendedResolvers[typeName], ...typeResolvers, }; } else { const typeResolvers = resolvers[typeName]; if (typeResolvers != null) { extendedResolvers[typeName] = typeResolvers; } } } return extendedResolvers; } function addResolversToSchema({ schema, resolvers: inputResolvers, defaultFieldResolver, resolverValidationOptions = {}, inheritResolversFromInterfaces = false, updateResolversInPlace = false, }) { const { requireResolversToMatchSchema = 'error', requireResolversForResolveType } = resolverValidationOptions; const resolvers = inheritResolversFromInterfaces ? extendResolversFromInterfaces(schema, inputResolvers) : inputResolvers; for (const typeName in resolvers) { const resolverValue = resolvers[typeName]; const resolverType = typeof resolverValue; if (resolverType !== 'object') { throw new Error(`"${typeName}" defined in resolvers, but has invalid value "${resolverValue}". The resolver's value must be of type object.`); } const type = schema.getType(typeName); if (type == null) { if (requireResolversToMatchSchema === 'ignore') { continue; } throw new Error(`"${typeName}" defined in resolvers, but not in schema`); } else if (isSpecifiedScalarType(type)) { // allow -- without recommending -- overriding of specified scalar types for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { type[fieldName.substring(2)] = resolverValue[fieldName]; } else { type[fieldName] = resolverValue[fieldName]; } } } else if (isEnumType(type)) { const values = type.getValues(); for (const fieldName in resolverValue) { if (!fieldName.startsWith('__') && !values.some(value => value.name === fieldName) && requireResolversToMatchSchema && requireResolversToMatchSchema !== 'ignore') { throw new Error(`${type.name}.${fieldName} was defined in resolvers, but not present within ${type.name}`); } } } else if (isUnionType(type)) { for (const fieldName in resolverValue) { if (!fieldName.startsWith('__') && requireResolversToMatchSchema && requireResolversToMatchSchema !== 'ignore') { throw new Error(`${type.name}.${fieldName} was defined in resolvers, but ${type.name} is not an object or interface type`); } } } else if (isObjectType(type) || isInterfaceType(type)) { for (const fieldName in resolverValue) { if (!fieldName.startsWith('__')) { const fields = type.getFields(); const field = fields[fieldName]; if (field == null) { // Field present in resolver but not in schema if (requireResolversToMatchSchema && requireResolversToMatchSchema !== 'ignore') { throw new Error(`${typeName}.${fieldName} defined in resolvers, but not in schema`); } } else { // Field present in both the resolver and schema const fieldResolve = resolverValue[fieldName]; if (typeof fieldResolve !== 'function' && typeof fieldResolve !== 'object') { throw new Error(`Resolver ${typeName}.${fieldName} must be object or function`); } } } } } } schema = updateResolversInPlace ? addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) : createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver); if (requireResolversForResolveType && requireResolversForResolveType !== 'ignore') { checkForResolveTypeResolver(schema, requireResolversForResolveType); } return schema; } function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; const typeMap = schema.getTypeMap(); for (const typeName in resolvers) { const type = schema.getType(typeName); const resolverValue = resolvers[typeName]; if (isScalarType(type)) { for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { type[fieldName.substring(2)] = resolverValue[fieldName]; } else if (fieldName === 'astNode' && type.astNode != null) { type.astNode = { ...type.astNode, description: (_b = (_a = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : type.astNode.description, directives: ((_c = type.astNode.directives) !== null && _c !== void 0 ? _c : []).concat((_e = (_d = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _d === void 0 ? void 0 : _d.directives) !== null && _e !== void 0 ? _e : []), }; } else if (fieldName === 'extensionASTNodes' && type.extensionASTNodes != null) { type.extensionASTNodes = type.extensionASTNodes.concat((_f = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.extensionASTNodes) !== null && _f !== void 0 ? _f : []); } else if (fieldName === 'extensions' && type.extensions != null && resolverValue.extensions != null) { type.extensions = Object.assign(Object.create(null), type.extensions, resolverValue.extensions); } else { type[fieldName] = resolverValue[fieldName]; } } } else if (isEnumType(type)) { const config = type.toConfig(); const enumValueConfigMap = config.values; for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { config[fieldName.substring(2)] = resolverValue[fieldName]; } else if (fieldName === 'astNode' && config.astNode != null) { config.astNode = { ...config.astNode, description: (_h = (_g = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _g === void 0 ? void 0 : _g.description) !== null && _h !== void 0 ? _h : config.astNode.description, directives: ((_j = config.astNode.directives) !== null && _j !== void 0 ? _j : []).concat((_l = (_k = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _k === void 0 ? void 0 : _k.directives) !== null && _l !== void 0 ? _l : []), }; } else if (fieldName === 'extensionASTNodes' && config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.concat((_m = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.extensionASTNodes) !== null && _m !== void 0 ? _m : []); } else if (fieldName === 'extensions' && type.extensions != null && resolverValue.extensions != null) { type.extensions = Object.assign(Object.create(null), type.extensions, resolverValue.extensions); } else if (enumValueConfigMap[fieldName]) { enumValueConfigMap[fieldName].value = resolverValue[fieldName]; } } typeMap[typeName] = new GraphQLEnumType(config); } else if (isUnionType(type)) { for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { type[fieldName.substring(2)] = resolverValue[fieldName]; } } } else if (isObjectType(type) || isInterfaceType(type)) { for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { // this is for isTypeOf and resolveType and all the other stuff. type[fieldName.substring(2)] = resolverValue[fieldName]; continue; } const fields = type.getFields(); const field = fields[fieldName]; if (field != null) { const fieldResolve = resolverValue[fieldName]; if (typeof fieldResolve === 'function') { // for convenience. Allows shorter syntax in resolver definition file field.resolve = fieldResolve.bind(resolverValue); } else { setFieldProperties(field, fieldResolve); } } } } } // serialize all default values prior to healing fields with new scalar/enum types. forEachDefaultValue(schema, serializeInputValue); // schema may have new scalar/enum types that require healing healSchema(schema); // reparse all default values with new parsing functions. forEachDefaultValue(schema, parseInputValue); if (defaultFieldResolver != null) { forEachField(schema, field => { if (!field.resolve) { field.resolve = defaultFieldResolver; } }); } return schema; } function createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver) { schema = mapSchema(schema, { [MapperKind.SCALAR_TYPE]: type => { var _a, _b, _c, _d, _e, _f; const config = type.toConfig(); const resolverValue = resolvers[type.name]; if (!isSpecifiedScalarType(type) && resolverValue != null) { for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { config[fieldName.substring(2)] = resolverValue[fieldName]; } else if (fieldName === 'astNode' && config.astNode != null) { config.astNode = { ...config.astNode, description: (_b = (_a = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : config.astNode.description, directives: ((_c = config.astNode.directives) !== null && _c !== void 0 ? _c : []).concat((_e = (_d = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _d === void 0 ? void 0 : _d.directives) !== null && _e !== void 0 ? _e : []), }; } else if (fieldName === 'extensionASTNodes' && config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.concat((_f = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.extensionASTNodes) !== null && _f !== void 0 ? _f : []); } else if (fieldName === 'extensions' && config.extensions != null && resolverValue.extensions != null) { config.extensions = Object.assign(Object.create(null), type.extensions, resolverValue.extensions); } else { config[fieldName] = resolverValue[fieldName]; } } return new GraphQLScalarType(config); } }, [MapperKind.ENUM_TYPE]: type => { var _a, _b, _c, _d, _e, _f; const resolverValue = resolvers[type.name]; const config = type.toConfig(); const enumValueConfigMap = config.values; if (resolverValue != null) { for (const fieldName in resolverValue) { if (fieldName.startsWith('__')) { config[fieldName.substring(2)] = resolverValue[fieldName]; } else if (fieldName === 'astNode' && config.astNode != null) { config.astNode = { ...config.astNode, description: (_b = (_a = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : config.astNode.description, directives: ((_c = config.astNode.directives) !== null && _c !== void 0 ? _c : []).concat((_e = (_d = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.astNode) === null || _d === void 0 ? void 0 : _d.directives) !== null && _e !== void 0 ? _e : []), }; } else if (fieldName === 'extensionASTNodes' && config.extensionASTNodes != null) { config.extensionASTNodes = config.extensionASTNodes.concat((_f = resolverValue === null || resolverValue === void 0 ? void 0 : resolverValue.extensionASTNodes) !== null && _f !== void 0 ? _f : []); } else if (fieldName === 'extensions' && config.extensions != null && resolverValue.extensions != null) { config.extensions = Object.assign(Object.create(null), type.extensions, resolverValue.extensions); } else if (enumValueConfigMap[fieldName]) { enumValueConfigMap[fieldName].value = resolverValue[fieldName]; } } return new GraphQLEnumType(config); } }, [MapperKind.UNION_TYPE]: type => { const resolverValue = resolvers[type.name]; if (resolverValue != null) { const config = type.toConfig(); if (resolverValue['__resolveType']) { config.resolveType = resolverValue['__resolveType']; } return new GraphQLUnionType(config); } }, [MapperKind.OBJECT_TYPE]: type => { const resolverValue = resolvers[type.name]; if (resolverValue != null) { const config = type.toConfig(); if (resolverValue['__isTypeOf']) { config.isTypeOf = resolverValue['__isTypeOf']; } return new GraphQLObjectType(config); } }, [MapperKind.INTERFACE_TYPE]: type => { const resolverValue = resolvers[type.name]; if (resolverValue != null) { const config = type.toConfig(); if (resolverValue['__resolveType']) { config.resolveType = resolverValue['__resolveType']; } return new GraphQLInterfaceType(config); } }, [MapperKind.COMPOSITE_FIELD]: (fieldConfig, fieldName, typeName) => { const resolverValue = resolvers[typeName]; if (resolverValue != null) { const fieldResolve = resolverValue[fieldName]; if (fieldResolve != null) { const newFieldConfig = { ...fieldConfig }; if (typeof fieldResolve === 'function') { // for convenience. Allows shorter syntax in resolver definition file newFieldConfig.resolve = fieldResolve.bind(resolverValue); } else { setFieldProperties(newFieldConfig, fieldResolve); } return newFieldConfig; } } }, }); if (defaultFieldResolver != null) { schema = mapSchema(schema, { [MapperKind.OBJECT_FIELD]: fieldConfig => ({ ...fieldConfig, resolve: fieldConfig.resolve != null ? fieldConfig.resolve : defaultFieldResolver, }), }); } return schema; } function setFieldProperties(field, propertiesObj) { for (const propertyName in propertiesObj) { field[propertyName] = propertiesObj[propertyName]; } } /** * Deep merges multiple resolver definition objects into a single definition. * @param resolversDefinitions Resolver definitions to be merged * @param options Additional options * * ```js * const { mergeResolvers } = require('@graphql-tools/merge'); * const clientResolver = require('./clientResolver'); * const productResolver = require('./productResolver'); * * const resolvers = mergeResolvers([ * clientResolver, * productResolver, * ]); * ``` * * If you don't want to manually create the array of resolver objects, you can * also use this function along with loadFiles: * * ```js * const path = require('path'); * const { mergeResolvers } = require('@graphql-tools/merge'); * const { loadFilesSync } = require('@graphql-tools/load-files'); * * const resolversArray = loadFilesSync(path.join(__dirname, './resolvers')); * * const resolvers = mergeResolvers(resolversArray) * ``` */ function mergeResolvers(resolversDefinitions, options) { if (!resolversDefinitions || (Array.isArray(resolversDefinitions) && resolversDefinitions.length === 0)) { return {}; } if (!Array.isArray(resolversDefinitions)) { return resolversDefinitions; } if (resolversDefinitions.length === 1) { return resolversDefinitions[0] || {}; } const resolvers = new Array(); for (let resolversDefinition of resolversDefinitions) { if (Array.isArray(resolversDefinition)) { resolversDefinition = mergeResolvers(resolversDefinition); } if (typeof resolversDefinition === 'object' && resolversDefinition) { resolvers.push(resolversDefinition); } } const result = mergeDeep(resolvers, true); if (options === null || options === void 0 ? void 0 : options.exclusions) { for (const exclusion of options.exclusions) { const [typeName, fieldName] = exclusion.split('.'); if (!fieldName || fieldName === '*') { delete result[typeName]; } else if (result[typeName]) { delete result[typeName][fieldName]; } } } return result; } function mergeArguments$1(args1, args2, config) { const result = deduplicateArguments([...args2, ...args1].filter(isSome)); if (config && config.sort) { result.sort(compareNodes); } return result; } function deduplicateArguments(args) { return args.reduce((acc, current) => { const dup = acc.find(arg => arg.name.value === current.name.value); if (!dup) { return acc.concat([current]); } return acc; }, []); } function directiveAlreadyExists(directivesArr, otherDirective) { return !!directivesArr.find(directive => directive.name.value === otherDirective.name.value); } function nameAlreadyExists(name, namesArr) { return namesArr.some(({ value }) => value === name.value); } function mergeArguments(a1, a2) { const result = [...a2]; for (const argument of a1) { const existingIndex = result.findIndex(a => a.name.value === argument.name.value); if (existingIndex > -1) { const existingArg = result[existingIndex]; if (existingArg.value.kind === 'ListValue') { const source = existingArg.value.values; const target = argument.value.values; // merge values of two lists existingArg.value.values = deduplicateLists(source, target, (targetVal, source) => { const value = targetVal.value; return !value || !source.some((sourceVal) => sourceVal.value === value); }); } else { existingArg.value = argument.value; } } else { result.push(argument); } } return result; } function deduplicateDirectives(directives) { return directives .map((directive, i, all) => { const firstAt = all.findIndex(d => d.name.value === directive.name.value); if (firstAt !== i) { const dup = all[firstAt]; directive.arguments = mergeArguments(directive.arguments, dup.arguments); return null; } return directive; }) .filter(isSome); } function mergeDirectives(d1 = [], d2 = [], config) { const reverseOrder = config && config.reverseDirectives; const asNext = reverseOrder ? d1 : d2; const asFirst = reverseOrder ? d2 : d1; const result = deduplicateDirectives([...asNext]); for (const directive of asFirst) { if (directiveAlreadyExists(result, directive)) { const existingDirectiveIndex = result.findIndex(d => d.name.value === directive.name.value); const existingDirective = result[existingDirectiveIndex]; result[existingDirectiveIndex].arguments = mergeArguments(directive.arguments || [], existingDirective.arguments || []); } else { result.push(directive); } } return result; } function validateInputs(node, existingNode) { const printedNode = print({ ...node, description: undefined, }); const printedExistingNode = print({ ...existingNode, description: undefined, }); // eslint-disable-next-line const leaveInputs = new RegExp('(directive @w*d*)|( on .*$)', 'g'); const sameArguments = printedNode.replace(leaveInputs, '') === printedExistingNode.replace(leaveInputs, ''); if (!sameArguments) { throw new Error(`Unable to merge GraphQL directive "${node.name.value}". \nExisting directive: \n\t${printedExistingNode} \nReceived directive: \n\t${printedNode}`); } } function mergeDirective(node, existingNode) { if (existingNode) { validateInputs(node, existingNode); return { ...node, locations: [ ...existingNode.locations, ...node.locations.filter(name => !nameAlreadyExists(name, existingNode.locations)), ], }; } return node; } function deduplicateLists(source, target, filterFn) { return source.concat(target.filter(val => filterFn(val, source))); } function mergeEnumValues(first, second, config) { if (config === null || config === void 0 ? void 0 : config.consistentEnumMerge) { const reversed = []; if (first) { reversed.push(...first); } first = second; second = reversed; } const enumValueMap = new Map(); if (first) { for (const firstValue of first) { enumValueMap.set(firstValue.name.value, firstValue); } } if (second) { for (const secondValue of second) { const enumValue = secondValue.name.value; if (enumValueMap.has(enumValue)) { const firstValue = enumValueMap.get(enumValue); firstValue.description = secondValue.description || firstValue.description; firstValue.directives = mergeDirectives(secondValue.directives, firstValue.directives); } else { enumValueMap.set(enumValue, secondValue); } } } const result = [...enumValueMap.values()]; if (config && config.sort) { result.sort(compareNodes); } return result; } function mergeEnum(e1, e2, config) { if (e2) { return { name: e1.name, description: e1['description'] || e2['description'], kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || e1.kind === 'EnumTypeDefinition' || e2.kind === 'EnumTypeDefinition' ? 'EnumTypeDefinition' : 'EnumTypeExtension', loc: e1.loc, directives: mergeDirectives(e1.directives, e2.directives, config), values: mergeEnumValues(e1.values, e2.values, config), }; } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...e1, kind: Kind.ENUM_TYPE_DEFINITION, } : e1; } function isStringTypes(types) { return typeof types === 'string'; } function isSourceTypes(types) { return types instanceof Source; } function extractType(type) { let visitedType = type; while (visitedType.kind === Kind.LIST_TYPE || visitedType.kind === 'NonNullType') { visitedType = visitedType.type; } return visitedType; } function isWrappingTypeNode(type) { return type.kind !== Kind.NAMED_TYPE; } function isListTypeNode(type) { return type.kind === Kind.LIST_TYPE; } function isNonNullTypeNode(type) { return type.kind === Kind.NON_NULL_TYPE; } function printTypeNode(type) { if (isListTypeNode(type)) { return `[${printTypeNode(type.type)}]`; } if (isNonNullTypeNode(type)) { return `${printTypeNode(type.type)}!`; } return type.name.value; } var CompareVal; (function (CompareVal) { CompareVal[CompareVal["A_SMALLER_THAN_B"] = -1] = "A_SMALLER_THAN_B"; CompareVal[CompareVal["A_EQUALS_B"] = 0] = "A_EQUALS_B"; CompareVal[CompareVal["A_GREATER_THAN_B"] = 1] = "A_GREATER_THAN_B"; })(CompareVal || (CompareVal = {})); function defaultStringComparator(a, b) { if (a == null && b == null) { return CompareVal.A_EQUALS_B; } if (a == null) { return CompareVal.A_SMALLER_THAN_B; } if (b == null) { return CompareVal.A_GREATER_THAN_B; } if (a < b) return CompareVal.A_SMALLER_THAN_B; if (a > b) return CompareVal.A_GREATER_THAN_B; return CompareVal.A_EQUALS_B; } function fieldAlreadyExists(fieldsArr, otherField, config) { const result = fieldsArr.find(field => field.name.value === otherField.name.value); if (result && !(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) { const t1 = extractType(result.type); const t2 = extractType(otherField.type); if (t1.name.value !== t2.name.value) { throw new Error(`Field "${otherField.name.value}" already defined with a different type. Declared as "${t1.name.value}", but you tried to override with "${t2.name.value}"`); } } return !!result; } function mergeFields(type, f1, f2, config) { const result = []; if (f2 != null) { result.push(...f2); } if (f1 != null) { for (const field of f1) { if (fieldAlreadyExists(result, field, config)) { const existing = result.find((f) => f.name.value === field.name.value); if (!(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) { if (config === null || config === void 0 ? void 0 : config.throwOnConflict) { preventConflicts(type, existing, field, false); } else { preventConflicts(type, existing, field, true); } if (isNonNullTypeNode(field.type) && !isNonNullTypeNode(existing.type)) { existing.type = field.type; } } existing.arguments = mergeArguments$1(field['arguments'] || [], existing.arguments || [], config); existing.directives = mergeDirectives(field.directives, existing.directives, config); existing.description = field.description || existing.description; } else { result.push(field); } } } if (config && config.sort) { result.sort(compareNodes); } if (config && config.exclusions) { const exclusions = config.exclusions; return result.filter(field => !exclusions.includes(`${type.name.value}.${field.name.value}`)); } return result; } function preventConflicts(type, a, b, ignoreNullability = false) { const aType = printTypeNode(a.type); const bType = printTypeNode(b.type); if (aType !== bType && !safeChangeForFieldType(a.type, b.type, ignoreNullability)) { throw new Error(`Field '${type.name.value}.${a.name.value}' changed type from '${aType}' to '${bType}'`); } } function safeChangeForFieldType(oldType, newType, ignoreNullability = false) { // both are named if (!isWrappingTypeNode(oldType) && !isWrappingTypeNode(newType)) { return oldType.toString() === newType.toString(); } // new is non-null if (isNonNullTypeNode(newType)) { const ofType = isNonNullTypeNode(oldType) ? oldType.type : oldType; return safeChangeForFieldType(ofType, newType.type); } // old is non-null if (isNonNullTypeNode(oldType)) { return safeChangeForFieldType(newType, oldType, ignoreNullability); } // old is list if (isListTypeNode(oldType)) { return ((isListTypeNode(newType) && safeChangeForFieldType(oldType.type, newType.type)) || (isNonNullTypeNode(newType) && safeChangeForFieldType(oldType, newType['type']))); } return false; } function mergeInputType(node, existingNode, config) { if (existingNode) { try { return { name: node.name, description: node['description'] || existingNode['description'], kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || node.kind === 'InputObjectTypeDefinition' || existingNode.kind === 'InputObjectTypeDefinition' ? 'InputObjectTypeDefinition' : 'InputObjectTypeExtension', loc: node.loc, fields: mergeFields(node, node.fields, existingNode.fields, config), directives: mergeDirectives(node.directives, existingNode.directives, config), }; } catch (e) { throw new Error(`Unable to merge GraphQL input type "${node.name.value}": ${e.message}`); } } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...node, kind: Kind.INPUT_OBJECT_TYPE_DEFINITION, } : node; } function mergeInterface(node, existingNode, config) { if (existingNode) { try { return { name: node.name, description: node['description'] || existingNode['description'], kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || node.kind === 'InterfaceTypeDefinition' || existingNode.kind === 'InterfaceTypeDefinition' ? 'InterfaceTypeDefinition' : 'InterfaceTypeExtension', loc: node.loc, fields: mergeFields(node, node.fields, existingNode.fields, config), directives: mergeDirectives(node.directives, existingNode.directives, config), interfaces: node['interfaces'] ? mergeNamedTypeArray(node['interfaces'], existingNode['interfaces'], config) : undefined, }; } catch (e) { throw new Error(`Unable to merge GraphQL interface "${node.name.value}": ${e.message}`); } } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...node, kind: Kind.INTERFACE_TYPE_DEFINITION, } : node; } function alreadyExists(arr, other) { return !!arr.find(i => i.name.value === other.name.value); } function mergeNamedTypeArray(first = [], second = [], config = {}) { const result = [...second, ...first.filter(d => !alreadyExists(second, d))]; if (config && config.sort) { result.sort(compareNodes); } return result; } function mergeType(node, existingNode, config) { if (existingNode) { try { return { name: node.name, description: node['description'] || existingNode['description'], kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || node.kind === 'ObjectTypeDefinition' || existingNode.kind === 'ObjectTypeDefinition' ? 'ObjectTypeDefinition' : 'ObjectTypeExtension', loc: node.loc, fields: mergeFields(node, node.fields, existingNode.fields, config), directives: mergeDirectives(node.directives, existingNode.directives, config), interfaces: mergeNamedTypeArray(node.interfaces, existingNode.interfaces, config), }; } catch (e) { throw new Error(`Unable to merge GraphQL type "${node.name.value}": ${e.message}`); } } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...node, kind: Kind.OBJECT_TYPE_DEFINITION, } : node; } function mergeScalar(node, existingNode, config) { if (existingNode) { return { name: node.name, description: node['description'] || existingNode['description'], kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || node.kind === 'ScalarTypeDefinition' || existingNode.kind === 'ScalarTypeDefinition' ? 'ScalarTypeDefinition' : 'ScalarTypeExtension', loc: node.loc, directives: mergeDirectives(node.directives, existingNode.directives, config), }; } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...node, kind: Kind.SCALAR_TYPE_DEFINITION, } : node; } function mergeUnion(first, second, config) { if (second) { return { name: first.name, description: first['description'] || second['description'], // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility directives: mergeDirectives(first.directives, second.directives, config), kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || first.kind === 'UnionTypeDefinition' || second.kind === 'UnionTypeDefinition' ? Kind.UNION_TYPE_DEFINITION : Kind.UNION_TYPE_EXTENSION, loc: first.loc, types: mergeNamedTypeArray(first.types, second.types, config), }; } return (config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...first, kind: Kind.UNION_TYPE_DEFINITION, } : first; } const DEFAULT_OPERATION_TYPE_NAME_MAP = { query: 'Query', mutation: 'Mutation', subscription: 'Subscription', }; function mergeOperationTypes(opNodeList = [], existingOpNodeList = []) { const finalOpNodeList = []; for (const opNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) { const opNode = opNodeList.find(n => n.operation === opNodeType) || existingOpNodeList.find(n => n.operation === opNodeType); if (opNode) { finalOpNodeList.push(opNode); } } return finalOpNodeList; } function mergeSchemaDefs(node, existingNode, config) { if (existingNode) { return { kind: node.kind === Kind.SCHEMA_DEFINITION || existingNode.kind === Kind.SCHEMA_DEFINITION ? Kind.SCHEMA_DEFINITION : Kind.SCHEMA_EXTENSION, description: node['description'] || existingNode['description'], directives: mergeDirectives(node.directives, existingNode.directives, config), operationTypes: mergeOperationTypes(node.operationTypes, existingNode.operationTypes), }; } return ((config === null || config === void 0 ? void 0 : config.convertExtensions) ? { ...node, kind: Kind.SCHEMA_DEFINITION, } : node); } const schemaDefSymbol = 'SCHEMA_DEF_SYMBOL'; function isNamedDefinitionNode(definitionNode) { return 'name' in definitionNode; } function mergeGraphQLNodes(nodes, config) { var _a, _b, _c; const mergedResultMap = {}; for (const nodeDefinition of nodes) { if (isNamedDefinitionNode(nodeDefinition)) { const name = (_a = nodeDefinition.name) === null || _a === void 0 ? void 0 : _a.value; if (config === null || config === void 0 ? void 0 : config.commentDescriptions) { collectComment(nodeDefinition); } if (name == null) { continue; } if (((_b = config === null || config === void 0 ? void 0 : config.exclusions) === null || _b === void 0 ? void 0 : _b.includes(name + '.*')) || ((_c = config === null || config === void 0 ? void 0 : config.exclusions) === null || _c === void 0 ? void 0 : _c.includes(name))) { delete mergedResultMap[name]; } else { switch (nodeDefinition.kind) { case Kind.OBJECT_TYPE_DEFINITION: case Kind.OBJECT_TYPE_EXTENSION: mergedResultMap[name] = mergeType(nodeDefinition, mergedResultMap[name], config); break; case Kind.ENUM_TYPE_DEFINITION: case Kind.ENUM_TYPE_EXTENSION: mergedResultMap[name] = mergeEnum(nodeDefinition, mergedResultMap[name], config); break; case Kind.UNION_TYPE_DEFINITION: case Kind.UNION_TYPE_EXTENSION: mergedResultMap[name] = mergeUnion(nodeDefinition, mergedResultMap[name], config); break; case Kind.SCALAR_TYPE_DEFINITION: case Kind.SCALAR_TYPE_EXTENSION: mergedResultMap[name] = mergeScalar(nodeDefinition, mergedResultMap[name], config); break; case Kind.INPUT_OBJECT_TYPE_DEFINITION: case Kind.INPUT_OBJECT_TYPE_EXTENSION: mergedResultMap[name] = mergeInputType(nodeDefinition, mergedResultMap[name], config); break; case Kind.INTERFACE_TYPE_DEFINITION: case Kind.INTERFACE_TYPE_EXTENSION: mergedResultMap[name] = mergeInterface(nodeDefinition, mergedResultMap[name], config); break; case Kind.DIRECTIVE_DEFINITION: mergedResultMap[name] = mergeDirective(nodeDefinition, mergedResultMap[name]); break; } } } else if (nodeDefinition.kind === Kind.SCHEMA_DEFINITION || nodeDefinition.kind === Kind.SCHEMA_EXTENSION) { mergedResultMap[schemaDefSymbol] = mergeSchemaDefs(nodeDefinition, mergedResultMap[schemaDefSymbol], config); } } return mergedResultMap; } function mergeTypeDefs(typeSource, config) { resetComments(); const doc = { kind: Kind.DOCUMENT, definitions: mergeGraphQLTypes(typeSource, { useSchemaDefinition: true, forceSchemaDefinition: false, throwOnConflict: false, commentDescriptions: false, ...config, }), }; let result; if (config === null || config === void 0 ? void 0 : config.commentDescriptions) { result = printWithComments(doc); } else { result = doc; } resetComments(); return result; } function visitTypeSources(typeSource, options, allNodes = [], visitedTypeSources = new Set()) { if (typeSource && !visitedTypeSources.has(typeSource)) { visitedTypeSources.add(typeSource); if (typeof typeSource === 'function') { visitTypeSources(typeSource(), options, allNodes, visitedTypeSources); } else if (Array.isArray(typeSource)) { for (const type of typeSource) { visitTypeSources(type, options, allNodes, visitedTypeSources); } } else if (isSchema(typeSource)) { const documentNode = getDocumentNodeFromSchema(typeSource, options); visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources); } else if (isStringTypes(typeSource) || isSourceTypes(typeSource)) { const documentNode = parse(typeSource, options); visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources); } else if (typeof typeSource === 'object' && isDefinitionNode(typeSource)) { allNodes.push(typeSource); } else if (isDocumentNode(typeSource)) { visitTypeSources(typeSource.definitions, options, allNodes, visitedTypeSources); } else { throw new Error(`typeDefs must contain only strings, documents, schemas, or functions, got ${typeof typeSource}`); } } return allNodes; } function mergeGraphQLTypes(typeSource, config) { var _a, _b, _c; resetComments(); const allNodes = visitTypeSources(typeSource, config); const mergedNodes = mergeGraphQLNodes(allNodes, config); if (config === null || config === void 0 ? void 0 : config.useSchemaDefinition) { // XXX: right now we don't handle multiple schema definitions const schemaDef = mergedNodes[schemaDefSymbol] || { kind: Kind.SCHEMA_DEFINITION, operationTypes: [], }; const operationTypes = schemaDef.operationTypes; for (const opTypeDefNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) { const opTypeDefNode = operationTypes.find(operationType => operationType.operation === opTypeDefNodeType); if (!opTypeDefNode) { const possibleRootTypeName = DEFAULT_OPERATION_TYPE_NAME_MAP[opTypeDefNodeType]; const existingPossibleRootType = mergedNodes[possibleRootTypeName]; if (existingPossibleRootType != null && existingPossibleRootType.name != null) { operationTypes.push({ kind: Kind.OPERATION_TYPE_DEFINITION, type: { kind: Kind.NAMED_TYPE, name: existingPossibleRootType.name, }, operation: opTypeDefNodeType, }); } } } if (((_a = schemaDef === null || schemaDef === void 0 ? void 0 : schemaDef.operationTypes) === null || _a === void 0 ? void 0 : _a.length) != null && schemaDef.operationTypes.length > 0) { mergedNodes[schemaDefSymbol] = schemaDef; } } if ((config === null || config === void 0 ? void 0 : config.forceSchemaDefinition) && !((_c = (_b = mergedNodes[schemaDefSymbol]) === null || _b === void 0 ? void 0 : _b.operationTypes) === null || _c === void 0 ? void 0 : _c.length)) { mergedNodes[schemaDefSymbol] = { kind: Kind.SCHEMA_DEFINITION, operationTypes: [ { kind: Kind.OPERATION_TYPE_DEFINITION, operation: 'query', type: { kind: Kind.NAMED_TYPE, name: { kind: Kind.NAME, value: 'Query', }, }, }, ], }; } const mergedNodeDefinitions = Object.values(mergedNodes); if (config === null || config === void 0 ? void 0 : config.sort) { const sortFn = typeof config.sort === 'function' ? config.sort : defaultStringComparator; mergedNodeDefinitions.sort((a, b) => { var _a, _b; return sortFn((_a = a.name) === null || _a === void 0 ? void 0 : _a.value, (_b = b.name) === null || _b === void 0 ? void 0 : _b.value); }); } return mergedNodeDefinitions; } function mergeExtensions(extensions) { return mergeDeep(extensions); } function applyExtensionObject(obj, extensions) { if (!obj) { return; } obj.extensions = mergeDeep([obj.extensions || {}, extensions || {}]); } function applyExtensions(schema, extensions) { applyExtensionObject(schema, extensions.schemaExtensions); for (const [typeName, data] of Object.entries(extensions.types || {})) { const type = schema.getType(typeName); if (type) { applyExtensionObject(type, data.extensions); if (data.type === 'object' || data.type === 'interface') { for (const [fieldName, fieldData] of Object.entries(data.fields)) { const field = type.getFields()[fieldName]; if (field) { applyExtensionObject(field, fieldData.extensions); for (const [arg, argData] of Object.entries(fieldData.arguments)) { applyExtensionObject(field.args.find(a => a.name === arg), argData); } } } } else if (data.type === 'input') { for (const [fieldName, fieldData] of Object.entries(data.fields)) { const field = type.getFields()[fieldName]; applyExtensionObject(field, fieldData.extensions); } } else if (data.type === 'enum') { for (const [valueName, valueData] of Object.entries(data.values)) { const value = type.getValue(valueName); applyExtensionObject(value, valueData); } } } } return schema; } /** * Builds a schema from the provided type definitions and resolvers. * * The type definitions are written using Schema Definition Language (SDL). They * can be provided as a string, a `DocumentNode`, a function, or an array of any * of these. If a function is provided, it will be passed no arguments and * should return an array of strings or `DocumentNode`s. * * Note: You can use GraphQL magic comment provide additional syntax * highlighting in your editor (with the appropriate editor plugin). * * ```js * const typeDefs = /* GraphQL *\/ ` * type Query { * posts: [Post] * author(id: Int!): Author * } * `; * ``` * * The `resolvers` object should be a map of type names to nested object, which * themselves map the type's fields to their appropriate resolvers. * See the [Resolvers](/docs/resolvers) section of the documentation for more details. * * ```js * const resolvers = { * Query: { * posts: (obj, args, ctx, info) => getAllPosts(), * author: (obj, args, ctx, info) => getAuthorById(args.id) * } * }; * ``` * * Once you've defined both the `typeDefs` and `resolvers`, you can create your * schema: * * ```js * const schema = makeExecutableSchema({ * typeDefs, * resolvers, * }) * ``` */ function makeExecutableSchema({ typeDefs, resolvers = {}, resolverValidationOptions = {}, inheritResolversFromInterfaces = false, updateResolversInPlace = false, schemaExtensions, ...otherOptions }) { // Validate and clean up arguments if (typeof resolverValidationOptions !== 'object') { throw new Error('Expected `resolverValidationOptions` to be an object'); } if (!typeDefs) { throw new Error('Must provide typeDefs'); } let schema; if (isSchema(typeDefs)) { schema = typeDefs; } else if (otherOptions === null || otherOptions === void 0 ? void 0 : otherOptions.commentDescriptions) { const mergedTypeDefs = mergeTypeDefs(typeDefs, { ...otherOptions, commentDescriptions: true, }); schema = buildSchema(mergedTypeDefs, otherOptions); } else { const mergedTypeDefs = mergeTypeDefs(typeDefs, otherOptions); schema = buildASTSchema(mergedTypeDefs, otherOptions); } // We allow passing in an array of resolver maps, in which case we merge them schema = addResolversToSchema({ schema, resolvers: mergeResolvers(resolvers), resolverValidationOptions, inheritResolversFromInterfaces, updateResolversInPlace, }); if (Object.keys(resolverValidationOptions).length > 0) { assertResolversPresent(schema, resolverValidationOptions); } if (schemaExtensions) { schemaExtensions = mergeExtensions(asArray$1(schemaExtensions)); applyExtensions(schema, schemaExtensions); } return schema; } const { fileURLToPath } = Url; const { createReadStream } = require$$1$1; var handleFileRequest$1 = function handleFileRequest(url, Response) { return new Response( createReadStream(fileURLToPath(url)), ) }; var eventTargetPolyfill = {}; var hasRequiredEventTargetPolyfill; function requireEventTargetPolyfill () { if (hasRequiredEventTargetPolyfill) return eventTargetPolyfill; hasRequiredEventTargetPolyfill = 1; const root = (typeof globalThis !== "undefined" && globalThis) || (typeof self !== "undefined" && self) || (typeof commonjsGlobal !== "undefined" && commonjsGlobal); function isConstructor(fn) { try { new fn(); } catch (error) { return false; } return true; } if (typeof root.Event !== "function" || !isConstructor(root.Event)) { root.Event = (function () { function Event(type, options) { this.bubbles = !!options && !!options.bubbles; this.cancelable = !!options && !!options.cancelable; this.composed = !!options && !!options.composed; this.type = type; } return Event; })(); } if (typeof root.EventTarget === "undefined" || !isConstructor(root.Event)) { root.EventTarget = (function () { function EventTarget() { this.__listeners = new Map(); } EventTarget.prototype = Object.create(Object.prototype); EventTarget.prototype.addEventListener = function ( type, listener, options ) { if (arguments.length < 2) { throw new TypeError( `TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.` ); } const __listeners = this.__listeners; const actualType = type.toString(); if (!__listeners.has(actualType)) { __listeners.set(actualType, new Map()); } const listenersForType = __listeners.get(actualType); if (!listenersForType.has(listener)) { // Any given listener is only registered once listenersForType.set(listener, options); } }; EventTarget.prototype.removeEventListener = function ( type, listener, _options ) { if (arguments.length < 2) { throw new TypeError( `TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.` ); } const __listeners = this.__listeners; const actualType = type.toString(); if (__listeners.has(actualType)) { const listenersForType = __listeners.get(actualType); if (listenersForType.has(listener)) { listenersForType.delete(listener); } } }; EventTarget.prototype.dispatchEvent = function (event) { if (!(event instanceof Event)) { throw new TypeError( `Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.` ); } const type = event.type; const __listeners = this.__listeners; const listenersForType = __listeners.get(type); if (listenersForType) { for (const [listener, options] of listenersForType.entries()) { try { if (typeof listener === "function") { // Listener functions must be executed with the EventTarget as the `this` context. listener.call(this, event); } else if (listener && typeof listener.handleEvent === "function") { // Listener objects have their handleEvent method called, if they have one listener.handleEvent(event); } } catch (err) { // We need to report the error to the global error handling event, // but we do not want to break the loop that is executing the events. // Unfortunately, this is the best we can do, which isn't great, because the // native EventTarget will actually do this synchronously before moving to the next // event in the loop. setTimeout(() => { throw err; }); } if (options && options.once) { // If this was registered with { once: true }, we need // to remove it now. listenersForType.delete(listener); } } } // Since there are no cancellable events on a base EventTarget, // this should always return true. return true; }; return EventTarget; })(); } return eventTargetPolyfill; } /** * @author Toru Nagashima * @copyright 2015 Toru Nagashima. All rights reserved. * See LICENSE file in root directory for full license. */ /** * @typedef {object} PrivateData * @property {EventTarget} eventTarget The event target. * @property {{type:string}} event The original event object. * @property {number} eventPhase The current event phase. * @property {EventTarget|null} currentTarget The current event target. * @property {boolean} canceled The flag to prevent default. * @property {boolean} stopped The flag to stop propagation. * @property {boolean} immediateStopped The flag to stop propagation immediately. * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null. * @property {number} timeStamp The unix time. * @private */ /** * Private data for event wrappers. * @type {WeakMap} * @private */ const privateData = new WeakMap(); /** * Cache for wrapper classes. * @type {WeakMap} * @private */ const wrappers = new WeakMap(); /** * Get private data. * @param {Event} event The event object to get private data. * @returns {PrivateData} The private data of the event. * @private */ function pd(event) { const retv = privateData.get(event); console.assert( retv != null, "'this' is expected an Event object, but got", event ); return retv } /** * https://dom.spec.whatwg.org/#set-the-canceled-flag * @param data {PrivateData} private data. */ function setCancelFlag(data) { if (data.passiveListener != null) { if ( typeof console !== "undefined" && typeof console.error === "function" ) { console.error( "Unable to preventDefault inside passive event listener invocation.", data.passiveListener ); } return } if (!data.event.cancelable) { return } data.canceled = true; if (typeof data.event.preventDefault === "function") { data.event.preventDefault(); } } /** * @see https://dom.spec.whatwg.org/#interface-event * @private */ /** * The event wrapper. * @constructor * @param {EventTarget} eventTarget The event target of this dispatching. * @param {Event|{type:string}} event The original event to wrap. */ function Event$1(eventTarget, event) { privateData.set(this, { eventTarget, event, eventPhase: 2, currentTarget: eventTarget, canceled: false, stopped: false, immediateStopped: false, passiveListener: null, timeStamp: event.timeStamp || Date.now(), }); // https://heycam.github.io/webidl/#Unforgeable Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); // Define accessors const keys = Object.keys(event); for (let i = 0; i < keys.length; ++i) { const key = keys[i]; if (!(key in this)) { Object.defineProperty(this, key, defineRedirectDescriptor(key)); } } } // Should be enumerable, but class methods are not enumerable. Event$1.prototype = { /** * The type of this event. * @type {string} */ get type() { return pd(this).event.type }, /** * The target of this event. * @type {EventTarget} */ get target() { return pd(this).eventTarget }, /** * The target of this event. * @type {EventTarget} */ get currentTarget() { return pd(this).currentTarget }, /** * @returns {EventTarget[]} The composed path of this event. */ composedPath() { const currentTarget = pd(this).currentTarget; if (currentTarget == null) { return [] } return [currentTarget] }, /** * Constant of NONE. * @type {number} */ get NONE() { return 0 }, /** * Constant of CAPTURING_PHASE. * @type {number} */ get CAPTURING_PHASE() { return 1 }, /** * Constant of AT_TARGET. * @type {number} */ get AT_TARGET() { return 2 }, /** * Constant of BUBBLING_PHASE. * @type {number} */ get BUBBLING_PHASE() { return 3 }, /** * The target of this event. * @type {number} */ get eventPhase() { return pd(this).eventPhase }, /** * Stop event bubbling. * @returns {void} */ stopPropagation() { const data = pd(this); data.stopped = true; if (typeof data.event.stopPropagation === "function") { data.event.stopPropagation(); } }, /** * Stop event bubbling. * @returns {void} */ stopImmediatePropagation() { const data = pd(this); data.stopped = true; data.immediateStopped = true; if (typeof data.event.stopImmediatePropagation === "function") { data.event.stopImmediatePropagation(); } }, /** * The flag to be bubbling. * @type {boolean} */ get bubbles() { return Boolean(pd(this).event.bubbles) }, /** * The flag to be cancelable. * @type {boolean} */ get cancelable() { return Boolean(pd(this).event.cancelable) }, /** * Cancel this event. * @returns {void} */ preventDefault() { setCancelFlag(pd(this)); }, /** * The flag to indicate cancellation state. * @type {boolean} */ get defaultPrevented() { return pd(this).canceled }, /** * The flag to be composed. * @type {boolean} */ get composed() { return Boolean(pd(this).event.composed) }, /** * The unix time of this event. * @type {number} */ get timeStamp() { return pd(this).timeStamp }, /** * The target of this event. * @type {EventTarget} * @deprecated */ get srcElement() { return pd(this).eventTarget }, /** * The flag to stop event bubbling. * @type {boolean} * @deprecated */ get cancelBubble() { return pd(this).stopped }, set cancelBubble(value) { if (!value) { return } const data = pd(this); data.stopped = true; if (typeof data.event.cancelBubble === "boolean") { data.event.cancelBubble = true; } }, /** * The flag to indicate cancellation state. * @type {boolean} * @deprecated */ get returnValue() { return !pd(this).canceled }, set returnValue(value) { if (!value) { setCancelFlag(pd(this)); } }, /** * Initialize this event object. But do nothing under event dispatching. * @param {string} type The event type. * @param {boolean} [bubbles=false] The flag to be possible to bubble up. * @param {boolean} [cancelable=false] The flag to be possible to cancel. * @deprecated */ initEvent() { // Do nothing. }, }; // `constructor` is not enumerable. Object.defineProperty(Event$1.prototype, "constructor", { value: Event$1, configurable: true, writable: true, }); // Ensure `event instanceof window.Event` is `true`. if (typeof window !== "undefined" && typeof window.Event !== "undefined") { Object.setPrototypeOf(Event$1.prototype, window.Event.prototype); // Make association for wrappers. wrappers.set(window.Event.prototype, Event$1); } /** * Get the property descriptor to redirect a given property. * @param {string} key Property name to define property descriptor. * @returns {PropertyDescriptor} The property descriptor to redirect the property. * @private */ function defineRedirectDescriptor(key) { return { get() { return pd(this).event[key] }, set(value) { pd(this).event[key] = value; }, configurable: true, enumerable: true, } } /** * Get the property descriptor to call a given method property. * @param {string} key Property name to define property descriptor. * @returns {PropertyDescriptor} The property descriptor to call the method property. * @private */ function defineCallDescriptor(key) { return { value() { const event = pd(this).event; return event[key].apply(event, arguments) }, configurable: true, enumerable: true, } } /** * Define new wrapper class. * @param {Function} BaseEvent The base wrapper class. * @param {Object} proto The prototype of the original event. * @returns {Function} The defined wrapper class. * @private */ function defineWrapper(BaseEvent, proto) { const keys = Object.keys(proto); if (keys.length === 0) { return BaseEvent } /** CustomEvent */ function CustomEvent(eventTarget, event) { BaseEvent.call(this, eventTarget, event); } CustomEvent.prototype = Object.create(BaseEvent.prototype, { constructor: { value: CustomEvent, configurable: true, writable: true }, }); // Define accessors. for (let i = 0; i < keys.length; ++i) { const key = keys[i]; if (!(key in BaseEvent.prototype)) { const descriptor = Object.getOwnPropertyDescriptor(proto, key); const isFunc = typeof descriptor.value === "function"; Object.defineProperty( CustomEvent.prototype, key, isFunc ? defineCallDescriptor(key) : defineRedirectDescriptor(key) ); } } return CustomEvent } /** * Get the wrapper class of a given prototype. * @param {Object} proto The prototype of the original event to get its wrapper. * @returns {Function} The wrapper class. * @private */ function getWrapper(proto) { if (proto == null || proto === Object.prototype) { return Event$1 } let wrapper = wrappers.get(proto); if (wrapper == null) { wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); wrappers.set(proto, wrapper); } return wrapper } /** * Wrap a given event to management a dispatching. * @param {EventTarget} eventTarget The event target of this dispatching. * @param {Object} event The event to wrap. * @returns {Event} The wrapper instance. * @private */ function wrapEvent(eventTarget, event) { const Wrapper = getWrapper(Object.getPrototypeOf(event)); return new Wrapper(eventTarget, event) } /** * Get the immediateStopped flag of a given event. * @param {Event} event The event to get. * @returns {boolean} The flag to stop propagation immediately. * @private */ function isStopped(event) { return pd(event).immediateStopped } /** * Set the current event phase of a given event. * @param {Event} event The event to set current target. * @param {number} eventPhase New event phase. * @returns {void} * @private */ function setEventPhase(event, eventPhase) { pd(event).eventPhase = eventPhase; } /** * Set the current target of a given event. * @param {Event} event The event to set current target. * @param {EventTarget|null} currentTarget New current target. * @returns {void} * @private */ function setCurrentTarget(event, currentTarget) { pd(event).currentTarget = currentTarget; } /** * Set a passive listener of a given event. * @param {Event} event The event to set current target. * @param {Function|null} passiveListener New passive listener. * @returns {void} * @private */ function setPassiveListener(event, passiveListener) { pd(event).passiveListener = passiveListener; } /** * @typedef {object} ListenerNode * @property {Function} listener * @property {1|2|3} listenerType * @property {boolean} passive * @property {boolean} once * @property {ListenerNode|null} next * @private */ /** * @type {WeakMap>} * @private */ const listenersMap = new WeakMap(); // Listener types const CAPTURE = 1; const BUBBLE = 2; const ATTRIBUTE = 3; /** * Check whether a given value is an object or not. * @param {any} x The value to check. * @returns {boolean} `true` if the value is an object. */ function isObject$1(x) { return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax } /** * Get listeners. * @param {EventTarget} eventTarget The event target to get. * @returns {Map} The listeners. * @private */ function getListeners(eventTarget) { const listeners = listenersMap.get(eventTarget); if (listeners == null) { throw new TypeError( "'this' is expected an EventTarget object, but got another value." ) } return listeners } /** * Get the property descriptor for the event attribute of a given event. * @param {string} eventName The event name to get property descriptor. * @returns {PropertyDescriptor} The property descriptor. * @private */ function defineEventAttributeDescriptor(eventName) { return { get() { const listeners = getListeners(this); let node = listeners.get(eventName); while (node != null) { if (node.listenerType === ATTRIBUTE) { return node.listener } node = node.next; } return null }, set(listener) { if (typeof listener !== "function" && !isObject$1(listener)) { listener = null; // eslint-disable-line no-param-reassign } const listeners = getListeners(this); // Traverse to the tail while removing old value. let prev = null; let node = listeners.get(eventName); while (node != null) { if (node.listenerType === ATTRIBUTE) { // Remove old value. if (prev !== null) { prev.next = node.next; } else if (node.next !== null) { listeners.set(eventName, node.next); } else { listeners.delete(eventName); } } else { prev = node; } node = node.next; } // Add new value. if (listener !== null) { const newNode = { listener, listenerType: ATTRIBUTE, passive: false, once: false, next: null, }; if (prev === null) { listeners.set(eventName, newNode); } else { prev.next = newNode; } } }, configurable: true, enumerable: true, } } /** * Define an event attribute (e.g. `eventTarget.onclick`). * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite. * @param {string} eventName The event name to define. * @returns {void} */ function defineEventAttribute(eventTargetPrototype, eventName) { Object.defineProperty( eventTargetPrototype, `on${eventName}`, defineEventAttributeDescriptor(eventName) ); } /** * Define a custom EventTarget with event attributes. * @param {string[]} eventNames Event names for event attributes. * @returns {EventTarget} The custom EventTarget. * @private */ function defineCustomEventTarget(eventNames) { /** CustomEventTarget */ function CustomEventTarget() { EventTarget.call(this); } CustomEventTarget.prototype = Object.create(EventTarget.prototype, { constructor: { value: CustomEventTarget, configurable: true, writable: true, }, }); for (let i = 0; i < eventNames.length; ++i) { defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); } return CustomEventTarget } /** * EventTarget. * * - This is constructor if no arguments. * - This is a function which returns a CustomEventTarget constructor if there are arguments. * * For example: * * class A extends EventTarget {} * class B extends EventTarget("message") {} * class C extends EventTarget("message", "error") {} * class D extends EventTarget(["message", "error"]) {} */ function EventTarget() { /*eslint-disable consistent-return */ if (this instanceof EventTarget) { listenersMap.set(this, new Map()); return } if (arguments.length === 1 && Array.isArray(arguments[0])) { return defineCustomEventTarget(arguments[0]) } if (arguments.length > 0) { const types = new Array(arguments.length); for (let i = 0; i < arguments.length; ++i) { types[i] = arguments[i]; } return defineCustomEventTarget(types) } throw new TypeError("Cannot call a class as a function") /*eslint-enable consistent-return */ } // Should be enumerable, but class methods are not enumerable. EventTarget.prototype = { /** * Add a given listener to this event target. * @param {string} eventName The event name to add. * @param {Function} listener The listener to add. * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. * @returns {void} */ addEventListener(eventName, listener, options) { if (listener == null) { return } if (typeof listener !== "function" && !isObject$1(listener)) { throw new TypeError("'listener' should be a function or an object.") } const listeners = getListeners(this); const optionsIsObj = isObject$1(options); const capture = optionsIsObj ? Boolean(options.capture) : Boolean(options); const listenerType = capture ? CAPTURE : BUBBLE; const newNode = { listener, listenerType, passive: optionsIsObj && Boolean(options.passive), once: optionsIsObj && Boolean(options.once), next: null, }; // Set it as the first node if the first node is null. let node = listeners.get(eventName); if (node === undefined) { listeners.set(eventName, newNode); return } // Traverse to the tail while checking duplication.. let prev = null; while (node != null) { if ( node.listener === listener && node.listenerType === listenerType ) { // Should ignore duplication. return } prev = node; node = node.next; } // Add it. prev.next = newNode; }, /** * Remove a given listener from this event target. * @param {string} eventName The event name to remove. * @param {Function} listener The listener to remove. * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. * @returns {void} */ removeEventListener(eventName, listener, options) { if (listener == null) { return } const listeners = getListeners(this); const capture = isObject$1(options) ? Boolean(options.capture) : Boolean(options); const listenerType = capture ? CAPTURE : BUBBLE; let prev = null; let node = listeners.get(eventName); while (node != null) { if ( node.listener === listener && node.listenerType === listenerType ) { if (prev !== null) { prev.next = node.next; } else if (node.next !== null) { listeners.set(eventName, node.next); } else { listeners.delete(eventName); } return } prev = node; node = node.next; } }, /** * Dispatch a given event. * @param {Event|{type:string}} event The event to dispatch. * @returns {boolean} `false` if canceled. */ dispatchEvent(event) { if (event == null || typeof event.type !== "string") { throw new TypeError('"event.type" should be a string.') } // If listeners aren't registered, terminate. const listeners = getListeners(this); const eventName = event.type; let node = listeners.get(eventName); if (node == null) { return true } // Since we cannot rewrite several properties, so wrap object. const wrappedEvent = wrapEvent(this, event); // This doesn't process capturing phase and bubbling phase. // This isn't participating in a tree. let prev = null; while (node != null) { // Remove this listener if it's once if (node.once) { if (prev !== null) { prev.next = node.next; } else if (node.next !== null) { listeners.set(eventName, node.next); } else { listeners.delete(eventName); } } else { prev = node; } // Call this listener setPassiveListener( wrappedEvent, node.passive ? node.listener : null ); if (typeof node.listener === "function") { try { node.listener.call(this, wrappedEvent); } catch (err) { if ( typeof console !== "undefined" && typeof console.error === "function" ) { console.error(err); } } } else if ( node.listenerType !== ATTRIBUTE && typeof node.listener.handleEvent === "function" ) { node.listener.handleEvent(wrappedEvent); } // Break if `event.stopImmediatePropagation` was called. if (isStopped(wrappedEvent)) { break } node = node.next; } setPassiveListener(wrappedEvent, null); setEventPhase(wrappedEvent, 0); setCurrentTarget(wrappedEvent, null); return !wrappedEvent.defaultPrevented }, }; // `constructor` is not enumerable. Object.defineProperty(EventTarget.prototype, "constructor", { value: EventTarget, configurable: true, writable: true, }); // Ensure `eventTarget instanceof window.EventTarget` is `true`. if ( typeof window !== "undefined" && typeof window.EventTarget !== "undefined" ) { Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); } /** * @author Toru Nagashima * See LICENSE file in root directory for full license. */ /** * The signal class. * @see https://dom.spec.whatwg.org/#abortsignal */ class AbortSignal$1 extends EventTarget { /** * AbortSignal cannot be constructed directly. */ constructor() { super(); throw new TypeError("AbortSignal cannot be constructed directly"); } /** * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. */ get aborted() { const aborted = abortedFlags.get(this); if (typeof aborted !== "boolean") { throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); } return aborted; } } defineEventAttribute(AbortSignal$1.prototype, "abort"); /** * Create an AbortSignal object. */ function createAbortSignal() { const signal = Object.create(AbortSignal$1.prototype); EventTarget.call(signal); abortedFlags.set(signal, false); return signal; } /** * Abort a given signal. */ function abortSignal$1(signal) { if (abortedFlags.get(signal) !== false) { return; } abortedFlags.set(signal, true); signal.dispatchEvent({ type: "abort" }); } /** * Aborted flag for each instances. */ const abortedFlags = new WeakMap(); // Properties should be enumerable. Object.defineProperties(AbortSignal$1.prototype, { aborted: { enumerable: true }, }); // `toString()` should return `"[object AbortSignal]"` if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { Object.defineProperty(AbortSignal$1.prototype, Symbol.toStringTag, { configurable: true, value: "AbortSignal", }); } /** * The AbortController. * @see https://dom.spec.whatwg.org/#abortcontroller */ class AbortController$1 { /** * Initialize this controller. */ constructor() { signals.set(this, createAbortSignal()); } /** * Returns the `AbortSignal` object associated with this object. */ get signal() { return getSignal(this); } /** * Abort and signal to any observers that the associated activity is to be aborted. */ abort() { abortSignal$1(getSignal(this)); } } /** * Associated signals. */ const signals = new WeakMap(); /** * Get the associated signal of a given controller. */ function getSignal(controller) { const signal = signals.get(controller); if (signal == null) { throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); } return signal; } // Properties should be enumerable. Object.defineProperties(AbortController$1.prototype, { signal: { enumerable: true }, abort: { enumerable: true }, }); if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { Object.defineProperty(AbortController$1.prototype, Symbol.toStringTag, { configurable: true, value: "AbortController", }); } var abortController = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': AbortController$1, AbortController: AbortController$1, AbortSignal: AbortSignal$1 }); var require$$2 = /*@__PURE__*/getAugmentedNamespace(abortController); /** * @license * web-streams-polyfill v4.0.0-beta.3 * Copyright 2021 Mattias Buelens, Diwank Singh Tomer and other contributors. * This code is released under the MIT license. * SPDX-License-Identifier: MIT */ const e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function t(){}function r(e){return "object"==typeof e&&null!==e||"function"==typeof e}const o=t;function n(e,t){try{Object.defineProperty(e,"name",{value:t,configurable:!0});}catch(e){}}const a=Promise,i=Promise.prototype.then,l=Promise.resolve.bind(a),s=Promise.reject.bind(a);function u(e){return new a(e)}function c(e){return l(e)}function d(e){return s(e)}function f(e,t,r){return i.call(e,t,r)}function b(e,t,r){f(f(e,t,r),void 0,o);}function h(e,t){b(e,t);}function _(e,t){b(e,void 0,t);}function p(e,t,r){return f(e,t,r)}function m(e){f(e,void 0,o);}let y=e=>{if("function"==typeof queueMicrotask)y=queueMicrotask;else {const e=c(void 0);y=t=>f(e,t);}return y(e)};function g(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function w(e,t,r){try{return c(g(e,t,r))}catch(e){return d(e)}}class S{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0;}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size;}shift(){const e=this._front;let t=e;const r=this._cursor;let o=r+1;const n=e._elements,a=n[r];return 16384===o&&(t=e._next,o=0),--this._size,this._cursor=o,e!==t&&(this._front=t),n[r]=void 0,a}forEach(e){let t=this._cursor,r=this._front,o=r._elements;for(;!(t===o.length&&void 0===r._next||t===o.length&&(r=r._next,o=r._elements,t=0,0===o.length));)e(o[t]),++t;}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}const v=e("[[AbortSteps]]"),R=e("[[ErrorSteps]]"),T=e("[[CancelSteps]]"),q=e("[[PullSteps]]"),C=e("[[ReleaseSteps]]");function E(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?O(e):"closed"===t._state?function(e){O(e),j(e);}(e):B(e,t._storedError);}function P(e,t){return Gt(e._ownerReadableStream,t)}function W(e){const t=e._ownerReadableStream;"readable"===t._state?A(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){B(e,t);}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),t._readableStreamController[C](),t._reader=void 0,e._ownerReadableStream=void 0;}function k(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function O(e){e._closedPromise=u(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r;}));}function B(e,t){O(e),A(e,t);}function A(e,t){void 0!==e._closedPromise_reject&&(m(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0);}function j(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0);}const z=Number.isFinite||function(e){return "number"==typeof e&&isFinite(e)},L=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function F(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r;}function I(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function D(e,t){if(!function(e){return "object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function $(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function M(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function Y(e){return Number(e)}function Q(e){return 0===e?0:e}function N(e,t){const r=Number.MAX_SAFE_INTEGER;let o=Number(e);if(o=Q(o),!z(o))throw new TypeError(`${t} is not a finite number`);if(o=function(e){return Q(L(e))}(o),o<0||o>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return z(o)&&0!==o?o:0}function H(e){if(!r(e))return !1;if("function"!=typeof e.getReader)return !1;try{return "boolean"==typeof e.locked}catch(e){return !1}}function x(e){if(!r(e))return !1;if("function"!=typeof e.getWriter)return !1;try{return "boolean"==typeof e.locked}catch(e){return !1}}function V(e,t){if(!Vt(e))throw new TypeError(`${t} is not a ReadableStream.`)}function U(e,t){e._reader._readRequests.push(t);}function G(e,t,r){const o=e._reader._readRequests.shift();r?o._closeSteps():o._chunkSteps(t);}function X(e){return e._reader._readRequests.length}function J(e){const t=e._reader;return void 0!==t&&!!K(t)}class ReadableStreamDefaultReader$1{constructor(e){if($(e,1,"ReadableStreamDefaultReader"),V(e,"First parameter"),Ut(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");E(this,e),this._readRequests=new S;}get closed(){return K(this)?this._closedPromise:d(ee("closed"))}cancel(e){return K(this)?void 0===this._ownerReadableStream?d(k("cancel")):P(this,e):d(ee("cancel"))}read(){if(!K(this))return d(ee("read"));if(void 0===this._ownerReadableStream)return d(k("read from"));let e,t;const r=u(((r,o)=>{e=r,t=o;}));return function(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[q](t);}(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!K(this))throw ee("releaseLock");void 0!==this._ownerReadableStream&&function(e){W(e);const t=new TypeError("Reader was released");Z(e,t);}(this);}}function K(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader$1)}function Z(e,t){const r=e._readRequests;e._readRequests=new S,r.forEach((e=>{e._errorSteps(t);}));}function ee(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader$1.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),n(ReadableStreamDefaultReader$1.prototype.cancel,"cancel"),n(ReadableStreamDefaultReader$1.prototype.read,"read"),n(ReadableStreamDefaultReader$1.prototype.releaseLock,"releaseLock"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader$1.prototype,e.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});class te{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t;}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?p(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?p(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;return void 0===e?d(k("iterate")):f(e.read(),(e=>{var t;return this._ongoingPromise=void 0,e.done&&(this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0),e}),(e=>{var t;throw this._ongoingPromise=void 0,this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0,e}))}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t)return d(k("finish iterating"));if(this._reader=void 0,!this._preventCancel){const r=t.cancel(e);return t.releaseLock(),p(r,(()=>({value:e,done:!0})))}return t.releaseLock(),c({value:e,done:!0})}}const re={next(){return oe(this)?this._asyncIteratorImpl.next():d(ne("next"))},return(e){return oe(this)?this._asyncIteratorImpl.return(e):d(ne("return"))}};function oe(e){if(!r(e))return !1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return !1;try{return e._asyncIteratorImpl instanceof te}catch(e){return !1}}function ne(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}"symbol"==typeof e.asyncIterator&&Object.defineProperty(re,e.asyncIterator,{value(){return this},writable:!0,configurable:!0});const ae=Number.isNaN||function(e){return e!=e};function ie(e,t,r,o,n){new Uint8Array(e).set(new Uint8Array(r,o,n),t);}function le(e){const t=function(e,t,r){if(e.slice)return e.slice(t,r);const o=r-t,n=new ArrayBuffer(o);return ie(n,0,e,t,o),n}(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function se(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function ue(e,t,r){if("number"!=typeof(o=r)||ae(o)||o<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var o;e._queue.push({value:t,size:r}),e._queueTotalSize+=r;}function ce(e){e._queue=new S,e._queueTotalSize=0;}class ReadableStreamBYOBRequest$1{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!fe(this))throw Be("view");return this._view}respond(e){if(!fe(this))throw Be("respond");if($(e,1,"respond"),e=N(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else {if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,qe(e,t);}(this._associatedReadableByteStreamController,e);}respondWithNewView(e){if(!fe(this))throw Be("respondWithNewView");if($(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const o=t.byteLength;r.buffer=t.buffer,qe(e,o);}(this._associatedReadableByteStreamController,e);}}Object.defineProperties(ReadableStreamBYOBRequest$1.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),n(ReadableStreamBYOBRequest$1.prototype.respond,"respond"),n(ReadableStreamBYOBRequest$1.prototype.respondWithNewView,"respondWithNewView"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest$1.prototype,e.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController$1{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!de(this))throw Ae("byobRequest");return function(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),o=Object.create(ReadableStreamBYOBRequest$1.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r;}(o,e,r),e._byobRequest=o;}return e._byobRequest}(this)}get desiredSize(){if(!de(this))throw Ae("desiredSize");return ke(this)}close(){if(!de(this))throw Ae("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);!function(e){const t=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==t._state)return;if(e._queueTotalSize>0)return void(e._closeRequested=!0);if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw Pe(e,t),t}}Ee(e),Xt(t);}(this);}enqueue(e){if(!de(this))throw Ae("enqueue");if($(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);!function(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const o=t.buffer,n=t.byteOffset,a=t.byteLength,i=o;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,Re(e),t.buffer=t.buffer,"none"===t.readerType&&ge(e,t);}if(J(r))if(function(e){const t=e._controlledReadableByteStream._reader;for(;t._readRequests.length>0;){if(0===e._queueTotalSize)return;We(e,t._readRequests.shift());}}(e),0===X(r))me(e,i,n,a);else {e._pendingPullIntos.length>0&&Ce(e);G(r,new Uint8Array(i,n,a),!1);}else Le(r)?(me(e,i,n,a),Te(e)):me(e,i,n,a);be(e);}(this,e);}error(e){if(!de(this))throw Ae("error");Pe(this,e);}[T](e){he(this),ce(this);const t=this._cancelAlgorithm(e);return Ee(this),t}[q](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0)return void We(this,e);const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r);}catch(t){return void e._errorSteps(t)}const o={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o);}U(t,e),be(this);}[C](){if(this._pendingPullIntos.length>0){const e=this._pendingPullIntos.peek();e.readerType="none",this._pendingPullIntos=new S,this._pendingPullIntos.push(e);}}}function de(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController$1)}function fe(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest$1)}function be(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return !1;if(e._closeRequested)return !1;if(!e._started)return !1;if(J(t)&&X(t)>0)return !0;if(Le(t)&&ze(t)>0)return !0;if(ke(e)>0)return !0;return !1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;b(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,be(e)),null)),(t=>(Pe(e,t),null)));}function he(e){Re(e),e._pendingPullIntos=new S;}function _e(e,t){let r=!1;"closed"===e._state&&(r=!0);const o=pe(t);"default"===t.readerType?G(e,o,r):function(e,t,r){const o=e._reader._readIntoRequests.shift();r?o._closeSteps(t):o._chunkSteps(t);}(e,o,r);}function pe(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function me(e,t,r,o){e._queue.push({buffer:t,byteOffset:r,byteLength:o}),e._queueTotalSize+=o;}function ye(e,t,r,o){let n;try{n=t.slice(r,r+o);}catch(t){throw Pe(e,t),t}me(e,n,0,o);}function ge(e,t){t.bytesFilled>0&&ye(e,t.buffer,t.byteOffset,t.bytesFilled),Ce(e);}function we(e,t){const r=t.elementSize,o=t.bytesFilled-t.bytesFilled%r,n=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),a=t.bytesFilled+n,i=a-a%r;let l=n,s=!1;i>o&&(l=i-t.bytesFilled,s=!0);const u=e._queue;for(;l>0;){const r=u.peek(),o=Math.min(l,r.byteLength),n=t.byteOffset+t.bytesFilled;ie(t.buffer,n,r.buffer,r.byteOffset,o),r.byteLength===o?u.shift():(r.byteOffset+=o,r.byteLength-=o),e._queueTotalSize-=o,Se(e,o,t),l-=o;}return s}function Se(e,t,r){r.bytesFilled+=t;}function ve(e){0===e._queueTotalSize&&e._closeRequested?(Ee(e),Xt(e._controlledReadableByteStream)):be(e);}function Re(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null);}function Te(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();we(e,t)&&(Ce(e),_e(e._controlledReadableByteStream,t));}}function qe(e,t){const r=e._pendingPullIntos.peek();Re(e);"closed"===e._controlledReadableByteStream._state?function(e,t){"none"===t.readerType&&Ce(e);const r=e._controlledReadableByteStream;if(Le(r))for(;ze(r)>0;)_e(r,Ce(e));}(e,r):function(e,t,r){if(Se(0,t,r),"none"===r.readerType)return ge(e,r),void Te(e);if(r.bytesFilled0){const t=r.byteOffset+r.bytesFilled;ye(e,r.buffer,t-o,o);}r.bytesFilled-=o,_e(e._controlledReadableByteStream,r),Te(e);}(e,t,r),be(e);}function Ce(e){return e._pendingPullIntos.shift()}function Ee(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0;}function Pe(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(he(e),ce(e),Ee(e),Jt(r,t));}function We(e,t){const r=e._queue.shift();e._queueTotalSize-=r.byteLength,ve(e);const o=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);t._chunkSteps(o);}function ke(e){const t=e._controlledReadableByteStream._state;return "errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Oe(e,t,r){const o=Object.create(ReadableByteStreamController$1.prototype);let n,a,i;n=void 0!==t.start?()=>t.start(o):()=>{},a=void 0!==t.pull?()=>t.pull(o):()=>c(void 0),i=void 0!==t.cancel?e=>t.cancel(e):()=>c(void 0);const l=t.autoAllocateChunkSize;if(0===l)throw new TypeError("autoAllocateChunkSize must be greater than 0");!function(e,t,r,o,n,a,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,ce(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,t._autoAllocateChunkSize=i,t._pendingPullIntos=new S,e._readableStreamController=t,b(c(r()),(()=>(t._started=!0,be(t),null)),(e=>(Pe(t,e),null)));}(e,o,n,a,i,r,l);}function Be(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Ae(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function je(e,t){e._reader._readIntoRequests.push(t);}function ze(e){return e._reader._readIntoRequests.length}function Le(e){const t=e._reader;return void 0!==t&&!!Fe(t)}Object.defineProperties(ReadableByteStreamController$1.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),n(ReadableByteStreamController$1.prototype.close,"close"),n(ReadableByteStreamController$1.prototype.enqueue,"enqueue"),n(ReadableByteStreamController$1.prototype.error,"error"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableByteStreamController$1.prototype,e.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader$1{constructor(e){if($(e,1,"ReadableStreamBYOBReader"),V(e,"First parameter"),Ut(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!de(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");E(this,e),this._readIntoRequests=new S;}get closed(){return Fe(this)?this._closedPromise:d(De("closed"))}cancel(e){return Fe(this)?void 0===this._ownerReadableStream?d(k("cancel")):P(this,e):d(De("cancel"))}read(e){if(!Fe(this))return d(De("read"));if(!ArrayBuffer.isView(e))return d(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return d(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return d(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return d(k("read from"));let t,r;const o=u(((e,o)=>{t=e,r=o;}));return function(e,t,r){const o=e._ownerReadableStream;o._disturbed=!0,"errored"===o._state?r._errorSteps(o._storedError):function(e,t,r){const o=e._controlledReadableByteStream;let n=1;t.constructor!==DataView&&(n=t.constructor.BYTES_PER_ELEMENT);const a=t.constructor,i=t.buffer,l={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:n,viewConstructor:a,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(l),void je(o,r);if("closed"!==o._state){if(e._queueTotalSize>0){if(we(e,l)){const t=pe(l);return ve(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return Pe(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(l),je(o,r),be(e);}else {const e=new a(l.buffer,l.byteOffset,0);r._closeSteps(e);}}(o._readableStreamController,t,r);}(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),o}releaseLock(){if(!Fe(this))throw De("releaseLock");void 0!==this._ownerReadableStream&&function(e){W(e);const t=new TypeError("Reader was released");Ie(e,t);}(this);}}function Fe(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader$1)}function Ie(e,t){const r=e._readIntoRequests;e._readIntoRequests=new S,r.forEach((e=>{e._errorSteps(t);}));}function De(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function $e(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(ae(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Me(e){const{size:t}=e;return t||(()=>1)}function Ye(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark,o=null==e?void 0:e.size;return {highWaterMark:void 0===r?void 0:Y(r),size:void 0===o?void 0:Qe(o,`${t} has member 'size' that`)}}function Qe(e,t){return I(e,t),t=>Y(e(t))}function Ne(e,t,r){return I(e,r),r=>w(e,t,[r])}function He(e,t,r){return I(e,r),()=>w(e,t,[])}function xe(e,t,r){return I(e,r),r=>g(e,t,[r])}function Ve(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(ReadableStreamBYOBReader$1.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),n(ReadableStreamBYOBReader$1.prototype.cancel,"cancel"),n(ReadableStreamBYOBReader$1.prototype.read,"read"),n(ReadableStreamBYOBReader$1.prototype.releaseLock,"releaseLock"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader$1.prototype,e.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const Ue="function"==typeof AbortController;class WritableStream$1{constructor(e={},t={}){void 0===e?e=null:D(e,"First parameter");const r=Ye(t,"Second parameter"),o=function(e,t){F(e,t);const r=null==e?void 0:e.abort,o=null==e?void 0:e.close,n=null==e?void 0:e.start,a=null==e?void 0:e.type,i=null==e?void 0:e.write;return {abort:void 0===r?void 0:Ne(r,e,`${t} has member 'abort' that`),close:void 0===o?void 0:He(o,e,`${t} has member 'close' that`),start:void 0===n?void 0:xe(n,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ve(i,e,`${t} has member 'write' that`),type:a}}(e,"First parameter");var n;(n=this)._state="writable",n._storedError=void 0,n._writer=void 0,n._writableStreamController=void 0,n._writeRequests=new S,n._inFlightWriteRequest=void 0,n._closeRequest=void 0,n._inFlightCloseRequest=void 0,n._pendingAbortRequest=void 0,n._backpressure=!1;if(void 0!==o.type)throw new RangeError("Invalid type is specified");const a=Me(r);!function(e,t,r,o){const n=Object.create(WritableStreamDefaultController$1.prototype);let a,i,l,s;a=void 0!==t.start?()=>t.start(n):()=>{};i=void 0!==t.write?e=>t.write(e,n):()=>c(void 0);l=void 0!==t.close?()=>t.close():()=>c(void 0);s=void 0!==t.abort?e=>t.abort(e):()=>c(void 0);!function(e,t,r,o,n,a,i,l){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,ce(t),t._abortReason=void 0,t._abortController=function(){if(Ue)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=l,t._strategyHWM=i,t._writeAlgorithm=o,t._closeAlgorithm=n,t._abortAlgorithm=a;const s=bt(t);nt(e,s);const u=r();b(c(u),(()=>(t._started=!0,dt(t),null)),(r=>(t._started=!0,Ze(e,r),null)));}(e,n,a,i,l,s,r,o);}(this,o,$e(r,1),a);}get locked(){if(!Ge(this))throw _t("locked");return Xe(this)}abort(e){return Ge(this)?Xe(this)?d(new TypeError("Cannot abort a stream that already has a writer")):Je(this,e):d(_t("abort"))}close(){return Ge(this)?Xe(this)?d(new TypeError("Cannot close a stream that already has a writer")):rt(this)?d(new TypeError("Cannot close an already-closing stream")):Ke(this):d(_t("close"))}getWriter(){if(!Ge(this))throw _t("getWriter");return new WritableStreamDefaultWriter$1(this)}}function Ge(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream$1)}function Xe(e){return void 0!==e._writer}function Je(e,t){var r;if("closed"===e._state||"errored"===e._state)return c(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort(t);const o=e._state;if("closed"===o||"errored"===o)return c(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let n=!1;"erroring"===o&&(n=!0,t=void 0);const a=u(((r,o)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:o,_reason:t,_wasAlreadyErroring:n};}));return e._pendingAbortRequest._promise=a,n||et(e,t),a}function Ke(e){const t=e._state;if("closed"===t||"errored"===t)return d(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=u(((t,r)=>{const o={_resolve:t,_reject:r};e._closeRequest=o;})),o=e._writer;var n;return void 0!==o&&e._backpressure&&"writable"===t&&Et(o),ue(n=e._writableStreamController,lt,0),dt(n),r}function Ze(e,t){"writable"!==e._state?tt(e):et(e,t);}function et(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const o=e._writer;void 0!==o&&it(o,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return !1;return !0}(e)&&r._started&&tt(e);}function tt(e){e._state="errored",e._writableStreamController[R]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t);})),e._writeRequests=new S,void 0===e._pendingAbortRequest)return void ot(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void ot(e);b(e._writableStreamController[v](r._reason),(()=>(r._resolve(),ot(e),null)),(t=>(r._reject(t),ot(e),null)));}function rt(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function ot(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&St(t,e._storedError);}function nt(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){Rt(e);}(r):Et(r)),e._backpressure=t;}Object.defineProperties(WritableStream$1.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),n(WritableStream$1.prototype.abort,"abort"),n(WritableStream$1.prototype.close,"close"),n(WritableStream$1.prototype.getWriter,"getWriter"),"symbol"==typeof e.toStringTag&&Object.defineProperty(WritableStream$1.prototype,e.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter$1{constructor(e){if($(e,1,"WritableStreamDefaultWriter"),function(e,t){if(!Ge(e))throw new TypeError(`${t} is not a WritableStream.`)}(e,"First parameter"),Xe(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!rt(e)&&e._backpressure?Rt(this):qt(this),gt(this);else if("erroring"===t)Tt(this,e._storedError),gt(this);else if("closed"===t)qt(this),gt(r=this),vt(r);else {const t=e._storedError;Tt(this,t),wt(this,t);}var r;}get closed(){return at(this)?this._closedPromise:d(mt("closed"))}get desiredSize(){if(!at(this))throw mt("desiredSize");if(void 0===this._ownerWritableStream)throw yt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return ct(t._writableStreamController)}(this)}get ready(){return at(this)?this._readyPromise:d(mt("ready"))}abort(e){return at(this)?void 0===this._ownerWritableStream?d(yt("abort")):function(e,t){return Je(e._ownerWritableStream,t)}(this,e):d(mt("abort"))}close(){if(!at(this))return d(mt("close"));const e=this._ownerWritableStream;return void 0===e?d(yt("close")):rt(e)?d(new TypeError("Cannot close an already-closing stream")):Ke(this._ownerWritableStream)}releaseLock(){if(!at(this))throw mt("releaseLock");void 0!==this._ownerWritableStream&&function(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");it(e,r),function(e,t){"pending"===e._closedPromiseState?St(e,t):function(e,t){wt(e,t);}(e,t);}(e,r),t._writer=void 0,e._ownerWritableStream=void 0;}(this);}write(e){return at(this)?void 0===this._ownerWritableStream?d(yt("write to")):function(e,t){const r=e._ownerWritableStream,o=r._writableStreamController,n=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return ft(e,t),1}}(o,t);if(r!==e._ownerWritableStream)return d(yt("write to"));const a=r._state;if("errored"===a)return d(r._storedError);if(rt(r)||"closed"===a)return d(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===a)return d(r._storedError);const i=function(e){return u(((t,r)=>{const o={_resolve:t,_reject:r};e._writeRequests.push(o);}))}(r);return function(e,t,r){try{ue(e,t,r);}catch(t){return void ft(e,t)}const o=e._controlledWritableStream;if(!rt(o)&&"writable"===o._state){nt(o,bt(e));}dt(e);}(o,t,n),i}(this,e):d(mt("write"))}}function at(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter$1)}function it(e,t){"pending"===e._readyPromiseState?Ct(e,t):function(e,t){Tt(e,t);}(e,t);}Object.defineProperties(WritableStreamDefaultWriter$1.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),n(WritableStreamDefaultWriter$1.prototype.abort,"abort"),n(WritableStreamDefaultWriter$1.prototype.close,"close"),n(WritableStreamDefaultWriter$1.prototype.releaseLock,"releaseLock"),n(WritableStreamDefaultWriter$1.prototype.write,"write"),"symbol"==typeof e.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter$1.prototype,e.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const lt={};class WritableStreamDefaultController$1{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!st(this))throw pt("abortReason");return this._abortReason}get signal(){if(!st(this))throw pt("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!st(this))throw pt("error");"writable"===this._controlledWritableStream._state&&ht(this,e);}[v](e){const t=this._abortAlgorithm(e);return ut(this),t}[R](){ce(this);}}function st(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController$1)}function ut(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0;}function ct(e){return e._strategyHWM-e._queueTotalSize}function dt(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void tt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===lt?function(e){const t=e._controlledWritableStream;((function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0;}))(t),se(e);const r=e._closeAlgorithm();ut(e),b(r,(()=>(function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&vt(t);}(t),null)),(e=>(function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),Ze(e,t);}(t,e),null)));}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift();}(r);b(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0;}(r);const t=r._state;if(se(e),!rt(r)&&"writable"===t){const t=bt(e);nt(r,t);}return dt(e),null}),(t=>("writable"===r._state&&ut(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,Ze(e,t);}(r,t),null)));}(e,r);}function ft(e,t){"writable"===e._controlledWritableStream._state&&ht(e,t);}function bt(e){return ct(e)<=0}function ht(e,t){const r=e._controlledWritableStream;ut(e),et(r,t);}function _t(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function pt(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function mt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function yt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function gt(e){e._closedPromise=u(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending";}));}function wt(e,t){gt(e),St(e,t);}function St(e,t){void 0!==e._closedPromise_reject&&(m(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected");}function vt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved");}function Rt(e){e._readyPromise=u(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r;})),e._readyPromiseState="pending";}function Tt(e,t){Rt(e),Ct(e,t);}function qt(e){Rt(e),Et(e);}function Ct(e,t){void 0!==e._readyPromise_reject&&(m(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected");}function Et(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled");}Object.defineProperties(WritableStreamDefaultController$1.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof e.toStringTag&&Object.defineProperty(WritableStreamDefaultController$1.prototype,e.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const Pt="undefined"!=typeof DOMException?DOMException:void 0;const Wt=function(e){if("function"!=typeof e&&"object"!=typeof e)return !1;try{return new e,!0}catch(e){return !1}}(Pt)?Pt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function kt(e,t,r,o,n,a){const i=e.getReader(),l=t.getWriter();Vt(e)&&(e._disturbed=!0);let s,_,g,w=!1,S=!1,v="readable",R="writable",T=!1,q=!1;const C=u((e=>{g=e;}));let E=Promise.resolve(void 0);return u(((P,W)=>{let k;function O(){if(w)return;const e=u(((e,t)=>{!function r(o){o?e():f(function(){if(w)return c(!0);return f(l.ready,(()=>f(i.read(),(e=>!!e.done||(E=l.write(e.value),m(E),!1)))))}(),r,t);}(!1);}));m(e);}function B(){return v="closed",r?L():z((()=>(Ge(t)&&(T=rt(t),R=t._state),T||"closed"===R?c(void 0):"erroring"===R||"errored"===R?d(_):(T=!0,l.close()))),!1,void 0),null}function A(e){return w||(v="errored",s=e,o?L(!0,e):z((()=>l.abort(e)),!0,e)),null}function j(e){return S||(R="errored",_=e,n?L(!0,e):z((()=>i.cancel(e)),!0,e)),null}if(void 0!==a&&(k=()=>{const e=void 0!==a.reason?a.reason:new Wt("Aborted","AbortError"),t=[];o||t.push((()=>"writable"===R?l.abort(e):c(void 0))),n||t.push((()=>"readable"===v?i.cancel(e):c(void 0))),z((()=>Promise.all(t.map((e=>e())))),!0,e);},a.aborted?k():a.addEventListener("abort",k)),Vt(e)&&(v=e._state,s=e._storedError),Ge(t)&&(R=t._state,_=t._storedError,T=rt(t)),Vt(e)&&Ge(t)&&(q=!0,g()),"errored"===v)A(s);else if("erroring"===R||"errored"===R)j(_);else if("closed"===v)B();else if(T||"closed"===R){const e=new TypeError("the destination writable stream closed before all data could be piped to it");n?L(!0,e):z((()=>i.cancel(e)),!0,e);}function z(e,t,r){function o(){return "writable"!==R||T?n():h(function(){let e;return c(function t(){if(e!==E)return e=E,p(E,t,t)}())}(),n),null}function n(){return e?b(e(),(()=>F(t,r)),(e=>F(!0,e))):F(t,r),null}w||(w=!0,q?o():h(C,o));}function L(e,t){z(void 0,e,t);}function F(e,t){return S=!0,l.releaseLock(),i.releaseLock(),void 0!==a&&a.removeEventListener("abort",k),e?W(t):P(void 0),null}w||(b(i.closed,B,A),b(l.closed,(function(){return S||(R="closed"),null}),j)),q?O():y((()=>{q=!0,g(),O();}));}))}function Ot(e,t){return function(e){try{return e.getReader({mode:"byob"}).releaseLock(),!0}catch(e){return !1}}(e)?function(e){let t,r,o,n,a,i=e.getReader(),l=!1,s=!1,d=!1,f=!1,h=!1,p=!1;const m=u((e=>{a=e;}));function y(e){_(e.closed,(t=>(e!==i||(o.error(t),n.error(t),h&&p||a(void 0)),null)));}function g(){l&&(i.releaseLock(),i=e.getReader(),y(i),l=!1),b(i.read(),(e=>{var t,r;if(d=!1,f=!1,e.done)return h||o.close(),p||n.close(),null===(t=o.byobRequest)||void 0===t||t.respond(0),null===(r=n.byobRequest)||void 0===r||r.respond(0),h&&p||a(void 0),null;const l=e.value,u=l;let c=l;if(!h&&!p)try{c=le(l);}catch(e){return o.error(e),n.error(e),a(i.cancel(e)),null}return h||o.enqueue(u),p||n.enqueue(c),s=!1,d?S():f&&v(),null}),(()=>(s=!1,null)));}function w(t,r){l||(i.releaseLock(),i=e.getReader({mode:"byob"}),y(i),l=!0);const u=r?n:o,c=r?o:n;b(i.read(t),(e=>{var t;d=!1,f=!1;const o=r?p:h,n=r?h:p;if(e.done){o||u.close(),n||c.close();const r=e.value;return void 0!==r&&(o||u.byobRequest.respondWithNewView(r),n||null===(t=c.byobRequest)||void 0===t||t.respond(0)),o&&n||a(void 0),null}const l=e.value;if(n)o||u.byobRequest.respondWithNewView(l);else {let e;try{e=le(l);}catch(e){return u.error(e),c.error(e),a(i.cancel(e)),null}o||u.byobRequest.respondWithNewView(l),c.enqueue(e);}return s=!1,d?S():f&&v(),null}),(()=>(s=!1,null)));}function S(){if(s)return d=!0,c(void 0);s=!0;const e=o.byobRequest;return null===e?g():w(e.view,!1),c(void 0)}function v(){if(s)return f=!0,c(void 0);s=!0;const e=n.byobRequest;return null===e?g():w(e.view,!0),c(void 0)}function R(e){if(h=!0,t=e,p){const e=[t,r],o=i.cancel(e);a(o);}return m}function T(e){if(p=!0,r=e,h){const e=[t,r],o=i.cancel(e);a(o);}return m}const q=new ReadableStream$2({type:"bytes",start(e){o=e;},pull:S,cancel:R}),C=new ReadableStream$2({type:"bytes",start(e){n=e;},pull:v,cancel:T});return y(i),[q,C]}(e):function(e,t){const r=e.getReader();let o,n,a,i,l,s=!1,d=!1,f=!1,h=!1;const p=u((e=>{l=e;}));function m(){return s?(d=!0,c(void 0)):(s=!0,b(r.read(),(e=>{if(d=!1,e.done)return f||a.close(),h||i.close(),f&&h||l(void 0),null;const t=e.value,r=t,o=t;return f||a.enqueue(r),h||i.enqueue(o),s=!1,d&&m(),null}),(()=>(s=!1,null))),c(void 0))}function y(e){if(f=!0,o=e,h){const e=[o,n],t=r.cancel(e);l(t);}return p}function g(e){if(h=!0,n=e,f){const e=[o,n],t=r.cancel(e);l(t);}return p}const w=new ReadableStream$2({start(e){a=e;},pull:m,cancel:y}),S=new ReadableStream$2({start(e){i=e;},pull:m,cancel:g});return _(r.closed,(e=>(a.error(e),i.error(e),f&&h||l(void 0),null))),[w,S]}(e)}class ReadableStreamDefaultController$1{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Bt(this))throw Dt("desiredSize");return Lt(this)}close(){if(!Bt(this))throw Dt("close");if(!Ft(this))throw new TypeError("The stream is not in a state that permits close");!function(e){if(!Ft(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(jt(e),Xt(t));}(this);}enqueue(e){if(!Bt(this))throw Dt("enqueue");if(!Ft(this))throw new TypeError("The stream is not in a state that permits enqueue");return function(e,t){if(!Ft(e))return;const r=e._controlledReadableStream;if(Ut(r)&&X(r)>0)G(r,t,!1);else {let r;try{r=e._strategySizeAlgorithm(t);}catch(t){throw zt(e,t),t}try{ue(e,t,r);}catch(t){throw zt(e,t),t}}At(e);}(this,e)}error(e){if(!Bt(this))throw Dt("error");zt(this,e);}[T](e){ce(this);const t=this._cancelAlgorithm(e);return jt(this),t}[q](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=se(this);this._closeRequested&&0===this._queue.length?(jt(this),Xt(t)):At(this),e._chunkSteps(r);}else U(t,e),At(this);}[C](){}}function Bt(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController$1)}function At(e){const t=function(e){const t=e._controlledReadableStream;if(!Ft(e))return !1;if(!e._started)return !1;if(Ut(t)&&X(t)>0)return !0;if(Lt(e)>0)return !0;return !1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;b(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,At(e)),null)),(t=>(zt(e,t),null)));}function jt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0;}function zt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(ce(e),jt(e),Jt(r,t));}function Lt(e){const t=e._controlledReadableStream._state;return "errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Ft(e){return !e._closeRequested&&"readable"===e._controlledReadableStream._state}function It(e,t,r,o){const n=Object.create(ReadableStreamDefaultController$1.prototype);let a,i,l;a=void 0!==t.start?()=>t.start(n):()=>{},i=void 0!==t.pull?()=>t.pull(n):()=>c(void 0),l=void 0!==t.cancel?e=>t.cancel(e):()=>c(void 0),function(e,t,r,o,n,a,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,ce(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,e._readableStreamController=t,b(c(r()),(()=>(t._started=!0,At(t),null)),(e=>(zt(t,e),null)));}(e,n,a,i,l,r,o);}function Dt(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function $t(e,t,r){return I(e,r),r=>w(e,t,[r])}function Mt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Yt(e,t,r){return I(e,r),r=>g(e,t,[r])}function Qt(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function Nt(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function Ht(e,t){F(e,t);const r=null==e?void 0:e.preventAbort,o=null==e?void 0:e.preventCancel,n=null==e?void 0:e.preventClose,a=null==e?void 0:e.signal;return void 0!==a&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return !1;try{return "boolean"==typeof e.aborted}catch(e){return !1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(a,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(o),preventClose:Boolean(n),signal:a}}function xt(e,t){F(e,t);const r=null==e?void 0:e.readable;M(r,"readable","ReadableWritablePair"),function(e,t){if(!H(e))throw new TypeError(`${t} is not a ReadableStream.`)}(r,`${t} has member 'readable' that`);const o=null==e?void 0:e.writable;return M(o,"writable","ReadableWritablePair"),function(e,t){if(!x(e))throw new TypeError(`${t} is not a WritableStream.`)}(o,`${t} has member 'writable' that`),{readable:r,writable:o}}Object.defineProperties(ReadableStreamDefaultController$1.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),n(ReadableStreamDefaultController$1.prototype.close,"close"),n(ReadableStreamDefaultController$1.prototype.enqueue,"enqueue"),n(ReadableStreamDefaultController$1.prototype.error,"error"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableStreamDefaultController$1.prototype,e.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream$2{constructor(e={},t={}){void 0===e?e=null:D(e,"First parameter");const r=Ye(t,"Second parameter"),o=function(e,t){F(e,t);const r=e,o=null==r?void 0:r.autoAllocateChunkSize,n=null==r?void 0:r.cancel,a=null==r?void 0:r.pull,i=null==r?void 0:r.start,l=null==r?void 0:r.type;return {autoAllocateChunkSize:void 0===o?void 0:N(o,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===n?void 0:$t(n,r,`${t} has member 'cancel' that`),pull:void 0===a?void 0:Mt(a,r,`${t} has member 'pull' that`),start:void 0===i?void 0:Yt(i,r,`${t} has member 'start' that`),type:void 0===l?void 0:Qt(l,`${t} has member 'type' that`)}}(e,"First parameter");var n;if((n=this)._state="readable",n._reader=void 0,n._storedError=void 0,n._disturbed=!1,"bytes"===o.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");Oe(this,o,$e(r,0));}else {const e=Me(r);It(this,o,$e(r,1),e);}}get locked(){if(!Vt(this))throw Kt("locked");return Ut(this)}cancel(e){return Vt(this)?Ut(this)?d(new TypeError("Cannot cancel a stream that already has a reader")):Gt(this,e):d(Kt("cancel"))}getReader(e){if(!Vt(this))throw Kt("getReader");return void 0===function(e,t){F(e,t);const r=null==e?void 0:e.mode;return {mode:void 0===r?void 0:Nt(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?new ReadableStreamDefaultReader$1(this):function(e){return new ReadableStreamBYOBReader$1(e)}(this)}pipeThrough(e,t={}){if(!H(this))throw Kt("pipeThrough");$(e,1,"pipeThrough");const r=xt(e,"First parameter"),o=Ht(t,"Second parameter");if(this.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(r.writable.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return m(kt(this,r.writable,o.preventClose,o.preventAbort,o.preventCancel,o.signal)),r.readable}pipeTo(e,t={}){if(!H(this))return d(Kt("pipeTo"));if(void 0===e)return d("Parameter 1 is required in 'pipeTo'.");if(!x(e))return d(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=Ht(t,"Second parameter");}catch(e){return d(e)}return this.locked?d(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):e.locked?d(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):kt(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!H(this))throw Kt("tee");if(this.locked)throw new TypeError("Cannot tee a stream that already has a reader");return Ot(this)}values(e){if(!H(this))throw Kt("values");return function(e,t){const r=e.getReader(),o=new te(r,t),n=Object.create(re);return n._asyncIteratorImpl=o,n}(this,function(e,t){F(e,t);const r=null==e?void 0:e.preventCancel;return {preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function Vt(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream$2)}function Ut(e){return void 0!==e._reader}function Gt(e,r){if(e._disturbed=!0,"closed"===e._state)return c(void 0);if("errored"===e._state)return d(e._storedError);Xt(e);const o=e._reader;if(void 0!==o&&Fe(o)){const e=o._readIntoRequests;o._readIntoRequests=new S,e.forEach((e=>{e._closeSteps(void 0);}));}return p(e._readableStreamController[T](r),t)}function Xt(e){e._state="closed";const t=e._reader;if(void 0!==t&&(j(t),K(t))){const e=t._readRequests;t._readRequests=new S,e.forEach((e=>{e._closeSteps();}));}}function Jt(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(A(r,t),K(r)?Z(r,t):Ie(r,t));}function Kt(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function Zt(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark;return M(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:Y(r)}}Object.defineProperties(ReadableStream$2.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),n(ReadableStream$2.prototype.cancel,"cancel"),n(ReadableStream$2.prototype.getReader,"getReader"),n(ReadableStream$2.prototype.pipeThrough,"pipeThrough"),n(ReadableStream$2.prototype.pipeTo,"pipeTo"),n(ReadableStream$2.prototype.tee,"tee"),n(ReadableStream$2.prototype.values,"values"),"symbol"==typeof e.toStringTag&&Object.defineProperty(ReadableStream$2.prototype,e.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof e.asyncIterator&&Object.defineProperty(ReadableStream$2.prototype,e.asyncIterator,{value:ReadableStream$2.prototype.values,writable:!0,configurable:!0});const er=e=>e.byteLength;n(er,"size");class ByteLengthQueuingStrategy$1{constructor(e){$(e,1,"ByteLengthQueuingStrategy"),e=Zt(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark;}get highWaterMark(){if(!rr(this))throw tr("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!rr(this))throw tr("size");return er}}function tr(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function rr(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy$1)}Object.defineProperties(ByteLengthQueuingStrategy$1.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof e.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy$1.prototype,e.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const or=()=>1;n(or,"size");class CountQueuingStrategy$1{constructor(e){$(e,1,"CountQueuingStrategy"),e=Zt(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark;}get highWaterMark(){if(!ar(this))throw nr("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!ar(this))throw nr("size");return or}}function nr(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function ar(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy$1)}function ir(e,t,r){return I(e,r),r=>w(e,t,[r])}function lr(e,t,r){return I(e,r),r=>g(e,t,[r])}function sr(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(CountQueuingStrategy$1.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof e.toStringTag&&Object.defineProperty(CountQueuingStrategy$1.prototype,e.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream$1{constructor(e={},t={},r={}){void 0===e&&(e=null);const o=Ye(t,"Second parameter"),n=Ye(r,"Third parameter"),a=function(e,t){F(e,t);const r=null==e?void 0:e.flush,o=null==e?void 0:e.readableType,n=null==e?void 0:e.start,a=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return {flush:void 0===r?void 0:ir(r,e,`${t} has member 'flush' that`),readableType:o,start:void 0===n?void 0:lr(n,e,`${t} has member 'start' that`),transform:void 0===a?void 0:sr(a,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==a.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==a.writableType)throw new RangeError("Invalid writableType specified");const i=$e(n,0),l=Me(n),s=$e(o,1),f=Me(o);let b;!function(e,t,r,o,n,a){function i(){return t}function l(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return p(e._backpressureChangePromise,(()=>{if("erroring"===(Ge(e._writable)?e._writable._state:e._writableState))throw Ge(e._writable)?e._writable._storedError:e._writableStoredError;return pr(r,t)}))}return pr(r,t)}(e,t)}function s(t){return function(e,t){return cr(e,t),c(void 0)}(e,t)}function u(){return function(e){const t=e._transformStreamController,r=t._flushAlgorithm();return hr(t),p(r,(()=>{if("errored"===e._readableState)throw e._readableStoredError;gr(e)&&wr(e);}),(t=>{throw cr(e,t),e._readableStoredError}))}(e)}function d(){return function(e){return fr(e,!1),e._backpressureChangePromise}(e)}function f(t){return dr(e,t),c(void 0)}e._writableState="writable",e._writableStoredError=void 0,e._writableHasInFlightOperation=!1,e._writableStarted=!1,e._writable=function(e,t,r,o,n,a,i){return new WritableStream$1({start(r){e._writableController=r;try{const t=r.signal;void 0!==t&&t.addEventListener("abort",(()=>{"writable"===e._writableState&&(e._writableState="erroring",t.reason&&(e._writableStoredError=t.reason));}));}catch(e){}return p(t(),(()=>(e._writableStarted=!0,Cr(e),null)),(t=>{throw e._writableStarted=!0,Rr(e,t),t}))},write:t=>(function(e){e._writableHasInFlightOperation=!0;}(e),p(r(t),(()=>(function(e){e._writableHasInFlightOperation=!1;}(e),Cr(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,Rr(e,t);}(e,t),t}))),close:()=>(function(e){e._writableHasInFlightOperation=!0;}(e),p(o(),(()=>(function(e){e._writableHasInFlightOperation=!1;"erroring"===e._writableState&&(e._writableStoredError=void 0);e._writableState="closed";}(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,e._writableState,Rr(e,t);}(e,t),t}))),abort:t=>(e._writableState="errored",e._writableStoredError=t,n(t))},{highWaterMark:a,size:i})}(e,i,l,u,s,r,o),e._readableState="readable",e._readableStoredError=void 0,e._readableCloseRequested=!1,e._readablePulling=!1,e._readable=function(e,t,r,o,n,a){return new ReadableStream$2({start:r=>(e._readableController=r,t().catch((t=>{Sr(e,t);}))),pull:()=>(e._readablePulling=!0,r().catch((t=>{Sr(e,t);}))),cancel:t=>(e._readableState="closed",o(t))},{highWaterMark:n,size:a})}(e,i,d,f,n,a),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,fr(e,!0),e._transformStreamController=void 0;}(this,u((e=>{b=e;})),s,f,i,l),function(e,t){const r=Object.create(TransformStreamDefaultController$1.prototype);let o,n;o=void 0!==t.transform?e=>t.transform(e,r):e=>{try{return _r(r,e),c(void 0)}catch(e){return d(e)}};n=void 0!==t.flush?()=>t.flush(r):()=>c(void 0);!function(e,t,r,o){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=o;}(e,r,o,n);}(this,a),void 0!==a.start?b(a.start(this._transformStreamController)):b(void 0);}get readable(){if(!ur(this))throw yr("readable");return this._readable}get writable(){if(!ur(this))throw yr("writable");return this._writable}}function ur(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream$1)}function cr(e,t){Sr(e,t),dr(e,t);}function dr(e,t){hr(e._transformStreamController),function(e,t){e._writableController.error(t);"writable"===e._writableState&&Tr(e,t);}(e,t),e._backpressure&&fr(e,!1);}function fr(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=u((t=>{e._backpressureChangePromise_resolve=t;})),e._backpressure=t;}Object.defineProperties(TransformStream$1.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof e.toStringTag&&Object.defineProperty(TransformStream$1.prototype,e.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController$1{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!br(this))throw mr("desiredSize");return vr(this._controlledTransformStream)}enqueue(e){if(!br(this))throw mr("enqueue");_r(this,e);}error(e){if(!br(this))throw mr("error");var t;t=e,cr(this._controlledTransformStream,t);}terminate(){if(!br(this))throw mr("terminate");!function(e){const t=e._controlledTransformStream;gr(t)&&wr(t);const r=new TypeError("TransformStream terminated");dr(t,r);}(this);}}function br(e){return !!r(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController$1)}function hr(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0;}function _r(e,t){const r=e._controlledTransformStream;if(!gr(r))throw new TypeError("Readable side is not in a state that permits enqueue");try{!function(e,t){e._readablePulling=!1;try{e._readableController.enqueue(t);}catch(t){throw Sr(e,t),t}}(r,t);}catch(e){throw dr(r,e),r._readableStoredError}const o=function(e){return !function(e){if(!gr(e))return !1;if(e._readablePulling)return !0;if(vr(e)>0)return !0;return !1}(e)}(r);o!==r._backpressure&&fr(r,!0);}function pr(e,t){return p(e._transformAlgorithm(t),void 0,(t=>{throw cr(e._controlledTransformStream,t),t}))}function mr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function yr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}function gr(e){return !e._readableCloseRequested&&"readable"===e._readableState}function wr(e){e._readableState="closed",e._readableCloseRequested=!0,e._readableController.close();}function Sr(e,t){"readable"===e._readableState&&(e._readableState="errored",e._readableStoredError=t),e._readableController.error(t);}function vr(e){return e._readableController.desiredSize}function Rr(e,t){"writable"!==e._writableState?qr(e):Tr(e,t);}function Tr(e,t){e._writableState="erroring",e._writableStoredError=t,!function(e){return e._writableHasInFlightOperation}(e)&&e._writableStarted&&qr(e);}function qr(e){e._writableState="errored";}function Cr(e){"erroring"===e._writableState&&qr(e);}Object.defineProperties(TransformStreamDefaultController$1.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),n(TransformStreamDefaultController$1.prototype.enqueue,"enqueue"),n(TransformStreamDefaultController$1.prototype.error,"error"),n(TransformStreamDefaultController$1.prototype.terminate,"terminate"),"symbol"==typeof e.toStringTag&&Object.defineProperty(TransformStreamDefaultController$1.prototype,e.toStringTag,{value:"TransformStreamDefaultController",configurable:!0}); const isFunction$1 = (value) => (typeof value === "function"); /*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ const CHUNK_SIZE = 65536; async function* clonePart(part) { const end = part.byteOffset + part.byteLength; let position = part.byteOffset; while (position !== end) { const size = Math.min(end - position, CHUNK_SIZE); const chunk = part.buffer.slice(position, position + size); position += chunk.byteLength; yield new Uint8Array(chunk); } } async function* consumeNodeBlob(blob) { let position = 0; while (position !== blob.size) { const chunk = blob.slice(position, Math.min(blob.size, position + CHUNK_SIZE)); const buffer = await chunk.arrayBuffer(); position += buffer.byteLength; yield new Uint8Array(buffer); } } async function* consumeBlobParts(parts, clone = false) { for (const part of parts) { if (ArrayBuffer.isView(part)) { if (clone) { yield* clonePart(part); } else { yield part; } } else if (isFunction$1(part.stream)) { yield* part.stream(); } else { yield* consumeNodeBlob(part); } } } function* sliceBlob(blobParts, blobSize, start = 0, end) { end !== null && end !== void 0 ? end : (end = blobSize); let relativeStart = start < 0 ? Math.max(blobSize + start, 0) : Math.min(start, blobSize); let relativeEnd = end < 0 ? Math.max(blobSize + end, 0) : Math.min(end, blobSize); const span = Math.max(relativeEnd - relativeStart, 0); let added = 0; for (const part of blobParts) { if (added >= span) { break; } const partSize = ArrayBuffer.isView(part) ? part.byteLength : part.size; if (relativeStart && partSize <= relativeStart) { relativeStart -= partSize; relativeEnd -= partSize; } else { let chunk; if (ArrayBuffer.isView(part)) { chunk = part.subarray(relativeStart, Math.min(partSize, relativeEnd)); added += chunk.byteLength; } else { chunk = part.slice(relativeStart, Math.min(partSize, relativeEnd)); added += chunk.size; } relativeEnd -= partSize; relativeStart = 0; yield chunk; } } } /*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ var __classPrivateFieldGet$2 = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __classPrivateFieldSet$1 = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _Blob_parts, _Blob_type, _Blob_size; class Blob$1 { constructor(blobParts = [], options = {}) { _Blob_parts.set(this, []); _Blob_type.set(this, ""); _Blob_size.set(this, 0); options !== null && options !== void 0 ? options : (options = {}); if (typeof blobParts !== "object" || blobParts === null) { throw new TypeError("Failed to construct 'Blob': " + "The provided value cannot be converted to a sequence."); } if (!isFunction$1(blobParts[Symbol.iterator])) { throw new TypeError("Failed to construct 'Blob': " + "The object must have a callable @@iterator property."); } if (typeof options !== "object" && !isFunction$1(options)) { throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary."); } const encoder = new TextEncoder(); for (const raw of blobParts) { let part; if (ArrayBuffer.isView(raw)) { part = new Uint8Array(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)); } else if (raw instanceof ArrayBuffer) { part = new Uint8Array(raw.slice(0)); } else if (raw instanceof Blob$1) { part = raw; } else { part = encoder.encode(String(raw)); } __classPrivateFieldSet$1(this, _Blob_size, __classPrivateFieldGet$2(this, _Blob_size, "f") + (ArrayBuffer.isView(part) ? part.byteLength : part.size), "f"); __classPrivateFieldGet$2(this, _Blob_parts, "f").push(part); } const type = options.type === undefined ? "" : String(options.type); __classPrivateFieldSet$1(this, _Blob_type, /^[\x20-\x7E]*$/.test(type) ? type : "", "f"); } static [(_Blob_parts = new WeakMap(), _Blob_type = new WeakMap(), _Blob_size = new WeakMap(), Symbol.hasInstance)](value) { return Boolean(value && typeof value === "object" && isFunction$1(value.constructor) && (isFunction$1(value.stream) || isFunction$1(value.arrayBuffer)) && /^(Blob|File)$/.test(value[Symbol.toStringTag])); } get type() { return __classPrivateFieldGet$2(this, _Blob_type, "f"); } get size() { return __classPrivateFieldGet$2(this, _Blob_size, "f"); } slice(start, end, contentType) { return new Blob$1(sliceBlob(__classPrivateFieldGet$2(this, _Blob_parts, "f"), this.size, start, end), { type: contentType }); } async text() { const decoder = new TextDecoder(); let result = ""; for await (const chunk of consumeBlobParts(__classPrivateFieldGet$2(this, _Blob_parts, "f"))) { result += decoder.decode(chunk, { stream: true }); } result += decoder.decode(); return result; } async arrayBuffer() { const view = new Uint8Array(this.size); let offset = 0; for await (const chunk of consumeBlobParts(__classPrivateFieldGet$2(this, _Blob_parts, "f"))) { view.set(chunk, offset); offset += chunk.length; } return view.buffer; } stream() { const iterator = consumeBlobParts(__classPrivateFieldGet$2(this, _Blob_parts, "f"), true); return new ReadableStream$2({ async pull(controller) { const { value, done } = await iterator.next(); if (done) { return queueMicrotask(() => controller.close()); } controller.enqueue(value); }, async cancel() { await iterator.return(); } }); } get [Symbol.toStringTag]() { return "Blob"; } } Object.defineProperties(Blob$1.prototype, { type: { enumerable: true }, size: { enumerable: true }, slice: { enumerable: true }, stream: { enumerable: true }, text: { enumerable: true }, arrayBuffer: { enumerable: true } }); var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet$1 = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _File_name, _File_lastModified; class File extends Blob$1 { constructor(fileBits, name, options = {}) { super(fileBits, options); _File_name.set(this, void 0); _File_lastModified.set(this, 0); if (arguments.length < 2) { throw new TypeError("Failed to construct 'File': 2 arguments required, " + `but only ${arguments.length} present.`); } __classPrivateFieldSet(this, _File_name, String(name), "f"); const lastModified = options.lastModified === undefined ? Date.now() : Number(options.lastModified); if (!Number.isNaN(lastModified)) { __classPrivateFieldSet(this, _File_lastModified, lastModified, "f"); } } static [(_File_name = new WeakMap(), _File_lastModified = new WeakMap(), Symbol.hasInstance)](value) { return value instanceof Blob$1 && value[Symbol.toStringTag] === "File" && typeof value.name === "string"; } get name() { return __classPrivateFieldGet$1(this, _File_name, "f"); } get lastModified() { return __classPrivateFieldGet$1(this, _File_lastModified, "f"); } get webkitRelativePath() { return ""; } get [Symbol.toStringTag]() { return "File"; } } const isFile = (value) => value instanceof File; const isBlob$1 = (value) => value instanceof Blob$1; const deprecateConstructorEntries = deprecate(() => { }, "Constructor \"entries\" argument is not spec-compliant " + "and will be removed in next major release."); var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _FormData_instances, _FormData_entries, _FormData_setEntry; class FormData { constructor(entries) { _FormData_instances.add(this); _FormData_entries.set(this, new Map()); if (entries) { deprecateConstructorEntries(); entries.forEach(({ name, value, fileName }) => this.append(name, value, fileName)); } } static [(_FormData_entries = new WeakMap(), _FormData_instances = new WeakSet(), Symbol.hasInstance)](value) { return Boolean(value && isFunction$1(value.constructor) && value[Symbol.toStringTag] === "FormData" && isFunction$1(value.append) && isFunction$1(value.set) && isFunction$1(value.get) && isFunction$1(value.getAll) && isFunction$1(value.has) && isFunction$1(value.delete) && isFunction$1(value.entries) && isFunction$1(value.values) && isFunction$1(value.keys) && isFunction$1(value[Symbol.iterator]) && isFunction$1(value.forEach)); } append(name, value, fileName) { __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { name, fileName, append: true, rawValue: value, argsLength: arguments.length }); } set(name, value, fileName) { __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { name, fileName, append: false, rawValue: value, argsLength: arguments.length }); } get(name) { const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); if (!field) { return null; } return field[0]; } getAll(name) { const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); if (!field) { return []; } return field.slice(); } has(name) { return __classPrivateFieldGet(this, _FormData_entries, "f").has(String(name)); } delete(name) { __classPrivateFieldGet(this, _FormData_entries, "f").delete(String(name)); } *keys() { for (const key of __classPrivateFieldGet(this, _FormData_entries, "f").keys()) { yield key; } } *entries() { for (const name of this.keys()) { const values = this.getAll(name); for (const value of values) { yield [name, value]; } } } *values() { for (const [, value] of this) { yield value; } } [(_FormData_setEntry = function _FormData_setEntry({ name, rawValue, append, fileName, argsLength }) { const methodName = append ? "append" : "set"; if (argsLength < 2) { throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + `2 arguments required, but only ${argsLength} present.`); } name = String(name); let value; if (isFile(rawValue)) { value = fileName === undefined ? rawValue : new File([rawValue], fileName, { type: rawValue.type, lastModified: rawValue.lastModified }); } else if (isBlob$1(rawValue)) { value = new File([rawValue], fileName === undefined ? "blob" : fileName, { type: rawValue.type }); } else if (fileName) { throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + "parameter 2 is not of type 'Blob'."); } else { value = String(rawValue); } const values = __classPrivateFieldGet(this, _FormData_entries, "f").get(name); if (!values) { return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); } if (!append) { return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); } values.push(value); }, Symbol.iterator)]() { return this.entries(); } forEach(callback, thisArg) { for (const [name, value] of this) { callback.call(thisArg, value, name, this); } } get [Symbol.toStringTag]() { return "FormData"; } [inspect$2.custom]() { return this[Symbol.toStringTag]; } } var esm = /*#__PURE__*/Object.freeze({ __proto__: null, FormData: FormData, Blob: Blob$1, File: File }); var require$$4 = /*@__PURE__*/getAugmentedNamespace(esm); /** * web-streams-polyfill v3.2.1 */ /// var SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol : function (description) { return "Symbol(" + description + ")"; }; /// function noop() { return undefined; } function getGlobals() { if (typeof self !== 'undefined') { return self; } else if (typeof window !== 'undefined') { return window; } else if (typeof global !== 'undefined') { return global; } return undefined; } var globals = getGlobals(); function typeIsObject(x) { return (typeof x === 'object' && x !== null) || typeof x === 'function'; } var rethrowAssertionErrorRejection = noop; var originalPromise = Promise; var originalPromiseThen = Promise.prototype.then; var originalPromiseResolve = Promise.resolve.bind(originalPromise); var originalPromiseReject = Promise.reject.bind(originalPromise); function newPromise(executor) { return new originalPromise(executor); } function promiseResolvedWith(value) { return originalPromiseResolve(value); } function promiseRejectedWith(reason) { return originalPromiseReject(reason); } function PerformPromiseThen(promise, onFulfilled, onRejected) { // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an // approximation. return originalPromiseThen.call(promise, onFulfilled, onRejected); } function uponPromise(promise, onFulfilled, onRejected) { PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); } function uponFulfillment(promise, onFulfilled) { uponPromise(promise, onFulfilled); } function uponRejection(promise, onRejected) { uponPromise(promise, undefined, onRejected); } function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) { return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler); } function setPromiseIsHandledToTrue(promise) { PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); } var queueMicrotask$1 = (function () { var globalQueueMicrotask = globals && globals.queueMicrotask; if (typeof globalQueueMicrotask === 'function') { return globalQueueMicrotask; } var resolvedPromise = promiseResolvedWith(undefined); return function (fn) { return PerformPromiseThen(resolvedPromise, fn); }; })(); function reflectCall(F, V, args) { if (typeof F !== 'function') { throw new TypeError('Argument is not a function'); } return Function.prototype.apply.call(F, V, args); } function promiseCall(F, V, args) { try { return promiseResolvedWith(reflectCall(F, V, args)); } catch (value) { return promiseRejectedWith(value); } } // Original from Chromium // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js var QUEUE_MAX_ARRAY_SIZE = 16384; /** * Simple queue structure. * * Avoids scalability issues with using a packed array directly by using * multiple arrays in a linked list and keeping the array size bounded. */ var SimpleQueue = /** @class */ (function () { function SimpleQueue() { this._cursor = 0; this._size = 0; // _front and _back are always defined. this._front = { _elements: [], _next: undefined }; this._back = this._front; // The cursor is used to avoid calling Array.shift(). // It contains the index of the front element of the array inside the // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE). this._cursor = 0; // When there is only one node, size === elements.length - cursor. this._size = 0; } Object.defineProperty(SimpleQueue.prototype, "length", { get: function () { return this._size; }, enumerable: false, configurable: true }); // For exception safety, this method is structured in order: // 1. Read state // 2. Calculate required state mutations // 3. Perform state mutations SimpleQueue.prototype.push = function (element) { var oldBack = this._back; var newBack = oldBack; if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) { newBack = { _elements: [], _next: undefined }; } // push() is the mutation most likely to throw an exception, so it // goes first. oldBack._elements.push(element); if (newBack !== oldBack) { this._back = newBack; oldBack._next = newBack; } ++this._size; }; // Like push(), shift() follows the read -> calculate -> mutate pattern for // exception safety. SimpleQueue.prototype.shift = function () { // must not be called on an empty queue var oldFront = this._front; var newFront = oldFront; var oldCursor = this._cursor; var newCursor = oldCursor + 1; var elements = oldFront._elements; var element = elements[oldCursor]; if (newCursor === QUEUE_MAX_ARRAY_SIZE) { newFront = oldFront._next; newCursor = 0; } // No mutations before this point. --this._size; this._cursor = newCursor; if (oldFront !== newFront) { this._front = newFront; } // Permit shifted element to be garbage collected. elements[oldCursor] = undefined; return element; }; // The tricky thing about forEach() is that it can be called // re-entrantly. The queue may be mutated inside the callback. It is easy to // see that push() within the callback has no negative effects since the end // of the queue is checked for on every iteration. If shift() is called // repeatedly within the callback then the next iteration may return an // element that has been removed. In this case the callback will be called // with undefined values until we either "catch up" with elements that still // exist or reach the back of the queue. SimpleQueue.prototype.forEach = function (callback) { var i = this._cursor; var node = this._front; var elements = node._elements; while (i !== elements.length || node._next !== undefined) { if (i === elements.length) { node = node._next; elements = node._elements; i = 0; if (elements.length === 0) { break; } } callback(elements[i]); ++i; } }; // Return the element that would be returned if shift() was called now, // without modifying the queue. SimpleQueue.prototype.peek = function () { // must not be called on an empty queue var front = this._front; var cursor = this._cursor; return front._elements[cursor]; }; return SimpleQueue; }()); function ReadableStreamReaderGenericInitialize(reader, stream) { reader._ownerReadableStream = stream; stream._reader = reader; if (stream._state === 'readable') { defaultReaderClosedPromiseInitialize(reader); } else if (stream._state === 'closed') { defaultReaderClosedPromiseInitializeAsResolved(reader); } else { defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); } } // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state // check. function ReadableStreamReaderGenericCancel(reader, reason) { var stream = reader._ownerReadableStream; return ReadableStreamCancel(stream, reason); } function ReadableStreamReaderGenericRelease(reader) { if (reader._ownerReadableStream._state === 'readable') { defaultReaderClosedPromiseReject(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")); } else { defaultReaderClosedPromiseResetToRejected(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")); } reader._ownerReadableStream._reader = undefined; reader._ownerReadableStream = undefined; } // Helper functions for the readers. function readerLockException(name) { return new TypeError('Cannot ' + name + ' a stream using a released reader'); } // Helper functions for the ReadableStreamDefaultReader. function defaultReaderClosedPromiseInitialize(reader) { reader._closedPromise = newPromise(function (resolve, reject) { reader._closedPromise_resolve = resolve; reader._closedPromise_reject = reject; }); } function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) { defaultReaderClosedPromiseInitialize(reader); defaultReaderClosedPromiseReject(reader, reason); } function defaultReaderClosedPromiseInitializeAsResolved(reader) { defaultReaderClosedPromiseInitialize(reader); defaultReaderClosedPromiseResolve(reader); } function defaultReaderClosedPromiseReject(reader, reason) { if (reader._closedPromise_reject === undefined) { return; } setPromiseIsHandledToTrue(reader._closedPromise); reader._closedPromise_reject(reason); reader._closedPromise_resolve = undefined; reader._closedPromise_reject = undefined; } function defaultReaderClosedPromiseResetToRejected(reader, reason) { defaultReaderClosedPromiseInitializeAsRejected(reader, reason); } function defaultReaderClosedPromiseResolve(reader) { if (reader._closedPromise_resolve === undefined) { return; } reader._closedPromise_resolve(undefined); reader._closedPromise_resolve = undefined; reader._closedPromise_reject = undefined; } var AbortSteps = SymbolPolyfill('[[AbortSteps]]'); var ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); var CancelSteps = SymbolPolyfill('[[CancelSteps]]'); var PullSteps = SymbolPolyfill('[[PullSteps]]'); /// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill var NumberIsFinite = Number.isFinite || function (x) { return typeof x === 'number' && isFinite(x); }; /// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill var MathTrunc = Math.trunc || function (v) { return v < 0 ? Math.ceil(v) : Math.floor(v); }; // https://heycam.github.io/webidl/#idl-dictionaries function isDictionary(x) { return typeof x === 'object' || typeof x === 'function'; } function assertDictionary(obj, context) { if (obj !== undefined && !isDictionary(obj)) { throw new TypeError(context + " is not an object."); } } // https://heycam.github.io/webidl/#idl-callback-functions function assertFunction(x, context) { if (typeof x !== 'function') { throw new TypeError(context + " is not a function."); } } // https://heycam.github.io/webidl/#idl-object function isObject(x) { return (typeof x === 'object' && x !== null) || typeof x === 'function'; } function assertObject(x, context) { if (!isObject(x)) { throw new TypeError(context + " is not an object."); } } function assertRequiredArgument(x, position, context) { if (x === undefined) { throw new TypeError("Parameter " + position + " is required in '" + context + "'."); } } function assertRequiredField(x, field, context) { if (x === undefined) { throw new TypeError(field + " is required in '" + context + "'."); } } // https://heycam.github.io/webidl/#idl-unrestricted-double function convertUnrestrictedDouble(value) { return Number(value); } function censorNegativeZero(x) { return x === 0 ? 0 : x; } function integerPart(x) { return censorNegativeZero(MathTrunc(x)); } // https://heycam.github.io/webidl/#idl-unsigned-long-long function convertUnsignedLongLongWithEnforceRange(value, context) { var lowerBound = 0; var upperBound = Number.MAX_SAFE_INTEGER; var x = Number(value); x = censorNegativeZero(x); if (!NumberIsFinite(x)) { throw new TypeError(context + " is not a finite number"); } x = integerPart(x); if (x < lowerBound || x > upperBound) { throw new TypeError(context + " is outside the accepted range of " + lowerBound + " to " + upperBound + ", inclusive"); } if (!NumberIsFinite(x) || x === 0) { return 0; } // TODO Use BigInt if supported? // let xBigInt = BigInt(integerPart(x)); // xBigInt = BigInt.asUintN(64, xBigInt); // return Number(xBigInt); return x; } function assertReadableStream(x, context) { if (!IsReadableStream(x)) { throw new TypeError(context + " is not a ReadableStream."); } } // Abstract operations for the ReadableStream. function AcquireReadableStreamDefaultReader(stream) { return new ReadableStreamDefaultReader(stream); } // ReadableStream API exposed for controllers. function ReadableStreamAddReadRequest(stream, readRequest) { stream._reader._readRequests.push(readRequest); } function ReadableStreamFulfillReadRequest(stream, chunk, done) { var reader = stream._reader; var readRequest = reader._readRequests.shift(); if (done) { readRequest._closeSteps(); } else { readRequest._chunkSteps(chunk); } } function ReadableStreamGetNumReadRequests(stream) { return stream._reader._readRequests.length; } function ReadableStreamHasDefaultReader(stream) { var reader = stream._reader; if (reader === undefined) { return false; } if (!IsReadableStreamDefaultReader(reader)) { return false; } return true; } /** * A default reader vended by a {@link ReadableStream}. * * @public */ var ReadableStreamDefaultReader = /** @class */ (function () { function ReadableStreamDefaultReader(stream) { assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader'); assertReadableStream(stream, 'First parameter'); if (IsReadableStreamLocked(stream)) { throw new TypeError('This stream has already been locked for exclusive reading by another reader'); } ReadableStreamReaderGenericInitialize(this, stream); this._readRequests = new SimpleQueue(); } Object.defineProperty(ReadableStreamDefaultReader.prototype, "closed", { /** * Returns a promise that will be fulfilled when the stream becomes closed, * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing. */ get: function () { if (!IsReadableStreamDefaultReader(this)) { return promiseRejectedWith(defaultReaderBrandCheckException('closed')); } return this._closedPromise; }, enumerable: false, configurable: true }); /** * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. */ ReadableStreamDefaultReader.prototype.cancel = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsReadableStreamDefaultReader(this)) { return promiseRejectedWith(defaultReaderBrandCheckException('cancel')); } if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('cancel')); } return ReadableStreamReaderGenericCancel(this, reason); }; /** * Returns a promise that allows access to the next chunk from the stream's internal queue, if available. * * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. */ ReadableStreamDefaultReader.prototype.read = function () { if (!IsReadableStreamDefaultReader(this)) { return promiseRejectedWith(defaultReaderBrandCheckException('read')); } if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('read from')); } var resolvePromise; var rejectPromise; var promise = newPromise(function (resolve, reject) { resolvePromise = resolve; rejectPromise = reject; }); var readRequest = { _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); }, _closeSteps: function () { return resolvePromise({ value: undefined, done: true }); }, _errorSteps: function (e) { return rejectPromise(e); } }; ReadableStreamDefaultReaderRead(this, readRequest); return promise; }; /** * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. * If the associated stream is errored when the lock is released, the reader will appear errored in the same way * from now on; otherwise, the reader will appear closed. * * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to * do so will throw a `TypeError` and leave the reader locked to the stream. */ ReadableStreamDefaultReader.prototype.releaseLock = function () { if (!IsReadableStreamDefaultReader(this)) { throw defaultReaderBrandCheckException('releaseLock'); } if (this._ownerReadableStream === undefined) { return; } if (this._readRequests.length > 0) { throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); } ReadableStreamReaderGenericRelease(this); }; return ReadableStreamDefaultReader; }()); Object.defineProperties(ReadableStreamDefaultReader.prototype, { cancel: { enumerable: true }, read: { enumerable: true }, releaseLock: { enumerable: true }, closed: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableStreamDefaultReader', configurable: true }); } // Abstract operations for the readers. function IsReadableStreamDefaultReader(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) { return false; } return x instanceof ReadableStreamDefaultReader; } function ReadableStreamDefaultReaderRead(reader, readRequest) { var stream = reader._ownerReadableStream; stream._disturbed = true; if (stream._state === 'closed') { readRequest._closeSteps(); } else if (stream._state === 'errored') { readRequest._errorSteps(stream._storedError); } else { stream._readableStreamController[PullSteps](readRequest); } } // Helper functions for the ReadableStreamDefaultReader. function defaultReaderBrandCheckException(name) { return new TypeError("ReadableStreamDefaultReader.prototype." + name + " can only be used on a ReadableStreamDefaultReader"); } /// var _a$x; var AsyncIteratorPrototype; if (typeof SymbolPolyfill.asyncIterator === 'symbol') { // We're running inside a ES2018+ environment, but we're compiling to an older syntax. // We cannot access %AsyncIteratorPrototype% without non-ES2018 syntax, but we can re-create it. AsyncIteratorPrototype = (_a$x = {}, // 25.1.3.1 %AsyncIteratorPrototype% [ @@asyncIterator ] ( ) // https://tc39.github.io/ecma262/#sec-asynciteratorprototype-asynciterator _a$x[SymbolPolyfill.asyncIterator] = function () { return this; }, _a$x); Object.defineProperty(AsyncIteratorPrototype, SymbolPolyfill.asyncIterator, { enumerable: false }); } /// var ReadableStreamAsyncIteratorImpl = /** @class */ (function () { function ReadableStreamAsyncIteratorImpl(reader, preventCancel) { this._ongoingPromise = undefined; this._isFinished = false; this._reader = reader; this._preventCancel = preventCancel; } ReadableStreamAsyncIteratorImpl.prototype.next = function () { var _this = this; var nextSteps = function () { return _this._nextSteps(); }; this._ongoingPromise = this._ongoingPromise ? transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) : nextSteps(); return this._ongoingPromise; }; ReadableStreamAsyncIteratorImpl.prototype.return = function (value) { var _this = this; var returnSteps = function () { return _this._returnSteps(value); }; return this._ongoingPromise ? transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) : returnSteps(); }; ReadableStreamAsyncIteratorImpl.prototype._nextSteps = function () { var _this = this; if (this._isFinished) { return Promise.resolve({ value: undefined, done: true }); } var reader = this._reader; if (reader._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('iterate')); } var resolvePromise; var rejectPromise; var promise = newPromise(function (resolve, reject) { resolvePromise = resolve; rejectPromise = reject; }); var readRequest = { _chunkSteps: function (chunk) { _this._ongoingPromise = undefined; // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. // FIXME Is this a bug in the specification, or in the test? queueMicrotask$1(function () { return resolvePromise({ value: chunk, done: false }); }); }, _closeSteps: function () { _this._ongoingPromise = undefined; _this._isFinished = true; ReadableStreamReaderGenericRelease(reader); resolvePromise({ value: undefined, done: true }); }, _errorSteps: function (reason) { _this._ongoingPromise = undefined; _this._isFinished = true; ReadableStreamReaderGenericRelease(reader); rejectPromise(reason); } }; ReadableStreamDefaultReaderRead(reader, readRequest); return promise; }; ReadableStreamAsyncIteratorImpl.prototype._returnSteps = function (value) { if (this._isFinished) { return Promise.resolve({ value: value, done: true }); } this._isFinished = true; var reader = this._reader; if (reader._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('finish iterating')); } if (!this._preventCancel) { var result = ReadableStreamReaderGenericCancel(reader, value); ReadableStreamReaderGenericRelease(reader); return transformPromiseWith(result, function () { return ({ value: value, done: true }); }); } ReadableStreamReaderGenericRelease(reader); return promiseResolvedWith({ value: value, done: true }); }; return ReadableStreamAsyncIteratorImpl; }()); var ReadableStreamAsyncIteratorPrototype = { next: function () { if (!IsReadableStreamAsyncIterator(this)) { return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next')); } return this._asyncIteratorImpl.next(); }, return: function (value) { if (!IsReadableStreamAsyncIterator(this)) { return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return')); } return this._asyncIteratorImpl.return(value); } }; if (AsyncIteratorPrototype !== undefined) { Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); } // Abstract operations for the ReadableStream. function AcquireReadableStreamAsyncIterator(stream, preventCancel) { var reader = AcquireReadableStreamDefaultReader(stream); var impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel); var iterator = Object.create(ReadableStreamAsyncIteratorPrototype); iterator._asyncIteratorImpl = impl; return iterator; } function IsReadableStreamAsyncIterator(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) { return false; } try { // noinspection SuspiciousTypeOfGuard return x._asyncIteratorImpl instanceof ReadableStreamAsyncIteratorImpl; } catch (_a) { return false; } } // Helper functions for the ReadableStream. function streamAsyncIteratorBrandCheckException(name) { return new TypeError("ReadableStreamAsyncIterator." + name + " can only be used on a ReadableSteamAsyncIterator"); } /// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill var NumberIsNaN = Number.isNaN || function (x) { // eslint-disable-next-line no-self-compare return x !== x; }; function CreateArrayFromList(elements) { // We use arrays to represent lists, so this is basically a no-op. // Do a slice though just in case we happen to depend on the unique-ness. return elements.slice(); } function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); } // Not implemented correctly function TransferArrayBuffer(O) { return O; } // Not implemented correctly // eslint-disable-next-line @typescript-eslint/no-unused-vars function IsDetachedBuffer(O) { return false; } function ArrayBufferSlice(buffer, begin, end) { // ArrayBuffer.prototype.slice is not available on IE10 // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice if (buffer.slice) { return buffer.slice(begin, end); } var length = end - begin; var slice = new ArrayBuffer(length); CopyDataBlockBytes(slice, 0, buffer, begin, length); return slice; } function IsNonNegativeNumber(v) { if (typeof v !== 'number') { return false; } if (NumberIsNaN(v)) { return false; } if (v < 0) { return false; } return true; } function CloneAsUint8Array(O) { var buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength); return new Uint8Array(buffer); } function DequeueValue(container) { var pair = container._queue.shift(); container._queueTotalSize -= pair.size; if (container._queueTotalSize < 0) { container._queueTotalSize = 0; } return pair.value; } function EnqueueValueWithSize(container, value, size) { if (!IsNonNegativeNumber(size) || size === Infinity) { throw new RangeError('Size must be a finite, non-NaN, non-negative number.'); } container._queue.push({ value: value, size: size }); container._queueTotalSize += size; } function PeekQueueValue(container) { var pair = container._queue.peek(); return pair.value; } function ResetQueue(container) { container._queue = new SimpleQueue(); container._queueTotalSize = 0; } /** * A pull-into request in a {@link ReadableByteStreamController}. * * @public */ var ReadableStreamBYOBRequest = /** @class */ (function () { function ReadableStreamBYOBRequest() { throw new TypeError('Illegal constructor'); } Object.defineProperty(ReadableStreamBYOBRequest.prototype, "view", { /** * Returns the view for writing in to, or `null` if the BYOB request has already been responded to. */ get: function () { if (!IsReadableStreamBYOBRequest(this)) { throw byobRequestBrandCheckException('view'); } return this._view; }, enumerable: false, configurable: true }); ReadableStreamBYOBRequest.prototype.respond = function (bytesWritten) { if (!IsReadableStreamBYOBRequest(this)) { throw byobRequestBrandCheckException('respond'); } assertRequiredArgument(bytesWritten, 1, 'respond'); bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter'); if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } if (IsDetachedBuffer(this._view.buffer)) ; ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); }; ReadableStreamBYOBRequest.prototype.respondWithNewView = function (view) { if (!IsReadableStreamBYOBRequest(this)) { throw byobRequestBrandCheckException('respondWithNewView'); } assertRequiredArgument(view, 1, 'respondWithNewView'); if (!ArrayBuffer.isView(view)) { throw new TypeError('You can only respond with array buffer views'); } if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } if (IsDetachedBuffer(view.buffer)) ; ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); }; return ReadableStreamBYOBRequest; }()); Object.defineProperties(ReadableStreamBYOBRequest.prototype, { respond: { enumerable: true }, respondWithNewView: { enumerable: true }, view: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableStreamBYOBRequest', configurable: true }); } /** * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue. * * @public */ var ReadableByteStreamController = /** @class */ (function () { function ReadableByteStreamController() { throw new TypeError('Illegal constructor'); } Object.defineProperty(ReadableByteStreamController.prototype, "byobRequest", { /** * Returns the current BYOB pull request, or `null` if there isn't one. */ get: function () { if (!IsReadableByteStreamController(this)) { throw byteStreamControllerBrandCheckException('byobRequest'); } return ReadableByteStreamControllerGetBYOBRequest(this); }, enumerable: false, configurable: true }); Object.defineProperty(ReadableByteStreamController.prototype, "desiredSize", { /** * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure. */ get: function () { if (!IsReadableByteStreamController(this)) { throw byteStreamControllerBrandCheckException('desiredSize'); } return ReadableByteStreamControllerGetDesiredSize(this); }, enumerable: false, configurable: true }); /** * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from * the stream, but once those are read, the stream will become closed. */ ReadableByteStreamController.prototype.close = function () { if (!IsReadableByteStreamController(this)) { throw byteStreamControllerBrandCheckException('close'); } if (this._closeRequested) { throw new TypeError('The stream has already been closed; do not close it again!'); } var state = this._controlledReadableByteStream._state; if (state !== 'readable') { throw new TypeError("The stream (in " + state + " state) is not in the readable state and cannot be closed"); } ReadableByteStreamControllerClose(this); }; ReadableByteStreamController.prototype.enqueue = function (chunk) { if (!IsReadableByteStreamController(this)) { throw byteStreamControllerBrandCheckException('enqueue'); } assertRequiredArgument(chunk, 1, 'enqueue'); if (!ArrayBuffer.isView(chunk)) { throw new TypeError('chunk must be an array buffer view'); } if (chunk.byteLength === 0) { throw new TypeError('chunk must have non-zero byteLength'); } if (chunk.buffer.byteLength === 0) { throw new TypeError("chunk's buffer must have non-zero byteLength"); } if (this._closeRequested) { throw new TypeError('stream is closed or draining'); } var state = this._controlledReadableByteStream._state; if (state !== 'readable') { throw new TypeError("The stream (in " + state + " state) is not in the readable state and cannot be enqueued to"); } ReadableByteStreamControllerEnqueue(this, chunk); }; /** * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. */ ReadableByteStreamController.prototype.error = function (e) { if (e === void 0) { e = undefined; } if (!IsReadableByteStreamController(this)) { throw byteStreamControllerBrandCheckException('error'); } ReadableByteStreamControllerError(this, e); }; /** @internal */ ReadableByteStreamController.prototype[CancelSteps] = function (reason) { ReadableByteStreamControllerClearPendingPullIntos(this); ResetQueue(this); var result = this._cancelAlgorithm(reason); ReadableByteStreamControllerClearAlgorithms(this); return result; }; /** @internal */ ReadableByteStreamController.prototype[PullSteps] = function (readRequest) { var stream = this._controlledReadableByteStream; if (this._queueTotalSize > 0) { var entry = this._queue.shift(); this._queueTotalSize -= entry.byteLength; ReadableByteStreamControllerHandleQueueDrain(this); var view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); readRequest._chunkSteps(view); return; } var autoAllocateChunkSize = this._autoAllocateChunkSize; if (autoAllocateChunkSize !== undefined) { var buffer = void 0; try { buffer = new ArrayBuffer(autoAllocateChunkSize); } catch (bufferE) { readRequest._errorSteps(bufferE); return; } var pullIntoDescriptor = { buffer: buffer, bufferByteLength: autoAllocateChunkSize, byteOffset: 0, byteLength: autoAllocateChunkSize, bytesFilled: 0, elementSize: 1, viewConstructor: Uint8Array, readerType: 'default' }; this._pendingPullIntos.push(pullIntoDescriptor); } ReadableStreamAddReadRequest(stream, readRequest); ReadableByteStreamControllerCallPullIfNeeded(this); }; return ReadableByteStreamController; }()); Object.defineProperties(ReadableByteStreamController.prototype, { close: { enumerable: true }, enqueue: { enumerable: true }, error: { enumerable: true }, byobRequest: { enumerable: true }, desiredSize: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableByteStreamController', configurable: true }); } // Abstract operations for the ReadableByteStreamController. function IsReadableByteStreamController(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) { return false; } return x instanceof ReadableByteStreamController; } function IsReadableStreamBYOBRequest(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) { return false; } return x instanceof ReadableStreamBYOBRequest; } function ReadableByteStreamControllerCallPullIfNeeded(controller) { var shouldPull = ReadableByteStreamControllerShouldCallPull(controller); if (!shouldPull) { return; } if (controller._pulling) { controller._pullAgain = true; return; } controller._pulling = true; // TODO: Test controller argument var pullPromise = controller._pullAlgorithm(); uponPromise(pullPromise, function () { controller._pulling = false; if (controller._pullAgain) { controller._pullAgain = false; ReadableByteStreamControllerCallPullIfNeeded(controller); } }, function (e) { ReadableByteStreamControllerError(controller, e); }); } function ReadableByteStreamControllerClearPendingPullIntos(controller) { ReadableByteStreamControllerInvalidateBYOBRequest(controller); controller._pendingPullIntos = new SimpleQueue(); } function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) { var done = false; if (stream._state === 'closed') { done = true; } var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); if (pullIntoDescriptor.readerType === 'default') { ReadableStreamFulfillReadRequest(stream, filledView, done); } else { ReadableStreamFulfillReadIntoRequest(stream, filledView, done); } } function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) { var bytesFilled = pullIntoDescriptor.bytesFilled; var elementSize = pullIntoDescriptor.elementSize; return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize); } function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) { controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength }); controller._queueTotalSize += byteLength; } function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { var elementSize = pullIntoDescriptor.elementSize; var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize; var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize; var totalBytesToCopyRemaining = maxBytesToCopy; var ready = false; if (maxAlignedBytes > currentAlignedBytes) { totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; ready = true; } var queue = controller._queue; while (totalBytesToCopyRemaining > 0) { var headOfQueue = queue.peek(); var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength); var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy); if (headOfQueue.byteLength === bytesToCopy) { queue.shift(); } else { headOfQueue.byteOffset += bytesToCopy; headOfQueue.byteLength -= bytesToCopy; } controller._queueTotalSize -= bytesToCopy; ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor); totalBytesToCopyRemaining -= bytesToCopy; } return ready; } function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) { pullIntoDescriptor.bytesFilled += size; } function ReadableByteStreamControllerHandleQueueDrain(controller) { if (controller._queueTotalSize === 0 && controller._closeRequested) { ReadableByteStreamControllerClearAlgorithms(controller); ReadableStreamClose(controller._controlledReadableByteStream); } else { ReadableByteStreamControllerCallPullIfNeeded(controller); } } function ReadableByteStreamControllerInvalidateBYOBRequest(controller) { if (controller._byobRequest === null) { return; } controller._byobRequest._associatedReadableByteStreamController = undefined; controller._byobRequest._view = null; controller._byobRequest = null; } function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) { while (controller._pendingPullIntos.length > 0) { if (controller._queueTotalSize === 0) { return; } var pullIntoDescriptor = controller._pendingPullIntos.peek(); if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { ReadableByteStreamControllerShiftPendingPullInto(controller); ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); } } } function ReadableByteStreamControllerPullInto(controller, view, readIntoRequest) { var stream = controller._controlledReadableByteStream; var elementSize = 1; if (view.constructor !== DataView) { elementSize = view.constructor.BYTES_PER_ELEMENT; } var ctor = view.constructor; // try { var buffer = TransferArrayBuffer(view.buffer); // } catch (e) { // readIntoRequest._errorSteps(e); // return; // } var pullIntoDescriptor = { buffer: buffer, bufferByteLength: buffer.byteLength, byteOffset: view.byteOffset, byteLength: view.byteLength, bytesFilled: 0, elementSize: elementSize, viewConstructor: ctor, readerType: 'byob' }; if (controller._pendingPullIntos.length > 0) { controller._pendingPullIntos.push(pullIntoDescriptor); // No ReadableByteStreamControllerCallPullIfNeeded() call since: // - No change happens on desiredSize // - The source has already been notified of that there's at least 1 pending read(view) ReadableStreamAddReadIntoRequest(stream, readIntoRequest); return; } if (stream._state === 'closed') { var emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0); readIntoRequest._closeSteps(emptyView); return; } if (controller._queueTotalSize > 0) { if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); ReadableByteStreamControllerHandleQueueDrain(controller); readIntoRequest._chunkSteps(filledView); return; } if (controller._closeRequested) { var e = new TypeError('Insufficient bytes to fill elements in the given buffer'); ReadableByteStreamControllerError(controller, e); readIntoRequest._errorSteps(e); return; } } controller._pendingPullIntos.push(pullIntoDescriptor); ReadableStreamAddReadIntoRequest(stream, readIntoRequest); ReadableByteStreamControllerCallPullIfNeeded(controller); } function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { var stream = controller._controlledReadableByteStream; if (ReadableStreamHasBYOBReader(stream)) { while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller); ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor); } } } function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) { return; } ReadableByteStreamControllerShiftPendingPullInto(controller); var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; if (remainderSize > 0) { var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; var remainder = ArrayBufferSlice(pullIntoDescriptor.buffer, end - remainderSize, end); ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength); } pullIntoDescriptor.bytesFilled -= remainderSize; ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); } function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) { var firstDescriptor = controller._pendingPullIntos.peek(); ReadableByteStreamControllerInvalidateBYOBRequest(controller); var state = controller._controlledReadableByteStream._state; if (state === 'closed') { ReadableByteStreamControllerRespondInClosedState(controller); } else { ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); } ReadableByteStreamControllerCallPullIfNeeded(controller); } function ReadableByteStreamControllerShiftPendingPullInto(controller) { var descriptor = controller._pendingPullIntos.shift(); return descriptor; } function ReadableByteStreamControllerShouldCallPull(controller) { var stream = controller._controlledReadableByteStream; if (stream._state !== 'readable') { return false; } if (controller._closeRequested) { return false; } if (!controller._started) { return false; } if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { return true; } if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) { return true; } var desiredSize = ReadableByteStreamControllerGetDesiredSize(controller); if (desiredSize > 0) { return true; } return false; } function ReadableByteStreamControllerClearAlgorithms(controller) { controller._pullAlgorithm = undefined; controller._cancelAlgorithm = undefined; } // A client of ReadableByteStreamController may use these functions directly to bypass state check. function ReadableByteStreamControllerClose(controller) { var stream = controller._controlledReadableByteStream; if (controller._closeRequested || stream._state !== 'readable') { return; } if (controller._queueTotalSize > 0) { controller._closeRequested = true; return; } if (controller._pendingPullIntos.length > 0) { var firstPendingPullInto = controller._pendingPullIntos.peek(); if (firstPendingPullInto.bytesFilled > 0) { var e = new TypeError('Insufficient bytes to fill elements in the given buffer'); ReadableByteStreamControllerError(controller, e); throw e; } } ReadableByteStreamControllerClearAlgorithms(controller); ReadableStreamClose(stream); } function ReadableByteStreamControllerEnqueue(controller, chunk) { var stream = controller._controlledReadableByteStream; if (controller._closeRequested || stream._state !== 'readable') { return; } var buffer = chunk.buffer; var byteOffset = chunk.byteOffset; var byteLength = chunk.byteLength; var transferredBuffer = TransferArrayBuffer(buffer); if (controller._pendingPullIntos.length > 0) { var firstPendingPullInto = controller._pendingPullIntos.peek(); if (IsDetachedBuffer(firstPendingPullInto.buffer)) ; firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); } ReadableByteStreamControllerInvalidateBYOBRequest(controller); if (ReadableStreamHasDefaultReader(stream)) { if (ReadableStreamGetNumReadRequests(stream) === 0) { ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); } else { if (controller._pendingPullIntos.length > 0) { ReadableByteStreamControllerShiftPendingPullInto(controller); } var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength); ReadableStreamFulfillReadRequest(stream, transferredView, false); } } else if (ReadableStreamHasBYOBReader(stream)) { // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully. ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); } else { ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); } ReadableByteStreamControllerCallPullIfNeeded(controller); } function ReadableByteStreamControllerError(controller, e) { var stream = controller._controlledReadableByteStream; if (stream._state !== 'readable') { return; } ReadableByteStreamControllerClearPendingPullIntos(controller); ResetQueue(controller); ReadableByteStreamControllerClearAlgorithms(controller); ReadableStreamError(stream, e); } function ReadableByteStreamControllerGetBYOBRequest(controller) { if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { var firstDescriptor = controller._pendingPullIntos.peek(); var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); var byobRequest = Object.create(ReadableStreamBYOBRequest.prototype); SetUpReadableStreamBYOBRequest(byobRequest, controller, view); controller._byobRequest = byobRequest; } return controller._byobRequest; } function ReadableByteStreamControllerGetDesiredSize(controller) { var state = controller._controlledReadableByteStream._state; if (state === 'errored') { return null; } if (state === 'closed') { return 0; } return controller._strategyHWM - controller._queueTotalSize; } function ReadableByteStreamControllerRespond(controller, bytesWritten) { var firstDescriptor = controller._pendingPullIntos.peek(); var state = controller._controlledReadableByteStream._state; if (state === 'closed') { if (bytesWritten !== 0) { throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream'); } } else { if (bytesWritten === 0) { throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream'); } if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) { throw new RangeError('bytesWritten out of range'); } } firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer); ReadableByteStreamControllerRespondInternal(controller, bytesWritten); } function ReadableByteStreamControllerRespondWithNewView(controller, view) { var firstDescriptor = controller._pendingPullIntos.peek(); var state = controller._controlledReadableByteStream._state; if (state === 'closed') { if (view.byteLength !== 0) { throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream'); } } else { if (view.byteLength === 0) { throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream'); } } if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) { throw new RangeError('The region specified by view does not match byobRequest'); } if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) { throw new RangeError('The buffer of view has different capacity than byobRequest'); } if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) { throw new RangeError('The region specified by view is larger than byobRequest'); } var viewByteLength = view.byteLength; firstDescriptor.buffer = TransferArrayBuffer(view.buffer); ReadableByteStreamControllerRespondInternal(controller, viewByteLength); } function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) { controller._controlledReadableByteStream = stream; controller._pullAgain = false; controller._pulling = false; controller._byobRequest = null; // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. controller._queue = controller._queueTotalSize = undefined; ResetQueue(controller); controller._closeRequested = false; controller._started = false; controller._strategyHWM = highWaterMark; controller._pullAlgorithm = pullAlgorithm; controller._cancelAlgorithm = cancelAlgorithm; controller._autoAllocateChunkSize = autoAllocateChunkSize; controller._pendingPullIntos = new SimpleQueue(); stream._readableStreamController = controller; var startResult = startAlgorithm(); uponPromise(promiseResolvedWith(startResult), function () { controller._started = true; ReadableByteStreamControllerCallPullIfNeeded(controller); }, function (r) { ReadableByteStreamControllerError(controller, r); }); } function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { var controller = Object.create(ReadableByteStreamController.prototype); var startAlgorithm = function () { return undefined; }; var pullAlgorithm = function () { return promiseResolvedWith(undefined); }; var cancelAlgorithm = function () { return promiseResolvedWith(undefined); }; if (underlyingByteSource.start !== undefined) { startAlgorithm = function () { return underlyingByteSource.start(controller); }; } if (underlyingByteSource.pull !== undefined) { pullAlgorithm = function () { return underlyingByteSource.pull(controller); }; } if (underlyingByteSource.cancel !== undefined) { cancelAlgorithm = function (reason) { return underlyingByteSource.cancel(reason); }; } var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; if (autoAllocateChunkSize === 0) { throw new TypeError('autoAllocateChunkSize must be greater than 0'); } SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize); } function SetUpReadableStreamBYOBRequest(request, controller, view) { request._associatedReadableByteStreamController = controller; request._view = view; } // Helper functions for the ReadableStreamBYOBRequest. function byobRequestBrandCheckException(name) { return new TypeError("ReadableStreamBYOBRequest.prototype." + name + " can only be used on a ReadableStreamBYOBRequest"); } // Helper functions for the ReadableByteStreamController. function byteStreamControllerBrandCheckException(name) { return new TypeError("ReadableByteStreamController.prototype." + name + " can only be used on a ReadableByteStreamController"); } // Abstract operations for the ReadableStream. function AcquireReadableStreamBYOBReader(stream) { return new ReadableStreamBYOBReader(stream); } // ReadableStream API exposed for controllers. function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) { stream._reader._readIntoRequests.push(readIntoRequest); } function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { var reader = stream._reader; var readIntoRequest = reader._readIntoRequests.shift(); if (done) { readIntoRequest._closeSteps(chunk); } else { readIntoRequest._chunkSteps(chunk); } } function ReadableStreamGetNumReadIntoRequests(stream) { return stream._reader._readIntoRequests.length; } function ReadableStreamHasBYOBReader(stream) { var reader = stream._reader; if (reader === undefined) { return false; } if (!IsReadableStreamBYOBReader(reader)) { return false; } return true; } /** * A BYOB reader vended by a {@link ReadableStream}. * * @public */ var ReadableStreamBYOBReader = /** @class */ (function () { function ReadableStreamBYOBReader(stream) { assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader'); assertReadableStream(stream, 'First parameter'); if (IsReadableStreamLocked(stream)) { throw new TypeError('This stream has already been locked for exclusive reading by another reader'); } if (!IsReadableByteStreamController(stream._readableStreamController)) { throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source'); } ReadableStreamReaderGenericInitialize(this, stream); this._readIntoRequests = new SimpleQueue(); } Object.defineProperty(ReadableStreamBYOBReader.prototype, "closed", { /** * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or * the reader's lock is released before the stream finishes closing. */ get: function () { if (!IsReadableStreamBYOBReader(this)) { return promiseRejectedWith(byobReaderBrandCheckException('closed')); } return this._closedPromise; }, enumerable: false, configurable: true }); /** * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. */ ReadableStreamBYOBReader.prototype.cancel = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsReadableStreamBYOBReader(this)) { return promiseRejectedWith(byobReaderBrandCheckException('cancel')); } if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('cancel')); } return ReadableStreamReaderGenericCancel(this, reason); }; /** * Attempts to reads bytes into view, and returns a promise resolved with the result. * * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. */ ReadableStreamBYOBReader.prototype.read = function (view) { if (!IsReadableStreamBYOBReader(this)) { return promiseRejectedWith(byobReaderBrandCheckException('read')); } if (!ArrayBuffer.isView(view)) { return promiseRejectedWith(new TypeError('view must be an array buffer view')); } if (view.byteLength === 0) { return promiseRejectedWith(new TypeError('view must have non-zero byteLength')); } if (view.buffer.byteLength === 0) { return promiseRejectedWith(new TypeError("view's buffer must have non-zero byteLength")); } if (IsDetachedBuffer(view.buffer)) ; if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('read from')); } var resolvePromise; var rejectPromise; var promise = newPromise(function (resolve, reject) { resolvePromise = resolve; rejectPromise = reject; }); var readIntoRequest = { _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); }, _closeSteps: function (chunk) { return resolvePromise({ value: chunk, done: true }); }, _errorSteps: function (e) { return rejectPromise(e); } }; ReadableStreamBYOBReaderRead(this, view, readIntoRequest); return promise; }; /** * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. * If the associated stream is errored when the lock is released, the reader will appear errored in the same way * from now on; otherwise, the reader will appear closed. * * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to * do so will throw a `TypeError` and leave the reader locked to the stream. */ ReadableStreamBYOBReader.prototype.releaseLock = function () { if (!IsReadableStreamBYOBReader(this)) { throw byobReaderBrandCheckException('releaseLock'); } if (this._ownerReadableStream === undefined) { return; } if (this._readIntoRequests.length > 0) { throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); } ReadableStreamReaderGenericRelease(this); }; return ReadableStreamBYOBReader; }()); Object.defineProperties(ReadableStreamBYOBReader.prototype, { cancel: { enumerable: true }, read: { enumerable: true }, releaseLock: { enumerable: true }, closed: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableStreamBYOBReader', configurable: true }); } // Abstract operations for the readers. function IsReadableStreamBYOBReader(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) { return false; } return x instanceof ReadableStreamBYOBReader; } function ReadableStreamBYOBReaderRead(reader, view, readIntoRequest) { var stream = reader._ownerReadableStream; stream._disturbed = true; if (stream._state === 'errored') { readIntoRequest._errorSteps(stream._storedError); } else { ReadableByteStreamControllerPullInto(stream._readableStreamController, view, readIntoRequest); } } // Helper functions for the ReadableStreamBYOBReader. function byobReaderBrandCheckException(name) { return new TypeError("ReadableStreamBYOBReader.prototype." + name + " can only be used on a ReadableStreamBYOBReader"); } function ExtractHighWaterMark(strategy, defaultHWM) { var highWaterMark = strategy.highWaterMark; if (highWaterMark === undefined) { return defaultHWM; } if (NumberIsNaN(highWaterMark) || highWaterMark < 0) { throw new RangeError('Invalid highWaterMark'); } return highWaterMark; } function ExtractSizeAlgorithm(strategy) { var size = strategy.size; if (!size) { return function () { return 1; }; } return size; } function convertQueuingStrategy(init, context) { assertDictionary(init, context); var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; var size = init === null || init === void 0 ? void 0 : init.size; return { highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark), size: size === undefined ? undefined : convertQueuingStrategySize(size, context + " has member 'size' that") }; } function convertQueuingStrategySize(fn, context) { assertFunction(fn, context); return function (chunk) { return convertUnrestrictedDouble(fn(chunk)); }; } function convertUnderlyingSink(original, context) { assertDictionary(original, context); var abort = original === null || original === void 0 ? void 0 : original.abort; var close = original === null || original === void 0 ? void 0 : original.close; var start = original === null || original === void 0 ? void 0 : original.start; var type = original === null || original === void 0 ? void 0 : original.type; var write = original === null || original === void 0 ? void 0 : original.write; return { abort: abort === undefined ? undefined : convertUnderlyingSinkAbortCallback(abort, original, context + " has member 'abort' that"), close: close === undefined ? undefined : convertUnderlyingSinkCloseCallback(close, original, context + " has member 'close' that"), start: start === undefined ? undefined : convertUnderlyingSinkStartCallback(start, original, context + " has member 'start' that"), write: write === undefined ? undefined : convertUnderlyingSinkWriteCallback(write, original, context + " has member 'write' that"), type: type }; } function convertUnderlyingSinkAbortCallback(fn, original, context) { assertFunction(fn, context); return function (reason) { return promiseCall(fn, original, [reason]); }; } function convertUnderlyingSinkCloseCallback(fn, original, context) { assertFunction(fn, context); return function () { return promiseCall(fn, original, []); }; } function convertUnderlyingSinkStartCallback(fn, original, context) { assertFunction(fn, context); return function (controller) { return reflectCall(fn, original, [controller]); }; } function convertUnderlyingSinkWriteCallback(fn, original, context) { assertFunction(fn, context); return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); }; } function assertWritableStream(x, context) { if (!IsWritableStream(x)) { throw new TypeError(context + " is not a WritableStream."); } } function isAbortSignal$1(value) { if (typeof value !== 'object' || value === null) { return false; } try { return typeof value.aborted === 'boolean'; } catch (_a) { // AbortSignal.prototype.aborted throws if its brand check fails return false; } } var supportsAbortController = typeof AbortController === 'function'; /** * Construct a new AbortController, if supported by the platform. * * @internal */ function createAbortController() { if (supportsAbortController) { return new AbortController(); } return undefined; } /** * A writable stream represents a destination for data, into which you can write. * * @public */ var WritableStream = /** @class */ (function () { function WritableStream(rawUnderlyingSink, rawStrategy) { if (rawUnderlyingSink === void 0) { rawUnderlyingSink = {}; } if (rawStrategy === void 0) { rawStrategy = {}; } if (rawUnderlyingSink === undefined) { rawUnderlyingSink = null; } else { assertObject(rawUnderlyingSink, 'First parameter'); } var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); var underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter'); InitializeWritableStream(this); var type = underlyingSink.type; if (type !== undefined) { throw new RangeError('Invalid type is specified'); } var sizeAlgorithm = ExtractSizeAlgorithm(strategy); var highWaterMark = ExtractHighWaterMark(strategy, 1); SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm); } Object.defineProperty(WritableStream.prototype, "locked", { /** * Returns whether or not the writable stream is locked to a writer. */ get: function () { if (!IsWritableStream(this)) { throw streamBrandCheckException$2('locked'); } return IsWritableStreamLocked(this); }, enumerable: false, configurable: true }); /** * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort * mechanism of the underlying sink. * * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel * the stream) if the stream is currently locked. */ WritableStream.prototype.abort = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsWritableStream(this)) { return promiseRejectedWith(streamBrandCheckException$2('abort')); } if (IsWritableStreamLocked(this)) { return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer')); } return WritableStreamAbort(this, reason); }; /** * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its * close behavior. During this time any further attempts to write will fail (without erroring the stream). * * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked. */ WritableStream.prototype.close = function () { if (!IsWritableStream(this)) { return promiseRejectedWith(streamBrandCheckException$2('close')); } if (IsWritableStreamLocked(this)) { return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer')); } if (WritableStreamCloseQueuedOrInFlight(this)) { return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); } return WritableStreamClose(this); }; /** * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream * is locked, no other writer can be acquired until this one is released. * * This functionality is especially useful for creating abstractions that desire the ability to write to a stream * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at * the same time, which would cause the resulting written data to be unpredictable and probably useless. */ WritableStream.prototype.getWriter = function () { if (!IsWritableStream(this)) { throw streamBrandCheckException$2('getWriter'); } return AcquireWritableStreamDefaultWriter(this); }; return WritableStream; }()); Object.defineProperties(WritableStream.prototype, { abort: { enumerable: true }, close: { enumerable: true }, getWriter: { enumerable: true }, locked: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { value: 'WritableStream', configurable: true }); } // Abstract operations for the WritableStream. function AcquireWritableStreamDefaultWriter(stream) { return new WritableStreamDefaultWriter(stream); } // Throws if and only if startAlgorithm throws. function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { if (highWaterMark === void 0) { highWaterMark = 1; } if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; } var stream = Object.create(WritableStream.prototype); InitializeWritableStream(stream); var controller = Object.create(WritableStreamDefaultController.prototype); SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); return stream; } function InitializeWritableStream(stream) { stream._state = 'writable'; // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is // 'erroring' or 'errored'. May be set to an undefined value. stream._storedError = undefined; stream._writer = undefined; // Initialize to undefined first because the constructor of the controller checks this // variable to validate the caller. stream._writableStreamController = undefined; // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data // producer without waiting for the queued writes to finish. stream._writeRequests = new SimpleQueue(); // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here. stream._inFlightWriteRequest = undefined; // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer // has been detached. stream._closeRequest = undefined; // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here. stream._inFlightCloseRequest = undefined; // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached. stream._pendingAbortRequest = undefined; // The backpressure signal set by the controller. stream._backpressure = false; } function IsWritableStream(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) { return false; } return x instanceof WritableStream; } function IsWritableStreamLocked(stream) { if (stream._writer === undefined) { return false; } return true; } function WritableStreamAbort(stream, reason) { var _a; if (stream._state === 'closed' || stream._state === 'errored') { return promiseResolvedWith(undefined); } stream._writableStreamController._abortReason = reason; (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(); // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', // but it doesn't know that signaling abort runs author code that might have changed the state. // Widen the type again by casting to WritableStreamState. var state = stream._state; if (state === 'closed' || state === 'errored') { return promiseResolvedWith(undefined); } if (stream._pendingAbortRequest !== undefined) { return stream._pendingAbortRequest._promise; } var wasAlreadyErroring = false; if (state === 'erroring') { wasAlreadyErroring = true; // reason will not be used, so don't keep a reference to it. reason = undefined; } var promise = newPromise(function (resolve, reject) { stream._pendingAbortRequest = { _promise: undefined, _resolve: resolve, _reject: reject, _reason: reason, _wasAlreadyErroring: wasAlreadyErroring }; }); stream._pendingAbortRequest._promise = promise; if (!wasAlreadyErroring) { WritableStreamStartErroring(stream, reason); } return promise; } function WritableStreamClose(stream) { var state = stream._state; if (state === 'closed' || state === 'errored') { return promiseRejectedWith(new TypeError("The stream (in " + state + " state) is not in the writable state and cannot be closed")); } var promise = newPromise(function (resolve, reject) { var closeRequest = { _resolve: resolve, _reject: reject }; stream._closeRequest = closeRequest; }); var writer = stream._writer; if (writer !== undefined && stream._backpressure && state === 'writable') { defaultWriterReadyPromiseResolve(writer); } WritableStreamDefaultControllerClose(stream._writableStreamController); return promise; } // WritableStream API exposed for controllers. function WritableStreamAddWriteRequest(stream) { var promise = newPromise(function (resolve, reject) { var writeRequest = { _resolve: resolve, _reject: reject }; stream._writeRequests.push(writeRequest); }); return promise; } function WritableStreamDealWithRejection(stream, error) { var state = stream._state; if (state === 'writable') { WritableStreamStartErroring(stream, error); return; } WritableStreamFinishErroring(stream); } function WritableStreamStartErroring(stream, reason) { var controller = stream._writableStreamController; stream._state = 'erroring'; stream._storedError = reason; var writer = stream._writer; if (writer !== undefined) { WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason); } if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) { WritableStreamFinishErroring(stream); } } function WritableStreamFinishErroring(stream) { stream._state = 'errored'; stream._writableStreamController[ErrorSteps](); var storedError = stream._storedError; stream._writeRequests.forEach(function (writeRequest) { writeRequest._reject(storedError); }); stream._writeRequests = new SimpleQueue(); if (stream._pendingAbortRequest === undefined) { WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); return; } var abortRequest = stream._pendingAbortRequest; stream._pendingAbortRequest = undefined; if (abortRequest._wasAlreadyErroring) { abortRequest._reject(storedError); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); return; } var promise = stream._writableStreamController[AbortSteps](abortRequest._reason); uponPromise(promise, function () { abortRequest._resolve(); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); }, function (reason) { abortRequest._reject(reason); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); }); } function WritableStreamFinishInFlightWrite(stream) { stream._inFlightWriteRequest._resolve(undefined); stream._inFlightWriteRequest = undefined; } function WritableStreamFinishInFlightWriteWithError(stream, error) { stream._inFlightWriteRequest._reject(error); stream._inFlightWriteRequest = undefined; WritableStreamDealWithRejection(stream, error); } function WritableStreamFinishInFlightClose(stream) { stream._inFlightCloseRequest._resolve(undefined); stream._inFlightCloseRequest = undefined; var state = stream._state; if (state === 'erroring') { // The error was too late to do anything, so it is ignored. stream._storedError = undefined; if (stream._pendingAbortRequest !== undefined) { stream._pendingAbortRequest._resolve(); stream._pendingAbortRequest = undefined; } } stream._state = 'closed'; var writer = stream._writer; if (writer !== undefined) { defaultWriterClosedPromiseResolve(writer); } } function WritableStreamFinishInFlightCloseWithError(stream, error) { stream._inFlightCloseRequest._reject(error); stream._inFlightCloseRequest = undefined; // Never execute sink abort() after sink close(). if (stream._pendingAbortRequest !== undefined) { stream._pendingAbortRequest._reject(error); stream._pendingAbortRequest = undefined; } WritableStreamDealWithRejection(stream, error); } // TODO(ricea): Fix alphabetical order. function WritableStreamCloseQueuedOrInFlight(stream) { if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) { return false; } return true; } function WritableStreamHasOperationMarkedInFlight(stream) { if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) { return false; } return true; } function WritableStreamMarkCloseRequestInFlight(stream) { stream._inFlightCloseRequest = stream._closeRequest; stream._closeRequest = undefined; } function WritableStreamMarkFirstWriteRequestInFlight(stream) { stream._inFlightWriteRequest = stream._writeRequests.shift(); } function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) { if (stream._closeRequest !== undefined) { stream._closeRequest._reject(stream._storedError); stream._closeRequest = undefined; } var writer = stream._writer; if (writer !== undefined) { defaultWriterClosedPromiseReject(writer, stream._storedError); } } function WritableStreamUpdateBackpressure(stream, backpressure) { var writer = stream._writer; if (writer !== undefined && backpressure !== stream._backpressure) { if (backpressure) { defaultWriterReadyPromiseReset(writer); } else { defaultWriterReadyPromiseResolve(writer); } } stream._backpressure = backpressure; } /** * A default writer vended by a {@link WritableStream}. * * @public */ var WritableStreamDefaultWriter = /** @class */ (function () { function WritableStreamDefaultWriter(stream) { assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter'); assertWritableStream(stream, 'First parameter'); if (IsWritableStreamLocked(stream)) { throw new TypeError('This stream has already been locked for exclusive writing by another writer'); } this._ownerWritableStream = stream; stream._writer = this; var state = stream._state; if (state === 'writable') { if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) { defaultWriterReadyPromiseInitialize(this); } else { defaultWriterReadyPromiseInitializeAsResolved(this); } defaultWriterClosedPromiseInitialize(this); } else if (state === 'erroring') { defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); defaultWriterClosedPromiseInitialize(this); } else if (state === 'closed') { defaultWriterReadyPromiseInitializeAsResolved(this); defaultWriterClosedPromiseInitializeAsResolved(this); } else { var storedError = stream._storedError; defaultWriterReadyPromiseInitializeAsRejected(this, storedError); defaultWriterClosedPromiseInitializeAsRejected(this, storedError); } } Object.defineProperty(WritableStreamDefaultWriter.prototype, "closed", { /** * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or * the writer’s lock is released before the stream finishes closing. */ get: function () { if (!IsWritableStreamDefaultWriter(this)) { return promiseRejectedWith(defaultWriterBrandCheckException('closed')); } return this._closedPromise; }, enumerable: false, configurable: true }); Object.defineProperty(WritableStreamDefaultWriter.prototype, "desiredSize", { /** * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full. * A producer can use this information to determine the right amount of data to write. * * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when * the writer’s lock is released. */ get: function () { if (!IsWritableStreamDefaultWriter(this)) { throw defaultWriterBrandCheckException('desiredSize'); } if (this._ownerWritableStream === undefined) { throw defaultWriterLockException('desiredSize'); } return WritableStreamDefaultWriterGetDesiredSize(this); }, enumerable: false, configurable: true }); Object.defineProperty(WritableStreamDefaultWriter.prototype, "ready", { /** * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips * back to zero or below, the getter will return a new promise that stays pending until the next transition. * * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become * rejected. */ get: function () { if (!IsWritableStreamDefaultWriter(this)) { return promiseRejectedWith(defaultWriterBrandCheckException('ready')); } return this._readyPromise; }, enumerable: false, configurable: true }); /** * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}. */ WritableStreamDefaultWriter.prototype.abort = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsWritableStreamDefaultWriter(this)) { return promiseRejectedWith(defaultWriterBrandCheckException('abort')); } if (this._ownerWritableStream === undefined) { return promiseRejectedWith(defaultWriterLockException('abort')); } return WritableStreamDefaultWriterAbort(this, reason); }; /** * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}. */ WritableStreamDefaultWriter.prototype.close = function () { if (!IsWritableStreamDefaultWriter(this)) { return promiseRejectedWith(defaultWriterBrandCheckException('close')); } var stream = this._ownerWritableStream; if (stream === undefined) { return promiseRejectedWith(defaultWriterLockException('close')); } if (WritableStreamCloseQueuedOrInFlight(stream)) { return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); } return WritableStreamDefaultWriterClose(this); }; /** * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active. * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from * now on; otherwise, the writer will appear closed. * * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled). * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents * other producers from writing in an interleaved manner. */ WritableStreamDefaultWriter.prototype.releaseLock = function () { if (!IsWritableStreamDefaultWriter(this)) { throw defaultWriterBrandCheckException('releaseLock'); } var stream = this._ownerWritableStream; if (stream === undefined) { return; } WritableStreamDefaultWriterRelease(this); }; WritableStreamDefaultWriter.prototype.write = function (chunk) { if (chunk === void 0) { chunk = undefined; } if (!IsWritableStreamDefaultWriter(this)) { return promiseRejectedWith(defaultWriterBrandCheckException('write')); } if (this._ownerWritableStream === undefined) { return promiseRejectedWith(defaultWriterLockException('write to')); } return WritableStreamDefaultWriterWrite(this, chunk); }; return WritableStreamDefaultWriter; }()); Object.defineProperties(WritableStreamDefaultWriter.prototype, { abort: { enumerable: true }, close: { enumerable: true }, releaseLock: { enumerable: true }, write: { enumerable: true }, closed: { enumerable: true }, desiredSize: { enumerable: true }, ready: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { value: 'WritableStreamDefaultWriter', configurable: true }); } // Abstract operations for the WritableStreamDefaultWriter. function IsWritableStreamDefaultWriter(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) { return false; } return x instanceof WritableStreamDefaultWriter; } // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check. function WritableStreamDefaultWriterAbort(writer, reason) { var stream = writer._ownerWritableStream; return WritableStreamAbort(stream, reason); } function WritableStreamDefaultWriterClose(writer) { var stream = writer._ownerWritableStream; return WritableStreamClose(stream); } function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) { var stream = writer._ownerWritableStream; var state = stream._state; if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { return promiseResolvedWith(undefined); } if (state === 'errored') { return promiseRejectedWith(stream._storedError); } return WritableStreamDefaultWriterClose(writer); } function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) { if (writer._closedPromiseState === 'pending') { defaultWriterClosedPromiseReject(writer, error); } else { defaultWriterClosedPromiseResetToRejected(writer, error); } } function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { if (writer._readyPromiseState === 'pending') { defaultWriterReadyPromiseReject(writer, error); } else { defaultWriterReadyPromiseResetToRejected(writer, error); } } function WritableStreamDefaultWriterGetDesiredSize(writer) { var stream = writer._ownerWritableStream; var state = stream._state; if (state === 'errored' || state === 'erroring') { return null; } if (state === 'closed') { return 0; } return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController); } function WritableStreamDefaultWriterRelease(writer) { var stream = writer._ownerWritableStream; var releasedError = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness"); WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError); // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not // rejected until afterwards. This means that simply testing state will not work. WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError); stream._writer = undefined; writer._ownerWritableStream = undefined; } function WritableStreamDefaultWriterWrite(writer, chunk) { var stream = writer._ownerWritableStream; var controller = stream._writableStreamController; var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk); if (stream !== writer._ownerWritableStream) { return promiseRejectedWith(defaultWriterLockException('write to')); } var state = stream._state; if (state === 'errored') { return promiseRejectedWith(stream._storedError); } if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to')); } if (state === 'erroring') { return promiseRejectedWith(stream._storedError); } var promise = WritableStreamAddWriteRequest(stream); WritableStreamDefaultControllerWrite(controller, chunk, chunkSize); return promise; } var closeSentinel = {}; /** * Allows control of a {@link WritableStream | writable stream}'s state and internal queue. * * @public */ var WritableStreamDefaultController = /** @class */ (function () { function WritableStreamDefaultController() { throw new TypeError('Illegal constructor'); } Object.defineProperty(WritableStreamDefaultController.prototype, "abortReason", { /** * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted. * * @deprecated * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177. * Use {@link WritableStreamDefaultController.signal}'s `reason` instead. */ get: function () { if (!IsWritableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$2('abortReason'); } return this._abortReason; }, enumerable: false, configurable: true }); Object.defineProperty(WritableStreamDefaultController.prototype, "signal", { /** * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted. */ get: function () { if (!IsWritableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$2('signal'); } if (this._abortController === undefined) { // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`. // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill, // so instead we only implement support for `signal` if we find a global `AbortController` constructor. throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported'); } return this._abortController.signal; }, enumerable: false, configurable: true }); /** * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`. * * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the * normal lifecycle of interactions with the underlying sink. */ WritableStreamDefaultController.prototype.error = function (e) { if (e === void 0) { e = undefined; } if (!IsWritableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$2('error'); } var state = this._controlledWritableStream._state; if (state !== 'writable') { // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so // just treat it as a no-op. return; } WritableStreamDefaultControllerError(this, e); }; /** @internal */ WritableStreamDefaultController.prototype[AbortSteps] = function (reason) { var result = this._abortAlgorithm(reason); WritableStreamDefaultControllerClearAlgorithms(this); return result; }; /** @internal */ WritableStreamDefaultController.prototype[ErrorSteps] = function () { ResetQueue(this); }; return WritableStreamDefaultController; }()); Object.defineProperties(WritableStreamDefaultController.prototype, { abortReason: { enumerable: true }, signal: { enumerable: true }, error: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { value: 'WritableStreamDefaultController', configurable: true }); } // Abstract operations implementing interface required by the WritableStream. function IsWritableStreamDefaultController(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) { return false; } return x instanceof WritableStreamDefaultController; } function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { controller._controlledWritableStream = stream; stream._writableStreamController = controller; // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. controller._queue = undefined; controller._queueTotalSize = undefined; ResetQueue(controller); controller._abortReason = undefined; controller._abortController = createAbortController(); controller._started = false; controller._strategySizeAlgorithm = sizeAlgorithm; controller._strategyHWM = highWaterMark; controller._writeAlgorithm = writeAlgorithm; controller._closeAlgorithm = closeAlgorithm; controller._abortAlgorithm = abortAlgorithm; var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); WritableStreamUpdateBackpressure(stream, backpressure); var startResult = startAlgorithm(); var startPromise = promiseResolvedWith(startResult); uponPromise(startPromise, function () { controller._started = true; WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); }, function (r) { controller._started = true; WritableStreamDealWithRejection(stream, r); }); } function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { var controller = Object.create(WritableStreamDefaultController.prototype); var startAlgorithm = function () { return undefined; }; var writeAlgorithm = function () { return promiseResolvedWith(undefined); }; var closeAlgorithm = function () { return promiseResolvedWith(undefined); }; var abortAlgorithm = function () { return promiseResolvedWith(undefined); }; if (underlyingSink.start !== undefined) { startAlgorithm = function () { return underlyingSink.start(controller); }; } if (underlyingSink.write !== undefined) { writeAlgorithm = function (chunk) { return underlyingSink.write(chunk, controller); }; } if (underlyingSink.close !== undefined) { closeAlgorithm = function () { return underlyingSink.close(); }; } if (underlyingSink.abort !== undefined) { abortAlgorithm = function (reason) { return underlyingSink.abort(reason); }; } SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); } // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. function WritableStreamDefaultControllerClearAlgorithms(controller) { controller._writeAlgorithm = undefined; controller._closeAlgorithm = undefined; controller._abortAlgorithm = undefined; controller._strategySizeAlgorithm = undefined; } function WritableStreamDefaultControllerClose(controller) { EnqueueValueWithSize(controller, closeSentinel, 0); WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); } function WritableStreamDefaultControllerGetChunkSize(controller, chunk) { try { return controller._strategySizeAlgorithm(chunk); } catch (chunkSizeE) { WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE); return 1; } } function WritableStreamDefaultControllerGetDesiredSize(controller) { return controller._strategyHWM - controller._queueTotalSize; } function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) { try { EnqueueValueWithSize(controller, chunk, chunkSize); } catch (enqueueE) { WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE); return; } var stream = controller._controlledWritableStream; if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') { var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); WritableStreamUpdateBackpressure(stream, backpressure); } WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); } // Abstract operations for the WritableStreamDefaultController. function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) { var stream = controller._controlledWritableStream; if (!controller._started) { return; } if (stream._inFlightWriteRequest !== undefined) { return; } var state = stream._state; if (state === 'erroring') { WritableStreamFinishErroring(stream); return; } if (controller._queue.length === 0) { return; } var value = PeekQueueValue(controller); if (value === closeSentinel) { WritableStreamDefaultControllerProcessClose(controller); } else { WritableStreamDefaultControllerProcessWrite(controller, value); } } function WritableStreamDefaultControllerErrorIfNeeded(controller, error) { if (controller._controlledWritableStream._state === 'writable') { WritableStreamDefaultControllerError(controller, error); } } function WritableStreamDefaultControllerProcessClose(controller) { var stream = controller._controlledWritableStream; WritableStreamMarkCloseRequestInFlight(stream); DequeueValue(controller); var sinkClosePromise = controller._closeAlgorithm(); WritableStreamDefaultControllerClearAlgorithms(controller); uponPromise(sinkClosePromise, function () { WritableStreamFinishInFlightClose(stream); }, function (reason) { WritableStreamFinishInFlightCloseWithError(stream, reason); }); } function WritableStreamDefaultControllerProcessWrite(controller, chunk) { var stream = controller._controlledWritableStream; WritableStreamMarkFirstWriteRequestInFlight(stream); var sinkWritePromise = controller._writeAlgorithm(chunk); uponPromise(sinkWritePromise, function () { WritableStreamFinishInFlightWrite(stream); var state = stream._state; DequeueValue(controller); if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') { var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); WritableStreamUpdateBackpressure(stream, backpressure); } WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); }, function (reason) { if (stream._state === 'writable') { WritableStreamDefaultControllerClearAlgorithms(controller); } WritableStreamFinishInFlightWriteWithError(stream, reason); }); } function WritableStreamDefaultControllerGetBackpressure(controller) { var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller); return desiredSize <= 0; } // A client of WritableStreamDefaultController may use these functions directly to bypass state check. function WritableStreamDefaultControllerError(controller, error) { var stream = controller._controlledWritableStream; WritableStreamDefaultControllerClearAlgorithms(controller); WritableStreamStartErroring(stream, error); } // Helper functions for the WritableStream. function streamBrandCheckException$2(name) { return new TypeError("WritableStream.prototype." + name + " can only be used on a WritableStream"); } // Helper functions for the WritableStreamDefaultController. function defaultControllerBrandCheckException$2(name) { return new TypeError("WritableStreamDefaultController.prototype." + name + " can only be used on a WritableStreamDefaultController"); } // Helper functions for the WritableStreamDefaultWriter. function defaultWriterBrandCheckException(name) { return new TypeError("WritableStreamDefaultWriter.prototype." + name + " can only be used on a WritableStreamDefaultWriter"); } function defaultWriterLockException(name) { return new TypeError('Cannot ' + name + ' a stream using a released writer'); } function defaultWriterClosedPromiseInitialize(writer) { writer._closedPromise = newPromise(function (resolve, reject) { writer._closedPromise_resolve = resolve; writer._closedPromise_reject = reject; writer._closedPromiseState = 'pending'; }); } function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) { defaultWriterClosedPromiseInitialize(writer); defaultWriterClosedPromiseReject(writer, reason); } function defaultWriterClosedPromiseInitializeAsResolved(writer) { defaultWriterClosedPromiseInitialize(writer); defaultWriterClosedPromiseResolve(writer); } function defaultWriterClosedPromiseReject(writer, reason) { if (writer._closedPromise_reject === undefined) { return; } setPromiseIsHandledToTrue(writer._closedPromise); writer._closedPromise_reject(reason); writer._closedPromise_resolve = undefined; writer._closedPromise_reject = undefined; writer._closedPromiseState = 'rejected'; } function defaultWriterClosedPromiseResetToRejected(writer, reason) { defaultWriterClosedPromiseInitializeAsRejected(writer, reason); } function defaultWriterClosedPromiseResolve(writer) { if (writer._closedPromise_resolve === undefined) { return; } writer._closedPromise_resolve(undefined); writer._closedPromise_resolve = undefined; writer._closedPromise_reject = undefined; writer._closedPromiseState = 'resolved'; } function defaultWriterReadyPromiseInitialize(writer) { writer._readyPromise = newPromise(function (resolve, reject) { writer._readyPromise_resolve = resolve; writer._readyPromise_reject = reject; }); writer._readyPromiseState = 'pending'; } function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) { defaultWriterReadyPromiseInitialize(writer); defaultWriterReadyPromiseReject(writer, reason); } function defaultWriterReadyPromiseInitializeAsResolved(writer) { defaultWriterReadyPromiseInitialize(writer); defaultWriterReadyPromiseResolve(writer); } function defaultWriterReadyPromiseReject(writer, reason) { if (writer._readyPromise_reject === undefined) { return; } setPromiseIsHandledToTrue(writer._readyPromise); writer._readyPromise_reject(reason); writer._readyPromise_resolve = undefined; writer._readyPromise_reject = undefined; writer._readyPromiseState = 'rejected'; } function defaultWriterReadyPromiseReset(writer) { defaultWriterReadyPromiseInitialize(writer); } function defaultWriterReadyPromiseResetToRejected(writer, reason) { defaultWriterReadyPromiseInitializeAsRejected(writer, reason); } function defaultWriterReadyPromiseResolve(writer) { if (writer._readyPromise_resolve === undefined) { return; } writer._readyPromise_resolve(undefined); writer._readyPromise_resolve = undefined; writer._readyPromise_reject = undefined; writer._readyPromiseState = 'fulfilled'; } /// var NativeDOMException = typeof DOMException !== 'undefined' ? DOMException : undefined; /// function isDOMExceptionConstructor(ctor) { if (!(typeof ctor === 'function' || typeof ctor === 'object')) { return false; } try { new ctor(); return true; } catch (_a) { return false; } } function createDOMExceptionPolyfill() { // eslint-disable-next-line no-shadow var ctor = function DOMException(message, name) { this.message = message || ''; this.name = name || 'Error'; if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } }; ctor.prototype = Object.create(Error.prototype); Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); return ctor; } // eslint-disable-next-line no-redeclare var DOMException$1 = isDOMExceptionConstructor(NativeDOMException) ? NativeDOMException : createDOMExceptionPolyfill(); function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { var reader = AcquireReadableStreamDefaultReader(source); var writer = AcquireWritableStreamDefaultWriter(dest); source._disturbed = true; var shuttingDown = false; // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown. var currentWrite = promiseResolvedWith(undefined); return newPromise(function (resolve, reject) { var abortAlgorithm; if (signal !== undefined) { abortAlgorithm = function () { var error = new DOMException$1('Aborted', 'AbortError'); var actions = []; if (!preventAbort) { actions.push(function () { if (dest._state === 'writable') { return WritableStreamAbort(dest, error); } return promiseResolvedWith(undefined); }); } if (!preventCancel) { actions.push(function () { if (source._state === 'readable') { return ReadableStreamCancel(source, error); } return promiseResolvedWith(undefined); }); } shutdownWithAction(function () { return Promise.all(actions.map(function (action) { return action(); })); }, true, error); }; if (signal.aborted) { abortAlgorithm(); return; } signal.addEventListener('abort', abortAlgorithm); } // Using reader and writer, read all chunks from this and write them to dest // - Backpressure must be enforced // - Shutdown must stop all activity function pipeLoop() { return newPromise(function (resolveLoop, rejectLoop) { function next(done) { if (done) { resolveLoop(); } else { // Use `PerformPromiseThen` instead of `uponPromise` to avoid // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers PerformPromiseThen(pipeStep(), next, rejectLoop); } } next(false); }); } function pipeStep() { if (shuttingDown) { return promiseResolvedWith(true); } return PerformPromiseThen(writer._readyPromise, function () { return newPromise(function (resolveRead, rejectRead) { ReadableStreamDefaultReaderRead(reader, { _chunkSteps: function (chunk) { currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop); resolveRead(false); }, _closeSteps: function () { return resolveRead(true); }, _errorSteps: rejectRead }); }); }); } // Errors must be propagated forward isOrBecomesErrored(source, reader._closedPromise, function (storedError) { if (!preventAbort) { shutdownWithAction(function () { return WritableStreamAbort(dest, storedError); }, true, storedError); } else { shutdown(true, storedError); } }); // Errors must be propagated backward isOrBecomesErrored(dest, writer._closedPromise, function (storedError) { if (!preventCancel) { shutdownWithAction(function () { return ReadableStreamCancel(source, storedError); }, true, storedError); } else { shutdown(true, storedError); } }); // Closing must be propagated forward isOrBecomesClosed(source, reader._closedPromise, function () { if (!preventClose) { shutdownWithAction(function () { return WritableStreamDefaultWriterCloseWithErrorPropagation(writer); }); } else { shutdown(); } }); // Closing must be propagated backward if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { var destClosed_1 = new TypeError('the destination writable stream closed before all data could be piped to it'); if (!preventCancel) { shutdownWithAction(function () { return ReadableStreamCancel(source, destClosed_1); }, true, destClosed_1); } else { shutdown(true, destClosed_1); } } setPromiseIsHandledToTrue(pipeLoop()); function waitForWritesToFinish() { // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait // for that too. var oldCurrentWrite = currentWrite; return PerformPromiseThen(currentWrite, function () { return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined; }); } function isOrBecomesErrored(stream, promise, action) { if (stream._state === 'errored') { action(stream._storedError); } else { uponRejection(promise, action); } } function isOrBecomesClosed(stream, promise, action) { if (stream._state === 'closed') { action(); } else { uponFulfillment(promise, action); } } function shutdownWithAction(action, originalIsError, originalError) { if (shuttingDown) { return; } shuttingDown = true; if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { uponFulfillment(waitForWritesToFinish(), doTheRest); } else { doTheRest(); } function doTheRest() { uponPromise(action(), function () { return finalize(originalIsError, originalError); }, function (newError) { return finalize(true, newError); }); } } function shutdown(isError, error) { if (shuttingDown) { return; } shuttingDown = true; if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { uponFulfillment(waitForWritesToFinish(), function () { return finalize(isError, error); }); } else { finalize(isError, error); } } function finalize(isError, error) { WritableStreamDefaultWriterRelease(writer); ReadableStreamReaderGenericRelease(reader); if (signal !== undefined) { signal.removeEventListener('abort', abortAlgorithm); } if (isError) { reject(error); } else { resolve(undefined); } } }); } /** * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue. * * @public */ var ReadableStreamDefaultController = /** @class */ (function () { function ReadableStreamDefaultController() { throw new TypeError('Illegal constructor'); } Object.defineProperty(ReadableStreamDefaultController.prototype, "desiredSize", { /** * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is * over-full. An underlying source ought to use this information to determine when and how to apply backpressure. */ get: function () { if (!IsReadableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$1('desiredSize'); } return ReadableStreamDefaultControllerGetDesiredSize(this); }, enumerable: false, configurable: true }); /** * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from * the stream, but once those are read, the stream will become closed. */ ReadableStreamDefaultController.prototype.close = function () { if (!IsReadableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$1('close'); } if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { throw new TypeError('The stream is not in a state that permits close'); } ReadableStreamDefaultControllerClose(this); }; ReadableStreamDefaultController.prototype.enqueue = function (chunk) { if (chunk === void 0) { chunk = undefined; } if (!IsReadableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$1('enqueue'); } if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { throw new TypeError('The stream is not in a state that permits enqueue'); } return ReadableStreamDefaultControllerEnqueue(this, chunk); }; /** * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. */ ReadableStreamDefaultController.prototype.error = function (e) { if (e === void 0) { e = undefined; } if (!IsReadableStreamDefaultController(this)) { throw defaultControllerBrandCheckException$1('error'); } ReadableStreamDefaultControllerError(this, e); }; /** @internal */ ReadableStreamDefaultController.prototype[CancelSteps] = function (reason) { ResetQueue(this); var result = this._cancelAlgorithm(reason); ReadableStreamDefaultControllerClearAlgorithms(this); return result; }; /** @internal */ ReadableStreamDefaultController.prototype[PullSteps] = function (readRequest) { var stream = this._controlledReadableStream; if (this._queue.length > 0) { var chunk = DequeueValue(this); if (this._closeRequested && this._queue.length === 0) { ReadableStreamDefaultControllerClearAlgorithms(this); ReadableStreamClose(stream); } else { ReadableStreamDefaultControllerCallPullIfNeeded(this); } readRequest._chunkSteps(chunk); } else { ReadableStreamAddReadRequest(stream, readRequest); ReadableStreamDefaultControllerCallPullIfNeeded(this); } }; return ReadableStreamDefaultController; }()); Object.defineProperties(ReadableStreamDefaultController.prototype, { close: { enumerable: true }, enqueue: { enumerable: true }, error: { enumerable: true }, desiredSize: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableStreamDefaultController', configurable: true }); } // Abstract operations for the ReadableStreamDefaultController. function IsReadableStreamDefaultController(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) { return false; } return x instanceof ReadableStreamDefaultController; } function ReadableStreamDefaultControllerCallPullIfNeeded(controller) { var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller); if (!shouldPull) { return; } if (controller._pulling) { controller._pullAgain = true; return; } controller._pulling = true; var pullPromise = controller._pullAlgorithm(); uponPromise(pullPromise, function () { controller._pulling = false; if (controller._pullAgain) { controller._pullAgain = false; ReadableStreamDefaultControllerCallPullIfNeeded(controller); } }, function (e) { ReadableStreamDefaultControllerError(controller, e); }); } function ReadableStreamDefaultControllerShouldCallPull(controller) { var stream = controller._controlledReadableStream; if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { return false; } if (!controller._started) { return false; } if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { return true; } var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller); if (desiredSize > 0) { return true; } return false; } function ReadableStreamDefaultControllerClearAlgorithms(controller) { controller._pullAlgorithm = undefined; controller._cancelAlgorithm = undefined; controller._strategySizeAlgorithm = undefined; } // A client of ReadableStreamDefaultController may use these functions directly to bypass state check. function ReadableStreamDefaultControllerClose(controller) { if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { return; } var stream = controller._controlledReadableStream; controller._closeRequested = true; if (controller._queue.length === 0) { ReadableStreamDefaultControllerClearAlgorithms(controller); ReadableStreamClose(stream); } } function ReadableStreamDefaultControllerEnqueue(controller, chunk) { if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { return; } var stream = controller._controlledReadableStream; if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { ReadableStreamFulfillReadRequest(stream, chunk, false); } else { var chunkSize = void 0; try { chunkSize = controller._strategySizeAlgorithm(chunk); } catch (chunkSizeE) { ReadableStreamDefaultControllerError(controller, chunkSizeE); throw chunkSizeE; } try { EnqueueValueWithSize(controller, chunk, chunkSize); } catch (enqueueE) { ReadableStreamDefaultControllerError(controller, enqueueE); throw enqueueE; } } ReadableStreamDefaultControllerCallPullIfNeeded(controller); } function ReadableStreamDefaultControllerError(controller, e) { var stream = controller._controlledReadableStream; if (stream._state !== 'readable') { return; } ResetQueue(controller); ReadableStreamDefaultControllerClearAlgorithms(controller); ReadableStreamError(stream, e); } function ReadableStreamDefaultControllerGetDesiredSize(controller) { var state = controller._controlledReadableStream._state; if (state === 'errored') { return null; } if (state === 'closed') { return 0; } return controller._strategyHWM - controller._queueTotalSize; } // This is used in the implementation of TransformStream. function ReadableStreamDefaultControllerHasBackpressure(controller) { if (ReadableStreamDefaultControllerShouldCallPull(controller)) { return false; } return true; } function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) { var state = controller._controlledReadableStream._state; if (!controller._closeRequested && state === 'readable') { return true; } return false; } function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { controller._controlledReadableStream = stream; controller._queue = undefined; controller._queueTotalSize = undefined; ResetQueue(controller); controller._started = false; controller._closeRequested = false; controller._pullAgain = false; controller._pulling = false; controller._strategySizeAlgorithm = sizeAlgorithm; controller._strategyHWM = highWaterMark; controller._pullAlgorithm = pullAlgorithm; controller._cancelAlgorithm = cancelAlgorithm; stream._readableStreamController = controller; var startResult = startAlgorithm(); uponPromise(promiseResolvedWith(startResult), function () { controller._started = true; ReadableStreamDefaultControllerCallPullIfNeeded(controller); }, function (r) { ReadableStreamDefaultControllerError(controller, r); }); } function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { var controller = Object.create(ReadableStreamDefaultController.prototype); var startAlgorithm = function () { return undefined; }; var pullAlgorithm = function () { return promiseResolvedWith(undefined); }; var cancelAlgorithm = function () { return promiseResolvedWith(undefined); }; if (underlyingSource.start !== undefined) { startAlgorithm = function () { return underlyingSource.start(controller); }; } if (underlyingSource.pull !== undefined) { pullAlgorithm = function () { return underlyingSource.pull(controller); }; } if (underlyingSource.cancel !== undefined) { cancelAlgorithm = function (reason) { return underlyingSource.cancel(reason); }; } SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); } // Helper functions for the ReadableStreamDefaultController. function defaultControllerBrandCheckException$1(name) { return new TypeError("ReadableStreamDefaultController.prototype." + name + " can only be used on a ReadableStreamDefaultController"); } function ReadableStreamTee(stream, cloneForBranch2) { if (IsReadableByteStreamController(stream._readableStreamController)) { return ReadableByteStreamTee(stream); } return ReadableStreamDefaultTee(stream); } function ReadableStreamDefaultTee(stream, cloneForBranch2) { var reader = AcquireReadableStreamDefaultReader(stream); var reading = false; var readAgain = false; var canceled1 = false; var canceled2 = false; var reason1; var reason2; var branch1; var branch2; var resolveCancelPromise; var cancelPromise = newPromise(function (resolve) { resolveCancelPromise = resolve; }); function pullAlgorithm() { if (reading) { readAgain = true; return promiseResolvedWith(undefined); } reading = true; var readRequest = { _chunkSteps: function (chunk) { // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. queueMicrotask$1(function () { readAgain = false; var chunk1 = chunk; var chunk2 = chunk; // There is no way to access the cloning code right now in the reference implementation. // If we add one then we'll need an implementation for serializable objects. // if (!canceled2 && cloneForBranch2) { // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2)); // } if (!canceled1) { ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1); } if (!canceled2) { ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2); } reading = false; if (readAgain) { pullAlgorithm(); } }); }, _closeSteps: function () { reading = false; if (!canceled1) { ReadableStreamDefaultControllerClose(branch1._readableStreamController); } if (!canceled2) { ReadableStreamDefaultControllerClose(branch2._readableStreamController); } if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } }, _errorSteps: function () { reading = false; } }; ReadableStreamDefaultReaderRead(reader, readRequest); return promiseResolvedWith(undefined); } function cancel1Algorithm(reason) { canceled1 = true; reason1 = reason; if (canceled2) { var compositeReason = CreateArrayFromList([reason1, reason2]); var cancelResult = ReadableStreamCancel(stream, compositeReason); resolveCancelPromise(cancelResult); } return cancelPromise; } function cancel2Algorithm(reason) { canceled2 = true; reason2 = reason; if (canceled1) { var compositeReason = CreateArrayFromList([reason1, reason2]); var cancelResult = ReadableStreamCancel(stream, compositeReason); resolveCancelPromise(cancelResult); } return cancelPromise; } function startAlgorithm() { // do nothing } branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm); branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm); uponRejection(reader._closedPromise, function (r) { ReadableStreamDefaultControllerError(branch1._readableStreamController, r); ReadableStreamDefaultControllerError(branch2._readableStreamController, r); if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } }); return [branch1, branch2]; } function ReadableByteStreamTee(stream) { var reader = AcquireReadableStreamDefaultReader(stream); var reading = false; var readAgainForBranch1 = false; var readAgainForBranch2 = false; var canceled1 = false; var canceled2 = false; var reason1; var reason2; var branch1; var branch2; var resolveCancelPromise; var cancelPromise = newPromise(function (resolve) { resolveCancelPromise = resolve; }); function forwardReaderError(thisReader) { uponRejection(thisReader._closedPromise, function (r) { if (thisReader !== reader) { return; } ReadableByteStreamControllerError(branch1._readableStreamController, r); ReadableByteStreamControllerError(branch2._readableStreamController, r); if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } }); } function pullWithDefaultReader() { if (IsReadableStreamBYOBReader(reader)) { ReadableStreamReaderGenericRelease(reader); reader = AcquireReadableStreamDefaultReader(stream); forwardReaderError(reader); } var readRequest = { _chunkSteps: function (chunk) { // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. queueMicrotask$1(function () { readAgainForBranch1 = false; readAgainForBranch2 = false; var chunk1 = chunk; var chunk2 = chunk; if (!canceled1 && !canceled2) { try { chunk2 = CloneAsUint8Array(chunk); } catch (cloneE) { ReadableByteStreamControllerError(branch1._readableStreamController, cloneE); ReadableByteStreamControllerError(branch2._readableStreamController, cloneE); resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); return; } } if (!canceled1) { ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1); } if (!canceled2) { ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2); } reading = false; if (readAgainForBranch1) { pull1Algorithm(); } else if (readAgainForBranch2) { pull2Algorithm(); } }); }, _closeSteps: function () { reading = false; if (!canceled1) { ReadableByteStreamControllerClose(branch1._readableStreamController); } if (!canceled2) { ReadableByteStreamControllerClose(branch2._readableStreamController); } if (branch1._readableStreamController._pendingPullIntos.length > 0) { ReadableByteStreamControllerRespond(branch1._readableStreamController, 0); } if (branch2._readableStreamController._pendingPullIntos.length > 0) { ReadableByteStreamControllerRespond(branch2._readableStreamController, 0); } if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } }, _errorSteps: function () { reading = false; } }; ReadableStreamDefaultReaderRead(reader, readRequest); } function pullWithBYOBReader(view, forBranch2) { if (IsReadableStreamDefaultReader(reader)) { ReadableStreamReaderGenericRelease(reader); reader = AcquireReadableStreamBYOBReader(stream); forwardReaderError(reader); } var byobBranch = forBranch2 ? branch2 : branch1; var otherBranch = forBranch2 ? branch1 : branch2; var readIntoRequest = { _chunkSteps: function (chunk) { // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. queueMicrotask$1(function () { readAgainForBranch1 = false; readAgainForBranch2 = false; var byobCanceled = forBranch2 ? canceled2 : canceled1; var otherCanceled = forBranch2 ? canceled1 : canceled2; if (!otherCanceled) { var clonedChunk = void 0; try { clonedChunk = CloneAsUint8Array(chunk); } catch (cloneE) { ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE); ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE); resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); return; } if (!byobCanceled) { ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); } ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk); } else if (!byobCanceled) { ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); } reading = false; if (readAgainForBranch1) { pull1Algorithm(); } else if (readAgainForBranch2) { pull2Algorithm(); } }); }, _closeSteps: function (chunk) { reading = false; var byobCanceled = forBranch2 ? canceled2 : canceled1; var otherCanceled = forBranch2 ? canceled1 : canceled2; if (!byobCanceled) { ReadableByteStreamControllerClose(byobBranch._readableStreamController); } if (!otherCanceled) { ReadableByteStreamControllerClose(otherBranch._readableStreamController); } if (chunk !== undefined) { if (!byobCanceled) { ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); } if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) { ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0); } } if (!byobCanceled || !otherCanceled) { resolveCancelPromise(undefined); } }, _errorSteps: function () { reading = false; } }; ReadableStreamBYOBReaderRead(reader, view, readIntoRequest); } function pull1Algorithm() { if (reading) { readAgainForBranch1 = true; return promiseResolvedWith(undefined); } reading = true; var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController); if (byobRequest === null) { pullWithDefaultReader(); } else { pullWithBYOBReader(byobRequest._view, false); } return promiseResolvedWith(undefined); } function pull2Algorithm() { if (reading) { readAgainForBranch2 = true; return promiseResolvedWith(undefined); } reading = true; var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController); if (byobRequest === null) { pullWithDefaultReader(); } else { pullWithBYOBReader(byobRequest._view, true); } return promiseResolvedWith(undefined); } function cancel1Algorithm(reason) { canceled1 = true; reason1 = reason; if (canceled2) { var compositeReason = CreateArrayFromList([reason1, reason2]); var cancelResult = ReadableStreamCancel(stream, compositeReason); resolveCancelPromise(cancelResult); } return cancelPromise; } function cancel2Algorithm(reason) { canceled2 = true; reason2 = reason; if (canceled1) { var compositeReason = CreateArrayFromList([reason1, reason2]); var cancelResult = ReadableStreamCancel(stream, compositeReason); resolveCancelPromise(cancelResult); } return cancelPromise; } function startAlgorithm() { return; } branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm); branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm); forwardReaderError(reader); return [branch1, branch2]; } function convertUnderlyingDefaultOrByteSource(source, context) { assertDictionary(source, context); var original = source; var autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize; var cancel = original === null || original === void 0 ? void 0 : original.cancel; var pull = original === null || original === void 0 ? void 0 : original.pull; var start = original === null || original === void 0 ? void 0 : original.start; var type = original === null || original === void 0 ? void 0 : original.type; return { autoAllocateChunkSize: autoAllocateChunkSize === undefined ? undefined : convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, context + " has member 'autoAllocateChunkSize' that"), cancel: cancel === undefined ? undefined : convertUnderlyingSourceCancelCallback(cancel, original, context + " has member 'cancel' that"), pull: pull === undefined ? undefined : convertUnderlyingSourcePullCallback(pull, original, context + " has member 'pull' that"), start: start === undefined ? undefined : convertUnderlyingSourceStartCallback(start, original, context + " has member 'start' that"), type: type === undefined ? undefined : convertReadableStreamType(type, context + " has member 'type' that") }; } function convertUnderlyingSourceCancelCallback(fn, original, context) { assertFunction(fn, context); return function (reason) { return promiseCall(fn, original, [reason]); }; } function convertUnderlyingSourcePullCallback(fn, original, context) { assertFunction(fn, context); return function (controller) { return promiseCall(fn, original, [controller]); }; } function convertUnderlyingSourceStartCallback(fn, original, context) { assertFunction(fn, context); return function (controller) { return reflectCall(fn, original, [controller]); }; } function convertReadableStreamType(type, context) { type = "" + type; if (type !== 'bytes') { throw new TypeError(context + " '" + type + "' is not a valid enumeration value for ReadableStreamType"); } return type; } function convertReaderOptions(options, context) { assertDictionary(options, context); var mode = options === null || options === void 0 ? void 0 : options.mode; return { mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, context + " has member 'mode' that") }; } function convertReadableStreamReaderMode(mode, context) { mode = "" + mode; if (mode !== 'byob') { throw new TypeError(context + " '" + mode + "' is not a valid enumeration value for ReadableStreamReaderMode"); } return mode; } function convertIteratorOptions(options, context) { assertDictionary(options, context); var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; return { preventCancel: Boolean(preventCancel) }; } function convertPipeOptions(options, context) { assertDictionary(options, context); var preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort; var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; var preventClose = options === null || options === void 0 ? void 0 : options.preventClose; var signal = options === null || options === void 0 ? void 0 : options.signal; if (signal !== undefined) { assertAbortSignal(signal, context + " has member 'signal' that"); } return { preventAbort: Boolean(preventAbort), preventCancel: Boolean(preventCancel), preventClose: Boolean(preventClose), signal: signal }; } function assertAbortSignal(signal, context) { if (!isAbortSignal$1(signal)) { throw new TypeError(context + " is not an AbortSignal."); } } function convertReadableWritablePair(pair, context) { assertDictionary(pair, context); var readable = pair === null || pair === void 0 ? void 0 : pair.readable; assertRequiredField(readable, 'readable', 'ReadableWritablePair'); assertReadableStream(readable, context + " has member 'readable' that"); var writable = pair === null || pair === void 0 ? void 0 : pair.writable; assertRequiredField(writable, 'writable', 'ReadableWritablePair'); assertWritableStream(writable, context + " has member 'writable' that"); return { readable: readable, writable: writable }; } /** * A readable stream represents a source of data, from which you can read. * * @public */ var ReadableStream$1 = /** @class */ (function () { function ReadableStream(rawUnderlyingSource, rawStrategy) { if (rawUnderlyingSource === void 0) { rawUnderlyingSource = {}; } if (rawStrategy === void 0) { rawStrategy = {}; } if (rawUnderlyingSource === undefined) { rawUnderlyingSource = null; } else { assertObject(rawUnderlyingSource, 'First parameter'); } var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); var underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter'); InitializeReadableStream(this); if (underlyingSource.type === 'bytes') { if (strategy.size !== undefined) { throw new RangeError('The strategy for a byte stream cannot have a size function'); } var highWaterMark = ExtractHighWaterMark(strategy, 0); SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark); } else { var sizeAlgorithm = ExtractSizeAlgorithm(strategy); var highWaterMark = ExtractHighWaterMark(strategy, 1); SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm); } } Object.defineProperty(ReadableStream.prototype, "locked", { /** * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}. */ get: function () { if (!IsReadableStream(this)) { throw streamBrandCheckException$1('locked'); } return IsReadableStreamLocked(this); }, enumerable: false, configurable: true }); /** * Cancels the stream, signaling a loss of interest in the stream by a consumer. * * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()} * method, which might or might not use it. */ ReadableStream.prototype.cancel = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsReadableStream(this)) { return promiseRejectedWith(streamBrandCheckException$1('cancel')); } if (IsReadableStreamLocked(this)) { return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader')); } return ReadableStreamCancel(this, reason); }; ReadableStream.prototype.getReader = function (rawOptions) { if (rawOptions === void 0) { rawOptions = undefined; } if (!IsReadableStream(this)) { throw streamBrandCheckException$1('getReader'); } var options = convertReaderOptions(rawOptions, 'First parameter'); if (options.mode === undefined) { return AcquireReadableStreamDefaultReader(this); } return AcquireReadableStreamBYOBReader(this); }; ReadableStream.prototype.pipeThrough = function (rawTransform, rawOptions) { if (rawOptions === void 0) { rawOptions = {}; } if (!IsReadableStream(this)) { throw streamBrandCheckException$1('pipeThrough'); } assertRequiredArgument(rawTransform, 1, 'pipeThrough'); var transform = convertReadableWritablePair(rawTransform, 'First parameter'); var options = convertPipeOptions(rawOptions, 'Second parameter'); if (IsReadableStreamLocked(this)) { throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream'); } if (IsWritableStreamLocked(transform.writable)) { throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream'); } var promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal); setPromiseIsHandledToTrue(promise); return transform.readable; }; ReadableStream.prototype.pipeTo = function (destination, rawOptions) { if (rawOptions === void 0) { rawOptions = {}; } if (!IsReadableStream(this)) { return promiseRejectedWith(streamBrandCheckException$1('pipeTo')); } if (destination === undefined) { return promiseRejectedWith("Parameter 1 is required in 'pipeTo'."); } if (!IsWritableStream(destination)) { return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")); } var options; try { options = convertPipeOptions(rawOptions, 'Second parameter'); } catch (e) { return promiseRejectedWith(e); } if (IsReadableStreamLocked(this)) { return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream')); } if (IsWritableStreamLocked(destination)) { return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream')); } return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal); }; /** * Tees this readable stream, returning a two-element array containing the two resulting branches as * new {@link ReadableStream} instances. * * Teeing a stream will lock it, preventing any other consumer from acquiring a reader. * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be * propagated to the stream's underlying source. * * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable, * this could allow interference between the two branches. */ ReadableStream.prototype.tee = function () { if (!IsReadableStream(this)) { throw streamBrandCheckException$1('tee'); } var branches = ReadableStreamTee(this); return CreateArrayFromList(branches); }; ReadableStream.prototype.values = function (rawOptions) { if (rawOptions === void 0) { rawOptions = undefined; } if (!IsReadableStream(this)) { throw streamBrandCheckException$1('values'); } var options = convertIteratorOptions(rawOptions, 'First parameter'); return AcquireReadableStreamAsyncIterator(this, options.preventCancel); }; return ReadableStream; }()); Object.defineProperties(ReadableStream$1.prototype, { cancel: { enumerable: true }, getReader: { enumerable: true }, pipeThrough: { enumerable: true }, pipeTo: { enumerable: true }, tee: { enumerable: true }, values: { enumerable: true }, locked: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ReadableStream$1.prototype, SymbolPolyfill.toStringTag, { value: 'ReadableStream', configurable: true }); } if (typeof SymbolPolyfill.asyncIterator === 'symbol') { Object.defineProperty(ReadableStream$1.prototype, SymbolPolyfill.asyncIterator, { value: ReadableStream$1.prototype.values, writable: true, configurable: true }); } // Abstract operations for the ReadableStream. // Throws if and only if startAlgorithm throws. function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { if (highWaterMark === void 0) { highWaterMark = 1; } if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; } var stream = Object.create(ReadableStream$1.prototype); InitializeReadableStream(stream); var controller = Object.create(ReadableStreamDefaultController.prototype); SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); return stream; } // Throws if and only if startAlgorithm throws. function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) { var stream = Object.create(ReadableStream$1.prototype); InitializeReadableStream(stream); var controller = Object.create(ReadableByteStreamController.prototype); SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined); return stream; } function InitializeReadableStream(stream) { stream._state = 'readable'; stream._reader = undefined; stream._storedError = undefined; stream._disturbed = false; } function IsReadableStream(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) { return false; } return x instanceof ReadableStream$1; } function IsReadableStreamLocked(stream) { if (stream._reader === undefined) { return false; } return true; } // ReadableStream API exposed for controllers. function ReadableStreamCancel(stream, reason) { stream._disturbed = true; if (stream._state === 'closed') { return promiseResolvedWith(undefined); } if (stream._state === 'errored') { return promiseRejectedWith(stream._storedError); } ReadableStreamClose(stream); var reader = stream._reader; if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { reader._readIntoRequests.forEach(function (readIntoRequest) { readIntoRequest._closeSteps(undefined); }); reader._readIntoRequests = new SimpleQueue(); } var sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); return transformPromiseWith(sourceCancelPromise, noop); } function ReadableStreamClose(stream) { stream._state = 'closed'; var reader = stream._reader; if (reader === undefined) { return; } defaultReaderClosedPromiseResolve(reader); if (IsReadableStreamDefaultReader(reader)) { reader._readRequests.forEach(function (readRequest) { readRequest._closeSteps(); }); reader._readRequests = new SimpleQueue(); } } function ReadableStreamError(stream, e) { stream._state = 'errored'; stream._storedError = e; var reader = stream._reader; if (reader === undefined) { return; } defaultReaderClosedPromiseReject(reader, e); if (IsReadableStreamDefaultReader(reader)) { reader._readRequests.forEach(function (readRequest) { readRequest._errorSteps(e); }); reader._readRequests = new SimpleQueue(); } else { reader._readIntoRequests.forEach(function (readIntoRequest) { readIntoRequest._errorSteps(e); }); reader._readIntoRequests = new SimpleQueue(); } } // Helper functions for the ReadableStream. function streamBrandCheckException$1(name) { return new TypeError("ReadableStream.prototype." + name + " can only be used on a ReadableStream"); } function convertQueuingStrategyInit(init, context) { assertDictionary(init, context); var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit'); return { highWaterMark: convertUnrestrictedDouble(highWaterMark) }; } // The size function must not have a prototype property nor be a constructor var byteLengthSizeFunction = function (chunk) { return chunk.byteLength; }; try { Object.defineProperty(byteLengthSizeFunction, 'name', { value: 'size', configurable: true }); } catch (_a) { // This property is non-configurable in older browsers, so ignore if this throws. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility } /** * A queuing strategy that counts the number of bytes in each chunk. * * @public */ var ByteLengthQueuingStrategy = /** @class */ (function () { function ByteLengthQueuingStrategy(options) { assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy'); options = convertQueuingStrategyInit(options, 'First parameter'); this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark; } Object.defineProperty(ByteLengthQueuingStrategy.prototype, "highWaterMark", { /** * Returns the high water mark provided to the constructor. */ get: function () { if (!IsByteLengthQueuingStrategy(this)) { throw byteLengthBrandCheckException('highWaterMark'); } return this._byteLengthQueuingStrategyHighWaterMark; }, enumerable: false, configurable: true }); Object.defineProperty(ByteLengthQueuingStrategy.prototype, "size", { /** * Measures the size of `chunk` by returning the value of its `byteLength` property. */ get: function () { if (!IsByteLengthQueuingStrategy(this)) { throw byteLengthBrandCheckException('size'); } return byteLengthSizeFunction; }, enumerable: false, configurable: true }); return ByteLengthQueuingStrategy; }()); Object.defineProperties(ByteLengthQueuingStrategy.prototype, { highWaterMark: { enumerable: true }, size: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { value: 'ByteLengthQueuingStrategy', configurable: true }); } // Helper functions for the ByteLengthQueuingStrategy. function byteLengthBrandCheckException(name) { return new TypeError("ByteLengthQueuingStrategy.prototype." + name + " can only be used on a ByteLengthQueuingStrategy"); } function IsByteLengthQueuingStrategy(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) { return false; } return x instanceof ByteLengthQueuingStrategy; } // The size function must not have a prototype property nor be a constructor var countSizeFunction = function () { return 1; }; try { Object.defineProperty(countSizeFunction, 'name', { value: 'size', configurable: true }); } catch (_a) { // This property is non-configurable in older browsers, so ignore if this throws. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility } /** * A queuing strategy that counts the number of chunks. * * @public */ var CountQueuingStrategy = /** @class */ (function () { function CountQueuingStrategy(options) { assertRequiredArgument(options, 1, 'CountQueuingStrategy'); options = convertQueuingStrategyInit(options, 'First parameter'); this._countQueuingStrategyHighWaterMark = options.highWaterMark; } Object.defineProperty(CountQueuingStrategy.prototype, "highWaterMark", { /** * Returns the high water mark provided to the constructor. */ get: function () { if (!IsCountQueuingStrategy(this)) { throw countBrandCheckException('highWaterMark'); } return this._countQueuingStrategyHighWaterMark; }, enumerable: false, configurable: true }); Object.defineProperty(CountQueuingStrategy.prototype, "size", { /** * Measures the size of `chunk` by always returning 1. * This ensures that the total queue size is a count of the number of chunks in the queue. */ get: function () { if (!IsCountQueuingStrategy(this)) { throw countBrandCheckException('size'); } return countSizeFunction; }, enumerable: false, configurable: true }); return CountQueuingStrategy; }()); Object.defineProperties(CountQueuingStrategy.prototype, { highWaterMark: { enumerable: true }, size: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { value: 'CountQueuingStrategy', configurable: true }); } // Helper functions for the CountQueuingStrategy. function countBrandCheckException(name) { return new TypeError("CountQueuingStrategy.prototype." + name + " can only be used on a CountQueuingStrategy"); } function IsCountQueuingStrategy(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) { return false; } return x instanceof CountQueuingStrategy; } function convertTransformer(original, context) { assertDictionary(original, context); var flush = original === null || original === void 0 ? void 0 : original.flush; var readableType = original === null || original === void 0 ? void 0 : original.readableType; var start = original === null || original === void 0 ? void 0 : original.start; var transform = original === null || original === void 0 ? void 0 : original.transform; var writableType = original === null || original === void 0 ? void 0 : original.writableType; return { flush: flush === undefined ? undefined : convertTransformerFlushCallback(flush, original, context + " has member 'flush' that"), readableType: readableType, start: start === undefined ? undefined : convertTransformerStartCallback(start, original, context + " has member 'start' that"), transform: transform === undefined ? undefined : convertTransformerTransformCallback(transform, original, context + " has member 'transform' that"), writableType: writableType }; } function convertTransformerFlushCallback(fn, original, context) { assertFunction(fn, context); return function (controller) { return promiseCall(fn, original, [controller]); }; } function convertTransformerStartCallback(fn, original, context) { assertFunction(fn, context); return function (controller) { return reflectCall(fn, original, [controller]); }; } function convertTransformerTransformCallback(fn, original, context) { assertFunction(fn, context); return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); }; } // Class TransformStream /** * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream}, * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side. * In a manner specific to the transform stream in question, writes to the writable side result in new data being * made available for reading from the readable side. * * @public */ var TransformStream = /** @class */ (function () { function TransformStream(rawTransformer, rawWritableStrategy, rawReadableStrategy) { if (rawTransformer === void 0) { rawTransformer = {}; } if (rawWritableStrategy === void 0) { rawWritableStrategy = {}; } if (rawReadableStrategy === void 0) { rawReadableStrategy = {}; } if (rawTransformer === undefined) { rawTransformer = null; } var writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter'); var readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter'); var transformer = convertTransformer(rawTransformer, 'First parameter'); if (transformer.readableType !== undefined) { throw new RangeError('Invalid readableType specified'); } if (transformer.writableType !== undefined) { throw new RangeError('Invalid writableType specified'); } var readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0); var readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy); var writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); var writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); var startPromise_resolve; var startPromise = newPromise(function (resolve) { startPromise_resolve = resolve; }); InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); if (transformer.start !== undefined) { startPromise_resolve(transformer.start(this._transformStreamController)); } else { startPromise_resolve(undefined); } } Object.defineProperty(TransformStream.prototype, "readable", { /** * The readable side of the transform stream. */ get: function () { if (!IsTransformStream(this)) { throw streamBrandCheckException('readable'); } return this._readable; }, enumerable: false, configurable: true }); Object.defineProperty(TransformStream.prototype, "writable", { /** * The writable side of the transform stream. */ get: function () { if (!IsTransformStream(this)) { throw streamBrandCheckException('writable'); } return this._writable; }, enumerable: false, configurable: true }); return TransformStream; }()); Object.defineProperties(TransformStream.prototype, { readable: { enumerable: true }, writable: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { value: 'TransformStream', configurable: true }); } function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { function startAlgorithm() { return startPromise; } function writeAlgorithm(chunk) { return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk); } function abortAlgorithm(reason) { return TransformStreamDefaultSinkAbortAlgorithm(stream, reason); } function closeAlgorithm() { return TransformStreamDefaultSinkCloseAlgorithm(stream); } stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); function pullAlgorithm() { return TransformStreamDefaultSourcePullAlgorithm(stream); } function cancelAlgorithm(reason) { TransformStreamErrorWritableAndUnblockWrite(stream, reason); return promiseResolvedWith(undefined); } stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. stream._backpressure = undefined; stream._backpressureChangePromise = undefined; stream._backpressureChangePromise_resolve = undefined; TransformStreamSetBackpressure(stream, true); stream._transformStreamController = undefined; } function IsTransformStream(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) { return false; } return x instanceof TransformStream; } // This is a no-op if both sides are already errored. function TransformStreamError(stream, e) { ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e); TransformStreamErrorWritableAndUnblockWrite(stream, e); } function TransformStreamErrorWritableAndUnblockWrite(stream, e) { TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); if (stream._backpressure) { // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time // _backpressure is set. TransformStreamSetBackpressure(stream, false); } } function TransformStreamSetBackpressure(stream, backpressure) { // Passes also when called during construction. if (stream._backpressureChangePromise !== undefined) { stream._backpressureChangePromise_resolve(); } stream._backpressureChangePromise = newPromise(function (resolve) { stream._backpressureChangePromise_resolve = resolve; }); stream._backpressure = backpressure; } // Class TransformStreamDefaultController /** * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}. * * @public */ var TransformStreamDefaultController = /** @class */ (function () { function TransformStreamDefaultController() { throw new TypeError('Illegal constructor'); } Object.defineProperty(TransformStreamDefaultController.prototype, "desiredSize", { /** * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full. */ get: function () { if (!IsTransformStreamDefaultController(this)) { throw defaultControllerBrandCheckException('desiredSize'); } var readableController = this._controlledTransformStream._readable._readableStreamController; return ReadableStreamDefaultControllerGetDesiredSize(readableController); }, enumerable: false, configurable: true }); TransformStreamDefaultController.prototype.enqueue = function (chunk) { if (chunk === void 0) { chunk = undefined; } if (!IsTransformStreamDefaultController(this)) { throw defaultControllerBrandCheckException('enqueue'); } TransformStreamDefaultControllerEnqueue(this, chunk); }; /** * Errors both the readable side and the writable side of the controlled transform stream, making all future * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded. */ TransformStreamDefaultController.prototype.error = function (reason) { if (reason === void 0) { reason = undefined; } if (!IsTransformStreamDefaultController(this)) { throw defaultControllerBrandCheckException('error'); } TransformStreamDefaultControllerError(this, reason); }; /** * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the * transformer only needs to consume a portion of the chunks written to the writable side. */ TransformStreamDefaultController.prototype.terminate = function () { if (!IsTransformStreamDefaultController(this)) { throw defaultControllerBrandCheckException('terminate'); } TransformStreamDefaultControllerTerminate(this); }; return TransformStreamDefaultController; }()); Object.defineProperties(TransformStreamDefaultController.prototype, { enqueue: { enumerable: true }, error: { enumerable: true }, terminate: { enumerable: true }, desiredSize: { enumerable: true } }); if (typeof SymbolPolyfill.toStringTag === 'symbol') { Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { value: 'TransformStreamDefaultController', configurable: true }); } // Transform Stream Default Controller Abstract Operations function IsTransformStreamDefaultController(x) { if (!typeIsObject(x)) { return false; } if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) { return false; } return x instanceof TransformStreamDefaultController; } function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { controller._controlledTransformStream = stream; stream._transformStreamController = controller; controller._transformAlgorithm = transformAlgorithm; controller._flushAlgorithm = flushAlgorithm; } function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { var controller = Object.create(TransformStreamDefaultController.prototype); var transformAlgorithm = function (chunk) { try { TransformStreamDefaultControllerEnqueue(controller, chunk); return promiseResolvedWith(undefined); } catch (transformResultE) { return promiseRejectedWith(transformResultE); } }; var flushAlgorithm = function () { return promiseResolvedWith(undefined); }; if (transformer.transform !== undefined) { transformAlgorithm = function (chunk) { return transformer.transform(chunk, controller); }; } if (transformer.flush !== undefined) { flushAlgorithm = function () { return transformer.flush(controller); }; } SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); } function TransformStreamDefaultControllerClearAlgorithms(controller) { controller._transformAlgorithm = undefined; controller._flushAlgorithm = undefined; } function TransformStreamDefaultControllerEnqueue(controller, chunk) { var stream = controller._controlledTransformStream; var readableController = stream._readable._readableStreamController; if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) { throw new TypeError('Readable side is not in a state that permits enqueue'); } // We throttle transform invocations based on the backpressure of the ReadableStream, but we still // accept TransformStreamDefaultControllerEnqueue() calls. try { ReadableStreamDefaultControllerEnqueue(readableController, chunk); } catch (e) { // This happens when readableStrategy.size() throws. TransformStreamErrorWritableAndUnblockWrite(stream, e); throw stream._readable._storedError; } var backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController); if (backpressure !== stream._backpressure) { TransformStreamSetBackpressure(stream, true); } } function TransformStreamDefaultControllerError(controller, e) { TransformStreamError(controller._controlledTransformStream, e); } function TransformStreamDefaultControllerPerformTransform(controller, chunk) { var transformPromise = controller._transformAlgorithm(chunk); return transformPromiseWith(transformPromise, undefined, function (r) { TransformStreamError(controller._controlledTransformStream, r); throw r; }); } function TransformStreamDefaultControllerTerminate(controller) { var stream = controller._controlledTransformStream; var readableController = stream._readable._readableStreamController; ReadableStreamDefaultControllerClose(readableController); var error = new TypeError('TransformStream terminated'); TransformStreamErrorWritableAndUnblockWrite(stream, error); } // TransformStreamDefaultSink Algorithms function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) { var controller = stream._transformStreamController; if (stream._backpressure) { var backpressureChangePromise = stream._backpressureChangePromise; return transformPromiseWith(backpressureChangePromise, function () { var writable = stream._writable; var state = writable._state; if (state === 'erroring') { throw writable._storedError; } return TransformStreamDefaultControllerPerformTransform(controller, chunk); }); } return TransformStreamDefaultControllerPerformTransform(controller, chunk); } function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { // abort() is not called synchronously, so it is possible for abort() to be called when the stream is already // errored. TransformStreamError(stream, reason); return promiseResolvedWith(undefined); } function TransformStreamDefaultSinkCloseAlgorithm(stream) { // stream._readable cannot change after construction, so caching it across a call to user code is safe. var readable = stream._readable; var controller = stream._transformStreamController; var flushPromise = controller._flushAlgorithm(); TransformStreamDefaultControllerClearAlgorithms(controller); // Return a promise that is fulfilled with undefined on success. return transformPromiseWith(flushPromise, function () { if (readable._state === 'errored') { throw readable._storedError; } ReadableStreamDefaultControllerClose(readable._readableStreamController); }, function (r) { TransformStreamError(stream, r); throw readable._storedError; }); } // TransformStreamDefaultSource Algorithms function TransformStreamDefaultSourcePullAlgorithm(stream) { // Invariant. Enforced by the promises returned by start() and pull(). TransformStreamSetBackpressure(stream, false); // Prevent the next pull() call until there is backpressure. return stream._backpressureChangePromise; } // Helper functions for the TransformStreamDefaultController. function defaultControllerBrandCheckException(name) { return new TypeError("TransformStreamDefaultController.prototype." + name + " can only be used on a TransformStreamDefaultController"); } // Helper functions for the TransformStream. function streamBrandCheckException(name) { return new TypeError("TransformStream.prototype." + name + " can only be used on a TransformStream"); } var ponyfill = /*#__PURE__*/Object.freeze({ __proto__: null, ByteLengthQueuingStrategy: ByteLengthQueuingStrategy, CountQueuingStrategy: CountQueuingStrategy, ReadableByteStreamController: ReadableByteStreamController, ReadableStream: ReadableStream$1, ReadableStreamBYOBReader: ReadableStreamBYOBReader, ReadableStreamBYOBRequest: ReadableStreamBYOBRequest, ReadableStreamDefaultController: ReadableStreamDefaultController, ReadableStreamDefaultReader: ReadableStreamDefaultReader, TransformStream: TransformStream, TransformStreamDefaultController: TransformStreamDefaultController, WritableStream: WritableStream, WritableStreamDefaultController: WritableStreamDefaultController, WritableStreamDefaultWriter: WritableStreamDefaultWriter }); var require$$6 = /*@__PURE__*/getAugmentedNamespace(ponyfill); /*! * MIT License * * Copyright (c) 2017-2022 Peculiar Ventures, LLC * * 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. * */ const ARRAY_BUFFER_NAME = "[object ArrayBuffer]"; class BufferSourceConverter { static isArrayBuffer(data) { return Object.prototype.toString.call(data) === ARRAY_BUFFER_NAME; } static toArrayBuffer(data) { if (this.isArrayBuffer(data)) { return data; } if (data.byteLength === data.buffer.byteLength) { return data.buffer; } return this.toUint8Array(data).slice().buffer; } static toUint8Array(data) { return this.toView(data, Uint8Array); } static toView(data, type) { if (data.constructor === type) { return data; } if (this.isArrayBuffer(data)) { return new type(data); } if (this.isArrayBufferView(data)) { return new type(data.buffer, data.byteOffset, data.byteLength); } throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'"); } static isBufferSource(data) { return this.isArrayBufferView(data) || this.isArrayBuffer(data); } static isArrayBufferView(data) { return ArrayBuffer.isView(data) || (data && this.isArrayBuffer(data.buffer)); } static isEqual(a, b) { const aView = BufferSourceConverter.toUint8Array(a); const bView = BufferSourceConverter.toUint8Array(b); if (aView.length !== bView.byteLength) { return false; } for (let i = 0; i < aView.length; i++) { if (aView[i] !== bView[i]) { return false; } } return true; } static concat(...args) { if (Array.isArray(args[0])) { const buffers = args[0]; let size = 0; for (const buffer of buffers) { size += buffer.byteLength; } const res = new Uint8Array(size); let offset = 0; for (const buffer of buffers) { const view = this.toUint8Array(buffer); res.set(view, offset); offset += view.length; } if (args[1]) { return this.toView(res, args[1]); } return res.buffer; } else { return this.concat(args); } } } class Utf8Converter { static fromString(text) { const s = unescape(encodeURIComponent(text)); const uintArray = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) { uintArray[i] = s.charCodeAt(i); } return uintArray.buffer; } static toString(buffer) { const buf = BufferSourceConverter.toUint8Array(buffer); let encodedString = ""; for (let i = 0; i < buf.length; i++) { encodedString += String.fromCharCode(buf[i]); } const decodedString = decodeURIComponent(escape(encodedString)); return decodedString; } } class Utf16Converter { static toString(buffer, littleEndian = false) { const arrayBuffer = BufferSourceConverter.toArrayBuffer(buffer); const dataView = new DataView(arrayBuffer); let res = ""; for (let i = 0; i < arrayBuffer.byteLength; i += 2) { const code = dataView.getUint16(i, littleEndian); res += String.fromCharCode(code); } return res; } static fromString(text, littleEndian = false) { const res = new ArrayBuffer(text.length * 2); const dataView = new DataView(res); for (let i = 0; i < text.length; i++) { dataView.setUint16(i * 2, text.charCodeAt(i), littleEndian); } return res; } } class Convert { static isHex(data) { return typeof data === "string" && /^[a-z0-9]+$/i.test(data); } static isBase64(data) { return typeof data === "string" && /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(data); } static isBase64Url(data) { return typeof data === "string" && /^[a-zA-Z0-9-_]+$/i.test(data); } static ToString(buffer, enc = "utf8") { const buf = BufferSourceConverter.toUint8Array(buffer); switch (enc.toLowerCase()) { case "utf8": return this.ToUtf8String(buf); case "binary": return this.ToBinary(buf); case "hex": return this.ToHex(buf); case "base64": return this.ToBase64(buf); case "base64url": return this.ToBase64Url(buf); case "utf16le": return Utf16Converter.toString(buf, true); case "utf16": case "utf16be": return Utf16Converter.toString(buf); default: throw new Error(`Unknown type of encoding '${enc}'`); } } static FromString(str, enc = "utf8") { if (!str) { return new ArrayBuffer(0); } switch (enc.toLowerCase()) { case "utf8": return this.FromUtf8String(str); case "binary": return this.FromBinary(str); case "hex": return this.FromHex(str); case "base64": return this.FromBase64(str); case "base64url": return this.FromBase64Url(str); case "utf16le": return Utf16Converter.fromString(str, true); case "utf16": case "utf16be": return Utf16Converter.fromString(str); default: throw new Error(`Unknown type of encoding '${enc}'`); } } static ToBase64(buffer) { const buf = BufferSourceConverter.toUint8Array(buffer); if (typeof btoa !== "undefined") { const binary = this.ToString(buf, "binary"); return btoa(binary); } else { return Buffer.from(buf).toString("base64"); } } static FromBase64(base64) { const formatted = this.formatString(base64); if (!formatted) { return new ArrayBuffer(0); } if (!Convert.isBase64(formatted)) { throw new TypeError("Argument 'base64Text' is not Base64 encoded"); } if (typeof atob !== "undefined") { return this.FromBinary(atob(formatted)); } else { return new Uint8Array(Buffer.from(formatted, "base64")).buffer; } } static FromBase64Url(base64url) { const formatted = this.formatString(base64url); if (!formatted) { return new ArrayBuffer(0); } if (!Convert.isBase64Url(formatted)) { throw new TypeError("Argument 'base64url' is not Base64Url encoded"); } return this.FromBase64(this.Base64Padding(formatted.replace(/\-/g, "+").replace(/\_/g, "/"))); } static ToBase64Url(data) { return this.ToBase64(data).replace(/\+/g, "-").replace(/\//g, "_").replace(/\=/g, ""); } static FromUtf8String(text, encoding = Convert.DEFAULT_UTF8_ENCODING) { switch (encoding) { case "ascii": return this.FromBinary(text); case "utf8": return Utf8Converter.fromString(text); case "utf16": case "utf16be": return Utf16Converter.fromString(text); case "utf16le": case "usc2": return Utf16Converter.fromString(text, true); default: throw new Error(`Unknown type of encoding '${encoding}'`); } } static ToUtf8String(buffer, encoding = Convert.DEFAULT_UTF8_ENCODING) { switch (encoding) { case "ascii": return this.ToBinary(buffer); case "utf8": return Utf8Converter.toString(buffer); case "utf16": case "utf16be": return Utf16Converter.toString(buffer); case "utf16le": case "usc2": return Utf16Converter.toString(buffer, true); default: throw new Error(`Unknown type of encoding '${encoding}'`); } } static FromBinary(text) { const stringLength = text.length; const resultView = new Uint8Array(stringLength); for (let i = 0; i < stringLength; i++) { resultView[i] = text.charCodeAt(i); } return resultView.buffer; } static ToBinary(buffer) { const buf = BufferSourceConverter.toUint8Array(buffer); let res = ""; for (let i = 0; i < buf.length; i++) { res += String.fromCharCode(buf[i]); } return res; } static ToHex(buffer) { const buf = BufferSourceConverter.toUint8Array(buffer); const splitter = ""; const res = []; const len = buf.length; for (let i = 0; i < len; i++) { const char = buf[i].toString(16).padStart(2, "0"); res.push(char); } return res.join(splitter); } static FromHex(hexString) { let formatted = this.formatString(hexString); if (!formatted) { return new ArrayBuffer(0); } if (!Convert.isHex(formatted)) { throw new TypeError("Argument 'hexString' is not HEX encoded"); } if (formatted.length % 2) { formatted = `0${formatted}`; } const res = new Uint8Array(formatted.length / 2); for (let i = 0; i < formatted.length; i = i + 2) { const c = formatted.slice(i, i + 2); res[i / 2] = parseInt(c, 16); } return res.buffer; } static ToUtf16String(buffer, littleEndian = false) { return Utf16Converter.toString(buffer, littleEndian); } static FromUtf16String(text, littleEndian = false) { return Utf16Converter.fromString(text, littleEndian); } static Base64Padding(base64) { const padCount = 4 - (base64.length % 4); if (padCount < 4) { for (let i = 0; i < padCount; i++) { base64 += "="; } } return base64; } static formatString(data) { return (data === null || data === void 0 ? void 0 : data.replace(/[\n\r\t ]/g, "")) || ""; } } Convert.DEFAULT_UTF8_ENCODING = "utf8"; function combine(...buf) { const totalByteLength = buf.map((item) => item.byteLength).reduce((prev, cur) => prev + cur); const res = new Uint8Array(totalByteLength); let currentPos = 0; buf.map((item) => new Uint8Array(item)).forEach((arr) => { for (const item2 of arr) { res[currentPos++] = item2; } }); return res.buffer; } /*! Copyright (c) Peculiar Ventures, LLC */ function utilFromBase(inputBuffer, inputBase) { let result = 0; if (inputBuffer.length === 1) { return inputBuffer[0]; } for (let i = (inputBuffer.length - 1); i >= 0; i--) { result += inputBuffer[(inputBuffer.length - 1) - i] * Math.pow(2, inputBase * i); } return result; } function utilToBase(value, base, reserved = (-1)) { const internalReserved = reserved; let internalValue = value; let result = 0; let biggest = Math.pow(2, base); for (let i = 1; i < 8; i++) { if (value < biggest) { let retBuf; if (internalReserved < 0) { retBuf = new ArrayBuffer(i); result = i; } else { if (internalReserved < i) { return (new ArrayBuffer(0)); } retBuf = new ArrayBuffer(internalReserved); result = internalReserved; } const retView = new Uint8Array(retBuf); for (let j = (i - 1); j >= 0; j--) { const basis = Math.pow(2, j * base); retView[result - j - 1] = Math.floor(internalValue / basis); internalValue -= (retView[result - j - 1]) * basis; } return retBuf; } biggest *= Math.pow(2, base); } return new ArrayBuffer(0); } function utilConcatView(...views) { let outputLength = 0; let prevLength = 0; for (const view of views) { outputLength += view.length; } const retBuf = new ArrayBuffer(outputLength); const retView = new Uint8Array(retBuf); for (const view of views) { retView.set(view, prevLength); prevLength += view.length; } return retView; } function utilDecodeTC() { const buf = new Uint8Array(this.valueHex); if (this.valueHex.byteLength >= 2) { const condition1 = (buf[0] === 0xFF) && (buf[1] & 0x80); const condition2 = (buf[0] === 0x00) && ((buf[1] & 0x80) === 0x00); if (condition1 || condition2) { this.warnings.push("Needlessly long format"); } } const bigIntBuffer = new ArrayBuffer(this.valueHex.byteLength); const bigIntView = new Uint8Array(bigIntBuffer); for (let i = 0; i < this.valueHex.byteLength; i++) { bigIntView[i] = 0; } bigIntView[0] = (buf[0] & 0x80); const bigInt = utilFromBase(bigIntView, 8); const smallIntBuffer = new ArrayBuffer(this.valueHex.byteLength); const smallIntView = new Uint8Array(smallIntBuffer); for (let j = 0; j < this.valueHex.byteLength; j++) { smallIntView[j] = buf[j]; } smallIntView[0] &= 0x7F; const smallInt = utilFromBase(smallIntView, 8); return (smallInt - bigInt); } function utilEncodeTC(value) { const modValue = (value < 0) ? (value * (-1)) : value; let bigInt = 128; for (let i = 1; i < 8; i++) { if (modValue <= bigInt) { if (value < 0) { const smallInt = bigInt - modValue; const retBuf = utilToBase(smallInt, 8, i); const retView = new Uint8Array(retBuf); retView[0] |= 0x80; return retBuf; } let retBuf = utilToBase(modValue, 8, i); let retView = new Uint8Array(retBuf); if (retView[0] & 0x80) { const tempBuf = retBuf.slice(0); const tempView = new Uint8Array(tempBuf); retBuf = new ArrayBuffer(retBuf.byteLength + 1); retView = new Uint8Array(retBuf); for (let k = 0; k < tempBuf.byteLength; k++) { retView[k + 1] = tempView[k]; } retView[0] = 0x00; } return retBuf; } bigInt *= Math.pow(2, 8); } return (new ArrayBuffer(0)); } function isEqualBuffer(inputBuffer1, inputBuffer2) { if (inputBuffer1.byteLength !== inputBuffer2.byteLength) { return false; } const view1 = new Uint8Array(inputBuffer1); const view2 = new Uint8Array(inputBuffer2); for (let i = 0; i < view1.length; i++) { if (view1[i] !== view2[i]) { return false; } } return true; } function padNumber(inputNumber, fullLength) { const str = inputNumber.toString(10); if (fullLength < str.length) { return ""; } const dif = fullLength - str.length; const padding = new Array(dif); for (let i = 0; i < dif; i++) { padding[i] = "0"; } const paddingString = padding.join(""); return paddingString.concat(str); } /*! * Copyright (c) 2014, GMO GlobalSign * Copyright (c) 2015-2022, Peculiar Ventures * All rights reserved. * * Author 2014-2019, Yury Strozhevsky * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ function assertBigInt() { if (typeof BigInt === "undefined") { throw new Error("BigInt is not defined. Your environment doesn't implement BigInt."); } } function concat(buffers) { let outputLength = 0; let prevLength = 0; for (let i = 0; i < buffers.length; i++) { const buffer = buffers[i]; outputLength += buffer.byteLength; } const retView = new Uint8Array(outputLength); for (let i = 0; i < buffers.length; i++) { const buffer = buffers[i]; retView.set(new Uint8Array(buffer), prevLength); prevLength += buffer.byteLength; } return retView.buffer; } function checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength) { if (!(inputBuffer instanceof Uint8Array)) { baseBlock.error = "Wrong parameter: inputBuffer must be 'Uint8Array'"; return false; } if (!inputBuffer.byteLength) { baseBlock.error = "Wrong parameter: inputBuffer has zero length"; return false; } if (inputOffset < 0) { baseBlock.error = "Wrong parameter: inputOffset less than zero"; return false; } if (inputLength < 0) { baseBlock.error = "Wrong parameter: inputLength less than zero"; return false; } if ((inputBuffer.byteLength - inputOffset - inputLength) < 0) { baseBlock.error = "End of input reached before message was fully decoded (inconsistent offset and length values)"; return false; } return true; } class ViewWriter { constructor() { this.items = []; } write(buf) { this.items.push(buf); } final() { return concat(this.items); } } const powers2 = [new Uint8Array([1])]; const digitsString = "0123456789"; const NAME = "name"; const VALUE_HEX_VIEW = "valueHexView"; const IS_HEX_ONLY = "isHexOnly"; const ID_BLOCK = "idBlock"; const TAG_CLASS = "tagClass"; const TAG_NUMBER = "tagNumber"; const IS_CONSTRUCTED = "isConstructed"; const FROM_BER = "fromBER"; const TO_BER = "toBER"; const LOCAL = "local"; const EMPTY_STRING = ""; const EMPTY_BUFFER = new ArrayBuffer(0); const EMPTY_VIEW = new Uint8Array(0); const END_OF_CONTENT_NAME = "EndOfContent"; const OCTET_STRING_NAME = "OCTET STRING"; const BIT_STRING_NAME = "BIT STRING"; function HexBlock(BaseClass) { var _a; return _a = class Some extends BaseClass { constructor(...args) { var _a; super(...args); const params = args[0] || {}; this.isHexOnly = (_a = params.isHexOnly) !== null && _a !== void 0 ? _a : false; this.valueHexView = params.valueHex ? BufferSourceConverter.toUint8Array(params.valueHex) : EMPTY_VIEW; } get valueHex() { return this.valueHexView.slice().buffer; } set valueHex(value) { this.valueHexView = new Uint8Array(value); } fromBER(inputBuffer, inputOffset, inputLength) { const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer; if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } const endLength = inputOffset + inputLength; this.valueHexView = view.subarray(inputOffset, endLength); if (!this.valueHexView.length) { this.warnings.push("Zero buffer length"); return inputOffset; } this.blockLength = inputLength; return endLength; } toBER(sizeOnly = false) { if (!this.isHexOnly) { this.error = "Flag 'isHexOnly' is not set, abort"; return EMPTY_BUFFER; } if (sizeOnly) { return new ArrayBuffer(this.valueHexView.byteLength); } return (this.valueHexView.byteLength === this.valueHexView.buffer.byteLength) ? this.valueHexView.buffer : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), isHexOnly: this.isHexOnly, valueHex: Convert.ToHex(this.valueHexView), }; } }, _a.NAME = "hexBlock", _a; } class LocalBaseBlock { constructor({ blockLength = 0, error = EMPTY_STRING, warnings = [], valueBeforeDecode = EMPTY_VIEW, } = {}) { this.blockLength = blockLength; this.error = error; this.warnings = warnings; this.valueBeforeDecodeView = BufferSourceConverter.toUint8Array(valueBeforeDecode); } static blockName() { return this.NAME; } get valueBeforeDecode() { return this.valueBeforeDecodeView.slice().buffer; } set valueBeforeDecode(value) { this.valueBeforeDecodeView = new Uint8Array(value); } toJSON() { return { blockName: this.constructor.NAME, blockLength: this.blockLength, error: this.error, warnings: this.warnings, valueBeforeDecode: Convert.ToHex(this.valueBeforeDecodeView), }; } } LocalBaseBlock.NAME = "baseBlock"; class ValueBlock extends LocalBaseBlock { fromBER(inputBuffer, inputOffset, inputLength) { throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'"); } toBER(sizeOnly, writer) { throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'"); } } ValueBlock.NAME = "valueBlock"; class LocalIdentificationBlock extends HexBlock(LocalBaseBlock) { constructor({ idBlock = {}, } = {}) { var _a, _b, _c, _d; super(); if (idBlock) { this.isHexOnly = (_a = idBlock.isHexOnly) !== null && _a !== void 0 ? _a : false; this.valueHexView = idBlock.valueHex ? BufferSourceConverter.toUint8Array(idBlock.valueHex) : EMPTY_VIEW; this.tagClass = (_b = idBlock.tagClass) !== null && _b !== void 0 ? _b : -1; this.tagNumber = (_c = idBlock.tagNumber) !== null && _c !== void 0 ? _c : -1; this.isConstructed = (_d = idBlock.isConstructed) !== null && _d !== void 0 ? _d : false; } else { this.tagClass = -1; this.tagNumber = -1; this.isConstructed = false; } } toBER(sizeOnly = false) { let firstOctet = 0; switch (this.tagClass) { case 1: firstOctet |= 0x00; break; case 2: firstOctet |= 0x40; break; case 3: firstOctet |= 0x80; break; case 4: firstOctet |= 0xC0; break; default: this.error = "Unknown tag class"; return EMPTY_BUFFER; } if (this.isConstructed) firstOctet |= 0x20; if (this.tagNumber < 31 && !this.isHexOnly) { const retView = new Uint8Array(1); if (!sizeOnly) { let number = this.tagNumber; number &= 0x1F; firstOctet |= number; retView[0] = firstOctet; } return retView.buffer; } if (!this.isHexOnly) { const encodedBuf = utilToBase(this.tagNumber, 7); const encodedView = new Uint8Array(encodedBuf); const size = encodedBuf.byteLength; const retView = new Uint8Array(size + 1); retView[0] = (firstOctet | 0x1F); if (!sizeOnly) { for (let i = 0; i < (size - 1); i++) retView[i + 1] = encodedView[i] | 0x80; retView[size] = encodedView[size - 1]; } return retView.buffer; } const retView = new Uint8Array(this.valueHexView.byteLength + 1); retView[0] = (firstOctet | 0x1F); if (!sizeOnly) { const curView = this.valueHexView; for (let i = 0; i < (curView.length - 1); i++) retView[i + 1] = curView[i] | 0x80; retView[this.valueHexView.byteLength] = curView[curView.length - 1]; } return retView.buffer; } fromBER(inputBuffer, inputOffset, inputLength) { const inputView = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); if (intBuffer.length === 0) { this.error = "Zero buffer length"; return -1; } const tagClassMask = intBuffer[0] & 0xC0; switch (tagClassMask) { case 0x00: this.tagClass = (1); break; case 0x40: this.tagClass = (2); break; case 0x80: this.tagClass = (3); break; case 0xC0: this.tagClass = (4); break; default: this.error = "Unknown tag class"; return -1; } this.isConstructed = (intBuffer[0] & 0x20) === 0x20; this.isHexOnly = false; const tagNumberMask = intBuffer[0] & 0x1F; if (tagNumberMask !== 0x1F) { this.tagNumber = (tagNumberMask); this.blockLength = 1; } else { let count = 1; let intTagNumberBuffer = this.valueHexView = new Uint8Array(255); let tagNumberBufferMaxLength = 255; while (intBuffer[count] & 0x80) { intTagNumberBuffer[count - 1] = intBuffer[count] & 0x7F; count++; if (count >= intBuffer.length) { this.error = "End of input reached before message was fully decoded"; return -1; } if (count === tagNumberBufferMaxLength) { tagNumberBufferMaxLength += 255; const tempBufferView = new Uint8Array(tagNumberBufferMaxLength); for (let i = 0; i < intTagNumberBuffer.length; i++) tempBufferView[i] = intTagNumberBuffer[i]; intTagNumberBuffer = this.valueHexView = new Uint8Array(tagNumberBufferMaxLength); } } this.blockLength = (count + 1); intTagNumberBuffer[count - 1] = intBuffer[count] & 0x7F; const tempBufferView = new Uint8Array(count); for (let i = 0; i < count; i++) tempBufferView[i] = intTagNumberBuffer[i]; intTagNumberBuffer = this.valueHexView = new Uint8Array(count); intTagNumberBuffer.set(tempBufferView); if (this.blockLength <= 9) this.tagNumber = utilFromBase(intTagNumberBuffer, 7); else { this.isHexOnly = true; this.warnings.push("Tag too long, represented as hex-coded"); } } if (((this.tagClass === 1)) && (this.isConstructed)) { switch (this.tagNumber) { case 1: case 2: case 5: case 6: case 9: case 13: case 14: case 23: case 24: case 31: case 32: case 33: case 34: this.error = "Constructed encoding used for primitive type"; return -1; } } return (inputOffset + this.blockLength); } toJSON() { return { ...super.toJSON(), tagClass: this.tagClass, tagNumber: this.tagNumber, isConstructed: this.isConstructed, }; } } LocalIdentificationBlock.NAME = "identificationBlock"; class LocalLengthBlock extends LocalBaseBlock { constructor({ lenBlock = {}, } = {}) { var _a, _b, _c; super(); this.isIndefiniteForm = (_a = lenBlock.isIndefiniteForm) !== null && _a !== void 0 ? _a : false; this.longFormUsed = (_b = lenBlock.longFormUsed) !== null && _b !== void 0 ? _b : false; this.length = (_c = lenBlock.length) !== null && _c !== void 0 ? _c : 0; } fromBER(inputBuffer, inputOffset, inputLength) { const view = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } const intBuffer = view.subarray(inputOffset, inputOffset + inputLength); if (intBuffer.length === 0) { this.error = "Zero buffer length"; return -1; } if (intBuffer[0] === 0xFF) { this.error = "Length block 0xFF is reserved by standard"; return -1; } this.isIndefiniteForm = intBuffer[0] === 0x80; if (this.isIndefiniteForm) { this.blockLength = 1; return (inputOffset + this.blockLength); } this.longFormUsed = !!(intBuffer[0] & 0x80); if (this.longFormUsed === false) { this.length = (intBuffer[0]); this.blockLength = 1; return (inputOffset + this.blockLength); } const count = intBuffer[0] & 0x7F; if (count > 8) { this.error = "Too big integer"; return -1; } if ((count + 1) > intBuffer.length) { this.error = "End of input reached before message was fully decoded"; return -1; } const lenOffset = inputOffset + 1; const lengthBufferView = view.subarray(lenOffset, lenOffset + count); if (lengthBufferView[count - 1] === 0x00) this.warnings.push("Needlessly long encoded length"); this.length = utilFromBase(lengthBufferView, 8); if (this.longFormUsed && (this.length <= 127)) this.warnings.push("Unnecessary usage of long length form"); this.blockLength = count + 1; return (inputOffset + this.blockLength); } toBER(sizeOnly = false) { let retBuf; let retView; if (this.length > 127) this.longFormUsed = true; if (this.isIndefiniteForm) { retBuf = new ArrayBuffer(1); if (sizeOnly === false) { retView = new Uint8Array(retBuf); retView[0] = 0x80; } return retBuf; } if (this.longFormUsed) { const encodedBuf = utilToBase(this.length, 8); if (encodedBuf.byteLength > 127) { this.error = "Too big length"; return (EMPTY_BUFFER); } retBuf = new ArrayBuffer(encodedBuf.byteLength + 1); if (sizeOnly) return retBuf; const encodedView = new Uint8Array(encodedBuf); retView = new Uint8Array(retBuf); retView[0] = encodedBuf.byteLength | 0x80; for (let i = 0; i < encodedBuf.byteLength; i++) retView[i + 1] = encodedView[i]; return retBuf; } retBuf = new ArrayBuffer(1); if (sizeOnly === false) { retView = new Uint8Array(retBuf); retView[0] = this.length; } return retBuf; } toJSON() { return { ...super.toJSON(), isIndefiniteForm: this.isIndefiniteForm, longFormUsed: this.longFormUsed, length: this.length, }; } } LocalLengthBlock.NAME = "lengthBlock"; const typeStore = {}; class BaseBlock extends LocalBaseBlock { constructor({ name = EMPTY_STRING, optional = false, primitiveSchema, ...parameters } = {}, valueBlockType) { super(parameters); this.name = name; this.optional = optional; if (primitiveSchema) { this.primitiveSchema = primitiveSchema; } this.idBlock = new LocalIdentificationBlock(parameters); this.lenBlock = new LocalLengthBlock(parameters); this.valueBlock = valueBlockType ? new valueBlockType(parameters) : new ValueBlock(parameters); } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm) ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } toBER(sizeOnly, writer) { const _writer = writer || new ViewWriter(); if (!writer) { prepareIndefiniteForm(this); } const idBlockBuf = this.idBlock.toBER(sizeOnly); _writer.write(idBlockBuf); if (this.lenBlock.isIndefiniteForm) { _writer.write(new Uint8Array([0x80]).buffer); this.valueBlock.toBER(sizeOnly, _writer); _writer.write(new ArrayBuffer(2)); } else { const valueBlockBuf = this.valueBlock.toBER(sizeOnly); this.lenBlock.length = valueBlockBuf.byteLength; const lenBlockBuf = this.lenBlock.toBER(sizeOnly); _writer.write(lenBlockBuf); _writer.write(valueBlockBuf); } if (!writer) { return _writer.final(); } return EMPTY_BUFFER; } toJSON() { const object = { ...super.toJSON(), idBlock: this.idBlock.toJSON(), lenBlock: this.lenBlock.toJSON(), valueBlock: this.valueBlock.toJSON(), name: this.name, optional: this.optional, }; if (this.primitiveSchema) object.primitiveSchema = this.primitiveSchema.toJSON(); return object; } toString(encoding = "ascii") { if (encoding === "ascii") { return this.onAsciiEncoding(); } return Convert.ToHex(this.toBER()); } onAsciiEncoding() { return `${this.constructor.NAME} : ${Convert.ToHex(this.valueBlock.valueBeforeDecodeView)}`; } isEqual(other) { if (this === other) { return true; } if (!(other instanceof this.constructor)) { return false; } const thisRaw = this.toBER(); const otherRaw = other.toBER(); return isEqualBuffer(thisRaw, otherRaw); } } BaseBlock.NAME = "BaseBlock"; function prepareIndefiniteForm(baseBlock) { if (baseBlock instanceof typeStore.Constructed) { for (const value of baseBlock.valueBlock.value) { if (prepareIndefiniteForm(value)) { baseBlock.lenBlock.isIndefiniteForm = true; } } } return !!baseBlock.lenBlock.isIndefiniteForm; } class BaseStringBlock extends BaseBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}, stringValueBlockType) { super(parameters, stringValueBlockType); if (value) { this.fromString(value); } } getValue() { return this.valueBlock.value; } setValue(value) { this.valueBlock.value = value; } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm) ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } this.fromBuffer(this.valueBlock.valueHexView); if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } onAsciiEncoding() { return `${this.constructor.NAME} : '${this.valueBlock.value}'`; } } BaseStringBlock.NAME = "BaseStringBlock"; class LocalPrimitiveValueBlock extends HexBlock(ValueBlock) { constructor({ isHexOnly = true, ...parameters } = {}) { super(parameters); this.isHexOnly = isHexOnly; } } LocalPrimitiveValueBlock.NAME = "PrimitiveValueBlock"; var _a$w; class Primitive extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalPrimitiveValueBlock); this.idBlock.isConstructed = false; } } _a$w = Primitive; (() => { typeStore.Primitive = _a$w; })(); Primitive.NAME = "PRIMITIVE"; function localChangeType(inputObject, newType) { if (inputObject instanceof newType) { return inputObject; } const newObject = new newType(); newObject.idBlock = inputObject.idBlock; newObject.lenBlock = inputObject.lenBlock; newObject.warnings = inputObject.warnings; newObject.valueBeforeDecodeView = inputObject.valueBeforeDecodeView; return newObject; } function localFromBER(inputBuffer, inputOffset = 0, inputLength = inputBuffer.length) { const incomingOffset = inputOffset; let returnObject = new BaseBlock({}, ValueBlock); const baseBlock = new LocalBaseBlock(); if (!checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength)) { returnObject.error = baseBlock.error; return { offset: -1, result: returnObject }; } const intBuffer = inputBuffer.subarray(inputOffset, inputOffset + inputLength); if (!intBuffer.length) { returnObject.error = "Zero buffer length"; return { offset: -1, result: returnObject }; } let resultOffset = returnObject.idBlock.fromBER(inputBuffer, inputOffset, inputLength); if (returnObject.idBlock.warnings.length) { returnObject.warnings.concat(returnObject.idBlock.warnings); } if (resultOffset === -1) { returnObject.error = returnObject.idBlock.error; return { offset: -1, result: returnObject }; } inputOffset = resultOffset; inputLength -= returnObject.idBlock.blockLength; resultOffset = returnObject.lenBlock.fromBER(inputBuffer, inputOffset, inputLength); if (returnObject.lenBlock.warnings.length) { returnObject.warnings.concat(returnObject.lenBlock.warnings); } if (resultOffset === -1) { returnObject.error = returnObject.lenBlock.error; return { offset: -1, result: returnObject }; } inputOffset = resultOffset; inputLength -= returnObject.lenBlock.blockLength; if (!returnObject.idBlock.isConstructed && returnObject.lenBlock.isIndefiniteForm) { returnObject.error = "Indefinite length form used for primitive encoding form"; return { offset: -1, result: returnObject }; } let newASN1Type = BaseBlock; switch (returnObject.idBlock.tagClass) { case 1: if ((returnObject.idBlock.tagNumber >= 37) && (returnObject.idBlock.isHexOnly === false)) { returnObject.error = "UNIVERSAL 37 and upper tags are reserved by ASN.1 standard"; return { offset: -1, result: returnObject }; } switch (returnObject.idBlock.tagNumber) { case 0: if ((returnObject.idBlock.isConstructed) && (returnObject.lenBlock.length > 0)) { returnObject.error = "Type [UNIVERSAL 0] is reserved"; return { offset: -1, result: returnObject }; } newASN1Type = typeStore.EndOfContent; break; case 1: newASN1Type = typeStore.Boolean; break; case 2: newASN1Type = typeStore.Integer; break; case 3: newASN1Type = typeStore.BitString; break; case 4: newASN1Type = typeStore.OctetString; break; case 5: newASN1Type = typeStore.Null; break; case 6: newASN1Type = typeStore.ObjectIdentifier; break; case 10: newASN1Type = typeStore.Enumerated; break; case 12: newASN1Type = typeStore.Utf8String; break; case 13: newASN1Type = typeStore.RelativeObjectIdentifier; break; case 14: newASN1Type = typeStore.TIME; break; case 15: returnObject.error = "[UNIVERSAL 15] is reserved by ASN.1 standard"; return { offset: -1, result: returnObject }; case 16: newASN1Type = typeStore.Sequence; break; case 17: newASN1Type = typeStore.Set; break; case 18: newASN1Type = typeStore.NumericString; break; case 19: newASN1Type = typeStore.PrintableString; break; case 20: newASN1Type = typeStore.TeletexString; break; case 21: newASN1Type = typeStore.VideotexString; break; case 22: newASN1Type = typeStore.IA5String; break; case 23: newASN1Type = typeStore.UTCTime; break; case 24: newASN1Type = typeStore.GeneralizedTime; break; case 25: newASN1Type = typeStore.GraphicString; break; case 26: newASN1Type = typeStore.VisibleString; break; case 27: newASN1Type = typeStore.GeneralString; break; case 28: newASN1Type = typeStore.UniversalString; break; case 29: newASN1Type = typeStore.CharacterString; break; case 30: newASN1Type = typeStore.BmpString; break; case 31: newASN1Type = typeStore.DATE; break; case 32: newASN1Type = typeStore.TimeOfDay; break; case 33: newASN1Type = typeStore.DateTime; break; case 34: newASN1Type = typeStore.Duration; break; default: { const newObject = returnObject.idBlock.isConstructed ? new typeStore.Constructed() : new typeStore.Primitive(); newObject.idBlock = returnObject.idBlock; newObject.lenBlock = returnObject.lenBlock; newObject.warnings = returnObject.warnings; returnObject = newObject; } } break; case 2: case 3: case 4: default: { newASN1Type = returnObject.idBlock.isConstructed ? typeStore.Constructed : typeStore.Primitive; } } returnObject = localChangeType(returnObject, newASN1Type); resultOffset = returnObject.fromBER(inputBuffer, inputOffset, returnObject.lenBlock.isIndefiniteForm ? inputLength : returnObject.lenBlock.length); returnObject.valueBeforeDecodeView = inputBuffer.subarray(incomingOffset, incomingOffset + returnObject.blockLength); return { offset: resultOffset, result: returnObject }; } function fromBER(inputBuffer) { if (!inputBuffer.byteLength) { const result = new BaseBlock({}, ValueBlock); result.error = "Input buffer has zero length"; return { offset: -1, result }; } return localFromBER(BufferSourceConverter.toUint8Array(inputBuffer).slice(), 0, inputBuffer.byteLength); } function checkLen(indefiniteLength, length) { if (indefiniteLength) { return 1; } return length; } class LocalConstructedValueBlock extends ValueBlock { constructor({ value = [], isIndefiniteForm = false, ...parameters } = {}) { super(parameters); this.value = value; this.isIndefiniteForm = isIndefiniteForm; } fromBER(inputBuffer, inputOffset, inputLength) { const view = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, view, inputOffset, inputLength)) { return -1; } this.valueBeforeDecodeView = view.subarray(inputOffset, inputOffset + inputLength); if (this.valueBeforeDecodeView.length === 0) { this.warnings.push("Zero buffer length"); return inputOffset; } let currentOffset = inputOffset; while (checkLen(this.isIndefiniteForm, inputLength) > 0) { const returnObject = localFromBER(view, currentOffset, inputLength); if (returnObject.offset === -1) { this.error = returnObject.result.error; this.warnings.concat(returnObject.result.warnings); return -1; } currentOffset = returnObject.offset; this.blockLength += returnObject.result.blockLength; inputLength -= returnObject.result.blockLength; this.value.push(returnObject.result); if (this.isIndefiniteForm && returnObject.result.constructor.NAME === END_OF_CONTENT_NAME) { break; } } if (this.isIndefiniteForm) { if (this.value[this.value.length - 1].constructor.NAME === END_OF_CONTENT_NAME) { this.value.pop(); } else { this.warnings.push("No EndOfContent block encoded"); } } return currentOffset; } toBER(sizeOnly, writer) { const _writer = writer || new ViewWriter(); for (let i = 0; i < this.value.length; i++) { this.value[i].toBER(sizeOnly, _writer); } if (!writer) { return _writer.final(); } return EMPTY_BUFFER; } toJSON() { const object = { ...super.toJSON(), isIndefiniteForm: this.isIndefiniteForm, value: [], }; for (const value of this.value) { object.value.push(value.toJSON()); } return object; } } LocalConstructedValueBlock.NAME = "ConstructedValueBlock"; var _a$v; class Constructed extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalConstructedValueBlock); this.idBlock.isConstructed = true; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm) ? inputLength : this.lenBlock.length); if (resultOffset === -1) { this.error = this.valueBlock.error; return resultOffset; } if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; if (!this.valueBlock.error.length) this.blockLength += this.valueBlock.blockLength; return resultOffset; } onAsciiEncoding() { const values = []; for (const value of this.valueBlock.value) { values.push(value.toString("ascii").split("\n").map(o => ` ${o}`).join("\n")); } const blockName = this.idBlock.tagClass === 3 ? `[${this.idBlock.tagNumber}]` : this.constructor.NAME; return values.length ? `${blockName} :\n${values.join("\n")}` : `${blockName} :`; } } _a$v = Constructed; (() => { typeStore.Constructed = _a$v; })(); Constructed.NAME = "CONSTRUCTED"; class LocalEndOfContentValueBlock extends ValueBlock { fromBER(inputBuffer, inputOffset, inputLength) { return inputOffset; } toBER(sizeOnly) { return EMPTY_BUFFER; } } LocalEndOfContentValueBlock.override = "EndOfContentValueBlock"; var _a$u; class EndOfContent extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalEndOfContentValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 0; } } _a$u = EndOfContent; (() => { typeStore.EndOfContent = _a$u; })(); EndOfContent.NAME = END_OF_CONTENT_NAME; var _a$t; class Null extends BaseBlock { constructor(parameters = {}) { super(parameters, ValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 5; } fromBER(inputBuffer, inputOffset, inputLength) { if (this.lenBlock.length > 0) this.warnings.push("Non-zero length of value block for Null type"); if (!this.idBlock.error.length) this.blockLength += this.idBlock.blockLength; if (!this.lenBlock.error.length) this.blockLength += this.lenBlock.blockLength; this.blockLength += inputLength; if ((inputOffset + inputLength) > inputBuffer.byteLength) { this.error = "End of input reached before message was fully decoded (inconsistent offset and length values)"; return -1; } return (inputOffset + inputLength); } toBER(sizeOnly, writer) { const retBuf = new ArrayBuffer(2); if (!sizeOnly) { const retView = new Uint8Array(retBuf); retView[0] = 0x05; retView[1] = 0x00; } if (writer) { writer.write(retBuf); } return retBuf; } onAsciiEncoding() { return `${this.constructor.NAME}`; } } _a$t = Null; (() => { typeStore.Null = _a$t; })(); Null.NAME = "NULL"; class LocalBooleanValueBlock extends HexBlock(ValueBlock) { constructor({ value, ...parameters } = {}) { super(parameters); if (parameters.valueHex) { this.valueHexView = BufferSourceConverter.toUint8Array(parameters.valueHex); } else { this.valueHexView = new Uint8Array(1); } if (value) { this.value = value; } } get value() { for (const octet of this.valueHexView) { if (octet > 0) { return true; } } return false; } set value(value) { this.valueHexView[0] = value ? 0xFF : 0x00; } fromBER(inputBuffer, inputOffset, inputLength) { const inputView = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } this.valueHexView = inputView.subarray(inputOffset, inputOffset + inputLength); if (inputLength > 1) this.warnings.push("Boolean value encoded in more then 1 octet"); this.isHexOnly = true; utilDecodeTC.call(this); this.blockLength = inputLength; return (inputOffset + inputLength); } toBER() { return this.valueHexView.slice(); } toJSON() { return { ...super.toJSON(), value: this.value, }; } } LocalBooleanValueBlock.NAME = "BooleanValueBlock"; var _a$s; class Boolean$1 extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalBooleanValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 1; } getValue() { return this.valueBlock.value; } setValue(value) { this.valueBlock.value = value; } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.getValue}`; } } _a$s = Boolean$1; (() => { typeStore.Boolean = _a$s; })(); Boolean$1.NAME = "BOOLEAN"; class LocalOctetStringValueBlock extends HexBlock(LocalConstructedValueBlock) { constructor({ isConstructed = false, ...parameters } = {}) { super(parameters); this.isConstructed = isConstructed; } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = 0; if (this.isConstructed) { this.isHexOnly = false; resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength); if (resultOffset === -1) return resultOffset; for (let i = 0; i < this.value.length; i++) { const currentBlockName = this.value[i].constructor.NAME; if (currentBlockName === END_OF_CONTENT_NAME) { if (this.isIndefiniteForm) break; else { this.error = "EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only"; return -1; } } if (currentBlockName !== OCTET_STRING_NAME) { this.error = "OCTET STRING may consists of OCTET STRINGs only"; return -1; } } } else { this.isHexOnly = true; resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength); this.blockLength = inputLength; } return resultOffset; } toBER(sizeOnly, writer) { if (this.isConstructed) return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer); return sizeOnly ? new ArrayBuffer(this.valueHexView.byteLength) : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), isConstructed: this.isConstructed, }; } } LocalOctetStringValueBlock.NAME = "OctetStringValueBlock"; var _a$r; class OctetString extends BaseBlock { constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) { var _b, _c; (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : (parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length)); super({ idBlock: { isConstructed: parameters.isConstructed, ...idBlock, }, lenBlock: { ...lenBlock, isIndefiniteForm: !!parameters.isIndefiniteForm, }, ...parameters, }, LocalOctetStringValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 4; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isConstructed = this.idBlock.isConstructed; this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; if (inputLength === 0) { if (this.idBlock.error.length === 0) this.blockLength += this.idBlock.blockLength; if (this.lenBlock.error.length === 0) this.blockLength += this.lenBlock.blockLength; return inputOffset; } if (!this.valueBlock.isConstructed) { const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer; const buf = view.subarray(inputOffset, inputOffset + inputLength); try { if (buf.byteLength) { const asn = localFromBER(buf, 0, buf.byteLength); if (asn.offset !== -1 && asn.offset === inputLength) { this.valueBlock.value = [asn.result]; } } } catch (e) { } } return super.fromBER(inputBuffer, inputOffset, inputLength); } onAsciiEncoding() { if (this.valueBlock.isConstructed || (this.valueBlock.value && this.valueBlock.value.length)) { return Constructed.prototype.onAsciiEncoding.call(this); } return `${this.constructor.NAME} : ${Convert.ToHex(this.valueBlock.valueHexView)}`; } getValue() { if (!this.idBlock.isConstructed) { return this.valueBlock.valueHexView.slice().buffer; } const array = []; for (const content of this.valueBlock.value) { if (content instanceof OctetString) { array.push(content.valueBlock.valueHexView); } } return BufferSourceConverter.concat(array); } } _a$r = OctetString; (() => { typeStore.OctetString = _a$r; })(); OctetString.NAME = OCTET_STRING_NAME; class LocalBitStringValueBlock extends HexBlock(LocalConstructedValueBlock) { constructor({ unusedBits = 0, isConstructed = false, ...parameters } = {}) { super(parameters); this.unusedBits = unusedBits; this.isConstructed = isConstructed; this.blockLength = this.valueHexView.byteLength; } fromBER(inputBuffer, inputOffset, inputLength) { if (!inputLength) { return inputOffset; } let resultOffset = -1; if (this.isConstructed) { resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength); if (resultOffset === -1) return resultOffset; for (const value of this.value) { const currentBlockName = value.constructor.NAME; if (currentBlockName === END_OF_CONTENT_NAME) { if (this.isIndefiniteForm) break; else { this.error = "EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only"; return -1; } } if (currentBlockName !== BIT_STRING_NAME) { this.error = "BIT STRING may consists of BIT STRINGs only"; return -1; } const valueBlock = value.valueBlock; if ((this.unusedBits > 0) && (valueBlock.unusedBits > 0)) { this.error = "Using of \"unused bits\" inside constructive BIT STRING allowed for least one only"; return -1; } this.unusedBits = valueBlock.unusedBits; } return resultOffset; } const inputView = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.unusedBits = intBuffer[0]; if (this.unusedBits > 7) { this.error = "Unused bits for BitString must be in range 0-7"; return -1; } if (!this.unusedBits) { const buf = intBuffer.subarray(1); try { if (buf.byteLength) { const asn = localFromBER(buf, 0, buf.byteLength); if (asn.offset !== -1 && asn.offset === (inputLength - 1)) { this.value = [asn.result]; } } } catch (e) { } } this.valueHexView = intBuffer.subarray(1); this.blockLength = intBuffer.length; return (inputOffset + inputLength); } toBER(sizeOnly, writer) { if (this.isConstructed) { return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer); } if (sizeOnly) { return new ArrayBuffer(this.valueHexView.byteLength + 1); } if (!this.valueHexView.byteLength) { return EMPTY_BUFFER; } const retView = new Uint8Array(this.valueHexView.length + 1); retView[0] = this.unusedBits; retView.set(this.valueHexView, 1); return retView.buffer; } toJSON() { return { ...super.toJSON(), unusedBits: this.unusedBits, isConstructed: this.isConstructed, }; } } LocalBitStringValueBlock.NAME = "BitStringValueBlock"; var _a$q; class BitString extends BaseBlock { constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) { var _b, _c; (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : (parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length)); super({ idBlock: { isConstructed: parameters.isConstructed, ...idBlock, }, lenBlock: { ...lenBlock, isIndefiniteForm: !!parameters.isIndefiniteForm, }, ...parameters, }, LocalBitStringValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 3; } fromBER(inputBuffer, inputOffset, inputLength) { this.valueBlock.isConstructed = this.idBlock.isConstructed; this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm; return super.fromBER(inputBuffer, inputOffset, inputLength); } onAsciiEncoding() { if (this.valueBlock.isConstructed || (this.valueBlock.value && this.valueBlock.value.length)) { return Constructed.prototype.onAsciiEncoding.call(this); } else { const bits = []; const valueHex = this.valueBlock.valueHexView; for (const byte of valueHex) { bits.push(byte.toString(2).padStart(8, "0")); } const bitsStr = bits.join(""); return `${this.constructor.NAME} : ${bitsStr.substring(0, bitsStr.length - this.valueBlock.unusedBits)}`; } } } _a$q = BitString; (() => { typeStore.BitString = _a$q; })(); BitString.NAME = BIT_STRING_NAME; var _a$p; function viewAdd(first, second) { const c = new Uint8Array([0]); const firstView = new Uint8Array(first); const secondView = new Uint8Array(second); let firstViewCopy = firstView.slice(0); const firstViewCopyLength = firstViewCopy.length - 1; const secondViewCopy = secondView.slice(0); const secondViewCopyLength = secondViewCopy.length - 1; let value = 0; const max = (secondViewCopyLength < firstViewCopyLength) ? firstViewCopyLength : secondViewCopyLength; let counter = 0; for (let i = max; i >= 0; i--, counter++) { switch (true) { case (counter < secondViewCopy.length): value = firstViewCopy[firstViewCopyLength - counter] + secondViewCopy[secondViewCopyLength - counter] + c[0]; break; default: value = firstViewCopy[firstViewCopyLength - counter] + c[0]; } c[0] = value / 10; switch (true) { case (counter >= firstViewCopy.length): firstViewCopy = utilConcatView(new Uint8Array([value % 10]), firstViewCopy); break; default: firstViewCopy[firstViewCopyLength - counter] = value % 10; } } if (c[0] > 0) firstViewCopy = utilConcatView(c, firstViewCopy); return firstViewCopy; } function power2(n) { if (n >= powers2.length) { for (let p = powers2.length; p <= n; p++) { const c = new Uint8Array([0]); let digits = (powers2[p - 1]).slice(0); for (let i = (digits.length - 1); i >= 0; i--) { const newValue = new Uint8Array([(digits[i] << 1) + c[0]]); c[0] = newValue[0] / 10; digits[i] = newValue[0] % 10; } if (c[0] > 0) digits = utilConcatView(c, digits); powers2.push(digits); } } return powers2[n]; } function viewSub(first, second) { let b = 0; const firstView = new Uint8Array(first); const secondView = new Uint8Array(second); const firstViewCopy = firstView.slice(0); const firstViewCopyLength = firstViewCopy.length - 1; const secondViewCopy = secondView.slice(0); const secondViewCopyLength = secondViewCopy.length - 1; let value; let counter = 0; for (let i = secondViewCopyLength; i >= 0; i--, counter++) { value = firstViewCopy[firstViewCopyLength - counter] - secondViewCopy[secondViewCopyLength - counter] - b; switch (true) { case (value < 0): b = 1; firstViewCopy[firstViewCopyLength - counter] = value + 10; break; default: b = 0; firstViewCopy[firstViewCopyLength - counter] = value; } } if (b > 0) { for (let i = (firstViewCopyLength - secondViewCopyLength + 1); i >= 0; i--, counter++) { value = firstViewCopy[firstViewCopyLength - counter] - b; if (value < 0) { b = 1; firstViewCopy[firstViewCopyLength - counter] = value + 10; } else { b = 0; firstViewCopy[firstViewCopyLength - counter] = value; break; } } } return firstViewCopy.slice(); } class LocalIntegerValueBlock extends HexBlock(ValueBlock) { constructor({ value, ...parameters } = {}) { super(parameters); this._valueDec = 0; if (parameters.valueHex) { this.setValueHex(); } if (value !== undefined) { this.valueDec = value; } } setValueHex() { if (this.valueHexView.length >= 4) { this.warnings.push("Too big Integer for decoding, hex only"); this.isHexOnly = true; this._valueDec = 0; } else { this.isHexOnly = false; if (this.valueHexView.length > 0) { this._valueDec = utilDecodeTC.call(this); } } } set valueDec(v) { this._valueDec = v; this.isHexOnly = false; this.valueHexView = new Uint8Array(utilEncodeTC(v)); } get valueDec() { return this._valueDec; } fromDER(inputBuffer, inputOffset, inputLength, expectedLength = 0) { const offset = this.fromBER(inputBuffer, inputOffset, inputLength); if (offset === -1) return offset; const view = this.valueHexView; if ((view[0] === 0x00) && ((view[1] & 0x80) !== 0)) { this.valueHexView = view.subarray(1); } else { if (expectedLength !== 0) { if (view.length < expectedLength) { if ((expectedLength - view.length) > 1) expectedLength = view.length + 1; this.valueHexView = view.subarray(expectedLength - view.length); } } } return offset; } toDER(sizeOnly = false) { const view = this.valueHexView; switch (true) { case ((view[0] & 0x80) !== 0): { const updatedView = new Uint8Array(this.valueHexView.length + 1); updatedView[0] = 0x00; updatedView.set(view, 1); this.valueHexView = updatedView; } break; case ((view[0] === 0x00) && ((view[1] & 0x80) === 0)): { this.valueHexView = this.valueHexView.subarray(1); } break; } return this.toBER(sizeOnly); } fromBER(inputBuffer, inputOffset, inputLength) { const resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength); if (resultOffset === -1) { return resultOffset; } this.setValueHex(); return resultOffset; } toBER(sizeOnly) { return sizeOnly ? new ArrayBuffer(this.valueHexView.length) : this.valueHexView.slice().buffer; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec, }; } toString() { const firstBit = (this.valueHexView.length * 8) - 1; let digits = new Uint8Array((this.valueHexView.length * 8) / 3); let bitNumber = 0; let currentByte; const asn1View = this.valueHexView; let result = ""; let flag = false; for (let byteNumber = (asn1View.byteLength - 1); byteNumber >= 0; byteNumber--) { currentByte = asn1View[byteNumber]; for (let i = 0; i < 8; i++) { if ((currentByte & 1) === 1) { switch (bitNumber) { case firstBit: digits = viewSub(power2(bitNumber), digits); result = "-"; break; default: digits = viewAdd(digits, power2(bitNumber)); } } bitNumber++; currentByte >>= 1; } } for (let i = 0; i < digits.length; i++) { if (digits[i]) flag = true; if (flag) result += digitsString.charAt(digits[i]); } if (flag === false) result += digitsString.charAt(0); return result; } } _a$p = LocalIntegerValueBlock; LocalIntegerValueBlock.NAME = "IntegerValueBlock"; (() => { Object.defineProperty(_a$p.prototype, "valueHex", { set: function (v) { this.valueHexView = new Uint8Array(v); this.setValueHex(); }, get: function () { return this.valueHexView.slice().buffer; }, }); })(); var _a$o; class Integer extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalIntegerValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 2; } toBigInt() { assertBigInt(); return BigInt(this.valueBlock.toString()); } static fromBigInt(value) { assertBigInt(); const bigIntValue = BigInt(value); const writer = new ViewWriter(); const hex = bigIntValue.toString(16).replace(/^-/, ""); const view = new Uint8Array(Convert.FromHex(hex)); if (bigIntValue < 0) { const first = new Uint8Array(view.length + (view[0] & 0x80 ? 1 : 0)); first[0] |= 0x80; const firstInt = BigInt(`0x${Convert.ToHex(first)}`); const secondInt = firstInt + bigIntValue; const second = BufferSourceConverter.toUint8Array(Convert.FromHex(secondInt.toString(16))); second[0] |= 0x80; writer.write(second); } else { if (view[0] & 0x80) { writer.write(new Uint8Array([0])); } writer.write(view); } const res = new Integer({ valueHex: writer.final(), }); return res; } convertToDER() { const integer = new Integer({ valueHex: this.valueBlock.valueHexView }); integer.valueBlock.toDER(); return integer; } convertFromDER() { return new Integer({ valueHex: this.valueBlock.valueHexView[0] === 0 ? this.valueBlock.valueHexView.subarray(1) : this.valueBlock.valueHexView, }); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString()}`; } } _a$o = Integer; (() => { typeStore.Integer = _a$o; })(); Integer.NAME = "INTEGER"; var _a$n; class Enumerated extends Integer { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 10; } } _a$n = Enumerated; (() => { typeStore.Enumerated = _a$n; })(); Enumerated.NAME = "ENUMERATED"; class LocalSidValueBlock extends HexBlock(ValueBlock) { constructor({ valueDec = -1, isFirstSid = false, ...parameters } = {}) { super(parameters); this.valueDec = valueDec; this.isFirstSid = isFirstSid; } fromBER(inputBuffer, inputOffset, inputLength) { if (!inputLength) { return inputOffset; } const inputView = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) { return -1; } const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.valueHexView = new Uint8Array(inputLength); for (let i = 0; i < inputLength; i++) { this.valueHexView[i] = intBuffer[i] & 0x7F; this.blockLength++; if ((intBuffer[i] & 0x80) === 0x00) break; } const tempView = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength; i++) { tempView[i] = this.valueHexView[i]; } this.valueHexView = tempView; if ((intBuffer[this.blockLength - 1] & 0x80) !== 0x00) { this.error = "End of input reached before message was fully decoded"; return -1; } if (this.valueHexView[0] === 0x00) this.warnings.push("Needlessly long format of SID encoding"); if (this.blockLength <= 8) this.valueDec = utilFromBase(this.valueHexView, 7); else { this.isHexOnly = true; this.warnings.push("Too big SID for decoding, hex only"); } return (inputOffset + this.blockLength); } set valueBigInt(value) { assertBigInt(); let bits = BigInt(value).toString(2); while (bits.length % 7) { bits = "0" + bits; } const bytes = new Uint8Array(bits.length / 7); for (let i = 0; i < bytes.length; i++) { bytes[i] = parseInt(bits.slice(i * 7, i * 7 + 7), 2) + (i + 1 < bytes.length ? 0x80 : 0); } this.fromBER(bytes.buffer, 0, bytes.length); } toBER(sizeOnly) { if (this.isHexOnly) { if (sizeOnly) return (new ArrayBuffer(this.valueHexView.byteLength)); const curView = this.valueHexView; const retView = new Uint8Array(this.blockLength); for (let i = 0; i < (this.blockLength - 1); i++) retView[i] = curView[i] | 0x80; retView[this.blockLength - 1] = curView[this.blockLength - 1]; return retView.buffer; } const encodedBuf = utilToBase(this.valueDec, 7); if (encodedBuf.byteLength === 0) { this.error = "Error during encoding SID value"; return EMPTY_BUFFER; } const retView = new Uint8Array(encodedBuf.byteLength); if (!sizeOnly) { const encodedView = new Uint8Array(encodedBuf); const len = encodedBuf.byteLength - 1; for (let i = 0; i < len; i++) retView[i] = encodedView[i] | 0x80; retView[len] = encodedView[len]; } return retView; } toString() { let result = ""; if (this.isHexOnly) result = Convert.ToHex(this.valueHexView); else { if (this.isFirstSid) { let sidValue = this.valueDec; if (this.valueDec <= 39) result = "0."; else { if (this.valueDec <= 79) { result = "1."; sidValue -= 40; } else { result = "2."; sidValue -= 80; } } result += sidValue.toString(); } else result = this.valueDec.toString(); } return result; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec, isFirstSid: this.isFirstSid, }; } } LocalSidValueBlock.NAME = "sidBlock"; class LocalObjectIdentifierValueBlock extends ValueBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}) { super(parameters); this.value = []; if (value) { this.fromString(value); } } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = inputOffset; while (inputLength > 0) { const sidBlock = new LocalSidValueBlock(); resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength); if (resultOffset === -1) { this.blockLength = 0; this.error = sidBlock.error; return resultOffset; } if (this.value.length === 0) sidBlock.isFirstSid = true; this.blockLength += sidBlock.blockLength; inputLength -= sidBlock.blockLength; this.value.push(sidBlock); } return resultOffset; } toBER(sizeOnly) { const retBuffers = []; for (let i = 0; i < this.value.length; i++) { const valueBuf = this.value[i].toBER(sizeOnly); if (valueBuf.byteLength === 0) { this.error = this.value[i].error; return EMPTY_BUFFER; } retBuffers.push(valueBuf); } return concat(retBuffers); } fromString(string) { this.value = []; let pos1 = 0; let pos2 = 0; let sid = ""; let flag = false; do { pos2 = string.indexOf(".", pos1); if (pos2 === -1) sid = string.substring(pos1); else sid = string.substring(pos1, pos2); pos1 = pos2 + 1; if (flag) { const sidBlock = this.value[0]; let plus = 0; switch (sidBlock.valueDec) { case 0: break; case 1: plus = 40; break; case 2: plus = 80; break; default: this.value = []; return; } const parsedSID = parseInt(sid, 10); if (isNaN(parsedSID)) return; sidBlock.valueDec = parsedSID + plus; flag = false; } else { const sidBlock = new LocalSidValueBlock(); if (sid > Number.MAX_SAFE_INTEGER) { assertBigInt(); const sidValue = BigInt(sid); sidBlock.valueBigInt = sidValue; } else { sidBlock.valueDec = parseInt(sid, 10); if (isNaN(sidBlock.valueDec)) return; } if (!this.value.length) { sidBlock.isFirstSid = true; flag = true; } this.value.push(sidBlock); } } while (pos2 !== -1); } toString() { let result = ""; let isHexOnly = false; for (let i = 0; i < this.value.length; i++) { isHexOnly = this.value[i].isHexOnly; let sidStr = this.value[i].toString(); if (i !== 0) result = `${result}.`; if (isHexOnly) { sidStr = `{${sidStr}}`; if (this.value[i].isFirstSid) result = `2.{${sidStr} - 80}`; else result += sidStr; } else result += sidStr; } return result; } toJSON() { const object = { ...super.toJSON(), value: this.toString(), sidArray: [], }; for (let i = 0; i < this.value.length; i++) { object.sidArray.push(this.value[i].toJSON()); } return object; } } LocalObjectIdentifierValueBlock.NAME = "ObjectIdentifierValueBlock"; var _a$m; class ObjectIdentifier$1 extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalObjectIdentifierValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 6; } getValue() { return this.valueBlock.toString(); } setValue(value) { this.valueBlock.fromString(value); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString() || "empty"}`; } toJSON() { return { ...super.toJSON(), value: this.getValue(), }; } } _a$m = ObjectIdentifier$1; (() => { typeStore.ObjectIdentifier = _a$m; })(); ObjectIdentifier$1.NAME = "OBJECT IDENTIFIER"; class LocalRelativeSidValueBlock extends HexBlock(LocalBaseBlock) { constructor({ valueDec = 0, ...parameters } = {}) { super(parameters); this.valueDec = valueDec; } fromBER(inputBuffer, inputOffset, inputLength) { if (inputLength === 0) return inputOffset; const inputView = BufferSourceConverter.toUint8Array(inputBuffer); if (!checkBufferParams(this, inputView, inputOffset, inputLength)) return -1; const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength); this.valueHexView = new Uint8Array(inputLength); for (let i = 0; i < inputLength; i++) { this.valueHexView[i] = intBuffer[i] & 0x7F; this.blockLength++; if ((intBuffer[i] & 0x80) === 0x00) break; } const tempView = new Uint8Array(this.blockLength); for (let i = 0; i < this.blockLength; i++) tempView[i] = this.valueHexView[i]; this.valueHexView = tempView; if ((intBuffer[this.blockLength - 1] & 0x80) !== 0x00) { this.error = "End of input reached before message was fully decoded"; return -1; } if (this.valueHexView[0] === 0x00) this.warnings.push("Needlessly long format of SID encoding"); if (this.blockLength <= 8) this.valueDec = utilFromBase(this.valueHexView, 7); else { this.isHexOnly = true; this.warnings.push("Too big SID for decoding, hex only"); } return (inputOffset + this.blockLength); } toBER(sizeOnly) { if (this.isHexOnly) { if (sizeOnly) return (new ArrayBuffer(this.valueHexView.byteLength)); const curView = this.valueHexView; const retView = new Uint8Array(this.blockLength); for (let i = 0; i < (this.blockLength - 1); i++) retView[i] = curView[i] | 0x80; retView[this.blockLength - 1] = curView[this.blockLength - 1]; return retView.buffer; } const encodedBuf = utilToBase(this.valueDec, 7); if (encodedBuf.byteLength === 0) { this.error = "Error during encoding SID value"; return EMPTY_BUFFER; } const retView = new Uint8Array(encodedBuf.byteLength); if (!sizeOnly) { const encodedView = new Uint8Array(encodedBuf); const len = encodedBuf.byteLength - 1; for (let i = 0; i < len; i++) retView[i] = encodedView[i] | 0x80; retView[len] = encodedView[len]; } return retView.buffer; } toString() { let result = ""; if (this.isHexOnly) result = Convert.ToHex(this.valueHexView); else { result = this.valueDec.toString(); } return result; } toJSON() { return { ...super.toJSON(), valueDec: this.valueDec, }; } } LocalRelativeSidValueBlock.NAME = "relativeSidBlock"; class LocalRelativeObjectIdentifierValueBlock extends ValueBlock { constructor({ value = EMPTY_STRING, ...parameters } = {}) { super(parameters); this.value = []; if (value) { this.fromString(value); } } fromBER(inputBuffer, inputOffset, inputLength) { let resultOffset = inputOffset; while (inputLength > 0) { const sidBlock = new LocalRelativeSidValueBlock(); resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength); if (resultOffset === -1) { this.blockLength = 0; this.error = sidBlock.error; return resultOffset; } this.blockLength += sidBlock.blockLength; inputLength -= sidBlock.blockLength; this.value.push(sidBlock); } return resultOffset; } toBER(sizeOnly, writer) { const retBuffers = []; for (let i = 0; i < this.value.length; i++) { const valueBuf = this.value[i].toBER(sizeOnly); if (valueBuf.byteLength === 0) { this.error = this.value[i].error; return EMPTY_BUFFER; } retBuffers.push(valueBuf); } return concat(retBuffers); } fromString(string) { this.value = []; let pos1 = 0; let pos2 = 0; let sid = ""; do { pos2 = string.indexOf(".", pos1); if (pos2 === -1) sid = string.substring(pos1); else sid = string.substring(pos1, pos2); pos1 = pos2 + 1; const sidBlock = new LocalRelativeSidValueBlock(); sidBlock.valueDec = parseInt(sid, 10); if (isNaN(sidBlock.valueDec)) return true; this.value.push(sidBlock); } while (pos2 !== -1); return true; } toString() { let result = ""; let isHexOnly = false; for (let i = 0; i < this.value.length; i++) { isHexOnly = this.value[i].isHexOnly; let sidStr = this.value[i].toString(); if (i !== 0) result = `${result}.`; if (isHexOnly) { sidStr = `{${sidStr}}`; result += sidStr; } else result += sidStr; } return result; } toJSON() { const object = { ...super.toJSON(), value: this.toString(), sidArray: [], }; for (let i = 0; i < this.value.length; i++) object.sidArray.push(this.value[i].toJSON()); return object; } } LocalRelativeObjectIdentifierValueBlock.NAME = "RelativeObjectIdentifierValueBlock"; var _a$l; class RelativeObjectIdentifier extends BaseBlock { constructor(parameters = {}) { super(parameters, LocalRelativeObjectIdentifierValueBlock); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 13; } getValue() { return this.valueBlock.toString(); } setValue(value) { this.valueBlock.fromString(value); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.valueBlock.toString() || "empty"}`; } toJSON() { return { ...super.toJSON(), value: this.getValue(), }; } } _a$l = RelativeObjectIdentifier; (() => { typeStore.RelativeObjectIdentifier = _a$l; })(); RelativeObjectIdentifier.NAME = "RelativeObjectIdentifier"; var _a$k; class Sequence extends Constructed { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 16; } } _a$k = Sequence; (() => { typeStore.Sequence = _a$k; })(); Sequence.NAME = "SEQUENCE"; var _a$j; class Set$1 extends Constructed { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 17; } } _a$j = Set$1; (() => { typeStore.Set = _a$j; })(); Set$1.NAME = "SET"; class LocalStringValueBlock extends HexBlock(ValueBlock) { constructor({ ...parameters } = {}) { super(parameters); this.isHexOnly = true; this.value = EMPTY_STRING; } toJSON() { return { ...super.toJSON(), value: this.value, }; } } LocalStringValueBlock.NAME = "StringValueBlock"; class LocalSimpleStringValueBlock extends LocalStringValueBlock { } LocalSimpleStringValueBlock.NAME = "SimpleStringValueBlock"; class LocalSimpleStringBlock extends BaseStringBlock { constructor({ ...parameters } = {}) { super(parameters, LocalSimpleStringValueBlock); } fromBuffer(inputBuffer) { this.valueBlock.value = String.fromCharCode.apply(null, BufferSourceConverter.toUint8Array(inputBuffer)); } fromString(inputString) { const strLen = inputString.length; const view = this.valueBlock.valueHexView = new Uint8Array(strLen); for (let i = 0; i < strLen; i++) view[i] = inputString.charCodeAt(i); this.valueBlock.value = inputString; } } LocalSimpleStringBlock.NAME = "SIMPLE STRING"; class LocalUtf8StringValueBlock extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { this.valueBlock.valueHexView = BufferSourceConverter.toUint8Array(inputBuffer); try { this.valueBlock.value = Convert.ToUtf8String(inputBuffer); } catch (ex) { this.warnings.push(`Error during "decodeURIComponent": ${ex}, using raw string`); this.valueBlock.value = Convert.ToBinary(inputBuffer); } } fromString(inputString) { this.valueBlock.valueHexView = new Uint8Array(Convert.FromUtf8String(inputString)); this.valueBlock.value = inputString; } } LocalUtf8StringValueBlock.NAME = "Utf8StringValueBlock"; var _a$i; class Utf8String extends LocalUtf8StringValueBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 12; } } _a$i = Utf8String; (() => { typeStore.Utf8String = _a$i; })(); Utf8String.NAME = "UTF8String"; class LocalBmpStringValueBlock extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { this.valueBlock.value = Convert.ToUtf16String(inputBuffer); this.valueBlock.valueHexView = BufferSourceConverter.toUint8Array(inputBuffer); } fromString(inputString) { this.valueBlock.value = inputString; this.valueBlock.valueHexView = new Uint8Array(Convert.FromUtf16String(inputString)); } } LocalBmpStringValueBlock.NAME = "BmpStringValueBlock"; var _a$h; class BmpString extends LocalBmpStringValueBlock { constructor({ ...parameters } = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 30; } } _a$h = BmpString; (() => { typeStore.BmpString = _a$h; })(); BmpString.NAME = "BMPString"; class LocalUniversalStringValueBlock extends LocalSimpleStringBlock { fromBuffer(inputBuffer) { const copyBuffer = ArrayBuffer.isView(inputBuffer) ? inputBuffer.slice().buffer : inputBuffer.slice(0); const valueView = new Uint8Array(copyBuffer); for (let i = 0; i < valueView.length; i += 4) { valueView[i] = valueView[i + 3]; valueView[i + 1] = valueView[i + 2]; valueView[i + 2] = 0x00; valueView[i + 3] = 0x00; } this.valueBlock.value = String.fromCharCode.apply(null, new Uint32Array(copyBuffer)); } fromString(inputString) { const strLength = inputString.length; const valueHexView = this.valueBlock.valueHexView = new Uint8Array(strLength * 4); for (let i = 0; i < strLength; i++) { const codeBuf = utilToBase(inputString.charCodeAt(i), 8); const codeView = new Uint8Array(codeBuf); if (codeView.length > 4) continue; const dif = 4 - codeView.length; for (let j = (codeView.length - 1); j >= 0; j--) valueHexView[i * 4 + j + dif] = codeView[j]; } this.valueBlock.value = inputString; } } LocalUniversalStringValueBlock.NAME = "UniversalStringValueBlock"; var _a$g; class UniversalString extends LocalUniversalStringValueBlock { constructor({ ...parameters } = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 28; } } _a$g = UniversalString; (() => { typeStore.UniversalString = _a$g; })(); UniversalString.NAME = "UniversalString"; var _a$f; class NumericString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 18; } } _a$f = NumericString; (() => { typeStore.NumericString = _a$f; })(); NumericString.NAME = "NumericString"; var _a$e; class PrintableString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 19; } } _a$e = PrintableString; (() => { typeStore.PrintableString = _a$e; })(); PrintableString.NAME = "PrintableString"; var _a$d; class TeletexString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 20; } } _a$d = TeletexString; (() => { typeStore.TeletexString = _a$d; })(); TeletexString.NAME = "TeletexString"; var _a$c; class VideotexString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 21; } } _a$c = VideotexString; (() => { typeStore.VideotexString = _a$c; })(); VideotexString.NAME = "VideotexString"; var _a$b; class IA5String extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 22; } } _a$b = IA5String; (() => { typeStore.IA5String = _a$b; })(); IA5String.NAME = "IA5String"; var _a$a; class GraphicString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 25; } } _a$a = GraphicString; (() => { typeStore.GraphicString = _a$a; })(); GraphicString.NAME = "GraphicString"; var _a$9; class VisibleString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 26; } } _a$9 = VisibleString; (() => { typeStore.VisibleString = _a$9; })(); VisibleString.NAME = "VisibleString"; var _a$8; class GeneralString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 27; } } _a$8 = GeneralString; (() => { typeStore.GeneralString = _a$8; })(); GeneralString.NAME = "GeneralString"; var _a$7; class CharacterString extends LocalSimpleStringBlock { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 29; } } _a$7 = CharacterString; (() => { typeStore.CharacterString = _a$7; })(); CharacterString.NAME = "CharacterString"; var _a$6; class UTCTime extends VisibleString { constructor({ value, valueDate, ...parameters } = {}) { super(parameters); this.year = 0; this.month = 0; this.day = 0; this.hour = 0; this.minute = 0; this.second = 0; if (value) { this.fromString(value); this.valueBlock.valueHexView = new Uint8Array(value.length); for (let i = 0; i < value.length; i++) this.valueBlock.valueHexView[i] = value.charCodeAt(i); } if (valueDate) { this.fromDate(valueDate); this.valueBlock.valueHexView = new Uint8Array(this.toBuffer()); } this.idBlock.tagClass = 1; this.idBlock.tagNumber = 23; } fromBuffer(inputBuffer) { this.fromString(String.fromCharCode.apply(null, BufferSourceConverter.toUint8Array(inputBuffer))); } toBuffer() { const str = this.toString(); const buffer = new ArrayBuffer(str.length); const view = new Uint8Array(buffer); for (let i = 0; i < str.length; i++) view[i] = str.charCodeAt(i); return buffer; } fromDate(inputDate) { this.year = inputDate.getUTCFullYear(); this.month = inputDate.getUTCMonth() + 1; this.day = inputDate.getUTCDate(); this.hour = inputDate.getUTCHours(); this.minute = inputDate.getUTCMinutes(); this.second = inputDate.getUTCSeconds(); } toDate() { return (new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second))); } fromString(inputString) { const parser = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z/ig; const parserArray = parser.exec(inputString); if (parserArray === null) { this.error = "Wrong input string for conversion"; return; } const year = parseInt(parserArray[1], 10); if (year >= 50) this.year = 1900 + year; else this.year = 2000 + year; this.month = parseInt(parserArray[2], 10); this.day = parseInt(parserArray[3], 10); this.hour = parseInt(parserArray[4], 10); this.minute = parseInt(parserArray[5], 10); this.second = parseInt(parserArray[6], 10); } toString(encoding = "iso") { if (encoding === "iso") { const outputArray = new Array(7); outputArray[0] = padNumber(((this.year < 2000) ? (this.year - 1900) : (this.year - 2000)), 2); outputArray[1] = padNumber(this.month, 2); outputArray[2] = padNumber(this.day, 2); outputArray[3] = padNumber(this.hour, 2); outputArray[4] = padNumber(this.minute, 2); outputArray[5] = padNumber(this.second, 2); outputArray[6] = "Z"; return outputArray.join(""); } return super.toString(encoding); } onAsciiEncoding() { return `${this.constructor.NAME} : ${this.toDate().toISOString()}`; } toJSON() { return { ...super.toJSON(), year: this.year, month: this.month, day: this.day, hour: this.hour, minute: this.minute, second: this.second, }; } } _a$6 = UTCTime; (() => { typeStore.UTCTime = _a$6; })(); UTCTime.NAME = "UTCTime"; var _a$5; class GeneralizedTime extends UTCTime { constructor(parameters = {}) { var _b; super(parameters); (_b = this.millisecond) !== null && _b !== void 0 ? _b : (this.millisecond = 0); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 24; } fromDate(inputDate) { super.fromDate(inputDate); this.millisecond = inputDate.getUTCMilliseconds(); } toDate() { return (new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond))); } fromString(inputString) { let isUTC = false; let timeString = ""; let dateTimeString = ""; let fractionPart = 0; let parser; let hourDifference = 0; let minuteDifference = 0; if (inputString[inputString.length - 1] === "Z") { timeString = inputString.substring(0, inputString.length - 1); isUTC = true; } else { const number = new Number(inputString[inputString.length - 1]); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); timeString = inputString; } if (isUTC) { if (timeString.indexOf("+") !== -1) throw new Error("Wrong input string for conversion"); if (timeString.indexOf("-") !== -1) throw new Error("Wrong input string for conversion"); } else { let multiplier = 1; let differencePosition = timeString.indexOf("+"); let differenceString = ""; if (differencePosition === -1) { differencePosition = timeString.indexOf("-"); multiplier = -1; } if (differencePosition !== -1) { differenceString = timeString.substring(differencePosition + 1); timeString = timeString.substring(0, differencePosition); if ((differenceString.length !== 2) && (differenceString.length !== 4)) throw new Error("Wrong input string for conversion"); let number = parseInt(differenceString.substring(0, 2), 10); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); hourDifference = multiplier * number; if (differenceString.length === 4) { number = parseInt(differenceString.substring(2, 4), 10); if (isNaN(number.valueOf())) throw new Error("Wrong input string for conversion"); minuteDifference = multiplier * number; } } } let fractionPointPosition = timeString.indexOf("."); if (fractionPointPosition === -1) fractionPointPosition = timeString.indexOf(","); if (fractionPointPosition !== -1) { const fractionPartCheck = new Number(`0${timeString.substring(fractionPointPosition)}`); if (isNaN(fractionPartCheck.valueOf())) throw new Error("Wrong input string for conversion"); fractionPart = fractionPartCheck.valueOf(); dateTimeString = timeString.substring(0, fractionPointPosition); } else dateTimeString = timeString; switch (true) { case (dateTimeString.length === 8): parser = /(\d{4})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) throw new Error("Wrong input string for conversion"); break; case (dateTimeString.length === 10): parser = /(\d{4})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { let fractionResult = 60 * fractionPart; this.minute = Math.floor(fractionResult); fractionResult = 60 * (fractionResult - this.minute); this.second = Math.floor(fractionResult); fractionResult = 1000 * (fractionResult - this.second); this.millisecond = Math.floor(fractionResult); } break; case (dateTimeString.length === 12): parser = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { let fractionResult = 60 * fractionPart; this.second = Math.floor(fractionResult); fractionResult = 1000 * (fractionResult - this.second); this.millisecond = Math.floor(fractionResult); } break; case (dateTimeString.length === 14): parser = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ig; if (fractionPointPosition !== -1) { const fractionResult = 1000 * fractionPart; this.millisecond = Math.floor(fractionResult); } break; default: throw new Error("Wrong input string for conversion"); } const parserArray = parser.exec(dateTimeString); if (parserArray === null) throw new Error("Wrong input string for conversion"); for (let j = 1; j < parserArray.length; j++) { switch (j) { case 1: this.year = parseInt(parserArray[j], 10); break; case 2: this.month = parseInt(parserArray[j], 10); break; case 3: this.day = parseInt(parserArray[j], 10); break; case 4: this.hour = parseInt(parserArray[j], 10) + hourDifference; break; case 5: this.minute = parseInt(parserArray[j], 10) + minuteDifference; break; case 6: this.second = parseInt(parserArray[j], 10); break; default: throw new Error("Wrong input string for conversion"); } } if (isUTC === false) { const tempDate = new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond); this.year = tempDate.getUTCFullYear(); this.month = tempDate.getUTCMonth(); this.day = tempDate.getUTCDay(); this.hour = tempDate.getUTCHours(); this.minute = tempDate.getUTCMinutes(); this.second = tempDate.getUTCSeconds(); this.millisecond = tempDate.getUTCMilliseconds(); } } toString(encoding = "iso") { if (encoding === "iso") { const outputArray = []; outputArray.push(padNumber(this.year, 4)); outputArray.push(padNumber(this.month, 2)); outputArray.push(padNumber(this.day, 2)); outputArray.push(padNumber(this.hour, 2)); outputArray.push(padNumber(this.minute, 2)); outputArray.push(padNumber(this.second, 2)); if (this.millisecond !== 0) { outputArray.push("."); outputArray.push(padNumber(this.millisecond, 3)); } outputArray.push("Z"); return outputArray.join(""); } return super.toString(encoding); } toJSON() { return { ...super.toJSON(), millisecond: this.millisecond, }; } } _a$5 = GeneralizedTime; (() => { typeStore.GeneralizedTime = _a$5; })(); GeneralizedTime.NAME = "GeneralizedTime"; var _a$4; class DATE extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 31; } } _a$4 = DATE; (() => { typeStore.DATE = _a$4; })(); DATE.NAME = "DATE"; var _a$3; class TimeOfDay extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 32; } } _a$3 = TimeOfDay; (() => { typeStore.TimeOfDay = _a$3; })(); TimeOfDay.NAME = "TimeOfDay"; var _a$2; class DateTime extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 33; } } _a$2 = DateTime; (() => { typeStore.DateTime = _a$2; })(); DateTime.NAME = "DateTime"; var _a$1; class Duration extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 34; } } _a$1 = Duration; (() => { typeStore.Duration = _a$1; })(); Duration.NAME = "Duration"; var _a; class TIME extends Utf8String { constructor(parameters = {}) { super(parameters); this.idBlock.tagClass = 1; this.idBlock.tagNumber = 14; } } _a = TIME; (() => { typeStore.TIME = _a; })(); TIME.NAME = "TIME"; class Any { constructor({ name = EMPTY_STRING, optional = false, } = {}) { this.name = name; this.optional = optional; } } class Choice extends Any { constructor({ value = [], ...parameters } = {}) { super(parameters); this.value = value; } } class Repeated extends Any { constructor({ value = new Any(), local = false, ...parameters } = {}) { super(parameters); this.value = value; this.local = local; } } class RawData { constructor({ data = EMPTY_VIEW } = {}) { this.dataView = BufferSourceConverter.toUint8Array(data); } get data() { return this.dataView.slice().buffer; } set data(value) { this.dataView = BufferSourceConverter.toUint8Array(value); } fromBER(inputBuffer, inputOffset, inputLength) { const endLength = inputOffset + inputLength; this.dataView = BufferSourceConverter.toUint8Array(inputBuffer).subarray(inputOffset, endLength); return endLength; } toBER(sizeOnly) { return this.dataView.slice().buffer; } } function compareSchema(root, inputData, inputSchema) { if (inputSchema instanceof Choice) { for (let j = 0; j < inputSchema.value.length; j++) { const result = compareSchema(root, inputData, inputSchema.value[j]); if (result.verified) { return { verified: true, result: root }; } } { const _result = { verified: false, result: { error: "Wrong values for Choice type" }, }; if (inputSchema.hasOwnProperty(NAME)) _result.name = inputSchema.name; return _result; } } if (inputSchema instanceof Any) { if (inputSchema.hasOwnProperty(NAME)) root[inputSchema.name] = inputData; return { verified: true, result: root }; } if ((root instanceof Object) === false) { return { verified: false, result: { error: "Wrong root object" } }; } if ((inputData instanceof Object) === false) { return { verified: false, result: { error: "Wrong ASN.1 data" } }; } if ((inputSchema instanceof Object) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if ((ID_BLOCK in inputSchema) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if ((FROM_BER in inputSchema.idBlock) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if ((TO_BER in inputSchema.idBlock) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } const encodedId = inputSchema.idBlock.toBER(false); if (encodedId.byteLength === 0) { return { verified: false, result: { error: "Error encoding idBlock for ASN.1 schema" } }; } const decodedOffset = inputSchema.idBlock.fromBER(encodedId, 0, encodedId.byteLength); if (decodedOffset === -1) { return { verified: false, result: { error: "Error decoding idBlock for ASN.1 schema" } }; } if (inputSchema.idBlock.hasOwnProperty(TAG_CLASS) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.tagClass !== inputData.idBlock.tagClass) { return { verified: false, result: root }; } if (inputSchema.idBlock.hasOwnProperty(TAG_NUMBER) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.tagNumber !== inputData.idBlock.tagNumber) { return { verified: false, result: root }; } if (inputSchema.idBlock.hasOwnProperty(IS_CONSTRUCTED) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.isConstructed !== inputData.idBlock.isConstructed) { return { verified: false, result: root }; } if (!(IS_HEX_ONLY in inputSchema.idBlock)) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } if (inputSchema.idBlock.isHexOnly !== inputData.idBlock.isHexOnly) { return { verified: false, result: root }; } if (inputSchema.idBlock.isHexOnly) { if ((VALUE_HEX_VIEW in inputSchema.idBlock) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema" } }; } const schemaView = inputSchema.idBlock.valueHexView; const asn1View = inputData.idBlock.valueHexView; if (schemaView.length !== asn1View.length) { return { verified: false, result: root }; } for (let i = 0; i < schemaView.length; i++) { if (schemaView[i] !== asn1View[1]) { return { verified: false, result: root }; } } } if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) root[inputSchema.name] = inputData; } if (inputSchema instanceof typeStore.Constructed) { let admission = 0; let result = { verified: false, result: { error: "Unknown error", } }; let maxLength = inputSchema.valueBlock.value.length; if (maxLength > 0) { if (inputSchema.valueBlock.value[0] instanceof Repeated) { maxLength = inputData.valueBlock.value.length; } } if (maxLength === 0) { return { verified: true, result: root }; } if ((inputData.valueBlock.value.length === 0) && (inputSchema.valueBlock.value.length !== 0)) { let _optional = true; for (let i = 0; i < inputSchema.valueBlock.value.length; i++) _optional = _optional && (inputSchema.valueBlock.value[i].optional || false); if (_optional) { return { verified: true, result: root }; } if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } root.error = "Inconsistent object length"; return { verified: false, result: root }; } for (let i = 0; i < maxLength; i++) { if ((i - admission) >= inputData.valueBlock.value.length) { if (inputSchema.valueBlock.value[i].optional === false) { const _result = { verified: false, result: root }; root.error = "Inconsistent length between ASN.1 data and schema"; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } } else { if (inputSchema.valueBlock.value[0] instanceof Repeated) { result = compareSchema(root, inputData.valueBlock.value[i], inputSchema.valueBlock.value[0].value); if (result.verified === false) { if (inputSchema.valueBlock.value[0].optional) admission++; else { if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } return result; } } if ((NAME in inputSchema.valueBlock.value[0]) && (inputSchema.valueBlock.value[0].name.length > 0)) { let arrayRoot = {}; if ((LOCAL in inputSchema.valueBlock.value[0]) && (inputSchema.valueBlock.value[0].local)) arrayRoot = inputData; else arrayRoot = root; if (typeof arrayRoot[inputSchema.valueBlock.value[0].name] === "undefined") arrayRoot[inputSchema.valueBlock.value[0].name] = []; arrayRoot[inputSchema.valueBlock.value[0].name].push(inputData.valueBlock.value[i]); } } else { result = compareSchema(root, inputData.valueBlock.value[i - admission], inputSchema.valueBlock.value[i]); if (result.verified === false) { if (inputSchema.valueBlock.value[i].optional) admission++; else { if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) delete root[inputSchema.name]; } return result; } } } } } if (result.verified === false) { const _result = { verified: false, result: root }; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } return { verified: true, result: root }; } if (inputSchema.primitiveSchema && (VALUE_HEX_VIEW in inputData.valueBlock)) { const asn1 = localFromBER(inputData.valueBlock.valueHexView); if (asn1.offset === -1) { const _result = { verified: false, result: asn1.result }; if (inputSchema.name) { inputSchema.name = inputSchema.name.replace(/^\s+|\s+$/g, EMPTY_STRING); if (inputSchema.name) { delete root[inputSchema.name]; _result.name = inputSchema.name; } } return _result; } return compareSchema(root, asn1.result, inputSchema.primitiveSchema); } return { verified: true, result: root }; } function verifySchema(inputBuffer, inputSchema) { if ((inputSchema instanceof Object) === false) { return { verified: false, result: { error: "Wrong ASN.1 schema type" } }; } const asn1 = localFromBER(BufferSourceConverter.toUint8Array(inputBuffer)); if (asn1.offset === -1) { return { verified: false, result: asn1.result }; } return compareSchema(asn1.result, asn1.result, inputSchema); } var asn1js = /*#__PURE__*/Object.freeze({ __proto__: null, Any: Any, BaseBlock: BaseBlock, BaseStringBlock: BaseStringBlock, BitString: BitString, BmpString: BmpString, Boolean: Boolean$1, CharacterString: CharacterString, Choice: Choice, Constructed: Constructed, DATE: DATE, DateTime: DateTime, Duration: Duration, EndOfContent: EndOfContent, Enumerated: Enumerated, GeneralString: GeneralString, GeneralizedTime: GeneralizedTime, GraphicString: GraphicString, HexBlock: HexBlock, IA5String: IA5String, Integer: Integer, Null: Null, NumericString: NumericString, ObjectIdentifier: ObjectIdentifier$1, OctetString: OctetString, Primitive: Primitive, PrintableString: PrintableString, RawData: RawData, RelativeObjectIdentifier: RelativeObjectIdentifier, Repeated: Repeated, Sequence: Sequence, Set: Set$1, TIME: TIME, TeletexString: TeletexString, TimeOfDay: TimeOfDay, UTCTime: UTCTime, UniversalString: UniversalString, Utf8String: Utf8String, ValueBlock: ValueBlock, VideotexString: VideotexString, ViewWriter: ViewWriter, VisibleString: VisibleString, compareSchema: compareSchema, fromBER: fromBER, verifySchema: verifySchema }); var AsnTypeTypes; (function (AsnTypeTypes) { AsnTypeTypes[AsnTypeTypes["Sequence"] = 0] = "Sequence"; AsnTypeTypes[AsnTypeTypes["Set"] = 1] = "Set"; AsnTypeTypes[AsnTypeTypes["Choice"] = 2] = "Choice"; })(AsnTypeTypes || (AsnTypeTypes = {})); var AsnPropTypes; (function (AsnPropTypes) { AsnPropTypes[AsnPropTypes["Any"] = 1] = "Any"; AsnPropTypes[AsnPropTypes["Boolean"] = 2] = "Boolean"; AsnPropTypes[AsnPropTypes["OctetString"] = 3] = "OctetString"; AsnPropTypes[AsnPropTypes["BitString"] = 4] = "BitString"; AsnPropTypes[AsnPropTypes["Integer"] = 5] = "Integer"; AsnPropTypes[AsnPropTypes["Enumerated"] = 6] = "Enumerated"; AsnPropTypes[AsnPropTypes["ObjectIdentifier"] = 7] = "ObjectIdentifier"; AsnPropTypes[AsnPropTypes["Utf8String"] = 8] = "Utf8String"; AsnPropTypes[AsnPropTypes["BmpString"] = 9] = "BmpString"; AsnPropTypes[AsnPropTypes["UniversalString"] = 10] = "UniversalString"; AsnPropTypes[AsnPropTypes["NumericString"] = 11] = "NumericString"; AsnPropTypes[AsnPropTypes["PrintableString"] = 12] = "PrintableString"; AsnPropTypes[AsnPropTypes["TeletexString"] = 13] = "TeletexString"; AsnPropTypes[AsnPropTypes["VideotexString"] = 14] = "VideotexString"; AsnPropTypes[AsnPropTypes["IA5String"] = 15] = "IA5String"; AsnPropTypes[AsnPropTypes["GraphicString"] = 16] = "GraphicString"; AsnPropTypes[AsnPropTypes["VisibleString"] = 17] = "VisibleString"; AsnPropTypes[AsnPropTypes["GeneralString"] = 18] = "GeneralString"; AsnPropTypes[AsnPropTypes["CharacterString"] = 19] = "CharacterString"; AsnPropTypes[AsnPropTypes["UTCTime"] = 20] = "UTCTime"; AsnPropTypes[AsnPropTypes["GeneralizedTime"] = 21] = "GeneralizedTime"; AsnPropTypes[AsnPropTypes["DATE"] = 22] = "DATE"; AsnPropTypes[AsnPropTypes["TimeOfDay"] = 23] = "TimeOfDay"; AsnPropTypes[AsnPropTypes["DateTime"] = 24] = "DateTime"; AsnPropTypes[AsnPropTypes["Duration"] = 25] = "Duration"; AsnPropTypes[AsnPropTypes["TIME"] = 26] = "TIME"; AsnPropTypes[AsnPropTypes["Null"] = 27] = "Null"; })(AsnPropTypes || (AsnPropTypes = {})); const AsnAnyConverter = { fromASN: (value) => value instanceof Null ? null : value.valueBeforeDecodeView, toASN: (value) => { if (value === null) { return new Null(); } const schema = fromBER(value); if (schema.result.error) { throw new Error(schema.result.error); } return schema.result; }, }; const AsnIntegerConverter = { fromASN: (value) => value.valueBlock.valueHexView.byteLength >= 4 ? value.valueBlock.toString() : value.valueBlock.valueDec, toASN: (value) => new Integer({ value: +value }), }; const AsnEnumeratedConverter = { fromASN: (value) => value.valueBlock.valueDec, toASN: (value) => new Enumerated({ value }), }; const AsnBitStringConverter = { fromASN: (value) => value.valueBlock.valueHexView, toASN: (value) => new BitString({ valueHex: value }), }; const AsnObjectIdentifierConverter = { fromASN: (value) => value.valueBlock.toString(), toASN: (value) => new ObjectIdentifier$1({ value }), }; const AsnBooleanConverter = { fromASN: (value) => value.valueBlock.value, toASN: (value) => new Boolean$1({ value }), }; const AsnOctetStringConverter = { fromASN: (value) => value.valueBlock.valueHexView, toASN: (value) => new OctetString({ valueHex: value }), }; function createStringConverter(Asn1Type) { return { fromASN: (value) => value.valueBlock.value, toASN: (value) => new Asn1Type({ value }), }; } const AsnUtf8StringConverter = createStringConverter(Utf8String); const AsnBmpStringConverter = createStringConverter(BmpString); const AsnUniversalStringConverter = createStringConverter(UniversalString); const AsnNumericStringConverter = createStringConverter(NumericString); const AsnPrintableStringConverter = createStringConverter(PrintableString); const AsnTeletexStringConverter = createStringConverter(TeletexString); const AsnVideotexStringConverter = createStringConverter(VideotexString); const AsnIA5StringConverter = createStringConverter(IA5String); const AsnGraphicStringConverter = createStringConverter(GraphicString); const AsnVisibleStringConverter = createStringConverter(VisibleString); const AsnGeneralStringConverter = createStringConverter(GeneralString); const AsnCharacterStringConverter = createStringConverter(CharacterString); const AsnUTCTimeConverter = { fromASN: (value) => value.toDate(), toASN: (value) => new UTCTime({ valueDate: value }), }; const AsnGeneralizedTimeConverter = { fromASN: (value) => value.toDate(), toASN: (value) => new GeneralizedTime({ valueDate: value }), }; const AsnNullConverter = { fromASN: () => null, toASN: () => { return new Null(); }, }; function defaultConverter(type) { switch (type) { case AsnPropTypes.Any: return AsnAnyConverter; case AsnPropTypes.BitString: return AsnBitStringConverter; case AsnPropTypes.BmpString: return AsnBmpStringConverter; case AsnPropTypes.Boolean: return AsnBooleanConverter; case AsnPropTypes.CharacterString: return AsnCharacterStringConverter; case AsnPropTypes.Enumerated: return AsnEnumeratedConverter; case AsnPropTypes.GeneralString: return AsnGeneralStringConverter; case AsnPropTypes.GeneralizedTime: return AsnGeneralizedTimeConverter; case AsnPropTypes.GraphicString: return AsnGraphicStringConverter; case AsnPropTypes.IA5String: return AsnIA5StringConverter; case AsnPropTypes.Integer: return AsnIntegerConverter; case AsnPropTypes.Null: return AsnNullConverter; case AsnPropTypes.NumericString: return AsnNumericStringConverter; case AsnPropTypes.ObjectIdentifier: return AsnObjectIdentifierConverter; case AsnPropTypes.OctetString: return AsnOctetStringConverter; case AsnPropTypes.PrintableString: return AsnPrintableStringConverter; case AsnPropTypes.TeletexString: return AsnTeletexStringConverter; case AsnPropTypes.UTCTime: return AsnUTCTimeConverter; case AsnPropTypes.UniversalString: return AsnUniversalStringConverter; case AsnPropTypes.Utf8String: return AsnUtf8StringConverter; case AsnPropTypes.VideotexString: return AsnVideotexStringConverter; case AsnPropTypes.VisibleString: return AsnVisibleStringConverter; default: return null; } } function isConvertible$1(target) { if (typeof target === "function" && target.prototype) { if (target.prototype.toASN && target.prototype.fromASN) { return true; } else { return isConvertible$1(target.prototype); } } else { return !!(target && typeof target === "object" && "toASN" in target && "fromASN" in target); } } function isTypeOfArray(target) { var _a; if (target) { const proto = Object.getPrototypeOf(target); if (((_a = proto === null || proto === void 0 ? void 0 : proto.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === Array) { return true; } return isTypeOfArray(proto); } return false; } function isArrayEqual(bytes1, bytes2) { if (!(bytes1 && bytes2)) { return false; } if (bytes1.byteLength !== bytes2.byteLength) { return false; } const b1 = new Uint8Array(bytes1); const b2 = new Uint8Array(bytes2); for (let i = 0; i < bytes1.byteLength; i++) { if (b1[i] !== b2[i]) { return false; } } return true; } class AsnSchemaStorage { constructor() { this.items = new WeakMap(); } has(target) { return this.items.has(target); } get(target, checkSchema = false) { const schema = this.items.get(target); if (!schema) { throw new Error(`Cannot get schema for '${target.prototype.constructor.name}' target`); } if (checkSchema && !schema.schema) { throw new Error(`Schema '${target.prototype.constructor.name}' doesn't contain ASN.1 schema. Call 'AsnSchemaStorage.cache'.`); } return schema; } cache(target) { const schema = this.get(target); if (!schema.schema) { schema.schema = this.create(target, true); } } createDefault(target) { const schema = { type: AsnTypeTypes.Sequence, items: {}, }; const parentSchema = this.findParentSchema(target); if (parentSchema) { Object.assign(schema, parentSchema); schema.items = Object.assign({}, schema.items, parentSchema.items); } return schema; } create(target, useNames) { const schema = this.items.get(target) || this.createDefault(target); const asn1Value = []; for (const key in schema.items) { const item = schema.items[key]; const name = useNames ? key : ""; let asn1Item; if (typeof (item.type) === "number") { const Asn1TypeName = AsnPropTypes[item.type]; const Asn1Type = asn1js[Asn1TypeName]; if (!Asn1Type) { throw new Error(`Cannot get ASN1 class by name '${Asn1TypeName}'`); } asn1Item = new Asn1Type({ name }); } else if (isConvertible$1(item.type)) { const instance = new item.type(); asn1Item = instance.toSchema(name); } else if (item.optional) { const itemSchema = this.get(item.type); if (itemSchema.type === AsnTypeTypes.Choice) { asn1Item = new Any({ name }); } else { asn1Item = this.create(item.type, false); asn1Item.name = name; } } else { asn1Item = new Any({ name }); } const optional = !!item.optional || item.defaultValue !== undefined; if (item.repeated) { asn1Item.name = ""; const Container = item.repeated === "set" ? Set$1 : Sequence; asn1Item = new Container({ name: "", value: [ new Repeated({ name, value: asn1Item, }), ], }); } if (item.context !== null && item.context !== undefined) { if (item.implicit) { if (typeof item.type === "number" || isConvertible$1(item.type)) { const Container = item.repeated ? Constructed : Primitive; asn1Value.push(new Container({ name, optional, idBlock: { tagClass: 3, tagNumber: item.context, }, })); } else { this.cache(item.type); const isRepeated = !!item.repeated; let value = !isRepeated ? this.get(item.type, true).schema : asn1Item; value = "valueBlock" in value ? value.valueBlock.value : value.value; asn1Value.push(new Constructed({ name: !isRepeated ? name : "", optional, idBlock: { tagClass: 3, tagNumber: item.context, }, value: value, })); } } else { asn1Value.push(new Constructed({ optional, idBlock: { tagClass: 3, tagNumber: item.context, }, value: [asn1Item], })); } } else { asn1Item.optional = optional; asn1Value.push(asn1Item); } } switch (schema.type) { case AsnTypeTypes.Sequence: return new Sequence({ value: asn1Value, name: "" }); case AsnTypeTypes.Set: return new Set$1({ value: asn1Value, name: "" }); case AsnTypeTypes.Choice: return new Choice({ value: asn1Value, name: "" }); default: throw new Error(`Unsupported ASN1 type in use`); } } set(target, schema) { this.items.set(target, schema); return this; } findParentSchema(target) { const parent = target.__proto__; if (parent) { const schema = this.items.get(parent); return schema || this.findParentSchema(parent); } return null; } } const schemaStorage$1 = new AsnSchemaStorage(); const AsnType = (options) => (target) => { let schema; if (!schemaStorage$1.has(target)) { schema = schemaStorage$1.createDefault(target); schemaStorage$1.set(target, schema); } else { schema = schemaStorage$1.get(target); } Object.assign(schema, options); }; const AsnProp = (options) => (target, propertyKey) => { let schema; if (!schemaStorage$1.has(target.constructor)) { schema = schemaStorage$1.createDefault(target.constructor); schemaStorage$1.set(target.constructor, schema); } else { schema = schemaStorage$1.get(target.constructor); } const copyOptions = Object.assign({}, options); if (typeof copyOptions.type === "number" && !copyOptions.converter) { const defaultConverter$1 = defaultConverter(options.type); if (!defaultConverter$1) { throw new Error(`Cannot get default converter for property '${propertyKey}' of ${target.constructor.name}`); } copyOptions.converter = defaultConverter$1; } schema.items[propertyKey] = copyOptions; }; class AsnSchemaValidationError extends Error { constructor() { super(...arguments); this.schemas = []; } } class AsnParser { static parse(data, target) { const asn1Parsed = fromBER(data); if (asn1Parsed.result.error) { throw new Error(asn1Parsed.result.error); } const res = this.fromASN(asn1Parsed.result, target); return res; } static fromASN(asn1Schema, target) { var _a; try { if (isConvertible$1(target)) { const value = new target(); return value.fromASN(asn1Schema); } const schema = schemaStorage$1.get(target); schemaStorage$1.cache(target); let targetSchema = schema.schema; if (asn1Schema.constructor === Constructed && schema.type !== AsnTypeTypes.Choice) { targetSchema = new Constructed({ idBlock: { tagClass: 3, tagNumber: asn1Schema.idBlock.tagNumber, }, value: schema.schema.valueBlock.value, }); for (const key in schema.items) { delete asn1Schema[key]; } } const asn1ComparedSchema = compareSchema({}, asn1Schema, targetSchema); if (!asn1ComparedSchema.verified) { throw new AsnSchemaValidationError(`Data does not match to ${target.name} ASN1 schema. ${asn1ComparedSchema.result.error}`); } const res = new target(); if (isTypeOfArray(target)) { if (!("value" in asn1Schema.valueBlock && Array.isArray(asn1Schema.valueBlock.value))) { throw new Error(`Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed.`); } const itemType = schema.itemType; if (typeof itemType === "number") { const converter = defaultConverter(itemType); if (!converter) { throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`); } return target.from(asn1Schema.valueBlock.value, (element) => converter.fromASN(element)); } else { return target.from(asn1Schema.valueBlock.value, (element) => this.fromASN(element, itemType)); } } for (const key in schema.items) { const asn1SchemaValue = asn1ComparedSchema.result[key]; if (!asn1SchemaValue) { continue; } const schemaItem = schema.items[key]; const schemaItemType = schemaItem.type; if (typeof schemaItemType === "number" || isConvertible$1(schemaItemType)) { const converter = (_a = schemaItem.converter) !== null && _a !== void 0 ? _a : (isConvertible$1(schemaItemType) ? new schemaItemType() : null); if (!converter) { throw new Error("Converter is empty"); } if (schemaItem.repeated) { if (schemaItem.implicit) { const Container = schemaItem.repeated === "sequence" ? Sequence : Set$1; const newItem = new Container(); newItem.valueBlock = asn1SchemaValue.valueBlock; const newItemAsn = fromBER(newItem.toBER(false)); if (newItemAsn.offset === -1) { throw new Error(`Cannot parse the child item. ${newItemAsn.result.error}`); } if (!("value" in newItemAsn.result.valueBlock && Array.isArray(newItemAsn.result.valueBlock.value))) { throw new Error("Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed."); } const value = newItemAsn.result.valueBlock.value; res[key] = Array.from(value, (element) => converter.fromASN(element)); } else { res[key] = Array.from(asn1SchemaValue, (element) => converter.fromASN(element)); } } else { let value = asn1SchemaValue; if (schemaItem.implicit) { let newItem; if (isConvertible$1(schemaItemType)) { newItem = new schemaItemType().toSchema(""); } else { const Asn1TypeName = AsnPropTypes[schemaItemType]; const Asn1Type = asn1js[Asn1TypeName]; if (!Asn1Type) { throw new Error(`Cannot get '${Asn1TypeName}' class from asn1js module`); } newItem = new Asn1Type(); } newItem.valueBlock = value.valueBlock; value = fromBER(newItem.toBER(false)).result; } res[key] = converter.fromASN(value); } } else { if (schemaItem.repeated) { if (!Array.isArray(asn1SchemaValue)) { throw new Error("Cannot get list of items from the ASN.1 parsed value. ASN.1 value should be iterable."); } res[key] = Array.from(asn1SchemaValue, (element) => this.fromASN(element, schemaItemType)); } else { res[key] = this.fromASN(asn1SchemaValue, schemaItemType); } } } return res; } catch (error) { if (error instanceof AsnSchemaValidationError) { error.schemas.push(target.name); } throw error; } } } class AsnSerializer { static serialize(obj) { if (obj instanceof BaseBlock) { return obj.toBER(false); } return this.toASN(obj).toBER(false); } static toASN(obj) { if (obj && typeof obj === "object" && isConvertible$1(obj)) { return obj.toASN(); } if (!(obj && typeof obj === "object")) { throw new TypeError("Parameter 1 should be type of Object."); } const target = obj.constructor; const schema = schemaStorage$1.get(target); schemaStorage$1.cache(target); let asn1Value = []; if (schema.itemType) { if (!Array.isArray(obj)) { throw new TypeError("Parameter 1 should be type of Array."); } if (typeof schema.itemType === "number") { const converter = defaultConverter(schema.itemType); if (!converter) { throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`); } asn1Value = obj.map((o) => converter.toASN(o)); } else { asn1Value = obj.map((o) => this.toAsnItem({ type: schema.itemType }, "[]", target, o)); } } else { for (const key in schema.items) { const schemaItem = schema.items[key]; const objProp = obj[key]; if (objProp === undefined || schemaItem.defaultValue === objProp || (typeof schemaItem.defaultValue === "object" && typeof objProp === "object" && isArrayEqual(this.serialize(schemaItem.defaultValue), this.serialize(objProp)))) { continue; } const asn1Item = AsnSerializer.toAsnItem(schemaItem, key, target, objProp); if (typeof schemaItem.context === "number") { if (schemaItem.implicit) { if (!schemaItem.repeated && (typeof schemaItem.type === "number" || isConvertible$1(schemaItem.type))) { const value = {}; value.valueHex = asn1Item instanceof Null ? asn1Item.valueBeforeDecodeView : asn1Item.valueBlock.toBER(); asn1Value.push(new Primitive({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context, }, ...value, })); } else { asn1Value.push(new Constructed({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context, }, value: asn1Item.valueBlock.value, })); } } else { asn1Value.push(new Constructed({ optional: schemaItem.optional, idBlock: { tagClass: 3, tagNumber: schemaItem.context, }, value: [asn1Item], })); } } else if (schemaItem.repeated) { asn1Value = asn1Value.concat(asn1Item); } else { asn1Value.push(asn1Item); } } } let asnSchema; switch (schema.type) { case AsnTypeTypes.Sequence: asnSchema = new Sequence({ value: asn1Value }); break; case AsnTypeTypes.Set: asnSchema = new Set$1({ value: asn1Value }); break; case AsnTypeTypes.Choice: if (!asn1Value[0]) { throw new Error(`Schema '${target.name}' has wrong data. Choice cannot be empty.`); } asnSchema = asn1Value[0]; break; } return asnSchema; } static toAsnItem(schemaItem, key, target, objProp) { let asn1Item; if (typeof (schemaItem.type) === "number") { const converter = schemaItem.converter; if (!converter) { throw new Error(`Property '${key}' doesn't have converter for type ${AsnPropTypes[schemaItem.type]} in schema '${target.name}'`); } if (schemaItem.repeated) { if (!Array.isArray(objProp)) { throw new TypeError("Parameter 'objProp' should be type of Array."); } const items = Array.from(objProp, (element) => converter.toASN(element)); const Container = schemaItem.repeated === "sequence" ? Sequence : Set$1; asn1Item = new Container({ value: items, }); } else { asn1Item = converter.toASN(objProp); } } else { if (schemaItem.repeated) { if (!Array.isArray(objProp)) { throw new TypeError("Parameter 'objProp' should be type of Array."); } const items = Array.from(objProp, (element) => this.toASN(element)); const Container = schemaItem.repeated === "sequence" ? Sequence : Set$1; asn1Item = new Container({ value: items, }); } else { asn1Item = this.toASN(objProp); } } return asn1Item; } } class AsnConvert { static serialize(obj) { return AsnSerializer.serialize(obj); } static parse(data, target) { return AsnParser.parse(data, target); } static toString(data) { const buf = BufferSourceConverter.isBufferSource(data) ? BufferSourceConverter.toArrayBuffer(data) : AsnConvert.serialize(data); const asn = fromBER(buf); if (asn.offset === -1) { throw new Error(`Cannot decode ASN.1 data. ${asn.result.error}`); } return asn.result.toString(); } } /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. 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. ***************************************************************************** */ function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } /** * Copyright (c) 2020, Peculiar Ventures, All rights reserved. */ class JsonError extends Error { constructor(message, innerError) { super(innerError ? `${message}. See the inner exception for more details.` : message); this.message = message; this.innerError = innerError; } } class TransformError extends JsonError { constructor(schema, message, innerError) { super(message, innerError); this.schema = schema; } } class ParserError extends TransformError { constructor(schema, message, innerError) { super(schema, `JSON doesn't match to '${schema.target.name}' schema. ${message}`, innerError); } } class ValidationError extends JsonError { } class SerializerError extends JsonError { constructor(schemaName, message, innerError) { super(`Cannot serialize by '${schemaName}' schema. ${message}`, innerError); this.schemaName = schemaName; } } class KeyError extends ParserError { constructor(schema, keys, errors = {}) { super(schema, "Some keys doesn't match to schema"); this.keys = keys; this.errors = errors; } } var JsonPropTypes; (function (JsonPropTypes) { JsonPropTypes[JsonPropTypes["Any"] = 0] = "Any"; JsonPropTypes[JsonPropTypes["Boolean"] = 1] = "Boolean"; JsonPropTypes[JsonPropTypes["Number"] = 2] = "Number"; JsonPropTypes[JsonPropTypes["String"] = 3] = "String"; })(JsonPropTypes || (JsonPropTypes = {})); function checkType(value, type) { switch (type) { case JsonPropTypes.Boolean: return typeof value === "boolean"; case JsonPropTypes.Number: return typeof value === "number"; case JsonPropTypes.String: return typeof value === "string"; } return true; } function throwIfTypeIsWrong(value, type) { if (!checkType(value, type)) { throw new TypeError(`Value must be ${JsonPropTypes[type]}`); } } function isConvertible(target) { if (target && target.prototype) { if (target.prototype.toJSON && target.prototype.fromJSON) { return true; } else { return isConvertible(target.prototype); } } else { return !!(target && target.toJSON && target.fromJSON); } } class JsonSchemaStorage { constructor() { this.items = new Map(); } has(target) { return this.items.has(target) || !!this.findParentSchema(target); } get(target) { const schema = this.items.get(target) || this.findParentSchema(target); if (!schema) { throw new Error("Cannot get schema for current target"); } return schema; } create(target) { const schema = { names: {} }; const parentSchema = this.findParentSchema(target); if (parentSchema) { Object.assign(schema, parentSchema); schema.names = {}; for (const name in parentSchema.names) { schema.names[name] = Object.assign({}, parentSchema.names[name]); } } schema.target = target; return schema; } set(target, schema) { this.items.set(target, schema); return this; } findParentSchema(target) { const parent = target.__proto__; if (parent) { const schema = this.items.get(parent); return schema || this.findParentSchema(parent); } return null; } } const DEFAULT_SCHEMA = "default"; const schemaStorage = new JsonSchemaStorage(); class PatternValidation { constructor(pattern) { this.pattern = new RegExp(pattern); } validate(value) { const pattern = new RegExp(this.pattern.source, this.pattern.flags); if (typeof value !== "string") { throw new ValidationError("Incoming value must be string"); } if (!pattern.exec(value)) { throw new ValidationError(`Value doesn't match to pattern '${pattern.toString()}'`); } } } class InclusiveValidation { constructor(min = Number.MIN_VALUE, max = Number.MAX_VALUE) { this.min = min; this.max = max; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.Number); if (!(this.min <= value && value <= this.max)) { const min = this.min === Number.MIN_VALUE ? "MIN" : this.min; const max = this.max === Number.MAX_VALUE ? "MAX" : this.max; throw new ValidationError(`Value doesn't match to diapason [${min},${max}]`); } } } class ExclusiveValidation { constructor(min = Number.MIN_VALUE, max = Number.MAX_VALUE) { this.min = min; this.max = max; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.Number); if (!(this.min < value && value < this.max)) { const min = this.min === Number.MIN_VALUE ? "MIN" : this.min; const max = this.max === Number.MAX_VALUE ? "MAX" : this.max; throw new ValidationError(`Value doesn't match to diapason (${min},${max})`); } } } class LengthValidation { constructor(length, minLength, maxLength) { this.length = length; this.minLength = minLength; this.maxLength = maxLength; } validate(value) { if (this.length !== undefined) { if (value.length !== this.length) { throw new ValidationError(`Value length must be exactly ${this.length}.`); } return; } if (this.minLength !== undefined) { if (value.length < this.minLength) { throw new ValidationError(`Value length must be more than ${this.minLength}.`); } } if (this.maxLength !== undefined) { if (value.length > this.maxLength) { throw new ValidationError(`Value length must be less than ${this.maxLength}.`); } } } } class EnumerationValidation { constructor(enumeration) { this.enumeration = enumeration; } validate(value) { throwIfTypeIsWrong(value, JsonPropTypes.String); if (!this.enumeration.includes(value)) { throw new ValidationError(`Value must be one of ${this.enumeration.map((v) => `'${v}'`).join(", ")}`); } } } class JsonTransform { static checkValues(data, schemaItem) { const values = Array.isArray(data) ? data : [data]; for (const value of values) { for (const validation of schemaItem.validations) { if (validation instanceof LengthValidation && schemaItem.repeated) { validation.validate(data); } else { validation.validate(value); } } } } static checkTypes(value, schemaItem) { if (schemaItem.repeated && !Array.isArray(value)) { throw new TypeError("Value must be Array"); } if (typeof schemaItem.type === "number") { const values = Array.isArray(value) ? value : [value]; for (const v of values) { throwIfTypeIsWrong(v, schemaItem.type); } } } static getSchemaByName(schema, name = DEFAULT_SCHEMA) { return { ...schema.names[DEFAULT_SCHEMA], ...schema.names[name] }; } } class JsonSerializer extends JsonTransform { static serialize(obj, options, replacer, space) { const json = this.toJSON(obj, options); return JSON.stringify(json, replacer, space); } static toJSON(obj, options = {}) { let res; let targetSchema = options.targetSchema; const schemaName = options.schemaName || DEFAULT_SCHEMA; if (isConvertible(obj)) { return obj.toJSON(); } if (Array.isArray(obj)) { res = []; for (const item of obj) { res.push(this.toJSON(item, options)); } } else if (typeof obj === "object") { if (targetSchema && !schemaStorage.has(targetSchema)) { throw new JsonError("Cannot get schema for `targetSchema` param"); } targetSchema = (targetSchema || obj.constructor); if (schemaStorage.has(targetSchema)) { const schema = schemaStorage.get(targetSchema); res = {}; const namedSchema = this.getSchemaByName(schema, schemaName); for (const key in namedSchema) { try { const item = namedSchema[key]; const objItem = obj[key]; let value; if ((item.optional && objItem === undefined) || (item.defaultValue !== undefined && objItem === item.defaultValue)) { continue; } if (!item.optional && objItem === undefined) { throw new SerializerError(targetSchema.name, `Property '${key}' is required.`); } if (typeof item.type === "number") { if (item.converter) { if (item.repeated) { value = objItem.map((el) => item.converter.toJSON(el, obj)); } else { value = item.converter.toJSON(objItem, obj); } } else { value = objItem; } } else { if (item.repeated) { value = objItem.map((el) => this.toJSON(el, { schemaName })); } else { value = this.toJSON(objItem, { schemaName }); } } this.checkTypes(value, item); this.checkValues(value, item); res[item.name || key] = value; } catch (e) { if (e instanceof SerializerError) { throw e; } else { throw new SerializerError(schema.target.name, `Property '${key}' is wrong. ${e.message}`, e); } } } } else { res = {}; for (const key in obj) { res[key] = this.toJSON(obj[key], { schemaName }); } } } else { res = obj; } return res; } } class JsonParser extends JsonTransform { static parse(data, options) { const obj = JSON.parse(data); return this.fromJSON(obj, options); } static fromJSON(target, options) { const targetSchema = options.targetSchema; const schemaName = options.schemaName || DEFAULT_SCHEMA; const obj = new targetSchema(); if (isConvertible(obj)) { return obj.fromJSON(target); } const schema = schemaStorage.get(targetSchema); const namedSchema = this.getSchemaByName(schema, schemaName); const keyErrors = {}; if (options.strictProperty && !Array.isArray(target)) { JsonParser.checkStrictProperty(target, namedSchema, schema); } for (const key in namedSchema) { try { const item = namedSchema[key]; const name = item.name || key; const value = target[name]; if (value === undefined && (item.optional || item.defaultValue !== undefined)) { continue; } if (!item.optional && value === undefined) { throw new ParserError(schema, `Property '${name}' is required.`); } this.checkTypes(value, item); this.checkValues(value, item); if (typeof (item.type) === "number") { if (item.converter) { if (item.repeated) { obj[key] = value.map((el) => item.converter.fromJSON(el, obj)); } else { obj[key] = item.converter.fromJSON(value, obj); } } else { obj[key] = value; } } else { const newOptions = { ...options, targetSchema: item.type, schemaName, }; if (item.repeated) { obj[key] = value.map((el) => this.fromJSON(el, newOptions)); } else { obj[key] = this.fromJSON(value, newOptions); } } } catch (e) { if (!(e instanceof ParserError)) { e = new ParserError(schema, `Property '${key}' is wrong. ${e.message}`, e); } if (options.strictAllKeys) { keyErrors[key] = e; } else { throw e; } } } const keys = Object.keys(keyErrors); if (keys.length) { throw new KeyError(schema, keys, keyErrors); } return obj; } static checkStrictProperty(target, namedSchema, schema) { const jsonProps = Object.keys(target); const schemaProps = Object.keys(namedSchema); const keys = []; for (const key of jsonProps) { if (schemaProps.indexOf(key) === -1) { keys.push(key); } } if (keys.length) { throw new KeyError(schema, keys); } } } function getValidations(item) { const validations = []; if (item.pattern) { validations.push(new PatternValidation(item.pattern)); } if (item.type === JsonPropTypes.Number || item.type === JsonPropTypes.Any) { if (item.minInclusive !== undefined || item.maxInclusive !== undefined) { validations.push(new InclusiveValidation(item.minInclusive, item.maxInclusive)); } if (item.minExclusive !== undefined || item.maxExclusive !== undefined) { validations.push(new ExclusiveValidation(item.minExclusive, item.maxExclusive)); } if (item.enumeration !== undefined) { validations.push(new EnumerationValidation(item.enumeration)); } } if (item.type === JsonPropTypes.String || item.repeated || item.type === JsonPropTypes.Any) { if (item.length !== undefined || item.minLength !== undefined || item.maxLength !== undefined) { validations.push(new LengthValidation(item.length, item.minLength, item.maxLength)); } } return validations; } const JsonProp = (options = {}) => (target, propertyKey) => { const errorMessage = `Cannot set type for ${propertyKey} property of ${target.constructor.name} schema`; let schema; if (!schemaStorage.has(target.constructor)) { schema = schemaStorage.create(target.constructor); schemaStorage.set(target.constructor, schema); } else { schema = schemaStorage.get(target.constructor); if (schema.target !== target.constructor) { schema = schemaStorage.create(target.constructor); schemaStorage.set(target.constructor, schema); } } const defaultSchema = { type: JsonPropTypes.Any, validations: [], }; const copyOptions = Object.assign(defaultSchema, options); copyOptions.validations = getValidations(copyOptions); if (typeof copyOptions.type !== "number") { if (!schemaStorage.has(copyOptions.type) && !isConvertible(copyOptions.type)) { throw new Error(`${errorMessage}. Assigning type doesn't have schema.`); } } let schemaNames; if (Array.isArray(options.schema)) { schemaNames = options.schema; } else { schemaNames = [options.schema || DEFAULT_SCHEMA]; } for (const schemaName of schemaNames) { if (!schema.names[schemaName]) { schema.names[schemaName] = {}; } const namedSchema = schema.names[schemaName]; namedSchema[propertyKey] = copyOptions; } }; /*! Copyright (c) Peculiar Ventures, LLC */ class CryptoError extends Error { } class AlgorithmError extends CryptoError { } class UnsupportedOperationError extends CryptoError { constructor(methodName) { super(`Unsupported operation: ${methodName ? `${methodName}` : ""}`); } } class OperationError extends CryptoError { } class RequiredPropertyError extends CryptoError { constructor(propName) { super(`${propName}: Missing required property`); } } function isJWK(data) { return typeof data === "object" && "kty" in data; } class ProviderCrypto { async digest(...args) { this.checkDigest.apply(this, args); return this.onDigest.apply(this, args); } checkDigest(algorithm, data) { this.checkAlgorithmName(algorithm); } async onDigest(algorithm, data) { throw new UnsupportedOperationError("digest"); } async generateKey(...args) { this.checkGenerateKey.apply(this, args); return this.onGenerateKey.apply(this, args); } checkGenerateKey(algorithm, extractable, keyUsages, ...args) { this.checkAlgorithmName(algorithm); this.checkGenerateKeyParams(algorithm); if (!(keyUsages && keyUsages.length)) { throw new TypeError(`Usages cannot be empty when creating a key.`); } let allowedUsages; if (Array.isArray(this.usages)) { allowedUsages = this.usages; } else { allowedUsages = this.usages.privateKey.concat(this.usages.publicKey); } this.checkKeyUsages(keyUsages, allowedUsages); } checkGenerateKeyParams(algorithm) { } async onGenerateKey(algorithm, extractable, keyUsages, ...args) { throw new UnsupportedOperationError("generateKey"); } async sign(...args) { this.checkSign.apply(this, args); return this.onSign.apply(this, args); } checkSign(algorithm, key, data, ...args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, "sign"); } async onSign(algorithm, key, data, ...args) { throw new UnsupportedOperationError("sign"); } async verify(...args) { this.checkVerify.apply(this, args); return this.onVerify.apply(this, args); } checkVerify(algorithm, key, signature, data, ...args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, "verify"); } async onVerify(algorithm, key, signature, data, ...args) { throw new UnsupportedOperationError("verify"); } async encrypt(...args) { this.checkEncrypt.apply(this, args); return this.onEncrypt.apply(this, args); } checkEncrypt(algorithm, key, data, options = {}, ...args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, options.keyUsage ? "encrypt" : void 0); } async onEncrypt(algorithm, key, data, ...args) { throw new UnsupportedOperationError("encrypt"); } async decrypt(...args) { this.checkDecrypt.apply(this, args); return this.onDecrypt.apply(this, args); } checkDecrypt(algorithm, key, data, options = {}, ...args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(key, options.keyUsage ? "decrypt" : void 0); } async onDecrypt(algorithm, key, data, ...args) { throw new UnsupportedOperationError("decrypt"); } async deriveBits(...args) { this.checkDeriveBits.apply(this, args); return this.onDeriveBits.apply(this, args); } checkDeriveBits(algorithm, baseKey, length, options = {}, ...args) { this.checkAlgorithmName(algorithm); this.checkAlgorithmParams(algorithm); this.checkCryptoKey(baseKey, options.keyUsage ? "deriveBits" : void 0); if (length % 8 !== 0) { throw new OperationError("length: Is not multiple of 8"); } } async onDeriveBits(algorithm, baseKey, length, ...args) { throw new UnsupportedOperationError("deriveBits"); } async exportKey(...args) { this.checkExportKey.apply(this, args); return this.onExportKey.apply(this, args); } checkExportKey(format, key, ...args) { this.checkKeyFormat(format); this.checkCryptoKey(key); if (!key.extractable) { throw new CryptoError("key: Is not extractable"); } } async onExportKey(format, key, ...args) { throw new UnsupportedOperationError("exportKey"); } async importKey(...args) { this.checkImportKey.apply(this, args); return this.onImportKey.apply(this, args); } checkImportKey(format, keyData, algorithm, extractable, keyUsages, ...args) { this.checkKeyFormat(format); this.checkKeyData(format, keyData); this.checkAlgorithmName(algorithm); this.checkImportParams(algorithm); if (Array.isArray(this.usages)) { this.checkKeyUsages(keyUsages, this.usages); } } async onImportKey(format, keyData, algorithm, extractable, keyUsages, ...args) { throw new UnsupportedOperationError("importKey"); } checkAlgorithmName(algorithm) { if (algorithm.name.toLowerCase() !== this.name.toLowerCase()) { throw new AlgorithmError("Unrecognized name"); } } checkAlgorithmParams(algorithm) { } checkDerivedKeyParams(algorithm) { } checkKeyUsages(usages, allowed) { for (const usage of usages) { if (allowed.indexOf(usage) === -1) { throw new TypeError("Cannot create a key using the specified key usages"); } } } checkCryptoKey(key, keyUsage) { this.checkAlgorithmName(key.algorithm); if (keyUsage && key.usages.indexOf(keyUsage) === -1) { throw new CryptoError(`key does not match that of operation`); } } checkRequiredProperty(data, propName) { if (!(propName in data)) { throw new RequiredPropertyError(propName); } } checkHashAlgorithm(algorithm, hashAlgorithms) { for (const item of hashAlgorithms) { if (item.toLowerCase() === algorithm.name.toLowerCase()) { return; } } throw new OperationError(`hash: Must be one of ${hashAlgorithms.join(", ")}`); } checkImportParams(algorithm) { } checkKeyFormat(format) { switch (format) { case "raw": case "pkcs8": case "spki": case "jwk": break; default: throw new TypeError("format: Is invalid value. Must be 'jwk', 'raw', 'spki', or 'pkcs8'"); } } checkKeyData(format, keyData) { if (!keyData) { throw new TypeError("keyData: Cannot be empty on empty on key importing"); } if (format === "jwk") { if (!isJWK(keyData)) { throw new TypeError("keyData: Is not JsonWebToken"); } } else if (!BufferSourceConverter.isBufferSource(keyData)) { throw new TypeError("keyData: Is not ArrayBufferView or ArrayBuffer"); } } prepareData(data) { return BufferSourceConverter.toArrayBuffer(data); } } class AesProvider extends ProviderCrypto { checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not of type Number"); } switch (algorithm.length) { case 128: case 192: case 256: break; default: throw new TypeError("length: Must be 128, 192, or 256"); } } checkDerivedKeyParams(algorithm) { this.checkGenerateKeyParams(algorithm); } } class AesCbcProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-CBC"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength !== 16) { throw new TypeError("iv: Must have length 16 bytes"); } } } class AesCmacProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-CMAC"; this.usages = ["sign", "verify"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new OperationError("length: Must be more than 0"); } } } class AesCtrProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-CTR"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "counter"); if (!(algorithm.counter instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.counter))) { throw new TypeError("counter: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.counter.byteLength !== 16) { throw new TypeError("iv: Must have length 16 bytes"); } this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new OperationError("length: Must be more than 0"); } } } class AesEcbProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-ECB"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } } class AesGcmProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-GCM"; this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength < 1) { throw new OperationError("iv: Must have length more than 0 and less than 2^64 - 1"); } if (!("tagLength" in algorithm)) { algorithm.tagLength = 128; } switch (algorithm.tagLength) { case 32: case 64: case 96: case 104: case 112: case 120: case 128: break; default: throw new OperationError("tagLength: Must be one of 32, 64, 96, 104, 112, 120 or 128"); } } } class AesKwProvider$1 extends AesProvider { constructor() { super(...arguments); this.name = "AES-KW"; this.usages = ["wrapKey", "unwrapKey"]; } } class DesProvider extends ProviderCrypto { constructor() { super(...arguments); this.usages = ["encrypt", "decrypt", "wrapKey", "unwrapKey"]; } checkAlgorithmParams(algorithm) { if (this.ivSize) { this.checkRequiredProperty(algorithm, "iv"); if (!(algorithm.iv instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.iv))) { throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } if (algorithm.iv.byteLength !== this.ivSize) { throw new TypeError(`iv: Must have length ${this.ivSize} bytes`); } } } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "length"); if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not of type Number"); } if (algorithm.length !== this.keySizeBits) { throw new OperationError(`algorithm.length: Must be ${this.keySizeBits}`); } } checkDerivedKeyParams(algorithm) { this.checkGenerateKeyParams(algorithm); } } class RsaProvider extends ProviderCrypto { constructor() { super(...arguments); this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "publicExponent"); if (!(algorithm.publicExponent && algorithm.publicExponent instanceof Uint8Array)) { throw new TypeError("publicExponent: Missing or not a Uint8Array"); } const publicExponent = Convert.ToBase64(algorithm.publicExponent); if (!(publicExponent === "Aw==" || publicExponent === "AQAB")) { throw new TypeError("publicExponent: Must be [3] or [1,0,1]"); } this.checkRequiredProperty(algorithm, "modulusLength"); if (algorithm.modulusLength % 8 || algorithm.modulusLength < 256 || algorithm.modulusLength > 16384) { throw new TypeError("The modulus length must be a multiple of 8 bits and >= 256 and <= 16384"); } } checkImportParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } } class RsaSsaProvider$1 extends RsaProvider { constructor() { super(...arguments); this.name = "RSASSA-PKCS1-v1_5"; this.usages = { privateKey: ["sign"], publicKey: ["verify"], }; } } class RsaPssProvider$1 extends RsaProvider { constructor() { super(...arguments); this.name = "RSA-PSS"; this.usages = { privateKey: ["sign"], publicKey: ["verify"], }; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "saltLength"); if (typeof algorithm.saltLength !== "number") { throw new TypeError("saltLength: Is not a Number"); } if (algorithm.saltLength < 0) { throw new RangeError("saltLength: Must be positive number"); } } } class RsaOaepProvider$1 extends RsaProvider { constructor() { super(...arguments); this.name = "RSA-OAEP"; this.usages = { privateKey: ["decrypt", "unwrapKey"], publicKey: ["encrypt", "wrapKey"], }; } checkAlgorithmParams(algorithm) { if (algorithm.label && !(algorithm.label instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.label))) { throw new TypeError("label: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } } } class EllipticProvider extends ProviderCrypto { checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "namedCurve"); this.checkNamedCurve(algorithm.namedCurve); } checkNamedCurve(namedCurve) { for (const item of this.namedCurves) { if (item.toLowerCase() === namedCurve.toLowerCase()) { return; } } throw new OperationError(`namedCurve: Must be one of ${this.namedCurves.join(", ")}`); } } class EcdsaProvider$1 extends EllipticProvider { constructor() { super(...arguments); this.name = "ECDSA"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = { privateKey: ["sign"], publicKey: ["verify"], }; this.namedCurves = ["P-256", "P-384", "P-521", "K-256"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } } const KEY_TYPES = ["secret", "private", "public"]; class CryptoKey$1 { static create(algorithm, type, extractable, usages) { const key = new this(); key.algorithm = algorithm; key.type = type; key.extractable = extractable; key.usages = usages; return key; } static isKeyType(data) { return KEY_TYPES.indexOf(data) !== -1; } get [Symbol.toStringTag]() { return "CryptoKey"; } } class EcdhProvider$1 extends EllipticProvider { constructor() { super(...arguments); this.name = "ECDH"; this.usages = { privateKey: ["deriveBits", "deriveKey"], publicKey: [], }; this.namedCurves = ["P-256", "P-384", "P-521", "K-256"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "public"); if (!(algorithm.public instanceof CryptoKey$1)) { throw new TypeError("public: Is not a CryptoKey"); } if (algorithm.public.type !== "public") { throw new OperationError("public: Is not a public key"); } if (algorithm.public.algorithm.name !== this.name) { throw new OperationError(`public: Is not ${this.name} key`); } } } class EcdhEsProvider$1 extends EcdhProvider$1 { constructor() { super(...arguments); this.name = "ECDH-ES"; this.namedCurves = ["X25519", "X448"]; } } class EdDsaProvider$1 extends EllipticProvider { constructor() { super(...arguments); this.name = "EdDSA"; this.usages = { privateKey: ["sign"], publicKey: ["verify"], }; this.namedCurves = ["Ed25519", "Ed448"]; } } let ObjectIdentifier = class ObjectIdentifier { constructor(value) { if (value) { this.value = value; } } }; __decorate([ AsnProp({ type: AsnPropTypes.ObjectIdentifier }) ], ObjectIdentifier.prototype, "value", void 0); ObjectIdentifier = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], ObjectIdentifier); class AlgorithmIdentifier { constructor(params) { Object.assign(this, params); } } __decorate([ AsnProp({ type: AsnPropTypes.ObjectIdentifier, }) ], AlgorithmIdentifier.prototype, "algorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true, }) ], AlgorithmIdentifier.prototype, "parameters", void 0); class PrivateKeyInfo { constructor() { this.version = 0; this.privateKeyAlgorithm = new AlgorithmIdentifier(); this.privateKey = new ArrayBuffer(0); } } __decorate([ AsnProp({ type: AsnPropTypes.Integer }) ], PrivateKeyInfo.prototype, "version", void 0); __decorate([ AsnProp({ type: AlgorithmIdentifier }) ], PrivateKeyInfo.prototype, "privateKeyAlgorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], PrivateKeyInfo.prototype, "privateKey", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true }) ], PrivateKeyInfo.prototype, "attributes", void 0); class PublicKeyInfo { constructor() { this.publicKeyAlgorithm = new AlgorithmIdentifier(); this.publicKey = new ArrayBuffer(0); } } __decorate([ AsnProp({ type: AlgorithmIdentifier }) ], PublicKeyInfo.prototype, "publicKeyAlgorithm", void 0); __decorate([ AsnProp({ type: AsnPropTypes.BitString }) ], PublicKeyInfo.prototype, "publicKey", void 0); const JsonBase64UrlArrayBufferConverter = { fromJSON: (value) => Convert.FromBase64Url(value), toJSON: (value) => Convert.ToBase64Url(new Uint8Array(value)), }; const AsnIntegerArrayBufferConverter = { fromASN: (value) => { const valueHex = value.valueBlock.valueHex; return !(new Uint8Array(valueHex)[0]) ? value.valueBlock.valueHex.slice(1) : value.valueBlock.valueHex; }, toASN: (value) => { const valueHex = new Uint8Array(value)[0] > 127 ? combine(new Uint8Array([0]).buffer, value) : value; return new Integer({ valueHex }); }, }; class RsaPrivateKey$1 { constructor() { this.version = 0; this.modulus = new ArrayBuffer(0); this.publicExponent = new ArrayBuffer(0); this.privateExponent = new ArrayBuffer(0); this.prime1 = new ArrayBuffer(0); this.prime2 = new ArrayBuffer(0); this.exponent1 = new ArrayBuffer(0); this.exponent2 = new ArrayBuffer(0); this.coefficient = new ArrayBuffer(0); } } __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerConverter }) ], RsaPrivateKey$1.prototype, "version", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "n", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "modulus", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "e", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "publicExponent", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "d", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "privateExponent", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "p", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "prime1", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "q", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "prime2", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "dp", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "exponent1", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "dq", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "exponent2", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "qi", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPrivateKey$1.prototype, "coefficient", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Any, optional: true }) ], RsaPrivateKey$1.prototype, "otherPrimeInfos", void 0); class RsaPublicKey$1 { constructor() { this.modulus = new ArrayBuffer(0); this.publicExponent = new ArrayBuffer(0); } } __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "n", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPublicKey$1.prototype, "modulus", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerArrayBufferConverter }), JsonProp({ name: "e", converter: JsonBase64UrlArrayBufferConverter }) ], RsaPublicKey$1.prototype, "publicExponent", void 0); let EcPublicKey$1 = class EcPublicKey { constructor(value) { this.value = new ArrayBuffer(0); if (value) { this.value = value; } } toJSON() { let bytes = new Uint8Array(this.value); if (bytes[0] !== 0x04) { throw new CryptoError("Wrong ECPoint. Current version supports only Uncompressed (0x04) point"); } bytes = new Uint8Array(this.value.slice(1)); const size = bytes.length / 2; const offset = 0; const json = { x: Convert.ToBase64Url(bytes.buffer.slice(offset, offset + size)), y: Convert.ToBase64Url(bytes.buffer.slice(offset + size, offset + size + size)), }; return json; } fromJSON(json) { if (!("x" in json)) { throw new Error("x: Missing required property"); } if (!("y" in json)) { throw new Error("y: Missing required property"); } const x = Convert.FromBase64Url(json.x); const y = Convert.FromBase64Url(json.y); const value = combine(new Uint8Array([0x04]).buffer, x, y); this.value = new Uint8Array(value).buffer; return this; } }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EcPublicKey$1.prototype, "value", void 0); EcPublicKey$1 = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EcPublicKey$1); class EcPrivateKey$1 { constructor() { this.version = 1; this.privateKey = new ArrayBuffer(0); } fromJSON(json) { if (!("d" in json)) { throw new Error("d: Missing required property"); } this.privateKey = Convert.FromBase64Url(json.d); if ("x" in json) { const publicKey = new EcPublicKey$1(); publicKey.fromJSON(json); this.publicKey = AsnSerializer.toASN(publicKey).valueBlock.valueHex; } return this; } toJSON() { const jwk = {}; jwk.d = Convert.ToBase64Url(this.privateKey); if (this.publicKey) { Object.assign(jwk, new EcPublicKey$1(this.publicKey).toJSON()); } return jwk; } } __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerConverter }) ], EcPrivateKey$1.prototype, "version", void 0); __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EcPrivateKey$1.prototype, "privateKey", void 0); __decorate([ AsnProp({ context: 0, type: AsnPropTypes.Any, optional: true }) ], EcPrivateKey$1.prototype, "parameters", void 0); __decorate([ AsnProp({ context: 1, type: AsnPropTypes.BitString, optional: true }) ], EcPrivateKey$1.prototype, "publicKey", void 0); const AsnIntegerWithoutPaddingConverter = { fromASN: (value) => { const bytes = new Uint8Array(value.valueBlock.valueHex); return (bytes[0] === 0) ? bytes.buffer.slice(1) : bytes.buffer; }, toASN: (value) => { const bytes = new Uint8Array(value); if (bytes[0] > 127) { const newValue = new Uint8Array(bytes.length + 1); newValue.set(bytes, 1); return new Integer({ valueHex: newValue.buffer }); } return new Integer({ valueHex: value }); }, }; var index$2 = /*#__PURE__*/Object.freeze({ __proto__: null, AsnIntegerWithoutPaddingConverter: AsnIntegerWithoutPaddingConverter }); class EcUtils { static decodePoint(data, pointSize) { const view = BufferSourceConverter.toUint8Array(data); if ((view.length === 0) || (view[0] !== 4)) { throw new Error("Only uncompressed point format supported"); } const n = (view.length - 1) / 2; if (n !== (Math.ceil(pointSize / 8))) { throw new Error("Point does not match field size"); } const xb = view.slice(1, n + 1); const yb = view.slice(n + 1, n + 1 + n); return { x: xb, y: yb }; } static encodePoint(point, pointSize) { const size = Math.ceil(pointSize / 8); if (point.x.byteLength !== size || point.y.byteLength !== size) { throw new Error("X,Y coordinates don't match point size criteria"); } const x = BufferSourceConverter.toUint8Array(point.x); const y = BufferSourceConverter.toUint8Array(point.y); const res = new Uint8Array(size * 2 + 1); res[0] = 4; res.set(x, 1); res.set(y, size + 1); return res; } static getSize(pointSize) { return Math.ceil(pointSize / 8); } static encodeSignature(signature, pointSize) { const size = this.getSize(pointSize); const r = BufferSourceConverter.toUint8Array(signature.r); const s = BufferSourceConverter.toUint8Array(signature.s); const res = new Uint8Array(size * 2); res.set(this.padStart(r, size)); res.set(this.padStart(s, size), size); return res; } static decodeSignature(data, pointSize) { const size = this.getSize(pointSize); const view = BufferSourceConverter.toUint8Array(data); if (view.length !== (size * 2)) { throw new Error("Incorrect size of the signature"); } const r = view.slice(0, size); const s = view.slice(size); return { r: this.trimStart(r), s: this.trimStart(s), }; } static trimStart(data) { let i = 0; while ((i < data.length - 1) && (data[i] === 0)) { i++; } if (i === 0) { return data; } return data.slice(i, data.length); } static padStart(data, size) { if (size === data.length) { return data; } const res = new Uint8Array(size); res.set(data, size - data.length); return res; } } class EcDsaSignature { constructor() { this.r = new ArrayBuffer(0); this.s = new ArrayBuffer(0); } static fromWebCryptoSignature(value) { const pointSize = value.byteLength / 2; const point = EcUtils.decodeSignature(value, pointSize * 8); const ecSignature = new EcDsaSignature(); ecSignature.r = BufferSourceConverter.toArrayBuffer(point.r); ecSignature.s = BufferSourceConverter.toArrayBuffer(point.s); return ecSignature; } toWebCryptoSignature(pointSize) { pointSize !== null && pointSize !== void 0 ? pointSize : (pointSize = Math.max(this.r.byteLength, this.s.byteLength) * 8); const signature = EcUtils.encodeSignature(this, pointSize); return signature.buffer; } } __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerWithoutPaddingConverter }) ], EcDsaSignature.prototype, "r", void 0); __decorate([ AsnProp({ type: AsnPropTypes.Integer, converter: AsnIntegerWithoutPaddingConverter }) ], EcDsaSignature.prototype, "s", void 0); class OneAsymmetricKey extends PrivateKeyInfo { } __decorate([ AsnProp({ context: 1, implicit: true, type: AsnPropTypes.BitString, optional: true }) ], OneAsymmetricKey.prototype, "publicKey", void 0); let EdPrivateKey$1 = class EdPrivateKey { constructor() { this.value = new ArrayBuffer(0); } fromJSON(json) { if (!json.d) { throw new Error("d: Missing required property"); } this.value = Convert.FromBase64Url(json.d); return this; } toJSON() { const jwk = { d: Convert.ToBase64Url(this.value), }; return jwk; } }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }) ], EdPrivateKey$1.prototype, "value", void 0); EdPrivateKey$1 = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EdPrivateKey$1); let EdPublicKey$1 = class EdPublicKey { constructor(value) { this.value = new ArrayBuffer(0); if (value) { this.value = value; } } toJSON() { const json = { x: Convert.ToBase64Url(this.value), }; return json; } fromJSON(json) { if (!("x" in json)) { throw new Error("x: Missing required property"); } this.value = Convert.FromBase64Url(json.x); return this; } }; __decorate([ AsnProp({ type: AsnPropTypes.BitString }) ], EdPublicKey$1.prototype, "value", void 0); EdPublicKey$1 = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], EdPublicKey$1); let CurvePrivateKey = class CurvePrivateKey { }; __decorate([ AsnProp({ type: AsnPropTypes.OctetString }), JsonProp({ type: JsonPropTypes.String, converter: JsonBase64UrlArrayBufferConverter }) ], CurvePrivateKey.prototype, "d", void 0); CurvePrivateKey = __decorate([ AsnType({ type: AsnTypeTypes.Choice }) ], CurvePrivateKey); const idSecp256r1 = "1.2.840.10045.3.1.7"; const idEllipticCurve = "1.3.132.0"; const idSecp384r1 = `${idEllipticCurve}.34`; const idSecp521r1 = `${idEllipticCurve}.35`; const idSecp256k1 = `${idEllipticCurve}.10`; const idVersionOne = "1.3.36.3.3.2.8.1.1"; const idBrainpoolP160r1 = `${idVersionOne}.1`; const idBrainpoolP160t1 = `${idVersionOne}.2`; const idBrainpoolP192r1 = `${idVersionOne}.3`; const idBrainpoolP192t1 = `${idVersionOne}.4`; const idBrainpoolP224r1 = `${idVersionOne}.5`; const idBrainpoolP224t1 = `${idVersionOne}.6`; const idBrainpoolP256r1 = `${idVersionOne}.7`; const idBrainpoolP256t1 = `${idVersionOne}.8`; const idBrainpoolP320r1 = `${idVersionOne}.9`; const idBrainpoolP320t1 = `${idVersionOne}.10`; const idBrainpoolP384r1 = `${idVersionOne}.11`; const idBrainpoolP384t1 = `${idVersionOne}.12`; const idBrainpoolP512r1 = `${idVersionOne}.13`; const idBrainpoolP512t1 = `${idVersionOne}.14`; const idX25519 = "1.3.101.110"; const idX448 = "1.3.101.111"; const idEd25519 = "1.3.101.112"; const idEd448 = "1.3.101.113"; var index$1 = /*#__PURE__*/Object.freeze({ __proto__: null, converters: index$2, get ObjectIdentifier () { return ObjectIdentifier; }, AlgorithmIdentifier: AlgorithmIdentifier, PrivateKeyInfo: PrivateKeyInfo, PublicKeyInfo: PublicKeyInfo, RsaPrivateKey: RsaPrivateKey$1, RsaPublicKey: RsaPublicKey$1, EcPrivateKey: EcPrivateKey$1, get EcPublicKey () { return EcPublicKey$1; }, EcDsaSignature: EcDsaSignature, OneAsymmetricKey: OneAsymmetricKey, get EdPrivateKey () { return EdPrivateKey$1; }, get EdPublicKey () { return EdPublicKey$1; }, get CurvePrivateKey () { return CurvePrivateKey; }, idSecp256r1: idSecp256r1, idEllipticCurve: idEllipticCurve, idSecp384r1: idSecp384r1, idSecp521r1: idSecp521r1, idSecp256k1: idSecp256k1, idVersionOne: idVersionOne, idBrainpoolP160r1: idBrainpoolP160r1, idBrainpoolP160t1: idBrainpoolP160t1, idBrainpoolP192r1: idBrainpoolP192r1, idBrainpoolP192t1: idBrainpoolP192t1, idBrainpoolP224r1: idBrainpoolP224r1, idBrainpoolP224t1: idBrainpoolP224t1, idBrainpoolP256r1: idBrainpoolP256r1, idBrainpoolP256t1: idBrainpoolP256t1, idBrainpoolP320r1: idBrainpoolP320r1, idBrainpoolP320t1: idBrainpoolP320t1, idBrainpoolP384r1: idBrainpoolP384r1, idBrainpoolP384t1: idBrainpoolP384t1, idBrainpoolP512r1: idBrainpoolP512r1, idBrainpoolP512t1: idBrainpoolP512t1, idX25519: idX25519, idX448: idX448, idEd25519: idEd25519, idEd448: idEd448 }); class EcCurves { constructor() { } static register(item) { const oid = new ObjectIdentifier(); oid.value = item.id; const raw = AsnConvert.serialize(oid); this.items.push({ ...item, raw, }); this.names.push(item.name); } static find(nameOrId) { nameOrId = nameOrId.toUpperCase(); for (const item of this.items) { if (item.name.toUpperCase() === nameOrId || item.id.toUpperCase() === nameOrId) { return item; } } return null; } static get(nameOrId) { const res = this.find(nameOrId); if (!res) { throw new Error(`Unsupported EC named curve '${nameOrId}'`); } return res; } } EcCurves.items = []; EcCurves.names = []; EcCurves.register({ name: "P-256", id: idSecp256r1, size: 256 }); EcCurves.register({ name: "P-384", id: idSecp384r1, size: 384 }); EcCurves.register({ name: "P-521", id: idSecp521r1, size: 521 }); EcCurves.register({ name: "K-256", id: idSecp256k1, size: 256 }); EcCurves.register({ name: "brainpoolP160r1", id: idBrainpoolP160r1, size: 160 }); EcCurves.register({ name: "brainpoolP160t1", id: idBrainpoolP160t1, size: 160 }); EcCurves.register({ name: "brainpoolP192r1", id: idBrainpoolP192r1, size: 192 }); EcCurves.register({ name: "brainpoolP192t1", id: idBrainpoolP192t1, size: 192 }); EcCurves.register({ name: "brainpoolP224r1", id: idBrainpoolP224r1, size: 224 }); EcCurves.register({ name: "brainpoolP224t1", id: idBrainpoolP224t1, size: 224 }); EcCurves.register({ name: "brainpoolP256r1", id: idBrainpoolP256r1, size: 256 }); EcCurves.register({ name: "brainpoolP256t1", id: idBrainpoolP256t1, size: 256 }); EcCurves.register({ name: "brainpoolP320r1", id: idBrainpoolP320r1, size: 320 }); EcCurves.register({ name: "brainpoolP320t1", id: idBrainpoolP320t1, size: 320 }); EcCurves.register({ name: "brainpoolP384r1", id: idBrainpoolP384r1, size: 384 }); EcCurves.register({ name: "brainpoolP384t1", id: idBrainpoolP384t1, size: 384 }); EcCurves.register({ name: "brainpoolP512r1", id: idBrainpoolP512r1, size: 512 }); EcCurves.register({ name: "brainpoolP512t1", id: idBrainpoolP512t1, size: 512 }); class HmacProvider$1 extends ProviderCrypto { constructor() { super(...arguments); this.name = "HMAC"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["sign", "verify"]; } getDefaultLength(algName) { switch (algName.toUpperCase()) { case "SHA-1": case "SHA-256": case "SHA-384": case "SHA-512": return 512; default: throw new Error(`Unknown algorithm name '${algName}'`); } } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); if ("length" in algorithm) { if (typeof algorithm.length !== "number") { throw new TypeError("length: Is not a Number"); } if (algorithm.length < 1) { throw new RangeError("length: Number is out of range"); } } } checkImportParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); } } class Pbkdf2Provider$1 extends ProviderCrypto { constructor() { super(...arguments); this.name = "PBKDF2"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["deriveBits", "deriveKey"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "salt"); if (!(algorithm.salt instanceof ArrayBuffer || ArrayBuffer.isView(algorithm.salt))) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } this.checkRequiredProperty(algorithm, "iterations"); if (typeof algorithm.iterations !== "number") { throw new TypeError("iterations: Is not a Number"); } if (algorithm.iterations < 1) { throw new TypeError("iterations: Is less than 1"); } } checkImportKey(format, keyData, algorithm, extractable, keyUsages, ...args) { super.checkImportKey(format, keyData, algorithm, extractable, keyUsages); if (extractable) { throw new SyntaxError("extractable: Must be 'false'"); } } } class HkdfProvider$1 extends ProviderCrypto { constructor() { super(...arguments); this.name = "HKDF"; this.hashAlgorithms = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]; this.usages = ["deriveKey", "deriveBits"]; } checkAlgorithmParams(algorithm) { this.checkRequiredProperty(algorithm, "hash"); this.checkHashAlgorithm(algorithm.hash, this.hashAlgorithms); this.checkRequiredProperty(algorithm, "salt"); if (!BufferSourceConverter.isBufferSource(algorithm.salt)) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } this.checkRequiredProperty(algorithm, "info"); if (!BufferSourceConverter.isBufferSource(algorithm.info)) { throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'"); } } checkImportKey(format, keyData, algorithm, extractable, keyUsages, ...args) { super.checkImportKey(format, keyData, algorithm, extractable, keyUsages); if (extractable) { throw new SyntaxError("extractable: Must be 'false'"); } } } class ShakeProvider extends ProviderCrypto { constructor() { super(...arguments); this.usages = []; this.defaultLength = 0; } digest(...args) { args[0] = { length: this.defaultLength, ...args[0] }; return super.digest.apply(this, args); } checkDigest(algorithm, data) { super.checkDigest(algorithm, data); const length = algorithm.length || 0; if (typeof length !== "number") { throw new TypeError("length: Is not a Number"); } if (length < 0) { throw new TypeError("length: Is negative"); } } } class Shake128Provider$1 extends ShakeProvider { constructor() { super(...arguments); this.name = "shake128"; this.defaultLength = 16; } } class Shake256Provider$1 extends ShakeProvider { constructor() { super(...arguments); this.name = "shake256"; this.defaultLength = 32; } } class Crypto$1 { get [Symbol.toStringTag]() { return "Crypto"; } randomUUID() { const b = this.getRandomValues(new Uint8Array(16)); b[6] = (b[6] & 0x0f) | 0x40; b[8] = (b[8] & 0x3f) | 0x80; const uuid = Convert.ToHex(b).toLowerCase(); return `${uuid.substring(0, 8)}-${uuid.substring(8, 12)}-${uuid.substring(12, 16)}-${uuid.substring(16)}`; } } class ProviderStorage { constructor() { this.items = {}; } get(algorithmName) { return this.items[algorithmName.toLowerCase()] || null; } set(provider) { this.items[provider.name.toLowerCase()] = provider; } removeAt(algorithmName) { const provider = this.get(algorithmName.toLowerCase()); if (provider) { delete this.items[algorithmName]; } return provider; } has(name) { return !!this.get(name); } get length() { return Object.keys(this.items).length; } get algorithms() { const algorithms = []; for (const key in this.items) { const provider = this.items[key]; algorithms.push(provider.name); } return algorithms.sort(); } } class SubtleCrypto$1 { constructor() { this.providers = new ProviderStorage(); } static isHashedAlgorithm(data) { return data && typeof data === "object" && "name" in data && "hash" in data ? true : false; } get [Symbol.toStringTag]() { return "SubtleCrypto"; } async digest(...args) { this.checkRequiredArguments(args, 2, "digest"); const [algorithm, data, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.digest(preparedAlgorithm, preparedData, ...params); return result; } async generateKey(...args) { this.checkRequiredArguments(args, 3, "generateKey"); const [algorithm, extractable, keyUsages, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.generateKey({ ...preparedAlgorithm, name: provider.name }, extractable, keyUsages, ...params); return result; } async sign(...args) { this.checkRequiredArguments(args, 3, "sign"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.sign({ ...preparedAlgorithm, name: provider.name }, key, preparedData, ...params); return result; } async verify(...args) { this.checkRequiredArguments(args, 4, "verify"); const [algorithm, key, signature, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = BufferSourceConverter.toArrayBuffer(data); const preparedSignature = BufferSourceConverter.toArrayBuffer(signature); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.verify({ ...preparedAlgorithm, name: provider.name }, key, preparedSignature, preparedData, ...params); return result; } async encrypt(...args) { this.checkRequiredArguments(args, 3, "encrypt"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.encrypt({ ...preparedAlgorithm, name: provider.name }, key, preparedData, { keyUsage: true }, ...params); return result; } async decrypt(...args) { this.checkRequiredArguments(args, 3, "decrypt"); const [algorithm, key, data, ...params] = args; this.checkCryptoKey(key); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const preparedData = BufferSourceConverter.toArrayBuffer(data); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.decrypt({ ...preparedAlgorithm, name: provider.name }, key, preparedData, { keyUsage: true }, ...params); return result; } async deriveBits(...args) { this.checkRequiredArguments(args, 3, "deriveBits"); const [algorithm, baseKey, length, ...params] = args; this.checkCryptoKey(baseKey); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); const result = await provider.deriveBits({ ...preparedAlgorithm, name: provider.name }, baseKey, length, { keyUsage: true }, ...params); return result; } async deriveKey(...args) { this.checkRequiredArguments(args, 5, "deriveKey"); const [algorithm, baseKey, derivedKeyType, extractable, keyUsages, ...params] = args; const preparedDerivedKeyType = this.prepareAlgorithm(derivedKeyType); const importProvider = this.getProvider(preparedDerivedKeyType.name); importProvider.checkDerivedKeyParams(preparedDerivedKeyType); const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); provider.checkCryptoKey(baseKey, "deriveKey"); const derivedBits = await provider.deriveBits({ ...preparedAlgorithm, name: provider.name }, baseKey, derivedKeyType.length || 512, { keyUsage: false }, ...params); return this.importKey("raw", derivedBits, derivedKeyType, extractable, keyUsages, ...params); } async exportKey(...args) { this.checkRequiredArguments(args, 2, "exportKey"); const [format, key, ...params] = args; this.checkCryptoKey(key); const provider = this.getProvider(key.algorithm.name); const result = await provider.exportKey(format, key, ...params); return result; } async importKey(...args) { this.checkRequiredArguments(args, 5, "importKey"); const [format, keyData, algorithm, extractable, keyUsages, ...params] = args; const preparedAlgorithm = this.prepareAlgorithm(algorithm); const provider = this.getProvider(preparedAlgorithm.name); if (["pkcs8", "spki", "raw"].indexOf(format) !== -1) { const preparedData = BufferSourceConverter.toArrayBuffer(keyData); return provider.importKey(format, preparedData, { ...preparedAlgorithm, name: provider.name }, extractable, keyUsages, ...params); } else { if (!keyData.kty) { throw new TypeError("keyData: Is not JSON"); } } return provider.importKey(format, keyData, { ...preparedAlgorithm, name: provider.name }, extractable, keyUsages, ...params); } async wrapKey(format, key, wrappingKey, wrapAlgorithm, ...args) { let keyData = await this.exportKey(format, key, ...args); if (format === "jwk") { const json = JSON.stringify(keyData); keyData = Convert.FromUtf8String(json); } const preparedAlgorithm = this.prepareAlgorithm(wrapAlgorithm); const preparedData = BufferSourceConverter.toArrayBuffer(keyData); const provider = this.getProvider(preparedAlgorithm.name); return provider.encrypt({ ...preparedAlgorithm, name: provider.name }, wrappingKey, preparedData, { keyUsage: false }, ...args); } async unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages, ...args) { const preparedAlgorithm = this.prepareAlgorithm(unwrapAlgorithm); const preparedData = BufferSourceConverter.toArrayBuffer(wrappedKey); const provider = this.getProvider(preparedAlgorithm.name); let keyData = await provider.decrypt({ ...preparedAlgorithm, name: provider.name }, unwrappingKey, preparedData, { keyUsage: false }, ...args); if (format === "jwk") { try { keyData = JSON.parse(Convert.ToUtf8String(keyData)); } catch (e) { const error = new TypeError("wrappedKey: Is not a JSON"); error.internal = e; throw error; } } return this.importKey(format, keyData, unwrappedKeyAlgorithm, extractable, keyUsages, ...args); } checkRequiredArguments(args, size, methodName) { if (args.length < size) { throw new TypeError(`Failed to execute '${methodName}' on 'SubtleCrypto': ${size} arguments required, but only ${args.length} present`); } } prepareAlgorithm(algorithm) { if (typeof algorithm === "string") { return { name: algorithm, }; } if (SubtleCrypto$1.isHashedAlgorithm(algorithm)) { const preparedAlgorithm = { ...algorithm }; preparedAlgorithm.hash = this.prepareAlgorithm(algorithm.hash); return preparedAlgorithm; } return { ...algorithm }; } getProvider(name) { const provider = this.providers.get(name); if (!provider) { throw new AlgorithmError("Unrecognized name"); } return provider; } checkCryptoKey(key) { if (!(key instanceof CryptoKey$1)) { throw new TypeError(`Key is not of type 'CryptoKey'`); } } } /*! Copyright (c) Peculiar Ventures, LLC */ const JsonBase64UrlConverter = { fromJSON: (value) => Buffer.from(Convert.FromBase64Url(value)), toJSON: (value) => Convert.ToBase64Url(value), }; class CryptoKey extends CryptoKey$1 { constructor() { super(...arguments); this.data = Buffer.alloc(0); this.algorithm = { name: "" }; this.extractable = false; this.type = "secret"; this.usages = []; this.kty = "oct"; this.alg = ""; } } __decorate([ JsonProp({ name: "ext", type: JsonPropTypes.Boolean, optional: true }) ], CryptoKey.prototype, "extractable", void 0); __decorate([ JsonProp({ name: "key_ops", type: JsonPropTypes.String, repeated: true, optional: true }) ], CryptoKey.prototype, "usages", void 0); __decorate([ JsonProp({ type: JsonPropTypes.String }) ], CryptoKey.prototype, "kty", void 0); __decorate([ JsonProp({ type: JsonPropTypes.String, optional: true }) ], CryptoKey.prototype, "alg", void 0); class SymmetricKey extends CryptoKey { constructor() { super(...arguments); this.kty = "oct"; this.type = "secret"; } } class AsymmetricKey extends CryptoKey { } class AesCryptoKey extends SymmetricKey { get alg() { switch (this.algorithm.name.toUpperCase()) { case "AES-CBC": return `A${this.algorithm.length}CBC`; case "AES-CTR": return `A${this.algorithm.length}CTR`; case "AES-GCM": return `A${this.algorithm.length}GCM`; case "AES-KW": return `A${this.algorithm.length}KW`; case "AES-CMAC": return `A${this.algorithm.length}CMAC`; case "AES-ECB": return `A${this.algorithm.length}ECB`; default: throw new AlgorithmError("Unsupported algorithm name"); } } set alg(value) { } } __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], AesCryptoKey.prototype, "data", void 0); const keyStorage = new WeakMap(); function getCryptoKey(key) { const res = keyStorage.get(key); if (!res) { throw new OperationError("Cannot get CryptoKey from secure storage"); } return res; } function setCryptoKey(value) { const key = CryptoKey$1.create(value.algorithm, value.type, value.extractable, value.usages); Object.freeze(key); keyStorage.set(key, value); return key; } class AesCrypto { static async generateKey(algorithm, extractable, keyUsages) { const key = new AesCryptoKey(); key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; key.data = crypto__default__default.randomBytes(algorithm.length >> 3); return key; } static async exportKey(format, key) { if (!(key instanceof AesCryptoKey)) { throw new Error("key: Is not AesCryptoKey"); } switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "raw": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } static async importKey(format, keyData, algorithm, extractable, keyUsages) { let key; switch (format.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: AesCryptoKey }); break; case "raw": key = new AesCryptoKey(); key.data = Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = algorithm; key.algorithm.length = key.data.length << 3; key.extractable = extractable; key.usages = keyUsages; switch (key.algorithm.length) { case 128: case 192: case 256: break; default: throw new OperationError("keyData: Is wrong key length"); } return key; } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "AES-CBC": return this.encryptAesCBC(algorithm, key, Buffer.from(data)); case "AES-CTR": return this.encryptAesCTR(algorithm, key, Buffer.from(data)); case "AES-GCM": return this.encryptAesGCM(algorithm, key, Buffer.from(data)); case "AES-KW": return this.encryptAesKW(algorithm, key, Buffer.from(data)); case "AES-ECB": return this.encryptAesECB(algorithm, key, Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { if (!(key instanceof AesCryptoKey)) { throw new Error("key: Is not AesCryptoKey"); } switch (algorithm.name.toUpperCase()) { case "AES-CBC": return this.decryptAesCBC(algorithm, key, Buffer.from(data)); case "AES-CTR": return this.decryptAesCTR(algorithm, key, Buffer.from(data)); case "AES-GCM": return this.decryptAesGCM(algorithm, key, Buffer.from(data)); case "AES-KW": return this.decryptAesKW(algorithm, key, Buffer.from(data)); case "AES-ECB": return this.decryptAesECB(algorithm, key, Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async encryptAesCBC(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`aes-${key.algorithm.length}-cbc`, key.data, new Uint8Array(algorithm.iv)); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesCBC(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`aes-${key.algorithm.length}-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesCTR(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`aes-${key.algorithm.length}-ctr`, key.data, Buffer.from(algorithm.counter)); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesCTR(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`aes-${key.algorithm.length}-ctr`, key.data, new Uint8Array(algorithm.counter)); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesGCM(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`aes-${key.algorithm.length}-gcm`, key.data, Buffer.from(algorithm.iv), { authTagLength: (algorithm.tagLength || 128) >> 3, }); if (algorithm.additionalData) { cipher.setAAD(Buffer.from(algorithm.additionalData)); } let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final(), cipher.getAuthTag()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesGCM(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`aes-${key.algorithm.length}-gcm`, key.data, new Uint8Array(algorithm.iv)); const tagLength = (algorithm.tagLength || 128) >> 3; const enc = data.slice(0, data.length - tagLength); const tag = data.slice(data.length - tagLength); if (algorithm.additionalData) { decipher.setAAD(Buffer.from(algorithm.additionalData)); } decipher.setAuthTag(tag); let dec = decipher.update(enc); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesKW(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`id-aes${key.algorithm.length}-wrap`, key.data, this.AES_KW_IV); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); return new Uint8Array(enc).buffer; } static async decryptAesKW(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`id-aes${key.algorithm.length}-wrap`, key.data, this.AES_KW_IV); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptAesECB(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`aes-${key.algorithm.length}-ecb`, key.data, new Uint8Array(0)); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptAesECB(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`aes-${key.algorithm.length}-ecb`, key.data, new Uint8Array(0)); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } } AesCrypto.AES_KW_IV = Buffer.from("A6A6A6A6A6A6A6A6", "hex"); class AesCbcProvider extends AesCbcProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } const zero = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); const rb = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135]); const blockSize = 16; function bitShiftLeft(buffer) { const shifted = Buffer.alloc(buffer.length); const last = buffer.length - 1; for (let index = 0; index < last; index++) { shifted[index] = buffer[index] << 1; if (buffer[index + 1] & 0x80) { shifted[index] += 0x01; } } shifted[last] = buffer[last] << 1; return shifted; } function xor(a, b) { const length = Math.min(a.length, b.length); const output = Buffer.alloc(length); for (let index = 0; index < length; index++) { output[index] = a[index] ^ b[index]; } return output; } function aes(key, message) { const cipher = crypto__default.createCipheriv(`aes${key.length << 3}`, key, zero); const result = cipher.update(message); cipher.final(); return result; } function getMessageBlock(message, blockIndex) { const block = Buffer.alloc(blockSize); const start = blockIndex * blockSize; const end = start + blockSize; message.copy(block, 0, start, end); return block; } function getPaddedMessageBlock(message, blockIndex) { const block = Buffer.alloc(blockSize); const start = blockIndex * blockSize; const end = message.length; block.fill(0); message.copy(block, 0, start, end); block[end - start] = 0x80; return block; } function generateSubkeys(key) { const l = aes(key, zero); let subkey1 = bitShiftLeft(l); if (l[0] & 0x80) { subkey1 = xor(subkey1, rb); } let subkey2 = bitShiftLeft(subkey1); if (subkey1[0] & 0x80) { subkey2 = xor(subkey2, rb); } return { subkey1, subkey2 }; } function aesCmac(key, message) { const subkeys = generateSubkeys(key); let blockCount = Math.ceil(message.length / blockSize); let lastBlockCompleteFlag; let lastBlock; if (blockCount === 0) { blockCount = 1; lastBlockCompleteFlag = false; } else { lastBlockCompleteFlag = (message.length % blockSize === 0); } const lastBlockIndex = blockCount - 1; if (lastBlockCompleteFlag) { lastBlock = xor(getMessageBlock(message, lastBlockIndex), subkeys.subkey1); } else { lastBlock = xor(getPaddedMessageBlock(message, lastBlockIndex), subkeys.subkey2); } let x = zero; let y; for (let index = 0; index < lastBlockIndex; index++) { y = xor(x, getMessageBlock(message, index)); x = aes(key, y); } y = xor(lastBlock, x); return aes(key, y); } class AesCmacProvider extends AesCmacProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } async onSign(algorithm, key, data) { const result = aesCmac(getCryptoKey(key).data, Buffer.from(data)); return new Uint8Array(result).buffer; } async onVerify(algorithm, key, signature, data) { const signature2 = await this.sign(algorithm, key, data); return Buffer.from(signature).compare(Buffer.from(signature2)) === 0; } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } class AesCtrProvider extends AesCtrProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } class AesGcmProvider extends AesGcmProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } class AesKwProvider extends AesKwProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const res = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(res); } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } class AesEcbProvider extends AesEcbProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const key = await AesCrypto.generateKey({ name: this.name, length: algorithm.length, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return AesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return AesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return AesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const res = await AesCrypto.importKey(format, keyData, { name: algorithm.name }, extractable, keyUsages); return setCryptoKey(res); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof AesCryptoKey)) { throw new TypeError("key: Is not a AesCryptoKey"); } } } class DesCryptoKey extends SymmetricKey { get alg() { switch (this.algorithm.name.toUpperCase()) { case "DES-CBC": return `DES-CBC`; case "DES-EDE3-CBC": return `3DES-CBC`; default: throw new AlgorithmError("Unsupported algorithm name"); } } set alg(value) { } } __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], DesCryptoKey.prototype, "data", void 0); class DesCrypto { static async generateKey(algorithm, extractable, keyUsages) { const key = new DesCryptoKey(); key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; key.data = crypto__default__default.randomBytes(algorithm.length >> 3); return key; } static async exportKey(format, key) { switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "raw": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } static async importKey(format, keyData, algorithm, extractable, keyUsages) { let key; switch (format.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: DesCryptoKey }); break; case "raw": key = new DesCryptoKey(); key.data = Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = algorithm; key.extractable = extractable; key.usages = keyUsages; return key; } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "DES-CBC": return this.encryptDesCBC(algorithm, key, Buffer.from(data)); case "DES-EDE3-CBC": return this.encryptDesEDE3CBC(algorithm, key, Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { if (!(key instanceof DesCryptoKey)) { throw new Error("key: Is not DesCryptoKey"); } switch (algorithm.name.toUpperCase()) { case "DES-CBC": return this.decryptDesCBC(algorithm, key, Buffer.from(data)); case "DES-EDE3-CBC": return this.decryptDesEDE3CBC(algorithm, key, Buffer.from(data)); default: throw new OperationError("algorithm: Is not recognized"); } } static async encryptDesCBC(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`des-cbc`, key.data, new Uint8Array(algorithm.iv)); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptDesCBC(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`des-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } static async encryptDesEDE3CBC(algorithm, key, data) { const cipher = crypto__default__default.createCipheriv(`des-ede3-cbc`, key.data, Buffer.from(algorithm.iv)); let enc = cipher.update(data); enc = Buffer.concat([enc, cipher.final()]); const res = new Uint8Array(enc).buffer; return res; } static async decryptDesEDE3CBC(algorithm, key, data) { const decipher = crypto__default__default.createDecipheriv(`des-ede3-cbc`, key.data, new Uint8Array(algorithm.iv)); let dec = decipher.update(data); dec = Buffer.concat([dec, decipher.final()]); return new Uint8Array(dec).buffer; } } class DesCbcProvider extends DesProvider { constructor() { super(...arguments); this.keySizeBits = 64; this.ivSize = 8; this.name = "DES-CBC"; } async onGenerateKey(algorithm, extractable, keyUsages) { const key = await DesCrypto.generateKey({ name: this.name, length: this.keySizeBits, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return DesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return DesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return DesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await DesCrypto.importKey(format, keyData, { name: this.name, length: this.keySizeBits }, extractable, keyUsages); if (key.data.length !== (this.keySizeBits >> 3)) { throw new OperationError("keyData: Wrong key size"); } return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof DesCryptoKey)) { throw new TypeError("key: Is not a DesCryptoKey"); } } } class DesEde3CbcProvider extends DesProvider { constructor() { super(...arguments); this.keySizeBits = 192; this.ivSize = 8; this.name = "DES-EDE3-CBC"; } async onGenerateKey(algorithm, extractable, keyUsages) { const key = await DesCrypto.generateKey({ name: this.name, length: this.keySizeBits, }, extractable, keyUsages); return setCryptoKey(key); } async onEncrypt(algorithm, key, data) { return DesCrypto.encrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onDecrypt(algorithm, key, data) { return DesCrypto.decrypt(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onExportKey(format, key) { return DesCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await DesCrypto.importKey(format, keyData, { name: this.name, length: this.keySizeBits }, extractable, keyUsages); if (key.data.length !== (this.keySizeBits >> 3)) { throw new OperationError("keyData: Wrong key size"); } return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof DesCryptoKey)) { throw new TypeError("key: Is not a DesCryptoKey"); } } } function getJwkAlgorithm(algorithm) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": { const mdSize = /(\d+)$/.exec(algorithm.hash.name)[1]; return `RSA-OAEP${mdSize !== "1" ? `-${mdSize}` : ""}`; } case "RSASSA-PKCS1-V1_5": return `RS${/(\d+)$/.exec(algorithm.hash.name)[1]}`; case "RSA-PSS": return `PS${/(\d+)$/.exec(algorithm.hash.name)[1]}`; case "RSA-PKCS1": return `RS1`; default: throw new OperationError("algorithm: Is not recognized"); } } class RsaPrivateKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.RsaPrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "RSA", alg: getJwkAlgorithm(this.algorithm), key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { const key = JsonParser.fromJSON(json, { targetSchema: index$1.RsaPrivateKey }); const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.privateKeyAlgorithm.parameters = null; keyInfo.privateKey = AsnSerializer.serialize(key); this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); } } class RsaPublicKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return AsnParser.parse(keyInfo.publicKey, index$1.RsaPublicKey); } toJSON() { const key = this.getKey(); const json = { kty: "RSA", alg: getJwkAlgorithm(this.algorithm), key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { const key = JsonParser.fromJSON(json, { targetSchema: index$1.RsaPublicKey }); const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.publicKeyAlgorithm.parameters = null; keyInfo.publicKey = AsnSerializer.serialize(key); this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); } } class RsaCrypto { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new RsaPrivateKey(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new RsaPublicKey(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const publicExponent = Buffer.concat([ Buffer.alloc(4 - algorithm.publicExponent.byteLength, 0), Buffer.from(algorithm.publicExponent), ]).readInt32BE(0); const keys = crypto__default__default.generateKeyPairSync("rsa", { modulusLength: algorithm.modulusLength, publicExponent, publicKeyEncoding: { format: "der", type: "spki", }, privateKeyEncoding: { format: "der", type: "pkcs8", }, }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey, }; return res; } static async exportKey(format, key) { switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; default: throw new OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'"); } } static async importKey(format, keyData, algorithm, extractable, keyUsages) { switch (format.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.RsaPrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.RsaPublicKey }); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); const asnKey = AsnParser.parse(keyInfo.publicKey, index$1.RsaPublicKey); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.RsaPrivateKey); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'"); } } static async sign(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-PSS": case "RSASSA-PKCS1-V1_5": return this.signRsa(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static async verify(algorithm, key, signature, data) { switch (algorithm.name.toUpperCase()) { case "RSA-PSS": case "RSASSA-PKCS1-V1_5": return this.verifySSA(algorithm, key, data, signature); default: throw new OperationError("algorithm: Is not recognized"); } } static async encrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": return this.encryptOAEP(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static async decrypt(algorithm, key, data) { switch (algorithm.name.toUpperCase()) { case "RSA-OAEP": return this.decryptOAEP(algorithm, key, data); default: throw new OperationError("algorithm: Is not recognized"); } } static importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.privateKeyAlgorithm.parameters = null; keyInfo.privateKey = AsnSerializer.serialize(asnKey); const key = new RsaPrivateKey(); key.data = Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.algorithm.publicExponent = new Uint8Array(asnKey.publicExponent); key.algorithm.modulusLength = asnKey.modulus.byteLength << 3; key.extractable = extractable; key.usages = keyUsages; return key; } static importPublicKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.113549.1.1.1"; keyInfo.publicKeyAlgorithm.parameters = null; keyInfo.publicKey = AsnSerializer.serialize(asnKey); const key = new RsaPublicKey(); key.data = Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.algorithm.publicExponent = new Uint8Array(asnKey.publicExponent); key.algorithm.modulusLength = asnKey.modulus.byteLength << 3; key.extractable = extractable; key.usages = keyUsages; return key; } static getCryptoAlgorithm(alg) { switch (alg.hash.name.toUpperCase()) { case "SHA-1": return "RSA-SHA1"; case "SHA-256": return "RSA-SHA256"; case "SHA-384": return "RSA-SHA384"; case "SHA-512": return "RSA-SHA512"; case "SHA3-256": return "RSA-SHA3-256"; case "SHA3-384": return "RSA-SHA3-384"; case "SHA3-512": return "RSA-SHA3-512"; default: throw new OperationError("algorithm.hash: Is not recognized"); } } static signRsa(algorithm, key, data) { const cryptoAlg = this.getCryptoAlgorithm(key.algorithm); const signer = crypto__default__default.createSign(cryptoAlg); signer.update(Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY-----\n${key.data.toString("base64")}\n-----END PRIVATE KEY-----`; } const options = { key: key.pem, }; if (algorithm.name.toUpperCase() === "RSA-PSS") { options.padding = crypto__default__default.constants.RSA_PKCS1_PSS_PADDING; options.saltLength = algorithm.saltLength; } const signature = signer.sign(options); return new Uint8Array(signature).buffer; } static verifySSA(algorithm, key, data, signature) { const cryptoAlg = this.getCryptoAlgorithm(key.algorithm); const signer = crypto__default__default.createVerify(cryptoAlg); signer.update(Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY-----\n${key.data.toString("base64")}\n-----END PUBLIC KEY-----`; } const options = { key: key.pem, }; if (algorithm.name.toUpperCase() === "RSA-PSS") { options.padding = crypto__default__default.constants.RSA_PKCS1_PSS_PADDING; options.saltLength = algorithm.saltLength; } const ok = signer.verify(options, signature); return ok; } static encryptOAEP(algorithm, key, data) { const options = { key: `-----BEGIN PUBLIC KEY-----\n${key.data.toString("base64")}\n-----END PUBLIC KEY-----`, padding: crypto__default__default.constants.RSA_PKCS1_OAEP_PADDING, }; if (algorithm.label) ; return new Uint8Array(crypto__default__default.publicEncrypt(options, data)).buffer; } static decryptOAEP(algorithm, key, data) { const options = { key: `-----BEGIN PRIVATE KEY-----\n${key.data.toString("base64")}\n-----END PRIVATE KEY-----`, padding: crypto__default__default.constants.RSA_PKCS1_OAEP_PADDING, }; if (algorithm.label) ; return new Uint8Array(crypto__default__default.privateDecrypt(options, data)).buffer; } } RsaCrypto.publicKeyUsages = ["verify", "encrypt", "wrapKey"]; RsaCrypto.privateKeyUsages = ["sign", "decrypt", "unwrapKey"]; class RsaSsaProvider extends RsaSsaProvider$1 { constructor() { super(...arguments); this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onSign(algorithm, key, data) { return RsaCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return RsaCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format, key) { return RsaCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey || internalKey instanceof RsaPublicKey)) { throw new TypeError("key: Is not RSA CryptoKey"); } } } class RsaPssProvider extends RsaPssProvider$1 { constructor() { super(...arguments); this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onSign(algorithm, key, data) { return RsaCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return RsaCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format, key) { return RsaCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey || internalKey instanceof RsaPublicKey)) { throw new TypeError("key: Is not RSA CryptoKey"); } } } class ShaCrypto { static size(algorithm) { switch (algorithm.name.toUpperCase()) { case "SHA-1": return 160; case "SHA-256": case "SHA3-256": return 256; case "SHA-384": case "SHA3-384": return 384; case "SHA-512": case "SHA3-512": return 512; default: throw new Error("Unrecognized name"); } } static getAlgorithmName(algorithm) { switch (algorithm.name.toUpperCase()) { case "SHA-1": return "sha1"; case "SHA-256": return "sha256"; case "SHA-384": return "sha384"; case "SHA-512": return "sha512"; case "SHA3-256": return "sha3-256"; case "SHA3-384": return "sha3-384"; case "SHA3-512": return "sha3-512"; default: throw new Error("Unrecognized name"); } } static digest(algorithm, data) { const hashAlg = this.getAlgorithmName(algorithm); const hash = crypto__default__default.createHash(hashAlg) .update(Buffer.from(data)).digest(); return new Uint8Array(hash).buffer; } } class RsaOaepProvider extends RsaOaepProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onEncrypt(algorithm, key, data) { const internalKey = getCryptoKey(key); const dataView = new Uint8Array(data); const keySize = Math.ceil(internalKey.algorithm.modulusLength >> 3); const hashSize = ShaCrypto.size(internalKey.algorithm.hash) >> 3; const dataLength = dataView.byteLength; const psLength = keySize - dataLength - 2 * hashSize - 2; if (dataLength > keySize - 2 * hashSize - 2) { throw new Error("Data too large"); } const message = new Uint8Array(keySize); const seed = message.subarray(1, hashSize + 1); const dataBlock = message.subarray(hashSize + 1); dataBlock.set(dataView, hashSize + psLength + 1); const labelHash = crypto__default__default.createHash(internalKey.algorithm.hash.name.replace("-", "")) .update(BufferSourceConverter.toUint8Array(algorithm.label || new Uint8Array(0))) .digest(); dataBlock.set(labelHash, 0); dataBlock[hashSize + psLength] = 1; crypto__default__default.randomFillSync(seed); const dataBlockMask = this.mgf1(internalKey.algorithm.hash, seed, dataBlock.length); for (let i = 0; i < dataBlock.length; i++) { dataBlock[i] ^= dataBlockMask[i]; } const seedMask = this.mgf1(internalKey.algorithm.hash, dataBlock, seed.length); for (let i = 0; i < seed.length; i++) { seed[i] ^= seedMask[i]; } if (!internalKey.pem) { internalKey.pem = `-----BEGIN PUBLIC KEY-----\n${internalKey.data.toString("base64")}\n-----END PUBLIC KEY-----`; } const pkcs0 = crypto__default__default.publicEncrypt({ key: internalKey.pem, padding: crypto__default__default.constants.RSA_NO_PADDING, }, Buffer.from(message)); return new Uint8Array(pkcs0).buffer; } async onDecrypt(algorithm, key, data) { const internalKey = getCryptoKey(key); const keySize = Math.ceil(internalKey.algorithm.modulusLength >> 3); const hashSize = ShaCrypto.size(internalKey.algorithm.hash) >> 3; const dataLength = data.byteLength; if (dataLength !== keySize) { throw new Error("Bad data"); } if (!internalKey.pem) { internalKey.pem = `-----BEGIN PRIVATE KEY-----\n${internalKey.data.toString("base64")}\n-----END PRIVATE KEY-----`; } let pkcs0 = crypto__default__default.privateDecrypt({ key: internalKey.pem, padding: crypto__default__default.constants.RSA_NO_PADDING, }, Buffer.from(data)); const z = pkcs0[0]; const seed = pkcs0.subarray(1, hashSize + 1); const dataBlock = pkcs0.subarray(hashSize + 1); if (z !== 0) { throw new Error("Decryption failed"); } const seedMask = this.mgf1(internalKey.algorithm.hash, dataBlock, seed.length); for (let i = 0; i < seed.length; i++) { seed[i] ^= seedMask[i]; } const dataBlockMask = this.mgf1(internalKey.algorithm.hash, seed, dataBlock.length); for (let i = 0; i < dataBlock.length; i++) { dataBlock[i] ^= dataBlockMask[i]; } const labelHash = crypto__default__default.createHash(internalKey.algorithm.hash.name.replace("-", "")) .update(BufferSourceConverter.toUint8Array(algorithm.label || new Uint8Array(0))) .digest(); for (let i = 0; i < hashSize; i++) { if (labelHash[i] !== dataBlock[i]) { throw new Error("Decryption failed"); } } let psEnd = hashSize; for (; psEnd < dataBlock.length; psEnd++) { const psz = dataBlock[psEnd]; if (psz === 1) { break; } if (psz !== 0) { throw new Error("Decryption failed"); } } if (psEnd === dataBlock.length) { throw new Error("Decryption failed"); } pkcs0 = dataBlock.subarray(psEnd + 1); return new Uint8Array(pkcs0).buffer; } async onExportKey(format, key) { return RsaCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey || internalKey instanceof RsaPublicKey)) { throw new TypeError("key: Is not RSA CryptoKey"); } } mgf1(algorithm, seed, length = 0) { const hashSize = ShaCrypto.size(algorithm) >> 3; const mask = new Uint8Array(length); const counter = new Uint8Array(4); const chunks = Math.ceil(length / hashSize); for (let i = 0; i < chunks; i++) { counter[0] = i >>> 24; counter[1] = (i >>> 16) & 255; counter[2] = (i >>> 8) & 255; counter[3] = i & 255; const submask = mask.subarray(i * hashSize); let chunk = crypto__default__default.createHash(algorithm.name.replace("-", "")) .update(seed) .update(counter) .digest(); if (chunk.length > submask.length) { chunk = chunk.subarray(0, submask.length); } submask.set(chunk); } return mask; } } class RsaEsProvider extends ProviderCrypto { constructor() { super(...arguments); this.name = "RSAES-PKCS1-v1_5"; this.usages = { publicKey: ["encrypt", "wrapKey"], privateKey: ["decrypt", "unwrapKey"], }; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await RsaCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } checkGenerateKeyParams(algorithm) { this.checkRequiredProperty(algorithm, "publicExponent"); if (!(algorithm.publicExponent && algorithm.publicExponent instanceof Uint8Array)) { throw new TypeError("publicExponent: Missing or not a Uint8Array"); } const publicExponent = Convert.ToBase64(algorithm.publicExponent); if (!(publicExponent === "Aw==" || publicExponent === "AQAB")) { throw new TypeError("publicExponent: Must be [3] or [1,0,1]"); } this.checkRequiredProperty(algorithm, "modulusLength"); switch (algorithm.modulusLength) { case 1024: case 2048: case 4096: break; default: throw new TypeError("modulusLength: Must be 1024, 2048, or 4096"); } } async onEncrypt(algorithm, key, data) { const options = this.toCryptoOptions(key); const enc = crypto__default.publicEncrypt(options, new Uint8Array(data)); return new Uint8Array(enc).buffer; } async onDecrypt(algorithm, key, data) { const options = this.toCryptoOptions(key); const dec = crypto__default.privateDecrypt(options, new Uint8Array(data)); return new Uint8Array(dec).buffer; } async onExportKey(format, key) { return RsaCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await RsaCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof RsaPrivateKey || internalKey instanceof RsaPublicKey)) { throw new TypeError("key: Is not RSA CryptoKey"); } } toCryptoOptions(key) { const type = key.type.toUpperCase(); return { key: `-----BEGIN ${type} KEY-----\n${getCryptoKey(key).data.toString("base64")}\n-----END ${type} KEY-----`, padding: crypto__default.constants.RSA_PKCS1_PADDING, }; } } const namedOIDs = { "1.2.840.10045.3.1.7": "P-256", "P-256": "1.2.840.10045.3.1.7", "1.3.132.0.34": "P-384", "P-384": "1.3.132.0.34", "1.3.132.0.35": "P-521", "P-521": "1.3.132.0.35", "1.3.132.0.10": "K-256", "K-256": "1.3.132.0.10", "brainpoolP160r1": "1.3.36.3.3.2.8.1.1.1", "1.3.36.3.3.2.8.1.1.1": "brainpoolP160r1", "brainpoolP160t1": "1.3.36.3.3.2.8.1.1.2", "1.3.36.3.3.2.8.1.1.2": "brainpoolP160t1", "brainpoolP192r1": "1.3.36.3.3.2.8.1.1.3", "1.3.36.3.3.2.8.1.1.3": "brainpoolP192r1", "brainpoolP192t1": "1.3.36.3.3.2.8.1.1.4", "1.3.36.3.3.2.8.1.1.4": "brainpoolP192t1", "brainpoolP224r1": "1.3.36.3.3.2.8.1.1.5", "1.3.36.3.3.2.8.1.1.5": "brainpoolP224r1", "brainpoolP224t1": "1.3.36.3.3.2.8.1.1.6", "1.3.36.3.3.2.8.1.1.6": "brainpoolP224t1", "brainpoolP256r1": "1.3.36.3.3.2.8.1.1.7", "1.3.36.3.3.2.8.1.1.7": "brainpoolP256r1", "brainpoolP256t1": "1.3.36.3.3.2.8.1.1.8", "1.3.36.3.3.2.8.1.1.8": "brainpoolP256t1", "brainpoolP320r1": "1.3.36.3.3.2.8.1.1.9", "1.3.36.3.3.2.8.1.1.9": "brainpoolP320r1", "brainpoolP320t1": "1.3.36.3.3.2.8.1.1.10", "1.3.36.3.3.2.8.1.1.10": "brainpoolP320t1", "brainpoolP384r1": "1.3.36.3.3.2.8.1.1.11", "1.3.36.3.3.2.8.1.1.11": "brainpoolP384r1", "brainpoolP384t1": "1.3.36.3.3.2.8.1.1.12", "1.3.36.3.3.2.8.1.1.12": "brainpoolP384t1", "brainpoolP512r1": "1.3.36.3.3.2.8.1.1.13", "1.3.36.3.3.2.8.1.1.13": "brainpoolP512r1", "brainpoolP512t1": "1.3.36.3.3.2.8.1.1.14", "1.3.36.3.3.2.8.1.1.14": "brainpoolP512t1", }; function getOidByNamedCurve$1(namedCurve) { const oid = namedOIDs[namedCurve]; if (!oid) { throw new OperationError(`Cannot convert WebCrypto named curve '${namedCurve}' to OID`); } return oid; } class EcPrivateKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.EcPrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "EC", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.privateKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(json.crv))); const key = JsonParser.fromJSON(json, { targetSchema: index$1.EcPrivateKey }); keyInfo.privateKey = AsnSerializer.serialize(key); this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } } class EcPublicKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return new index$1.EcPublicKey(keyInfo.publicKey); } toJSON() { const key = this.getKey(); const json = { kty: "EC", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const key = JsonParser.fromJSON(json, { targetSchema: index$1.EcPublicKey }); const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.publicKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(json.crv))); keyInfo.publicKey = AsnSerializer.toASN(key).valueHex; this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } } class Sha1Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-1"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha256Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-256"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha384Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-384"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha512Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA-512"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha3256Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-256"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha3384Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-384"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class Sha3512Provider extends ProviderCrypto { constructor() { super(...arguments); this.name = "SHA3-512"; this.usages = []; } async onDigest(algorithm, data) { return ShaCrypto.digest(algorithm, data); } } class EcCrypto { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new EcPrivateKey(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new EcPublicKey(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const keys = crypto__default__default.generateKeyPairSync("ec", { namedCurve: this.getOpenSSLNamedCurve(algorithm.namedCurve), publicKeyEncoding: { format: "der", type: "spki", }, privateKeyEncoding: { format: "der", type: "pkcs8", }, }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey, }; return res; } static async sign(algorithm, key, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(algorithm.hash); const signer = crypto__default__default.createSign(cryptoAlg); signer.update(Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY-----\n${key.data.toString("base64")}\n-----END PRIVATE KEY-----`; } const options = { key: key.pem, }; const signature = signer.sign(options); const ecSignature = AsnParser.parse(signature, index$1.EcDsaSignature); const signatureRaw = EcUtils.encodeSignature(ecSignature, EcCurves.get(key.algorithm.namedCurve).size); return signatureRaw.buffer; } static async verify(algorithm, key, signature, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(algorithm.hash); const signer = crypto__default__default.createVerify(cryptoAlg); signer.update(Buffer.from(data)); if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY-----\n${key.data.toString("base64")}\n-----END PUBLIC KEY-----`; } const options = { key: key.pem, }; const ecSignature = new index$1.EcDsaSignature(); const namedCurve = EcCurves.get(key.algorithm.namedCurve); const signaturePoint = EcUtils.decodeSignature(signature, namedCurve.size); ecSignature.r = BufferSourceConverter.toArrayBuffer(signaturePoint.r); ecSignature.s = BufferSourceConverter.toArrayBuffer(signaturePoint.s); const ecSignatureRaw = Buffer.from(AsnSerializer.serialize(ecSignature)); const ok = signer.verify(options, ecSignatureRaw); return ok; } static async deriveBits(algorithm, baseKey, length) { const cryptoAlg = this.getOpenSSLNamedCurve(baseKey.algorithm.namedCurve); const ecdh = crypto__default__default.createECDH(cryptoAlg); const asnPrivateKey = AsnParser.parse(baseKey.data, index$1.PrivateKeyInfo); const asnEcPrivateKey = AsnParser.parse(asnPrivateKey.privateKey, index$1.EcPrivateKey); ecdh.setPrivateKey(Buffer.from(asnEcPrivateKey.privateKey)); const asnPublicKey = AsnParser.parse(algorithm.public.data, index$1.PublicKeyInfo); const bits = ecdh.computeSecret(Buffer.from(asnPublicKey.publicKey)); return new Uint8Array(bits).buffer.slice(0, length >> 3); } static async exportKey(format, key) { switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; case "raw": { const publicKeyInfo = AsnParser.parse(key.data, index$1.PublicKeyInfo); return publicKeyInfo.publicKey; } default: throw new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'"); } } static async importKey(format, keyData, algorithm, extractable, keyUsages) { switch (format.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.EcPrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.EcPublicKey }); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } } case "raw": { const asnKey = new index$1.EcPublicKey(keyData); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); const asnKey = new index$1.EcPublicKey(keyInfo.publicKey); this.assertKeyParameters(keyInfo.publicKeyAlgorithm.parameters, algorithm.namedCurve); return this.importPublicKey(asnKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.EcPrivateKey); this.assertKeyParameters(keyInfo.privateKeyAlgorithm.parameters, algorithm.namedCurve); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'"); } } static assertKeyParameters(parameters, namedCurve) { if (!parameters) { throw new CryptoError("Key info doesn't have required parameters"); } let namedCurveIdentifier = ""; try { namedCurveIdentifier = AsnParser.parse(parameters, index$1.ObjectIdentifier).value; } catch (e) { throw new CryptoError("Cannot read key info parameters"); } if (getOidByNamedCurve$1(namedCurve) !== namedCurveIdentifier) { throw new CryptoError("Key info parameter doesn't match to named curve"); } } static async importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; keyInfo.privateKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(getOidByNamedCurve$1(algorithm.namedCurve))); keyInfo.privateKey = AsnSerializer.serialize(asnKey); const key = new EcPrivateKey(); key.data = Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static async importPublicKey(asnKey, algorithm, extractable, keyUsages) { const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = "1.2.840.10045.2.1"; const namedCurve = getOidByNamedCurve$1(algorithm.namedCurve); keyInfo.publicKeyAlgorithm.parameters = AsnSerializer.serialize(new index$1.ObjectIdentifier(namedCurve)); keyInfo.publicKey = asnKey.value; const key = new EcPublicKey(); key.data = Buffer.from(AsnSerializer.serialize(keyInfo)); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static getOpenSSLNamedCurve(curve) { switch (curve.toUpperCase()) { case "P-256": return "prime256v1"; case "K-256": return "secp256k1"; case "P-384": return "secp384r1"; case "P-521": return "secp521r1"; default: return curve; } } } EcCrypto.publicKeyUsages = ["verify"]; EcCrypto.privateKeyUsages = ["sign", "deriveKey", "deriveBits"]; class EcdsaProvider extends EcdsaProvider$1 { constructor() { super(...arguments); this.namedCurves = EcCurves.names; this.hashAlgorithms = [ "SHA-1", "SHA-256", "SHA-384", "SHA-512", "shake128", "shake256", "SHA3-256", "SHA3-384", "SHA3-512" ]; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EcCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onSign(algorithm, key, data) { return EcCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return EcCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format, key) { return EcCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await EcCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof EcPrivateKey || internalKey instanceof EcPublicKey)) { throw new TypeError("key: Is not EC CryptoKey"); } } } class EcdhProvider extends EcdhProvider$1 { constructor() { super(...arguments); this.namedCurves = EcCurves.names; } async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EcCrypto.generateKey({ ...algorithm, name: this.name, }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onExportKey(format, key) { return EcCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await EcCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); const internalKey = getCryptoKey(key); if (!(internalKey instanceof EcPrivateKey || internalKey instanceof EcPublicKey)) { throw new TypeError("key: Is not EC CryptoKey"); } } async onDeriveBits(algorithm, baseKey, length) { const bits = await EcCrypto.deriveBits({ ...algorithm, public: getCryptoKey(algorithm.public) }, getCryptoKey(baseKey), length); return bits; } } const edOIDs = { [index$1.idEd448]: "Ed448", "ed448": index$1.idEd448, [index$1.idX448]: "X448", "x448": index$1.idX448, [index$1.idEd25519]: "Ed25519", "ed25519": index$1.idEd25519, [index$1.idX25519]: "X25519", "x25519": index$1.idX25519, }; function getOidByNamedCurve(namedCurve) { const oid = edOIDs[namedCurve.toLowerCase()]; if (!oid) { throw new OperationError(`Cannot convert WebCrypto named curve '${namedCurve}' to OID`); } return oid; } class EdPrivateKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "private"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PrivateKeyInfo); return AsnParser.parse(keyInfo.privateKey, index$1.CurvePrivateKey); } toJSON() { const key = this.getKey(); const json = { kty: "OKP", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, JsonSerializer.toJSON(key)); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } const keyInfo = new index$1.PrivateKeyInfo(); keyInfo.privateKeyAlgorithm.algorithm = getOidByNamedCurve(json.crv); const key = JsonParser.fromJSON(json, { targetSchema: index$1.CurvePrivateKey }); keyInfo.privateKey = AsnSerializer.serialize(key); this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } } class EdPublicKey extends AsymmetricKey { constructor() { super(...arguments); this.type = "public"; } getKey() { const keyInfo = AsnParser.parse(this.data, index$1.PublicKeyInfo); return keyInfo.publicKey; } toJSON() { const key = this.getKey(); const json = { kty: "OKP", crv: this.algorithm.namedCurve, key_ops: this.usages, ext: this.extractable, }; return Object.assign(json, { x: Convert.ToBase64Url(key) }); } fromJSON(json) { if (!json.crv) { throw new OperationError(`Cannot get named curve from JWK. Property 'crv' is required`); } if (!json.x) { throw new OperationError(`Cannot get property from JWK. Property 'x' is required`); } const keyInfo = new index$1.PublicKeyInfo(); keyInfo.publicKeyAlgorithm.algorithm = getOidByNamedCurve(json.crv); keyInfo.publicKey = Convert.FromBase64Url(json.x); this.data = Buffer.from(AsnSerializer.serialize(keyInfo)); return this; } } class EdCrypto { static async generateKey(algorithm, extractable, keyUsages) { const privateKey = new EdPrivateKey(); privateKey.algorithm = algorithm; privateKey.extractable = extractable; privateKey.usages = keyUsages.filter((usage) => this.privateKeyUsages.indexOf(usage) !== -1); const publicKey = new EdPublicKey(); publicKey.algorithm = algorithm; publicKey.extractable = true; publicKey.usages = keyUsages.filter((usage) => this.publicKeyUsages.indexOf(usage) !== -1); const type = algorithm.namedCurve.toLowerCase(); const keys = crypto__default__default.generateKeyPairSync(type, { publicKeyEncoding: { format: "der", type: "spki", }, privateKeyEncoding: { format: "der", type: "pkcs8", }, }); privateKey.data = keys.privateKey; publicKey.data = keys.publicKey; const res = { privateKey, publicKey, }; return res; } static async sign(algorithm, key, data) { if (!key.pem) { key.pem = `-----BEGIN PRIVATE KEY-----\n${key.data.toString("base64")}\n-----END PRIVATE KEY-----`; } const options = { key: key.pem, }; const signature = crypto__default__default.sign(null, Buffer.from(data), options); return BufferSourceConverter.toArrayBuffer(signature); } static async verify(algorithm, key, signature, data) { if (!key.pem) { key.pem = `-----BEGIN PUBLIC KEY-----\n${key.data.toString("base64")}\n-----END PUBLIC KEY-----`; } const options = { key: key.pem, }; const ok = crypto__default__default.verify(null, Buffer.from(data), options, Buffer.from(signature)); return ok; } static async deriveBits(algorithm, baseKey, length) { const publicKey = crypto__default__default.createPublicKey({ key: algorithm.public.data, format: "der", type: "spki", }); const privateKey = crypto__default__default.createPrivateKey({ key: baseKey.data, format: "der", type: "pkcs8", }); const bits = crypto__default__default.diffieHellman({ publicKey, privateKey, }); return new Uint8Array(bits).buffer.slice(0, length >> 3); } static async exportKey(format, key) { switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(key); case "pkcs8": case "spki": return new Uint8Array(key.data).buffer; case "raw": { const publicKeyInfo = AsnParser.parse(key.data, index$1.PublicKeyInfo); return publicKeyInfo.publicKey; } default: throw new OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'"); } } static async importKey(format, keyData, algorithm, extractable, keyUsages) { switch (format.toLowerCase()) { case "jwk": { const jwk = keyData; if (jwk.d) { const asnKey = JsonParser.fromJSON(keyData, { targetSchema: index$1.CurvePrivateKey }); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } else { if (!jwk.x) { throw new TypeError("keyData: Cannot get required 'x' filed"); } return this.importPublicKey(Convert.FromBase64Url(jwk.x), algorithm, extractable, keyUsages); } } case "raw": { return this.importPublicKey(keyData, algorithm, extractable, keyUsages); } case "spki": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PublicKeyInfo); return this.importPublicKey(keyInfo.publicKey, algorithm, extractable, keyUsages); } case "pkcs8": { const keyInfo = AsnParser.parse(new Uint8Array(keyData), index$1.PrivateKeyInfo); const asnKey = AsnParser.parse(keyInfo.privateKey, index$1.CurvePrivateKey); return this.importPrivateKey(asnKey, algorithm, extractable, keyUsages); } default: throw new OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'"); } } static importPrivateKey(asnKey, algorithm, extractable, keyUsages) { const key = new EdPrivateKey(); key.fromJSON({ crv: algorithm.namedCurve, d: Convert.ToBase64Url(asnKey.d), }); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } static async importPublicKey(asnKey, algorithm, extractable, keyUsages) { const key = new EdPublicKey(); key.fromJSON({ crv: algorithm.namedCurve, x: Convert.ToBase64Url(asnKey), }); key.algorithm = Object.assign({}, algorithm); key.extractable = extractable; key.usages = keyUsages; return key; } } EdCrypto.publicKeyUsages = ["verify"]; EdCrypto.privateKeyUsages = ["sign", "deriveKey", "deriveBits"]; class EdDsaProvider extends EdDsaProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EdCrypto.generateKey({ name: this.name, namedCurve: algorithm.namedCurve.replace(/^ed/i, "Ed"), }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onSign(algorithm, key, data) { return EdCrypto.sign(algorithm, getCryptoKey(key), new Uint8Array(data)); } async onVerify(algorithm, key, signature, data) { return EdCrypto.verify(algorithm, getCryptoKey(key), new Uint8Array(signature), new Uint8Array(data)); } async onExportKey(format, key) { return EdCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await EdCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } } class EcdhEsProvider extends EcdhEsProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const keys = await EdCrypto.generateKey({ name: this.name, namedCurve: algorithm.namedCurve.toUpperCase(), }, extractable, keyUsages); return { privateKey: setCryptoKey(keys.privateKey), publicKey: setCryptoKey(keys.publicKey), }; } async onDeriveBits(algorithm, baseKey, length) { const bits = await EdCrypto.deriveBits({ ...algorithm, public: getCryptoKey(algorithm.public) }, getCryptoKey(baseKey), length); return bits; } async onExportKey(format, key) { return EdCrypto.exportKey(format, getCryptoKey(key)); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { const key = await EdCrypto.importKey(format, keyData, { ...algorithm, name: this.name }, extractable, keyUsages); return setCryptoKey(key); } } class PbkdfCryptoKey extends CryptoKey { } class Pbkdf2Provider extends Pbkdf2Provider$1 { async onDeriveBits(algorithm, baseKey, length) { return new Promise((resolve, reject) => { const salt = BufferSourceConverter.toArrayBuffer(algorithm.salt); const hash = algorithm.hash.name.replace("-", ""); crypto__default__default.pbkdf2(getCryptoKey(baseKey).data, Buffer.from(salt), algorithm.iterations, length >> 3, hash, (err, derivedBits) => { if (err) { reject(err); } else { resolve(new Uint8Array(derivedBits).buffer); } }); }); } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { if (format === "raw") { const key = new PbkdfCryptoKey(); key.data = Buffer.from(keyData); key.algorithm = { name: this.name }; key.extractable = false; key.usages = keyUsages; return setCryptoKey(key); } throw new OperationError("format: Must be 'raw'"); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof PbkdfCryptoKey)) { throw new TypeError("key: Is not PBKDF CryptoKey"); } } } class HmacCryptoKey extends CryptoKey { get alg() { const hash = this.algorithm.hash.name.toUpperCase(); return `HS${hash.replace("SHA-", "")}`; } set alg(value) { } } __decorate([ JsonProp({ name: "k", converter: JsonBase64UrlConverter }) ], HmacCryptoKey.prototype, "data", void 0); class HmacProvider extends HmacProvider$1 { async onGenerateKey(algorithm, extractable, keyUsages) { const length = (algorithm.length || this.getDefaultLength(algorithm.hash.name)) >> 3 << 3; const key = new HmacCryptoKey(); key.algorithm = { ...algorithm, length, name: this.name, }; key.extractable = extractable; key.usages = keyUsages; key.data = crypto__default__default.randomBytes(length >> 3); return setCryptoKey(key); } async onSign(algorithm, key, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(key.algorithm.hash); const hmac = crypto__default__default.createHmac(cryptoAlg, getCryptoKey(key).data) .update(Buffer.from(data)).digest(); return new Uint8Array(hmac).buffer; } async onVerify(algorithm, key, signature, data) { const cryptoAlg = ShaCrypto.getAlgorithmName(key.algorithm.hash); const hmac = crypto__default__default.createHmac(cryptoAlg, getCryptoKey(key).data) .update(Buffer.from(data)).digest(); return hmac.compare(Buffer.from(signature)) === 0; } async onImportKey(format, keyData, algorithm, extractable, keyUsages) { let key; switch (format.toLowerCase()) { case "jwk": key = JsonParser.fromJSON(keyData, { targetSchema: HmacCryptoKey }); break; case "raw": key = new HmacCryptoKey(); key.data = Buffer.from(keyData); break; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } key.algorithm = { hash: { name: algorithm.hash.name }, name: this.name, length: key.data.length << 3, }; key.extractable = extractable; key.usages = keyUsages; return setCryptoKey(key); } async onExportKey(format, key) { switch (format.toLowerCase()) { case "jwk": return JsonSerializer.toJSON(getCryptoKey(key)); case "raw": return new Uint8Array(getCryptoKey(key).data).buffer; default: throw new OperationError("format: Must be 'jwk' or 'raw'"); } } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof HmacCryptoKey)) { throw new TypeError("key: Is not HMAC CryptoKey"); } } } class HkdfCryptoKey extends CryptoKey { } class HkdfProvider extends HkdfProvider$1 { async onImportKey(format, keyData, algorithm, extractable, keyUsages) { if (format.toLowerCase() !== "raw") { throw new OperationError("Operation not supported"); } const key = new HkdfCryptoKey(); key.data = Buffer.from(keyData); key.algorithm = { name: this.name }; key.extractable = extractable; key.usages = keyUsages; return setCryptoKey(key); } async onDeriveBits(params, baseKey, length) { const hash = params.hash.name.replace("-", ""); const hashLength = crypto__default__default.createHash(hash).digest().length; const byteLength = length / 8; const info = BufferSourceConverter.toUint8Array(params.info); const PRK = crypto__default__default.createHmac(hash, BufferSourceConverter.toUint8Array(params.salt)) .update(BufferSourceConverter.toUint8Array(getCryptoKey(baseKey).data)) .digest(); const blocks = [Buffer.alloc(0)]; const blockCount = Math.ceil(byteLength / hashLength) + 1; for (let i = 1; i < blockCount; ++i) { blocks.push(crypto__default__default.createHmac(hash, PRK) .update(Buffer.concat([blocks[i - 1], info, Buffer.from([i])])) .digest()); } return Buffer.concat(blocks).slice(0, byteLength); } checkCryptoKey(key, keyUsage) { super.checkCryptoKey(key, keyUsage); if (!(getCryptoKey(key) instanceof HkdfCryptoKey)) { throw new TypeError("key: Is not HKDF CryptoKey"); } } } class ShakeCrypto { static digest(algorithm, data) { const hash = crypto__default__default.createHash(algorithm.name.toLowerCase(), { outputLength: algorithm.length }) .update(Buffer.from(data)).digest(); return new Uint8Array(hash).buffer; } } class Shake128Provider extends Shake128Provider$1 { async onDigest(algorithm, data) { return ShakeCrypto.digest(algorithm, data); } } class Shake256Provider extends Shake256Provider$1 { async onDigest(algorithm, data) { return ShakeCrypto.digest(algorithm, data); } } class SubtleCrypto extends SubtleCrypto$1 { constructor() { var _a; super(); this.providers.set(new AesCbcProvider()); this.providers.set(new AesCtrProvider()); this.providers.set(new AesGcmProvider()); this.providers.set(new AesCmacProvider()); this.providers.set(new AesKwProvider()); this.providers.set(new AesEcbProvider()); this.providers.set(new DesCbcProvider()); this.providers.set(new DesEde3CbcProvider()); this.providers.set(new RsaSsaProvider()); this.providers.set(new RsaPssProvider()); this.providers.set(new RsaOaepProvider()); this.providers.set(new RsaEsProvider()); this.providers.set(new EcdsaProvider()); this.providers.set(new EcdhProvider()); this.providers.set(new Sha1Provider()); this.providers.set(new Sha256Provider()); this.providers.set(new Sha384Provider()); this.providers.set(new Sha512Provider()); this.providers.set(new Pbkdf2Provider()); this.providers.set(new HmacProvider()); this.providers.set(new HkdfProvider()); const nodeMajorVersion = (_a = /^v(\d+)/.exec(process$1.version)) === null || _a === void 0 ? void 0 : _a[1]; if (nodeMajorVersion && parseInt(nodeMajorVersion, 10) >= 12) { this.providers.set(new Shake128Provider()); this.providers.set(new Shake256Provider()); } const hashes = crypto__default.getHashes(); if (hashes.includes("sha3-256")) { this.providers.set(new Sha3256Provider()); } if (hashes.includes("sha3-384")) { this.providers.set(new Sha3384Provider()); } if (hashes.includes("sha3-512")) { this.providers.set(new Sha3512Provider()); } if (nodeMajorVersion && parseInt(nodeMajorVersion, 10) >= 14) { this.providers.set(new EdDsaProvider()); this.providers.set(new EcdhEsProvider()); } } } class Crypto extends Crypto$1 { constructor() { super(...arguments); this.subtle = new SubtleCrypto(); } getRandomValues(array) { if (!ArrayBuffer.isView(array)) { throw new TypeError("Failed to execute 'getRandomValues' on 'Crypto': parameter 1 is not of type 'ArrayBufferView'"); } const buffer = Buffer.from(array.buffer, array.byteOffset, array.byteLength); crypto__default__default.randomFillSync(buffer); return array; } } var webcrypto_es = /*#__PURE__*/Object.freeze({ __proto__: null, Crypto: Crypto, CryptoKey: CryptoKey$1 }); var require$$8 = /*@__PURE__*/getAugmentedNamespace(webcrypto_es); var utils$2; var hasRequiredUtils$1; function requireUtils$1 () { if (hasRequiredUtils$1) return utils$2; hasRequiredUtils$1 = 1; function parseContentType(str) { if (str.length === 0) return; const params = Object.create(null); let i = 0; // Parse type for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { if (code !== 47/* '/' */ || i === 0) return; break; } } // Check for type without subtype if (i === str.length) return; const type = str.slice(0, i).toLowerCase(); // Parse subtype const subtypeStart = ++i; for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { // Make sure we have a subtype if (i === subtypeStart) return; if (parseContentTypeParams(str, i, params) === undefined) return; break; } } // Make sure we have a subtype if (i === subtypeStart) return; const subtype = str.slice(subtypeStart, i).toLowerCase(); return { type, subtype, params }; } function parseContentTypeParams(str, i, params) { while (i < str.length) { // Consume whitespace for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code !== 32/* ' ' */ && code !== 9/* '\t' */) break; } // Ended on whitespace if (i === str.length) break; // Check for malformed parameter if (str.charCodeAt(i++) !== 59/* ';' */) return; // Consume whitespace for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code !== 32/* ' ' */ && code !== 9/* '\t' */) break; } // Ended on whitespace (malformed) if (i === str.length) return; let name; const nameStart = i; // Parse parameter name for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { if (code !== 61/* '=' */) return; break; } } // No value (malformed) if (i === str.length) return; name = str.slice(nameStart, i); ++i; // Skip over '=' // No value (malformed) if (i === str.length) return; let value = ''; let valueStart; if (str.charCodeAt(i) === 34/* '"' */) { valueStart = ++i; let escaping = false; // Parse quoted value for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code === 92/* '\\' */) { if (escaping) { valueStart = i; escaping = false; } else { value += str.slice(valueStart, i); escaping = true; } continue; } if (code === 34/* '"' */) { if (escaping) { valueStart = i; escaping = false; continue; } value += str.slice(valueStart, i); break; } if (escaping) { valueStart = i - 1; escaping = false; } // Invalid unescaped quoted character (malformed) if (QDTEXT[code] !== 1) return; } // No end quote (malformed) if (i === str.length) return; ++i; // Skip over double quote } else { valueStart = i; // Parse unquoted value for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { // No value (malformed) if (i === valueStart) return; break; } } value = str.slice(valueStart, i); } name = name.toLowerCase(); if (params[name] === undefined) params[name] = value; } return params; } function parseDisposition(str, defDecoder) { if (str.length === 0) return; const params = Object.create(null); let i = 0; for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { if (parseDispositionParams(str, i, params, defDecoder) === undefined) return; break; } } const type = str.slice(0, i).toLowerCase(); return { type, params }; } function parseDispositionParams(str, i, params, defDecoder) { while (i < str.length) { // Consume whitespace for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code !== 32/* ' ' */ && code !== 9/* '\t' */) break; } // Ended on whitespace if (i === str.length) break; // Check for malformed parameter if (str.charCodeAt(i++) !== 59/* ';' */) return; // Consume whitespace for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code !== 32/* ' ' */ && code !== 9/* '\t' */) break; } // Ended on whitespace (malformed) if (i === str.length) return; let name; const nameStart = i; // Parse parameter name for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { if (code === 61/* '=' */) break; return; } } // No value (malformed) if (i === str.length) return; let value = ''; let valueStart; let charset; //~ let lang; name = str.slice(nameStart, i); if (name.charCodeAt(name.length - 1) === 42/* '*' */) { // Extended value const charsetStart = ++i; // Parse charset name for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (CHARSET[code] !== 1) { if (code !== 39/* '\'' */) return; break; } } // Incomplete charset (malformed) if (i === str.length) return; charset = str.slice(charsetStart, i); ++i; // Skip over the '\'' //~ const langStart = ++i; // Parse language name for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code === 39/* '\'' */) break; } // Incomplete language (malformed) if (i === str.length) return; //~ lang = str.slice(langStart, i); ++i; // Skip over the '\'' // No value (malformed) if (i === str.length) return; valueStart = i; let encode = 0; // Parse value for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (EXTENDED_VALUE[code] !== 1) { if (code === 37/* '%' */) { let hexUpper; let hexLower; if (i + 2 < str.length && (hexUpper = HEX_VALUES[str.charCodeAt(i + 1)]) !== -1 && (hexLower = HEX_VALUES[str.charCodeAt(i + 2)]) !== -1) { const byteVal = (hexUpper << 4) + hexLower; value += str.slice(valueStart, i); value += String.fromCharCode(byteVal); i += 2; valueStart = i + 1; if (byteVal >= 128) encode = 2; else if (encode === 0) encode = 1; continue; } // '%' disallowed in non-percent encoded contexts (malformed) return; } break; } } value += str.slice(valueStart, i); value = convertToUTF8(value, charset, encode); if (value === undefined) return; } else { // Non-extended value ++i; // Skip over '=' // No value (malformed) if (i === str.length) return; if (str.charCodeAt(i) === 34/* '"' */) { valueStart = ++i; let escaping = false; // Parse quoted value for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (code === 92/* '\\' */) { if (escaping) { valueStart = i; escaping = false; } else { value += str.slice(valueStart, i); escaping = true; } continue; } if (code === 34/* '"' */) { if (escaping) { valueStart = i; escaping = false; continue; } value += str.slice(valueStart, i); break; } if (escaping) { valueStart = i - 1; escaping = false; } // Invalid unescaped quoted character (malformed) if (QDTEXT[code] !== 1) return; } // No end quote (malformed) if (i === str.length) return; ++i; // Skip over double quote } else { valueStart = i; // Parse unquoted value for (; i < str.length; ++i) { const code = str.charCodeAt(i); if (TOKEN[code] !== 1) { // No value (malformed) if (i === valueStart) return; break; } } value = str.slice(valueStart, i); } value = defDecoder(value, 2); if (value === undefined) return; } name = name.toLowerCase(); if (params[name] === undefined) params[name] = value; } return params; } function getDecoder(charset) { let lc; while (true) { switch (charset) { case 'utf-8': case 'utf8': return decoders.utf8; case 'latin1': case 'ascii': // TODO: Make these a separate, strict decoder? case 'us-ascii': case 'iso-8859-1': case 'iso8859-1': case 'iso88591': case 'iso_8859-1': case 'windows-1252': case 'iso_8859-1:1987': case 'cp1252': case 'x-cp1252': return decoders.latin1; case 'utf16le': case 'utf-16le': case 'ucs2': case 'ucs-2': return decoders.utf16le; case 'base64': return decoders.base64; default: if (lc === undefined) { lc = true; charset = charset.toLowerCase(); continue; } return decoders.other.bind(charset); } } } const decoders = { utf8: (data, hint) => { if (data.length === 0) return ''; if (typeof data === 'string') { // If `data` never had any percent-encoded bytes or never had any that // were outside of the ASCII range, then we can safely just return the // input since UTF-8 is ASCII compatible if (hint < 2) return data; data = Buffer.from(data, 'latin1'); } return data.utf8Slice(0, data.length); }, latin1: (data, hint) => { if (data.length === 0) return ''; if (typeof data === 'string') return data; return data.latin1Slice(0, data.length); }, utf16le: (data, hint) => { if (data.length === 0) return ''; if (typeof data === 'string') data = Buffer.from(data, 'latin1'); return data.ucs2Slice(0, data.length); }, base64: (data, hint) => { if (data.length === 0) return ''; if (typeof data === 'string') data = Buffer.from(data, 'latin1'); return data.base64Slice(0, data.length); }, other: (data, hint) => { if (data.length === 0) return ''; if (typeof data === 'string') data = Buffer.from(data, 'latin1'); try { const decoder = new TextDecoder(this); return decoder.decode(data); } catch {} }, }; function convertToUTF8(data, charset, hint) { const decode = getDecoder(charset); if (decode) return decode(data, hint); } function basename(path) { if (typeof path !== 'string') return ''; for (let i = path.length - 1; i >= 0; --i) { switch (path.charCodeAt(i)) { case 0x2F: // '/' case 0x5C: // '\' path = path.slice(i + 1); return (path === '..' || path === '.' ? '' : path); } } return (path === '..' || path === '.' ? '' : path); } const TOKEN = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; const QDTEXT = [ 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, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ]; const CHARSET = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; const EXTENDED_VALUE = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; /* eslint-disable no-multi-spaces */ const HEX_VALUES = [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ]; /* eslint-enable no-multi-spaces */ utils$2 = { basename, convertToUTF8, getDecoder, parseContentType, parseDisposition, }; return utils$2; } var sbmh; var hasRequiredSbmh; function requireSbmh () { if (hasRequiredSbmh) return sbmh; hasRequiredSbmh = 1; /* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool */ function memcmp(buf1, pos1, buf2, pos2, num) { for (let i = 0; i < num; ++i) { if (buf1[pos1 + i] !== buf2[pos2 + i]) return false; } return true; } class SBMH { constructor(needle, cb) { if (typeof cb !== 'function') throw new Error('Missing match callback'); if (typeof needle === 'string') needle = Buffer.from(needle); else if (!Buffer.isBuffer(needle)) throw new Error(`Expected Buffer for needle, got ${typeof needle}`); const needleLen = needle.length; this.maxMatches = Infinity; this.matches = 0; this._cb = cb; this._lookbehindSize = 0; this._needle = needle; this._bufPos = 0; this._lookbehind = Buffer.allocUnsafe(needleLen); // Initialize occurrence table. this._occ = [ needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen, needleLen ]; // Populate occurrence table with analysis of the needle, ignoring the last // letter. if (needleLen > 1) { for (let i = 0; i < needleLen - 1; ++i) this._occ[needle[i]] = needleLen - 1 - i; } } reset() { this.matches = 0; this._lookbehindSize = 0; this._bufPos = 0; } push(chunk, pos) { let result; if (!Buffer.isBuffer(chunk)) chunk = Buffer.from(chunk, 'latin1'); const chunkLen = chunk.length; this._bufPos = pos || 0; while (result !== chunkLen && this.matches < this.maxMatches) result = feed(this, chunk); return result; } destroy() { const lbSize = this._lookbehindSize; if (lbSize) this._cb(false, this._lookbehind, 0, lbSize, false); this.reset(); } } function feed(self, data) { const len = data.length; const needle = self._needle; const needleLen = needle.length; // Positive: points to a position in `data` // pos == 3 points to data[3] // Negative: points to a position in the lookbehind buffer // pos == -2 points to lookbehind[lookbehindSize - 2] let pos = -self._lookbehindSize; const lastNeedleCharPos = needleLen - 1; const lastNeedleChar = needle[lastNeedleCharPos]; const end = len - needleLen; const occ = self._occ; const lookbehind = self._lookbehind; if (pos < 0) { // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool // search with character lookup code that considers both the // lookbehind buffer and the current round's haystack data. // // Loop until // there is a match. // or until // we've moved past the position that requires the // lookbehind buffer. In this case we switch to the // optimized loop. // or until // the character to look at lies outside the haystack. while (pos < 0 && pos <= end) { const nextPos = pos + lastNeedleCharPos; const ch = (nextPos < 0 ? lookbehind[self._lookbehindSize + nextPos] : data[nextPos]); if (ch === lastNeedleChar && matchNeedle(self, data, pos, lastNeedleCharPos)) { self._lookbehindSize = 0; ++self.matches; if (pos > -self._lookbehindSize) self._cb(true, lookbehind, 0, self._lookbehindSize + pos, false); else self._cb(true, undefined, 0, 0, true); return (self._bufPos = pos + needleLen); } pos += occ[ch]; } // No match. // There's too few data for Boyer-Moore-Horspool to run, // so let's use a different algorithm to skip as much as // we can. // Forward pos until // the trailing part of lookbehind + data // looks like the beginning of the needle // or until // pos == 0 while (pos < 0 && !matchNeedle(self, data, pos, len - pos)) ++pos; if (pos < 0) { // Cut off part of the lookbehind buffer that has // been processed and append the entire haystack // into it. const bytesToCutOff = self._lookbehindSize + pos; if (bytesToCutOff > 0) { // The cut off data is guaranteed not to contain the needle. self._cb(false, lookbehind, 0, bytesToCutOff, false); } self._lookbehindSize -= bytesToCutOff; lookbehind.copy(lookbehind, 0, bytesToCutOff, self._lookbehindSize); lookbehind.set(data, self._lookbehindSize); self._lookbehindSize += len; self._bufPos = len; return len; } // Discard lookbehind buffer. self._cb(false, lookbehind, 0, self._lookbehindSize, false); self._lookbehindSize = 0; } pos += self._bufPos; const firstNeedleChar = needle[0]; // Lookbehind buffer is now empty. Perform Boyer-Moore-Horspool // search with optimized character lookup code that only considers // the current round's haystack data. while (pos <= end) { const ch = data[pos + lastNeedleCharPos]; if (ch === lastNeedleChar && data[pos] === firstNeedleChar && memcmp(needle, 0, data, pos, lastNeedleCharPos)) { ++self.matches; if (pos > 0) self._cb(true, data, self._bufPos, pos, true); else self._cb(true, undefined, 0, 0, true); return (self._bufPos = pos + needleLen); } pos += occ[ch]; } // There was no match. If there's trailing haystack data that we cannot // match yet using the Boyer-Moore-Horspool algorithm (because the trailing // data is less than the needle size) then match using a modified // algorithm that starts matching from the beginning instead of the end. // Whatever trailing data is left after running this algorithm is added to // the lookbehind buffer. while (pos < len) { if (data[pos] !== firstNeedleChar || !memcmp(data, pos, needle, 0, len - pos)) { ++pos; continue; } data.copy(lookbehind, 0, pos, len); self._lookbehindSize = len - pos; break; } // Everything until `pos` is guaranteed not to contain needle data. if (pos > 0) self._cb(false, data, self._bufPos, pos < len ? pos : len, true); self._bufPos = len; return len; } function matchNeedle(self, data, pos, len) { const lb = self._lookbehind; const lbSize = self._lookbehindSize; const needle = self._needle; for (let i = 0; i < len; ++i, ++pos) { const ch = (pos < 0 ? lb[lbSize + pos] : data[pos]); if (ch !== needle[i]) return false; } return true; } sbmh = SBMH; return sbmh; } var multipart; var hasRequiredMultipart; function requireMultipart () { if (hasRequiredMultipart) return multipart; hasRequiredMultipart = 1; const { Readable, Writable } = Stream; const StreamSearch = requireSbmh(); const { basename, convertToUTF8, getDecoder, parseContentType, parseDisposition, } = requireUtils$1(); const BUF_CRLF = Buffer.from('\r\n'); const BUF_CR = Buffer.from('\r'); const BUF_DASH = Buffer.from('-'); function noop() {} const MAX_HEADER_PAIRS = 2000; // From node const MAX_HEADER_SIZE = 16 * 1024; // From node (its default value) const HPARSER_NAME = 0; const HPARSER_PRE_OWS = 1; const HPARSER_VALUE = 2; class HeaderParser { constructor(cb) { this.header = Object.create(null); this.pairCount = 0; this.byteCount = 0; this.state = HPARSER_NAME; this.name = ''; this.value = ''; this.crlf = 0; this.cb = cb; } reset() { this.header = Object.create(null); this.pairCount = 0; this.byteCount = 0; this.state = HPARSER_NAME; this.name = ''; this.value = ''; this.crlf = 0; } push(chunk, pos, end) { let start = pos; while (pos < end) { switch (this.state) { case HPARSER_NAME: { let done = false; for (; pos < end; ++pos) { if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; const code = chunk[pos]; if (TOKEN[code] !== 1) { if (code !== 58/* ':' */) return -1; this.name += chunk.latin1Slice(start, pos); if (this.name.length === 0) return -1; ++pos; done = true; this.state = HPARSER_PRE_OWS; break; } } if (!done) { this.name += chunk.latin1Slice(start, pos); break; } // FALLTHROUGH } case HPARSER_PRE_OWS: { // Skip optional whitespace let done = false; for (; pos < end; ++pos) { if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; const code = chunk[pos]; if (code !== 32/* ' ' */ && code !== 9/* '\t' */) { start = pos; done = true; this.state = HPARSER_VALUE; break; } } if (!done) break; // FALLTHROUGH } case HPARSER_VALUE: switch (this.crlf) { case 0: // Nothing yet for (; pos < end; ++pos) { if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; const code = chunk[pos]; if (FIELD_VCHAR[code] !== 1) { if (code !== 13/* '\r' */) return -1; ++this.crlf; break; } } this.value += chunk.latin1Slice(start, pos++); break; case 1: // Received CR if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; if (chunk[pos++] !== 10/* '\n' */) return -1; ++this.crlf; break; case 2: { // Received CR LF if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; const code = chunk[pos]; if (code === 32/* ' ' */ || code === 9/* '\t' */) { // Folded value start = pos; this.crlf = 0; } else { if (++this.pairCount < MAX_HEADER_PAIRS) { this.name = this.name.toLowerCase(); if (this.header[this.name] === undefined) this.header[this.name] = [this.value]; else this.header[this.name].push(this.value); } if (code === 13/* '\r' */) { ++this.crlf; ++pos; } else { // Assume start of next header field name start = pos; this.crlf = 0; this.state = HPARSER_NAME; this.name = ''; this.value = ''; } } break; } case 3: { // Received CR LF CR if (this.byteCount === MAX_HEADER_SIZE) return -1; ++this.byteCount; if (chunk[pos++] !== 10/* '\n' */) return -1; // End of header const header = this.header; this.reset(); this.cb(header); return pos; } } break; } } return pos; } } class FileStream extends Readable { constructor(opts, owner) { super(opts); this.truncated = false; this._readcb = null; this.once('end', () => { // We need to make sure that we call any outstanding _writecb() that is // associated with this file so that processing of the rest of the form // can continue. This may not happen if the file stream ends right after // backpressure kicks in, so we force it here. this._read(); if (--owner._fileEndsLeft === 0 && owner._finalcb) { const cb = owner._finalcb; owner._finalcb = null; // Make sure other 'end' event handlers get a chance to be executed // before busboy's 'finish' event is emitted process.nextTick(cb); } }); } _read(n) { const cb = this._readcb; if (cb) { this._readcb = null; cb(); } } } const ignoreData = { push: (chunk, pos) => {}, destroy: () => {}, }; function callAndUnsetCb(self, err) { const cb = self._writecb; self._writecb = null; if (err) self.destroy(err); else if (cb) cb(); } function nullDecoder(val, hint) { return val; } class Multipart extends Writable { constructor(cfg) { const streamOpts = { autoDestroy: true, emitClose: true, highWaterMark: (typeof cfg.highWaterMark === 'number' ? cfg.highWaterMark : undefined), }; super(streamOpts); if (!cfg.conType.params || typeof cfg.conType.params.boundary !== 'string') throw new Error('Multipart: Boundary not found'); const boundary = cfg.conType.params.boundary; const paramDecoder = (typeof cfg.defParamCharset === 'string' && cfg.defParamCharset ? getDecoder(cfg.defParamCharset) : nullDecoder); const defCharset = (cfg.defCharset || 'utf8'); const preservePath = cfg.preservePath; const fileOpts = { autoDestroy: true, emitClose: true, highWaterMark: (typeof cfg.fileHwm === 'number' ? cfg.fileHwm : undefined), }; const limits = cfg.limits; const fieldSizeLimit = (limits && typeof limits.fieldSize === 'number' ? limits.fieldSize : 1 * 1024 * 1024); const fileSizeLimit = (limits && typeof limits.fileSize === 'number' ? limits.fileSize : Infinity); const filesLimit = (limits && typeof limits.files === 'number' ? limits.files : Infinity); const fieldsLimit = (limits && typeof limits.fields === 'number' ? limits.fields : Infinity); const partsLimit = (limits && typeof limits.parts === 'number' ? limits.parts : Infinity); let parts = -1; // Account for initial boundary let fields = 0; let files = 0; let skipPart = false; this._fileEndsLeft = 0; this._fileStream = undefined; this._complete = false; let fileSize = 0; let field; let fieldSize = 0; let partCharset; let partEncoding; let partType; let partName; let partTruncated = false; let hitFilesLimit = false; let hitFieldsLimit = false; this._hparser = null; const hparser = new HeaderParser((header) => { this._hparser = null; skipPart = false; partType = 'text/plain'; partCharset = defCharset; partEncoding = '7bit'; partName = undefined; partTruncated = false; let filename; if (!header['content-disposition']) { skipPart = true; return; } const disp = parseDisposition(header['content-disposition'][0], paramDecoder); if (!disp || disp.type !== 'form-data') { skipPart = true; return; } if (disp.params) { if (disp.params.name) partName = disp.params.name; if (disp.params['filename*']) filename = disp.params['filename*']; else if (disp.params.filename) filename = disp.params.filename; if (filename !== undefined && !preservePath) filename = basename(filename); } if (header['content-type']) { const conType = parseContentType(header['content-type'][0]); if (conType) { partType = `${conType.type}/${conType.subtype}`; if (conType.params && typeof conType.params.charset === 'string') partCharset = conType.params.charset.toLowerCase(); } } if (header['content-transfer-encoding']) partEncoding = header['content-transfer-encoding'][0].toLowerCase(); if (partType === 'application/octet-stream' || filename !== undefined) { // File if (files === filesLimit) { if (!hitFilesLimit) { hitFilesLimit = true; this.emit('filesLimit'); } skipPart = true; return; } ++files; if (this.listenerCount('file') === 0) { skipPart = true; return; } fileSize = 0; this._fileStream = new FileStream(fileOpts, this); ++this._fileEndsLeft; this.emit( 'file', partName, this._fileStream, { filename, encoding: partEncoding, mimeType: partType } ); } else { // Non-file if (fields === fieldsLimit) { if (!hitFieldsLimit) { hitFieldsLimit = true; this.emit('fieldsLimit'); } skipPart = true; return; } ++fields; if (this.listenerCount('field') === 0) { skipPart = true; return; } field = []; fieldSize = 0; } }); let matchPostBoundary = 0; const ssCb = (isMatch, data, start, end, isDataSafe) => { retrydata: while (data) { if (this._hparser !== null) { const ret = this._hparser.push(data, start, end); if (ret === -1) { this._hparser = null; hparser.reset(); this.emit('error', new Error('Malformed part header')); break; } start = ret; } if (start === end) break; if (matchPostBoundary !== 0) { if (matchPostBoundary === 1) { switch (data[start]) { case 45: // '-' // Try matching '--' after boundary matchPostBoundary = 2; ++start; break; case 13: // '\r' // Try matching CR LF before header matchPostBoundary = 3; ++start; break; default: matchPostBoundary = 0; } if (start === end) return; } if (matchPostBoundary === 2) { matchPostBoundary = 0; if (data[start] === 45/* '-' */) { // End of multipart data this._complete = true; this._bparser = ignoreData; return; } // We saw something other than '-', so put the dash we consumed // "back" const writecb = this._writecb; this._writecb = noop; ssCb(false, BUF_DASH, 0, 1, false); this._writecb = writecb; } else if (matchPostBoundary === 3) { matchPostBoundary = 0; if (data[start] === 10/* '\n' */) { ++start; if (parts >= partsLimit) break; // Prepare the header parser this._hparser = hparser; if (start === end) break; // Process the remaining data as a header continue retrydata; } else { // We saw something other than LF, so put the CR we consumed // "back" const writecb = this._writecb; this._writecb = noop; ssCb(false, BUF_CR, 0, 1, false); this._writecb = writecb; } } } if (!skipPart) { if (this._fileStream) { let chunk; const actualLen = Math.min(end - start, fileSizeLimit - fileSize); if (!isDataSafe) { chunk = Buffer.allocUnsafe(actualLen); data.copy(chunk, 0, start, start + actualLen); } else { chunk = data.slice(start, start + actualLen); } fileSize += chunk.length; if (fileSize === fileSizeLimit) { if (chunk.length > 0) this._fileStream.push(chunk); this._fileStream.emit('limit'); this._fileStream.truncated = true; skipPart = true; } else if (!this._fileStream.push(chunk)) { if (this._writecb) this._fileStream._readcb = this._writecb; this._writecb = null; } } else if (field !== undefined) { let chunk; const actualLen = Math.min( end - start, fieldSizeLimit - fieldSize ); if (!isDataSafe) { chunk = Buffer.allocUnsafe(actualLen); data.copy(chunk, 0, start, start + actualLen); } else { chunk = data.slice(start, start + actualLen); } fieldSize += actualLen; field.push(chunk); if (fieldSize === fieldSizeLimit) { skipPart = true; partTruncated = true; } } } break; } if (isMatch) { matchPostBoundary = 1; if (this._fileStream) { // End the active file stream if the previous part was a file this._fileStream.push(null); this._fileStream = null; } else if (field !== undefined) { let data; switch (field.length) { case 0: data = ''; break; case 1: data = convertToUTF8(field[0], partCharset, 0); break; default: data = convertToUTF8( Buffer.concat(field, fieldSize), partCharset, 0 ); } field = undefined; fieldSize = 0; this.emit( 'field', partName, data, { nameTruncated: false, valueTruncated: partTruncated, encoding: partEncoding, mimeType: partType } ); } if (++parts === partsLimit) this.emit('partsLimit'); } }; this._bparser = new StreamSearch(`\r\n--${boundary}`, ssCb); this._writecb = null; this._finalcb = null; // Just in case there is no preamble this.write(BUF_CRLF); } static detect(conType) { return (conType.type === 'multipart' && conType.subtype === 'form-data'); } _write(chunk, enc, cb) { this._writecb = cb; this._bparser.push(chunk, 0); if (this._writecb) callAndUnsetCb(this); } _destroy(err, cb) { this._hparser = null; this._bparser = ignoreData; if (!err) err = checkEndState(this); const fileStream = this._fileStream; if (fileStream) { this._fileStream = null; fileStream.destroy(err); } cb(err); } _final(cb) { this._bparser.destroy(); if (!this._complete) return cb(new Error('Unexpected end of form')); if (this._fileEndsLeft) this._finalcb = finalcb.bind(null, this, cb); else finalcb(this, cb); } } function finalcb(self, cb, err) { if (err) return cb(err); err = checkEndState(self); cb(err); } function checkEndState(self) { if (self._hparser) return new Error('Malformed part header'); const fileStream = self._fileStream; if (fileStream) { self._fileStream = null; fileStream.destroy(new Error('Unexpected end of file')); } if (!self._complete) return new Error('Unexpected end of form'); } const TOKEN = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; const FIELD_VCHAR = [ 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ]; multipart = Multipart; return multipart; } var urlencoded; var hasRequiredUrlencoded; function requireUrlencoded () { if (hasRequiredUrlencoded) return urlencoded; hasRequiredUrlencoded = 1; const { Writable } = Stream; const { getDecoder } = requireUtils$1(); class URLEncoded extends Writable { constructor(cfg) { const streamOpts = { autoDestroy: true, emitClose: true, highWaterMark: (typeof cfg.highWaterMark === 'number' ? cfg.highWaterMark : undefined), }; super(streamOpts); let charset = (cfg.defCharset || 'utf8'); if (cfg.conType.params && typeof cfg.conType.params.charset === 'string') charset = cfg.conType.params.charset; this.charset = charset; const limits = cfg.limits; this.fieldSizeLimit = (limits && typeof limits.fieldSize === 'number' ? limits.fieldSize : 1 * 1024 * 1024); this.fieldsLimit = (limits && typeof limits.fields === 'number' ? limits.fields : Infinity); this.fieldNameSizeLimit = ( limits && typeof limits.fieldNameSize === 'number' ? limits.fieldNameSize : 100 ); this._inKey = true; this._keyTrunc = false; this._valTrunc = false; this._bytesKey = 0; this._bytesVal = 0; this._fields = 0; this._key = ''; this._val = ''; this._byte = -2; this._lastPos = 0; this._encode = 0; this._decoder = getDecoder(charset); } static detect(conType) { return (conType.type === 'application' && conType.subtype === 'x-www-form-urlencoded'); } _write(chunk, enc, cb) { if (this._fields >= this.fieldsLimit) return cb(); let i = 0; const len = chunk.length; this._lastPos = 0; // Check if we last ended mid-percent-encoded byte if (this._byte !== -2) { i = readPctEnc(this, chunk, i, len); if (i === -1) return cb(new Error('Malformed urlencoded form')); if (i >= len) return cb(); if (this._inKey) ++this._bytesKey; else ++this._bytesVal; } main: while (i < len) { if (this._inKey) { // Parsing key i = skipKeyBytes(this, chunk, i, len); while (i < len) { switch (chunk[i]) { case 61: // '=' if (this._lastPos < i) this._key += chunk.latin1Slice(this._lastPos, i); this._lastPos = ++i; this._key = this._decoder(this._key, this._encode); this._encode = 0; this._inKey = false; continue main; case 38: // '&' if (this._lastPos < i) this._key += chunk.latin1Slice(this._lastPos, i); this._lastPos = ++i; this._key = this._decoder(this._key, this._encode); this._encode = 0; if (this._bytesKey > 0) { this.emit( 'field', this._key, '', { nameTruncated: this._keyTrunc, valueTruncated: false, encoding: this.charset, mimeType: 'text/plain' } ); } this._key = ''; this._val = ''; this._keyTrunc = false; this._valTrunc = false; this._bytesKey = 0; this._bytesVal = 0; if (++this._fields >= this.fieldsLimit) { this.emit('fieldsLimit'); return cb(); } continue; case 43: // '+' if (this._lastPos < i) this._key += chunk.latin1Slice(this._lastPos, i); this._key += ' '; this._lastPos = i + 1; break; case 37: // '%' if (this._encode === 0) this._encode = 1; if (this._lastPos < i) this._key += chunk.latin1Slice(this._lastPos, i); this._lastPos = i + 1; this._byte = -1; i = readPctEnc(this, chunk, i + 1, len); if (i === -1) return cb(new Error('Malformed urlencoded form')); if (i >= len) return cb(); ++this._bytesKey; i = skipKeyBytes(this, chunk, i, len); continue; } ++i; ++this._bytesKey; i = skipKeyBytes(this, chunk, i, len); } if (this._lastPos < i) this._key += chunk.latin1Slice(this._lastPos, i); } else { // Parsing value i = skipValBytes(this, chunk, i, len); while (i < len) { switch (chunk[i]) { case 38: // '&' if (this._lastPos < i) this._val += chunk.latin1Slice(this._lastPos, i); this._lastPos = ++i; this._inKey = true; this._val = this._decoder(this._val, this._encode); this._encode = 0; if (this._bytesKey > 0 || this._bytesVal > 0) { this.emit( 'field', this._key, this._val, { nameTruncated: this._keyTrunc, valueTruncated: this._valTrunc, encoding: this.charset, mimeType: 'text/plain' } ); } this._key = ''; this._val = ''; this._keyTrunc = false; this._valTrunc = false; this._bytesKey = 0; this._bytesVal = 0; if (++this._fields >= this.fieldsLimit) { this.emit('fieldsLimit'); return cb(); } continue main; case 43: // '+' if (this._lastPos < i) this._val += chunk.latin1Slice(this._lastPos, i); this._val += ' '; this._lastPos = i + 1; break; case 37: // '%' if (this._encode === 0) this._encode = 1; if (this._lastPos < i) this._val += chunk.latin1Slice(this._lastPos, i); this._lastPos = i + 1; this._byte = -1; i = readPctEnc(this, chunk, i + 1, len); if (i === -1) return cb(new Error('Malformed urlencoded form')); if (i >= len) return cb(); ++this._bytesVal; i = skipValBytes(this, chunk, i, len); continue; } ++i; ++this._bytesVal; i = skipValBytes(this, chunk, i, len); } if (this._lastPos < i) this._val += chunk.latin1Slice(this._lastPos, i); } } cb(); } _final(cb) { if (this._byte !== -2) return cb(new Error('Malformed urlencoded form')); if (!this._inKey || this._bytesKey > 0 || this._bytesVal > 0) { if (this._inKey) this._key = this._decoder(this._key, this._encode); else this._val = this._decoder(this._val, this._encode); this.emit( 'field', this._key, this._val, { nameTruncated: this._keyTrunc, valueTruncated: this._valTrunc, encoding: this.charset, mimeType: 'text/plain' } ); } cb(); } } function readPctEnc(self, chunk, pos, len) { if (pos >= len) return len; if (self._byte === -1) { // We saw a '%' but no hex characters yet const hexUpper = HEX_VALUES[chunk[pos++]]; if (hexUpper === -1) return -1; if (hexUpper >= 8) self._encode = 2; // Indicate high bits detected if (pos < len) { // Both hex characters are in this chunk const hexLower = HEX_VALUES[chunk[pos++]]; if (hexLower === -1) return -1; if (self._inKey) self._key += String.fromCharCode((hexUpper << 4) + hexLower); else self._val += String.fromCharCode((hexUpper << 4) + hexLower); self._byte = -2; self._lastPos = pos; } else { // Only one hex character was available in this chunk self._byte = hexUpper; } } else { // We saw only one hex character so far const hexLower = HEX_VALUES[chunk[pos++]]; if (hexLower === -1) return -1; if (self._inKey) self._key += String.fromCharCode((self._byte << 4) + hexLower); else self._val += String.fromCharCode((self._byte << 4) + hexLower); self._byte = -2; self._lastPos = pos; } return pos; } function skipKeyBytes(self, chunk, pos, len) { // Skip bytes if we've truncated if (self._bytesKey > self.fieldNameSizeLimit) { if (!self._keyTrunc) { if (self._lastPos < pos) self._key += chunk.latin1Slice(self._lastPos, pos - 1); } self._keyTrunc = true; for (; pos < len; ++pos) { const code = chunk[pos]; if (code === 61/* '=' */ || code === 38/* '&' */) break; ++self._bytesKey; } self._lastPos = pos; } return pos; } function skipValBytes(self, chunk, pos, len) { // Skip bytes if we've truncated if (self._bytesVal > self.fieldSizeLimit) { if (!self._valTrunc) { if (self._lastPos < pos) self._val += chunk.latin1Slice(self._lastPos, pos - 1); } self._valTrunc = true; for (; pos < len; ++pos) { if (chunk[pos] === 38/* '&' */) break; ++self._bytesVal; } self._lastPos = pos; } return pos; } /* eslint-disable no-multi-spaces */ const HEX_VALUES = [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ]; /* eslint-enable no-multi-spaces */ urlencoded = URLEncoded; return urlencoded; } var lib$2; var hasRequiredLib; function requireLib () { if (hasRequiredLib) return lib$2; hasRequiredLib = 1; const { parseContentType } = requireUtils$1(); function getInstance(cfg) { const headers = cfg.headers; const conType = parseContentType(headers['content-type']); if (!conType) throw new Error('Malformed content type'); for (const type of TYPES) { const matched = type.detect(conType); if (!matched) continue; const instanceCfg = { limits: cfg.limits, headers, conType, highWaterMark: undefined, fileHwm: undefined, defCharset: undefined, defParamCharset: undefined, preservePath: false, }; if (cfg.highWaterMark) instanceCfg.highWaterMark = cfg.highWaterMark; if (cfg.fileHwm) instanceCfg.fileHwm = cfg.fileHwm; instanceCfg.defCharset = cfg.defCharset; instanceCfg.defParamCharset = cfg.defParamCharset; instanceCfg.preservePath = cfg.preservePath; return new type(instanceCfg); } throw new Error(`Unsupported content type: ${headers['content-type']}`); } // Note: types are explicitly listed here for easier bundling // See: https://github.com/mscdex/busboy/issues/121 const TYPES = [ requireMultipart(), requireUrlencoded(), ].filter(function(typemod) { return typeof typemod.detect === 'function'; }); lib$2 = (cfg) => { if (typeof cfg !== 'object' || cfg === null) cfg = {}; if (typeof cfg.headers !== 'object' || cfg.headers === null || typeof cfg.headers['content-type'] !== 'string') { throw new Error('Missing Content-Type'); } return getInstance(cfg); }; return lib$2; } var getFormDataMethod; var hasRequiredGetFormDataMethod; function requireGetFormDataMethod () { if (hasRequiredGetFormDataMethod) return getFormDataMethod; hasRequiredGetFormDataMethod = 1; const busboy = requireLib(); const streams = Stream; getFormDataMethod = function getFormDataMethod(File, limits) { return function formData() { if (this.body == null) { return null; } const contentType = this.headers.get('Content-Type'); const nodeReadable = this.body.on ? this.body : streams.Readable.from(this.body); const bb = busboy({ headers: { 'content-type': contentType }, limits, defParamCharset: 'utf-8' }); return new Promise((resolve, reject) => { const formData = new Map(); bb.on('file', (name, fileStream, { filename, mimeType }) => { const chunks = []; fileStream.on('limit', () => { reject(new Error(`File size limit exceeded: ${limits.fileSize} bytes`)); }); fileStream.on('data', (chunk) => { chunks.push(chunk); }); fileStream.on('close', () => { formData.set(name, new File(chunks, filename, { type: mimeType })); }); }); bb.on('field', (name, value, { nameTruncated, valueTruncated }) => { if (nameTruncated) { reject(new Error(`Field name size exceeded: ${limits.fieldNameSize} bytes`)); } if (valueTruncated) { reject(new Error(`Field value size exceeded: ${limits.fieldSize} bytes`)); } formData.set(name, value); }); bb.on('partsLimit', () => { reject(new Error(`Parts limit exceeded: ${limits.parts}`)); }); bb.on('filesLimit', () => { reject(new Error(`Files limit exceeded: ${limits.files}`)); }); bb.on('fieldsLimit', () => { reject(new Error(`Fields limit exceeded: ${limits.fields}`)); }); bb.on('close', () => { resolve(formData); }); bb.on('error', err => { reject(err); }); nodeReadable.pipe(bb); }) } }; return getFormDataMethod; } var undici = {}; var symbols$1; var hasRequiredSymbols$1; function requireSymbols$1 () { if (hasRequiredSymbols$1) return symbols$1; hasRequiredSymbols$1 = 1; symbols$1 = { kClose: Symbol('close'), kDestroy: Symbol('destroy'), kDispatch: Symbol('dispatch'), kUrl: Symbol('url'), kWriting: Symbol('writing'), kResuming: Symbol('resuming'), kQueue: Symbol('queue'), kConnect: Symbol('connect'), kConnecting: Symbol('connecting'), kHeadersList: Symbol('headers list'), kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), kKeepAliveTimeoutValue: Symbol('keep alive timeout'), kKeepAlive: Symbol('keep alive'), kHeadersTimeout: Symbol('headers timeout'), kBodyTimeout: Symbol('body timeout'), kServerName: Symbol('server name'), kHost: Symbol('host'), kNoRef: Symbol('no ref'), kBodyUsed: Symbol('used'), kRunning: Symbol('running'), kBlocking: Symbol('blocking'), kPending: Symbol('pending'), kSize: Symbol('size'), kBusy: Symbol('busy'), kQueued: Symbol('queued'), kFree: Symbol('free'), kConnected: Symbol('connected'), kClosed: Symbol('closed'), kNeedDrain: Symbol('need drain'), kReset: Symbol('reset'), kDestroyed: Symbol('destroyed'), kMaxHeadersSize: Symbol('max headers size'), kRunningIdx: Symbol('running index'), kPendingIdx: Symbol('pending index'), kError: Symbol('error'), kClients: Symbol('clients'), kClient: Symbol('client'), kParser: Symbol('parser'), kOnDestroyed: Symbol('destroy callbacks'), kPipelining: Symbol('pipelinig'), kSocket: Symbol('socket'), kHostHeader: Symbol('host header'), kConnector: Symbol('connector'), kStrictContentLength: Symbol('strict content length'), kMaxRedirections: Symbol('maxRedirections'), kMaxRequests: Symbol('maxRequestsPerClient'), kProxy: Symbol('proxy agent options'), kCounter: Symbol('socket request counter') }; return symbols$1; } var errors; var hasRequiredErrors; function requireErrors () { if (hasRequiredErrors) return errors; hasRequiredErrors = 1; class UndiciError extends Error { constructor (message) { super(message); this.name = 'UndiciError'; this.code = 'UND_ERR'; } } class ConnectTimeoutError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, ConnectTimeoutError); this.name = 'ConnectTimeoutError'; this.message = message || 'Connect Timeout Error'; this.code = 'UND_ERR_CONNECT_TIMEOUT'; } } class HeadersTimeoutError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, HeadersTimeoutError); this.name = 'HeadersTimeoutError'; this.message = message || 'Headers Timeout Error'; this.code = 'UND_ERR_HEADERS_TIMEOUT'; } } class HeadersOverflowError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, HeadersOverflowError); this.name = 'HeadersOverflowError'; this.message = message || 'Headers Overflow Error'; this.code = 'UND_ERR_HEADERS_OVERFLOW'; } } class BodyTimeoutError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, BodyTimeoutError); this.name = 'BodyTimeoutError'; this.message = message || 'Body Timeout Error'; this.code = 'UND_ERR_BODY_TIMEOUT'; } } class ResponseStatusCodeError extends UndiciError { constructor (message, statusCode, headers, body) { super(message); Error.captureStackTrace(this, ResponseStatusCodeError); this.name = 'ResponseStatusCodeError'; this.message = message || 'Response Status Code Error'; this.code = 'UND_ERR_RESPONSE_STATUS_CODE'; this.body = body; this.status = statusCode; this.statusCode = statusCode; this.headers = headers; } } class InvalidArgumentError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, InvalidArgumentError); this.name = 'InvalidArgumentError'; this.message = message || 'Invalid Argument Error'; this.code = 'UND_ERR_INVALID_ARG'; } } class InvalidReturnValueError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, InvalidReturnValueError); this.name = 'InvalidReturnValueError'; this.message = message || 'Invalid Return Value Error'; this.code = 'UND_ERR_INVALID_RETURN_VALUE'; } } class RequestAbortedError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, RequestAbortedError); this.name = 'AbortError'; this.message = message || 'Request aborted'; this.code = 'UND_ERR_ABORTED'; } } class InformationalError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, InformationalError); this.name = 'InformationalError'; this.message = message || 'Request information'; this.code = 'UND_ERR_INFO'; } } class RequestContentLengthMismatchError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, RequestContentLengthMismatchError); this.name = 'RequestContentLengthMismatchError'; this.message = message || 'Request body length does not match content-length header'; this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; } } class ResponseContentLengthMismatchError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, ResponseContentLengthMismatchError); this.name = 'ResponseContentLengthMismatchError'; this.message = message || 'Response body length does not match content-length header'; this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'; } } class ClientDestroyedError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, ClientDestroyedError); this.name = 'ClientDestroyedError'; this.message = message || 'The client is destroyed'; this.code = 'UND_ERR_DESTROYED'; } } class ClientClosedError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, ClientClosedError); this.name = 'ClientClosedError'; this.message = message || 'The client is closed'; this.code = 'UND_ERR_CLOSED'; } } class SocketError extends UndiciError { constructor (message, socket) { super(message); Error.captureStackTrace(this, SocketError); this.name = 'SocketError'; this.message = message || 'Socket error'; this.code = 'UND_ERR_SOCKET'; this.socket = socket; } } class NotSupportedError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, NotSupportedError); this.name = 'NotSupportedError'; this.message = message || 'Not supported error'; this.code = 'UND_ERR_NOT_SUPPORTED'; } } class BalancedPoolMissingUpstreamError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, NotSupportedError); this.name = 'MissingUpstreamError'; this.message = message || 'No upstream has been added to the BalancedPool'; this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'; } } class HTTPParserError extends Error { constructor (message, code, data) { super(message); Error.captureStackTrace(this, HTTPParserError); this.name = 'HTTPParserError'; this.code = code ? `HPE_${code}` : undefined; this.data = data ? data.toString() : undefined; } } errors = { HTTPParserError, UndiciError, HeadersTimeoutError, HeadersOverflowError, BodyTimeoutError, RequestContentLengthMismatchError, ConnectTimeoutError, ResponseStatusCodeError, InvalidArgumentError, InvalidReturnValueError, RequestAbortedError, ClientDestroyedError, ClientClosedError, InformationalError, SocketError, NotSupportedError, ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError }; return errors; } var util$1; var hasRequiredUtil$1; function requireUtil$1 () { if (hasRequiredUtil$1) return util$1; hasRequiredUtil$1 = 1; const assert = require$$0$1; const { kDestroyed, kBodyUsed } = requireSymbols$1(); const { IncomingMessage } = http; const stream = Stream; const net = require$$4$1; const { InvalidArgumentError } = requireErrors(); const { Blob } = require$$6$1; const nodeUtil = require$$0; function nop () {} function isStream (obj) { return obj && typeof obj.pipe === 'function' } // based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) function isBlobLike (object) { return (Blob && object instanceof Blob) || ( object && typeof object === 'object' && (typeof object.stream === 'function' || typeof object.arrayBuffer === 'function') && /^(Blob|File)$/.test(object[Symbol.toStringTag]) ) } function isObject (val) { return val !== null && typeof val === 'object' } // this escapes all non-uri friendly characters function encode (val) { return encodeURIComponent(val) } // based on https://github.com/axios/axios/blob/63e559fa609c40a0a460ae5d5a18c3470ffc6c9e/lib/helpers/buildURL.js (MIT license) function buildURL (url, queryParams) { if (url.includes('?') || url.includes('#')) { throw new Error('Query params cannot be passed when url already contains "?" or "#".') } if (!isObject(queryParams)) { throw new Error('Query params must be an object') } const parts = []; for (let [key, val] of Object.entries(queryParams)) { if (val === null || typeof val === 'undefined') { continue } if (!Array.isArray(val)) { val = [val]; } for (const v of val) { if (isObject(v)) { throw new Error('Passing object as a query param is not supported, please serialize to string up-front') } parts.push(encode(key) + '=' + encode(v)); } } const serializedParams = parts.join('&'); if (serializedParams) { url += '?' + serializedParams; } return url } function parseURL (url) { if (typeof url === 'string') { url = new URL(url); } if (!url || typeof url !== 'object') { throw new InvalidArgumentError('invalid url') } if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { throw new InvalidArgumentError('invalid port') } if (url.path != null && typeof url.path !== 'string') { throw new InvalidArgumentError('invalid path') } if (url.pathname != null && typeof url.pathname !== 'string') { throw new InvalidArgumentError('invalid pathname') } if (url.hostname != null && typeof url.hostname !== 'string') { throw new InvalidArgumentError('invalid hostname') } if (url.origin != null && typeof url.origin !== 'string') { throw new InvalidArgumentError('invalid origin') } if (!/^https?:/.test(url.origin || url.protocol)) { throw new InvalidArgumentError('invalid protocol') } if (!(url instanceof URL)) { const port = url.port != null ? url.port : (url.protocol === 'https:' ? 443 : 80); let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; let path = url.path != null ? url.path : `${url.pathname || ''}${url.search || ''}`; if (origin.endsWith('/')) { origin = origin.substring(0, origin.length - 1); } if (path && !path.startsWith('/')) { path = `/${path}`; } // new URL(path, origin) is unsafe when `path` contains an absolute URL // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: // If first parameter is a relative URL, second param is required, and will be used as the base URL. // If first parameter is an absolute URL, a given second param will be ignored. url = new URL(origin + path); } return url } function parseOrigin (url) { url = parseURL(url); if (url.pathname !== '/' || url.search || url.hash) { throw new InvalidArgumentError('invalid url') } return url } function getHostname (host) { if (host[0] === '[') { const idx = host.indexOf(']'); assert(idx !== -1); return host.substr(1, idx - 1) } const idx = host.indexOf(':'); if (idx === -1) return host return host.substr(0, idx) } // IP addresses are not valid server names per RFC6066 // > Currently, the only server names supported are DNS hostnames function getServerName (host) { if (!host) { return null } assert.strictEqual(typeof host, 'string'); const servername = getHostname(host); if (net.isIP(servername)) { return '' } return servername } function deepClone (obj) { return JSON.parse(JSON.stringify(obj)) } function isAsyncIterable (obj) { return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') } function isIterable (obj) { return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) } function bodyLength (body) { if (body == null) { return 0 } else if (isStream(body)) { const state = body._readableState; return state && state.ended === true && Number.isFinite(state.length) ? state.length : null } else if (isBlobLike(body)) { return body.size != null ? body.size : null } else if (isBuffer(body)) { return body.byteLength } return null } function isDestroyed (stream) { return !stream || !!(stream.destroyed || stream[kDestroyed]) } function isReadableAborted (stream) { const state = stream && stream._readableState; return isDestroyed(stream) && state && !state.endEmitted } function destroy (stream, err) { if (!isStream(stream) || isDestroyed(stream)) { return } if (typeof stream.destroy === 'function') { if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { // See: https://github.com/nodejs/node/pull/38505/files stream.socket = null; } stream.destroy(err); } else if (err) { process.nextTick((stream, err) => { stream.emit('error', err); }, stream, err); } if (stream.destroyed !== true) { stream[kDestroyed] = true; } } const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; function parseKeepAliveTimeout (val) { const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); return m ? parseInt(m[1], 10) * 1000 : null } function parseHeaders (headers, obj = {}) { for (let i = 0; i < headers.length; i += 2) { const key = headers[i].toString().toLowerCase(); let val = obj[key]; if (!val) { if (Array.isArray(headers[i + 1])) { obj[key] = headers[i + 1]; } else { obj[key] = headers[i + 1].toString(); } } else { if (!Array.isArray(val)) { val = [val]; obj[key] = val; } val.push(headers[i + 1].toString()); } } return obj } function parseRawHeaders (headers) { return headers.map(header => header.toString()) } function isBuffer (buffer) { // See, https://github.com/mcollina/undici/pull/319 return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) } function validateHandler (handler, method, upgrade) { if (!handler || typeof handler !== 'object') { throw new InvalidArgumentError('handler must be an object') } if (typeof handler.onConnect !== 'function') { throw new InvalidArgumentError('invalid onConnect method') } if (typeof handler.onError !== 'function') { throw new InvalidArgumentError('invalid onError method') } if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { throw new InvalidArgumentError('invalid onBodySent method') } if (upgrade || method === 'CONNECT') { if (typeof handler.onUpgrade !== 'function') { throw new InvalidArgumentError('invalid onUpgrade method') } } else { if (typeof handler.onHeaders !== 'function') { throw new InvalidArgumentError('invalid onHeaders method') } if (typeof handler.onData !== 'function') { throw new InvalidArgumentError('invalid onData method') } if (typeof handler.onComplete !== 'function') { throw new InvalidArgumentError('invalid onComplete method') } } } // A body is disturbed if it has been read from and it cannot // be re-used without losing state or data. function isDisturbed (body) { return !!(body && ( stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? : body[kBodyUsed] || body.readableDidRead || (body._readableState && body._readableState.dataEmitted) || isReadableAborted(body) )) } function isErrored (body) { return !!(body && ( stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test(nodeUtil.inspect(body) ))) } function isReadable (body) { return !!(body && ( stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test(nodeUtil.inspect(body) ))) } function getSocketInfo (socket) { return { localAddress: socket.localAddress, localPort: socket.localPort, remoteAddress: socket.remoteAddress, remotePort: socket.remotePort, remoteFamily: socket.remoteFamily, timeout: socket.timeout, bytesWritten: socket.bytesWritten, bytesRead: socket.bytesRead } } let ReadableStream; function ReadableStreamFrom (iterable) { if (!ReadableStream) { ReadableStream = require$$10.ReadableStream; } if (ReadableStream.from) { // https://github.com/whatwg/streams/pull/1083 return ReadableStream.from(iterable) } let iterator; return new ReadableStream( { async start () { iterator = iterable[Symbol.asyncIterator](); }, async pull (controller) { const { done, value } = await iterator.next(); if (done) { queueMicrotask(() => { controller.close(); }); } else { const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); controller.enqueue(new Uint8Array(buf)); } return controller.desiredSize > 0 }, async cancel (reason) { await iterator.return(); } }, 0 ) } function isFormDataLike (chunk) { return chunk && chunk.constructor && chunk.constructor.name === 'FormData' } const kEnumerableProperty = Object.create(null); kEnumerableProperty.enumerable = true; util$1 = { kEnumerableProperty, nop, isDisturbed, isErrored, isReadable, toUSVString: nodeUtil.toUSVString || ((val) => `${val}`), isReadableAborted, isBlobLike, parseOrigin, parseURL, getServerName, isStream, isIterable, isAsyncIterable, isDestroyed, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, destroy, bodyLength, deepClone, ReadableStreamFrom, isBuffer, validateHandler, getSocketInfo, isFormDataLike, buildURL }; return util$1; } var constants$1; var hasRequiredConstants$1; function requireConstants$1 () { if (hasRequiredConstants$1) return constants$1; hasRequiredConstants$1 = 1; const corsSafeListedMethods = ['GET', 'HEAD', 'POST']; const nullBodyStatus = [101, 204, 205, 304]; const redirectStatus = [301, 302, 303, 307, 308]; const referrerPolicy = [ '', 'no-referrer', 'no-referrer-when-downgrade', 'same-origin', 'origin', 'strict-origin', 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url' ]; const requestRedirect = ['follow', 'manual', 'error']; const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']; const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']; const requestCredentials = ['omit', 'same-origin', 'include']; const requestCache = [ 'default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached' ]; const requestBodyHeader = [ 'content-encoding', 'content-language', 'content-location', 'content-type' ]; // http://fetch.spec.whatwg.org/#forbidden-method const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']; const subresource = [ 'audio', 'audioworklet', 'font', 'image', 'manifest', 'paintworklet', 'script', 'style', 'track', 'video', 'xslt', '' ]; /** @type {globalThis['DOMException']} */ const DOMException = globalThis.DOMException ?? (() => { // DOMException was only made a global in Node v17.0.0, // but fetch supports >= v16.8. try { atob('~'); } catch (err) { return Object.getPrototypeOf(err).constructor } })(); constants$1 = { DOMException, subresource, forbiddenMethods, requestBodyHeader, referrerPolicy, requestRedirect, requestMode, requestCredentials, requestCache, redirectStatus, corsSafeListedMethods, nullBodyStatus, safeMethods }; return constants$1; } var symbols; var hasRequiredSymbols; function requireSymbols () { if (hasRequiredSymbols) return symbols; hasRequiredSymbols = 1; symbols = { kUrl: Symbol('url'), kHeaders: Symbol('headers'), kSignal: Symbol('signal'), kState: Symbol('state'), kGuard: Symbol('guard'), kRealm: Symbol('realm') }; return symbols; } var webidl_1; var hasRequiredWebidl; function requireWebidl () { if (hasRequiredWebidl) return webidl_1; hasRequiredWebidl = 1; const { types } = require$$0; const { hasOwn, toUSVString } = requireUtil(); const webidl = {}; webidl.converters = {}; webidl.util = {}; webidl.errors = {}; /** * * @param {{ * header: string * message: string * }} message */ webidl.errors.exception = function (message) { throw new TypeError(`${message.header}: ${message.message}`) }; /** * Throw an error when conversion from one type to another has failed * @param {{ * prefix: string * argument: string * types: string[] * }} context */ webidl.errors.conversionFailed = function (context) { const plural = context.types.length === 1 ? '' : ' one of'; const message = `${context.argument} could not be converted to` + `${plural}: ${context.types.join(', ')}.`; return webidl.errors.exception({ header: context.prefix, message }) }; /** * Throw an error when an invalid argument is provided * @param {{ * prefix: string * value: string * type: string * }} context */ webidl.errors.invalidArgument = function (context) { return webidl.errors.exception({ header: context.prefix, message: `"${context.value}" is an invalid ${context.type}.` }) }; // https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values webidl.util.Type = function (V) { switch (typeof V) { case 'undefined': return 'Undefined' case 'boolean': return 'Boolean' case 'string': return 'String' case 'symbol': return 'Symbol' case 'number': return 'Number' case 'bigint': return 'BigInt' case 'function': case 'object': { if (V === null) { return 'Null' } return 'Object' } } }; // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { let upperBound; let lowerBound; // 1. If bitLength is 64, then: if (bitLength === 64) { // 1. Let upperBound be 2^53 − 1. upperBound = Math.pow(2, 53) - 1; // 2. If signedness is "unsigned", then let lowerBound be 0. if (signedness === 'unsigned') { lowerBound = 0; } else { // 3. Otherwise let lowerBound be −2^53 + 1. lowerBound = Math.pow(-2, 53) + 1; } } else if (signedness === 'unsigned') { // 2. Otherwise, if signedness is "unsigned", then: // 1. Let lowerBound be 0. lowerBound = 0; // 2. Let upperBound be 2^bitLength − 1. upperBound = Math.pow(2, bitLength) - 1; } else { // 3. Otherwise: // 1. Let lowerBound be -2^bitLength − 1. lowerBound = Math.pow(-2, bitLength) - 1; // 2. Let upperBound be 2^bitLength − 1 − 1. upperBound = Math.pow(2, bitLength - 1) - 1; } // 4. Let x be ? ToNumber(V). let x = Number(V); // 5. If x is −0, then set x to +0. if (Object.is(-0, x)) { x = 0; } // 6. If the conversion is to an IDL type associated // with the [EnforceRange] extended attribute, then: if (opts.enforceRange === true) { // 1. If x is NaN, +∞, or −∞, then throw a TypeError. if ( Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY ) { webidl.errors.exception({ header: 'Integer conversion', message: `Could not convert ${V} to an integer.` }); } // 2. Set x to IntegerPart(x). x = webidl.util.IntegerPart(x); // 3. If x < lowerBound or x > upperBound, then // throw a TypeError. if (x < lowerBound || x > upperBound) { webidl.errors.exception({ header: 'Integer conversion', message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` }); } // 4. Return x. return x } // 7. If x is not NaN and the conversion is to an IDL // type associated with the [Clamp] extended // attribute, then: if (!Number.isNaN(x) && opts.clamp === true) { // 1. Set x to min(max(x, lowerBound), upperBound). x = Math.min(Math.max(x, lowerBound), upperBound); // 2. Round x to the nearest integer, choosing the // even integer if it lies halfway between two, // and choosing +0 rather than −0. if (Math.floor(x) % 2 === 0) { x = Math.floor(x); } else { x = Math.ceil(x); } // 3. Return x. return x } // 8. If x is NaN, +0, +∞, or −∞, then return +0. if ( Number.isNaN(x) || Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY ) { return 0 } // 9. Set x to IntegerPart(x). x = webidl.util.IntegerPart(x); // 10. Set x to x modulo 2^bitLength. x = x % Math.pow(2, bitLength); // 11. If signedness is "signed" and x ≥ 2^bitLength − 1, // then return x − 2^bitLength. if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) { return x - Math.pow(2, bitLength) } // 12. Otherwise, return x. return x }; // https://webidl.spec.whatwg.org/#abstract-opdef-integerpart webidl.util.IntegerPart = function (n) { // 1. Let r be floor(abs(n)). const r = Math.floor(Math.abs(n)); // 2. If n < 0, then return -1 × r. if (n < 0) { return -1 * r } // 3. Otherwise, return r. return r }; // https://webidl.spec.whatwg.org/#es-sequence webidl.sequenceConverter = function (converter) { return (V) => { // 1. If Type(V) is not Object, throw a TypeError. if (webidl.util.Type(V) !== 'Object') { webidl.errors.exception({ header: 'Sequence', message: `Value of type ${webidl.util.Type(V)} is not an Object.` }); } // 2. Let method be ? GetMethod(V, @@iterator). /** @type {Generator} */ const method = V?.[Symbol.iterator]?.(); const seq = []; // 3. If method is undefined, throw a TypeError. if ( method === undefined || typeof method.next !== 'function' ) { webidl.errors.exception({ header: 'Sequence', message: 'Object is not an iterator.' }); } // https://webidl.spec.whatwg.org/#create-sequence-from-iterable while (true) { const { done, value } = method.next(); if (done) { break } seq.push(converter(value)); } return seq } }; webidl.recordConverter = function (keyConverter, valueConverter) { return (V) => { const record = {}; const type = webidl.util.Type(V); if (type === 'Undefined' || type === 'Null') { return record } if (type !== 'Object') { webidl.errors.exception({ header: 'Record', message: `Expected ${V} to be an Object type.` }); } for (let [key, value] of Object.entries(V)) { key = keyConverter(key); value = valueConverter(value); record[key] = value; } return record } }; webidl.interfaceConverter = function (i) { return (V, opts = {}) => { if (opts.strict !== false && !(V instanceof i)) { webidl.errors.exception({ header: i.name, message: `Expected ${V} to be an instance of ${i.name}.` }); } return V } }; /** * @param {{ * key: string, * defaultValue?: any, * required?: boolean, * converter: (...args: unknown[]) => unknown, * allowedValues?: any[] * }[]} converters * @returns */ webidl.dictionaryConverter = function (converters) { return (dictionary) => { const type = webidl.util.Type(dictionary); const dict = {}; if (type !== 'Null' && type !== 'Undefined' && type !== 'Object') { webidl.errors.exception({ header: 'Dictionary', message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` }); } for (const options of converters) { const { key, defaultValue, required, converter } = options; if (required === true) { if (!hasOwn(dictionary, key)) { webidl.errors.exception({ header: 'Dictionary', message: `Missing required key "${key}".` }); } } let value = dictionary[key]; const hasDefault = hasOwn(options, 'defaultValue'); // Only use defaultValue if value is undefined and // a defaultValue options was provided. if (hasDefault && value !== null) { value = value ?? defaultValue; } // A key can be optional and have no default value. // When this happens, do not perform a conversion, // and do not assign the key a value. if (required || hasDefault || value !== undefined) { value = converter(value); if ( options.allowedValues && !options.allowedValues.includes(value) ) { webidl.errors.exception({ header: 'Dictionary', message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` }); } dict[key] = value; } } return dict } }; webidl.nullableConverter = function (converter) { return (V) => { if (V === null) { return V } return converter(V) } }; // https://webidl.spec.whatwg.org/#es-DOMString webidl.converters.DOMString = function (V, opts = {}) { // 1. If V is null and the conversion is to an IDL type // associated with the [LegacyNullToEmptyString] // extended attribute, then return the DOMString value // that represents the empty string. if (V === null && opts.legacyNullToEmptyString) { return '' } // 2. Let x be ? ToString(V). if (typeof V === 'symbol') { throw new TypeError('Could not convert argument of type symbol to string.') } // 3. Return the IDL DOMString value that represents the // same sequence of code units as the one the // ECMAScript String value x represents. return String(V) }; // https://webidl.spec.whatwg.org/#es-ByteString webidl.converters.ByteString = function (V) { // 1. Let x be ? ToString(V). // Note: DOMString converter perform ? ToString(V) const x = webidl.converters.DOMString(V); // 2. If the value of any element of x is greater than // 255, then throw a TypeError. for (let index = 0; index < x.length; index++) { const charCode = x.charCodeAt(index); if (charCode > 255) { throw new TypeError( 'Cannot convert argument to a ByteString because the character at' + `index ${index} has a value of ${charCode} which is greater than 255.` ) } } // 3. Return an IDL ByteString value whose length is the // length of x, and where the value of each element is // the value of the corresponding element of x. return x }; // https://webidl.spec.whatwg.org/#es-USVString // TODO: ensure that util.toUSVString follows webidl spec webidl.converters.USVString = toUSVString; // https://webidl.spec.whatwg.org/#es-boolean webidl.converters.boolean = function (V) { // 1. Let x be the result of computing ToBoolean(V). const x = Boolean(V); // 2. Return the IDL boolean value that is the one that represents // the same truth value as the ECMAScript Boolean value x. return x }; // https://webidl.spec.whatwg.org/#es-any webidl.converters.any = function (V) { return V }; // https://webidl.spec.whatwg.org/#es-long-long webidl.converters['long long'] = function (V, opts) { // 1. Let x be ? ConvertToInt(V, 64, "signed"). const x = webidl.util.ConvertToInt(V, 64, 'signed', opts); // 2. Return the IDL long long value that represents // the same numeric value as x. return x }; // https://webidl.spec.whatwg.org/#es-unsigned-short webidl.converters['unsigned short'] = function (V) { // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). const x = webidl.util.ConvertToInt(V, 16, 'unsigned'); // 2. Return the IDL unsigned short value that represents // the same numeric value as x. return x }; // https://webidl.spec.whatwg.org/#idl-ArrayBuffer webidl.converters.ArrayBuffer = function (V, opts = {}) { // 1. If Type(V) is not Object, or V does not have an // [[ArrayBufferData]] internal slot, then throw a // TypeError. // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances if ( webidl.util.Type(V) !== 'Object' || !types.isAnyArrayBuffer(V) ) { webidl.errors.conversionFailed({ prefix: `${V}`, argument: `${V}`, types: ['ArrayBuffer'] }); } // 2. If the conversion is not to an IDL type associated // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V) is true, then throw a // TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }); } // 3. If the conversion is not to an IDL type associated // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V) is true, then throw a // TypeError. // Note: resizable ArrayBuffers are currently a proposal. // 4. Return the IDL ArrayBuffer value that is a // reference to the same object as V. return V }; webidl.converters.TypedArray = function (V, T, opts = {}) { // 1. Let T be the IDL type V is being converted to. // 2. If Type(V) is not Object, or V does not have a // [[TypedArrayName]] internal slot with a value // equal to T’s name, then throw a TypeError. if ( webidl.util.Type(V) !== 'Object' || !types.isTypedArray(V) || V.constructor.name !== T.name ) { webidl.errors.conversionFailed({ prefix: `${T.name}`, argument: `${V}`, types: [T.name] }); } // 3. If the conversion is not to an IDL type associated // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }); } // 4. If the conversion is not to an IDL type associated // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. // Note: resizable array buffers are currently a proposal // 5. Return the IDL value of type T that is a reference // to the same object as V. return V }; webidl.converters.DataView = function (V, opts = {}) { // 1. If Type(V) is not Object, or V does not have a // [[DataView]] internal slot, then throw a TypeError. if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { webidl.errors.exception({ header: 'DataView', message: 'Object is not a DataView.' }); } // 2. If the conversion is not to an IDL type associated // with the [AllowShared] extended attribute, and // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, // then throw a TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }); } // 3. If the conversion is not to an IDL type associated // with the [AllowResizable] extended attribute, and // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. // Note: resizable ArrayBuffers are currently a proposal // 4. Return the IDL DataView value that is a reference // to the same object as V. return V }; // https://webidl.spec.whatwg.org/#BufferSource webidl.converters.BufferSource = function (V, opts = {}) { if (types.isAnyArrayBuffer(V)) { return webidl.converters.ArrayBuffer(V, opts) } if (types.isTypedArray(V)) { return webidl.converters.TypedArray(V, V.constructor) } if (types.isDataView(V)) { return webidl.converters.DataView(V, opts) } throw new TypeError(`Could not convert ${V} to a BufferSource.`) }; webidl.converters['sequence'] = webidl.sequenceConverter( webidl.converters.ByteString ); webidl.converters['sequence>'] = webidl.sequenceConverter( webidl.converters['sequence'] ); webidl.converters['record'] = webidl.recordConverter( webidl.converters.ByteString, webidl.converters.ByteString ); webidl_1 = { webidl }; return webidl_1; } var file; var hasRequiredFile; function requireFile () { if (hasRequiredFile) return file; hasRequiredFile = 1; const { Blob } = require$$6$1; const { types } = require$$0; const { kState } = requireSymbols(); const { isBlobLike } = requireUtil(); const { webidl } = requireWebidl(); class File extends Blob { constructor (fileBits, fileName, options = {}) { // The File constructor is invoked with two or three parameters, depending // on whether the optional dictionary parameter is used. When the File() // constructor is invoked, user agents must run the following steps: if (arguments.length < 2) { throw new TypeError('2 arguments required') } fileBits = webidl.converters['sequence'](fileBits); fileName = webidl.converters.USVString(fileName); options = webidl.converters.FilePropertyBag(options); // 1. Let bytes be the result of processing blob parts given fileBits and // options. // Note: Blob handles this for us // 2. Let n be the fileName argument to the constructor. const n = fileName; // 3. Process FilePropertyBag dictionary argument by running the following // substeps: // 1. If the type member is provided and is not the empty string, let t // be set to the type dictionary member. If t contains any characters // outside the range U+0020 to U+007E, then set t to the empty string // and return from these substeps. // 2. Convert every character in t to ASCII lowercase. // Note: Blob handles both of these steps for us // 3. If the lastModified member is provided, let d be set to the // lastModified dictionary member. If it is not provided, set d to the // current date and time represented as the number of milliseconds since // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). const d = options.lastModified; // 4. Return a new File object F such that: // F refers to the bytes byte sequence. // F.size is set to the number of total bytes in bytes. // F.name is set to n. // F.type is set to t. // F.lastModified is set to d. super(processBlobParts(fileBits, options), { type: options.type }); this[kState] = { name: n, lastModified: d }; } get name () { if (!(this instanceof File)) { throw new TypeError('Illegal invocation') } return this[kState].name } get lastModified () { if (!(this instanceof File)) { throw new TypeError('Illegal invocation') } return this[kState].lastModified } get [Symbol.toStringTag] () { return this.constructor.name } } class FileLike { constructor (blobLike, fileName, options = {}) { // TODO: argument idl type check // The File constructor is invoked with two or three parameters, depending // on whether the optional dictionary parameter is used. When the File() // constructor is invoked, user agents must run the following steps: // 1. Let bytes be the result of processing blob parts given fileBits and // options. // 2. Let n be the fileName argument to the constructor. const n = fileName; // 3. Process FilePropertyBag dictionary argument by running the following // substeps: // 1. If the type member is provided and is not the empty string, let t // be set to the type dictionary member. If t contains any characters // outside the range U+0020 to U+007E, then set t to the empty string // and return from these substeps. // TODO const t = options.type; // 2. Convert every character in t to ASCII lowercase. // TODO // 3. If the lastModified member is provided, let d be set to the // lastModified dictionary member. If it is not provided, set d to the // current date and time represented as the number of milliseconds since // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). const d = options.lastModified ?? Date.now(); // 4. Return a new File object F such that: // F refers to the bytes byte sequence. // F.size is set to the number of total bytes in bytes. // F.name is set to n. // F.type is set to t. // F.lastModified is set to d. this[kState] = { blobLike, name: n, type: t, lastModified: d }; } stream (...args) { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.stream(...args) } arrayBuffer (...args) { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.arrayBuffer(...args) } slice (...args) { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.slice(...args) } text (...args) { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.text(...args) } get size () { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.size } get type () { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].blobLike.type } get name () { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].name } get lastModified () { if (!(this instanceof FileLike)) { throw new TypeError('Illegal invocation') } return this[kState].lastModified } get [Symbol.toStringTag] () { return 'File' } } webidl.converters.Blob = webidl.interfaceConverter(Blob); webidl.converters.BlobPart = function (V, opts) { if (webidl.util.Type(V) === 'Object') { if (isBlobLike(V)) { return webidl.converters.Blob(V, { strict: false }) } return webidl.converters.BufferSource(V, opts) } else { return webidl.converters.USVString(V, opts) } }; webidl.converters['sequence'] = webidl.sequenceConverter( webidl.converters.BlobPart ); // https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ { key: 'lastModified', converter: webidl.converters['long long'], get defaultValue () { return Date.now() } }, { key: 'type', converter: webidl.converters.DOMString, defaultValue: '' }, { key: 'endings', converter: (value) => { value = webidl.converters.DOMString(value); value = value.toLowerCase(); if (value !== 'native') { value = 'transparent'; } return value }, defaultValue: 'transparent' } ]); /** * @see https://www.w3.org/TR/FileAPI/#process-blob-parts * @param {(NodeJS.TypedArray|Blob|string)[]} parts * @param {{ type: string, endings: string }} options */ function processBlobParts (parts, options) { // 1. Let bytes be an empty sequence of bytes. /** @type {NodeJS.TypedArray[]} */ const bytes = []; // 2. For each element in parts: for (const element of parts) { // 1. If element is a USVString, run the following substeps: if (typeof element === 'string') { // 1. Let s be element. let s = element; // 2. If the endings member of options is "native", set s // to the result of converting line endings to native // of element. if (options.endings === 'native') { s = convertLineEndingsNative(s); } // 3. Append the result of UTF-8 encoding s to bytes. bytes.push(new TextEncoder().encode(s)); } else if ( types.isAnyArrayBuffer(element) || types.isTypedArray(element) ) { // 2. If element is a BufferSource, get a copy of the // bytes held by the buffer source, and append those // bytes to bytes. if (!element.buffer) { // ArrayBuffer bytes.push(new Uint8Array(element)); } else { bytes.push( new Uint8Array(element.buffer, element.byteOffset, element.byteLength) ); } } else if (isBlobLike(element)) { // 3. If element is a Blob, append the bytes it represents // to bytes. bytes.push(element); } } // 3. Return bytes. return bytes } /** * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native * @param {string} s */ function convertLineEndingsNative (s) { // 1. Let native line ending be be the code point U+000A LF. let nativeLineEnding = '\n'; // 2. If the underlying platform’s conventions are to // represent newlines as a carriage return and line feed // sequence, set native line ending to the code point // U+000D CR followed by the code point U+000A LF. if (process.platform === 'win32') { nativeLineEnding = '\r\n'; } return s.replace(/\r?\n/g, nativeLineEnding) } file = { File, FileLike }; return file; } var util; var hasRequiredUtil; function requireUtil () { if (hasRequiredUtil) return util; hasRequiredUtil = 1; const { redirectStatus } = requireConstants$1(); const { performance } = require$$1$2; const { isBlobLike, toUSVString, ReadableStreamFrom } = requireUtil$1(); const assert = require$$0$1; const { isUint8Array } = require$$4$2; let File; // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto; try { crypto = require('crypto'); } catch { } // https://fetch.spec.whatwg.org/#block-bad-port const badPorts = [ '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', '10080' ]; function responseURL (response) { // https://fetch.spec.whatwg.org/#responses // A response has an associated URL. It is a pointer to the last URL // in response’s URL list and null if response’s URL list is empty. const urlList = response.urlList; const length = urlList.length; return length === 0 ? null : urlList[length - 1].toString() } // https://fetch.spec.whatwg.org/#concept-response-location-url function responseLocationURL (response, requestFragment) { // 1. If response’s status is not a redirect status, then return null. if (!redirectStatus.includes(response.status)) { return null } // 2. Let location be the result of extracting header list values given // `Location` and response’s header list. let location = response.headersList.get('location'); // 3. If location is a value, then set location to the result of parsing // location with response’s URL. location = location ? new URL(location, responseURL(response)) : null; // 4. If location is a URL whose fragment is null, then set location’s // fragment to requestFragment. if (location && !location.hash) { location.hash = requestFragment; } // 5. Return location. return location } /** @returns {URL} */ function requestCurrentURL (request) { return request.urlList[request.urlList.length - 1] } function requestBadPort (request) { // 1. Let url be request’s current URL. const url = requestCurrentURL(request); // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, // then return blocked. if (/^https?:/.test(url.protocol) && badPorts.includes(url.port)) { return 'blocked' } // 3. Return allowed. return 'allowed' } function isFileLike (object) { if (!File) { File = requireFile().File; } return object instanceof File || ( object && (typeof object.stream === 'function' || typeof object.arrayBuffer === 'function') && /^(File)$/.test(object[Symbol.toStringTag]) ) } function isErrorLike (object) { return object instanceof Error || ( object?.constructor?.name === 'Error' || object?.constructor?.name === 'DOMException' ) } // Check whether |statusText| is a ByteString and // matches the Reason-Phrase token production. // RFC 2616: https://tools.ietf.org/html/rfc2616 // RFC 7230: https://tools.ietf.org/html/rfc7230 // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 function isValidReasonPhrase (statusText) { for (let i = 0; i < statusText.length; ++i) { const c = statusText.charCodeAt(i); if ( !( ( c === 0x09 || // HTAB (c >= 0x20 && c <= 0x7e) || // SP / VCHAR (c >= 0x80 && c <= 0xff) ) // obs-text ) ) { return false } } return true } function isTokenChar (c) { return !( c >= 0x7f || c <= 0x20 || c === '(' || c === ')' || c === '<' || c === '>' || c === '@' || c === ',' || c === ';' || c === ':' || c === '\\' || c === '"' || c === '/' || c === '[' || c === ']' || c === '?' || c === '=' || c === '{' || c === '}' ) } // See RFC 7230, Section 3.2.6. // https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 function isValidHTTPToken (characters) { if (!characters || typeof characters !== 'string') { return false } for (let i = 0; i < characters.length; ++i) { const c = characters.charCodeAt(i); if (c > 0x7f || !isTokenChar(c)) { return false } } return true } // https://fetch.spec.whatwg.org/#header-name // https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 function isValidHeaderName (potentialValue) { if (potentialValue.length === 0) { return false } for (const char of potentialValue) { if (!isValidHTTPToken(char)) { return false } } return true } /** * @see https://fetch.spec.whatwg.org/#header-value * @param {string} potentialValue */ function isValidHeaderValue (potentialValue) { // - Has no leading or trailing HTTP tab or space bytes. // - Contains no 0x00 (NUL) or HTTP newline bytes. if ( potentialValue.startsWith('\t') || potentialValue.startsWith(' ') || potentialValue.endsWith('\t') || potentialValue.endsWith(' ') ) { return false } if ( potentialValue.includes('\0') || potentialValue.includes('\r') || potentialValue.includes('\n') ) { return false } return true } // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect function setRequestReferrerPolicyOnRedirect (request, actualResponse) { } // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check function crossOriginResourcePolicyCheck () { // TODO return 'allowed' } // https://fetch.spec.whatwg.org/#concept-cors-check function corsCheck () { // TODO return 'success' } // https://fetch.spec.whatwg.org/#concept-tao-check function TAOCheck () { // TODO return 'success' } function appendFetchMetadata (httpRequest) { // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header // TODO // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header // 1. Assert: r’s url is a potentially trustworthy URL. // TODO // 2. Let header be a Structured Header whose value is a token. let header = null; // 3. Set header’s value to r’s mode. header = httpRequest.mode; // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. httpRequest.headersList.set('sec-fetch-mode', header); // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header // TODO // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header // TODO } // https://fetch.spec.whatwg.org/#append-a-request-origin-header function appendRequestOriginHeader (request) { // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. let serializedOrigin = request.origin; // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. if (request.responseTainting === 'cors' || request.mode === 'websocket') { if (serializedOrigin) { request.headersList.append('Origin', serializedOrigin); } // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: } else if (request.method !== 'GET' && request.method !== 'HEAD') { // 1. Switch on request’s referrer policy: switch (request.referrerPolicy) { case 'no-referrer': // Set serializedOrigin to `null`. serializedOrigin = null; break case 'no-referrer-when-downgrade': case 'strict-origin': case 'strict-origin-when-cross-origin': // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. if (/^https:/.test(request.origin) && !/^https:/.test(requestCurrentURL(request))) { serializedOrigin = null; } break case 'same-origin': // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. if (!sameOrigin(request, requestCurrentURL(request))) { serializedOrigin = null; } break // Do nothing. } if (serializedOrigin) { // 2. Append (`Origin`, serializedOrigin) to request’s header list. request.headersList.append('Origin', serializedOrigin); } } } function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { // TODO return performance.now() } // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info function createOpaqueTimingInfo (timingInfo) { return { startTime: timingInfo.startTime ?? 0, redirectStartTime: 0, redirectEndTime: 0, postRedirectStartTime: timingInfo.startTime ?? 0, finalServiceWorkerStartTime: 0, finalNetworkResponseStartTime: 0, finalNetworkRequestStartTime: 0, endTime: 0, encodedBodySize: 0, decodedBodySize: 0, finalConnectionTimingInfo: null } } // https://html.spec.whatwg.org/multipage/origin.html#policy-container function makePolicyContainer () { // TODO return {} } // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container function clonePolicyContainer () { // TODO return {} } // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer function determineRequestsReferrer (request) { // TODO return 'no-referrer' } /** * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist * @param {Uint8Array} bytes * @param {string} metadataList */ function bytesMatch (bytes, metadataList) { // If node is not built with OpenSSL support, we cannot check // a request's integrity, so allow it by default (the spec will // allow requests if an invalid hash is given, as precedence). /* istanbul ignore if: only if node is built with --without-ssl */ if (crypto === undefined) { return true } // 1. Let parsedMetadata be the result of parsing metadataList. const parsedMetadata = parseMetadata(metadataList); // 2. If parsedMetadata is no metadata, return true. if (parsedMetadata === 'no metadata') { return true } // 3. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } // 4. Let metadata be the result of getting the strongest // metadata from parsedMetadata. // Note: this will only work for SHA- algorithms and it's lazy *at best*. const metadata = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)); // 5. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo; // 2. Let expectedValue be the val component of item. const expectedValue = item.hash; // 3. Let actualValue be the result of applying algorithm to bytes. // Note: "applying algorithm to bytes" converts the result to base64 const actualValue = crypto.createHash(algorithm).update(bytes).digest('base64'); // 4. If actualValue is a case-sensitive match for expectedValue, // return true. if (actualValue === expectedValue) { return true } } // 6. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // hash-algo is defined in Content Security Policy 2 Section 4.2 // base64-value is similary defined there // VCHAR is defined https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={1,2}))( +[\x21-\x7e]?)?/i; /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata * @param {string} metadata */ function parseMetadata (metadata) { // 1. Let result be the empty set. /** @type {{ algo: string, hash: string }[]} */ const result = []; // 2. Let empty be equal to true. let empty = true; const supportedHashes = crypto.getHashes(); // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. empty = false; // 2. Parse token as a hash-with-options. const parsedToken = parseHashWithOptions.exec(token); // 3. If token does not parse, continue to the next token. if (parsedToken === null || parsedToken.groups === undefined) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not // check the integrity of the resource. continue } // 4. Let algorithm be the hash-algo component of token. const algorithm = parsedToken.groups.algo; // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. if (supportedHashes.includes(algorithm.toLowerCase())) { result.push(parsedToken.groups); } } // 4. Return no metadata if empty is true, otherwise return result. if (empty === true) { return 'no metadata' } return result } // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO } /** * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} * @param {URL} A * @param {URL} B */ function sameOrigin (A, B) { // 1. If A and B are the same opaque origin, then return true. // "opaque origin" is an internal value we cannot access, ignore. // 2. If A and B are both tuple origins and their schemes, // hosts, and port are identical, then return true. if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { return true } // 3. Return false. return false } function createDeferredPromise () { let res; let rej; const promise = new Promise((resolve, reject) => { res = resolve; rej = reject; }); return { promise, resolve: res, reject: rej } } function isAborted (fetchParams) { return fetchParams.controller.state === 'aborted' } function isCancelled (fetchParams) { return fetchParams.controller.state === 'aborted' || fetchParams.controller.state === 'terminated' } // https://fetch.spec.whatwg.org/#concept-method-normalize function normalizeMethod (method) { return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) ? method.toUpperCase() : method } // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string function serializeJavascriptValueToJSONString (value) { // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). const result = JSON.stringify(value); // 2. If result is undefined, then throw a TypeError. if (result === undefined) { throw new TypeError('Value is not JSON serializable') } // 3. Assert: result is a string. assert(typeof result === 'string'); // 4. Return result. return result } // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object function makeIterator (iterator, name) { const i = { next () { if (Object.getPrototypeOf(this) !== i) { throw new TypeError( `'next' called on an object that does not implement interface ${name} Iterator.` ) } return iterator.next() }, // The class string of an iterator prototype object for a given interface is the // result of concatenating the identifier of the interface and the string " Iterator". [Symbol.toStringTag]: `${name} Iterator` }; // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. Object.setPrototypeOf(i, esIteratorPrototype); // esIteratorPrototype needs to be the prototype of i // which is the prototype of an empty object. Yes, it's confusing. return Object.setPrototypeOf({}, i) } /** * @see https://fetch.spec.whatwg.org/#body-fully-read */ async function fullyReadBody (body, processBody, processBodyError) { // 1. If taskDestination is null, then set taskDestination to // the result of starting a new parallel queue. // 2. Let promise be the result of fully reading body as promise // given body. try { /** @type {Uint8Array[]} */ const chunks = []; let length = 0; const reader = body.stream.getReader(); while (true) { const { done, value } = await reader.read(); if (done === true) { break } // read-loop chunk steps assert(isUint8Array(value)); chunks.push(value); length += value.byteLength; } // 3. Let fulfilledSteps given a byte sequence bytes be to queue // a fetch task to run processBody given bytes, with // taskDestination. const fulfilledSteps = (bytes) => queueMicrotask(() => { processBody(bytes); }); fulfilledSteps(Buffer.concat(chunks, length)); } catch (err) { // 4. Let rejectedSteps be to queue a fetch task to run // processBodyError, with taskDestination. queueMicrotask(() => processBodyError(err)); } // 5. React to promise with fulfilledSteps and rejectedSteps. } /** * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. */ const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); util = { isAborted, isCancelled, createDeferredPromise, ReadableStreamFrom, toUSVString, tryUpgradeRequestToAPotentiallyTrustworthyURL, coarsenedSharedCurrentTime, determineRequestsReferrer, makePolicyContainer, clonePolicyContainer, appendFetchMetadata, appendRequestOriginHeader, TAOCheck, corsCheck, crossOriginResourcePolicyCheck, createOpaqueTimingInfo, setRequestReferrerPolicyOnRedirect, isValidHTTPToken, requestBadPort, requestCurrentURL, responseURL, responseLocationURL, isBlobLike, isFileLike, isValidReasonPhrase, sameOrigin, normalizeMethod, serializeJavascriptValueToJSONString, makeIterator, isValidHeaderName, isValidHeaderValue, hasOwn, isErrorLike, fullyReadBody, bytesMatch }; return util; } var formdata; var hasRequiredFormdata; function requireFormdata () { if (hasRequiredFormdata) return formdata; hasRequiredFormdata = 1; const { isBlobLike, isFileLike, toUSVString, makeIterator } = requireUtil(); const { kState } = requireSymbols(); const { File, FileLike } = requireFile(); const { webidl } = requireWebidl(); const { Blob } = require$$6$1; // https://xhr.spec.whatwg.org/#formdata class FormData { static name = 'FormData' constructor (form) { if (arguments.length > 0 && form != null) { webidl.errors.conversionFailed({ prefix: 'FormData constructor', argument: 'Argument 1', types: ['null'] }); } this[kState] = []; } append (name, value, filename = undefined) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 2) { throw new TypeError( `Failed to execute 'append' on 'FormData': 2 arguments required, but only ${arguments.length} present.` ) } if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" ) } // 1. Let value be value if given; otherwise blobValue. name = webidl.converters.USVString(name); value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); filename = arguments.length === 3 ? webidl.converters.USVString(filename) : undefined; // 2. Let entry be the result of creating an entry with // name, value, and filename if given. const entry = makeEntry(name, value, filename); // 3. Append entry to this’s entry list. this[kState].push(entry); } delete (name) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'delete' on 'FormData': 1 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.USVString(name); // The delete(name) method steps are to remove all entries whose name // is name from this’s entry list. const next = []; for (const entry of this[kState]) { if (entry.name !== name) { next.push(entry); } } this[kState] = next; } get (name) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'get' on 'FormData': 1 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.USVString(name); // 1. If there is no entry whose name is name in this’s entry list, // then return null. const idx = this[kState].findIndex((entry) => entry.name === name); if (idx === -1) { return null } // 2. Return the value of the first entry whose name is name from // this’s entry list. return this[kState][idx].value } getAll (name) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'getAll' on 'FormData': 1 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.USVString(name); // 1. If there is no entry whose name is name in this’s entry list, // then return the empty list. // 2. Return the values of all entries whose name is name, in order, // from this’s entry list. return this[kState] .filter((entry) => entry.name === name) .map((entry) => entry.value) } has (name) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'has' on 'FormData': 1 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.USVString(name); // The has(name) method steps are to return true if there is an entry // whose name is name in this’s entry list; otherwise false. return this[kState].findIndex((entry) => entry.name === name) !== -1 } set (name, value, filename = undefined) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 2) { throw new TypeError( `Failed to execute 'set' on 'FormData': 2 arguments required, but only ${arguments.length} present.` ) } if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" ) } // The set(name, value) and set(name, blobValue, filename) method steps // are: // 1. Let value be value if given; otherwise blobValue. name = webidl.converters.USVString(name); value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); filename = arguments.length === 3 ? toUSVString(filename) : undefined; // 2. Let entry be the result of creating an entry with name, value, and // filename if given. const entry = makeEntry(name, value, filename); // 3. If there are entries in this’s entry list whose name is name, then // replace the first such entry with entry and remove the others. const idx = this[kState].findIndex((entry) => entry.name === name); if (idx !== -1) { this[kState] = [ ...this[kState].slice(0, idx), entry, ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) ]; } else { // 4. Otherwise, append entry to this’s entry list. this[kState].push(entry); } } get [Symbol.toStringTag] () { return this.constructor.name } entries () { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } return makeIterator( makeIterable(this[kState], 'entries'), 'FormData' ) } keys () { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } return makeIterator( makeIterable(this[kState], 'keys'), 'FormData' ) } values () { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } return makeIterator( makeIterable(this[kState], 'values'), 'FormData' ) } /** * @param {(value: string, key: string, self: FormData) => void} callbackFn * @param {unknown} thisArg */ forEach (callbackFn, thisArg = globalThis) { if (!(this instanceof FormData)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'forEach' on 'FormData': 1 argument required, but only ${arguments.length} present.` ) } if (typeof callbackFn !== 'function') { throw new TypeError( "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." ) } for (const [key, value] of this) { callbackFn.apply(thisArg, [value, key, this]); } } } FormData.prototype[Symbol.iterator] = FormData.prototype.entries; /** * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry * @param {string} name * @param {string|Blob} value * @param {?string} filename * @returns */ function makeEntry (name, value, filename) { // 1. Set name to the result of converting name into a scalar value string. // "To convert a string into a scalar value string, replace any surrogates // with U+FFFD." // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end name = Buffer.from(name).toString('utf8'); // 2. If value is a string, then set value to the result of converting // value into a scalar value string. if (typeof value === 'string') { value = Buffer.from(value).toString('utf8'); } else { // 3. Otherwise: // 1. If value is not a File object, then set value to a new File object, // representing the same bytes, whose name attribute value is "blob" if (!isFileLike(value)) { value = value instanceof Blob ? new File([value], 'blob', { type: value.type }) : new FileLike(value, 'blob', { type: value.type }); } // 2. If filename is given, then set value to a new File object, // representing the same bytes, whose name attribute is filename. if (filename !== undefined) { value = value instanceof File ? new File([value], filename, { type: value.type }) : new FileLike(value, filename, { type: value.type }); } } // 4. Return an entry whose name is name and whose value is value. return { name, value } } function * makeIterable (entries, type) { // The value pairs to iterate over are this’s entry list’s entries // with the key being the name and the value being the value. for (const { name, value } of entries) { if (type === 'entries') { yield [name, value]; } else if (type === 'values') { yield value; } else { yield name; } } } formdata = { FormData }; return formdata; } var body; var hasRequiredBody; function requireBody () { if (hasRequiredBody) return body; hasRequiredBody = 1; const util = requireUtil$1(); const { ReadableStreamFrom, toUSVString, isBlobLike } = requireUtil(); const { FormData } = requireFormdata(); const { kState } = requireSymbols(); const { webidl } = requireWebidl(); const { Blob } = require$$6$1; const { kBodyUsed } = requireSymbols$1(); const assert = require$$0$1; const { NotSupportedError } = requireErrors(); const { isErrored } = requireUtil$1(); const { isUint8Array, isArrayBuffer } = require$$4$2; let ReadableStream; async function * blobGen (blob) { yield * blob.stream(); } // https://fetch.spec.whatwg.org/#concept-bodyinit-extract function extractBody (object, keepalive = false) { if (!ReadableStream) { ReadableStream = require$$10.ReadableStream; } // 1. Let stream be object if object is a ReadableStream object. // Otherwise, let stream be a new ReadableStream, and set up stream. let stream = null; // 2. Let action be null. let action = null; // 3. Let source be null. let source = null; // 4. Let length be null. let length = null; // 5. Let Content-Type be null. let contentType = null; // 6. Switch on object: if (object == null) ; else if (object instanceof URLSearchParams) { // URLSearchParams // spec says to run application/x-www-form-urlencoded on body.list // this is implemented in Node.js as apart of an URLSearchParams instance toString method // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. source = object.toString(); // Set Content-Type to `application/x-www-form-urlencoded;charset=UTF-8`. contentType = 'application/x-www-form-urlencoded;charset=UTF-8'; } else if (isArrayBuffer(object)) { // BufferSource/ArrayBuffer // Set source to a copy of the bytes held by object. source = new Uint8Array(object.slice()); } else if (ArrayBuffer.isView(object)) { // BufferSource/ArrayBufferView // Set source to a copy of the bytes held by object. source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); } else if (util.isFormDataLike(object)) { const boundary = '----formdata-undici-' + Math.random(); const prefix = `--${boundary}\r\nContent-Disposition: form-data`; /*! formdata-polyfill. MIT License. Jimmy Wärting */ const escape = (str) => str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22'); const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n'); // Set action to this step: run the multipart/form-data // encoding algorithm, with object’s entry list and UTF-8. action = async function * (object) { const enc = new TextEncoder(); for (const [name, value] of object) { if (typeof value === 'string') { yield enc.encode( prefix + `; name="${escape(normalizeLinefeeds(name))}"` + `\r\n\r\n${normalizeLinefeeds(value)}\r\n` ); } else { yield enc.encode( prefix + `; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + `Content-Type: ${ value.type || 'application/octet-stream' }\r\n\r\n` ); yield * blobGen(value); yield enc.encode('\r\n'); } } yield enc.encode(`--${boundary}--`); }; // Set source to object. source = object; // Set length to unclear, see html/6424 for improving this. // TODO // Set Content-Type to `multipart/form-data; boundary=`, // followed by the multipart/form-data boundary string generated // by the multipart/form-data encoding algorithm. contentType = 'multipart/form-data; boundary=' + boundary; } else if (isBlobLike(object)) { // Blob // Set action to this step: read object. action = blobGen; // Set source to object. source = object; // Set length to object’s size. length = object.size; // If object’s type attribute is not the empty byte sequence, set // Content-Type to its value. if (object.type) { contentType = object.type; } } else if (typeof object[Symbol.asyncIterator] === 'function') { // If keepalive is true, then throw a TypeError. if (keepalive) { throw new TypeError('keepalive') } // If object is disturbed or locked, then throw a TypeError. if (util.isDisturbed(object) || object.locked) { throw new TypeError( 'Response body object should not be disturbed or locked' ) } stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); } else { // TODO: byte sequence? // TODO: scalar value string? // TODO: else? source = toUSVString(object); contentType = 'text/plain;charset=UTF-8'; } // 7. If source is a byte sequence, then set action to a // step that returns source and length to source’s length. // TODO: What is a "byte sequence?" if (typeof source === 'string' || util.isBuffer(source)) { length = Buffer.byteLength(source); } // 8. If action is non-null, then run these steps in in parallel: if (action != null) { // Run action. let iterator; stream = new ReadableStream({ async start () { iterator = action(object)[Symbol.asyncIterator](); }, async pull (controller) { const { value, done } = await iterator.next(); if (done) { // When running action is done, close stream. queueMicrotask(() => { controller.close(); }); } else { // Whenever one or more bytes are available and stream is not errored, // enqueue a Uint8Array wrapping an ArrayBuffer containing the available // bytes into stream. if (!isErrored(stream)) { controller.enqueue(new Uint8Array(value)); } } return controller.desiredSize > 0 }, async cancel (reason) { await iterator.return(); } }); } else if (!stream) { // TODO: Spec doesn't say anything about this? stream = new ReadableStream({ async pull (controller) { controller.enqueue( typeof source === 'string' ? new TextEncoder().encode(source) : source ); queueMicrotask(() => { controller.close(); }); } }); } // 9. Let body be a body whose stream is stream, source is source, // and length is length. const body = { stream, source, length }; // 10. Return body and Content-Type. return [body, contentType] } // https://fetch.spec.whatwg.org/#bodyinit-safely-extract function safelyExtractBody (object, keepalive = false) { if (!ReadableStream) { // istanbul ignore next ReadableStream = require$$10.ReadableStream; } // To safely extract a body and a `Content-Type` value from // a byte sequence or BodyInit object object, run these steps: // 1. If object is a ReadableStream object, then: if (object instanceof ReadableStream) { // Assert: object is neither disturbed nor locked. // istanbul ignore next assert(!util.isDisturbed(object), 'disturbed'); // istanbul ignore next assert(!object.locked, 'locked'); } // 2. Return the results of extracting object. return extractBody(object, keepalive) } function cloneBody (body) { // To clone a body body, run these steps: // https://fetch.spec.whatwg.org/#concept-body-clone // 1. Let « out1, out2 » be the result of teeing body’s stream. const [out1, out2] = body.stream.tee(); // 2. Set body’s stream to out1. body.stream = out1; // 3. Return a body whose stream is out2 and other members are copied from body. return { stream: out2, length: body.length, source: body.source } } async function * consumeBody (body) { if (body) { if (isUint8Array(body)) { yield body; } else { const stream = body.stream; if (util.isDisturbed(stream)) { throw new TypeError('disturbed') } if (stream.locked) { throw new TypeError('locked') } // Compat. stream[kBodyUsed] = true; yield * stream; } } } function bodyMixinMethods (instance) { const methods = { async blob () { if (!(this instanceof instance)) { throw new TypeError('Illegal invocation') } const chunks = []; for await (const chunk of consumeBody(this[kState].body)) { if (!isUint8Array(chunk)) { throw new TypeError('Expected Uint8Array chunk') } // Assemble one final large blob with Uint8Array's can exhaust memory. // That's why we create create multiple blob's and using references chunks.push(new Blob([chunk])); } return new Blob(chunks, { type: this.headers.get('Content-Type') || '' }) }, async arrayBuffer () { if (!(this instanceof instance)) { throw new TypeError('Illegal invocation') } const contentLength = this.headers.get('content-length'); const encoded = this.headers.has('content-encoding'); // if we have content length and no encoding, then we can // pre allocate the buffer and just read the data into it if (!encoded && contentLength) { const buffer = new Uint8Array(contentLength); let offset = 0; for await (const chunk of consumeBody(this[kState].body)) { if (!isUint8Array(chunk)) { throw new TypeError('Expected Uint8Array chunk') } buffer.set(chunk, offset); offset += chunk.length; } return buffer.buffer } // if we don't have content length, then we have to allocate 2x the // size of the body, once for consumed data, and once for the final buffer // This could be optimized by using growable ArrayBuffer, but it's not // implemented yet. https://github.com/tc39/proposal-resizablearraybuffer const chunks = []; let size = 0; for await (const chunk of consumeBody(this[kState].body)) { if (!isUint8Array(chunk)) { throw new TypeError('Expected Uint8Array chunk') } chunks.push(chunk); size += chunk.byteLength; } const buffer = new Uint8Array(size); let offset = 0; for (const chunk of chunks) { buffer.set(chunk, offset); offset += chunk.byteLength; } return buffer.buffer }, async text () { if (!(this instanceof instance)) { throw new TypeError('Illegal invocation') } let result = ''; const textDecoder = new TextDecoder(); for await (const chunk of consumeBody(this[kState].body)) { if (!isUint8Array(chunk)) { throw new TypeError('Expected Uint8Array chunk') } result += textDecoder.decode(chunk, { stream: true }); } // flush result += textDecoder.decode(); return result }, async json () { if (!(this instanceof instance)) { throw new TypeError('Illegal invocation') } return JSON.parse(await this.text()) }, async formData () { if (!(this instanceof instance)) { throw new TypeError('Illegal invocation') } const contentType = this.headers.get('Content-Type'); // If mimeType’s essence is "multipart/form-data", then: if (/multipart\/form-data/.test(contentType)) { throw new NotSupportedError('multipart/form-data not supported') } else if (/application\/x-www-form-urlencoded/.test(contentType)) { // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: // 1. Let entries be the result of parsing bytes. let entries; try { let text = ''; // application/x-www-form-urlencoded parser will keep the BOM. // https://url.spec.whatwg.org/#concept-urlencoded-parser const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }); for await (const chunk of consumeBody(this[kState].body)) { if (!isUint8Array(chunk)) { throw new TypeError('Expected Uint8Array chunk') } text += textDecoder.decode(chunk, { stream: true }); } text += textDecoder.decode(); entries = new URLSearchParams(text); } catch (err) { // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. // 2. If entries is failure, then throw a TypeError. throw Object.assign(new TypeError(), { cause: err }) } // 3. Return a new FormData object whose entries are entries. const formData = new FormData(); for (const [name, value] of entries) { formData.append(name, value); } return formData } else { // Otherwise, throw a TypeError. webidl.errors.exception({ header: `${instance.name}.formData`, value: 'Could not parse content as FormData.' }); } } }; return methods } const properties = { body: { enumerable: true, get () { if (!this || !this[kState]) { throw new TypeError('Illegal invocation') } return this[kState].body ? this[kState].body.stream : null } }, bodyUsed: { enumerable: true, get () { if (!this || !this[kState]) { throw new TypeError('Illegal invocation') } return !!this[kState].body && util.isDisturbed(this[kState].body.stream) } } }; function mixinBody (prototype) { Object.assign(prototype.prototype, bodyMixinMethods(prototype)); Object.defineProperties(prototype.prototype, properties); } body = { extractBody, safelyExtractBody, cloneBody, mixinBody }; return body; } var request$1; var hasRequiredRequest$1; function requireRequest$1 () { if (hasRequiredRequest$1) return request$1; hasRequiredRequest$1 = 1; const { InvalidArgumentError, NotSupportedError } = requireErrors(); const assert = require$$0$1; const util = requireUtil$1(); // tokenRegExp and headerCharRegex have been lifted from // https://github.com/nodejs/node/blob/main/lib/_http_common.js /** * Verifies that the given val is a valid HTTP token * per the rules defined in RFC 7230 * See https://tools.ietf.org/html/rfc7230#section-3.2.6 */ const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; /** * Matches if val contains an invalid field-vchar * field-value = *( field-content / obs-fold ) * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text */ const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; // Verifies that a given path is valid does not contain control chars \x00 to \x20 const invalidPathRegex = /[^\u0021-\u00ff]/; const kHandler = Symbol('handler'); const channels = {}; let extractBody; const nodeVersion = process.versions.node.split('.'); const nodeMajor = Number(nodeVersion[0]); const nodeMinor = Number(nodeVersion[1]); try { const diagnosticsChannel = require('diagnostics_channel'); channels.create = diagnosticsChannel.channel('undici:request:create'); channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent'); channels.headers = diagnosticsChannel.channel('undici:request:headers'); channels.trailers = diagnosticsChannel.channel('undici:request:trailers'); channels.error = diagnosticsChannel.channel('undici:request:error'); } catch { channels.create = { hasSubscribers: false }; channels.bodySent = { hasSubscribers: false }; channels.headers = { hasSubscribers: false }; channels.trailers = { hasSubscribers: false }; channels.error = { hasSubscribers: false }; } class Request { constructor (origin, { path, method, body, headers, query, idempotent, blocking, upgrade, headersTimeout, bodyTimeout, throwOnError }, handler) { if (typeof path !== 'string') { throw new InvalidArgumentError('path must be a string') } else if ( path[0] !== '/' && !(path.startsWith('http://') || path.startsWith('https://')) && method !== 'CONNECT' ) { throw new InvalidArgumentError('path must be an absolute URL or start with a slash') } else if (invalidPathRegex.exec(path) !== null) { throw new InvalidArgumentError('invalid request path') } if (typeof method !== 'string') { throw new InvalidArgumentError('method must be a string') } else if (tokenRegExp.exec(method) === null) { throw new InvalidArgumentError('invalid request method') } if (upgrade && typeof upgrade !== 'string') { throw new InvalidArgumentError('upgrade must be a string') } if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { throw new InvalidArgumentError('invalid headersTimeout') } if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { throw new InvalidArgumentError('invalid bodyTimeout') } this.headersTimeout = headersTimeout; this.bodyTimeout = bodyTimeout; this.throwOnError = throwOnError === true; this.method = method; if (body == null) { this.body = null; } else if (util.isStream(body)) { this.body = body; } else if (util.isBuffer(body)) { this.body = body.byteLength ? body : null; } else if (ArrayBuffer.isView(body)) { this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; } else if (body instanceof ArrayBuffer) { this.body = body.byteLength ? Buffer.from(body) : null; } else if (typeof body === 'string') { this.body = body.length ? Buffer.from(body) : null; } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { this.body = body; } else { throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') } this.completed = false; this.aborted = false; this.upgrade = upgrade || null; this.path = query ? util.buildURL(path, query) : path; this.origin = origin; this.idempotent = idempotent == null ? method === 'HEAD' || method === 'GET' : idempotent; this.blocking = blocking == null ? false : blocking; this.host = null; this.contentLength = null; this.contentType = null; this.headers = ''; if (Array.isArray(headers)) { if (headers.length % 2 !== 0) { throw new InvalidArgumentError('headers array must be even') } for (let i = 0; i < headers.length; i += 2) { processHeader(this, headers[i], headers[i + 1]); } } else if (headers && typeof headers === 'object') { const keys = Object.keys(headers); for (let i = 0; i < keys.length; i++) { const key = keys[i]; processHeader(this, key, headers[key]); } } else if (headers != null) { throw new InvalidArgumentError('headers must be an object or an array') } if (util.isFormDataLike(this.body)) { if (nodeMajor < 16 || (nodeMajor === 16 && nodeMinor < 8)) { throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') } if (!extractBody) { extractBody = requireBody().extractBody; } const [bodyStream, contentType] = extractBody(body); if (this.contentType == null) { this.contentType = contentType; this.headers += `content-type: ${contentType}\r\n`; } this.body = bodyStream.stream; } else if (util.isBlobLike(body) && this.contentType == null && body.type) { this.contentType = body.type; this.headers += `content-type: ${body.type}\r\n`; } util.validateHandler(handler, method, upgrade); this.servername = util.getServerName(this.host); this[kHandler] = handler; if (channels.create.hasSubscribers) { channels.create.publish({ request: this }); } } onBodySent (chunk) { if (this[kHandler].onBodySent) { try { this[kHandler].onBodySent(chunk); } catch (err) { this.onError(err); } } } onRequestSent () { if (channels.bodySent.hasSubscribers) { channels.bodySent.publish({ request: this }); } } onConnect (abort) { assert(!this.aborted); assert(!this.completed); return this[kHandler].onConnect(abort) } onHeaders (statusCode, headers, resume, statusText) { assert(!this.aborted); assert(!this.completed); if (channels.headers.hasSubscribers) { channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); } return this[kHandler].onHeaders(statusCode, headers, resume, statusText) } onData (chunk) { assert(!this.aborted); assert(!this.completed); return this[kHandler].onData(chunk) } onUpgrade (statusCode, headers, socket) { assert(!this.aborted); assert(!this.completed); return this[kHandler].onUpgrade(statusCode, headers, socket) } onComplete (trailers) { assert(!this.aborted); this.completed = true; if (channels.trailers.hasSubscribers) { channels.trailers.publish({ request: this, trailers }); } return this[kHandler].onComplete(trailers) } onError (error) { if (channels.error.hasSubscribers) { channels.error.publish({ request: this, error }); } if (this.aborted) { return } this.aborted = true; return this[kHandler].onError(error) } addHeader (key, value) { processHeader(this, key, value); return this } } function processHeader (request, key, val) { if (val && typeof val === 'object') { throw new InvalidArgumentError(`invalid ${key} header`) } else if (val === undefined) { return } if ( request.host === null && key.length === 4 && key.toLowerCase() === 'host' ) { // Consumed by Client request.host = val; } else if ( request.contentLength === null && key.length === 14 && key.toLowerCase() === 'content-length' ) { request.contentLength = parseInt(val, 10); if (!Number.isFinite(request.contentLength)) { throw new InvalidArgumentError('invalid content-length header') } } else if ( request.contentType === null && key.length === 12 && key.toLowerCase() === 'content-type' && headerCharRegex.exec(val) === null ) { request.contentType = val; request.headers += `${key}: ${val}\r\n`; } else if ( key.length === 17 && key.toLowerCase() === 'transfer-encoding' ) { throw new InvalidArgumentError('invalid transfer-encoding header') } else if ( key.length === 10 && key.toLowerCase() === 'connection' ) { throw new InvalidArgumentError('invalid connection header') } else if ( key.length === 10 && key.toLowerCase() === 'keep-alive' ) { throw new InvalidArgumentError('invalid keep-alive header') } else if ( key.length === 7 && key.toLowerCase() === 'upgrade' ) { throw new InvalidArgumentError('invalid upgrade header') } else if ( key.length === 6 && key.toLowerCase() === 'expect' ) { throw new NotSupportedError('expect header not supported') } else if (tokenRegExp.exec(key) === null) { throw new InvalidArgumentError('invalid header key') } else if (headerCharRegex.exec(val) !== null) { throw new InvalidArgumentError(`invalid ${key} header`) } else { request.headers += `${key}: ${val}\r\n`; } } request$1 = Request; return request$1; } var dispatcher; var hasRequiredDispatcher; function requireDispatcher () { if (hasRequiredDispatcher) return dispatcher; hasRequiredDispatcher = 1; const EventEmitter = require$$0$2; class Dispatcher extends EventEmitter { dispatch () { throw new Error('not implemented') } close () { throw new Error('not implemented') } destroy () { throw new Error('not implemented') } } dispatcher = Dispatcher; return dispatcher; } var dispatcherBase; var hasRequiredDispatcherBase; function requireDispatcherBase () { if (hasRequiredDispatcherBase) return dispatcherBase; hasRequiredDispatcherBase = 1; const Dispatcher = requireDispatcher(); const { ClientDestroyedError, ClientClosedError, InvalidArgumentError } = requireErrors(); const { kDestroy, kClose, kDispatch } = requireSymbols$1(); const kDestroyed = Symbol('destroyed'); const kClosed = Symbol('closed'); const kOnDestroyed = Symbol('onDestroyed'); const kOnClosed = Symbol('onClosed'); class DispatcherBase extends Dispatcher { constructor () { super(); this[kDestroyed] = false; this[kOnDestroyed] = []; this[kClosed] = false; this[kOnClosed] = []; } get destroyed () { return this[kDestroyed] } get closed () { return this[kClosed] } close (callback) { if (callback === undefined) { return new Promise((resolve, reject) => { this.close((err, data) => { return err ? reject(err) : resolve(data) }); }) } if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } if (this[kDestroyed]) { queueMicrotask(() => callback(new ClientDestroyedError(), null)); return } if (this[kClosed]) { if (this[kOnClosed]) { this[kOnClosed].push(callback); } else { queueMicrotask(() => callback(null, null)); } return } this[kClosed] = true; this[kOnClosed].push(callback); const onClosed = () => { const callbacks = this[kOnClosed]; this[kOnClosed] = null; for (let i = 0; i < callbacks.length; i++) { callbacks[i](null, null); } }; // Should not error. this[kClose]() .then(() => this.destroy()) .then(() => { queueMicrotask(onClosed); }); } destroy (err, callback) { if (typeof err === 'function') { callback = err; err = null; } if (callback === undefined) { return new Promise((resolve, reject) => { this.destroy(err, (err, data) => { return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) }); }) } if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } if (this[kDestroyed]) { if (this[kOnDestroyed]) { this[kOnDestroyed].push(callback); } else { queueMicrotask(() => callback(null, null)); } return } if (!err) { err = new ClientDestroyedError(); } this[kDestroyed] = true; this[kOnDestroyed].push(callback); const onDestroyed = () => { const callbacks = this[kOnDestroyed]; this[kOnDestroyed] = null; for (let i = 0; i < callbacks.length; i++) { callbacks[i](null, null); } }; // Should not error. this[kDestroy](err).then(() => { queueMicrotask(onDestroyed); }); } dispatch (opts, handler) { if (!handler || typeof handler !== 'object') { throw new InvalidArgumentError('handler must be an object') } try { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('opts must be an object.') } if (this[kDestroyed]) { throw new ClientDestroyedError() } if (this[kClosed]) { throw new ClientClosedError() } return this[kDispatch](opts, handler) } catch (err) { if (typeof handler.onError !== 'function') { throw new InvalidArgumentError('invalid onError method') } handler.onError(err); return false } } } dispatcherBase = DispatcherBase; return dispatcherBase; } var redirect$1; var hasRequiredRedirect; function requireRedirect () { if (hasRequiredRedirect) return redirect$1; hasRequiredRedirect = 1; const util = requireUtil$1(); const { kBodyUsed } = requireSymbols$1(); const assert = require$$0$1; const { InvalidArgumentError } = requireErrors(); const EE = require$$0$2; const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; const kBody = Symbol('body'); class BodyAsyncIterable { constructor (body) { this[kBody] = body; this[kBodyUsed] = false; } async * [Symbol.asyncIterator] () { assert(!this[kBodyUsed], 'disturbed'); this[kBodyUsed] = true; yield * this[kBody]; } } class RedirectHandler { constructor (dispatcher, maxRedirections, opts, handler) { if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { throw new InvalidArgumentError('maxRedirections must be a positive number') } util.validateHandler(handler, opts.method, opts.upgrade); this.dispatcher = dispatcher; this.location = null; this.abort = null; this.opts = { ...opts, maxRedirections: 0 }; // opts must be a copy this.maxRedirections = maxRedirections; this.handler = handler; this.history = []; if (util.isStream(this.opts.body)) { // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp // so that it can be dispatched again? // TODO (fix): Do we need 100-expect support to provide a way to do this properly? if (util.bodyLength(this.opts.body) === 0) { this.opts.body .on('data', function () { assert(false); }); } if (typeof this.opts.body.readableDidRead !== 'boolean') { this.opts.body[kBodyUsed] = false; EE.prototype.on.call(this.opts.body, 'data', function () { this[kBodyUsed] = true; }); } } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { // TODO (fix): We can't access ReadableStream internal state // to determine whether or not it has been disturbed. This is just // a workaround. this.opts.body = new BodyAsyncIterable(this.opts.body); } else if ( this.opts.body && typeof this.opts.body !== 'string' && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body) ) { // TODO: Should we allow re-using iterable if !this.opts.idempotent // or through some other flag? this.opts.body = new BodyAsyncIterable(this.opts.body); } } onConnect (abort) { this.abort = abort; this.handler.onConnect(abort, { history: this.history }); } onUpgrade (statusCode, headers, socket) { this.handler.onUpgrade(statusCode, headers, socket); } onError (error) { this.handler.onError(error); } onHeaders (statusCode, headers, resume, statusText) { this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); if (this.opts.origin) { this.history.push(new URL(this.opts.path, this.opts.origin)); } if (!this.location) { return this.handler.onHeaders(statusCode, headers, resume, statusText) } const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); const path = search ? `${pathname}${search}` : pathname; // Remove headers referring to the original URL. // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. // https://tools.ietf.org/html/rfc7231#section-6.4 this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); this.opts.path = path; this.opts.origin = origin; this.opts.maxRedirections = 0; // https://tools.ietf.org/html/rfc7231#section-6.4.4 // In case of HTTP 303, always replace method to be either HEAD or GET if (statusCode === 303 && this.opts.method !== 'HEAD') { this.opts.method = 'GET'; this.opts.body = null; } } onData (chunk) { if (this.location) ; else { return this.handler.onData(chunk) } } onComplete (trailers) { if (this.location) { /* https://tools.ietf.org/html/rfc7231#section-6.4 TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections and neither are useful if present. See comment on onData method above for more detailed informations. */ this.location = null; this.abort = null; this.dispatcher.dispatch(this.opts, this); } else { this.handler.onComplete(trailers); } } onBodySent (chunk) { if (this.handler.onBodySent) { this.handler.onBodySent(chunk); } } } function parseLocation (statusCode, headers) { if (redirectableStatusCodes.indexOf(statusCode) === -1) { return null } for (let i = 0; i < headers.length; i += 2) { if (headers[i].toString().toLowerCase() === 'location') { return headers[i + 1] } } } // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { return ( (header.length === 4 && header.toString().toLowerCase() === 'host') || (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') ) } // https://tools.ietf.org/html/rfc7231#section-6.4 function cleanRequestHeaders (headers, removeContent, unknownOrigin) { const ret = []; if (Array.isArray(headers)) { for (let i = 0; i < headers.length; i += 2) { if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { ret.push(headers[i], headers[i + 1]); } } } else if (headers && typeof headers === 'object') { for (const key of Object.keys(headers)) { if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { ret.push(key, headers[key]); } } } else { assert(headers == null, 'headers must be an object or an array'); } return ret } redirect$1 = RedirectHandler; return redirect$1; } var connect; var hasRequiredConnect; function requireConnect () { if (hasRequiredConnect) return connect; hasRequiredConnect = 1; const net = require$$4$1; const assert = require$$0$1; const util = requireUtil$1(); const { InvalidArgumentError, ConnectTimeoutError } = requireErrors(); let tls; // include tls conditionally since it is not always available // TODO: session re-use does not wait for the first // connection to resolve the session and might therefore // resolve the same servername multiple times even when // re-use is enabled. function buildConnector ({ maxCachedSessions, socketPath, timeout, ...opts }) { if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') } const options = { path: socketPath, ...opts }; const sessionCache = new Map(); timeout = timeout == null ? 10e3 : timeout; maxCachedSessions = maxCachedSessions == null ? 100 : maxCachedSessions; return function connect ({ hostname, host, protocol, port, servername, httpSocket }, callback) { let socket; if (protocol === 'https:') { if (!tls) { tls = require$$4$3; } servername = servername || options.servername || util.getServerName(host) || null; const sessionKey = servername || hostname; const session = sessionCache.get(sessionKey) || null; assert(sessionKey); socket = tls.connect({ highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... ...options, servername, session, socket: httpSocket, // upgrade socket connection port: port || 443, host: hostname }); socket .on('session', function (session) { // cache is disabled if (maxCachedSessions === 0) { return } if (sessionCache.size >= maxCachedSessions) { // remove the oldest session const { value: oldestKey } = sessionCache.keys().next(); sessionCache.delete(oldestKey); } sessionCache.set(sessionKey, session); }) .on('error', function (err) { if (sessionKey && err.code !== 'UND_ERR_INFO') { // TODO (fix): Only delete for session related errors. sessionCache.delete(sessionKey); } }); } else { assert(!httpSocket, 'httpSocket can only be sent on TLS update'); socket = net.connect({ highWaterMark: 64 * 1024, // Same as nodejs fs streams. ...options, port: port || 80, host: hostname }); } const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); socket .setNoDelay(true) .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { cancelTimeout(); if (callback) { const cb = callback; callback = null; cb(null, this); } }) .on('error', function (err) { cancelTimeout(); if (callback) { const cb = callback; callback = null; cb(err); } }); return socket } } function setupTimeout (onConnectTimeout, timeout) { if (!timeout) { return () => {} } let s1 = null; let s2 = null; const timeoutId = setTimeout(() => { // setImmediate is added to make sure that we priotorise socket error events over timeouts s1 = setImmediate(() => { if (process.platform === 'win32') { // Windows needs an extra setImmediate probably due to implementation differences in the socket logic s2 = setImmediate(() => onConnectTimeout()); } else { onConnectTimeout(); } }); }, timeout); return () => { clearTimeout(timeoutId); clearImmediate(s1); clearImmediate(s2); } } function onConnectTimeout (socket) { util.destroy(socket, new ConnectTimeoutError()); } connect = buildConnector; return connect; } var constants = {}; var utils$1 = {}; var hasRequiredUtils; function requireUtils () { if (hasRequiredUtils) return utils$1; hasRequiredUtils = 1; Object.defineProperty(utils$1, "__esModule", { value: true }); utils$1.enumToMap = void 0; function enumToMap(obj) { const res = {}; Object.keys(obj).forEach((key) => { const value = obj[key]; if (typeof value === 'number') { res[key] = value; } }); return res; } utils$1.enumToMap = enumToMap; return utils$1; } var hasRequiredConstants; function requireConstants () { if (hasRequiredConstants) return constants; hasRequiredConstants = 1; (function (exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; const utils_1 = requireUtils(); (function (ERROR) { ERROR[ERROR["OK"] = 0] = "OK"; ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; ERROR[ERROR["STRICT"] = 2] = "STRICT"; ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; ERROR[ERROR["USER"] = 24] = "USER"; })(exports.ERROR || (exports.ERROR = {})); (function (TYPE) { TYPE[TYPE["BOTH"] = 0] = "BOTH"; TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; })(exports.TYPE || (exports.TYPE = {})); (function (FLAGS) { FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; // 1 << 8 is unused FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; })(exports.FLAGS || (exports.FLAGS = {})); (function (LENIENT_FLAGS) { LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; })(exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); var METHODS; (function (METHODS) { METHODS[METHODS["DELETE"] = 0] = "DELETE"; METHODS[METHODS["GET"] = 1] = "GET"; METHODS[METHODS["HEAD"] = 2] = "HEAD"; METHODS[METHODS["POST"] = 3] = "POST"; METHODS[METHODS["PUT"] = 4] = "PUT"; /* pathological */ METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; METHODS[METHODS["TRACE"] = 7] = "TRACE"; /* WebDAV */ METHODS[METHODS["COPY"] = 8] = "COPY"; METHODS[METHODS["LOCK"] = 9] = "LOCK"; METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; METHODS[METHODS["MOVE"] = 11] = "MOVE"; METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; METHODS[METHODS["BIND"] = 16] = "BIND"; METHODS[METHODS["REBIND"] = 17] = "REBIND"; METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; METHODS[METHODS["ACL"] = 19] = "ACL"; /* subversion */ METHODS[METHODS["REPORT"] = 20] = "REPORT"; METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; METHODS[METHODS["MERGE"] = 23] = "MERGE"; /* upnp */ METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; /* RFC-5789 */ METHODS[METHODS["PATCH"] = 28] = "PATCH"; METHODS[METHODS["PURGE"] = 29] = "PURGE"; /* CalDAV */ METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; /* RFC-2068, section 19.6.1.2 */ METHODS[METHODS["LINK"] = 31] = "LINK"; METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; /* icecast */ METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; /* RFC-7540, section 11.6 */ METHODS[METHODS["PRI"] = 34] = "PRI"; /* RFC-2326 RTSP */ METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; METHODS[METHODS["SETUP"] = 37] = "SETUP"; METHODS[METHODS["PLAY"] = 38] = "PLAY"; METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; METHODS[METHODS["RECORD"] = 44] = "RECORD"; /* RAOP */ METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; })(METHODS = exports.METHODS || (exports.METHODS = {})); exports.METHODS_HTTP = [ METHODS.DELETE, METHODS.GET, METHODS.HEAD, METHODS.POST, METHODS.PUT, METHODS.CONNECT, METHODS.OPTIONS, METHODS.TRACE, METHODS.COPY, METHODS.LOCK, METHODS.MKCOL, METHODS.MOVE, METHODS.PROPFIND, METHODS.PROPPATCH, METHODS.SEARCH, METHODS.UNLOCK, METHODS.BIND, METHODS.REBIND, METHODS.UNBIND, METHODS.ACL, METHODS.REPORT, METHODS.MKACTIVITY, METHODS.CHECKOUT, METHODS.MERGE, METHODS['M-SEARCH'], METHODS.NOTIFY, METHODS.SUBSCRIBE, METHODS.UNSUBSCRIBE, METHODS.PATCH, METHODS.PURGE, METHODS.MKCALENDAR, METHODS.LINK, METHODS.UNLINK, METHODS.PRI, // TODO(indutny): should we allow it with HTTP? METHODS.SOURCE, ]; exports.METHODS_ICE = [ METHODS.SOURCE, ]; exports.METHODS_RTSP = [ METHODS.OPTIONS, METHODS.DESCRIBE, METHODS.ANNOUNCE, METHODS.SETUP, METHODS.PLAY, METHODS.PAUSE, METHODS.TEARDOWN, METHODS.GET_PARAMETER, METHODS.SET_PARAMETER, METHODS.REDIRECT, METHODS.RECORD, METHODS.FLUSH, // For AirPlay METHODS.GET, METHODS.POST, ]; exports.METHOD_MAP = utils_1.enumToMap(METHODS); exports.H_METHOD_MAP = {}; Object.keys(exports.METHOD_MAP).forEach((key) => { if (/^H/.test(key)) { exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; } }); (function (FINISH) { FINISH[FINISH["SAFE"] = 0] = "SAFE"; FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; })(exports.FINISH || (exports.FINISH = {})); exports.ALPHA = []; for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { // Upper case exports.ALPHA.push(String.fromCharCode(i)); // Lower case exports.ALPHA.push(String.fromCharCode(i + 0x20)); } exports.NUM_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, }; exports.HEX_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, }; exports.NUM = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ]; exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; exports.USERINFO_CHARS = exports.ALPHANUM .concat(exports.MARK) .concat(['%', ';', ':', '&', '=', '+', '$', ',']); // TODO(indutny): use RFC exports.STRICT_URL_CHAR = [ '!', '"', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', ].concat(exports.ALPHANUM); exports.URL_CHAR = exports.STRICT_URL_CHAR .concat(['\t', '\f']); // All characters with 0x80 bit set to 1 for (let i = 0x80; i <= 0xff; i++) { exports.URL_CHAR.push(i); } exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); /* Tokens as defined by rfc 2616. Also lowercases them. * token = 1* * separators = "(" | ")" | "<" | ">" | "@" * | "," | ";" | ":" | "\" | <"> * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ exports.STRICT_TOKEN = [ '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~', ].concat(exports.ALPHANUM); exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); /* * Verify that a char is a valid visible (printable) US-ASCII * character or %x80-FF */ exports.HEADER_CHARS = ['\t']; for (let i = 32; i <= 255; i++) { if (i !== 127) { exports.HEADER_CHARS.push(i); } } // ',' = \x44 exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); exports.MAJOR = exports.NUM_MAP; exports.MINOR = exports.MAJOR; var HEADER_STATE; (function (HEADER_STATE) { HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); exports.SPECIAL_HEADERS = { 'connection': HEADER_STATE.CONNECTION, 'content-length': HEADER_STATE.CONTENT_LENGTH, 'proxy-connection': HEADER_STATE.CONNECTION, 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, 'upgrade': HEADER_STATE.UPGRADE, }; } (constants)); return constants; } var llhttp_wasm; var hasRequiredLlhttp_wasm; function requireLlhttp_wasm () { if (hasRequiredLlhttp_wasm) return llhttp_wasm; hasRequiredLlhttp_wasm = 1; llhttp_wasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzk4AwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAYGAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAAMEBQFwAQ4OBQMBAAIGCAF/AUGAuAQLB/UEHwZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAJGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAKGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQA1DGxsaHR0cF9hbGxvYwAMBm1hbGxvYwA6C2xsaHR0cF9mcmVlAA0EZnJlZQA8D2xsaHR0cF9nZXRfdHlwZQAOFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAPFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAQEWxsaHR0cF9nZXRfbWV0aG9kABEWbGxodHRwX2dldF9zdGF0dXNfY29kZQASEmxsaHR0cF9nZXRfdXBncmFkZQATDGxsaHR0cF9yZXNldAAUDmxsaHR0cF9leGVjdXRlABUUbGxodHRwX3NldHRpbmdzX2luaXQAFg1sbGh0dHBfZmluaXNoABcMbGxodHRwX3BhdXNlABgNbGxodHRwX3Jlc3VtZQAZG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAaEGxsaHR0cF9nZXRfZXJybm8AGxdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAcF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uAB0UbGxodHRwX2dldF9lcnJvcl9wb3MAHhFsbGh0dHBfZXJybm9fbmFtZQAfEmxsaHR0cF9tZXRob2RfbmFtZQAgGmxsaHR0cF9zZXRfbGVuaWVudF9oZWFkZXJzACEhbGxodHRwX3NldF9sZW5pZW50X2NodW5rZWRfbGVuZ3RoACIYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mADMJEwEAQQELDQECAwQFCwYHLiooJCYKxqgCOAIACwgAEIiAgIAACxkAIAAQtoCAgAAaIAAgAjYCNCAAIAE6ACgLHAAgACAALwEyIAAtAC4gABC1gICAABCAgICAAAspAQF/QTgQuoCAgAAiARC2gICAABogAUGAiICAADYCNCABIAA6ACggAQsKACAAELyAgIAACwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BMgsHACAALQAuC0UBBH8gACgCGCEBIAAtAC0hAiAALQAoIQMgACgCNCEEIAAQtoCAgAAaIAAgBDYCNCAAIAM6ACggACACOgAtIAAgATYCGAsRACAAIAEgASACahC3gICAAAtFACAAQgA3AgAgAEEwakIANwIAIABBKGpCADcCACAAQSBqQgA3AgAgAEEYakIANwIAIABBEGpCADcCACAAQQhqQgA3AgALZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI0IgFFDQAgASgCHCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQv4CAgAAACyAAQf+RgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQYSUgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBGkkNABC/gICAAAALIABBAnRByJuAgABqKAIACyIAAkAgAEEuSQ0AEL+AgIAAAAsgAEECdEGwnICAAGooAgALFgAgACAALQAtQf4BcSABQQBHcjoALQsZACAAIAAtAC1B/QFxIAFBAEdBAXRyOgAtCy4BAn9BACEDAkAgACgCNCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI0IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZyOgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjQiBEUNACAEKAIoIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCNCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEHSioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI0IgRFDQAgBCgCLCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjQiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB3ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCNCIERQ0AIAQoAjAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI0IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcOQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjQiBEUNACAEKAI0IgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCNCIERQ0AIAQoAhQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI0IgRFDQAgBCgCHCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjQiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB0oiAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCNCIERQ0AIAQoAiAiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI0IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL8gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARBCHENAAJAIARBgARxRQ0AAkAgAC0AKEEBRw0AIAAtAC1BCnENAEEFDwtBBA8LAkAgBEEgcQ0AAkAgAC0AKEEBRg0AIAAvATIiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQYgEcUGABEYNAiAEQShxRQ0CC0EADwtBAEEDIAApAyBQGyEFCyAFC10BAn9BACEBAkAgAC0AKEEBRg0AIAAvATIiAkGcf2pB5ABJDQAgAkHMAUYNACACQbACRg0AIAAvATAiAEHAAHENAEEBIQEgAEGIBHFBgARGDQAgAEEocUUhAQsgAQuiAQEDfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEDIAAvATAiBEECcUUNAQwCC0EAIQMgAC8BMCIEQQFxRQ0BC0EBIQMgAC0AKEEBRg0AIAAvATIiBUGcf2pB5ABJDQAgBUHMAUYNACAFQbACRg0AIARBwABxDQBBACEDIARBiARxQYAERg0AIARBKHFBAEchAwsgAEEAOwEwIABBADoALyADC5QBAQJ/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQEgAC8BMCICQQJxRQ0BDAILQQAhASAALwEwIgJBAXFFDQELQQEhASAALQAoQQFGDQAgAC8BMiIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC08AIABBGGpCADcDACAAQgA3AwAgAEEwakIANwMAIABBKGpCADcDACAAQSBqQgA3AwAgAEEQakIANwMAIABBCGpCADcDACAAQbwBNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQuICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC9POAQMcfwN+BX8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDyABIRAgASERIAEhEiABIRMgASEUIAEhFSABIRYgASEXIAEhGCABIRkgASEaIAEhGyABIRwgASEdAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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HgwTC0GZASEeDBILQZ0BIR4MEQtBmgEhHgwQC0EBIR4MDwtBmwEhHgwOC0GcASEeDA0LQZ4BIR4MDAtBoAEhHgwLC0GfASEeDAoLQaEBIR4MCQtBogEhHgwIC0GjASEeDAcLQaQBIR4MBgtBpQEhHgwFC0GmASEeDAQLQacBIR4MAwtBqAEhHgwCC0GpASEeDAELQa8BIR4LA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgHg6wAQABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgaHB4fICMkJSYnKCkqLC0uLzD7AjQ2ODk8P0FCQ0RFRkdISUpLTE1OT1BRUlNVV1lcXV5gYmNkZWZnaGtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAdoB4AHhAeQB8QG9Ar0CCyABIgggAkcNwgFBvAEhHgyVAwsgASIeIAJHDbEBQawBIR4MlAMLIAEiASACRw1nQeIAIR4MkwMLIAEiASACRw1dQdoAIR4MkgMLIAEiASACRw1WQdUAIR4MkQMLIAEiASACRw1SQdMAIR4MkAMLIAEiASACRw1PQdEAIR4MjwMLIAEiASACRw1MQc8AIR4MjgMLIAEiASACRw0QQQwhHgyNAwsgASIBIAJHDTNBOCEeDIwDCyABIgEgAkcNL0E1IR4MiwMLIAEiASACRw0mQTIhHgyKAwsgASIBIAJHDSRBLyEeDIkDCyABIgEgAkcNHUEkIR4MiAMLIAAtAC5BAUYN/QIMxwELIAAgASIBIAIQtICAgABBAUcNtAEMtQELIAAgASIBIAIQrYCAgAAiHg21ASABIQEMsAILAkAgASIBIAJHDQBBBiEeDIUDCyAAIAFBAWoiASACELCAgIAAIh4NtgEgASEBDA8LIABCADcDIEETIR4M8wILIAEiHiACRw0JQQ8hHgyCAwsCQCABIgEgAkYNACABQQFqIQFBESEeDPICC0EHIR4MgQMLIABCACAAKQMgIh8gAiABIh5rrSIgfSIhICEgH1YbNwMgIB8gIFYiIkUNswFBCCEeDIADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEVIR4M8AILQQkhHgz/AgsgASEBIAApAyBQDbIBIAEhAQytAgsCQCABIgEgAkcNAEELIR4M/gILIAAgAUEBaiIBIAIQr4CAgAAiHg2yASABIQEMrQILA0ACQCABLQAAQfCdgIAAai0AACIeQQFGDQAgHkECRw20ASABQQFqIQEMAwsgAUEBaiIBIAJHDQALQQwhHgz8AgsCQCABIgEgAkcNAEENIR4M/AILAkACQCABLQAAIh5Bc2oOFAG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBtgEAtAELIAFBAWohAQy0AQsgAUEBaiEBC0EYIR4M6gILAkAgASIeIAJHDQBBDiEeDPoCC0IAIR8gHiEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAeLQAAQVBqDjfIAccBAAECAwQFBge+Ar4CvgK+Ar4CvgK+AggJCgsMDb4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgIODxAREhO+AgtCAiEfDMcBC0IDIR8MxgELQgQhHwzFAQtCBSEfDMQBC0IGIR8MwwELQgchHwzCAQtCCCEfDMEBC0IJIR8MwAELQgohHwy/AQtCCyEfDL4BC0IMIR8MvQELQg0hHwy8AQtCDiEfDLsBC0IPIR8MugELQgohHwy5AQtCCyEfDLgBC0IMIR8MtwELQg0hHwy2AQtCDiEfDLUBC0IPIR8MtAELQgAhHwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgHi0AAEFQag43xwHGAQABAgMEBQYHyAHIAcgByAHIAcgByAEICQoLDA3IAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgBDg8QERITyAELQgIhHwzGAQtCAyEfDMUBC0IEIR8MxAELQgUhHwzDAQtCBiEfDMIBC0IHIR8MwQELQgghHwzAAQtCCSEfDL8BC0IKIR8MvgELQgshHwy9AQtCDCEfDLwBC0INIR8MuwELQg4hHwy6AQtCDyEfDLkBC0IKIR8MuAELQgshHwy3AQtCDCEfDLYBC0INIR8MtQELQg4hHwy0AQtCDyEfDLMBCyAAQgAgACkDICIfIAIgASIea60iIH0iISAhIB9WGzcDICAfICBWIiJFDbQBQREhHgz3AgsCQCABIgEgAkYNACAAQYmAgIAANgIIIAAgATYCBCABIQFBGyEeDOcCC0ESIR4M9gILIAAgASIeIAIQsoCAgABBf2oOBaYBAKICAbMBtAELQRIhHgzkAgsgAEEBOgAvIB4hAQzyAgsgASIBIAJHDbQBQRYhHgzyAgsgASIcIAJHDRlBOSEeDPECCwJAIAEiASACRw0AQRohHgzxAgsgAEEANgIEIABBioCAgAA2AgggACABIAEQqoCAgAAiHg22ASABIQEMuQELAkAgASIeIAJHDQBBGyEeDPACCwJAIB4tAAAiAUEgRw0AIB5BAWohAQwaCyABQQlHDbYBIB5BAWohAQwZCwJAIAEiASACRg0AIAFBAWohAQwUC0EcIR4M7gILAkAgASIeIAJHDQBBHSEeDO4CCwJAIB4tAAAiAUEJRw0AIB4hAQzSAgsgAUEgRw21ASAeIQEM0QILAkAgASIBIAJHDQBBHiEeDO0CCyABLQAAQQpHDbgBIAFBAWohAQygAgsgASIBIAJHDbgBQSIhHgzrAgsDQAJAIAEtAAAiHkEgRg0AAkAgHkF2ag4EAL4BvgEAvAELIAEhAQzEAQsgAUEBaiIBIAJHDQALQSQhHgzqAgtBJSEeIAEiIyACRg3pAiACICNrIAAoAgAiJGohJSAjISYgJCEBAkADQCAmLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQfCfgIAAai0AAEcNASABQQNGDdYCIAFBAWohASAmQQFqIiYgAkcNAAsgACAlNgIADOoCCyAAQQA2AgAgJiEBDLsBC0EmIR4gASIjIAJGDegCIAIgI2sgACgCACIkaiElICMhJiAkIQECQANAICYtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFB9J+AgABqLQAARw0BIAFBCEYNvQEgAUEBaiEBICZBAWoiJiACRw0ACyAAICU2AgAM6QILIABBADYCACAmIQEMugELQSchHiABIiMgAkYN5wIgAiAjayAAKAIAIiRqISUgIyEmICQhAQJAA0AgJi0AACIiQSByICIgIkG/f2pB/wFxQRpJG0H/AXEgAUHQpoCAAGotAABHDQEgAUEFRg29ASABQQFqIQEgJkEBaiImIAJHDQALIAAgJTYCAAzoAgsgAEEANgIAICYhAQy5AQsCQCABIgEgAkYNAANAAkAgAS0AAEGAooCAAGotAAAiHkEBRg0AIB5BAkYNCiABIQEMwQELIAFBAWoiASACRw0AC0EjIR4M5wILQSMhHgzmAgsCQCABIgEgAkYNAANAAkAgAS0AACIeQSBGDQAgHkF2ag4EvQG+Ab4BvQG+AQsgAUEBaiIBIAJHDQALQSshHgzmAgtBKyEeDOUCCwNAAkAgAS0AACIeQSBGDQAgHkEJRw0DCyABQQFqIgEgAkcNAAtBLyEeDOQCCwNAAkAgAS0AACIeQSBGDQACQAJAIB5BdmoOBL4BAQG+AQALIB5BLEYNvwELIAEhAQwECyABQQFqIgEgAkcNAAtBMiEeDOMCCyABIQEMvwELQTMhHiABIiYgAkYN4QIgAiAmayAAKAIAIiNqISQgJiEiICMhAQJAA0AgIi0AAEEgciABQYCkgIAAai0AAEcNASABQQZGDdACIAFBAWohASAiQQFqIiIgAkcNAAsgACAkNgIADOICCyAAQQA2AgAgIiEBC0ErIR4M0AILAkAgASIdIAJHDQBBNCEeDOACCyAAQYqAgIAANgIIIAAgHTYCBCAdIQEgAC0ALEF/ag4ErwG5AbsBvQHHAgsgAUEBaiEBDK4BCwJAIAEiASACRg0AA0ACQCABLQAAIh5BIHIgHiAeQb9/akH/AXFBGkkbQf8BcSIeQQlGDQAgHkEgRg0AAkACQAJAAkAgHkGdf2oOEwADAwMDAwMDAQMDAwMDAwMDAwIDCyABQQFqIQFBJiEeDNMCCyABQQFqIQFBJyEeDNICCyABQQFqIQFBKCEeDNECCyABIQEMsgELIAFBAWoiASACRw0AC0EoIR4M3gILQSghHgzdAgsCQCABIgEgAkYNAANAAkAgAS0AAEGAoICAAGotAABBAUYNACABIQEMtwELIAFBAWoiASACRw0AC0EwIR4M3QILQTAhHgzcAgsCQANAAkAgAS0AAEF3ag4YAALBAsECxwLBAsECwQLBAsECwQLBAsECwQLBAsECwQLBAsECwQLBAsECwQIAwQILIAFBAWoiASACRw0AC0E1IR4M3AILIAFBAWohAQtBISEeDMoCCyABIgEgAkcNuQFBNyEeDNkCCwNAAkAgAS0AAEGQpICAAGotAABBAUYNACABIQEMkAILIAFBAWoiASACRw0AC0E4IR4M2AILIBwtAAAiHkEgRg2aASAeQTpHDcYCIAAoAgQhASAAQQA2AgQgACABIBwQqICAgAAiAQ22ASAcQQFqIQEMuAELIAAgASACEKmAgIAAGgtBCiEeDMUCC0E6IR4gASImIAJGDdQCIAIgJmsgACgCACIjaiEkICYhHCAjIQECQANAIBwtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFBkKaAgABqLQAARw3EAiABQQVGDQEgAUEBaiEBIBxBAWoiHCACRw0ACyAAICQ2AgAM1QILIABBADYCACAAQQE6ACwgJiAja0EGaiEBDL4CC0E7IR4gASImIAJGDdMCIAIgJmsgACgCACIjaiEkICYhHCAjIQECQANAIBwtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFBlqaAgABqLQAARw3DAiABQQlGDQEgAUEBaiEBIBxBAWoiHCACRw0ACyAAICQ2AgAM1AILIABBADYCACAAQQI6ACwgJiAja0EKaiEBDL0CCwJAIAEiHCACRw0AQTwhHgzTAgsCQAJAIBwtAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAMMCwwLDAsMCwwIBwwILIBxBAWohAUEyIR4MwwILIBxBAWohAUEzIR4MwgILQT0hHiABIiYgAkYN0QIgAiAmayAAKAIAIiNqISQgJiEcICMhAQNAIBwtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFBoKaAgABqLQAARw3AAiABQQFGDbQCIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADNECC0E+IR4gASImIAJGDdACIAIgJmsgACgCACIjaiEkICYhHCAjIQECQANAIBwtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFBoqaAgABqLQAARw3AAiABQQ5GDQEgAUEBaiEBIBxBAWoiHCACRw0ACyAAICQ2AgAM0QILIABBADYCACAAQQE6ACwgJiAja0EPaiEBDLoCC0E/IR4gASImIAJGDc8CIAIgJmsgACgCACIjaiEkICYhHCAjIQECQANAIBwtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFBwKaAgABqLQAARw2/AiABQQ9GDQEgAUEBaiEBIBxBAWoiHCACRw0ACyAAICQ2AgAM0AILIABBADYCACAAQQM6ACwgJiAja0EQaiEBDLkCC0HAACEeIAEiJiACRg3OAiACICZrIAAoAgAiI2ohJCAmIRwgIyEBAkADQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQdCmgIAAai0AAEcNvgIgAUEFRg0BIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADM8CCyAAQQA2AgAgAEEEOgAsICYgI2tBBmohAQy4AgsCQCABIhwgAkcNAEHBACEeDM4CCwJAAkACQAJAIBwtAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAMACwALAAsACwALAAsACwALAAsACwALAAgHAAsACwAICA8ACCyAcQQFqIQFBNSEeDMACCyAcQQFqIQFBNiEeDL8CCyAcQQFqIQFBNyEeDL4CCyAcQQFqIQFBOCEeDL0CCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUE5IR4MvQILQcIAIR4MzAILIAEiASACRw2vAUHEACEeDMsCC0HFACEeIAEiJiACRg3KAiACICZrIAAoAgAiI2ohJCAmISIgIyEBAkADQCAiLQAAIAFB1qaAgABqLQAARw20ASABQQFGDQEgAUEBaiEBICJBAWoiIiACRw0ACyAAICQ2AgAMywILIABBADYCACAmICNrQQJqIQEMrwELAkAgASIBIAJHDQBBxwAhHgzKAgsgAS0AAEEKRw2zASABQQFqIQEMrwELAkAgASIBIAJHDQBByAAhHgzJAgsCQAJAIAEtAABBdmoOBAG0AbQBALQBCyABQQFqIQFBPSEeDLkCCyABQQFqIQEMrgELAkAgASIBIAJHDQBByQAhHgzIAgtBACEeAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgq7AboBAAECAwQFBge8AQtBAiEeDLoBC0EDIR4MuQELQQQhHgy4AQtBBSEeDLcBC0EGIR4MtgELQQchHgy1AQtBCCEeDLQBC0EJIR4MswELAkAgASIBIAJHDQBBygAhHgzHAgsgAS0AAEEuRw20ASABQQFqIQEMgAILAkAgASIBIAJHDQBBywAhHgzGAgtBACEeAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgq9AbwBAAECAwQFBge+AQtBAiEeDLwBC0EDIR4MuwELQQQhHgy6AQtBBSEeDLkBC0EGIR4MuAELQQchHgy3AQtBCCEeDLYBC0EJIR4MtQELQcwAIR4gASImIAJGDcQCIAIgJmsgACgCACIjaiEkICYhASAjISIDQCABLQAAICJB4qaAgABqLQAARw24ASAiQQNGDbcBICJBAWohIiABQQFqIgEgAkcNAAsgACAkNgIADMQCC0HNACEeIAEiJiACRg3DAiACICZrIAAoAgAiI2ohJCAmIQEgIyEiA0AgAS0AACAiQeamgIAAai0AAEcNtwEgIkECRg25ASAiQQFqISIgAUEBaiIBIAJHDQALIAAgJDYCAAzDAgtBzgAhHiABIiYgAkYNwgIgAiAmayAAKAIAIiNqISQgJiEBICMhIgNAIAEtAAAgIkHppoCAAGotAABHDbYBICJBA0YNuQEgIkEBaiEiIAFBAWoiASACRw0ACyAAICQ2AgAMwgILA0ACQCABLQAAIh5BIEYNAAJAAkACQCAeQbh/ag4LAAG6AboBugG6AboBugG6AboBAroBCyABQQFqIQFBwgAhHgy1AgsgAUEBaiEBQcMAIR4MtAILIAFBAWohAUHEACEeDLMCCyABQQFqIgEgAkcNAAtBzwAhHgzBAgsCQCABIgEgAkYNACAAIAFBAWoiASACEKWAgIAAGiABIQFBByEeDLECC0HQACEeDMACCwNAAkAgAS0AAEHwpoCAAGotAAAiHkEBRg0AIB5BfmoOA7kBugG7AbwBCyABQQFqIgEgAkcNAAtB0QAhHgy/AgsCQCABIgEgAkYNACABQQFqIQEMAwtB0gAhHgy+AgsDQAJAIAEtAABB8KiAgABqLQAAIh5BAUYNAAJAIB5BfmoOBLwBvQG+AQC/AQsgASEBQcYAIR4MrwILIAFBAWoiASACRw0AC0HTACEeDL0CCwJAIAEiASACRw0AQdQAIR4MvQILAkAgAS0AACIeQXZqDhqkAb8BvwGmAb8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/AbQBvwG/AQC9AQsgAUEBaiEBC0EGIR4MqwILA0ACQCABLQAAQfCqgIAAai0AAEEBRg0AIAEhAQz6AQsgAUEBaiIBIAJHDQALQdUAIR4MugILAkAgASIBIAJGDQAgAUEBaiEBDAMLQdYAIR4MuQILAkAgASIBIAJHDQBB1wAhHgy5AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB2AAhHgy4AgsgAUEBaiEBC0EEIR4MpgILAkAgASIiIAJHDQBB2QAhHgy2AgsgIiEBAkACQAJAICItAABB8KyAgABqLQAAQX9qDge+Ab8BwAEA+AEBAsEBCyAiQQFqIQEMCgsgIkEBaiEBDLcBC0EAIR4gAEEANgIcIABB8Y6AgAA2AhAgAEEHNgIMIAAgIkEBajYCFAy1AgsCQANAAkAgAS0AAEHwrICAAGotAAAiHkEERg0AAkACQCAeQX9qDge8Ab0BvgHDAQAEAcMBCyABIQFByQAhHgyoAgsgAUEBaiEBQcsAIR4MpwILIAFBAWoiASACRw0AC0HaACEeDLUCCyABQQFqIQEMtQELAkAgASIiIAJHDQBB2wAhHgy0AgsgIi0AAEEvRw2+ASAiQQFqIQEMBgsCQCABIiIgAkcNAEHcACEeDLMCCwJAICItAAAiAUEvRw0AICJBAWohAUHMACEeDKMCCyABQXZqIgFBFksNvQFBASABdEGJgIACcUUNvQEMkwILAkAgASIBIAJGDQAgAUEBaiEBQc0AIR4MogILQd0AIR4MsQILAkAgASIiIAJHDQBB3wAhHgyxAgsgIiEBAkAgIi0AAEHwsICAAGotAABBf2oOA5IC8AEAvgELQdAAIR4MoAILAkAgASIiIAJGDQADQAJAICItAABB8K6AgABqLQAAIgFBA0YNAAJAIAFBf2oOApQCAL8BCyAiIQFBzgAhHgyiAgsgIkEBaiIiIAJHDQALQd4AIR4MsAILQd4AIR4MrwILAkAgASIBIAJGDQAgAEGMgICAADYCCCAAIAE2AgQgASEBQc8AIR4MnwILQeAAIR4MrgILAkAgASIBIAJHDQBB4QAhHgyuAgsgAEGMgICAADYCCCAAIAE2AgQgASEBC0EDIR4MnAILA0AgAS0AAEEgRw2MAiABQQFqIgEgAkcNAAtB4gAhHgyrAgsCQCABIgEgAkcNAEHjACEeDKsCCyABLQAAQSBHDbgBIAFBAWohAQzUAQsCQCABIgggAkcNAEHkACEeDKoCCyAILQAAQcwARw27ASAIQQFqIQFBEyEeDLkBC0HlACEeIAEiIiACRg2oAiACICJrIAAoAgAiJmohIyAiIQggJiEBA0AgCC0AACABQfCygIAAai0AAEcNugEgAUEFRg24ASABQQFqIQEgCEEBaiIIIAJHDQALIAAgIzYCAAyoAgsCQCABIgggAkcNAEHmACEeDKgCCwJAAkAgCC0AAEG9f2oODAC7AbsBuwG7AbsBuwG7AbsBuwG7AQG7AQsgCEEBaiEBQdQAIR4MmAILIAhBAWohAUHVACEeDJcCC0HnACEeIAEiIiACRg2mAiACICJrIAAoAgAiJmohIyAiIQggJiEBAkADQCAILQAAIAFB7bOAgABqLQAARw25ASABQQJGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMpwILIABBADYCACAiICZrQQNqIQFBECEeDLYBC0HoACEeIAEiIiACRg2lAiACICJrIAAoAgAiJmohIyAiIQggJiEBAkADQCAILQAAIAFB9rKAgABqLQAARw24ASABQQVGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMpgILIABBADYCACAiICZrQQZqIQFBFiEeDLUBC0HpACEeIAEiIiACRg2kAiACICJrIAAoAgAiJmohIyAiIQggJiEBAkADQCAILQAAIAFB/LKAgABqLQAARw23ASABQQNGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMpQILIABBADYCACAiICZrQQRqIQFBBSEeDLQBCwJAIAEiCCACRw0AQeoAIR4MpAILIAgtAABB2QBHDbUBIAhBAWohAUEIIR4MswELAkAgASIIIAJHDQBB6wAhHgyjAgsCQAJAIAgtAABBsn9qDgMAtgEBtgELIAhBAWohAUHZACEeDJMCCyAIQQFqIQFB2gAhHgySAgsCQCABIgggAkcNAEHsACEeDKICCwJAAkAgCC0AAEG4f2oOCAC1AbUBtQG1AbUBtQEBtQELIAhBAWohAUHYACEeDJICCyAIQQFqIQFB2wAhHgyRAgtB7QAhHiABIiIgAkYNoAIgAiAiayAAKAIAIiZqISMgIiEIICYhAQJAA0AgCC0AACABQYCzgIAAai0AAEcNswEgAUECRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADKECC0EAIR4gAEEANgIAICIgJmtBA2ohAQywAQtB7gAhHiABIiIgAkYNnwIgAiAiayAAKAIAIiZqISMgIiEIICYhAQJAA0AgCC0AACABQYOzgIAAai0AAEcNsgEgAUEERg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADKACCyAAQQA2AgAgIiAma0EFaiEBQSMhHgyvAQsCQCABIgggAkcN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ImohJiAeIQggIiEBAkADQCAILQAAIAFBp7OAgABqLQAARw2gASABQQFGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICY2AgBBgAEhHgyOAgsgAEEANgIAIB4gImtBAmohAUELIR4MnQELAkAgASIIIAJHDQBBgQEhHgyNAgsCQAJAAkACQCAILQAAQVNqDiMAogGiAaIBogGiAaIBogGiAaIBogGiAaIBogGiAaIBogGiAaIBogGiAaIBogGiAQGiAaIBogGiAaIBAqIBogGiAQOiAQsgCEEBaiEBQekAIR4M/wELIAhBAWohAUHqACEeDP4BCyAIQQFqIQFB7wAhHgz9AQsgCEEBaiEBQfAAIR4M/AELAkAgASIeIAJHDQBBggEhHgyMAgsgAiAeayAAKAIAIiJqISYgHiEIICIhAQJAA0AgCC0AACABQamzgIAAai0AAEcNngEgAUEERg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAmNgIAQYIBIR4MjAILIABBADYCACAeICJrQQVqIQFBGSEeDJsBCwJAIAEiIiACRw0AQYMBIR4MiwILIAIgImsgACgCACImaiEeICIhCCAmIQECQANAIAgtAAAgAUGus4CAAGotAABHDZ0BIAFBBUYNASABQQFqIQEgCEEBaiIIIAJHDQALIAAgHjYCAEGDASEeDIsCCyAAQQA2AgBBBiEeICIgJmtBBmohAQyaAQsCQCABIh4gAkcNAEGEASEeDIoCCyACIB5rIAAoAgAiImohJiAeIQggIiEBAkADQCAILQAAIAFBtLOAgABqLQAARw2cASABQQFGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICY2AgBBhAEhHgyKAgsgAEEANgIAIB4gImtBAmohAUEcIR4MmQELAkAgASIeIAJHDQBBhQEhHgyJAgsgAiAeayAAKAIAIiJqISYgHiEIICIhAQJAA0AgCC0AACABQbazgIAAai0AAEcNmwEgAUEBRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAmNgIAQYUBIR4MiQILIABBADYCACAeICJrQQJqIQFBJyEeDJgBCwJAIAEiCCACRw0AQYYBIR4MiAILAkACQCAILQAAQax/ag4CAAGbAQsgCEEBaiEBQfQAIR4M+AELIAhBAWohAUH1ACEeDPcBCwJAIAEiHiAC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IiEBDDELIABBxAA2AhwgACAiNgIUIAAgATYCDEEAIR4MeQsgACgCBCEBIABBADYCBAJAIAAgASAiEKSAgIAAIgENACAiIQEMMQsgAEHFADYCHCAAICI2AhQgACABNgIMQQAhHgx4CyAAKAIEIQEgAEEANgIEAkAgACABICIQpICAgAAiAQ0AICIhAQw1CyAAQdAANgIcIAAgIjYCFCAAIAE2AgxBACEeDHcLIABBADYCHCAAICI2AhQgAEHQjICAADYCECAAQQc2AgxBACEeDHYLIABBADYCHCAAIAE2AhQgAEHQjICAADYCECAAQQc2AgxBACEeDHULQQAhHiAAQQA2AhwgACAiNgIUIABBv5SAgAA2AhAgAEEHNgIMDHQLIABBADYCHCAAICI2AhQgAEG/lICAADYCECAAQQc2AgxBACEeDHMLIABBADYCHCAAICI2AhQgAEHUjoCAADYCECAAQQc2AgxBACEeDHILIABBADYCHCAAIAE2AhQgAEHBk4CAADYCECAAQQY2AgxBACEeDHELIABBADYCACAiICZrQQZqIQFBJCEeCyAAIB46ACkgASEBDE4LIABBADYCAAtBACEeIABBADYCHCAAIAg2AhQgAEGklICAADYCECAAQQY2AgwMbQsgACgCBCETIABBADYCBCAAIBMgHhCmgICAACITDQEgHkEBaiETC0GdASEeDFsLIABBqgE2AhwgACATNgIMIAAgHkEBajYCFEEAIR4MagsgACgCBCEUIABBADYCBCAAIBQgHhCmgICAACIUDQEgHkEBaiEUC0GaASEeDFgLIABBqwE2AhwgACAUNgIMIAAgHkEBajYCFEEAIR4MZwsgAEEANgIcIAAgFTYCFCAAQfOKgIAANgIQIABBDTYCDEEAIR4MZgsgAEEANgIcIAAgFjYCFCAAQc6NgIAANgIQIABBCTYCDEEAIR4MZQtBASEeCyAAIB46ACsgF0EBaiEWDC4LIABBADYCHCAAIBc2AhQgAEGijYCAADYCECAAQQk2AgxBACEeDGILIABBADYCHCAAIBg2AhQgAEHFioCAADYCECAAQQk2AgxBACEeDGELQQEhHgsgACAeOgAqIBlBAWohGAwsCyAAQQA2AhwgACAZNgIUIABBuI2AgAA2AhAgAEEJNgIMQQAhHgxeCyAAQQA2AhwgACAZNgIUIABB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QR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAFBGGogBDYCACABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQRhqQQA2AgAgASAENgIMIAEgADYCCAtBAEEAKAKotICAAEF/aiIBQX8gARs2Aqi0gIAACwtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+LeAgABBfw8LIABBEHQPCxC/gICAAAALBAAAAAsLjiwBAEGACAuGLAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgcGFyYW1ldGVycwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABNS0FDVElWSVRZAENPUFkATk9USUZZAFBMQVkAUFVUAENIRUNLT1VUAFBPU1QAUkVQT1JUAEhQRV9JTlZBTElEX0NPTlNUQU5UAEdFVABIUEVfU1RSSUNUAFJFRElSRUNUAENPTk5FQ1QASFBFX0lOVkFMSURfU1RBVFVTAE9QVElPTlMAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASFBFX0lOVkFMSURfVVJMAE1LQ09MAEFDTABIUEVfSU5URVJOQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBQQVVTRQBQVVJHRQBNRVJHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAFBST1BGSU5EAFVO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AAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='; return llhttp_wasm; } var llhttp_simd_wasm; var hasRequiredLlhttp_simd_wasm; function requireLlhttp_simd_wasm () { if (hasRequiredLlhttp_simd_wasm) return llhttp_simd_wasm; hasRequiredLlhttp_simd_wasm = 1; llhttp_simd_wasm = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzk4AwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAYGAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAAMEBQFwAQ4OBQMBAAIGCAF/AUGAuAQLB/UEHwZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAJGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAKGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQA1DGxsaHR0cF9hbGxvYwAMBm1hbGxvYwA6C2xsaHR0cF9mcmVlAA0EZnJlZQA8D2xsaHR0cF9nZXRfdHlwZQAOFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAPFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAQEWxsaHR0cF9nZXRfbWV0aG9kABEWbGxodHRwX2dldF9zdGF0dXNfY29kZQASEmxsaHR0cF9nZXRfdXBncmFkZQATDGxsaHR0cF9yZXNldAAUDmxsaHR0cF9leGVjdXRlABUUbGxodHRwX3NldHRpbmdzX2luaXQAFg1sbGh0dHBfZmluaXNoABcMbGxodHRwX3BhdXNlABgNbGxodHRwX3Jlc3VtZQAZG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAaEGxsaHR0cF9nZXRfZXJybm8AGxdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAcF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uAB0UbGxodHRwX2dldF9lcnJvcl9wb3MAHhFsbGh0dHBfZXJybm9fbmFtZQAfEmxsaHR0cF9tZXRob2RfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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ASEeDBELQZoBIR4MEAtBASEeDA8LQZsBIR4MDgtBnAEhHgwNC0GeASEeDAwLQaABIR4MCwtBnwEhHgwKC0GhASEeDAkLQaIBIR4MCAtBowEhHgwHC0GkASEeDAYLQaUBIR4MBQtBpgEhHgwEC0GnASEeDAMLQagBIR4MAgtBqQEhHgwBC0GvASEeCwNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIB4OsAEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGhweHyAjJCUmJygpKiwtLi8w+wI0Njg5PD9BQkNERUZHSElKS0xNTk9QUVJTVVdZXF1eYGJjZGVmZ2hrbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHaAeAB4QHkAfEBvQK9AgsgASIIIAJHDcIBQbwBIR4MlQMLIAEiHiACRw2xAUGsASEeDJQDCyABIgEgAkcNZ0HiACEeDJMDCyABIgEgAkcNXUHaACEeDJIDCyABIgEgAkcNVkHVACEeDJEDCyABIgEgAkcNUkHTACEeDJADCyABIgEgAkcNT0HRACEeDI8DCyABIgEgAkcNTEHPACEeDI4DCyABIgEgAkcNEEEMIR4MjQMLIAEiASACRw0zQTghHgyMAwsgASIBIAJHDS9BNSEeDIsDCyABIgEgAkcNJkEyIR4MigMLIAEiASACRw0kQS8hHgyJAwsgASIBIAJHDR1BJCEeDIgDCyAALQAuQQFGDf0CDMcBCyAAIAEiASACELSAgIAAQQFHDbQBDLUBCyAAIAEiASACEK2AgIAAIh4NtQEgASEBDLACCwJAIAEiASACRw0AQQYhHgyFAwsgACABQQFqIgEgAhCwgICAACIeDbYBIAEhAQwPCyAAQgA3AyBBEyEeDPMCCyABIh4gAkcNCUEPIR4MggMLAkAgASIBIAJGDQAgAUEBaiEBQREhHgzyAgtBByEeDIEDCyAAQgAgACkDICIfIAIgASIea60iIH0iISAhIB9WGzcDICAfICBWIiJFDbMBQQghHgyAAwsCQCABIgEgAkYNACAAQYmAgIAANgIIIAAgATYCBCABIQFBFSEeDPACC0EJIR4M/wILIAEhASAAKQMgUA2yASABIQEMrQILAkAgASIBIAJHDQBBCyEeDP4CCyAAIAFBAWoiASACEK+AgIAAIh4NsgEgASEBDK0CCwNAAkAgAS0AAEHwnYCAAGotAAAiHkEBRg0AIB5BAkcNtAEgAUEBaiEBDAMLIAFBAWoiASACRw0AC0EMIR4M/AILAkAgASIBIAJHDQBBDSEeDPwCCwJAAkAgAS0AACIeQXNqDhQBtgG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBtgG2AbYBALQBCyABQQFqIQEMtAELIAFBAWohAQtBGCEeDOoCCwJAIAEiHiACRw0AQQ4hHgz6AgtCACEfIB4hAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgHi0AAEFQag43yAHHAQABAgMEBQYHvgK+Ar4CvgK+Ar4CvgIICQoLDA2+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CvgK+Ar4CDg8QERITvgILQgIhHwzHAQtCAyEfDMYBC0IEIR8MxQELQgUhHwzEAQtCBiEfDMMBC0IHIR8MwgELQgghHwzBAQtCCSEfDMABC0IKIR8MvwELQgshHwy+AQtCDCEfDL0BC0INIR8MvAELQg4hHwy7AQtCDyEfDLoBC0IKIR8MuQELQgshHwy4AQtCDCEfDLcBC0INIR8MtgELQg4hHwy1AQtCDyEfDLQBC0IAIR8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIB4tAABBUGoON8cBxgEAAQIDBAUGB8gByAHIAcgByAHIAcgBCAkKCwwNyAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAQ4PEBESE8gBC0ICIR8MxgELQgMhHwzFAQtCBCEfDMQBC0IFIR8MwwELQgYhHwzCAQtCByEfDMEBC0IIIR8MwAELQgkhHwy/AQtCCiEfDL4BC0ILIR8MvQELQgwhHwy8AQtCDSEfDLsBC0IOIR8MugELQg8hHwy5AQtCCiEfDLgBC0ILIR8MtwELQgwhHwy2AQtCDSEfDLUBC0IOIR8MtAELQg8hHwyzAQsgAEIAIAApAyAiHyACIAEiHmutIiB9IiEgISAfVhs3AyAgHyAgViIiRQ20AUERIR4M9wILAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRshHgznAgtBEiEeDPYCCyAAIAEiHiACELKAgIAAQX9qDgWmAQCiAgGzAbQBC0ESIR4M5AILIABBAToALyAeIQEM8gILIAEiASACRw20AUEWIR4M8gILIAEiHCACRw0ZQTkhHgzxAgsCQCABIgEgAkcNAEEaIR4M8QILIABBADYCBCAAQYqAgIAANgIIIAAgASABEKqAgIAAIh4NtgEgASEBDLkBCwJAIAEiHiACRw0AQRshHgzwAgsCQCAeLQAAIgFBIEcNACAeQQFqIQEMGgsgAUEJRw22ASAeQQFqIQEMGQsCQCABIgEgAkYNACABQQFqIQEMFAtBHCEeDO4CCwJAIAEiHiACRw0AQR0hHgzuAgsCQCAeLQAAIgFBCUcNACAeIQEM0gILIAFBIEcNtQEgHiEBDNECCwJAIAEiASACRw0AQR4hHgztAgsgAS0AAEEKRw24ASABQQFqIQEMoAILIAEiASACRw24AUEiIR4M6wILA0ACQCABLQAAIh5BIEYNAAJAIB5BdmoOBAC+Ab4BALwBCyABIQEMxAELIAFBAWoiASACRw0AC0EkIR4M6gILQSUhHiABIiMgAkYN6QIgAiAjayAAKAIAIiRqISUgIyEmICQhAQJAA0AgJi0AACIiQSByICIgIkG/f2pB/wFxQRpJG0H/AXEgAUHwn4CAAGotAABHDQEgAUEDRg3WAiABQQFqIQEgJkEBaiImIAJHDQALIAAgJTYCAAzqAgsgAEEANgIAICYhAQy7AQtBJiEeIAEiIyACRg3oAiACICNrIAAoAgAiJGohJSAjISYgJCEBAkADQCAmLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQfSfgIAAai0AAEcNASABQQhGDb0BIAFBAWohASAmQQFqIiYgAkcNAAsgACAlNgIADOkCCyAAQQA2AgAgJiEBDLoBC0EnIR4gASIjIAJGDecCIAIgI2sgACgCACIkaiElICMhJiAkIQECQANAICYtAAAiIkEgciAiICJBv39qQf8BcUEaSRtB/wFxIAFB0KaAgABqLQAARw0BIAFBBUYNvQEgAUEBaiEBICZBAWoiJiACRw0ACyAAICU2AgAM6AILIABBADYCACAmIQEMuQELAkAgASIBIAJGDQADQAJAIAEtAABBgKKAgABqLQAAIh5BAUYNACAeQQJGDQogASEBDMEBCyABQQFqIgEgAkcNAAtBIyEeDOcCC0EjIR4M5gILAkAgASIBIAJGDQADQAJAIAEtAAAiHkEgRg0AIB5BdmoOBL0BvgG+Ab0BvgELIAFBAWoiASACRw0AC0ErIR4M5gILQSshHgzlAgsDQAJAIAEtAAAiHkEgRg0AIB5BCUcNAwsgAUEBaiIBIAJHDQALQS8hHgzkAgsDQAJAIAEtAAAiHkEgRg0AAkACQCAeQXZqDgS+AQEBvgEACyAeQSxGDb8BCyABIQEMBAsgAUEBaiIBIAJHDQALQTIhHgzjAgsgASEBDL8BC0EzIR4gASImIAJGDeECIAIgJmsgACgCACIjaiEkICYhIiAjIQECQANAICItAABBIHIgAUGApICAAGotAABHDQEgAUEGRg3QAiABQQFqIQEgIkEBaiIiIAJHDQALIAAgJDYCAAziAgsgAEEANgIAICIhAQtBKyEeDNACCwJAIAEiHSACRw0AQTQhHgzgAgsgAEGKgICAADYCCCAAIB02AgQgHSEBIAAtACxBf2oOBK8BuQG7Ab0BxwILIAFBAWohAQyuAQsCQCABIgEgAkYNAANAAkAgAS0AACIeQSByIB4gHkG/f2pB/wFxQRpJG0H/AXEiHkEJRg0AIB5BIEYNAAJAAkACQAJAIB5BnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQSYhHgzTAgsgAUEBaiEBQSchHgzSAgsgAUEBaiEBQSghHgzRAgsgASEBDLIBCyABQQFqIgEgAkcNAAtBKCEeDN4CC0EoIR4M3QILAkAgASIBIAJGDQADQAJAIAEtAABBgKCAgABqLQAAQQFGDQAgASEBDLcBCyABQQFqIgEgAkcNAAtBMCEeDN0CC0EwIR4M3AILAkADQAJAIAEtAABBd2oOGAACwQLBAscCwQLBAsECwQLBAsECwQLBAsECwQLBAsECwQLBAsECwQLBAsECAMECCyABQQFqIgEgAkcNAAtBNSEeDNwCCyABQQFqIQELQSEhHgzKAgsgASIBIAJHDbkBQTchHgzZAgsDQAJAIAEtAABBkKSAgABqLQAAQQFGDQAgASEBDJACCyABQQFqIgEgAkcNAAtBOCEeDNgCCyAcLQAAIh5BIEYNmgEgHkE6Rw3GAiAAKAIEIQEgAEEANgIEIAAgASAcEKiAgIAAIgENtgEgHEEBaiEBDLgBCyAAIAEgAhCpgICAABoLQQohHgzFAgtBOiEeIAEiJiACRg3UAiACICZrIAAoAgAiI2ohJCAmIRwgIyEBAkADQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQZCmgIAAai0AAEcNxAIgAUEFRg0BIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADNUCCyAAQQA2AgAgAEEBOgAsICYgI2tBBmohAQy+AgtBOyEeIAEiJiACRg3TAiACICZrIAAoAgAiI2ohJCAmIRwgIyEBAkADQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQZamgIAAai0AAEcNwwIgAUEJRg0BIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADNQCCyAAQQA2AgAgAEECOgAsICYgI2tBCmohAQy9AgsCQCABIhwgAkcNAEE8IR4M0wILAkACQCAcLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwDDAsMCwwLDAsMCAcMCCyAcQQFqIQFBMiEeDMMCCyAcQQFqIQFBMyEeDMICC0E9IR4gASImIAJGDdECIAIgJmsgACgCACIjaiEkICYhHCAjIQEDQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQaCmgIAAai0AAEcNwAIgAUEBRg20AiABQQFqIQEgHEEBaiIcIAJHDQALIAAgJDYCAAzRAgtBPiEeIAEiJiACRg3QAiACICZrIAAoAgAiI2ohJCAmIRwgIyEBAkADQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQaKmgIAAai0AAEcNwAIgAUEORg0BIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADNECCyAAQQA2AgAgAEEBOgAsICYgI2tBD2ohAQy6AgtBPyEeIAEiJiACRg3PAiACICZrIAAoAgAiI2ohJCAmIRwgIyEBAkADQCAcLQAAIiJBIHIgIiAiQb9/akH/AXFBGkkbQf8BcSABQcCmgIAAai0AAEcNvwIgAUEPRg0BIAFBAWohASAcQQFqIhwgAkcNAAsgACAkNgIADNACCyAAQQA2AgAgAEEDOgAsICYgI2tBEGohAQy5AgtBwAAhHiABIiYgAkYNzgIgAiAmayAAKAIAIiNqISQgJiEcICMhAQJAA0AgHC0AACIiQSByICIgIkG/f2pB/wFxQRpJG0H/AXEgAUHQpoCAAGotAABHDb4CIAFBBUYNASABQQFqIQEgHEEBaiIcIAJHDQALIAAgJDYCAAzPAgsgAEEANgIAIABBBDoALCAmICNrQQZqIQEMuAILAkAgASIcIAJHDQBBwQAhHgzOAgsCQAJAAkACQCAcLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGdf2oOEwDAAsACwALAAsACwALAAsACwALAAsACwAIBwALAAsACAgPAAgsgHEEBaiEBQTUhHgzAAgsgHEEBaiEBQTYhHgy/AgsgHEEBaiEBQTchHgy+AgsgHEEBaiEBQTghHgy9AgsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBOSEeDL0CC0HCACEeDMwCCyABIgEgAkcNrwFBxAAhHgzLAgtBxQAhHiABIiYgAkYNygIgAiAmayAAKAIAIiNqISQgJiEiICMhAQJAA0AgIi0AACABQdamgIAAai0AAEcNtAEgAUEBRg0BIAFBAWohASAiQQFqIiIgAkcNAAsgACAkNgIADMsCCyAAQQA2AgAgJiAja0ECaiEBDK8BCwJAIAEiASACRw0AQccAIR4MygILIAEtAABBCkcNswEgAUEBaiEBDK8BCwJAIAEiASACRw0AQcgAIR4MyQILAkACQCABLQAAQXZqDgQBtAG0AQC0AQsgAUEBaiEBQT0hHgy5AgsgAUEBaiEBDK4BCwJAIAEiASACRw0AQckAIR4MyAILQQAhHgJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4KuwG6AQABAgMEBQYHvAELQQIhHgy6AQtBAyEeDLkBC0EEIR4MuAELQQUhHgy3AQtBBiEeDLYBC0EHIR4MtQELQQghHgy0AQtBCSEeDLMBCwJAIAEiASACRw0AQcoAIR4MxwILIAEtAABBLkcNtAEgAUEBaiEBDIACCwJAIAEiASACRw0AQcsAIR4MxgILQQAhHgJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4KvQG8AQABAgMEBQYHvgELQQIhHgy8AQtBAyEeDLsBC0EEIR4MugELQQUhHgy5AQtBBiEeDLgBC0EHIR4MtwELQQghHgy2AQtBCSEeDLUBC0HMACEeIAEiJiACRg3EAiACICZrIAAoAgAiI2ohJCAmIQEgIyEiA0AgAS0AACAiQeKmgIAAai0AAEcNuAEgIkEDRg23ASAiQQFqISIgAUEBaiIBIAJHDQALIAAgJDYCAAzEAgtBzQAhHiABIiYgAkYNwwIgAiAmayAAKAIAIiNqISQgJiEBICMhIgNAIAEtAAAgIkHmpoCAAGotAABHDbcBICJBAkYNuQEgIkEBaiEiIAFBAWoiASACRw0ACyAAICQ2AgAMwwILQc4AIR4gASImIAJGDcICIAIgJmsgACgCACIjaiEkICYhASAjISIDQCABLQAAICJB6aaAgABqLQAARw22ASAiQQNGDbkBICJBAWohIiABQQFqIgEgAkcNAAsgACAkNgIADMICCwNAAkAgAS0AACIeQSBGDQACQAJAAkAgHkG4f2oOCwABugG6AboBugG6AboBugG6AQK6AQsgAUEBaiEBQcIAIR4MtQILIAFBAWohAUHDACEeDLQCCyABQQFqIQFBxAAhHgyzAgsgAUEBaiIBIAJHDQALQc8AIR4MwQILAkAgASIBIAJGDQAgACABQQFqIgEgAhClgICAABogASEBQQchHgyxAgtB0AAhHgzAAgsDQAJAIAEtAABB8KaAgABqLQAAIh5BAUYNACAeQX5qDgO5AboBuwG8AQsgAUEBaiIBIAJHDQALQdEAIR4MvwILAkAgASIBIAJGDQAgAUEBaiEBDAMLQdIAIR4MvgILA0ACQCABLQAAQfCogIAAai0AACIeQQFGDQACQCAeQX5qDgS8Ab0BvgEAvwELIAEhAUHGACEeDK8CCyABQQFqIgEgAkcNAAtB0wAhHgy9AgsCQCABIgEgAkcNAEHUACEeDL0CCwJAIAEtAAAiHkF2ag4apAG/Ab8BpgG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG/Ab8BvwG0Ab8BvwEAvQELIAFBAWohAQtBBiEeDKsCCwNAAkAgAS0AAEHwqoCAAGotAABBAUYNACABIQEM+gELIAFBAWoiASACRw0AC0HVACEeDLoCCwJAIAEiASACRg0AIAFBAWohAQwDC0HWACEeDLkCCwJAIAEiASACRw0AQdcAIR4MuQILIAFBAWohAQwBCwJAIAEiASACRw0AQdgAIR4MuAILIAFBAWohAQtBBCEeDKYCCwJAIAEiIiACRw0AQdkAIR4MtgILICIhAQJAAkACQCAiLQAAQfCsgIAAai0AAEF/ag4HvgG/AcABAPgBAQLBAQsgIkEBaiEBDAoLICJBAWohAQy3AQtBACEeIABBADYCHCAAQfGOgIAANgIQIABBBzYCDCAAICJBAWo2AhQMtQILAkADQAJAIAEtAABB8KyAgABqLQAAIh5BBEYNAAJAAkAgHkF/ag4HvAG9Ab4BwwEABAHDAQsgASEBQckAIR4MqAILIAFBAWohAUHLACEeDKcCCyABQQFqIgEgAkcNAAtB2gAhHgy1AgsgAUEBaiEBDLUBCwJAIAEiIiACRw0AQdsAIR4MtAILICItAABBL0cNvgEgIkEBaiEBDAYLAkAgASIiIAJHDQBB3AAhHgyzAgsCQCAiLQAAIgFBL0cNACAiQQFqIQFBzAAhHgyjAgsgAUF2aiIBQRZLDb0BQQEgAXRBiYCAAnFFDb0BDJMCCwJAIAEiASACRg0AIAFBAWohAUHNACEeDKICC0HdACEeDLECCwJAIAEiIiACRw0AQd8AIR4MsQILICIhAQJAICItAABB8LCAgABqLQAAQX9qDgOSAvABAL4BC0HQACEeDKACCwJAIAEiIiACRg0AA0ACQCAiLQAAQfCugIAAai0AACIBQQNGDQACQCABQX9qDgKUAgC/AQsgIiEBQc4AIR4MogILICJBAWoiIiACRw0AC0HeACEeDLACC0HeACEeDK8CCwJAIAEiASACRg0AIABBjICAgAA2AgggACABNgIEIAEhAUHPACEeDJ8CC0HgACEeDK4CCwJAIAEiASACRw0AQeEAIR4MrgILIABBjICAgAA2AgggACABNgIEIAEhAQtBAyEeDJwCCwNAIAEtAABBIEcNjAIgAUEBaiIBIAJHDQALQeIAIR4MqwILAkAgASIBIAJHDQBB4wAhHgyrAgsgAS0AAEEgRw24ASABQQFqIQEM1AELAkAgASIIIAJHDQBB5AAhHgyqAgsgCC0AAEHMAEcNuwEgCEEBaiEBQRMhHgy5AQtB5QAhHiABIiIgAkYNqAIgAiAiayAAKAIAIiZqISMgIiEIICYhAQNAIAgtAAAgAUHwsoCAAGotAABHDboBIAFBBUYNuAEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMqAILAkAgASIIIAJHDQBB5gAhHgyoAgsCQAJAIAgtAABBvX9qDgwAuwG7AbsBuwG7AbsBuwG7AbsBuwEBuwELIAhBAWohAUHUACEeDJgCCyAIQQFqIQFB1QAhHgyXAgtB5wAhHiABIiIgAkYNpgIgAiAiayAAKAIAIiZqISMgIiEIICYhAQJAA0AgCC0AACABQe2zgIAAai0AAEcNuQEgAUECRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADKcCCyAAQQA2AgAgIiAma0EDaiEBQRAhHgy2AQtB6AAhHiABIiIgAkYNpQIgAiAiayAAKAIAIiZqISMgIiEIICYhAQJAA0AgCC0AACABQfaygIAAai0AAEcNuAEgAUEFRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADKYCCyAAQQA2AgAgIiAma0EGaiEBQRYhHgy1AQtB6QAhHiABIiIgAkYNpAIgAiAiayAAKAIAIiZqISMgIiEIICYhAQJAA0AgCC0AACABQfyygIAAai0AAEcNtwEgAUEDRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADKUCCyAAQQA2AgAgIiAma0EEaiEBQQUhHgy0AQsCQCABIgggAkcNAEHqACEeDKQCCyAILQAAQdkARw21ASAIQQFqIQFBCCEeDLMBCwJAIAEiCCACRw0AQesAIR4MowILAkACQCAILQAAQbJ/ag4DALYBAbYBCyAIQQFqIQFB2QAhHgyTAgsgCEEBaiEBQdoAIR4MkgILAkAgASIIIAJHDQBB7AAhHgyiAgsCQAJAIAgtAABBuH9qDggAtQG1AbUBtQG1AbUBAbUBCyAIQQFqIQFB2AAhHgySAgsgCEEBaiEBQdsAIR4MkQILQe0AIR4gASIiIAJGDaACIAIgImsgACgCACImaiEjICIhCCAmIQECQANAIAgtAAAgAUGAs4CAAGotAABHDbMBIAFBAkYNASABQQFqIQEgCEEBaiIIIAJHDQALIAAgIzYCAAyhAgtBACEeIABBADYCACAiICZrQQNqIQEMsAELQe4AIR4gASIiIAJGDZ8CIAIgImsgACgCACImaiEjICIhCCAmIQECQANAIAgtAAAgAUGDs4CAAGotAABHDbIBIAFBBEYNASABQQFqIQEgCEEBaiIIIAJHDQALIAAgIzYCAAygAgsgAEEANgIAICIgJmtBBWohAUEjIR4MrwELAkAgASIIIAJHDQBB7wAhHgyfAgsCQAJAIAgtAABBtH9qDggAsgGyAbIBsgGyAbIBAbIBCyAIQQFqIQFB3QAhHgyPAgsgCEEBaiEBQd4AIR4MjgILAkAgASIIIAJHDQBB8AAhHgyeAgsgCC0AAEHFAEcNrwEgCEEBaiEBDN4BC0HxACEeIAEiIiACRg2cAiACICJrIAAoAgAiJmohIyAiIQggJiEBAkADQCAILQAAIAFBiLOAgABqLQAARw2vASABQQNGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMnQILIABBADYCACAiICZrQQRqIQFBLSEeDKwBC0HyACEeIAEiIiACRg2bAiACICJrIAAoAgAiJmohIyAiIQggJiEBAkADQCAILQAAIAFB0LOAgABqLQAARw2uASABQQhGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICM2AgAMnAILIABBADYCACAiICZrQQlqIQFBKSEeDKsBCwJAIAEiASACRw0AQfMAIR4MmwILQQEhHiABLQAAQd8ARw2qASABQQFqIQEM3AELQfQAIR4gASIiIAJGDZkCIAIgImsgACgCACImaiEjICIhCCAmIQEDQCAILQAAIAFBjLOAgABqLQAARw2rASABQQFGDfcBIAFBAWohASAIQQFqIgggAkcNAAsgACAjNgIADJkCCwJAIAEiHiACRw0AQfUAIR4MmQILIAIgHmsgACgCACIiaiEmIB4hCCAiIQECQANAIAgtAAAgAUGOs4CAAGotAABHDasBIAFBAkYNASABQQFqIQEgCEEBaiIIIAJHDQALIAAgJjYCAEH1ACEeDJkCCyAAQQA2AgAgHiAia0EDaiEBQQIhHgyoAQsCQCABIh4gAkcNAEH2ACEeDJgCCyACIB5rIAAoAgAiImohJiAeIQggIiEBAkADQCAILQAAIAFB8LOAgABqLQAARw2qASABQQFGDQEgAUEBaiEBIAhBAWoiCCACRw0ACyAAICY2AgBB9gAhHgyYAgsgAEEANgIAIB4gImtBAmohAUEfIR4MpwELAkAgASIeIAJHDQBB9wAhHgyXAgsgAiAeayAAKAIAIiJqISYgHiEIICIhAQJAA0AgCC0AACABQfKzgIAAai0AAEcNqQEgAUEBRg0BIAFBAWohASAIQQFqIgggAkcNAAsgACAmNgIAQfcAIR4MlwILIABBADYCACAeICJrQQJq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LwEwQRByOwEwDIcBCyAAQTY2AhwgACABNgIMIAAgHEEBajYCFEEAIR4MoAELIAEtAABBOkcNAiAAKAIEIR4gAEEANgIEIAAgHiABEKiAgIAAIh4NASABQQFqIQELQTEhHgyOAQsgAEE2NgIcIAAgHjYCDCAAIAFBAWo2AhRBACEeDJ0BCyAAQQA2AhwgACABNgIUIABBh46AgAA2AhAgAEEKNgIMQQAhHgycAQsgAUEBaiEBCyAAQYASOwEqIAAgASACEKWAgIAAGiABIQELQawBIR4MiQELIAAoAgQhHiAAQQA2AgQCQCAAIB4gARCkgICAACIeDQAgASEBDFALIABBxAA2AhwgACABNgIUIAAgHjYCDEEAIR4MmAELIABBADYCHCAAICI2AhQgAEHlmICAADYCECAAQQc2AgwgAEEANgIAQQAhHgyXAQsgACgCBCEeIABBADYCBAJAIAAgHiABEKSAgIAAIh4NACABIQEMTwsgAEHFADYCHCAAIAE2AhQgACAeNgIMQQAhHgyWAQtBACEeIABBADYCHCAAIAE2AhQgAEHrjYCAADYCECAAQQk2AgwMlQELQQEhHgsgACAeOgArIAFBAWohASAALQApQSJGDYsBDEwLIABBADYCHCAAIAE2AhQgAEGijYCAADYCECAAQQk2AgxBACEeDJIBCyAAQQA2AhwgACABNgIUIABBxYqAgAA2AhAgAEEJNgIMQQAhHgyRAQtBASEeCyAAIB46ACogAUEBaiEBDEoLIABBADYCHCAAIAE2AhQgAEG4jYCAADYCECAAQQk2AgxBACEeDI4BCyAAQQA2AgAgJiAja0EEaiEBAkAgAC0AKUEjTw0AIAEhAQxKCyAAQQA2AhwgACABNgIUIABBr4mAgAA2AhAgAEEINgIMQQAhHgyNAQsgAEEANgIAC0EAIR4gAEEANgIcIAAgATYCFCAAQbmbgIAANgIQIABBCDYCDAyLAQsgAEEANgIAICYgI2tBA2ohAQJAIAAtAClBIUcNACABIQEMRwsgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDEEAIR4MigELIABBADYCACAmICNrQQRqIQECQCAALQApIh5BXWpBC08NACABIQEMRgsCQCAeQQZLDQBBASAedEHKAHFFDQAgASEBDEYLQQAhHiAAQQA2AhwgACAB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HiAAQQA2AhwgACABNgIUIABB6pCAgAA2AhAgAEEZNgIMDAILIABBIDYCHCAAIAg2AgwgACABQQFqNgIUQQAhHgwBCwJAIAEiASACRw0AQRQhHgwBCyAAQYmAgIAANgIIIAAgATYCBEETIR4LIANBEGokgICAgAAgHguvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAELuAgIAAC5U3AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKgtICAAA0AQQAQvoCAgABBgLiEgABrIgJB2QBJDQBBACEDAkBBACgC4LeAgAAiBA0AQQBCfzcC7LeAgABBAEKAgISAgIDAADcC5LeAgABBACABQQhqQXBxQdiq1aoFcyIENgLgt4CAAEEAQQA2AvS3gIAAQQBBADYCxLeAgAALQQAgAjYCzLeAgABBAEGAuISAADYCyLeAgABBAEGAuISAADYCmLSAgABBACAENgKstICAAEEAQX82Aqi0gIAAA0AgA0HEtICAAGogA0G4tICAAGoiBDYCACAEIANBsLSAgABqIgU2AgAgA0G8tICAAGogBTYCACADQcy0gIAAaiADQcC0gIAAaiIFNgIAIAUgBDYCACADQdS0gIAAaiADQci0gIAAaiIENgIAIAQgBTYCACADQdC0gIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgLiEgABBeEGAuISAAGtBD3FBAEGAuISAAEEIakEPcRsiA2oiBEEEaiACIANrQUhqIgNBAXI2AgBBAEEAKALwt4CAADYCpLSAgABBACAENgKgtICAAEEAIAM2ApS0gIAAIAJBgLiEgABqQUxqQTg2AgALAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKItICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQAgA0EBcSAEckEBcyIFQQN0IgBBuLSAgABqKAIAIgRBCGohAwJA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AkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABQRhqIAQ2AgAgASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEYakEANgIAIAEgBDYCDCABIAA2AggLQQBBACgCqLSAgABBf2oiAUF/IAEbNgKotICAAAsLTgACQCAADQA/AEEQdA8LAkAgAEH//wNxDQAgAEF/TA0AAkAgAEEQdkAAIgBBf0cNAEEAQTA2Avi3gIAAQX8PCyAAQRB0DwsQv4CAgAAACwQAAAALC44sAQBBgAgLhiwBAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHBhcmFtZXRlcnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AATUtBQ1RJVklUWQBDT1BZAE5PVElGWQBQTEFZAFBVVABDSEVDS09VVABQT1NUAFJFUE9SVABIUEVfSU5WQUxJRF9DT05TVEFOVABHRVQASFBFX1NUUklDVABSRURJUkVDVABDT05ORUNUAEhQRV9JTlZBTElEX1NUQVRVUwBPUFRJT05TAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAEhQRV9JTlZBTElEX1VSTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUAUEFVU0UAUFVSR0UATUVSR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABQUk9QRklORABVTkJJTkQAUkVCSU5EAEhQ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BQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAADBAAABAQEBAQEBAQEBAQFBAQEBAQEBAQEBAQEAAQABgcEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAACAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv'; return llhttp_simd_wasm; } var client; var hasRequiredClient; function requireClient () { if (hasRequiredClient) return client; hasRequiredClient = 1; /* global WebAssembly */ const assert = require$$0$1; const net = require$$4$1; const util = requireUtil$1(); const Request = requireRequest$1(); const DispatcherBase = requireDispatcherBase(); const RedirectHandler = requireRedirect(); const { RequestContentLengthMismatchError, ResponseContentLengthMismatchError, InvalidArgumentError, RequestAbortedError, HeadersTimeoutError, HeadersOverflowError, SocketError, InformationalError, BodyTimeoutError, HTTPParserError } = requireErrors(); const buildConnector = requireConnect(); const { kUrl, kReset, kServerName, kClient, kBusy, kParser, kConnect, kBlocking, kResuming, kRunning, kPending, kSize, kWriting, kQueue, kConnected, kConnecting, kNeedDrain, kNoRef, kKeepAliveDefaultTimeout, kHostHeader, kPendingIdx, kRunningIdx, kError, kPipelining, kSocket, kKeepAliveTimeoutValue, kMaxHeadersSize, kKeepAliveMaxTimeout, kKeepAliveTimeoutThreshold, kHeadersTimeout, kBodyTimeout, kStrictContentLength, kConnector, kMaxRedirections, kMaxRequests, kCounter, kClose, kDestroy, kDispatch } = requireSymbols$1(); const kClosedResolve = Symbol('kClosedResolve'); const channels = {}; try { const diagnosticsChannel = require('diagnostics_channel'); channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders'); channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect'); channels.connectError = diagnosticsChannel.channel('undici:client:connectError'); channels.connected = diagnosticsChannel.channel('undici:client:connected'); } catch { channels.sendHeaders = { hasSubscribers: false }; channels.beforeConnect = { hasSubscribers: false }; channels.connectError = { hasSubscribers: false }; channels.connected = { hasSubscribers: false }; } class Client extends DispatcherBase { constructor (url, { maxHeaderSize, headersTimeout, socketTimeout, requestTimeout, connectTimeout, bodyTimeout, idleTimeout, keepAlive, keepAliveTimeout, maxKeepAliveTimeout, keepAliveMaxTimeout, keepAliveTimeoutThreshold, socketPath, pipelining, tls, strictContentLength, maxCachedSessions, maxRedirections, connect, maxRequestsPerClient } = {}) { super(); if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') } if (socketTimeout !== undefined) { throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') } if (requestTimeout !== undefined) { throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') } if (idleTimeout !== undefined) { throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') } if (maxKeepAliveTimeout !== undefined) { throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') } if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { throw new InvalidArgumentError('invalid maxHeaderSize') } if (socketPath != null && typeof socketPath !== 'string') { throw new InvalidArgumentError('invalid socketPath') } if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { throw new InvalidArgumentError('invalid connectTimeout') } if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { throw new InvalidArgumentError('invalid keepAliveTimeout') } if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { throw new InvalidArgumentError('invalid keepAliveMaxTimeout') } if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') } if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') } if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') } if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { throw new InvalidArgumentError('connect must be a function or an object') } if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { throw new InvalidArgumentError('maxRedirections must be a positive number') } if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') } if (typeof connect !== 'function') { connect = buildConnector({ ...tls, maxCachedSessions, socketPath, timeout: connectTimeout, ...connect }); } this[kUrl] = util.parseOrigin(url); this[kConnector] = connect; this[kSocket] = null; this[kPipelining] = pipelining != null ? pipelining : 1; this[kMaxHeadersSize] = maxHeaderSize || 16384; this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout; this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; this[kServerName] = null; this[kResuming] = 0; // 0, idle, 1, scheduled, 2 resuming this[kNeedDrain] = 0; // 0, idle, 1, scheduled, 2 resuming this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`; this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 30e3; this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 30e3; this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; this[kMaxRedirections] = maxRedirections; this[kMaxRequests] = maxRequestsPerClient; this[kClosedResolve] = null; // kQueue is built up of 3 sections separated by // the kRunningIdx and kPendingIdx indices. // | complete | running | pending | // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length // kRunningIdx points to the first running element. // kPendingIdx points to the first pending element. // This implements a fast queue with an amortized // time of O(1). this[kQueue] = []; this[kRunningIdx] = 0; this[kPendingIdx] = 0; } get pipelining () { return this[kPipelining] } set pipelining (value) { this[kPipelining] = value; resume(this, true); } get [kPending] () { return this[kQueue].length - this[kPendingIdx] } get [kRunning] () { return this[kPendingIdx] - this[kRunningIdx] } get [kSize] () { return this[kQueue].length - this[kRunningIdx] } get [kConnected] () { return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed } get [kBusy] () { const socket = this[kSocket]; return ( (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || (this[kSize] >= (this[kPipelining] || 1)) || this[kPending] > 0 ) } /* istanbul ignore: only used for test */ [kConnect] (cb) { connect(this); this.once('connect', cb); } [kDispatch] (opts, handler) { const { maxRedirections = this[kMaxRedirections] } = opts; if (maxRedirections) { handler = new RedirectHandler(this, maxRedirections, opts, handler); } const origin = opts.origin || this[kUrl].origin; const request = new Request(origin, opts, handler); this[kQueue].push(request); if (this[kResuming]) ; else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { // Wait a tick in case stream/iterator is ended in the same tick. this[kResuming] = 1; process.nextTick(resume, this); } else { resume(this, true); } if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { this[kNeedDrain] = 2; } return this[kNeedDrain] < 2 } async [kClose] () { return new Promise((resolve) => { if (!this[kSize]) { this.destroy(resolve); } else { this[kClosedResolve] = resolve; } }) } async [kDestroy] (err) { return new Promise((resolve) => { const requests = this[kQueue].splice(this[kPendingIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; errorRequest(this, request, err); } const callback = () => { if (this[kClosedResolve]) { this[kClosedResolve](); this[kClosedResolve] = null; } resolve(); }; if (!this[kSocket]) { queueMicrotask(callback); } else { util.destroy(this[kSocket].on('close', callback), err); } resume(this); }) } } const constants = requireConstants(); const EMPTY_BUF = Buffer.alloc(0); async function lazyllhttp () { const llhttpWasmData = process.env.JEST_WORKER_ID ? requireLlhttp_wasm() : undefined; let mod; try { mod = await WebAssembly.compile(Buffer.from(requireLlhttp_simd_wasm(), 'base64')); } catch (e) { /* istanbul ignore next */ // We could check if the error was caused by the simd option not // being enabled, but the occurring of this other error // * https://github.com/emscripten-core/emscripten/issues/11495 // got me to remove that check to avoid breaking Node 12. mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || requireLlhttp_wasm(), 'base64')); } return await WebAssembly.instantiate(mod, { env: { /* eslint-disable camelcase */ wasm_on_url: (p, at, len) => { /* istanbul ignore next */ return 0 }, wasm_on_status: (p, at, len) => { assert.strictEqual(currentParser.ptr, p); const start = at - currentBufferPtr; const end = start + len; return currentParser.onStatus(currentBufferRef.slice(start, end)) || 0 }, wasm_on_message_begin: (p) => { assert.strictEqual(currentParser.ptr, p); return currentParser.onMessageBegin() || 0 }, wasm_on_header_field: (p, at, len) => { assert.strictEqual(currentParser.ptr, p); const start = at - currentBufferPtr; const end = start + len; return currentParser.onHeaderField(currentBufferRef.slice(start, end)) || 0 }, wasm_on_header_value: (p, at, len) => { assert.strictEqual(currentParser.ptr, p); const start = at - currentBufferPtr; const end = start + len; return currentParser.onHeaderValue(currentBufferRef.slice(start, end)) || 0 }, wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { assert.strictEqual(currentParser.ptr, p); return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 }, wasm_on_body: (p, at, len) => { assert.strictEqual(currentParser.ptr, p); const start = at - currentBufferPtr; const end = start + len; return currentParser.onBody(currentBufferRef.slice(start, end)) || 0 }, wasm_on_message_complete: (p) => { assert.strictEqual(currentParser.ptr, p); return currentParser.onMessageComplete() || 0 } /* eslint-enable camelcase */ } }) } let llhttpInstance = null; let llhttpPromise = lazyllhttp() .catch(() => { }); let currentParser = null; let currentBufferRef = null; let currentBufferSize = 0; let currentBufferPtr = null; const TIMEOUT_HEADERS = 1; const TIMEOUT_BODY = 2; const TIMEOUT_IDLE = 3; class Parser { constructor (client, socket, { exports }) { assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); this.llhttp = exports; this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); this.client = client; this.socket = socket; this.timeout = null; this.timeoutValue = null; this.timeoutType = null; this.statusCode = null; this.statusText = ''; this.upgrade = false; this.headers = []; this.headersSize = 0; this.headersMaxSize = client[kMaxHeadersSize]; this.shouldKeepAlive = false; this.paused = false; this.resume = this.resume.bind(this); this.bytesRead = 0; this.keepAlive = ''; this.contentLength = ''; } setTimeout (value, type) { this.timeoutType = type; if (value !== this.timeoutValue) { clearTimeout(this.timeout); if (value) { this.timeout = setTimeout(onParserTimeout, value, this); // istanbul ignore else: only for jest if (this.timeout.unref) { this.timeout.unref(); } } else { this.timeout = null; } this.timeoutValue = value; } else if (this.timeout) { // istanbul ignore else: only for jest if (this.timeout.refresh) { this.timeout.refresh(); } } } resume () { if (this.socket.destroyed || !this.paused) { return } assert(this.ptr != null); assert(currentParser == null); this.llhttp.llhttp_resume(this.ptr); assert(this.timeoutType === TIMEOUT_BODY); if (this.timeout) { // istanbul ignore else: only for jest if (this.timeout.refresh) { this.timeout.refresh(); } } this.paused = false; this.execute(this.socket.read() || EMPTY_BUF); // Flush parser. this.readMore(); } readMore () { while (!this.paused && this.ptr) { const chunk = this.socket.read(); if (chunk === null) { break } this.execute(chunk); } } execute (data) { assert(this.ptr != null); assert(currentParser == null); assert(!this.paused); const { socket, llhttp } = this; if (data.length > currentBufferSize) { if (currentBufferPtr) { llhttp.free(currentBufferPtr); } currentBufferSize = Math.ceil(data.length / 4096) * 4096; currentBufferPtr = llhttp.malloc(currentBufferSize); } new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); // Call `execute` on the wasm parser. // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, // and finally the length of bytes to parse. // The return value is an error code or `constants.ERROR.OK`. try { let ret; try { currentBufferRef = data; currentParser = this; ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); /* eslint-disable-next-line no-useless-catch */ } catch (err) { /* istanbul ignore next: difficult to make a test case for */ throw err } finally { currentParser = null; currentBufferRef = null; } const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; if (ret === constants.ERROR.PAUSED_UPGRADE) { this.onUpgrade(data.slice(offset)); } else if (ret === constants.ERROR.PAUSED) { this.paused = true; socket.unshift(data.slice(offset)); } else if (ret !== constants.ERROR.OK) { const ptr = llhttp.llhttp_get_error_reason(this.ptr); let message = ''; /* istanbul ignore else: difficult to make a test case for */ if (ptr) { const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); message = Buffer.from(llhttp.memory.buffer, ptr, len).toString(); } throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } } catch (err) { util.destroy(socket, err); } } finish () { try { try { currentParser = this; } finally { currentParser = null; } } catch (err) { /* istanbul ignore next: difficult to make a test case for */ util.destroy(this.socket, err); } } destroy () { assert(this.ptr != null); assert(currentParser == null); this.llhttp.llhttp_free(this.ptr); this.ptr = null; clearTimeout(this.timeout); this.timeout = null; this.timeoutValue = null; this.timeoutType = null; this.paused = false; } onStatus (buf) { this.statusText = buf.toString(); } onMessageBegin () { const { socket, client } = this; /* istanbul ignore next: difficult to make a test case for */ if (socket.destroyed) { return -1 } const request = client[kQueue][client[kRunningIdx]]; if (!request) { return -1 } } onHeaderField (buf) { const len = this.headers.length; if ((len & 1) === 0) { this.headers.push(buf); } else { this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } this.trackHeader(buf.length); } onHeaderValue (buf) { let len = this.headers.length; if ((len & 1) === 1) { this.headers.push(buf); len += 1; } else { this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } const key = this.headers[len - 2]; if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { this.keepAlive += buf.toString(); } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { this.contentLength += buf.toString(); } this.trackHeader(buf.length); } trackHeader (len) { this.headersSize += len; if (this.headersSize >= this.headersMaxSize) { util.destroy(this.socket, new HeadersOverflowError()); } } onUpgrade (head) { const { upgrade, client, socket, headers, statusCode } = this; assert(upgrade); const request = client[kQueue][client[kRunningIdx]]; assert(request); assert(!socket.destroyed); assert(socket === client[kSocket]); assert(!this.paused); assert(request.upgrade || request.method === 'CONNECT'); this.statusCode = null; this.statusText = ''; this.shouldKeepAlive = null; assert(this.headers.length % 2 === 0); this.headers = []; this.headersSize = 0; socket.unshift(head); socket[kParser].destroy(); socket[kParser] = null; socket[kClient] = null; socket[kError] = null; socket .removeListener('error', onSocketError) .removeListener('readable', onSocketReadable) .removeListener('end', onSocketEnd) .removeListener('close', onSocketClose); client[kSocket] = null; client[kQueue][client[kRunningIdx]++] = null; client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')); try { request.onUpgrade(statusCode, headers, socket); } catch (err) { util.destroy(socket, err); } resume(client); } onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { const { client, socket, headers, statusText } = this; /* istanbul ignore next: difficult to make a test case for */ if (socket.destroyed) { return -1 } const request = client[kQueue][client[kRunningIdx]]; /* istanbul ignore next: difficult to make a test case for */ if (!request) { return -1 } assert(!this.upgrade); assert(this.statusCode < 200); if (statusCode === 100) { util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))); return -1 } /* this can only happen if server is misbehaving */ if (upgrade && !request.upgrade) { util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))); return -1 } assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); this.statusCode = statusCode; this.shouldKeepAlive = shouldKeepAlive; if (this.statusCode >= 200) { const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; this.setTimeout(bodyTimeout, TIMEOUT_BODY); } else if (this.timeout) { // istanbul ignore else: only for jest if (this.timeout.refresh) { this.timeout.refresh(); } } if (request.method === 'CONNECT') { assert(client[kRunning] === 1); this.upgrade = true; return 2 } if (upgrade) { assert(client[kRunning] === 1); this.upgrade = true; return 2 } assert(this.headers.length % 2 === 0); this.headers = []; this.headersSize = 0; if (shouldKeepAlive && client[kPipelining]) { const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; if (keepAliveTimeout != null) { const timeout = Math.min( keepAliveTimeout - client[kKeepAliveTimeoutThreshold], client[kKeepAliveMaxTimeout] ); if (timeout <= 0) { socket[kReset] = true; } else { client[kKeepAliveTimeoutValue] = timeout; } } else { client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; } } else { // Stop more requests from being dispatched. socket[kReset] = true; } let pause; try { pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; } catch (err) { util.destroy(socket, err); return -1 } if (request.method === 'HEAD') { assert(socket[kReset]); return 1 } if (statusCode < 200) { return 1 } if (socket[kBlocking]) { socket[kBlocking] = false; resume(client); } return pause ? constants.ERROR.PAUSED : 0 } onBody (buf) { const { client, socket, statusCode } = this; if (socket.destroyed) { return -1 } const request = client[kQueue][client[kRunningIdx]]; assert(request); assert.strictEqual(this.timeoutType, TIMEOUT_BODY); if (this.timeout) { // istanbul ignore else: only for jest if (this.timeout.refresh) { this.timeout.refresh(); } } assert(statusCode >= 200); this.bytesRead += buf.length; try { if (request.onData(buf) === false) { return constants.ERROR.PAUSED } } catch (err) { util.destroy(socket, err); return -1 } } onMessageComplete () { const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; if (socket.destroyed && (!statusCode || shouldKeepAlive)) { return -1 } if (upgrade) { return } const request = client[kQueue][client[kRunningIdx]]; assert(request); assert(statusCode >= 100); this.statusCode = null; this.statusText = ''; this.bytesRead = 0; this.contentLength = ''; this.keepAlive = ''; assert(this.headers.length % 2 === 0); this.headers = []; this.headersSize = 0; if (statusCode < 200) { return } /* istanbul ignore next: should be handled by llhttp? */ if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { util.destroy(socket, new ResponseContentLengthMismatchError()); return -1 } try { request.onComplete(headers); } catch (err) { errorRequest(client, request, err); } client[kQueue][client[kRunningIdx]++] = null; if (socket[kWriting]) { assert.strictEqual(client[kRunning], 0); // Response completed before request. util.destroy(socket, new InformationalError('reset')); return constants.ERROR.PAUSED } else if (!shouldKeepAlive) { util.destroy(socket, new InformationalError('reset')); return constants.ERROR.PAUSED } else if (socket[kReset] && client[kRunning] === 0) { // Destroy socket once all requests have completed. // The request at the tail of the pipeline is the one // that requested reset and no further requests should // have been queued since then. util.destroy(socket, new InformationalError('reset')); return constants.ERROR.PAUSED } else if (client[kPipelining] === 1) { // We must wait a full event loop cycle to reuse this socket to make sure // that non-spec compliant servers are not closing the connection even if they // said they won't. setImmediate(resume, client); } else { resume(client); } } } function onParserTimeout (parser) { const { socket, timeoutType, client } = parser; /* istanbul ignore else */ if (timeoutType === TIMEOUT_HEADERS) { if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { assert(!parser.paused, 'cannot be paused while waiting for headers'); util.destroy(socket, new HeadersTimeoutError()); } } else if (timeoutType === TIMEOUT_BODY) { if (!parser.paused) { util.destroy(socket, new BodyTimeoutError()); } } else if (timeoutType === TIMEOUT_IDLE) { assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); util.destroy(socket, new InformationalError('socket idle timeout')); } } function onSocketReadable () { const { [kParser]: parser } = this; parser.readMore(); } function onSocketError (err) { const { [kParser]: parser } = this; assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID'); // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded // to the user. if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { // We treat all incoming data so for as a valid response. parser.finish(); return } this[kError] = err; onError(this[kClient], err); } function onError (client, err) { if ( client[kRunning] === 0 && err.code !== 'UND_ERR_INFO' && err.code !== 'UND_ERR_SOCKET' ) { // Error is not caused by running request and not a recoverable // socket error. assert(client[kPendingIdx] === client[kRunningIdx]); const requests = client[kQueue].splice(client[kRunningIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; errorRequest(client, request, err); } assert(client[kSize] === 0); } } function onSocketEnd () { const { [kParser]: parser } = this; if (parser.statusCode && !parser.shouldKeepAlive) { // We treat all incoming data so far as a valid response. parser.finish(); return } util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))); } function onSocketClose () { const { [kClient]: client } = this; this[kParser].destroy(); this[kParser] = null; const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)); client[kSocket] = null; if (client.destroyed) { assert(client[kPending] === 0); // Fail entire queue. const requests = client[kQueue].splice(client[kRunningIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; errorRequest(client, request, err); } } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { // Fail head of pipeline. const request = client[kQueue][client[kRunningIdx]]; client[kQueue][client[kRunningIdx]++] = null; errorRequest(client, request, err); } client[kPendingIdx] = client[kRunningIdx]; assert(client[kRunning] === 0); client.emit('disconnect', client[kUrl], [client], err); resume(client); } async function connect (client) { assert(!client[kConnecting]); assert(!client[kSocket]); let { host, hostname, protocol, port } = client[kUrl]; // Resolve ipv6 if (hostname[0] === '[') { const idx = hostname.indexOf(']'); assert(idx !== -1); const ip = hostname.substr(1, idx - 1); assert(net.isIP(ip)); hostname = ip; } client[kConnecting] = true; if (channels.beforeConnect.hasSubscribers) { channels.beforeConnect.publish({ connectParams: { host, hostname, protocol, port, servername: client[kServerName] }, connector: client[kConnector] }); } try { const socket = await new Promise((resolve, reject) => { client[kConnector]({ host, hostname, protocol, port, servername: client[kServerName] }, (err, socket) => { if (err) { reject(err); } else { resolve(socket); } }); }); if (!llhttpInstance) { llhttpInstance = await llhttpPromise; llhttpPromise = null; } client[kConnecting] = false; assert(socket); client[kSocket] = socket; socket[kNoRef] = false; socket[kWriting] = false; socket[kReset] = false; socket[kBlocking] = false; socket[kError] = null; socket[kParser] = new Parser(client, socket, llhttpInstance); socket[kClient] = client; socket[kCounter] = 0; socket[kMaxRequests] = client[kMaxRequests]; socket .on('error', onSocketError) .on('readable', onSocketReadable) .on('end', onSocketEnd) .on('close', onSocketClose); if (channels.connected.hasSubscribers) { channels.connected.publish({ connectParams: { host, hostname, protocol, port, servername: client[kServerName] }, connector: client[kConnector], socket }); } client.emit('connect', client[kUrl], [client]); } catch (err) { client[kConnecting] = false; if (channels.connectError.hasSubscribers) { channels.connectError.publish({ connectParams: { host, hostname, protocol, port, servername: client[kServerName] }, connector: client[kConnector], error: err }); } if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { assert(client[kRunning] === 0); while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { const request = client[kQueue][client[kPendingIdx]++]; errorRequest(client, request, err); } } else { onError(client, err); } client.emit('connectionError', client[kUrl], [client], err); } resume(client); } function emitDrain (client) { client[kNeedDrain] = 0; client.emit('drain', client[kUrl], [client]); } function resume (client, sync) { if (client[kResuming] === 2) { return } client[kResuming] = 2; _resume(client, sync); client[kResuming] = 0; if (client[kRunningIdx] > 256) { client[kQueue].splice(0, client[kRunningIdx]); client[kPendingIdx] -= client[kRunningIdx]; client[kRunningIdx] = 0; } } function _resume (client, sync) { while (true) { if (client.destroyed) { assert(client[kPending] === 0); return } if (client.closed && !client[kSize]) { client.destroy(); return } const socket = client[kSocket]; if (socket) { if (client[kSize] === 0) { if (!socket[kNoRef] && socket.unref) { socket.unref(); socket[kNoRef] = true; } } else if (socket[kNoRef] && socket.ref) { socket.ref(); socket[kNoRef] = false; } if (client[kSize] === 0) { if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); } } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { const request = client[kQueue][client[kRunningIdx]]; const headersTimeout = request.headersTimeout != null ? request.headersTimeout : client[kHeadersTimeout]; socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); } } } if (client[kBusy]) { client[kNeedDrain] = 2; } else if (client[kNeedDrain] === 2) { if (sync) { client[kNeedDrain] = 1; process.nextTick(emitDrain, client); } else { emitDrain(client); } continue } if (client[kPending] === 0) { return } if (client[kRunning] >= (client[kPipelining] || 1)) { return } const request = client[kQueue][client[kPendingIdx]]; if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { if (client[kRunning] > 0) { return } client[kServerName] = request.servername; if (socket && socket.servername !== request.servername) { util.destroy(socket, new InformationalError('servername changed')); return } } if (client[kConnecting]) { return } if (!socket) { connect(client); continue } if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { return } if (client[kRunning] > 0 && !request.idempotent) { // Non-idempotent request cannot be retried. // Ensure that no other requests are inflight and // could cause failure. return } if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { // Don't dispatch an upgrade until all preceding requests have completed. // A misbehaving server might upgrade the connection before all pipelined // request has completed. return } if (util.isStream(request.body) && util.bodyLength(request.body) === 0) { request.body .on('data', /* istanbul ignore next */ function () { /* istanbul ignore next */ assert(false); }) .on('error', function (err) { errorRequest(client, request, err); }) .on('end', function () { util.destroy(this); }); request.body = null; } if (client[kRunning] > 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { // Request with stream or iterator body can error while other requests // are inflight and indirectly error those as well. // Ensure this doesn't happen by waiting for inflight // to complete before dispatching. // Request with stream or iterator body cannot be retried. // Ensure that no other requests are inflight and // could cause failure. return } if (!request.aborted && write(client, request)) { client[kPendingIdx]++; } else { client[kQueue].splice(client[kPendingIdx], 1); } } } function write (client, request) { const { body, method, path, host, upgrade, headers, blocking } = request; // https://tools.ietf.org/html/rfc7231#section-4.3.1 // https://tools.ietf.org/html/rfc7231#section-4.3.2 // https://tools.ietf.org/html/rfc7231#section-4.3.5 // Sending a payload body on a request that does not // expect it can cause undefined behavior on some // servers and corrupt connection state. Do not // re-use the connection for further requests. const expectsPayload = ( method === 'PUT' || method === 'POST' || method === 'PATCH' ); if (body && typeof body.read === 'function') { // Try to read EOF in order to get length. body.read(0); } let contentLength = util.bodyLength(body); if (contentLength === null) { contentLength = request.contentLength; } if (contentLength === 0 && !expectsPayload) { // https://tools.ietf.org/html/rfc7230#section-3.3.2 // A user agent SHOULD NOT send a Content-Length header field when // the request message does not contain a payload body and the method // semantics do not anticipate such a body. contentLength = null; } if (request.contentLength !== null && request.contentLength !== contentLength) { if (client[kStrictContentLength]) { errorRequest(client, request, new RequestContentLengthMismatchError()); return false } process.emitWarning(new RequestContentLengthMismatchError()); } const socket = client[kSocket]; try { request.onConnect((err) => { if (request.aborted || request.completed) { return } errorRequest(client, request, err || new RequestAbortedError()); util.destroy(socket, new InformationalError('aborted')); }); } catch (err) { errorRequest(client, request, err); } if (request.aborted) { return false } if (method === 'HEAD') { // https://github.com/mcollina/undici/issues/258 // Close after a HEAD request to interop with misbehaving servers // that may send a body in the response. socket[kReset] = true; } if (upgrade || method === 'CONNECT') { // On CONNECT or upgrade, block pipeline from dispatching further // requests on this connection. socket[kReset] = true; } if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { socket[kReset] = true; } if (blocking) { socket[kBlocking] = true; } let header = `${method} ${path} HTTP/1.1\r\n`; if (typeof host === 'string') { header += `host: ${host}\r\n`; } else { header += client[kHostHeader]; } if (upgrade) { header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; } else if (client[kPipelining]) { header += 'connection: keep-alive\r\n'; } else { header += 'connection: close\r\n'; } if (headers) { header += headers; } if (channels.sendHeaders.hasSubscribers) { channels.sendHeaders.publish({ request, headers: header, socket }); } /* istanbul ignore else: assertion */ if (!body) { if (contentLength === 0) { socket.write(`${header}content-length: 0\r\n\r\n`, 'ascii'); } else { assert(contentLength === null, 'no body must not have content length'); socket.write(`${header}\r\n`, 'ascii'); } request.onRequestSent(); } else if (util.isBuffer(body)) { assert(contentLength === body.byteLength, 'buffer body must have content length'); socket.cork(); socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'ascii'); socket.write(body); socket.uncork(); request.onBodySent(body); request.onRequestSent(); if (!expectsPayload) { socket[kReset] = true; } } else if (util.isBlobLike(body)) { if (typeof body.stream === 'function') { writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); } else { writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); } } else if (util.isStream(body)) { writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); } else if (util.isIterable(body)) { writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); } else { assert(false); } return true } function writeStream ({ body, client, request, socket, contentLength, header, expectsPayload }) { assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined'); let finished = false; const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); const onData = function (chunk) { try { assert(!finished); if (!writer.write(chunk) && this.pause) { this.pause(); } } catch (err) { util.destroy(this, err); } }; const onDrain = function () { assert(!finished); if (body.resume) { body.resume(); } }; const onAbort = function () { onFinished(new RequestAbortedError()); }; const onFinished = function (err) { if (finished) { return } finished = true; assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)); socket .off('drain', onDrain) .off('error', onFinished); body .removeListener('data', onData) .removeListener('end', onFinished) .removeListener('error', onFinished) .removeListener('close', onAbort); if (!err) { try { writer.end(); } catch (er) { err = er; } } writer.destroy(err); if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { util.destroy(body, err); } else { util.destroy(body); } }; body .on('data', onData) .on('end', onFinished) .on('error', onFinished) .on('close', onAbort); if (body.resume) { body.resume(); } socket .on('drain', onDrain) .on('error', onFinished); } async function writeBlob ({ body, client, request, socket, contentLength, header, expectsPayload }) { assert(contentLength === body.size, 'blob body must have content length'); try { if (contentLength != null && contentLength !== body.size) { throw new RequestContentLengthMismatchError() } const buffer = Buffer.from(await body.arrayBuffer()); socket.cork(); socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'ascii'); socket.write(buffer); socket.uncork(); request.onBodySent(buffer); request.onRequestSent(); if (!expectsPayload) { socket[kReset] = true; } resume(client); } catch (err) { util.destroy(socket, err); } } async function writeIterable ({ body, client, request, socket, contentLength, header, expectsPayload }) { assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined'); let callback = null; function onDrain () { if (callback) { const cb = callback; callback = null; cb(); } } const waitForDrain = () => new Promise((resolve, reject) => { assert(callback === null); if (socket[kError]) { reject(socket[kError]); } else { callback = resolve; } }); socket .on('close', onDrain) .on('drain', onDrain); const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); try { // It's up to the user to somehow abort the async iterable. for await (const chunk of body) { if (socket[kError]) { throw socket[kError] } if (!writer.write(chunk)) { await waitForDrain(); } } writer.end(); } catch (err) { writer.destroy(err); } finally { socket .off('close', onDrain) .off('drain', onDrain); } } class AsyncWriter { constructor ({ socket, request, contentLength, client, expectsPayload, header }) { this.socket = socket; this.request = request; this.contentLength = contentLength; this.client = client; this.bytesWritten = 0; this.expectsPayload = expectsPayload; this.header = header; socket[kWriting] = true; } write (chunk) { const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; if (socket[kError]) { throw socket[kError] } if (socket.destroyed) { return false } const len = Buffer.byteLength(chunk); if (!len) { return true } // We should defer writing chunks. if (contentLength !== null && bytesWritten + len > contentLength) { if (client[kStrictContentLength]) { throw new RequestContentLengthMismatchError() } process.emitWarning(new RequestContentLengthMismatchError()); } if (bytesWritten === 0) { if (!expectsPayload) { socket[kReset] = true; } if (contentLength === null) { socket.write(`${header}transfer-encoding: chunked\r\n`, 'ascii'); } else { socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'ascii'); } } if (contentLength === null) { socket.write(`\r\n${len.toString(16)}\r\n`, 'ascii'); } this.bytesWritten += len; const ret = socket.write(chunk); request.onBodySent(chunk); if (!ret) { if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { // istanbul ignore else: only for jest if (socket[kParser].timeout.refresh) { socket[kParser].timeout.refresh(); } } } return ret } end () { const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; request.onRequestSent(); socket[kWriting] = false; if (socket[kError]) { throw socket[kError] } if (socket.destroyed) { return } if (bytesWritten === 0) { if (expectsPayload) { // https://tools.ietf.org/html/rfc7230#section-3.3.2 // A user agent SHOULD send a Content-Length in a request message when // no Transfer-Encoding is sent and the request method defines a meaning // for an enclosed payload body. socket.write(`${header}content-length: 0\r\n\r\n`, 'ascii'); } else { socket.write(`${header}\r\n`, 'ascii'); } } else if (contentLength === null) { socket.write('\r\n0\r\n\r\n', 'ascii'); } if (contentLength !== null && bytesWritten !== contentLength) { if (client[kStrictContentLength]) { throw new RequestContentLengthMismatchError() } else { process.emitWarning(new RequestContentLengthMismatchError()); } } if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { // istanbul ignore else: only for jest if (socket[kParser].timeout.refresh) { socket[kParser].timeout.refresh(); } } resume(client); } destroy (err) { const { socket, client } = this; socket[kWriting] = false; if (err) { assert(client[kRunning] <= 1, 'pipeline should only contain this request'); util.destroy(socket, err); } } } function errorRequest (client, request, err) { try { request.onError(err); assert(request.aborted); } catch (err) { client.emit('error', err); } } client = Client; return client; } /* eslint-disable */ var fixedQueue; var hasRequiredFixedQueue; function requireFixedQueue () { if (hasRequiredFixedQueue) return fixedQueue; hasRequiredFixedQueue = 1; // Extracted from node/lib/internal/fixed_queue.js // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. const kSize = 2048; const kMask = kSize - 1; // The FixedQueue is implemented as a singly-linked list of fixed-size // circular buffers. It looks something like this: // // head tail // | | // v v // +-----------+ <-----\ +-----------+ <------\ +-----------+ // | [null] | \----- | next | \------- | next | // +-----------+ +-----------+ +-----------+ // | item | <-- bottom | item | <-- bottom | [empty] | // | item | | item | | [empty] | // | item | | item | | [empty] | // | item | | item | | [empty] | // | item | | item | bottom --> | item | // | item | | item | | item | // | ... | | ... | | ... | // | item | | item | | item | // | item | | item | | item | // | [empty] | <-- top | item | | item | // | [empty] | | item | | item | // | [empty] | | [empty] | <-- top top --> | [empty] | // +-----------+ +-----------+ +-----------+ // // Or, if there is only one circular buffer, it looks something // like either of these: // // head tail head tail // | | | | // v v v v // +-----------+ +-----------+ // | [null] | | [null] | // +-----------+ +-----------+ // | [empty] | | item | // | [empty] | | item | // | item | <-- bottom top --> | [empty] | // | item | | [empty] | // | [empty] | <-- top bottom --> | item | // | [empty] | | item | // +-----------+ +-----------+ // // Adding a value means moving `top` forward by one, removing means // moving `bottom` forward by one. After reaching the end, the queue // wraps around. // // When `top === bottom` the current queue is empty and when // `top + 1 === bottom` it's full. This wastes a single space of storage // but allows much quicker checks. class FixedCircularBuffer { constructor() { this.bottom = 0; this.top = 0; this.list = new Array(kSize); this.next = null; } isEmpty() { return this.top === this.bottom; } isFull() { return ((this.top + 1) & kMask) === this.bottom; } push(data) { this.list[this.top] = data; this.top = (this.top + 1) & kMask; } shift() { const nextItem = this.list[this.bottom]; if (nextItem === undefined) return null; this.list[this.bottom] = undefined; this.bottom = (this.bottom + 1) & kMask; return nextItem; } } fixedQueue = class FixedQueue { constructor() { this.head = this.tail = new FixedCircularBuffer(); } isEmpty() { return this.head.isEmpty(); } push(data) { if (this.head.isFull()) { // Head is full: Creates a new queue, sets the old queue's `.next` to it, // and sets it as the new main queue. this.head = this.head.next = new FixedCircularBuffer(); } this.head.push(data); } shift() { const tail = this.tail; const next = tail.shift(); if (tail.isEmpty() && tail.next !== null) { // If there is another queue, it forms the new tail. this.tail = tail.next; } return next; } }; return fixedQueue; } var poolStats; var hasRequiredPoolStats; function requirePoolStats () { if (hasRequiredPoolStats) return poolStats; hasRequiredPoolStats = 1; const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = requireSymbols$1(); const kPool = Symbol('pool'); class PoolStats { constructor (pool) { this[kPool] = pool; } get connected () { return this[kPool][kConnected] } get free () { return this[kPool][kFree] } get pending () { return this[kPool][kPending] } get queued () { return this[kPool][kQueued] } get running () { return this[kPool][kRunning] } get size () { return this[kPool][kSize] } } poolStats = PoolStats; return poolStats; } var poolBase; var hasRequiredPoolBase; function requirePoolBase () { if (hasRequiredPoolBase) return poolBase; hasRequiredPoolBase = 1; const DispatcherBase = requireDispatcherBase(); const FixedQueue = requireFixedQueue(); const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = requireSymbols$1(); const PoolStats = requirePoolStats(); const kClients = Symbol('clients'); const kNeedDrain = Symbol('needDrain'); const kQueue = Symbol('queue'); const kClosedResolve = Symbol('closed resolve'); const kOnDrain = Symbol('onDrain'); const kOnConnect = Symbol('onConnect'); const kOnDisconnect = Symbol('onDisconnect'); const kOnConnectionError = Symbol('onConnectionError'); const kGetDispatcher = Symbol('get dispatcher'); const kAddClient = Symbol('add client'); const kRemoveClient = Symbol('remove client'); const kStats = Symbol('stats'); class PoolBase extends DispatcherBase { constructor () { super(); this[kQueue] = new FixedQueue(); this[kClients] = []; this[kQueued] = 0; const pool = this; this[kOnDrain] = function onDrain (origin, targets) { const queue = pool[kQueue]; let needDrain = false; while (!needDrain) { const item = queue.shift(); if (!item) { break } pool[kQueued]--; needDrain = !this.dispatch(item.opts, item.handler); } this[kNeedDrain] = needDrain; if (!this[kNeedDrain] && pool[kNeedDrain]) { pool[kNeedDrain] = false; pool.emit('drain', origin, [pool, ...targets]); } if (pool[kClosedResolve] && queue.isEmpty()) { Promise .all(pool[kClients].map(c => c.close())) .then(pool[kClosedResolve]); } }; this[kOnConnect] = (origin, targets) => { pool.emit('connect', origin, [pool, ...targets]); }; this[kOnDisconnect] = (origin, targets, err) => { pool.emit('disconnect', origin, [pool, ...targets], err); }; this[kOnConnectionError] = (origin, targets, err) => { pool.emit('connectionError', origin, [pool, ...targets], err); }; this[kStats] = new PoolStats(this); } get [kBusy] () { return this[kNeedDrain] } get [kConnected] () { return this[kClients].filter(client => client[kConnected]).length } get [kFree] () { return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length } get [kPending] () { let ret = this[kQueued]; for (const { [kPending]: pending } of this[kClients]) { ret += pending; } return ret } get [kRunning] () { let ret = 0; for (const { [kRunning]: running } of this[kClients]) { ret += running; } return ret } get [kSize] () { let ret = this[kQueued]; for (const { [kSize]: size } of this[kClients]) { ret += size; } return ret } get stats () { return this[kStats] } async [kClose] () { if (this[kQueue].isEmpty()) { return Promise.all(this[kClients].map(c => c.close())) } else { return new Promise((resolve) => { this[kClosedResolve] = resolve; }) } } async [kDestroy] (err) { while (true) { const item = this[kQueue].shift(); if (!item) { break } item.handler.onError(err); } return Promise.all(this[kClients].map(c => c.destroy(err))) } [kDispatch] (opts, handler) { const dispatcher = this[kGetDispatcher](); if (!dispatcher) { this[kNeedDrain] = true; this[kQueue].push({ opts, handler }); this[kQueued]++; } else if (!dispatcher.dispatch(opts, handler)) { dispatcher[kNeedDrain] = true; this[kNeedDrain] = !this[kGetDispatcher](); } return !this[kNeedDrain] } [kAddClient] (client) { client .on('drain', this[kOnDrain]) .on('connect', this[kOnConnect]) .on('disconnect', this[kOnDisconnect]) .on('connectionError', this[kOnConnectionError]); this[kClients].push(client); if (this[kNeedDrain]) { process.nextTick(() => { if (this[kNeedDrain]) { this[kOnDrain](client[kUrl], [this, client]); } }); } return this } [kRemoveClient] (client) { client.close(() => { const idx = this[kClients].indexOf(client); if (idx !== -1) { this[kClients].splice(idx, 1); } }); this[kNeedDrain] = this[kClients].some(dispatcher => ( !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true )); } } poolBase = { PoolBase, kClients, kNeedDrain, kAddClient, kRemoveClient, kGetDispatcher }; return poolBase; } var pool; var hasRequiredPool; function requirePool () { if (hasRequiredPool) return pool; hasRequiredPool = 1; const { PoolBase, kClients, kNeedDrain, kAddClient, kGetDispatcher } = requirePoolBase(); const Client = requireClient(); const { InvalidArgumentError } = requireErrors(); const util = requireUtil$1(); const { kUrl } = requireSymbols$1(); const buildConnector = requireConnect(); const kOptions = Symbol('options'); const kConnections = Symbol('connections'); const kFactory = Symbol('factory'); function defaultFactory (origin, opts) { return new Client(origin, opts) } class Pool extends PoolBase { constructor (origin, { connections, factory = defaultFactory, connect, connectTimeout, tls, maxCachedSessions, socketPath, ...options } = {}) { super(); if (connections != null && (!Number.isFinite(connections) || connections < 0)) { throw new InvalidArgumentError('invalid connections') } if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { throw new InvalidArgumentError('connect must be a function or an object') } if (typeof connect !== 'function') { connect = buildConnector({ ...tls, maxCachedSessions, socketPath, timeout: connectTimeout == null ? 10e3 : connectTimeout, ...connect }); } this[kConnections] = connections || null; this[kUrl] = util.parseOrigin(origin); this[kOptions] = { ...util.deepClone(options), connect }; this[kFactory] = factory; } [kGetDispatcher] () { let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]); if (dispatcher) { return dispatcher } if (!this[kConnections] || this[kClients].length < this[kConnections]) { dispatcher = this[kFactory](this[kUrl], this[kOptions]); this[kAddClient](dispatcher); } return dispatcher } } pool = Pool; return pool; } var balancedPool; var hasRequiredBalancedPool; function requireBalancedPool () { if (hasRequiredBalancedPool) return balancedPool; hasRequiredBalancedPool = 1; const { BalancedPoolMissingUpstreamError, InvalidArgumentError } = requireErrors(); const { PoolBase, kClients, kNeedDrain, kAddClient, kRemoveClient, kGetDispatcher } = requirePoolBase(); const Pool = requirePool(); const { kUrl } = requireSymbols$1(); const { parseOrigin } = requireUtil$1(); const kFactory = Symbol('factory'); const kOptions = Symbol('options'); const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor'); const kCurrentWeight = Symbol('kCurrentWeight'); const kIndex = Symbol('kIndex'); const kWeight = Symbol('kWeight'); const kMaxWeightPerServer = Symbol('kMaxWeightPerServer'); const kErrorPenalty = Symbol('kErrorPenalty'); function getGreatestCommonDivisor (a, b) { if (b === 0) return a return getGreatestCommonDivisor(b, a % b) } function defaultFactory (origin, opts) { return new Pool(origin, opts) } class BalancedPool extends PoolBase { constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { super(); this[kOptions] = opts; this[kIndex] = -1; this[kCurrentWeight] = 0; this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; this[kErrorPenalty] = this[kOptions].errorPenalty || 15; if (!Array.isArray(upstreams)) { upstreams = [upstreams]; } if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } this[kFactory] = factory; for (const upstream of upstreams) { this.addUpstream(upstream); } this._updateBalancedPoolStats(); } addUpstream (upstream) { const upstreamOrigin = parseOrigin(upstream).origin; if (this[kClients].find((pool) => ( pool[kUrl].origin === upstreamOrigin && pool.closed !== true && pool.destroyed !== true ))) { return this } const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); this[kAddClient](pool); pool.on('connect', () => { pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); }); pool.on('connectionError', () => { pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); this._updateBalancedPoolStats(); }); pool.on('disconnect', (...args) => { const err = args[2]; if (err && err.code === 'UND_ERR_SOCKET') { // decrease the weight of the pool. pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); this._updateBalancedPoolStats(); } }); for (const client of this[kClients]) { client[kWeight] = this[kMaxWeightPerServer]; } this._updateBalancedPoolStats(); return this } _updateBalancedPoolStats () { this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0); } removeUpstream (upstream) { const upstreamOrigin = parseOrigin(upstream).origin; const pool = this[kClients].find((pool) => ( pool[kUrl].origin === upstreamOrigin && pool.closed !== true && pool.destroyed !== true )); if (pool) { this[kRemoveClient](pool); } return this } get upstreams () { return this[kClients] .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) .map((p) => p[kUrl].origin) } [kGetDispatcher] () { // We validate that pools is greater than 0, // otherwise we would have to wait until an upstream // is added, which might never happen. if (this[kClients].length === 0) { throw new BalancedPoolMissingUpstreamError() } const dispatcher = this[kClients].find(dispatcher => ( !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true )); if (!dispatcher) { return } const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true); if (allClientsBusy) { return } let counter = 0; let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]); while (counter++ < this[kClients].length) { this[kIndex] = (this[kIndex] + 1) % this[kClients].length; const pool = this[kClients][this[kIndex]]; // find pool index with the largest weight if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { maxWeightIndex = this[kIndex]; } // decrease the current weight every `this[kClients].length`. if (this[kIndex] === 0) { // Set the current weight to the next lower weight. this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; if (this[kCurrentWeight] <= 0) { this[kCurrentWeight] = this[kMaxWeightPerServer]; } } if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { return pool } } this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; this[kIndex] = maxWeightIndex; return this[kClients][maxWeightIndex] } } balancedPool = BalancedPool; return balancedPool; } var dispatcherWeakref; var hasRequiredDispatcherWeakref; function requireDispatcherWeakref () { if (hasRequiredDispatcherWeakref) return dispatcherWeakref; hasRequiredDispatcherWeakref = 1; /* istanbul ignore file: only for Node 12 */ const { kConnected, kSize } = requireSymbols$1(); class CompatWeakRef { constructor (value) { this.value = value; } deref () { return this.value[kConnected] === 0 && this.value[kSize] === 0 ? undefined : this.value } } class CompatFinalizer { constructor (finalizer) { this.finalizer = finalizer; } register (dispatcher, key) { dispatcher.on('disconnect', () => { if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { this.finalizer(key); } }); } } dispatcherWeakref = function () { return { WeakRef: commonjsGlobal.WeakRef || CompatWeakRef, FinalizationRegistry: commonjsGlobal.FinalizationRegistry || CompatFinalizer } }; return dispatcherWeakref; } var agent; var hasRequiredAgent; function requireAgent () { if (hasRequiredAgent) return agent; hasRequiredAgent = 1; const { InvalidArgumentError } = requireErrors(); const { kClients, kRunning, kClose, kDestroy, kDispatch } = requireSymbols$1(); const DispatcherBase = requireDispatcherBase(); const Pool = requirePool(); const Client = requireClient(); const util = requireUtil$1(); const RedirectHandler = requireRedirect(); const { WeakRef, FinalizationRegistry } = requireDispatcherWeakref()(); const kOnConnect = Symbol('onConnect'); const kOnDisconnect = Symbol('onDisconnect'); const kOnConnectionError = Symbol('onConnectionError'); const kMaxRedirections = Symbol('maxRedirections'); const kOnDrain = Symbol('onDrain'); const kFactory = Symbol('factory'); const kFinalizer = Symbol('finalizer'); const kOptions = Symbol('options'); function defaultFactory (origin, opts) { return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts) } class Agent extends DispatcherBase { constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { super(); if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { throw new InvalidArgumentError('connect must be a function or an object') } if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { throw new InvalidArgumentError('maxRedirections must be a positive number') } if (connect && typeof connect !== 'function') { connect = { ...connect }; } this[kOptions] = { ...util.deepClone(options), connect }; this[kMaxRedirections] = maxRedirections; this[kFactory] = factory; this[kClients] = new Map(); this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => { const ref = this[kClients].get(key); if (ref !== undefined && ref.deref() === undefined) { this[kClients].delete(key); } }); const agent = this; this[kOnDrain] = (origin, targets) => { agent.emit('drain', origin, [agent, ...targets]); }; this[kOnConnect] = (origin, targets) => { agent.emit('connect', origin, [agent, ...targets]); }; this[kOnDisconnect] = (origin, targets, err) => { agent.emit('disconnect', origin, [agent, ...targets], err); }; this[kOnConnectionError] = (origin, targets, err) => { agent.emit('connectionError', origin, [agent, ...targets], err); }; } get [kRunning] () { let ret = 0; for (const ref of this[kClients].values()) { const client = ref.deref(); /* istanbul ignore next: gc is undeterministic */ if (client) { ret += client[kRunning]; } } return ret } [kDispatch] (opts, handler) { let key; if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { key = String(opts.origin); } else { throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') } const ref = this[kClients].get(key); let dispatcher = ref ? ref.deref() : null; if (!dispatcher) { dispatcher = this[kFactory](opts.origin, this[kOptions]) .on('drain', this[kOnDrain]) .on('connect', this[kOnConnect]) .on('disconnect', this[kOnDisconnect]) .on('connectionError', this[kOnConnectionError]); this[kClients].set(key, new WeakRef(dispatcher)); this[kFinalizer].register(dispatcher, key); } const { maxRedirections = this[kMaxRedirections] } = opts; if (maxRedirections != null && maxRedirections !== 0) { opts = { ...opts, maxRedirections: 0 }; // Stop sub dispatcher from also redirecting. handler = new RedirectHandler(this, maxRedirections, opts, handler); } return dispatcher.dispatch(opts, handler) } async [kClose] () { const closePromises = []; for (const ref of this[kClients].values()) { const client = ref.deref(); /* istanbul ignore else: gc is undeterministic */ if (client) { closePromises.push(client.close()); } } await Promise.all(closePromises); } async [kDestroy] (err) { const destroyPromises = []; for (const ref of this[kClients].values()) { const client = ref.deref(); /* istanbul ignore else: gc is undeterministic */ if (client) { destroyPromises.push(client.destroy(err)); } } await Promise.all(destroyPromises); } } agent = Agent; return agent; } var api$1 = {}; var readable; var hasRequiredReadable; function requireReadable () { if (hasRequiredReadable) return readable; hasRequiredReadable = 1; const assert = require$$0$1; const { Readable } = Stream; const { RequestAbortedError, NotSupportedError } = requireErrors(); const util = requireUtil$1(); const { ReadableStreamFrom, toUSVString } = requireUtil$1(); let Blob; const kConsume = Symbol('kConsume'); const kReading = Symbol('kReading'); const kBody = Symbol('kBody'); const kAbort = Symbol('abort'); const kContentType = Symbol('kContentType'); readable = class BodyReadable extends Readable { constructor (resume, abort, contentType = '') { super({ autoDestroy: true, read: resume, highWaterMark: 64 * 1024 // Same as nodejs fs streams. }); this._readableState.dataEmitted = false; this[kAbort] = abort; this[kConsume] = null; this[kBody] = null; this[kContentType] = contentType; // Is stream being consumed through Readable API? // This is an optimization so that we avoid checking // for 'data' and 'readable' listeners in the hot path // inside push(). this[kReading] = false; } destroy (err) { if (this.destroyed) { // Node < 16 return this } if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError(); } if (err) { this[kAbort](); } return super.destroy(err) } emit (ev, ...args) { if (ev === 'data') { // Node < 16.7 this._readableState.dataEmitted = true; } else if (ev === 'error') { // Node < 16 this._readableState.errorEmitted = true; } return super.emit(ev, ...args) } on (ev, ...args) { if (ev === 'data' || ev === 'readable') { this[kReading] = true; } return super.on(ev, ...args) } addListener (ev, ...args) { return this.on(ev, ...args) } off (ev, ...args) { const ret = super.off(ev, ...args); if (ev === 'data' || ev === 'readable') { this[kReading] = ( this.listenerCount('data') > 0 || this.listenerCount('readable') > 0 ); } return ret } removeListener (ev, ...args) { return this.off(ev, ...args) } push (chunk) { if (this[kConsume] && chunk !== null && this.readableLength === 0) { consumePush(this[kConsume], chunk); return this[kReading] ? super.push(chunk) : true } return super.push(chunk) } // https://fetch.spec.whatwg.org/#dom-body-text async text () { return consume(this, 'text') } // https://fetch.spec.whatwg.org/#dom-body-json async json () { return consume(this, 'json') } // https://fetch.spec.whatwg.org/#dom-body-blob async blob () { return consume(this, 'blob') } // https://fetch.spec.whatwg.org/#dom-body-arraybuffer async arrayBuffer () { return consume(this, 'arrayBuffer') } // https://fetch.spec.whatwg.org/#dom-body-formdata async formData () { // TODO: Implement. throw new NotSupportedError() } // https://fetch.spec.whatwg.org/#dom-body-bodyused get bodyUsed () { return util.isDisturbed(this) } // https://fetch.spec.whatwg.org/#dom-body-body get body () { if (!this[kBody]) { this[kBody] = ReadableStreamFrom(this); if (this[kConsume]) { // TODO: Is this the best way to force a lock? this[kBody].getReader(); // Ensure stream is locked. assert(this[kBody].locked); } } return this[kBody] } async dump (opts) { let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; try { for await (const chunk of this) { limit -= Buffer.byteLength(chunk); if (limit < 0) { return } } } catch { // Do nothing... } } }; // https://streams.spec.whatwg.org/#readablestream-locked function isLocked (self) { // Consume is an implicit lock. return (self[kBody] && self[kBody].locked === true) || self[kConsume] } // https://fetch.spec.whatwg.org/#body-unusable function isUnusable (self) { return util.isDisturbed(self) || isLocked(self) } async function consume (stream, type) { if (isUnusable(stream)) { throw new TypeError('unusable') } assert(!stream[kConsume]); return new Promise((resolve, reject) => { stream[kConsume] = { type, stream, resolve, reject, length: 0, body: [] }; stream .on('error', function (err) { consumeFinish(this[kConsume], err); }) .on('close', function () { if (this[kConsume].body !== null) { consumeFinish(this[kConsume], new RequestAbortedError()); } }); process.nextTick(consumeStart, stream[kConsume]); }) } function consumeStart (consume) { if (consume.body === null) { return } const { _readableState: state } = consume.stream; for (const chunk of state.buffer) { consumePush(consume, chunk); } if (state.endEmitted) { consumeEnd(this[kConsume]); } else { consume.stream.on('end', function () { consumeEnd(this[kConsume]); }); } consume.stream.resume(); while (consume.stream.read() != null) { // Loop } } function consumeEnd (consume) { const { type, body, resolve, stream, length } = consume; try { if (type === 'text') { resolve(toUSVString(Buffer.concat(body))); } else if (type === 'json') { resolve(JSON.parse(Buffer.concat(body))); } else if (type === 'arrayBuffer') { const dst = new Uint8Array(length); let pos = 0; for (const buf of body) { dst.set(buf, pos); pos += buf.byteLength; } resolve(dst); } else if (type === 'blob') { if (!Blob) { Blob = require('buffer').Blob; } resolve(new Blob(body, { type: stream[kContentType] })); } consumeFinish(consume); } catch (err) { stream.destroy(err); } } function consumePush (consume, chunk) { consume.length += chunk.length; consume.body.push(chunk); } function consumeFinish (consume, err) { if (consume.body === null) { return } if (err) { consume.reject(err); } else { consume.resolve(); } consume.type = null; consume.stream = null; consume.resolve = null; consume.reject = null; consume.length = 0; consume.body = null; } return readable; } var abortSignal; var hasRequiredAbortSignal; function requireAbortSignal () { if (hasRequiredAbortSignal) return abortSignal; hasRequiredAbortSignal = 1; const { RequestAbortedError } = requireErrors(); const kListener = Symbol('kListener'); const kSignal = Symbol('kSignal'); function abort (self) { if (self.abort) { self.abort(); } else { self.onError(new RequestAbortedError()); } } function addSignal (self, signal) { self[kSignal] = null; self[kListener] = null; if (!signal) { return } if (signal.aborted) { abort(self); return } self[kSignal] = signal; self[kListener] = () => { abort(self); }; if ('addEventListener' in self[kSignal]) { self[kSignal].addEventListener('abort', self[kListener]); } else { self[kSignal].addListener('abort', self[kListener]); } } function removeSignal (self) { if (!self[kSignal]) { return } if ('removeEventListener' in self[kSignal]) { self[kSignal].removeEventListener('abort', self[kListener]); } else { self[kSignal].removeListener('abort', self[kListener]); } self[kSignal] = null; self[kListener] = null; } abortSignal = { addSignal, removeSignal }; return abortSignal; } var apiRequest; var hasRequiredApiRequest; function requireApiRequest () { if (hasRequiredApiRequest) return apiRequest; hasRequiredApiRequest = 1; const Readable = requireReadable(); const { InvalidArgumentError, RequestAbortedError, ResponseStatusCodeError } = requireErrors(); const util = requireUtil$1(); const { AsyncResource } = require$$3; const { addSignal, removeSignal } = requireAbortSignal(); class RequestHandler extends AsyncResource { constructor (opts, callback) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; try { if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } if (method === 'CONNECT') { throw new InvalidArgumentError('invalid method') } if (onInfo && typeof onInfo !== 'function') { throw new InvalidArgumentError('invalid onInfo callback') } super('UNDICI_REQUEST'); } catch (err) { if (util.isStream(body)) { util.destroy(body.on('error', util.nop), err); } throw err } this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.callback = callback; this.res = null; this.abort = null; this.body = body; this.trailers = {}; this.context = null; this.onInfo = onInfo || null; this.throwOnError = throwOnError; if (util.isStream(body)) { body.on('error', (err) => { this.onError(err); }); } addSignal(this, signal); } onConnect (abort, context) { if (!this.callback) { throw new RequestAbortedError() } this.abort = abort; this.context = context; } onHeaders (statusCode, rawHeaders, resume, statusMessage) { const { callback, opaque, abort, context } = this; if (statusCode < 200) { if (this.onInfo) { const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); this.onInfo({ statusCode, headers }); } return } const parsedHeaders = util.parseHeaders(rawHeaders); const contentType = parsedHeaders['content-type']; const body = new Readable(resume, abort, contentType); this.callback = null; this.res = body; const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); if (callback !== null) { if (this.throwOnError && statusCode >= 400) { this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body, contentType, statusCode, statusMessage, headers } ); return } this.runInAsyncScope(callback, null, null, { statusCode, headers, trailers: this.trailers, opaque, body, context }); } } onData (chunk) { const { res } = this; return res.push(chunk) } onComplete (trailers) { const { res } = this; removeSignal(this); util.parseHeaders(trailers, this.trailers); res.push(null); } onError (err) { const { res, callback, body, opaque } = this; removeSignal(this); if (callback) { // TODO: Does this need queueMicrotask? this.callback = null; queueMicrotask(() => { this.runInAsyncScope(callback, null, err, { opaque }); }); } if (res) { this.res = null; // Ensure all queued handlers are invoked before destroying res. queueMicrotask(() => { util.destroy(res, err); }); } if (body) { this.body = null; util.destroy(body, err); } } } async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { if (statusCode === 204 || !contentType) { body.dump(); process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); return } try { if (contentType.startsWith('application/json')) { const payload = await body.json(); process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); return } if (contentType.startsWith('text/')) { const payload = await body.text(); process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)); return } } catch (err) { // Process in a fallback if error } body.dump(); process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)); } function request (opts, callback) { if (callback === undefined) { return new Promise((resolve, reject) => { request.call(this, opts, (err, data) => { return err ? reject(err) : resolve(data) }); }) } try { this.dispatch(opts, new RequestHandler(opts, callback)); } catch (err) { if (typeof callback !== 'function') { throw err } const opaque = opts && opts.opaque; queueMicrotask(() => callback(err, { opaque })); } } apiRequest = request; return apiRequest; } var apiStream; var hasRequiredApiStream; function requireApiStream () { if (hasRequiredApiStream) return apiStream; hasRequiredApiStream = 1; const { finished } = Stream; const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError } = requireErrors(); const util = requireUtil$1(); const { AsyncResource } = require$$3; const { addSignal, removeSignal } = requireAbortSignal(); class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } const { signal, method, opaque, body, onInfo, responseHeaders } = opts; try { if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } if (typeof factory !== 'function') { throw new InvalidArgumentError('invalid factory') } if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } if (method === 'CONNECT') { throw new InvalidArgumentError('invalid method') } if (onInfo && typeof onInfo !== 'function') { throw new InvalidArgumentError('invalid onInfo callback') } super('UNDICI_STREAM'); } catch (err) { if (util.isStream(body)) { util.destroy(body.on('error', util.nop), err); } throw err } this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.factory = factory; this.callback = callback; this.res = null; this.abort = null; this.context = null; this.trailers = null; this.body = body; this.onInfo = onInfo || null; if (util.isStream(body)) { body.on('error', (err) => { this.onError(err); }); } addSignal(this, signal); } onConnect (abort, context) { if (!this.callback) { throw new RequestAbortedError() } this.abort = abort; this.context = context; } onHeaders (statusCode, rawHeaders, resume) { const { factory, opaque, context } = this; if (statusCode < 200) { if (this.onInfo) { const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); this.onInfo({ statusCode, headers }); } return } this.factory = null; const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); const res = this.runInAsyncScope(factory, null, { statusCode, headers, opaque, context }); if ( !res || typeof res.write !== 'function' || typeof res.end !== 'function' || typeof res.on !== 'function' ) { throw new InvalidReturnValueError('expected Writable') } res.on('drain', resume); // TODO: Avoid finished. It registers an unecessary amount of listeners. finished(res, { readable: false }, (err) => { const { callback, res, opaque, trailers, abort } = this; this.res = null; if (err || !res.readable) { util.destroy(res, err); } this.callback = null; this.runInAsyncScope(callback, null, err || null, { opaque, trailers }); if (err) { abort(); } }); this.res = res; const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; return needDrain !== true } onData (chunk) { const { res } = this; return res.write(chunk) } onComplete (trailers) { const { res } = this; removeSignal(this); this.trailers = util.parseHeaders(trailers); res.end(); } onError (err) { const { res, callback, opaque, body } = this; removeSignal(this); this.factory = null; if (res) { this.res = null; util.destroy(res, err); } else if (callback) { this.callback = null; queueMicrotask(() => { this.runInAsyncScope(callback, null, err, { opaque }); }); } if (body) { this.body = null; util.destroy(body, err); } } } function stream (opts, factory, callback) { if (callback === undefined) { return new Promise((resolve, reject) => { stream.call(this, opts, factory, (err, data) => { return err ? reject(err) : resolve(data) }); }) } try { this.dispatch(opts, new StreamHandler(opts, factory, callback)); } catch (err) { if (typeof callback !== 'function') { throw err } const opaque = opts && opts.opaque; queueMicrotask(() => callback(err, { opaque })); } } apiStream = stream; return apiStream; } var apiPipeline; var hasRequiredApiPipeline; function requireApiPipeline () { if (hasRequiredApiPipeline) return apiPipeline; hasRequiredApiPipeline = 1; const { Readable, Duplex, PassThrough } = Stream; const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError } = requireErrors(); const util = requireUtil$1(); const { AsyncResource } = require$$3; const { addSignal, removeSignal } = requireAbortSignal(); const assert = require$$0$1; const kResume = Symbol('resume'); class PipelineRequest extends Readable { constructor () { super({ autoDestroy: true }); this[kResume] = null; } _read () { const { [kResume]: resume } = this; if (resume) { this[kResume] = null; resume(); } } _destroy (err, callback) { this._read(); callback(err); } } class PipelineResponse extends Readable { constructor (resume) { super({ autoDestroy: true }); this[kResume] = resume; } _read () { this[kResume](); } _destroy (err, callback) { if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError(); } callback(err); } } class PipelineHandler extends AsyncResource { constructor (opts, handler) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } if (typeof handler !== 'function') { throw new InvalidArgumentError('invalid handler') } const { signal, method, opaque, onInfo, responseHeaders } = opts; if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } if (method === 'CONNECT') { throw new InvalidArgumentError('invalid method') } if (onInfo && typeof onInfo !== 'function') { throw new InvalidArgumentError('invalid onInfo callback') } super('UNDICI_PIPELINE'); this.opaque = opaque || null; this.responseHeaders = responseHeaders || null; this.handler = handler; this.abort = null; this.context = null; this.onInfo = onInfo || null; this.req = new PipelineRequest().on('error', util.nop); this.ret = new Duplex({ readableObjectMode: opts.objectMode, autoDestroy: true, read: () => { const { body } = this; if (body && body.resume) { body.resume(); } }, write: (chunk, encoding, callback) => { const { req } = this; if (req.push(chunk, encoding) || req._readableState.destroyed) { callback(); } else { req[kResume] = callback; } }, destroy: (err, callback) => { const { body, req, res, ret, abort } = this; if (!err && !ret._readableState.endEmitted) { err = new RequestAbortedError(); } if (abort && err) { abort(); } util.destroy(body, err); util.destroy(req, err); util.destroy(res, err); removeSignal(this); callback(err); } }).on('prefinish', () => { const { req } = this; // Node < 15 does not call _final in same tick. req.push(null); }); this.res = null; addSignal(this, signal); } onConnect (abort, context) { const { ret, res } = this; assert(!res, 'pipeline cannot be retried'); if (ret.destroyed) { throw new RequestAbortedError() } this.abort = abort; this.context = context; } onHeaders (statusCode, rawHeaders, resume) { const { opaque, handler, context } = this; if (statusCode < 200) { if (this.onInfo) { const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); this.onInfo({ statusCode, headers }); } return } this.res = new PipelineResponse(resume); let body; try { this.handler = null; const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); body = this.runInAsyncScope(handler, null, { statusCode, headers, opaque, body: this.res, context }); } catch (err) { this.res.on('error', util.nop); throw err } if (!body || typeof body.on !== 'function') { throw new InvalidReturnValueError('expected Readable') } body .on('data', (chunk) => { const { ret, body } = this; if (!ret.push(chunk) && body.pause) { body.pause(); } }) .on('error', (err) => { const { ret } = this; util.destroy(ret, err); }) .on('end', () => { const { ret } = this; ret.push(null); }) .on('close', () => { const { ret } = this; if (!ret._readableState.ended) { util.destroy(ret, new RequestAbortedError()); } }); this.body = body; } onData (chunk) { const { res } = this; return res.push(chunk) } onComplete (trailers) { const { res } = this; res.push(null); } onError (err) { const { ret } = this; this.handler = null; util.destroy(ret, err); } } function pipeline (opts, handler) { try { const pipelineHandler = new PipelineHandler(opts, handler); this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); return pipelineHandler.ret } catch (err) { return new PassThrough().destroy(err) } } apiPipeline = pipeline; return apiPipeline; } var apiUpgrade; var hasRequiredApiUpgrade; function requireApiUpgrade () { if (hasRequiredApiUpgrade) return apiUpgrade; hasRequiredApiUpgrade = 1; const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); const { AsyncResource } = require$$3; const util = requireUtil$1(); const { addSignal, removeSignal } = requireAbortSignal(); const assert = require$$0$1; class UpgradeHandler extends AsyncResource { constructor (opts, callback) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } const { signal, opaque, responseHeaders } = opts; if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } super('UNDICI_UPGRADE'); this.responseHeaders = responseHeaders || null; this.opaque = opaque || null; this.callback = callback; this.abort = null; this.context = null; addSignal(this, signal); } onConnect (abort, context) { if (!this.callback) { throw new RequestAbortedError() } this.abort = abort; this.context = null; } onHeaders () { throw new SocketError('bad upgrade', null) } onUpgrade (statusCode, rawHeaders, socket) { const { callback, opaque, context } = this; assert.strictEqual(statusCode, 101); removeSignal(this); this.callback = null; const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); this.runInAsyncScope(callback, null, null, { headers, socket, opaque, context }); } onError (err) { const { callback, opaque } = this; removeSignal(this); if (callback) { this.callback = null; queueMicrotask(() => { this.runInAsyncScope(callback, null, err, { opaque }); }); } } } function upgrade (opts, callback) { if (callback === undefined) { return new Promise((resolve, reject) => { upgrade.call(this, opts, (err, data) => { return err ? reject(err) : resolve(data) }); }) } try { const upgradeHandler = new UpgradeHandler(opts, callback); this.dispatch({ ...opts, method: opts.method || 'GET', upgrade: opts.protocol || 'Websocket' }, upgradeHandler); } catch (err) { if (typeof callback !== 'function') { throw err } const opaque = opts && opts.opaque; queueMicrotask(() => callback(err, { opaque })); } } apiUpgrade = upgrade; return apiUpgrade; } var apiConnect; var hasRequiredApiConnect; function requireApiConnect () { if (hasRequiredApiConnect) return apiConnect; hasRequiredApiConnect = 1; const { InvalidArgumentError, RequestAbortedError, SocketError } = requireErrors(); const { AsyncResource } = require$$3; const util = requireUtil$1(); const { addSignal, removeSignal } = requireAbortSignal(); class ConnectHandler extends AsyncResource { constructor (opts, callback) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } if (typeof callback !== 'function') { throw new InvalidArgumentError('invalid callback') } const { signal, opaque, responseHeaders } = opts; if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') } super('UNDICI_CONNECT'); this.opaque = opaque || null; this.responseHeaders = responseHeaders || null; this.callback = callback; this.abort = null; addSignal(this, signal); } onConnect (abort, context) { if (!this.callback) { throw new RequestAbortedError() } this.abort = abort; this.context = context; } onHeaders () { throw new SocketError('bad connect', null) } onUpgrade (statusCode, rawHeaders, socket) { const { callback, opaque, context } = this; removeSignal(this); this.callback = null; const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); this.runInAsyncScope(callback, null, null, { statusCode, headers, socket, opaque, context }); } onError (err) { const { callback, opaque } = this; removeSignal(this); if (callback) { this.callback = null; queueMicrotask(() => { this.runInAsyncScope(callback, null, err, { opaque }); }); } } } function connect (opts, callback) { if (callback === undefined) { return new Promise((resolve, reject) => { connect.call(this, opts, (err, data) => { return err ? reject(err) : resolve(data) }); }) } try { const connectHandler = new ConnectHandler(opts, callback); this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler); } catch (err) { if (typeof callback !== 'function') { throw err } const opaque = opts && opts.opaque; queueMicrotask(() => callback(err, { opaque })); } } apiConnect = connect; return apiConnect; } var hasRequiredApi; function requireApi () { if (hasRequiredApi) return api$1; hasRequiredApi = 1; api$1.request = requireApiRequest(); api$1.stream = requireApiStream(); api$1.pipeline = requireApiPipeline(); api$1.upgrade = requireApiUpgrade(); api$1.connect = requireApiConnect(); return api$1; } var mockErrors; var hasRequiredMockErrors; function requireMockErrors () { if (hasRequiredMockErrors) return mockErrors; hasRequiredMockErrors = 1; const { UndiciError } = requireErrors(); class MockNotMatchedError extends UndiciError { constructor (message) { super(message); Error.captureStackTrace(this, MockNotMatchedError); this.name = 'MockNotMatchedError'; this.message = message || 'The request does not match any registered mock dispatches'; this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; } } mockErrors = { MockNotMatchedError }; return mockErrors; } var mockSymbols; var hasRequiredMockSymbols; function requireMockSymbols () { if (hasRequiredMockSymbols) return mockSymbols; hasRequiredMockSymbols = 1; mockSymbols = { kAgent: Symbol('agent'), kOptions: Symbol('options'), kFactory: Symbol('factory'), kDispatches: Symbol('dispatches'), kDispatchKey: Symbol('dispatch key'), kDefaultHeaders: Symbol('default headers'), kDefaultTrailers: Symbol('default trailers'), kContentLength: Symbol('content length'), kMockAgent: Symbol('mock agent'), kMockAgentSet: Symbol('mock agent set'), kMockAgentGet: Symbol('mock agent get'), kMockDispatch: Symbol('mock dispatch'), kClose: Symbol('close'), kOriginalClose: Symbol('original agent close'), kOrigin: Symbol('origin'), kIsMockActive: Symbol('is mock active'), kNetConnect: Symbol('net connect'), kGetNetConnect: Symbol('get net connect'), kConnected: Symbol('connected') }; return mockSymbols; } var mockUtils; var hasRequiredMockUtils; function requireMockUtils () { if (hasRequiredMockUtils) return mockUtils; hasRequiredMockUtils = 1; const { MockNotMatchedError } = requireMockErrors(); const { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect } = requireMockSymbols(); const { buildURL, nop } = requireUtil$1(); function matchValue (match, value) { if (typeof match === 'string') { return match === value } if (match instanceof RegExp) { return match.test(value) } if (typeof match === 'function') { return match(value) === true } return false } function lowerCaseEntries (headers) { return Object.fromEntries( Object.entries(headers).map(([headerName, headerValue]) => { return [headerName.toLocaleLowerCase(), headerValue] }) ) } /** * @param {import('../../index').Headers|string[]|Record} headers * @param {string} key */ function getHeaderByName (headers, key) { if (Array.isArray(headers)) { for (let i = 0; i < headers.length; i += 2) { if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { return headers[i + 1] } } return undefined } else if (typeof headers.get === 'function') { return headers.get(key) } else { return lowerCaseEntries(headers)[key.toLocaleLowerCase()] } } /** @param {string[]} headers */ function buildHeadersFromArray (headers) { // fetch HeadersList const clone = headers.slice(); const entries = []; for (let index = 0; index < clone.length; index += 2) { entries.push([clone[index], clone[index + 1]]); } return Object.fromEntries(entries) } function matchHeaders (mockDispatch, headers) { if (typeof mockDispatch.headers === 'function') { if (Array.isArray(headers)) { // fetch HeadersList headers = buildHeadersFromArray(headers); } return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) } if (typeof mockDispatch.headers === 'undefined') { return true } if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { return false } for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { const headerValue = getHeaderByName(headers, matchHeaderName); if (!matchValue(matchHeaderValue, headerValue)) { return false } } return true } function safeUrl (path) { if (typeof path !== 'string') { return path } const pathSegments = path.split('?'); if (pathSegments.length !== 2) { return path } const qp = new URLSearchParams(pathSegments.pop()); qp.sort(); return [...pathSegments, qp.toString()].join('?') } function matchKey (mockDispatch, { path, method, body, headers }) { const pathMatch = matchValue(mockDispatch.path, path); const methodMatch = matchValue(mockDispatch.method, method); const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true; const headersMatch = matchHeaders(mockDispatch, headers); return pathMatch && methodMatch && bodyMatch && headersMatch } function getResponseData (data) { if (Buffer.isBuffer(data)) { return data } else if (typeof data === 'object') { return JSON.stringify(data) } else { return data.toString() } } function getMockDispatch (mockDispatches, key) { const basePath = key.query ? buildURL(key.path, key.query) : key.path; const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath; // Match path let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); if (matchedMockDispatches.length === 0) { throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) } // Match method matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); if (matchedMockDispatches.length === 0) { throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) } // Match body matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true); if (matchedMockDispatches.length === 0) { throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) } // Match headers matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)); if (matchedMockDispatches.length === 0) { throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) } return matchedMockDispatches[0] } function addMockDispatch (mockDispatches, key, data) { const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; const replyData = typeof data === 'function' ? { callback: data } : { ...data }; const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; mockDispatches.push(newMockDispatch); return newMockDispatch } function deleteMockDispatch (mockDispatches, key) { const index = mockDispatches.findIndex(dispatch => { if (!dispatch.consumed) { return false } return matchKey(dispatch, key) }); if (index !== -1) { mockDispatches.splice(index, 1); } } function buildKey (opts) { const { path, method, body, headers, query } = opts; return { path, method, body, headers, query } } function generateKeyValues (data) { return Object.entries(data).reduce((keyValuePairs, [key, value]) => [...keyValuePairs, key, value], []) } /** * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status * @param {number} statusCode */ function getStatusText (statusCode) { switch (statusCode) { case 100: return 'Continue' case 101: return 'Switching Protocols' case 102: return 'Processing' case 103: return 'Early Hints' case 200: return 'OK' case 201: return 'Created' case 202: return 'Accepted' case 203: return 'Non-Authoritative Information' case 204: return 'No Content' case 205: return 'Reset Content' case 206: return 'Partial Content' case 207: return 'Multi-Status' case 208: return 'Already Reported' case 226: return 'IM Used' case 300: return 'Multiple Choice' case 301: return 'Moved Permanently' case 302: return 'Found' case 303: return 'See Other' case 304: return 'Not Modified' case 305: return 'Use Proxy' case 306: return 'unused' case 307: return 'Temporary Redirect' case 308: return 'Permanent Redirect' case 400: return 'Bad Request' case 401: return 'Unauthorized' case 402: return 'Payment Required' case 403: return 'Forbidden' case 404: return 'Not Found' case 405: return 'Method Not Allowed' case 406: return 'Not Acceptable' case 407: return 'Proxy Authentication Required' case 408: return 'Request Timeout' case 409: return 'Conflict' case 410: return 'Gone' case 411: return 'Length Required' case 412: return 'Precondition Failed' case 413: return 'Payload Too Large' case 414: return 'URI Too Large' case 415: return 'Unsupported Media Type' case 416: return 'Range Not Satisfiable' case 417: return 'Expectation Failed' case 418: return 'I\'m a teapot' case 421: return 'Misdirected Request' case 422: return 'Unprocessable Entity' case 423: return 'Locked' case 424: return 'Failed Dependency' case 425: return 'Too Early' case 426: return 'Upgrade Required' case 428: return 'Precondition Required' case 429: return 'Too Many Requests' case 431: return 'Request Header Fields Too Large' case 451: return 'Unavailable For Legal Reasons' case 500: return 'Internal Server Error' case 501: return 'Not Implemented' case 502: return 'Bad Gateway' case 503: return 'Service Unavailable' case 504: return 'Gateway Timeout' case 505: return 'HTTP Version Not Supported' case 506: return 'Variant Also Negotiates' case 507: return 'Insufficient Storage' case 508: return 'Loop Detected' case 510: return 'Not Extended' case 511: return 'Network Authentication Required' default: return 'unknown' } } async function getResponse (body) { const buffers = []; for await (const data of body) { buffers.push(data); } return Buffer.concat(buffers).toString('utf8') } /** * Mock dispatch function used to simulate undici dispatches */ function mockDispatch (opts, handler) { // Get mock dispatch from built key const key = buildKey(opts); const mockDispatch = getMockDispatch(this[kDispatches], key); mockDispatch.timesInvoked++; // Here's where we resolve a callback if a callback is present for the dispatch data. if (mockDispatch.data.callback) { mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }; } // Parse mockDispatch data const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch; const { timesInvoked, times } = mockDispatch; // If it's used up and not persistent, mark as consumed mockDispatch.consumed = !persist && timesInvoked >= times; mockDispatch.pending = timesInvoked < times; // If specified, trigger dispatch error if (error !== null) { deleteMockDispatch(this[kDispatches], key); handler.onError(error); return true } // Handle the request with a delay if necessary if (typeof delay === 'number' && delay > 0) { setTimeout(() => { handleReply(this[kDispatches]); }, delay); } else { handleReply(this[kDispatches]); } function handleReply (mockDispatches) { // fetch's HeadersList is a 1D string array const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; const responseData = getResponseData( typeof data === 'function' ? data({ ...opts, headers: optsHeaders }) : data ); const responseHeaders = generateKeyValues(headers); const responseTrailers = generateKeyValues(trailers); handler.abort = nop; handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); handler.onData(Buffer.from(responseData)); handler.onComplete(responseTrailers); deleteMockDispatch(mockDispatches, key); } function resume () {} return true } function buildMockDispatch () { const agent = this[kMockAgent]; const origin = this[kOrigin]; const originalDispatch = this[kOriginalDispatch]; return function dispatch (opts, handler) { if (agent.isMockActive) { try { mockDispatch.call(this, opts, handler); } catch (error) { if (error instanceof MockNotMatchedError) { const netConnect = agent[kGetNetConnect](); if (netConnect === false) { throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) } if (checkNetConnect(netConnect, origin)) { originalDispatch.call(this, opts, handler); } else { throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) } } else { throw error } } } else { originalDispatch.call(this, opts, handler); } } } function checkNetConnect (netConnect, origin) { const url = new URL(origin); if (netConnect === true) { return true } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { return true } return false } function buildMockOptions (opts) { if (opts) { const { agent, ...mockOptions } = opts; return mockOptions } } mockUtils = { getResponseData, getMockDispatch, addMockDispatch, deleteMockDispatch, buildKey, generateKeyValues, matchValue, getResponse, getStatusText, mockDispatch, buildMockDispatch, checkNetConnect, buildMockOptions, getHeaderByName }; return mockUtils; } var mockInterceptor = {}; var hasRequiredMockInterceptor; function requireMockInterceptor () { if (hasRequiredMockInterceptor) return mockInterceptor; hasRequiredMockInterceptor = 1; const { getResponseData, buildKey, addMockDispatch } = requireMockUtils(); const { kDispatches, kDispatchKey, kDefaultHeaders, kDefaultTrailers, kContentLength, kMockDispatch } = requireMockSymbols(); const { InvalidArgumentError } = requireErrors(); const { buildURL } = requireUtil$1(); /** * Defines the scope API for an interceptor reply */ class MockScope { constructor (mockDispatch) { this[kMockDispatch] = mockDispatch; } /** * Delay a reply by a set amount in ms. */ delay (waitInMs) { if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { throw new InvalidArgumentError('waitInMs must be a valid integer > 0') } this[kMockDispatch].delay = waitInMs; return this } /** * For a defined reply, never mark as consumed. */ persist () { this[kMockDispatch].persist = true; return this } /** * Allow one to define a reply for a set amount of matching requests. */ times (repeatTimes) { if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') } this[kMockDispatch].times = repeatTimes; return this } } /** * Defines an interceptor for a Mock */ class MockInterceptor { constructor (opts, mockDispatches) { if (typeof opts !== 'object') { throw new InvalidArgumentError('opts must be an object') } if (typeof opts.path === 'undefined') { throw new InvalidArgumentError('opts.path must be defined') } if (typeof opts.method === 'undefined') { opts.method = 'GET'; } // See https://github.com/nodejs/undici/issues/1245 // As per RFC 3986, clients are not supposed to send URI // fragments to servers when they retrieve a document, if (typeof opts.path === 'string') { if (opts.query) { opts.path = buildURL(opts.path, opts.query); } else { // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 const parsedURL = new URL(opts.path, 'data://'); opts.path = parsedURL.pathname + parsedURL.search; } } if (typeof opts.method === 'string') { opts.method = opts.method.toUpperCase(); } this[kDispatchKey] = buildKey(opts); this[kDispatches] = mockDispatches; this[kDefaultHeaders] = {}; this[kDefaultTrailers] = {}; this[kContentLength] = false; } createMockScopeDispatchData (statusCode, data, responseOptions = {}) { const responseData = getResponseData(data); const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}; const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; return { statusCode, data, headers, trailers } } validateReplyParameters (statusCode, data, responseOptions) { if (typeof statusCode === 'undefined') { throw new InvalidArgumentError('statusCode must be defined') } if (typeof data === 'undefined') { throw new InvalidArgumentError('data must be defined') } if (typeof responseOptions !== 'object') { throw new InvalidArgumentError('responseOptions must be an object') } } /** * Mock an undici request with a defined reply. */ reply (replyData) { // Values of reply aren't available right now as they // can only be available when the reply callback is invoked. if (typeof replyData === 'function') { // We'll first wrap the provided callback in another function, // this function will properly resolve the data from the callback // when invoked. const wrappedDefaultsCallback = (opts) => { // Our reply options callback contains the parameter for statusCode, data and options. const resolvedData = replyData(opts); // Check if it is in the right format if (typeof resolvedData !== 'object') { throw new InvalidArgumentError('reply options callback must return an object') } const { statusCode, data = '', responseOptions = {} } = resolvedData; this.validateReplyParameters(statusCode, data, responseOptions); // Since the values can be obtained immediately we return them // from this higher order function that will be resolved later. return { ...this.createMockScopeDispatchData(statusCode, data, responseOptions) } }; // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); return new MockScope(newMockDispatch) } // We can have either one or three parameters, if we get here, // we should have 1-3 parameters. So we spread the arguments of // this function to obtain the parameters, since replyData will always // just be the statusCode. const [statusCode, data = '', responseOptions = {}] = [...arguments]; this.validateReplyParameters(statusCode, data, responseOptions); // Send in-already provided data like usual const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); return new MockScope(newMockDispatch) } /** * Mock an undici request with a defined error. */ replyWithError (error) { if (typeof error === 'undefined') { throw new InvalidArgumentError('error must be defined') } const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); return new MockScope(newMockDispatch) } /** * Set default reply headers on the interceptor for subsequent replies */ defaultReplyHeaders (headers) { if (typeof headers === 'undefined') { throw new InvalidArgumentError('headers must be defined') } this[kDefaultHeaders] = headers; return this } /** * Set default reply trailers on the interceptor for subsequent replies */ defaultReplyTrailers (trailers) { if (typeof trailers === 'undefined') { throw new InvalidArgumentError('trailers must be defined') } this[kDefaultTrailers] = trailers; return this } /** * Set reply content length header for replies on the interceptor */ replyContentLength () { this[kContentLength] = true; return this } } mockInterceptor.MockInterceptor = MockInterceptor; mockInterceptor.MockScope = MockScope; return mockInterceptor; } var mockClient; var hasRequiredMockClient; function requireMockClient () { if (hasRequiredMockClient) return mockClient; hasRequiredMockClient = 1; const { promisify } = require$$0; const Client = requireClient(); const { buildMockDispatch } = requireMockUtils(); const { kDispatches, kMockAgent, kClose, kOriginalClose, kOrigin, kOriginalDispatch, kConnected } = requireMockSymbols(); const { MockInterceptor } = requireMockInterceptor(); const Symbols = requireSymbols$1(); const { InvalidArgumentError } = requireErrors(); /** * MockClient provides an API that extends the Client to influence the mockDispatches. */ class MockClient extends Client { constructor (origin, opts) { super(origin, opts); if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } this[kMockAgent] = opts.agent; this[kOrigin] = origin; this[kDispatches] = []; this[kConnected] = 1; this[kOriginalDispatch] = this.dispatch; this[kOriginalClose] = this.close.bind(this); this.dispatch = buildMockDispatch.call(this); this.close = this[kClose]; } get [Symbols.kConnected] () { return this[kConnected] } /** * Sets up the base interceptor for mocking replies from undici. */ intercept (opts) { return new MockInterceptor(opts, this[kDispatches]) } async [kClose] () { await promisify(this[kOriginalClose])(); this[kConnected] = 0; this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } } mockClient = MockClient; return mockClient; } var mockPool; var hasRequiredMockPool; function requireMockPool () { if (hasRequiredMockPool) return mockPool; hasRequiredMockPool = 1; const { promisify } = require$$0; const Pool = requirePool(); const { buildMockDispatch } = requireMockUtils(); const { kDispatches, kMockAgent, kClose, kOriginalClose, kOrigin, kOriginalDispatch, kConnected } = requireMockSymbols(); const { MockInterceptor } = requireMockInterceptor(); const Symbols = requireSymbols$1(); const { InvalidArgumentError } = requireErrors(); /** * MockPool provides an API that extends the Pool to influence the mockDispatches. */ class MockPool extends Pool { constructor (origin, opts) { super(origin, opts); if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } this[kMockAgent] = opts.agent; this[kOrigin] = origin; this[kDispatches] = []; this[kConnected] = 1; this[kOriginalDispatch] = this.dispatch; this[kOriginalClose] = this.close.bind(this); this.dispatch = buildMockDispatch.call(this); this.close = this[kClose]; } get [Symbols.kConnected] () { return this[kConnected] } /** * Sets up the base interceptor for mocking replies from undici. */ intercept (opts) { return new MockInterceptor(opts, this[kDispatches]) } async [kClose] () { await promisify(this[kOriginalClose])(); this[kConnected] = 0; this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); } } mockPool = MockPool; return mockPool; } var pluralizer; var hasRequiredPluralizer; function requirePluralizer () { if (hasRequiredPluralizer) return pluralizer; hasRequiredPluralizer = 1; const singulars = { pronoun: 'it', is: 'is', was: 'was', this: 'this' }; const plurals = { pronoun: 'they', is: 'are', was: 'were', this: 'these' }; pluralizer = class Pluralizer { constructor (singular, plural) { this.singular = singular; this.plural = plural; } pluralize (count) { const one = count === 1; const keys = one ? singulars : plurals; const noun = one ? this.singular : this.plural; return { ...keys, count, noun } } }; return pluralizer; } var pendingInterceptorsFormatter; var hasRequiredPendingInterceptorsFormatter; function requirePendingInterceptorsFormatter () { if (hasRequiredPendingInterceptorsFormatter) return pendingInterceptorsFormatter; hasRequiredPendingInterceptorsFormatter = 1; const { Transform } = Stream; const { Console } = require$$1$3; /** * Gets the output of `console.table(…)` as a string. */ pendingInterceptorsFormatter = class PendingInterceptorsFormatter { constructor ({ disableColors } = {}) { this.transform = new Transform({ transform (chunk, _enc, cb) { cb(null, chunk); } }); this.logger = new Console({ stdout: this.transform, inspectOptions: { colors: !disableColors && !process.env.CI } }); } format (pendingInterceptors) { const withPrettyHeaders = pendingInterceptors.map( ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ Method: method, Origin: origin, Path: path, 'Status code': statusCode, Persistent: persist ? '✅' : '❌', Invocations: timesInvoked, Remaining: persist ? Infinity : times - timesInvoked })); this.logger.table(withPrettyHeaders); return this.transform.read().toString() } }; return pendingInterceptorsFormatter; } var mockAgent; var hasRequiredMockAgent; function requireMockAgent () { if (hasRequiredMockAgent) return mockAgent; hasRequiredMockAgent = 1; const { kClients } = requireSymbols$1(); const Agent = requireAgent(); const { kAgent, kMockAgentSet, kMockAgentGet, kDispatches, kIsMockActive, kNetConnect, kGetNetConnect, kOptions, kFactory } = requireMockSymbols(); const MockClient = requireMockClient(); const MockPool = requireMockPool(); const { matchValue, buildMockOptions } = requireMockUtils(); const { InvalidArgumentError, UndiciError } = requireErrors(); const Dispatcher = requireDispatcher(); const Pluralizer = requirePluralizer(); const PendingInterceptorsFormatter = requirePendingInterceptorsFormatter(); class FakeWeakRef { constructor (value) { this.value = value; } deref () { return this.value } } class MockAgent extends Dispatcher { constructor (opts) { super(opts); this[kNetConnect] = true; this[kIsMockActive] = true; // Instantiate Agent and encapsulate if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } const agent = opts && opts.agent ? opts.agent : new Agent(opts); this[kAgent] = agent; this[kClients] = agent[kClients]; this[kOptions] = buildMockOptions(opts); } get (origin) { let dispatcher = this[kMockAgentGet](origin); if (!dispatcher) { dispatcher = this[kFactory](origin); this[kMockAgentSet](origin, dispatcher); } return dispatcher } dispatch (opts, handler) { // Call MockAgent.get to perform additional setup before dispatching as normal this.get(opts.origin); return this[kAgent].dispatch(opts, handler) } async close () { await this[kAgent].close(); this[kClients].clear(); } deactivate () { this[kIsMockActive] = false; } activate () { this[kIsMockActive] = true; } enableNetConnect (matcher) { if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { if (Array.isArray(this[kNetConnect])) { this[kNetConnect].push(matcher); } else { this[kNetConnect] = [matcher]; } } else if (typeof matcher === 'undefined') { this[kNetConnect] = true; } else { throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') } } disableNetConnect () { this[kNetConnect] = false; } // This is required to bypass issues caused by using global symbols - see: // https://github.com/nodejs/undici/issues/1447 get isMockActive () { return this[kIsMockActive] } [kMockAgentSet] (origin, dispatcher) { this[kClients].set(origin, new FakeWeakRef(dispatcher)); } [kFactory] (origin) { const mockOptions = Object.assign({ agent: this }, this[kOptions]); return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions) } [kMockAgentGet] (origin) { // First check if we can immediately find it const ref = this[kClients].get(origin); if (ref) { return ref.deref() } // If the origin is not a string create a dummy parent pool and return to user if (typeof origin !== 'string') { const dispatcher = this[kFactory]('http://localhost:9999'); this[kMockAgentSet](origin, dispatcher); return dispatcher } // If we match, create a pool and assign the same dispatches for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { const nonExplicitDispatcher = nonExplicitRef.deref(); if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { const dispatcher = this[kFactory](origin); this[kMockAgentSet](origin, dispatcher); dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; return dispatcher } } } [kGetNetConnect] () { return this[kNetConnect] } pendingInterceptors () { const mockAgentClients = this[kClients]; return Array.from(mockAgentClients.entries()) .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) .filter(({ pending }) => pending) } assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { const pending = this.pendingInterceptors(); if (pending.length === 0) { return } const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length); throw new UndiciError(` ${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: ${pendingInterceptorsFormatter.format(pending)} `.trim()) } } mockAgent = MockAgent; return mockAgent; } var proxyAgent; var hasRequiredProxyAgent; function requireProxyAgent () { if (hasRequiredProxyAgent) return proxyAgent; hasRequiredProxyAgent = 1; const { kClose, kDestroy } = requireSymbols$1(); const Client = requireAgent(); const Agent = requireAgent(); const DispatcherBase = requireDispatcherBase(); const { InvalidArgumentError, RequestAbortedError } = requireErrors(); const buildConnector = requireConnect(); const kAgent = Symbol('proxy agent'); const kClient = Symbol('proxy client'); const kProxyHeaders = Symbol('proxy headers'); const kRequestTls = Symbol('request tls settings'); const kProxyTls = Symbol('proxy tls settings'); const kConnectEndpoint = Symbol('connect endpoint function'); function defaultProtocolPort (protocol) { return protocol === 'https:' ? 443 : 80 } class ProxyAgent extends DispatcherBase { constructor (opts) { super(opts); if (typeof opts === 'string') { opts = { uri: opts }; } if (!opts || !opts.uri) { throw new InvalidArgumentError('Proxy opts.uri is mandatory') } this[kRequestTls] = opts.requestTls; this[kProxyTls] = opts.proxyTls; this[kProxyHeaders] = {}; if (opts.auth) { this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`; } const { origin, port } = new URL(opts.uri); const connect = buildConnector({ ...opts.proxyTls }); this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); this[kClient] = new Client({ origin: opts.origin, connect }); this[kAgent] = new Agent({ ...opts, connect: async (opts, callback) => { let requestedHost = opts.host; if (!opts.port) { requestedHost += `:${defaultProtocolPort(opts.protocol)}`; } try { const { socket, statusCode } = await this[kClient].connect({ origin, port, path: requestedHost, signal: opts.signal, headers: { ...this[kProxyHeaders], host: opts.host } }); if (statusCode !== 200) { socket.on('error', () => {}).destroy(); callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')); } if (opts.protocol !== 'https:') { callback(null, socket); return } let servername; if (this[kRequestTls]) { servername = this[kRequestTls].servername; } else { servername = opts.servername; } this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback); } catch (err) { callback(err); } } }); } dispatch (opts, handler) { const { host } = new URL(opts.origin); const headers = buildHeaders(opts.headers); throwIfProxyAuthIsSent(headers); return this[kAgent].dispatch( { ...opts, headers: { ...headers, host } }, handler ) } async [kClose] () { await this[kAgent].close(); await this[kClient].close(); } async [kDestroy] () { await this[kAgent].destroy(); await this[kClient].destroy(); } } /** * @param {string[] | Record} headers * @returns {Record} */ function buildHeaders (headers) { // When using undici.fetch, the headers list is stored // as an array. if (Array.isArray(headers)) { /** @type {Record} */ const headersPair = {}; for (let i = 0; i < headers.length; i += 2) { headersPair[headers[i]] = headers[i + 1]; } return headersPair } return headers } /** * @param {Record} headers * * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers * Nevertheless, it was changed and to avoid a security vulnerability by end users * this check was created. * It should be removed in the next major version for performance reasons */ function throwIfProxyAuthIsSent (headers) { const existProxyAuth = headers && Object.keys(headers) .find((key) => key.toLowerCase() === 'proxy-authorization'); if (existProxyAuth) { throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') } } proxyAgent = ProxyAgent; return proxyAgent; } var global$1; var hasRequiredGlobal; function requireGlobal () { if (hasRequiredGlobal) return global$1; hasRequiredGlobal = 1; // We include a version number for the Dispatcher API. In case of breaking changes, // this version number must be increased to avoid conflicts. const globalDispatcher = Symbol.for('undici.globalDispatcher.1'); const { InvalidArgumentError } = requireErrors(); const Agent = requireAgent(); if (getGlobalDispatcher() === undefined) { setGlobalDispatcher(new Agent()); } function setGlobalDispatcher (agent) { if (!agent || typeof agent.dispatch !== 'function') { throw new InvalidArgumentError('Argument agent must implement Agent') } Object.defineProperty(globalThis, globalDispatcher, { value: agent, writable: true, enumerable: false, configurable: false }); } function getGlobalDispatcher () { return globalThis[globalDispatcher] } global$1 = { setGlobalDispatcher, getGlobalDispatcher }; return global$1; } var headers; var hasRequiredHeaders; function requireHeaders () { if (hasRequiredHeaders) return headers; hasRequiredHeaders = 1; const { kHeadersList } = requireSymbols$1(); const { kGuard } = requireSymbols(); const { kEnumerableProperty } = requireUtil$1(); const { makeIterator, isValidHeaderName, isValidHeaderValue } = requireUtil(); const { webidl } = requireWebidl(); const kHeadersMap = Symbol('headers map'); const kHeadersSortedMap = Symbol('headers map sorted'); /** * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize * @param {string} potentialValue */ function headerValueNormalize (potentialValue) { // To normalize a byte sequence potentialValue, remove // any leading and trailing HTTP whitespace bytes from // potentialValue. return potentialValue.replace( /^[\r\n\t ]+|[\r\n\t ]+$/g, '' ) } function fill (headers, object) { // To fill a Headers object headers with a given object object, run these steps: // 1. If object is a sequence, then for each header in object: // Note: webidl conversion to array has already been done. if (Array.isArray(object)) { for (const header of object) { // 1. If header does not contain exactly two items, then throw a TypeError. if (header.length !== 2) { webidl.errors.exception({ header: 'Headers constructor', message: `expected name/value pair to be length 2, found ${header.length}.` }); } // 2. Append (header’s first item, header’s second item) to headers. headers.append(header[0], header[1]); } } else if (typeof object === 'object' && object !== null) { // Note: null should throw // 2. Otherwise, object is a record, then for each key → value in object, // append (key, value) to headers for (const [key, value] of Object.entries(object)) { headers.append(key, value); } } else { webidl.errors.conversionFailed({ prefix: 'Headers constructor', argument: 'Argument 1', types: ['sequence>', 'record'] }); } } class HeadersList { constructor (init) { if (init instanceof HeadersList) { this[kHeadersMap] = new Map(init[kHeadersMap]); this[kHeadersSortedMap] = init[kHeadersSortedMap]; } else { this[kHeadersMap] = new Map(init); this[kHeadersSortedMap] = null; } } // https://fetch.spec.whatwg.org/#header-list-contains contains (name) { // A header list list contains a header name name if list // contains a header whose name is a byte-case-insensitive // match for name. name = name.toLowerCase(); return this[kHeadersMap].has(name) } clear () { this[kHeadersMap].clear(); this[kHeadersSortedMap] = null; } // https://fetch.spec.whatwg.org/#concept-header-list-append append (name, value) { this[kHeadersSortedMap] = null; // 1. If list contains name, then set name to the first such // header’s name. name = name.toLowerCase(); const exists = this[kHeadersMap].get(name); // 2. Append (name, value) to list. if (exists) { this[kHeadersMap].set(name, `${exists}, ${value}`); } else { this[kHeadersMap].set(name, `${value}`); } } // https://fetch.spec.whatwg.org/#concept-header-list-set set (name, value) { this[kHeadersSortedMap] = null; name = name.toLowerCase(); // 1. If list contains name, then set the value of // the first such header to value and remove the // others. // 2. Otherwise, append header (name, value) to list. return this[kHeadersMap].set(name, value) } // https://fetch.spec.whatwg.org/#concept-header-list-delete delete (name) { this[kHeadersSortedMap] = null; name = name.toLowerCase(); return this[kHeadersMap].delete(name) } // https://fetch.spec.whatwg.org/#concept-header-list-get get (name) { name = name.toLowerCase(); // 1. If list does not contain name, then return null. if (!this.contains(name)) { return null } // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. return this[kHeadersMap].get(name) ?? null } has (name) { name = name.toLowerCase(); return this[kHeadersMap].has(name) } keys () { return this[kHeadersMap].keys() } values () { return this[kHeadersMap].values() } entries () { return this[kHeadersMap].entries() } [Symbol.iterator] () { return this[kHeadersMap][Symbol.iterator]() } } // https://fetch.spec.whatwg.org/#headers-class class Headers { constructor (init = undefined) { this[kHeadersList] = new HeadersList(); // The new Headers(init) constructor steps are: // 1. Set this’s guard to "none". this[kGuard] = 'none'; // 2. If init is given, then fill this with init. if (init !== undefined) { init = webidl.converters.HeadersInit(init); fill(this, init); } } get [Symbol.toStringTag] () { return this.constructor.name } // https://fetch.spec.whatwg.org/#dom-headers-append append (name, value) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 2) { throw new TypeError( `Failed to execute 'append' on 'Headers': 2 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.ByteString(name); value = webidl.converters.ByteString(value); // 1. Normalize value. value = headerValueNormalize(value); // 2. If name is not a header name or value is not a // header value, then throw a TypeError. if (!isValidHeaderName(name)) { webidl.errors.invalidArgument({ prefix: 'Headers.append', value: name, type: 'header name' }); } else if (!isValidHeaderValue(value)) { webidl.errors.invalidArgument({ prefix: 'Headers.append', value, type: 'header value' }); } // 3. If headers’s guard is "immutable", then throw a TypeError. // 4. Otherwise, if headers’s guard is "request" and name is a // forbidden header name, return. // Note: undici does not implement forbidden header names if (this[kGuard] === 'immutable') { throw new TypeError('immutable') } else if (this[kGuard] === 'request-no-cors') ; // 6. Otherwise, if headers’s guard is "response" and name is a // forbidden response-header name, return. // 7. Append (name, value) to headers’s header list. // 8. If headers’s guard is "request-no-cors", then remove // privileged no-CORS request headers from headers return this[kHeadersList].append(name, value) } // https://fetch.spec.whatwg.org/#dom-headers-delete delete (name) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'delete' on 'Headers': 1 argument required, but only ${arguments.length} present.` ) } name = webidl.converters.ByteString(name); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { webidl.errors.invalidArgument({ prefix: 'Headers.delete', value: name, type: 'header name' }); } // 2. If this’s guard is "immutable", then throw a TypeError. // 3. Otherwise, if this’s guard is "request" and name is a // forbidden header name, return. // 4. Otherwise, if this’s guard is "request-no-cors", name // is not a no-CORS-safelisted request-header name, and // name is not a privileged no-CORS request-header name, // return. // 5. Otherwise, if this’s guard is "response" and name is // a forbidden response-header name, return. // Note: undici does not implement forbidden header names if (this[kGuard] === 'immutable') { throw new TypeError('immutable') } else if (this[kGuard] === 'request-no-cors') ; // 6. If this’s header list does not contain name, then // return. if (!this[kHeadersList].contains(name)) { return } // 7. Delete name from this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this. return this[kHeadersList].delete(name) } // https://fetch.spec.whatwg.org/#dom-headers-get get (name) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'get' on 'Headers': 1 argument required, but only ${arguments.length} present.` ) } name = webidl.converters.ByteString(name); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { webidl.errors.invalidArgument({ prefix: 'Headers.get', value: name, type: 'header name' }); } // 2. Return the result of getting name from this’s header // list. return this[kHeadersList].get(name) } // https://fetch.spec.whatwg.org/#dom-headers-has has (name) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'has' on 'Headers': 1 argument required, but only ${arguments.length} present.` ) } name = webidl.converters.ByteString(name); // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { webidl.errors.invalidArgument({ prefix: 'Headers.has', value: name, type: 'header name' }); } // 2. Return true if this’s header list contains name; // otherwise false. return this[kHeadersList].contains(name) } // https://fetch.spec.whatwg.org/#dom-headers-set set (name, value) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 2) { throw new TypeError( `Failed to execute 'set' on 'Headers': 2 arguments required, but only ${arguments.length} present.` ) } name = webidl.converters.ByteString(name); value = webidl.converters.ByteString(value); // 1. Normalize value. value = headerValueNormalize(value); // 2. If name is not a header name or value is not a // header value, then throw a TypeError. if (!isValidHeaderName(name)) { webidl.errors.invalidArgument({ prefix: 'Headers.set', value: name, type: 'header name' }); } else if (!isValidHeaderValue(value)) { webidl.errors.invalidArgument({ prefix: 'Headers.set', value, type: 'header value' }); } // 3. If this’s guard is "immutable", then throw a TypeError. // 4. Otherwise, if this’s guard is "request" and name is a // forbidden header name, return. // 5. Otherwise, if this’s guard is "request-no-cors" and // name/value is not a no-CORS-safelisted request-header, // return. // 6. Otherwise, if this’s guard is "response" and name is a // forbidden response-header name, return. // Note: undici does not implement forbidden header names if (this[kGuard] === 'immutable') { throw new TypeError('immutable') } else if (this[kGuard] === 'request-no-cors') ; // 7. Set (name, value) in this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this return this[kHeadersList].set(name, value) } get [kHeadersSortedMap] () { this[kHeadersList][kHeadersSortedMap] ??= new Map([...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1)); return this[kHeadersList][kHeadersSortedMap] } keys () { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } return makeIterator(this[kHeadersSortedMap].keys(), 'Headers') } values () { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } return makeIterator(this[kHeadersSortedMap].values(), 'Headers') } entries () { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } return makeIterator(this[kHeadersSortedMap].entries(), 'Headers') } /** * @param {(value: string, key: string, self: Headers) => void} callbackFn * @param {unknown} thisArg */ forEach (callbackFn, thisArg = globalThis) { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } if (arguments.length < 1) { throw new TypeError( `Failed to execute 'forEach' on 'Headers': 1 argument required, but only ${arguments.length} present.` ) } if (typeof callbackFn !== 'function') { throw new TypeError( "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." ) } for (const [key, value] of this) { callbackFn.apply(thisArg, [value, key, this]); } } [Symbol.for('nodejs.util.inspect.custom')] () { if (!(this instanceof Headers)) { throw new TypeError('Illegal invocation') } return this[kHeadersList] } } Headers.prototype[Symbol.iterator] = Headers.prototype.entries; Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, delete: kEnumerableProperty, get: kEnumerableProperty, has: kEnumerableProperty, set: kEnumerableProperty, keys: kEnumerableProperty, values: kEnumerableProperty, entries: kEnumerableProperty, forEach: kEnumerableProperty }); webidl.converters.HeadersInit = function (V) { if (webidl.util.Type(V) === 'Object') { if (V[Symbol.iterator]) { return webidl.converters['sequence>'](V) } return webidl.converters['record'](V) } webidl.errors.conversionFailed({ prefix: 'Headers constructor', argument: 'Argument 1', types: ['sequence>', 'record'] }); }; headers = { fill, Headers, HeadersList }; return headers; } var response; var hasRequiredResponse; function requireResponse () { if (hasRequiredResponse) return response; hasRequiredResponse = 1; const { Headers, HeadersList, fill } = requireHeaders(); const { extractBody, cloneBody, mixinBody } = requireBody(); const util = requireUtil$1(); const { kEnumerableProperty } = util; const { responseURL, isValidReasonPhrase, isCancelled, isAborted, isBlobLike, serializeJavascriptValueToJSONString, isErrorLike } = requireUtil(); const { redirectStatus, nullBodyStatus, DOMException } = requireConstants$1(); const { kState, kHeaders, kGuard, kRealm } = requireSymbols(); const { webidl } = requireWebidl(); const { FormData } = requireFormdata(); const { kHeadersList } = requireSymbols$1(); const assert = require$$0$1; const { types } = require$$0; const ReadableStream = globalThis.ReadableStream || require$$10.ReadableStream; // https://fetch.spec.whatwg.org/#response-class class Response { // Creates network error Response. static error () { // TODO const relevantRealm = { settingsObject: {} }; // The static error() method steps are to return the result of creating a // Response object, given a new network error, "immutable", and this’s // relevant Realm. const responseObject = new Response(); responseObject[kState] = makeNetworkError(); responseObject[kRealm] = relevantRealm; responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; responseObject[kHeaders][kGuard] = 'immutable'; responseObject[kHeaders][kRealm] = relevantRealm; return responseObject } // https://fetch.spec.whatwg.org/#dom-response-json static json (data, init = {}) { if (arguments.length === 0) { throw new TypeError( 'Failed to execute \'json\' on \'Response\': 1 argument required, but 0 present.' ) } if (init !== null) { init = webidl.converters.ResponseInit(init); } // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. const bytes = new TextEncoder('utf-8').encode( serializeJavascriptValueToJSONString(data) ); // 2. Let body be the result of extracting bytes. const body = extractBody(bytes); // 3. Let responseObject be the result of creating a Response object, given a new response, // "response", and this’s relevant Realm. const relevantRealm = { settingsObject: {} }; const responseObject = new Response(); responseObject[kRealm] = relevantRealm; responseObject[kHeaders][kGuard] = 'response'; responseObject[kHeaders][kRealm] = relevantRealm; // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }); // 5. Return responseObject. return responseObject } // Creates a redirect Response that redirects to url with status status. static redirect (url, status = 302) { const relevantRealm = { settingsObject: {} }; if (arguments.length < 1) { throw new TypeError( `Failed to execute 'redirect' on 'Response': 1 argument required, but only ${arguments.length} present.` ) } url = webidl.converters.USVString(url); status = webidl.converters['unsigned short'](status); // 1. Let parsedURL be the result of parsing url with current settings // object’s API base URL. // 2. If parsedURL is failure, then throw a TypeError. // TODO: base-URL? let parsedURL; try { parsedURL = new URL(url); } catch (err) { throw Object.assign(new TypeError('Failed to parse URL from ' + url), { cause: err }) } // 3. If status is not a redirect status, then throw a RangeError. if (!redirectStatus.includes(status)) { throw new RangeError('Invalid status code') } // 4. Let responseObject be the result of creating a Response object, // given a new response, "immutable", and this’s relevant Realm. const responseObject = new Response(); responseObject[kRealm] = relevantRealm; responseObject[kHeaders][kGuard] = 'immutable'; responseObject[kHeaders][kRealm] = relevantRealm; // 5. Set responseObject’s response’s status to status. responseObject[kState].status = status; // 6. Let value be parsedURL, serialized and isomorphic encoded. // TODO: isomorphic encoded? const value = parsedURL.toString(); // 7. Append `Location`/value to responseObject’s response’s header list. responseObject[kState].headersList.append('location', value); // 8. Return responseObject. return responseObject } // https://fetch.spec.whatwg.org/#dom-response constructor (body = null, init = {}) { if (body !== null) { body = webidl.converters.BodyInit(body); } init = webidl.converters.ResponseInit(init); // TODO this[kRealm] = { settingsObject: {} }; // 1. Set this’s response to a new response. this[kState] = makeResponse({}); // 2. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is this’s response’s header list and guard // is "response". this[kHeaders] = new Headers(); this[kHeaders][kGuard] = 'response'; this[kHeaders][kHeadersList] = this[kState].headersList; this[kHeaders][kRealm] = this[kRealm]; // 3. Let bodyWithType be null. let bodyWithType = null; // 4. If body is non-null, then set bodyWithType to the result of extracting body. if (body != null) { const [extractedBody, type] = extractBody(body); bodyWithType = { body: extractedBody, type }; } // 5. Perform initialize a response given this, init, and bodyWithType. initializeResponse(this, init, bodyWithType); } get [Symbol.toStringTag] () { return this.constructor.name } // Returns response’s type, e.g., "cors". get type () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The type getter steps are to return this’s response’s type. return this[kState].type } // Returns response’s URL, if it has one; otherwise the empty string. get url () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The url getter steps are to return the empty string if this’s // response’s URL is null; otherwise this’s response’s URL, // serialized with exclude fragment set to true. let url = responseURL(this[kState]); if (url == null) { return '' } if (url.hash) { url = new URL(url); url.hash = ''; } return url.toString() } // Returns whether response was obtained through a redirect. get redirected () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The redirected getter steps are to return true if this’s response’s URL // list has more than one item; otherwise false. return this[kState].urlList.length > 1 } // Returns response’s status. get status () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The status getter steps are to return this’s response’s status. return this[kState].status } // Returns whether response’s status is an ok status. get ok () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The ok getter steps are to return true if this’s response’s status is an // ok status; otherwise false. return this[kState].status >= 200 && this[kState].status <= 299 } // Returns response’s status message. get statusText () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The statusText getter steps are to return this’s response’s status // message. return this[kState].statusText } // Returns response’s headers as Headers. get headers () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // The headers getter steps are to return this’s headers. return this[kHeaders] } // Returns a clone of response. clone () { if (!(this instanceof Response)) { throw new TypeError('Illegal invocation') } // 1. If this is unusable, then throw a TypeError. if (this.bodyUsed || (this.body && this.body.locked)) { webidl.errors.exception({ header: 'Response.clone', message: 'Body has already been consumed.' }); } // 2. Let clonedResponse be the result of cloning this’s response. const clonedResponse = cloneResponse(this[kState]); // 3. Return the result of creating a Response object, given // clonedResponse, this’s headers’s guard, and this’s relevant Realm. const clonedResponseObject = new Response(); clonedResponseObject[kState] = clonedResponse; clonedResponseObject[kRealm] = this[kRealm]; clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; return clonedResponseObject } } mixinBody(Response); Object.defineProperties(Response.prototype, { type: kEnumerableProperty, url: kEnumerableProperty, status: kEnumerableProperty, ok: kEnumerableProperty, redirected: kEnumerableProperty, statusText: kEnumerableProperty, headers: kEnumerableProperty, clone: kEnumerableProperty }); // https://fetch.spec.whatwg.org/#concept-response-clone function cloneResponse (response) { // To clone a response response, run these steps: // 1. If response is a filtered response, then return a new identical // filtered response whose internal response is a clone of response’s // internal response. if (response.internalResponse) { return filterResponse( cloneResponse(response.internalResponse), response.type ) } // 2. Let newResponse be a copy of response, except for its body. const newResponse = makeResponse({ ...response, body: null }); // 3. If response’s body is non-null, then set newResponse’s body to the // result of cloning response’s body. if (response.body != null) { newResponse.body = cloneBody(response.body); } // 4. Return newResponse. return newResponse } function makeResponse (init) { return { aborted: false, rangeRequested: false, timingAllowPassed: false, requestIncludesCredentials: false, type: 'default', status: 200, timingInfo: null, cacheState: '', statusText: '', ...init, headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList(), urlList: init.urlList ? [...init.urlList] : [] } } function makeNetworkError (reason) { const isError = isErrorLike(reason); return makeResponse({ type: 'error', status: 0, error: isError ? reason : new Error(reason ? String(reason) : reason, { cause: isError ? reason : undefined }), aborted: reason && reason.name === 'AbortError' }) } function makeFilteredResponse (response, state) { state = { internalResponse: response, ...state }; return new Proxy(response, { get (target, p) { return p in state ? state[p] : target[p] }, set (target, p, value) { assert(!(p in state)); target[p] = value; return true } }) } // https://fetch.spec.whatwg.org/#concept-filtered-response function filterResponse (response, type) { // Set response to the following filtered response with response as its // internal response, depending on request’s response tainting: if (type === 'basic') { // A basic filtered response is a filtered response whose type is "basic" // and header list excludes any headers in internal response’s header list // whose name is a forbidden response-header name. // Note: undici does not implement forbidden response-header names return makeFilteredResponse(response, { type: 'basic', headersList: response.headersList }) } else if (type === 'cors') { // A CORS filtered response is a filtered response whose type is "cors" // and header list excludes any headers in internal response’s header // list whose name is not a CORS-safelisted response-header name, given // internal response’s CORS-exposed header-name list. // Note: undici does not implement CORS-safelisted response-header names return makeFilteredResponse(response, { type: 'cors', headersList: response.headersList }) } else if (type === 'opaque') { // An opaque filtered response is a filtered response whose type is // "opaque", URL list is the empty list, status is 0, status message // is the empty byte sequence, header list is empty, and body is null. return makeFilteredResponse(response, { type: 'opaque', urlList: Object.freeze([]), status: 0, statusText: '', body: null }) } else if (type === 'opaqueredirect') { // An opaque-redirect filtered response is a filtered response whose type // is "opaqueredirect", status is 0, status message is the empty byte // sequence, header list is empty, and body is null. return makeFilteredResponse(response, { type: 'opaqueredirect', status: 0, statusText: '', headersList: [], body: null }) } else { assert(false); } } // https://fetch.spec.whatwg.org/#appropriate-network-error function makeAppropriateNetworkError (fetchParams) { // 1. Assert: fetchParams is canceled. assert(isCancelled(fetchParams)); // 2. Return an aborted network error if fetchParams is aborted; // otherwise return a network error. return isAborted(fetchParams) ? makeNetworkError(new DOMException('The operation was aborted.', 'AbortError')) : makeNetworkError(fetchParams.controller.terminated.reason) } // https://whatpr.org/fetch/1392.html#initialize-a-response function initializeResponse (response, init, body) { // 1. If init["status"] is not in the range 200 to 599, inclusive, then // throw a RangeError. if (init.status !== null && (init.status < 200 || init.status > 599)) { throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.') } // 2. If init["statusText"] does not match the reason-phrase token production, // then throw a TypeError. if ('statusText' in init && init.statusText != null) { // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2: // reason-phrase = *( HTAB / SP / VCHAR / obs-text ) if (!isValidReasonPhrase(String(init.statusText))) { throw new TypeError('Invalid statusText') } } // 3. Set response’s response’s status to init["status"]. if ('status' in init && init.status != null) { response[kState].status = init.status; } // 4. Set response’s response’s status message to init["statusText"]. if ('statusText' in init && init.statusText != null) { response[kState].statusText = init.statusText; } // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. if ('headers' in init && init.headers != null) { fill(response[kState].headersList, init.headers); } // 6. If body was given, then: if (body) { // 1. If response's status is a null body status, then throw a TypeError. if (nullBodyStatus.includes(response.status)) { webidl.errors.exception({ header: 'Response constructor', message: 'Invalid response status code.' }); } // 2. Set response's body to body's body. response[kState].body = body.body; // 3. If body's type is non-null and response's header list does not contain // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. if (body.type != null && !response[kState].headersList.has('Content-Type')) { response[kState].headersList.append('content-type', body.type); } } } webidl.converters.ReadableStream = webidl.interfaceConverter( ReadableStream ); webidl.converters.FormData = webidl.interfaceConverter( FormData ); webidl.converters.URLSearchParams = webidl.interfaceConverter( URLSearchParams ); // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit webidl.converters.XMLHttpRequestBodyInit = function (V) { if (typeof V === 'string') { return webidl.converters.USVString(V) } if (isBlobLike(V)) { return webidl.converters.Blob(V) } if ( types.isAnyArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V) ) { return webidl.converters.BufferSource(V) } if (V instanceof FormData) { return webidl.converters.FormData(V) } if (V instanceof URLSearchParams) { return webidl.converters.URLSearchParams(V) } return webidl.converters.DOMString(V) }; // https://fetch.spec.whatwg.org/#bodyinit webidl.converters.BodyInit = function (V) { if (V instanceof ReadableStream) { return webidl.converters.ReadableStream(V) } // Note: the spec doesn't include async iterables, // this is an undici extension. if (V?.[Symbol.asyncIterator]) { return V } return webidl.converters.XMLHttpRequestBodyInit(V) }; webidl.converters.ResponseInit = webidl.dictionaryConverter([ { key: 'status', converter: webidl.converters['unsigned short'], defaultValue: 200 }, { key: 'statusText', converter: webidl.converters.ByteString, defaultValue: '' }, { key: 'headers', converter: webidl.converters.HeadersInit } ]); response = { makeNetworkError, makeResponse, makeAppropriateNetworkError, filterResponse, Response }; return response; } /* globals AbortController */ var request; var hasRequiredRequest; function requireRequest () { if (hasRequiredRequest) return request; hasRequiredRequest = 1; const { extractBody, mixinBody, cloneBody } = requireBody(); const { Headers, fill: fillHeaders, HeadersList } = requireHeaders(); const { FinalizationRegistry } = requireDispatcherWeakref()(); const util = requireUtil$1(); const { isValidHTTPToken, sameOrigin, normalizeMethod } = requireUtil(); const { forbiddenMethods, corsSafeListedMethods, referrerPolicy, requestRedirect, requestMode, requestCredentials, requestCache } = requireConstants$1(); const { kEnumerableProperty } = util; const { kHeaders, kSignal, kState, kGuard, kRealm } = requireSymbols(); const { webidl } = requireWebidl(); const { kHeadersList } = requireSymbols$1(); const assert = require$$0$1; let TransformStream; const kInit = Symbol('init'); const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { signal.removeEventListener('abort', abort); }); // https://fetch.spec.whatwg.org/#request-class class Request { // https://fetch.spec.whatwg.org/#dom-request constructor (input, init = {}) { if (input === kInit) { return } if (arguments.length < 1) { throw new TypeError( `Failed to construct 'Request': 1 argument required, but only ${arguments.length} present.` ) } input = webidl.converters.RequestInfo(input); init = webidl.converters.RequestInit(init); // TODO this[kRealm] = { settingsObject: {} }; // 1. Let request be null. let request = null; // 2. Let fallbackMode be null. let fallbackMode = null; // 3. Let baseURL be this’s relevant settings object’s API base URL. const baseUrl = this[kRealm].settingsObject.baseUrl; // 4. Let signal be null. let signal = null; // 5. If input is a string, then: if (typeof input === 'string') { // 1. Let parsedURL be the result of parsing input with baseURL. // 2. If parsedURL is failure, then throw a TypeError. let parsedURL; try { parsedURL = new URL(input, baseUrl); } catch (err) { throw new TypeError('Failed to parse URL from ' + input, { cause: err }) } // 3. If parsedURL includes credentials, then throw a TypeError. if (parsedURL.username || parsedURL.password) { throw new TypeError( 'Request cannot be constructed from a URL that includes credentials: ' + input ) } // 4. Set request to a new request whose URL is parsedURL. request = makeRequest({ urlList: [parsedURL] }); // 5. Set fallbackMode to "cors". fallbackMode = 'cors'; } else { // 6. Otherwise: // 7. Assert: input is a Request object. assert(input instanceof Request); // 8. Set request to input’s request. request = input[kState]; // 9. Set signal to input’s signal. signal = input[kSignal]; } // 7. Let origin be this’s relevant settings object’s origin. const origin = this[kRealm].settingsObject.origin; // 8. Let window be "client". let window = 'client'; // 9. If request’s window is an environment settings object and its origin // is same origin with origin, then set window to request’s window. if ( request.window?.constructor?.name === 'EnvironmentSettingsObject' && sameOrigin(request.window, origin) ) { window = request.window; } // 10. If init["window"] exists and is non-null, then throw a TypeError. if (init.window !== undefined && init.window != null) { throw new TypeError(`'window' option '${window}' must be null`) } // 11. If init["window"] exists, then set window to "no-window". if (init.window !== undefined) { window = 'no-window'; } // 12. Set request to a new request with the following properties: request = makeRequest({ // URL request’s URL. // undici implementation note: this is set as the first item in request's urlList in makeRequest // method request’s method. method: request.method, // header list A copy of request’s header list. // undici implementation note: headersList is cloned in makeRequest headersList: request.headersList, // unsafe-request flag Set. unsafeRequest: request.unsafeRequest, // client This’s relevant settings object. client: this[kRealm].settingsObject, // window window. window, // priority request’s priority. priority: request.priority, // origin request’s origin. The propagation of the origin is only significant for navigation requests // being handled by a service worker. In this scenario a request can have an origin that is different // from the current client. origin: request.origin, // referrer request’s referrer. referrer: request.referrer, // referrer policy request’s referrer policy. referrerPolicy: request.referrerPolicy, // mode request’s mode. mode: request.mode, // credentials mode request’s credentials mode. credentials: request.credentials, // cache mode request’s cache mode. cache: request.cache, // redirect mode request’s redirect mode. redirect: request.redirect, // integrity metadata request’s integrity metadata. integrity: request.integrity, // keepalive request’s keepalive. keepalive: request.keepalive, // reload-navigation flag request’s reload-navigation flag. reloadNavigation: request.reloadNavigation, // history-navigation flag request’s history-navigation flag. historyNavigation: request.historyNavigation, // URL list A clone of request’s URL list. urlList: [...request.urlList] }); // 13. If init is not empty, then: if (Object.keys(init).length > 0) { // 1. If request’s mode is "navigate", then set it to "same-origin". if (request.mode === 'navigate') { request.mode = 'same-origin'; } // 2. Unset request’s reload-navigation flag. request.reloadNavigation = false; // 3. Unset request’s history-navigation flag. request.historyNavigation = false; // 4. Set request’s origin to "client". request.origin = 'client'; // 5. Set request’s referrer to "client" request.referrer = 'client'; // 6. Set request’s referrer policy to the empty string. request.referrerPolicy = ''; // 7. Set request’s URL to request’s current URL. request.url = request.urlList[request.urlList.length - 1]; // 8. Set request’s URL list to « request’s URL ». request.urlList = [request.url]; } // 14. If init["referrer"] exists, then: if (init.referrer !== undefined) { // 1. Let referrer be init["referrer"]. const referrer = init.referrer; // 2. If referrer is the empty string, then set request’s referrer to "no-referrer". if (referrer === '') { request.referrer = 'no-referrer'; } else { // 1. Let parsedReferrer be the result of parsing referrer with // baseURL. // 2. If parsedReferrer is failure, then throw a TypeError. let parsedReferrer; try { parsedReferrer = new URL(referrer, baseUrl); } catch (err) { throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }) } // 3. If one of the following is true // parsedReferrer’s cannot-be-a-base-URL is true, scheme is "about", // and path contains a single string "client" // parsedReferrer’s origin is not same origin with origin // then set request’s referrer to "client". // TODO // 4. Otherwise, set request’s referrer to parsedReferrer. request.referrer = parsedReferrer; } } // 15. If init["referrerPolicy"] exists, then set request’s referrer policy // to it. if (init.referrerPolicy !== undefined) { request.referrerPolicy = init.referrerPolicy; if (!referrerPolicy.includes(request.referrerPolicy)) { throw new TypeError( `Failed to construct 'Request': The provided value '${request.referrerPolicy}' is not a valid enum value of type ReferrerPolicy.` ) } } // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. let mode; if (init.mode !== undefined) { mode = init.mode; if (!requestMode.includes(mode)) { throw new TypeError( `Failed to construct 'Request': The provided value '${request.mode}' is not a valid enum value of type RequestMode.` ) } } else { mode = fallbackMode; } // 17. If mode is "navigate", then throw a TypeError. if (mode === 'navigate') { webidl.errors.exception({ header: 'Request constructor', message: 'invalid request mode navigate.' }); } // 18. If mode is non-null, set request’s mode to mode. if (mode != null) { request.mode = mode; } // 19. If init["credentials"] exists, then set request’s credentials mode // to it. if (init.credentials !== undefined) { request.credentials = init.credentials; if (!requestCredentials.includes(request.credentials)) { throw new TypeError( `Failed to construct 'Request': The provided value '${request.credentials}' is not a valid enum value of type RequestCredentials.` ) } } // 18. If init["cache"] exists, then set request’s cache mode to it. if (init.cache !== undefined) { request.cache = init.cache; if (!requestCache.includes(request.cache)) { throw new TypeError( `Failed to construct 'Request': The provided value '${request.cache}' is not a valid enum value of type RequestCache.` ) } } // 21. If request’s cache mode is "only-if-cached" and request’s mode is // not "same-origin", then throw a TypeError. if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { throw new TypeError( "'only-if-cached' can be set only with 'same-origin' mode" ) } // 22. If init["redirect"] exists, then set request’s redirect mode to it. if (init.redirect !== undefined) { request.redirect = init.redirect; if (!requestRedirect.includes(request.redirect)) { throw new TypeError( `Failed to construct 'Request': The provided value '${request.redirect}' is not a valid enum value of type RequestRedirect.` ) } } // 23. If init["integrity"] exists, then set request’s integrity metadata to it. if (init.integrity !== undefined && init.integrity != null) { request.integrity = String(init.integrity); } // 24. If init["keepalive"] exists, then set request’s keepalive to it. if (init.keepalive !== undefined) { request.keepalive = Boolean(init.keepalive); } // 25. If init["method"] exists, then: if (init.method !== undefined) { // 1. Let method be init["method"]. let method = init.method; // 2. If method is not a method or method is a forbidden method, then // throw a TypeError. if (!isValidHTTPToken(init.method)) { throw TypeError(`'${init.method}' is not a valid HTTP method.`) } if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { throw TypeError(`'${init.method}' HTTP method is unsupported.`) } // 3. Normalize method. method = normalizeMethod(init.method); // 4. Set request’s method to method. request.method = method; } // 26. If init["signal"] exists, then set signal to it. if (init.signal !== undefined) { signal = init.signal; } // 27. Set this’s request to request. this[kState] = request; // 28. Set this’s signal to a new AbortSignal object with this’s relevant // Realm. const ac = new AbortController(); this[kSignal] = ac.signal; this[kSignal][kRealm] = this[kRealm]; // 29. If signal is not null, then make this’s signal follow signal. if (signal != null) { if ( !signal || typeof signal.aborted !== 'boolean' || typeof signal.addEventListener !== 'function' ) { throw new TypeError( "Failed to construct 'Request': member signal is not of type AbortSignal." ) } if (signal.aborted) { ac.abort(signal.reason); } else { const abort = () => ac.abort(signal.reason); signal.addEventListener('abort', abort, { once: true }); requestFinalizer.register(this, { signal, abort }); } } // 30. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is request’s header list and guard is // "request". this[kHeaders] = new Headers(); this[kHeaders][kHeadersList] = request.headersList; this[kHeaders][kGuard] = 'request'; this[kHeaders][kRealm] = this[kRealm]; // 31. If this’s request’s mode is "no-cors", then: if (mode === 'no-cors') { // 1. If this’s request’s method is not a CORS-safelisted method, // then throw a TypeError. if (!corsSafeListedMethods.includes(request.method)) { throw new TypeError( `'${request.method} is unsupported in no-cors mode.` ) } // 2. Set this’s headers’s guard to "request-no-cors". this[kHeaders][kGuard] = 'request-no-cors'; } // 32. If init is not empty, then: if (Object.keys(init).length !== 0) { // 1. Let headers be a copy of this’s headers and its associated header // list. let headers = new Headers(this[kHeaders]); // 2. If init["headers"] exists, then set headers to init["headers"]. if (init.headers !== undefined) { headers = init.headers; } // 3. Empty this’s headers’s header list. this[kHeaders][kHeadersList].clear(); // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. if (headers.constructor.name === 'Headers') { for (const [key, val] of headers) { this[kHeaders].append(key, val); } } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kHeaders], headers); } } // 33. Let inputBody be input’s request’s body if input is a Request // object; otherwise null. const inputBody = input instanceof Request ? input[kState].body : null; // 34. If either init["body"] exists and is non-null or inputBody is // non-null, and request’s method is `GET` or `HEAD`, then throw a // TypeError. if ( ((init.body !== undefined && init.body != null) || inputBody != null) && (request.method === 'GET' || request.method === 'HEAD') ) { throw new TypeError('Request with GET/HEAD method cannot have body.') } // 35. Let initBody be null. let initBody = null; // 36. If init["body"] exists and is non-null, then: if (init.body !== undefined && init.body != null) { // 1. Let Content-Type be null. // 2. Set initBody and Content-Type to the result of extracting // init["body"], with keepalive set to request’s keepalive. const [extractedBody, contentType] = extractBody( init.body, request.keepalive ); initBody = extractedBody; // 3, If Content-Type is non-null and this’s headers’s header list does // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. if (contentType && !this[kHeaders].has('content-type')) { this[kHeaders].append('content-type', contentType); } } // 37. Let inputOrInitBody be initBody if it is non-null; otherwise // inputBody. const inputOrInitBody = initBody ?? inputBody; // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is // null, then: if (inputOrInitBody != null && inputOrInitBody.source == null) { // 1. If this’s request’s mode is neither "same-origin" nor "cors", // then throw a TypeError. if (request.mode !== 'same-origin' && request.mode !== 'cors') { throw new TypeError( 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' ) } // 2. Set this’s request’s use-CORS-preflight flag. request.useCORSPreflightFlag = true; } // 39. Let finalBody be inputOrInitBody. let finalBody = inputOrInitBody; // 40. If initBody is null and inputBody is non-null, then: if (initBody == null && inputBody != null) { // 1. If input is unusable, then throw a TypeError. if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { throw new TypeError( 'Cannot construct a Request with a Request object that has already been used.' ) } // 2. Set finalBody to the result of creating a proxy for inputBody. if (!TransformStream) { TransformStream = require$$10.TransformStream; } // https://streams.spec.whatwg.org/#readablestream-create-a-proxy const identityTransform = new TransformStream(); inputBody.stream.pipeThrough(identityTransform); finalBody = { source: inputBody.source, length: inputBody.length, stream: identityTransform.readable }; } // 41. Set this’s request’s body to finalBody. this[kState].body = finalBody; } get [Symbol.toStringTag] () { return this.constructor.name } // Returns request’s HTTP method, which is "GET" by default. get method () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The method getter steps are to return this’s request’s method. return this[kState].method } // Returns the URL of request as a string. get url () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The url getter steps are to return this’s request’s URL, serialized. return this[kState].url.toString() } // Returns a Headers object consisting of the headers associated with request. // Note that headers added in the network layer by the user agent will not // be accounted for in this object, e.g., the "Host" header. get headers () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The headers getter steps are to return this’s headers. return this[kHeaders] } // Returns the kind of resource requested by request, e.g., "document" // or "script". get destination () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The destination getter are to return this’s request’s destination. return this[kState].destination } // Returns the referrer of request. Its value can be a same-origin URL if // explicitly set in init, the empty string to indicate no referrer, and // "about:client" when defaulting to the global’s default. This is used // during fetching to determine the value of the `Referer` header of the // request being made. get referrer () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // 1. If this’s request’s referrer is "no-referrer", then return the // empty string. if (this[kState].referrer === 'no-referrer') { return '' } // 2. If this’s request’s referrer is "client", then return // "about:client". if (this[kState].referrer === 'client') { return 'about:client' } // Return this’s request’s referrer, serialized. return this[kState].referrer.toString() } // Returns the referrer policy associated with request. // This is used during fetching to compute the value of the request’s // referrer. get referrerPolicy () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The referrerPolicy getter steps are to return this’s request’s referrer policy. return this[kState].referrerPolicy } // Returns the mode associated with request, which is a string indicating // whether the request will use CORS, or will be restricted to same-origin // URLs. get mode () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The mode getter steps are to return this’s request’s mode. return this[kState].mode } // Returns the credentials mode associated with request, // which is a string indicating whether credentials will be sent with the // request always, never, or only when sent to a same-origin URL. get credentials () { // The credentials getter steps are to return this’s request’s credentials mode. return this[kState].credentials } // Returns the cache mode associated with request, // which is a string indicating how the request will // interact with the browser’s cache when fetching. get cache () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The cache getter steps are to return this’s request’s cache mode. return this[kState].cache } // Returns the redirect mode associated with request, // which is a string indicating how redirects for the // request will be handled during fetching. A request // will follow redirects by default. get redirect () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The redirect getter steps are to return this’s request’s redirect mode. return this[kState].redirect } // Returns request’s subresource integrity metadata, which is a // cryptographic hash of the resource being fetched. Its value // consists of multiple hashes separated by whitespace. [SRI] get integrity () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The integrity getter steps are to return this’s request’s integrity // metadata. return this[kState].integrity } // Returns a boolean indicating whether or not request can outlive the // global in which it was created. get keepalive () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The keepalive getter steps are to return this’s request’s keepalive. return this[kState].keepalive } // Returns a boolean indicating whether or not request is for a reload // navigation. get isReloadNavigation () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The isReloadNavigation getter steps are to return true if this’s // request’s reload-navigation flag is set; otherwise false. return this[kState].reloadNavigation } // Returns a boolean indicating whether or not request is for a history // navigation (a.k.a. back-foward navigation). get isHistoryNavigation () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The isHistoryNavigation getter steps are to return true if this’s request’s // history-navigation flag is set; otherwise false. return this[kState].historyNavigation } // Returns the signal associated with request, which is an AbortSignal // object indicating whether or not request has been aborted, and its // abort event handler. get signal () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // The signal getter steps are to return this’s signal. return this[kSignal] } // Returns a clone of request. clone () { if (!(this instanceof Request)) { throw new TypeError('Illegal invocation') } // 1. If this is unusable, then throw a TypeError. if (this.bodyUsed || this.body?.locked) { throw new TypeError('unusable') } // 2. Let clonedRequest be the result of cloning this’s request. const clonedRequest = cloneRequest(this[kState]); // 3. Let clonedRequestObject be the result of creating a Request object, // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. const clonedRequestObject = new Request(kInit); clonedRequestObject[kState] = clonedRequest; clonedRequestObject[kRealm] = this[kRealm]; clonedRequestObject[kHeaders] = new Headers(); clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; // 4. Make clonedRequestObject’s signal follow this’s signal. const ac = new AbortController(); if (this.signal.aborted) { ac.abort(this.signal.reason); } else { this.signal.addEventListener( 'abort', () => { ac.abort(this.signal.reason); }, { once: true } ); } clonedRequestObject[kSignal] = ac.signal; // 4. Return clonedRequestObject. return clonedRequestObject } } mixinBody(Request); function makeRequest (init) { // https://fetch.spec.whatwg.org/#requests const request = { method: 'GET', localURLsOnly: false, unsafeRequest: false, body: null, client: null, reservedClient: null, replacesClientId: '', window: 'client', keepalive: false, serviceWorkers: 'all', initiator: '', destination: '', priority: null, origin: 'client', policyContainer: 'client', referrer: 'client', referrerPolicy: '', mode: 'no-cors', useCORSPreflightFlag: false, credentials: 'same-origin', useCredentials: false, cache: 'default', redirect: 'follow', integrity: '', cryptoGraphicsNonceMetadata: '', parserMetadata: '', reloadNavigation: false, historyNavigation: false, userActivation: false, taintedOrigin: false, redirectCount: 0, responseTainting: 'basic', preventNoCacheCacheControlHeaderModification: false, done: false, timingAllowFailed: false, ...init, headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() }; request.url = request.urlList[0]; return request } // https://fetch.spec.whatwg.org/#concept-request-clone function cloneRequest (request) { // To clone a request request, run these steps: // 1. Let newRequest be a copy of request, except for its body. const newRequest = makeRequest({ ...request, body: null }); // 2. If request’s body is non-null, set newRequest’s body to the // result of cloning request’s body. if (request.body != null) { newRequest.body = cloneBody(request.body); } // 3. Return newRequest. return newRequest } Object.defineProperties(Request.prototype, { method: kEnumerableProperty, url: kEnumerableProperty, headers: kEnumerableProperty, redirect: kEnumerableProperty, clone: kEnumerableProperty, signal: kEnumerableProperty }); webidl.converters.Request = webidl.interfaceConverter( Request ); // https://fetch.spec.whatwg.org/#requestinfo webidl.converters.RequestInfo = function (V) { if (typeof V === 'string') { return webidl.converters.USVString(V) } if (V instanceof Request) { return webidl.converters.Request(V) } return webidl.converters.USVString(V) }; webidl.converters.AbortSignal = webidl.interfaceConverter( AbortSignal ); // https://fetch.spec.whatwg.org/#requestinit webidl.converters.RequestInit = webidl.dictionaryConverter([ { key: 'method', converter: webidl.converters.ByteString }, { key: 'headers', converter: webidl.converters.HeadersInit }, { key: 'body', converter: webidl.nullableConverter( webidl.converters.BodyInit ) }, { key: 'referrer', converter: webidl.converters.USVString }, { key: 'referrerPolicy', converter: webidl.converters.DOMString, // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy allowedValues: [ '', 'no-referrer', 'no-referrer-when-downgrade', 'same-origin', 'origin', 'strict-origin', 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url' ] }, { key: 'mode', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#concept-request-mode allowedValues: [ 'same-origin', 'cors', 'no-cors', 'navigate', 'websocket' ] }, { key: 'credentials', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestcredentials allowedValues: [ 'omit', 'same-origin', 'include' ] }, { key: 'cache', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestcache allowedValues: [ 'default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached' ] }, { key: 'redirect', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestredirect allowedValues: [ 'follow', 'error', 'manual' ] }, { key: 'integrity', converter: webidl.converters.DOMString }, { key: 'keepalive', converter: webidl.converters.boolean }, { key: 'signal', converter: webidl.nullableConverter( (signal) => webidl.converters.AbortSignal( signal, { strict: false } ) ) }, { key: 'window', converter: webidl.converters.any } ]); request = { Request, makeRequest }; return request; } var dataURL; var hasRequiredDataURL; function requireDataURL () { if (hasRequiredDataURL) return dataURL; hasRequiredDataURL = 1; const assert = require$$0$1; const { atob } = require$$6$1; const encoder = new TextEncoder(); // https://fetch.spec.whatwg.org/#data-url-processor /** @param {URL} dataURL */ function dataURLProcessor (dataURL) { // 1. Assert: dataURL’s scheme is "data". assert(dataURL.protocol === 'data:'); // 2. Let input be the result of running the URL // serializer on dataURL with exclude fragment // set to true. let input = URLSerializer(dataURL, true); // 3. Remove the leading "data:" string from input. input = input.slice(5); // 4. Let position point at the start of input. const position = { position: 0 }; // 5. Let mimeType be the result of collecting a // sequence of code points that are not equal // to U+002C (,), given position. let mimeType = collectASequenceOfCodePoints( (char) => char !== ',', input, position ); // 6. Strip leading and trailing ASCII whitespace // from mimeType. // Note: This will only remove U+0020 SPACE code // points, if any. // Undici implementation note: we need to store the // length because if the mimetype has spaces removed, // the wrong amount will be sliced from the input in // step #9 const mimeTypeLength = mimeType.length; mimeType = mimeType.replace(/^(\u0020)+|(\u0020)+$/g, ''); // 7. If position is past the end of input, then // return failure if (position.position >= input.length) { return 'failure' } // 8. Advance position by 1. position.position++; // 9. Let encodedBody be the remainder of input. const encodedBody = input.slice(mimeTypeLength + 1); // 10. Let body be the percent-decoding of encodedBody. /** @type {Uint8Array|string} */ let body = stringPercentDecode(encodedBody); // 11. If mimeType ends with U+003B (;), followed by // zero or more U+0020 SPACE, followed by an ASCII // case-insensitive match for "base64", then: if (/;(\u0020){0,}base64$/i.test(mimeType)) { // 1. Let stringBody be the isomorphic decode of body. const stringBody = decodeURIComponent(new TextDecoder('utf-8').decode(body)); // 2. Set body to the forgiving-base64 decode of // stringBody. body = forgivingBase64(stringBody); // 3. If body is failure, then return failure. if (body === 'failure') { return 'failure' } // 4. Remove the last 6 code points from mimeType. mimeType = mimeType.slice(0, -6); // 5. Remove trailing U+0020 SPACE code points from mimeType, // if any. mimeType = mimeType.replace(/(\u0020)+$/, ''); // 6. Remove the last U+003B (;) code point from mimeType. mimeType = mimeType.slice(0, -1); } // 12. If mimeType starts with U+003B (;), then prepend // "text/plain" to mimeType. if (mimeType.startsWith(';')) { mimeType = 'text/plain' + mimeType; } // 13. Let mimeTypeRecord be the result of parsing // mimeType. let mimeTypeRecord = parseMIMEType(mimeType); // 14. If mimeTypeRecord is failure, then set // mimeTypeRecord to text/plain;charset=US-ASCII. if (mimeTypeRecord === 'failure') { mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII'); } // 15. Return a new data: URL struct whose MIME // type is mimeTypeRecord and body is body. // https://fetch.spec.whatwg.org/#data-url-struct return { mimeType: mimeTypeRecord, body } } // https://url.spec.whatwg.org/#concept-url-serializer /** * @param {URL} url * @param {boolean} excludeFragment */ function URLSerializer (url, excludeFragment = false) { // 1. Let output be url’s scheme and U+003A (:) concatenated. let output = url.protocol; // 2. If url’s host is non-null: if (url.host.length > 0) { // 1. Append "//" to output. output += '//'; // 2. If url includes credentials, then: if (url.username.length > 0 || url.password.length > 0) { // 1. Append url’s username to output. output += url.username; // 2. If url’s password is not the empty string, then append U+003A (:), // followed by url’s password, to output. if (url.password.length > 0) { output += ':' + url.password; } // 3. Append U+0040 (@) to output. output += '@'; } // 3. Append url’s host, serialized, to output. output += decodeURIComponent(url.host); // 4. If url’s port is non-null, append U+003A (:) followed by url’s port, // serialized, to output. if (url.port.length > 0) { output += ':' + url.port; } } // 3. If url’s host is null, url does not have an opaque path, // url’s path’s size is greater than 1, and url’s path[0] // is the empty string, then append U+002F (/) followed by // U+002E (.) to output. // Note: This prevents web+demo:/.//not-a-host/ or web+demo:/path/..//not-a-host/, // when parsed and then serialized, from ending up as web+demo://not-a-host/ // (they end up as web+demo:/.//not-a-host/). // Undici implementation note: url's path[0] can never be an // empty string, so we have to slightly alter what the spec says. if ( url.host.length === 0 && url.pathname.length > 1 && url.href.slice(url.protocol.length + 1)[0] === '.' ) { output += '/.'; } // 4. Append the result of URL path serializing url to output. output += url.pathname; // 5. If url’s query is non-null, append U+003F (?), // followed by url’s query, to output. if (url.search.length > 0) { output += url.search; } // 6. If exclude fragment is false and url’s fragment is non-null, // then append U+0023 (#), followed by url’s fragment, to output. if (excludeFragment === false && url.hash.length > 0) { output += url.hash; } // 7. Return output. return output } // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points /** * @param {(char: string) => boolean} condition * @param {string} input * @param {{ position: number }} position */ function collectASequenceOfCodePoints (condition, input, position) { // 1. Let result be the empty string. let result = ''; // 2. While position doesn’t point past the end of input and the // code point at position within input meets the condition condition: while (position.position < input.length && condition(input[position.position])) { // 1. Append that code point to the end of result. result += input[position.position]; // 2. Advance position by 1. position.position++; } // 3. Return result. return result } // https://url.spec.whatwg.org/#string-percent-decode /** @param {string} input */ function stringPercentDecode (input) { // 1. Let bytes be the UTF-8 encoding of input. const bytes = encoder.encode(input); // 2. Return the percent-decoding of bytes. return percentDecode(bytes) } // https://url.spec.whatwg.org/#percent-decode /** @param {Uint8Array} input */ function percentDecode (input) { // 1. Let output be an empty byte sequence. /** @type {number[]} */ const output = []; // 2. For each byte byte in input: for (let i = 0; i < input.length; i++) { const byte = input[i]; // 1. If byte is not 0x25 (%), then append byte to output. if (byte !== 0x25) { output.push(byte); // 2. Otherwise, if byte is 0x25 (%) and the next two bytes // after byte in input are not in the ranges // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), // and 0x61 (a) to 0x66 (f), all inclusive, append byte // to output. } else if ( byte === 0x25 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) ) { output.push(0x25); // 3. Otherwise: } else { // 1. Let bytePoint be the two bytes after byte in input, // decoded, and then interpreted as hexadecimal number. const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); const bytePoint = Number.parseInt(nextTwoBytes, 16); // 2. Append a byte whose value is bytePoint to output. output.push(bytePoint); // 3. Skip the next two bytes in input. i += 2; } } // 3. Return output. return Uint8Array.from(output) } // https://mimesniff.spec.whatwg.org/#parse-a-mime-type /** @param {string} input */ function parseMIMEType (input) { // 1. Remove any leading and trailing HTTP whitespace // from input. input = input.trim(); // 2. Let position be a position variable for input, // initially pointing at the start of input. const position = { position: 0 }; // 3. Let type be the result of collecting a sequence // of code points that are not U+002F (/) from // input, given position. const type = collectASequenceOfCodePoints( (char) => char !== '/', input, position ); // 4. If type is the empty string or does not solely // contain HTTP token code points, then return failure. // https://mimesniff.spec.whatwg.org/#http-token-code-point if (type.length === 0 || !/^[!#$%&'*+-.^_|~A-z0-9]+$/.test(type)) { return 'failure' } // 5. If position is past the end of input, then return // failure if (position.position > input.length) { return 'failure' } // 6. Advance position by 1. (This skips past U+002F (/).) position.position++; // 7. Let subtype be the result of collecting a sequence of // code points that are not U+003B (;) from input, given // position. let subtype = collectASequenceOfCodePoints( (char) => char !== ';', input, position ); // 8. Remove any trailing HTTP whitespace from subtype. subtype = subtype.trim(); // 9. If subtype is the empty string or does not solely // contain HTTP token code points, then return failure. if (subtype.length === 0 || !/^[!#$%&'*+-.^_|~A-z0-9]+$/.test(subtype)) { return 'failure' } // 10. Let mimeType be a new MIME type record whose type // is type, in ASCII lowercase, and subtype is subtype, // in ASCII lowercase. // https://mimesniff.spec.whatwg.org/#mime-type const mimeType = { type: type.toLowerCase(), subtype: subtype.toLowerCase(), /** @type {Map} */ parameters: new Map() }; // 11. While position is not past the end of input: while (position.position < input.length) { // 1. Advance position by 1. (This skips past U+003B (;).) position.position++; // 2. Collect a sequence of code points that are HTTP // whitespace from input given position. collectASequenceOfCodePoints( // https://fetch.spec.whatwg.org/#http-whitespace (char) => /(\u000A|\u000D|\u0009|\u0020)/.test(char), // eslint-disable-line input, position ); // 3. Let parameterName be the result of collecting a // sequence of code points that are not U+003B (;) // or U+003D (=) from input, given position. let parameterName = collectASequenceOfCodePoints( (char) => char !== ';' && char !== '=', input, position ); // 4. Set parameterName to parameterName, in ASCII // lowercase. parameterName = parameterName.toLowerCase(); // 5. If position is not past the end of input, then: if (position.position < input.length) { // 1. If the code point at position within input is // U+003B (;), then continue. if (input[position.position] === ';') { continue } // 2. Advance position by 1. (This skips past U+003D (=).) position.position++; } // 6. If position is past the end of input, then break. if (position.position > input.length) { break } // 7. Let parameterValue be null. let parameterValue = null; // 8. If the code point at position within input is // U+0022 ("), then: if (input[position.position] === '"') { // 1. Set parameterValue to the result of collecting // an HTTP quoted string from input, given position // and the extract-value flag. // Undici implementation note: extract-value is never // defined or mentioned anywhere. parameterValue = collectAnHTTPQuotedString(input, position/*, extractValue */); // 2. Collect a sequence of code points that are not // U+003B (;) from input, given position. collectASequenceOfCodePoints( (char) => char !== ';', input, position ); // 9. Otherwise: } else { // 1. Set parameterValue to the result of collecting // a sequence of code points that are not U+003B (;) // from input, given position. parameterValue = collectASequenceOfCodePoints( (char) => char !== ';', input, position ); // 2. Remove any trailing HTTP whitespace from parameterValue. parameterValue = parameterValue.trim(); // 3. If parameterValue is the empty string, then continue. if (parameterValue.length === 0) { continue } } // 10. If all of the following are true // - parameterName is not the empty string // - parameterName solely contains HTTP token code points // - parameterValue solely contains HTTP quoted-string token code points // - mimeType’s parameters[parameterName] does not exist // then set mimeType’s parameters[parameterName] to parameterValue. if ( parameterName.length !== 0 && /^[!#$%&'*+-.^_|~A-z0-9]+$/.test(parameterName) && // https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point !/^(\u0009|\x{0020}-\x{007E}|\x{0080}-\x{00FF})+$/.test(parameterValue) && // eslint-disable-line !mimeType.parameters.has(parameterName) ) { mimeType.parameters.set(parameterName, parameterValue); } } // 12. Return mimeType. return mimeType } // https://infra.spec.whatwg.org/#forgiving-base64-decode /** @param {string} data */ function forgivingBase64 (data) { // 1. Remove all ASCII whitespace from data. data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ''); // eslint-disable-line // 2. If data’s code point length divides by 4 leaving // no remainder, then: if (data.length % 4 === 0) { // 1. If data ends with one or two U+003D (=) code points, // then remove them from data. data = data.replace(/=?=$/, ''); } // 3. If data’s code point length divides by 4 leaving // a remainder of 1, then return failure. if (data.length % 4 === 1) { return 'failure' } // 4. If data contains a code point that is not one of // U+002B (+) // U+002F (/) // ASCII alphanumeric // then return failure. if (/[^+/0-9A-Za-z]/.test(data)) { return 'failure' } const binary = atob(data); const bytes = new Uint8Array(binary.length); for (let byte = 0; byte < binary.length; byte++) { bytes[byte] = binary.charCodeAt(byte); } return bytes } // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string /** * @param {string} input * @param {{ position: number }} position * @param {boolean?} extractValue */ function collectAnHTTPQuotedString (input, position, extractValue) { // 1. Let positionStart be position. const positionStart = position.position; // 2. Let value be the empty string. let value = ''; // 3. Assert: the code point at position within input // is U+0022 ("). assert(input[position.position] === '"'); // 4. Advance position by 1. position.position++; // 5. While true: while (true) { // 1. Append the result of collecting a sequence of code points // that are not U+0022 (") or U+005C (\) from input, given // position, to value. value += collectASequenceOfCodePoints( (char) => char !== '"' && char !== '\\', input, position ); // 2. If position is past the end of input, then break. if (position.position >= input.length) { break } // 3. Let quoteOrBackslash be the code point at position within // input. const quoteOrBackslash = input[position.position]; // 4. Advance position by 1. position.position++; // 5. If quoteOrBackslash is U+005C (\), then: if (quoteOrBackslash === '\\') { // 1. If position is past the end of input, then append // U+005C (\) to value and break. if (position.position >= input.length) { value += '\\'; break } // 2. Append the code point at position within input to value. value += input[position.position]; // 3. Advance position by 1. position.position++; // 6. Otherwise: } else { // 1. Assert: quoteOrBackslash is U+0022 ("). assert(quoteOrBackslash === '"'); // 2. Break. break } } // 6. If the extract-value flag is set, then return value. if (extractValue) { return value } // 7. Return the code points from positionStart to position, // inclusive, within input. return input.slice(positionStart, position.position) } dataURL = { dataURLProcessor, URLSerializer, collectASequenceOfCodePoints, stringPercentDecode, parseMIMEType, collectAnHTTPQuotedString }; return dataURL; } var fetch_1; var hasRequiredFetch; function requireFetch () { if (hasRequiredFetch) return fetch_1; hasRequiredFetch = 1; const { Response, makeNetworkError, makeAppropriateNetworkError, filterResponse, makeResponse } = requireResponse(); const { Headers } = requireHeaders(); const { Request, makeRequest } = requireRequest(); const zlib$1 = zlib; const { bytesMatch, makePolicyContainer, clonePolicyContainer, requestBadPort, TAOCheck, appendRequestOriginHeader, responseLocationURL, requestCurrentURL, setRequestReferrerPolicyOnRedirect, tryUpgradeRequestToAPotentiallyTrustworthyURL, createOpaqueTimingInfo, appendFetchMetadata, corsCheck, crossOriginResourcePolicyCheck, determineRequestsReferrer, coarsenedSharedCurrentTime, createDeferredPromise, isBlobLike, sameOrigin, isCancelled, isAborted, isErrorLike, fullyReadBody } = requireUtil(); const { kState, kHeaders, kGuard, kRealm } = requireSymbols(); const assert = require$$0$1; const { safelyExtractBody, extractBody } = requireBody(); const { redirectStatus, nullBodyStatus, safeMethods, requestBodyHeader, subresource, DOMException } = requireConstants$1(); const { kHeadersList } = requireSymbols$1(); const EE = require$$0$2; const { Readable, pipeline } = Stream; const { isErrored, isReadable } = requireUtil$1(); const { dataURLProcessor } = requireDataURL(); const { TransformStream } = require$$10; /** @type {import('buffer').resolveObjectURL} */ let resolveObjectURL; let ReadableStream; const nodeVersion = process.versions.node.split('.'); const nodeMajor = Number(nodeVersion[0]); const nodeMinor = Number(nodeVersion[1]); class Fetch extends EE { constructor (dispatcher) { super(); this.dispatcher = dispatcher; this.connection = null; this.dump = false; this.state = 'ongoing'; } terminate (reason) { if (this.state !== 'ongoing') { return } this.state = 'terminated'; this.connection?.destroy(reason); this.emit('terminated', reason); } abort () { if (this.state !== 'ongoing') { return } const reason = new DOMException('The operation was aborted.', 'AbortError'); this.state = 'aborted'; this.connection?.destroy(reason); this.emit('terminated', reason); } } // https://fetch.spec.whatwg.org/#fetch-method async function fetch (input, init = {}) { if (arguments.length < 1) { throw new TypeError( `Failed to execute 'fetch' on 'Window': 1 argument required, but only ${arguments.length} present.` ) } // 1. Let p be a new promise. const p = createDeferredPromise(); // 2. Let requestObject be the result of invoking the initial value of // Request as constructor with input and init as arguments. If this throws // an exception, reject p with it and return p. let requestObject; try { requestObject = new Request(input, init); } catch (e) { p.reject(e); return p.promise } // 3. Let request be requestObject’s request. const request = requestObject[kState]; // 4. If requestObject’s signal’s aborted flag is set, then: if (requestObject.signal.aborted) { // 1. Abort fetch with p, request, and null. abortFetch(p, request, null); // 2. Return p. return p.promise } // 5. Let globalObject be request’s client’s global object. const globalObject = request.client.globalObject; // 6. If globalObject is a ServiceWorkerGlobalScope object, then set // request’s service-workers mode to "none". if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') { request.serviceWorkers = 'none'; } // 7. Let responseObject be null. let responseObject = null; // 8. Let relevantRealm be this’s relevant Realm. const relevantRealm = null; // 9. Let locallyAborted be false. let locallyAborted = false; // 10. Let controller be null. let controller = null; // 11. Add the following abort steps to requestObject’s signal: requestObject.signal.addEventListener( 'abort', () => { // 1. Set locallyAborted to true. locallyAborted = true; // 2. Abort fetch with p, request, and responseObject. abortFetch(p, request, responseObject); // 3. If controller is not null, then abort controller. if (controller != null) { controller.abort(); } }, { once: true } ); // 12. Let handleFetchDone given response response be to finalize and // report timing with response, globalObject, and "fetch". const handleFetchDone = (response) => finalizeAndReportTiming(response, 'fetch'); // 13. Set controller to the result of calling fetch given request, // with processResponseEndOfBody set to handleFetchDone, and processResponse // given response being these substeps: const processResponse = (response) => { // 1. If locallyAborted is true, terminate these substeps. if (locallyAborted) { return } // 2. If response’s aborted flag is set, then abort fetch with p, // request, and responseObject, and terminate these substeps. if (response.aborted) { abortFetch(p, request, responseObject); return } // 3. If response is a network error, then reject p with a TypeError // and terminate these substeps. if (response.type === 'error') { p.reject( Object.assign(new TypeError('fetch failed'), { cause: response.error }) ); return } // 4. Set responseObject to the result of creating a Response object, // given response, "immutable", and relevantRealm. responseObject = new Response(); responseObject[kState] = response; responseObject[kRealm] = relevantRealm; responseObject[kHeaders][kHeadersList] = response.headersList; responseObject[kHeaders][kGuard] = 'immutable'; responseObject[kHeaders][kRealm] = relevantRealm; // 5. Resolve p with responseObject. p.resolve(responseObject); }; controller = fetching({ request, processResponseEndOfBody: handleFetchDone, processResponse, dispatcher: this // undici }); // 14. Return p. return p.promise } // https://fetch.spec.whatwg.org/#finalize-and-report-timing function finalizeAndReportTiming (response, initiatorType = 'other') { // 1. If response is an aborted network error, then return. if (response.type === 'error' && response.aborted) { return } // 2. If response’s URL list is null or empty, then return. if (!response.urlList?.length) { return } // 3. Let originalURL be response’s URL list[0]. const originalURL = response.urlList[0]; // 4. Let timingInfo be response’s timing info. let timingInfo = response.timingInfo; // 5. Let cacheState be response’s cache state. let cacheState = response.cacheState; // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return. if (!/^https?:/.test(originalURL.protocol)) { return } // 7. If timingInfo is null, then return. if (timingInfo === null) { return } // 8. If response’s timing allow passed flag is not set, then: if (!timingInfo.timingAllowPassed) { // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. timingInfo = createOpaqueTimingInfo({ startTime: timingInfo.startTime }); // 2. Set cacheState to the empty string. cacheState = ''; } // 9. Set timingInfo’s end time to the coarsened shared current time // given global’s relevant settings object’s cross-origin isolated // capability. // TODO: given global’s relevant settings object’s cross-origin isolated // capability? response.timingInfo.endTime = coarsenedSharedCurrentTime(); // 10. Set response’s timing info to timingInfo. response.timingInfo = timingInfo; // 11. Mark resource timing for timingInfo, originalURL, initiatorType, // global, and cacheState. markResourceTiming( timingInfo, originalURL, initiatorType, globalThis, cacheState ); } // https://w3c.github.io/resource-timing/#dfn-mark-resource-timing function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { if (nodeMajor >= 18 && nodeMinor >= 2) { performance.markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState); } } // https://fetch.spec.whatwg.org/#abort-fetch function abortFetch (p, request, responseObject) { // 1. Let error be an "AbortError" DOMException. const error = new DOMException('The operation was aborted.', 'AbortError'); // 2. Reject promise with error. p.reject(error); // 3. If request’s body is not null and is readable, then cancel request’s // body with error. if (request.body != null && isReadable(request.body?.stream)) { request.body.stream.cancel(error).catch((err) => { if (err.code === 'ERR_INVALID_STATE') { // Node bug? return } throw err }); } // 4. If responseObject is null, then return. if (responseObject == null) { return } // 5. Let response be responseObject’s response. const response = responseObject[kState]; // 6. If response’s body is not null and is readable, then error response’s // body with error. if (response.body != null && isReadable(response.body?.stream)) { response.body.stream.cancel(error).catch((err) => { if (err.code === 'ERR_INVALID_STATE') { // Node bug? return } throw err }); } } // https://fetch.spec.whatwg.org/#fetching function fetching ({ request, processRequestBodyChunkLength, processRequestEndOfBody, processResponse, processResponseEndOfBody, processResponseConsumeBody, useParallelQueue = false, dispatcher // undici }) { // 1. Let taskDestination be null. let taskDestination = null; // 2. Let crossOriginIsolatedCapability be false. let crossOriginIsolatedCapability = false; // 3. If request’s client is non-null, then: if (request.client != null) { // 1. Set taskDestination to request’s client’s global object. taskDestination = request.client.globalObject; // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin // isolated capability. crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; } // 4. If useParallelQueue is true, then set taskDestination to the result of // starting a new parallel queue. // TODO // 5. Let timingInfo be a new fetch timing info whose start time and // post-redirect start time are the coarsened shared current time given // crossOriginIsolatedCapability. const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); const timingInfo = createOpaqueTimingInfo({ startTime: currenTime }); // 6. Let fetchParams be a new fetch params whose // request is request, // timing info is timingInfo, // process request body chunk length is processRequestBodyChunkLength, // process request end-of-body is processRequestEndOfBody, // process response is processResponse, // process response consume body is processResponseConsumeBody, // process response end-of-body is processResponseEndOfBody, // task destination is taskDestination, // and cross-origin isolated capability is crossOriginIsolatedCapability. const fetchParams = { controller: new Fetch(dispatcher), request, timingInfo, processRequestBodyChunkLength, processRequestEndOfBody, processResponse, processResponseConsumeBody, processResponseEndOfBody, taskDestination, crossOriginIsolatedCapability }; // 7. If request’s body is a byte sequence, then set request’s body to the // first return value of safely extracting request’s body. // NOTE: Since fetching is only called from fetch, body should already be // extracted. assert(!request.body || request.body.stream); // 8. If request’s window is "client", then set request’s window to request’s // client, if request’s client’s global object is a Window object; otherwise // "no-window". if (request.window === 'client') { // TODO: What if request.client is null? request.window = request.client?.globalObject?.constructor?.name === 'Window' ? request.client : 'no-window'; } // 9. If request’s origin is "client", then set request’s origin to request’s // client’s origin. if (request.origin === 'client') { // TODO: What if request.client is null? request.origin = request.client?.origin; } // 10. If all of the following conditions are true: // TODO // 11. If request’s policy container is "client", then: if (request.policyContainer === 'client') { // 1. If request’s client is non-null, then set request’s policy // container to a clone of request’s client’s policy container. [HTML] if (request.client != null) { request.policyContainer = clonePolicyContainer( request.client.policyContainer ); } else { // 2. Otherwise, set request’s policy container to a new policy // container. request.policyContainer = makePolicyContainer(); } } // 12. If request’s header list does not contain `Accept`, then: if (!request.headersList.has('accept')) { // 1. Let value be `*/*`. const value = '*/*'; // 2. A user agent should set value to the first matching statement, if // any, switching on request’s destination: // "document" // "frame" // "iframe" // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` // "image" // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5` // "style" // `text/css,*/*;q=0.1` // TODO // 3. Append `Accept`/value to request’s header list. request.headersList.append('accept', value); } // 13. If request’s header list does not contain `Accept-Language`, then // user agents should append `Accept-Language`/an appropriate value to // request’s header list. if (!request.headersList.has('accept-language')) { request.headersList.append('accept-language', '*'); } // 14. If request’s priority is null, then use request’s initiator and // destination appropriately in setting request’s priority to a // user-agent-defined object. if (request.priority === null) ; // 15. If request is a subresource request, then: if (subresource.includes(request.destination)) ; // 16. Run main fetch given fetchParams. mainFetch(fetchParams) .catch(err => { fetchParams.controller.terminate(err); }); // 17. Return fetchParam's controller return fetchParams.controller } // https://fetch.spec.whatwg.org/#concept-main-fetch async function mainFetch (fetchParams, recursive = false) { // 1. Let request be fetchParams’s request. const request = fetchParams.request; // 2. Let response be null. let response = null; // 3. If request’s local-URLs-only flag is set and request’s current URL is // not local, then set response to a network error. if ( request.localURLsOnly && !/^(about|blob|data):/.test(requestCurrentURL(request).protocol) ) { response = makeNetworkError('local URLs only'); } // 4. Run report Content Security Policy violations for request. // TODO // 5. Upgrade request to a potentially trustworthy URL, if appropriate. tryUpgradeRequestToAPotentiallyTrustworthyURL(request); // 6. If should request be blocked due to a bad port, should fetching request // be blocked as mixed content, or should request be blocked by Content // Security Policy returns blocked, then set response to a network error. if (requestBadPort(request) === 'blocked') { response = makeNetworkError('bad port'); } // TODO: should fetching request be blocked as mixed content? // TODO: should request be blocked by Content Security Policy? // 7. If request’s referrer policy is the empty string, then set request’s // referrer policy to request’s policy container’s referrer policy. if (request.referrerPolicy === '') { request.referrerPolicy = request.policyContainer.referrerPolicy; } // 8. If request’s referrer is not "no-referrer", then set request’s // referrer to the result of invoking determine request’s referrer. if (request.referrer !== 'no-referrer') { request.referrer = determineRequestsReferrer(request); } // 9. Set request’s current URL’s scheme to "https" if all of the following // conditions are true: // - request’s current URL’s scheme is "http" // - request’s current URL’s host is a domain // - Matching request’s current URL’s host per Known HSTS Host Domain Name // Matching results in either a superdomain match with an asserted // includeSubDomains directive or a congruent match (with or without an // asserted includeSubDomains directive). [HSTS] // TODO // 10. If recursive is false, then run the remaining steps in parallel. // TODO // 11. If response is null, then set response to the result of running // the steps corresponding to the first matching statement: if (response === null) { response = await (async () => { const currentURL = requestCurrentURL(request); if ( // - request’s current URL’s origin is same origin with request’s origin, // and request’s response tainting is "basic" (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || // request’s current URL’s scheme is "data" (currentURL.protocol === 'data:') || // - request’s mode is "navigate" or "websocket" (request.mode === 'navigate' || request.mode === 'websocket') ) { // 1. Set request’s response tainting to "basic". request.responseTainting = 'basic'; // 2. Return the result of running scheme fetch given fetchParams. return await schemeFetch(fetchParams) } // request’s mode is "same-origin" if (request.mode === 'same-origin') { // 1. Return a network error. return makeNetworkError('request mode cannot be "same-origin"') } // request’s mode is "no-cors" if (request.mode === 'no-cors') { // 1. If request’s redirect mode is not "follow", then return a network // error. if (request.redirect !== 'follow') { return makeNetworkError( 'redirect mode cannot be "follow" for "no-cors" request' ) } // 2. Set request’s response tainting to "opaque". request.responseTainting = 'opaque'; // 3. Return the result of running scheme fetch given fetchParams. return await schemeFetch(fetchParams) } // request’s current URL’s scheme is not an HTTP(S) scheme if (!/^https?:/.test(requestCurrentURL(request).protocol)) { // Return a network error. return makeNetworkError('URL scheme must be a HTTP(S) scheme') } // - request’s use-CORS-preflight flag is set // - request’s unsafe-request flag is set and either request’s method is // not a CORS-safelisted method or CORS-unsafe request-header names with // request’s header list is not empty // 1. Set request’s response tainting to "cors". // 2. Let corsWithPreflightResponse be the result of running HTTP fetch // given fetchParams and true. // 3. If corsWithPreflightResponse is a network error, then clear cache // entries using request. // 4. Return corsWithPreflightResponse. // TODO // Otherwise // 1. Set request’s response tainting to "cors". request.responseTainting = 'cors'; // 2. Return the result of running HTTP fetch given fetchParams. return await httpFetch(fetchParams) })(); } // 12. If recursive is true, then return response. if (recursive) { return response } // 13. If response is not a network error and response is not a filtered // response, then: if (response.status !== 0 && !response.internalResponse) { // If request’s response tainting is "cors", then: if (request.responseTainting === 'cors') ; // Set response to the following filtered response with response as its // internal response, depending on request’s response tainting: if (request.responseTainting === 'basic') { response = filterResponse(response, 'basic'); } else if (request.responseTainting === 'cors') { response = filterResponse(response, 'cors'); } else if (request.responseTainting === 'opaque') { response = filterResponse(response, 'opaque'); } else { assert(false); } } // 14. Let internalResponse be response, if response is a network error, // and response’s internal response otherwise. let internalResponse = response.status === 0 ? response : response.internalResponse; // 15. If internalResponse’s URL list is empty, then set it to a clone of // request’s URL list. if (internalResponse.urlList.length === 0) { internalResponse.urlList.push(...request.urlList); } // 16. If request’s timing allow failed flag is unset, then set // internalResponse’s timing allow passed flag. if (!request.timingAllowFailed) { response.timingAllowPassed = true; } // 17. If response is not a network error and any of the following returns // blocked // - should internalResponse to request be blocked as mixed content // - should internalResponse to request be blocked by Content Security Policy // - should internalResponse to request be blocked due to its MIME type // - should internalResponse to request be blocked due to nosniff // TODO // 18. If response’s type is "opaque", internalResponse’s status is 206, // internalResponse’s range-requested flag is set, and request’s header // list does not contain `Range`, then set response and internalResponse // to a network error. if ( response.type === 'opaque' && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.has('range') ) { response = internalResponse = makeNetworkError(); } // 19. If response is not a network error and either request’s method is // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status, // set internalResponse’s body to null and disregard any enqueuing toward // it (if any). if ( response.status !== 0 && (request.method === 'HEAD' || request.method === 'CONNECT' || nullBodyStatus.includes(internalResponse.status)) ) { internalResponse.body = null; fetchParams.controller.dump = true; } // 20. If request’s integrity metadata is not the empty string, then: if (request.integrity) { // 1. Let processBodyError be this step: run fetch finale given fetchParams // and a network error. const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); // 2. If request’s response tainting is "opaque", or response’s body is null, // then run processBodyError and abort these steps. if (request.responseTainting === 'opaque' || response.body == null) { processBodyError(response.error); return } // 3. Let processBody given bytes be these steps: const processBody = (bytes) => { // 1. If bytes do not match request’s integrity metadata, // then run processBodyError and abort these steps. [SRI] if (!bytesMatch(bytes, request.integrity)) { processBodyError('integrity mismatch'); return } // 2. Set response’s body to the first return value of safely // extracting bytes. response.body = safelyExtractBody(bytes)[0]; // 3. Run fetch finale given fetchParams and response. fetchFinale(fetchParams, response); }; // 4. Fully read response’s body given processBody and processBodyError. await fullyReadBody(response.body, processBody, processBodyError); } else { // 21. Otherwise, run fetch finale given fetchParams and response. fetchFinale(fetchParams, response); } } // https://fetch.spec.whatwg.org/#concept-scheme-fetch // given a fetch params fetchParams async function schemeFetch (fetchParams) { // let request be fetchParams’s request const { request } = fetchParams; const { protocol: scheme, pathname: path } = requestCurrentURL(request); // switch on request’s current URL’s scheme, and run the associated steps: switch (scheme) { case 'about:': { // If request’s current URL’s path is the string "blank", then return a new response // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) », // and body is the empty byte sequence. if (path === 'blank') { const resp = makeResponse({ statusText: 'OK', headersList: [ ['content-type', 'text/html;charset=utf-8'] ] }); resp.urlList = [new URL('about:blank')]; return resp } // Otherwise, return a network error. return makeNetworkError('invalid path called') } case 'blob:': { resolveObjectURL = resolveObjectURL || require$$6$1.resolveObjectURL; // 1. Run these steps, but abort when the ongoing fetch is terminated: // 1. Let blob be request’s current URL’s blob URL entry’s object. // https://w3c.github.io/FileAPI/#blob-url-entry // P.S. Thank God this method is available in node. const currentURL = requestCurrentURL(request); // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 // Buffer.resolveObjectURL does not ignore URL queries. if (currentURL.search.length !== 0) { return makeNetworkError('NetworkError when attempting to fetch resource.') } const blob = resolveObjectURL(currentURL.toString()); // 2. If request’s method is not `GET` or blob is not a Blob object, then return a network error. [FILEAPI] if (request.method !== 'GET' || !isBlobLike(blob)) { return makeNetworkError('invalid method') } // 3. Let response be a new response whose status message is `OK`. const response = makeResponse({ statusText: 'OK', urlList: [currentURL] }); // 4. Append (`Content-Length`, blob’s size attribute value) to response’s header list. response.headersList.set('content-length', `${blob.size}`); // 5. Append (`Content-Type`, blob’s type attribute value) to response’s header list. response.headersList.set('content-type', blob.type); // 6. Set response’s body to the result of performing the read operation on blob. // TODO (fix): This needs to read? response.body = extractBody(blob)[0]; // 7. Return response. return response // 2. If aborted, then return the appropriate network error for fetchParams. // TODO } case 'data:': { // 1. Let dataURLStruct be the result of running the // data: URL processor on request’s current URL. const currentURL = requestCurrentURL(request); const dataURLStruct = dataURLProcessor(currentURL); // 2. If dataURLStruct is failure, then return a // network error. if (dataURLStruct === 'failure') { return makeNetworkError('failed to fetch the data URL') } // 3. Let mimeType be dataURLStruct’s MIME type, serialized. const { mimeType } = dataURLStruct; /** @type {string} */ let contentType = `${mimeType.type}/${mimeType.subtype}`; const contentTypeParams = []; if (mimeType.parameters.size > 0) { contentType += ';'; } for (const [key, value] of mimeType.parameters) { if (value.length > 0) { contentTypeParams.push(`${key}=${value}`); } else { contentTypeParams.push(key); } } contentType += contentTypeParams.join(','); // 4. Return a response whose status message is `OK`, // header list is « (`Content-Type`, mimeType) », // and body is dataURLStruct’s body. return makeResponse({ statusText: 'OK', headersList: [ ['content-type', contentType] ], body: extractBody(dataURLStruct.body)[0] }) } case 'file:': { // For now, unfortunate as it is, file URLs are left as an exercise for the reader. // When in doubt, return a network error. return makeNetworkError('not implemented... yet...') } case 'http:': case 'https:': { // Return the result of running HTTP fetch given fetchParams. return await httpFetch(fetchParams) .catch((err) => makeNetworkError(err)) } default: { return makeNetworkError('unknown scheme') } } } // https://fetch.spec.whatwg.org/#finalize-response function finalizeResponse (fetchParams, response) { // 1. Set fetchParams’s request’s done flag. fetchParams.request.done = true; // 2, If fetchParams’s process response done is not null, then queue a fetch // task to run fetchParams’s process response done given response, with // fetchParams’s task destination. if (fetchParams.processResponseDone != null) { queueMicrotask(() => fetchParams.processResponseDone(response)); } } // https://fetch.spec.whatwg.org/#fetch-finale async function fetchFinale (fetchParams, response) { // 1. If response is a network error, then: if (response.type === 'error') { // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». response.urlList = [fetchParams.request.urlList[0]]; // 2. Set response’s timing info to the result of creating an opaque timing // info for fetchParams’s timing info. response.timingInfo = createOpaqueTimingInfo({ startTime: fetchParams.timingInfo.startTime }); } // 2. Let processResponseEndOfBody be the following steps: const processResponseEndOfBody = () => { // 1. Set fetchParams’s request’s done flag. fetchParams.request.done = true; // If fetchParams’s process response end-of-body is not null, // then queue a fetch task to run fetchParams’s process response // end-of-body given response with fetchParams’s task destination. if (fetchParams.processResponseEndOfBody != null) { queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); } }; // 3. If fetchParams’s process response is non-null, then queue a fetch task // to run fetchParams’s process response given response, with fetchParams’s // task destination. if (fetchParams.processResponse != null) { queueMicrotask(() => fetchParams.processResponse(response)); } // 4. If response’s body is null, then run processResponseEndOfBody. if (response.body == null) { processResponseEndOfBody(); } else { // 5. Otherwise: // 1. Let transformStream be a new a TransformStream. // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, // enqueues chunk in transformStream. const identityTransformAlgorithm = (chunk, controller) => { controller.enqueue(chunk); }; // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm // and flushAlgorithm set to processResponseEndOfBody. const transformStream = new TransformStream({ start () {}, transform: identityTransformAlgorithm, flush: processResponseEndOfBody }); // 4. Set response’s body to the result of piping response’s body through transformStream. response.body = { stream: response.body.stream.pipeThrough(transformStream) }; } // 6. If fetchParams’s process response consume body is non-null, then: if (fetchParams.processResponseConsumeBody != null) { // 1. Let processBody given nullOrBytes be this step: run fetchParams’s // process response consume body given response and nullOrBytes. const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); // 2. Let processBodyError be this step: run fetchParams’s process // response consume body given response and failure. const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); // 3. If response’s body is null, then queue a fetch task to run processBody // given null, with fetchParams’s task destination. if (response.body == null) { queueMicrotask(() => processBody(null)); } else { // 4. Otherwise, fully read response’s body given processBody, processBodyError, // and fetchParams’s task destination. await fullyReadBody(response.body, processBody, processBodyError); } } } // https://fetch.spec.whatwg.org/#http-fetch async function httpFetch (fetchParams) { // 1. Let request be fetchParams’s request. const request = fetchParams.request; // 2. Let response be null. let response = null; // 3. Let actualResponse be null. let actualResponse = null; // 4. Let timingInfo be fetchParams’s timing info. const timingInfo = fetchParams.timingInfo; // 5. If request’s service-workers mode is "all", then: if (request.serviceWorkers === 'all') ; // 6. If response is null, then: if (response === null) { // 1. If makeCORSPreflight is true and one of these conditions is true: // TODO // 2. If request’s redirect mode is "follow", then set request’s // service-workers mode to "none". if (request.redirect === 'follow') { request.serviceWorkers = 'none'; } // 3. Set response and actualResponse to the result of running // HTTP-network-or-cache fetch given fetchParams. actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); // 4. If request’s response tainting is "cors" and a CORS check // for request and response returns failure, then return a network error. if ( request.responseTainting === 'cors' && corsCheck(request, response) === 'failure' ) { return makeNetworkError('cors failure') } // 5. If the TAO check for request and response returns failure, then set // request’s timing allow failed flag. if (TAOCheck(request, response) === 'failure') { request.timingAllowFailed = true; } } // 7. If either request’s response tainting or response’s type // is "opaque", and the cross-origin resource policy check with // request’s origin, request’s client, request’s destination, // and actualResponse returns blocked, then return a network error. if ( (request.responseTainting === 'opaque' || response.type === 'opaque') && crossOriginResourcePolicyCheck( request.origin, request.client, request.destination, actualResponse ) === 'blocked' ) { return makeNetworkError('blocked') } // 8. If actualResponse’s status is a redirect status, then: if (redirectStatus.includes(actualResponse.status)) { // 1. If actualResponse’s status is not 303, request’s body is not null, // and the connection uses HTTP/2, then user agents may, and are even // encouraged to, transmit an RST_STREAM frame. // See, https://github.com/whatwg/fetch/issues/1288 fetchParams.controller.connection.destroy(); // 2. Switch on request’s redirect mode: if (request.redirect === 'error') { // Set response to a network error. response = makeNetworkError('unexpected redirect'); } else if (request.redirect === 'manual') { // Set response to an opaque-redirect filtered response whose internal // response is actualResponse. // NOTE(spec): On the web this would return an `opaqueredirect` response, // but that doesn't make sense server side. // See https://github.com/nodejs/undici/issues/1193. response = actualResponse; } else if (request.redirect === 'follow') { // Set response to the result of running HTTP-redirect fetch given // fetchParams and response. response = await httpRedirectFetch(fetchParams, response); } else { assert(false); } } // 9. Set response’s timing info to timingInfo. response.timingInfo = timingInfo; // 10. Return response. return response } // https://fetch.spec.whatwg.org/#http-redirect-fetch async function httpRedirectFetch (fetchParams, response) { // 1. Let request be fetchParams’s request. const request = fetchParams.request; // 2. Let actualResponse be response, if response is not a filtered response, // and response’s internal response otherwise. const actualResponse = response.internalResponse ? response.internalResponse : response; // 3. Let locationURL be actualResponse’s location URL given request’s current // URL’s fragment. let locationURL; try { locationURL = responseLocationURL( actualResponse, requestCurrentURL(request).hash ); // 4. If locationURL is null, then return response. if (locationURL == null) { return response } } catch (err) { // 5. If locationURL is failure, then return a network error. return makeNetworkError(err) } // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network // error. if (!/^https?:/.test(locationURL.protocol)) { return makeNetworkError('URL scheme must be a HTTP(S) scheme') } // 7. If request’s redirect count is twenty, return a network error. if (request.redirectCount === 20) { return makeNetworkError('redirect count exceeded') } // 8. Increase request’s redirect count by one. request.redirectCount += 1; // 9. If request’s mode is "cors", locationURL includes credentials, and // request’s origin is not same origin with locationURL’s origin, then return // a network error. if ( request.mode === 'cors' && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL) ) { return makeNetworkError('cross origin not allowed for request mode "cors"') } // 10. If request’s response tainting is "cors" and locationURL includes // credentials, then return a network error. if ( request.responseTainting === 'cors' && (locationURL.username || locationURL.password) ) { return makeNetworkError( 'URL cannot contain credentials for request mode "cors"' ) } // 11. If actualResponse’s status is not 303, request’s body is non-null, // and request’s body’s source is null, then return a network error. if ( actualResponse.status !== 303 && request.body != null && request.body.source == null ) { return makeNetworkError() } // 12. If one of the following is true // - actualResponse’s status is 301 or 302 and request’s method is `POST` // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD` if ( ([301, 302].includes(actualResponse.status) && request.method === 'POST') || (actualResponse.status === 303 && !['GET', 'HEAD'].includes(request.method)) ) { // then: // 1. Set request’s method to `GET` and request’s body to null. request.method = 'GET'; request.body = null; // 2. For each headerName of request-body-header name, delete headerName from // request’s header list. for (const headerName of requestBodyHeader) { request.headersList.delete(headerName); } } // 13. If request’s body is non-null, then set request’s body to the first return // value of safely extracting request’s body’s source. if (request.body != null) { assert(request.body.source); request.body = safelyExtractBody(request.body.source)[0]; } // 14. Let timingInfo be fetchParams’s timing info. const timingInfo = fetchParams.timingInfo; // 15. Set timingInfo’s redirect end time and post-redirect start time to the // coarsened shared current time given fetchParams’s cross-origin isolated // capability. timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); // 16. If timingInfo’s redirect start time is 0, then set timingInfo’s // redirect start time to timingInfo’s start time. if (timingInfo.redirectStartTime === 0) { timingInfo.redirectStartTime = timingInfo.startTime; } // 17. Append locationURL to request’s URL list. request.urlList.push(locationURL); // 18. Invoke set request’s referrer policy on redirect on request and // actualResponse. setRequestReferrerPolicyOnRedirect(request, actualResponse); // 19. Return the result of running main fetch given fetchParams and true. return mainFetch(fetchParams, true) } // https://fetch.spec.whatwg.org/#http-network-or-cache-fetch async function httpNetworkOrCacheFetch ( fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false ) { // 1. Let request be fetchParams’s request. const request = fetchParams.request; // 2. Let httpFetchParams be null. let httpFetchParams = null; // 3. Let httpRequest be null. let httpRequest = null; // 4. Let response be null. let response = null; // 8. Run these steps, but abort when the ongoing fetch is terminated: // 1. If request’s window is "no-window" and request’s redirect mode is // "error", then set httpFetchParams to fetchParams and httpRequest to // request. if (request.window === 'no-window' && request.redirect === 'error') { httpFetchParams = fetchParams; httpRequest = request; } else { // Otherwise: // 1. Set httpRequest to a clone of request. httpRequest = makeRequest(request); // 2. Set httpFetchParams to a copy of fetchParams. httpFetchParams = { ...fetchParams }; // 3. Set httpFetchParams’s request to httpRequest. httpFetchParams.request = httpRequest; } // 3. Let includeCredentials be true if one of const includeCredentials = request.credentials === 'include' || (request.credentials === 'same-origin' && request.responseTainting === 'basic'); // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s // body is non-null; otherwise null. const contentLength = httpRequest.body ? httpRequest.body.length : null; // 5. Let contentLengthHeaderValue be null. let contentLengthHeaderValue = null; // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or // `PUT`, then set contentLengthHeaderValue to `0`. if ( httpRequest.body == null && ['POST', 'PUT'].includes(httpRequest.method) ) { contentLengthHeaderValue = '0'; } // 7. If contentLength is non-null, then set contentLengthHeaderValue to // contentLength, serialized and isomorphic encoded. if (contentLength != null) { // TODO: isomorphic encoded contentLengthHeaderValue = String(contentLength); } // 8. If contentLengthHeaderValue is non-null, then append // `Content-Length`/contentLengthHeaderValue to httpRequest’s header // list. if (contentLengthHeaderValue != null) { httpRequest.headersList.append('content-length', contentLengthHeaderValue); } // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, // contentLengthHeaderValue) to httpRequest’s header list. // 10. If contentLength is non-null and httpRequest’s keepalive is true, // then: if (contentLength != null && httpRequest.keepalive) ; // 11. If httpRequest’s referrer is a URL, then append // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, // to httpRequest’s header list. if (httpRequest.referrer instanceof URL) { // TODO: isomorphic encoded httpRequest.headersList.append('referer', httpRequest.referrer.href); } // 12. Append a request `Origin` header for httpRequest. appendRequestOriginHeader(httpRequest); // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA] appendFetchMetadata(httpRequest); // 14. If httpRequest’s header list does not contain `User-Agent`, then // user agents should append `User-Agent`/default `User-Agent` value to // httpRequest’s header list. if (!httpRequest.headersList.has('user-agent')) { httpRequest.headersList.append('user-agent', 'undici'); } // 15. If httpRequest’s cache mode is "default" and httpRequest’s header // list contains `If-Modified-Since`, `If-None-Match`, // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set // httpRequest’s cache mode to "no-store". if ( httpRequest.cache === 'default' && (httpRequest.headersList.has('if-modified-since') || httpRequest.headersList.has('if-none-match') || httpRequest.headersList.has('if-unmodified-since') || httpRequest.headersList.has('if-match') || httpRequest.headersList.has('if-range')) ) { httpRequest.cache = 'no-store'; } // 16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent // no-cache cache-control header modification flag is unset, and // httpRequest’s header list does not contain `Cache-Control`, then append // `Cache-Control`/`max-age=0` to httpRequest’s header list. if ( httpRequest.cache === 'no-cache' && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.has('cache-control') ) { httpRequest.headersList.append('cache-control', 'max-age=0'); } // 17. If httpRequest’s cache mode is "no-store" or "reload", then: if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { // 1. If httpRequest’s header list does not contain `Pragma`, then append // `Pragma`/`no-cache` to httpRequest’s header list. if (!httpRequest.headersList.has('pragma')) { httpRequest.headersList.append('pragma', 'no-cache'); } // 2. If httpRequest’s header list does not contain `Cache-Control`, // then append `Cache-Control`/`no-cache` to httpRequest’s header list. if (!httpRequest.headersList.has('cache-control')) { httpRequest.headersList.append('cache-control', 'no-cache'); } } // 18. If httpRequest’s header list contains `Range`, then append // `Accept-Encoding`/`identity` to httpRequest’s header list. if (httpRequest.headersList.has('range')) { httpRequest.headersList.append('accept-encoding', 'identity'); } // 19. Modify httpRequest’s header list per HTTP. Do not append a given // header if httpRequest’s header list contains that header’s name. // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 if (!httpRequest.headersList.has('accept-encoding')) { if (/^https:/.test(requestCurrentURL(httpRequest).protocol)) { httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate'); } else { httpRequest.headersList.append('accept-encoding', 'gzip, deflate'); } } // 21. If there’s a proxy-authentication entry, use it as appropriate. // TODO: proxy-authentication // 22. Set httpCache to the result of determining the HTTP cache // partition, given httpRequest. // TODO: cache // 23. If httpCache is null, then set httpRequest’s cache mode to // "no-store". { httpRequest.cache = 'no-store'; } // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", // then: if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') ; // 9. If aborted, then return the appropriate network error for fetchParams. // TODO // 10. If response is null, then: if (response == null) { // 1. If httpRequest’s cache mode is "only-if-cached", then return a // network error. if (httpRequest.mode === 'only-if-cached') { return makeNetworkError('only if cached') } // 2. Let forwardResponse be the result of running HTTP-network fetch // given httpFetchParams, includeCredentials, and isNewConnectionFetch. const forwardResponse = await httpNetworkFetch( httpFetchParams, includeCredentials, isNewConnectionFetch ); // 3. If httpRequest’s method is unsafe and forwardResponse’s status is // in the range 200 to 399, inclusive, invalidate appropriate stored // responses in httpCache, as per the "Invalidation" chapter of HTTP // Caching, and set storedResponse to null. [HTTP-CACHING] if ( !safeMethods.includes(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399 ) ; // 5. If response is null, then: if (response == null) { // 1. Set response to forwardResponse. response = forwardResponse; // 2. Store httpRequest and forwardResponse in httpCache, as per the // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING] // TODO: cache } } // 11. Set response’s URL list to a clone of httpRequest’s URL list. response.urlList = [...httpRequest.urlList]; // 12. If httpRequest’s header list contains `Range`, then set response’s // range-requested flag. if (httpRequest.headersList.has('range')) { response.rangeRequested = true; } // 13. Set response’s request-includes-credentials to includeCredentials. response.requestIncludesCredentials = includeCredentials; // 14. If response’s status is 401, httpRequest’s response tainting is not // "cors", includeCredentials is true, and request’s window is an environment // settings object, then: // TODO // 15. If response’s status is 407, then: if (response.status === 407) { // 1. If request’s window is "no-window", then return a network error. if (request.window === 'no-window') { return makeNetworkError() } // 2. ??? // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams. if (isCancelled(fetchParams)) { return makeAppropriateNetworkError(fetchParams) } // 4. Prompt the end user as appropriate in request’s window and store // the result as a proxy-authentication entry. [HTTP-AUTH] // TODO: Invoke some kind of callback? // 5. Set response to the result of running HTTP-network-or-cache fetch given // fetchParams. // TODO return makeNetworkError('proxy authentication required') } // 16. If all of the following are true if ( // response’s status is 421 response.status === 421 && // isNewConnectionFetch is false !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null (request.body == null || request.body.source != null) ) { // then: // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. if (isCancelled(fetchParams)) { return makeAppropriateNetworkError(fetchParams) } // 2. Set response to the result of running HTTP-network-or-cache // fetch given fetchParams, isAuthenticationFetch, and true. // TODO (spec): The spec doesn't specify this but we need to cancel // the active response before we can start a new one. // https://github.com/whatwg/fetch/issues/1293 fetchParams.controller.connection.destroy(); response = await httpNetworkOrCacheFetch( fetchParams, isAuthenticationFetch, true ); } // 18. Return response. return response } // https://fetch.spec.whatwg.org/#http-network-fetch async function httpNetworkFetch ( fetchParams, includeCredentials = false, forceNewConnection = false ) { assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); fetchParams.controller.connection = { abort: null, destroyed: false, destroy (err) { if (!this.destroyed) { this.destroyed = true; this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')); } } }; // 1. Let request be fetchParams’s request. const request = fetchParams.request; // 2. Let response be null. let response = null; // 3. Let timingInfo be fetchParams’s timing info. const timingInfo = fetchParams.timingInfo; // 5. If httpCache is null, then set request’s cache mode to "no-store". { request.cache = 'no-store'; } // 8. Switch on request’s mode: if (request.mode === 'websocket') ; // 9. Run these steps, but abort when the ongoing fetch is terminated: // 1. If connection is failure, then return a network error. // 2. Set timingInfo’s final connection timing info to the result of // calling clamp and coarsen connection timing info with connection’s // timing info, timingInfo’s post-redirect start time, and fetchParams’s // cross-origin isolated capability. // 3. If connection is not an HTTP/2 connection, request’s body is non-null, // and request’s body’s source is null, then append (`Transfer-Encoding`, // `chunked`) to request’s header list. // 4. Set timingInfo’s final network-request start time to the coarsened // shared current time given fetchParams’s cross-origin isolated // capability. // 5. Set response to the result of making an HTTP request over connection // using request with the following caveats: // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS] // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH] // - If request’s body is non-null, and request’s body’s source is null, // then the user agent may have a buffer of up to 64 kibibytes and store // a part of request’s body in that buffer. If the user agent reads from // request’s body beyond that buffer’s size and the user agent needs to // resend request, then instead return a network error. // - Set timingInfo’s final network-response start time to the coarsened // shared current time given fetchParams’s cross-origin isolated capability, // immediately after the user agent’s HTTP parser receives the first byte // of the response (e.g., frame header bytes for HTTP/2 or response status // line for HTTP/1.x). // - Wait until all the headers are transmitted. // - Any responses whose status is in the range 100 to 199, inclusive, // and is not 101, are to be ignored, except for the purposes of setting // timingInfo’s final network-response start time above. // - If request’s header list contains `Transfer-Encoding`/`chunked` and // response is transferred via HTTP/1.0 or older, then return a network // error. // - If the HTTP request results in a TLS client certificate dialog, then: // 1. If request’s window is an environment settings object, make the // dialog available in request’s window. // 2. Otherwise, return a network error. // To transmit request’s body body, run these steps: let requestBody = null; // 1. If body is null and fetchParams’s process request end-of-body is // non-null, then queue a fetch task given fetchParams’s process request // end-of-body and fetchParams’s task destination. if (request.body == null && fetchParams.processRequestEndOfBody) { queueMicrotask(() => fetchParams.processRequestEndOfBody()); } else if (request.body != null) { // 2. Otherwise, if body is non-null: // 1. Let processBodyChunk given bytes be these steps: const processBodyChunk = async function * (bytes) { // 1. If the ongoing fetch is terminated, then abort these steps. if (isCancelled(fetchParams)) { return } // 2. Run this step in parallel: transmit bytes. yield bytes; // 3. If fetchParams’s process request body is non-null, then run // fetchParams’s process request body given bytes’s length. fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); }; // 2. Let processEndOfBody be these steps: const processEndOfBody = () => { // 1. If fetchParams is canceled, then abort these steps. if (isCancelled(fetchParams)) { return } // 2. If fetchParams’s process request end-of-body is non-null, // then run fetchParams’s process request end-of-body. if (fetchParams.processRequestEndOfBody) { fetchParams.processRequestEndOfBody(); } }; // 3. Let processBodyError given e be these steps: const processBodyError = (e) => { // 1. If fetchParams is canceled, then abort these steps. if (isCancelled(fetchParams)) { return } // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller. if (e.name === 'AbortError') { fetchParams.controller.abort(); } else { fetchParams.controller.terminate(e); } }; // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody, // processBodyError, and fetchParams’s task destination. requestBody = (async function * () { try { for await (const bytes of request.body.stream) { yield * processBodyChunk(bytes); } processEndOfBody(); } catch (err) { processBodyError(err); } })(); } try { const { body, status, statusText, headersList } = await dispatch({ body: requestBody }); const iterator = body[Symbol.asyncIterator](); fetchParams.controller.next = () => iterator.next(); response = makeResponse({ status, statusText, headersList }); } catch (err) { // 10. If aborted, then: if (err.name === 'AbortError') { // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame. fetchParams.controller.connection.destroy(); // 2. Return the appropriate network error for fetchParams. return makeAppropriateNetworkError(fetchParams) } return makeNetworkError(err) } // 11. Let pullAlgorithm be an action that resumes the ongoing fetch // if it is suspended. const pullAlgorithm = () => { fetchParams.controller.resume(); }; // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s // controller. const cancelAlgorithm = () => { fetchParams.controller.abort(); }; // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by // the user agent. // TODO // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent. // TODO // 15. Let stream be a new ReadableStream. // 16. Set up stream with pullAlgorithm set to pullAlgorithm, // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. if (!ReadableStream) { ReadableStream = require$$10.ReadableStream; } const stream = new ReadableStream( { async start (controller) { fetchParams.controller.controller = controller; }, async pull (controller) { await pullAlgorithm(); }, async cancel (reason) { await cancelAlgorithm(); } }, { highWaterMark: 0 } ); // 17. Run these steps, but abort when the ongoing fetch is terminated: // 1. Set response’s body to a new body whose stream is stream. response.body = { stream }; // 2. If response is not a network error and request’s cache mode is // not "no-store", then update response in httpCache for request. // TODO // 3. If includeCredentials is true and the user agent is not configured // to block cookies for request (see section 7 of [COOKIES]), then run the // "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on // the value of each header whose name is a byte-case-insensitive match for // `Set-Cookie` in response’s header list, if any, and request’s current URL. // TODO // 18. If aborted, then: // TODO // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: fetchParams.controller.on('terminated', onAborted); fetchParams.controller.resume = async () => { // 1. While true while (true) { // 1-3. See onData... // 4. Set bytes to the result of handling content codings given // codings and bytes. let bytes; try { const { done, value } = await fetchParams.controller.next(); if (isAborted(fetchParams)) { break } bytes = done ? undefined : value; } catch (err) { if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { // zlib doesn't like empty streams. bytes = undefined; } else { bytes = err; } } if (bytes === undefined) { // 2. Otherwise, if the bytes transmission for response’s message // body is done normally and stream is readable, then close // stream, finalize response for fetchParams and response, and // abort these in-parallel steps. try { fetchParams.controller.controller.close(); } catch (err) { // TODO (fix): How/Why can this happen? Do we have a bug? if (!/Controller is already closed/.test(err)) { throw err } } finalizeResponse(fetchParams, response); return } // 5. Increase timingInfo’s decoded body size by bytes’s length. timingInfo.decodedBodySize += bytes?.byteLength ?? 0; // 6. If bytes is failure, then terminate fetchParams’s controller. if (isErrorLike(bytes)) { fetchParams.controller.terminate(bytes); return } // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes // into stream. fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); // 8. If stream is errored, then terminate the ongoing fetch. if (isErrored(stream)) { fetchParams.controller.terminate(); return } // 9. If stream doesn’t need more data ask the user agent to suspend // the ongoing fetch. if (!fetchParams.controller.controller.desiredSize) { return } } }; // 2. If aborted, then: function onAborted (reason) { // 2. If fetchParams is aborted, then: if (isAborted(fetchParams)) { // 1. Set response’s aborted flag. response.aborted = true; // 2. If stream is readable, error stream with an "AbortError" DOMException. if (isReadable(stream)) { fetchParams.controller.controller.error( new DOMException('The operation was aborted.', 'AbortError') ); } } else { // 3. Otherwise, if stream is readable, error stream with a TypeError. if (isReadable(stream)) { fetchParams.controller.controller.error(new TypeError('terminated', { cause: isErrorLike(reason) ? reason : undefined })); } } // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame. // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so. fetchParams.controller.connection.destroy(); } // 20. Return response. return response async function dispatch ({ body }) { const url = requestCurrentURL(request); return new Promise((resolve, reject) => fetchParams.controller.dispatcher.dispatch( { path: url.pathname + url.search, origin: url.origin, method: request.method, body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, headers: [...request.headersList].flat(), maxRedirections: 0, bodyTimeout: 300_000, headersTimeout: 300_000 }, { body: null, abort: null, onConnect (abort) { // TODO (fix): Do we need connection here? const { connection } = fetchParams.controller; if (connection.destroyed) { abort(new DOMException('The operation was aborted.', 'AbortError')); } else { fetchParams.controller.on('terminated', abort); this.abort = connection.abort = abort; } }, onHeaders (status, headersList, resume, statusText) { if (status < 200) { return } let codings = []; let location = ''; const headers = new Headers(); for (let n = 0; n < headersList.length; n += 2) { const key = headersList[n + 0].toString('latin1'); const val = headersList[n + 1].toString('latin1'); if (key.toLowerCase() === 'content-encoding') { codings = val.split(',').map((x) => x.trim()); } else if (key.toLowerCase() === 'location') { location = val; } headers.append(key, val); } this.body = new Readable({ read: resume }); const decoders = []; // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !(request.redirect === 'follow' && location)) { for (const coding of codings) { if (/(x-)?gzip/.test(coding)) { decoders.push(zlib$1.createGunzip()); } else if (/(x-)?deflate/.test(coding)) { decoders.push(zlib$1.createInflate()); } else if (coding === 'br') { decoders.push(zlib$1.createBrotliDecompress()); } else { decoders.length = 0; break } } } resolve({ status, statusText, headersList: headers[kHeadersList], body: decoders.length ? pipeline(this.body, ...decoders, () => { }) : this.body.on('error', () => {}) }); return true }, onData (chunk) { if (fetchParams.controller.dump) { return } // 1. If one or more bytes have been transmitted from response’s // message body, then: // 1. Let bytes be the transmitted bytes. const bytes = chunk; // 2. Let codings be the result of extracting header list values // given `Content-Encoding` and response’s header list. // See pullAlgorithm. // 3. Increase timingInfo’s encoded body size by bytes’s length. timingInfo.encodedBodySize += bytes.byteLength; // 4. See pullAlgorithm... return this.body.push(bytes) }, onComplete () { if (this.abort) { fetchParams.controller.off('terminated', this.abort); } fetchParams.controller.ended = true; this.body.push(null); }, onError (error) { if (this.abort) { fetchParams.controller.off('terminated', this.abort); } this.body?.destroy(error); fetchParams.controller.terminate(error); reject(error); } } )) } } fetch_1 = fetch; return fetch_1; } var hasRequiredUndici; function requireUndici () { if (hasRequiredUndici) return undici; hasRequiredUndici = 1; const Client = requireClient(); const Dispatcher = requireDispatcher(); const errors = requireErrors(); const Pool = requirePool(); const BalancedPool = requireBalancedPool(); const Agent = requireAgent(); const util = requireUtil$1(); const { InvalidArgumentError } = errors; const api = requireApi(); const buildConnector = requireConnect(); const MockClient = requireMockClient(); const MockAgent = requireMockAgent(); const MockPool = requireMockPool(); const mockErrors = requireMockErrors(); const ProxyAgent = requireProxyAgent(); const { getGlobalDispatcher, setGlobalDispatcher } = requireGlobal(); const nodeVersion = process.versions.node.split('.'); const nodeMajor = Number(nodeVersion[0]); const nodeMinor = Number(nodeVersion[1]); Object.assign(Dispatcher.prototype, api); undici.Dispatcher = Dispatcher; undici.Client = Client; undici.Pool = Pool; undici.BalancedPool = BalancedPool; undici.Agent = Agent; undici.ProxyAgent = ProxyAgent; undici.buildConnector = buildConnector; undici.errors = errors; function makeDispatcher (fn) { return (url, opts, handler) => { if (typeof opts === 'function') { handler = opts; opts = null; } if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { throw new InvalidArgumentError('invalid url') } if (opts != null && typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } if (opts && opts.path != null) { if (typeof opts.path !== 'string') { throw new InvalidArgumentError('invalid opts.path') } let path = opts.path; if (!opts.path.startsWith('/')) { path = `/${path}`; } url = new URL(util.parseOrigin(url).origin + path); } else { if (!opts) { opts = typeof url === 'object' ? url : {}; } url = util.parseURL(url); } const { agent, dispatcher = getGlobalDispatcher() } = opts; if (agent) { throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') } return fn.call(dispatcher, { ...opts, origin: url.origin, path: url.search ? `${url.pathname}${url.search}` : url.pathname, method: opts.method || (opts.body ? 'PUT' : 'GET') }, handler) } } undici.setGlobalDispatcher = setGlobalDispatcher; undici.getGlobalDispatcher = getGlobalDispatcher; if (nodeMajor > 16 || (nodeMajor === 16 && nodeMinor >= 8)) { let fetchImpl = null; undici.fetch = async function fetch (resource) { if (!fetchImpl) { fetchImpl = requireFetch(); } const dispatcher = (arguments[1] && arguments[1].dispatcher) || getGlobalDispatcher(); return fetchImpl.apply(dispatcher, arguments) }; undici.Headers = requireHeaders().Headers; undici.Response = requireResponse().Response; undici.Request = requireRequest().Request; undici.FormData = requireFormdata().FormData; undici.File = requireFile().File; } undici.request = makeDispatcher(api.request); undici.stream = makeDispatcher(api.stream); undici.pipeline = makeDispatcher(api.pipeline); undici.connect = makeDispatcher(api.connect); undici.upgrade = makeDispatcher(api.upgrade); undici.MockClient = MockClient; undici.MockPool = MockPool; undici.MockAgent = MockAgent; undici.mockErrors = mockErrors; return undici; } var publicApi = {}; var URL$2 = {exports: {}}; var conversions = {}; var lib$1 = conversions; function sign(x) { return x < 0 ? -1 : 1; } function evenRound(x) { // Round x to the nearest integer, choosing the even integer if it lies halfway between two. if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) return Math.floor(x); } else { return Math.round(x); } } function createNumberConversion(bitLength, typeOpts) { if (!typeOpts.unsigned) { --bitLength; } const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); const upperBound = Math.pow(2, bitLength) - 1; const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); return function(V, opts) { if (!opts) opts = {}; let x = +V; if (opts.enforceRange) { if (!Number.isFinite(x)) { throw new TypeError("Argument is not a finite number"); } x = sign(x) * Math.floor(Math.abs(x)); if (x < lowerBound || x > upperBound) { throw new TypeError("Argument is not in byte range"); } return x; } if (!isNaN(x) && opts.clamp) { x = evenRound(x); if (x < lowerBound) x = lowerBound; if (x > upperBound) x = upperBound; return x; } if (!Number.isFinite(x) || x === 0) { return 0; } x = sign(x) * Math.floor(Math.abs(x)); x = x % moduloVal; if (!typeOpts.unsigned && x >= moduloBound) { return x - moduloVal; } else if (typeOpts.unsigned) { if (x < 0) { x += moduloVal; } else if (x === -0) { // don't return negative zero return 0; } } return x; } } conversions["void"] = function () { return undefined; }; conversions["boolean"] = function (val) { return !!val; }; conversions["byte"] = createNumberConversion(8, { unsigned: false }); conversions["octet"] = createNumberConversion(8, { unsigned: true }); conversions["short"] = createNumberConversion(16, { unsigned: false }); conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); conversions["long"] = createNumberConversion(32, { unsigned: false }); conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); conversions["double"] = function (V) { const x = +V; if (!Number.isFinite(x)) { throw new TypeError("Argument is not a finite floating-point value"); } return x; }; conversions["unrestricted double"] = function (V) { const x = +V; if (isNaN(x)) { throw new TypeError("Argument is NaN"); } return x; }; // not quite valid, but good enough for JS conversions["float"] = conversions["double"]; conversions["unrestricted float"] = conversions["unrestricted double"]; conversions["DOMString"] = function (V, opts) { if (!opts) opts = {}; if (opts.treatNullAsEmptyString && V === null) { return ""; } return String(V); }; conversions["ByteString"] = function (V, opts) { const x = String(V); let c = undefined; for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { if (c > 255) { throw new TypeError("Argument is not a valid bytestring"); } } return x; }; conversions["USVString"] = function (V) { const S = String(V); const n = S.length; const U = []; for (let i = 0; i < n; ++i) { const c = S.charCodeAt(i); if (c < 0xD800 || c > 0xDFFF) { U.push(String.fromCodePoint(c)); } else if (0xDC00 <= c && c <= 0xDFFF) { U.push(String.fromCodePoint(0xFFFD)); } else { if (i === n - 1) { U.push(String.fromCodePoint(0xFFFD)); } else { const d = S.charCodeAt(i + 1); if (0xDC00 <= d && d <= 0xDFFF) { const a = c & 0x3FF; const b = d & 0x3FF; U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); ++i; } else { U.push(String.fromCodePoint(0xFFFD)); } } } } return U.join(''); }; conversions["Date"] = function (V, opts) { if (!(V instanceof Date)) { throw new TypeError("Argument is not a Date object"); } if (isNaN(V)) { return undefined; } return V; }; conversions["RegExp"] = function (V, opts) { if (!(V instanceof RegExp)) { V = new RegExp(V); } return V; }; var utils = {exports: {}}; (function (module) { module.exports.mixin = function mixin(target, source) { const keys = Object.getOwnPropertyNames(source); for (let i = 0; i < keys.length; ++i) { Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); } }; module.exports.wrapperSymbol = Symbol("wrapper"); module.exports.implSymbol = Symbol("impl"); module.exports.wrapperForImpl = function (impl) { return impl[module.exports.wrapperSymbol]; }; module.exports.implForWrapper = function (wrapper) { return wrapper[module.exports.implSymbol]; }; } (utils)); var URLImpl = {}; var urlStateMachine = {exports: {}}; var tr46 = {}; var require$$1 = [ [ [ 0, 44 ], "disallowed_STD3_valid" ], [ [ 45, 46 ], "valid" ], [ [ 47, 47 ], "disallowed_STD3_valid" ], [ [ 48, 57 ], "valid" ], [ [ 58, 64 ], "disallowed_STD3_valid" ], [ [ 65, 65 ], "mapped", [ 97 ] ], [ [ 66, 66 ], "mapped", [ 98 ] ], [ [ 67, 67 ], "mapped", [ 99 ] ], [ [ 68, 68 ], "mapped", [ 100 ] ], [ [ 69, 69 ], "mapped", [ 101 ] ], [ [ 70, 70 ], "mapped", [ 102 ] ], [ [ 71, 71 ], "mapped", [ 103 ] ], [ [ 72, 72 ], "mapped", [ 104 ] ], [ [ 73, 73 ], "mapped", [ 105 ] ], [ [ 74, 74 ], "mapped", [ 106 ] ], [ [ 75, 75 ], "mapped", [ 107 ] ], [ [ 76, 76 ], "mapped", [ 108 ] ], [ [ 77, 77 ], "mapped", [ 109 ] ], [ [ 78, 78 ], "mapped", [ 110 ] ], [ [ 79, 79 ], "mapped", [ 111 ] ], [ [ 80, 80 ], "mapped", [ 112 ] ], [ [ 81, 81 ], "mapped", [ 113 ] ], [ [ 82, 82 ], "mapped", [ 114 ] ], [ [ 83, 83 ], "mapped", [ 115 ] ], [ [ 84, 84 ], "mapped", [ 116 ] ], [ [ 85, 85 ], "mapped", [ 117 ] ], [ [ 86, 86 ], "mapped", [ 118 ] ], [ [ 87, 87 ], "mapped", [ 119 ] ], [ [ 88, 88 ], "mapped", [ 120 ] ], [ [ 89, 89 ], "mapped", [ 121 ] ], [ [ 90, 90 ], "mapped", [ 122 ] ], [ [ 91, 96 ], "disallowed_STD3_valid" ], [ [ 97, 122 ], "valid" ], [ [ 123, 127 ], "disallowed_STD3_valid" ], [ [ 128, 159 ], "disallowed" ], [ [ 160, 160 ], "disallowed_STD3_mapped", [ 32 ] ], [ [ 161, 167 ], "valid", [ ], "NV8" ], [ [ 168, 168 ], "disallowed_STD3_mapped", [ 32, 776 ] ], [ [ 169, 169 ], "valid", [ ], "NV8" ], [ [ 170, 170 ], "mapped", [ 97 ] ], [ [ 171, 172 ], "valid", [ ], "NV8" ], [ [ 173, 173 ], "ignored" ], [ [ 174, 174 ], "valid", [ ], "NV8" ], [ [ 175, 175 ], "disallowed_STD3_mapped", [ 32, 772 ] ], [ [ 176, 177 ], "valid", [ ], "NV8" ], [ [ 178, 178 ], "mapped", [ 50 ] ], [ [ 179, 179 ], "mapped", [ 51 ] ], [ [ 180, 180 ], "disallowed_STD3_mapped", [ 32, 769 ] ], [ [ 181, 181 ], "mapped", [ 956 ] ], [ [ 182, 182 ], "valid", [ ], "NV8" ], [ [ 183, 183 ], "valid" ], [ [ 184, 184 ], "disallowed_STD3_mapped", [ 32, 807 ] ], [ [ 185, 185 ], "mapped", [ 49 ] ], [ [ 186, 186 ], "mapped", [ 111 ] ], [ [ 187, 187 ], "valid", [ ], "NV8" ], [ [ 188, 188 ], "mapped", [ 49, 8260, 52 ] ], [ [ 189, 189 ], "mapped", [ 49, 8260, 50 ] ], [ [ 190, 190 ], "mapped", [ 51, 8260, 52 ] ], [ [ 191, 191 ], "valid", [ ], "NV8" ], [ [ 192, 192 ], "mapped", [ 224 ] ], [ [ 193, 193 ], "mapped", [ 225 ] ], [ [ 194, 194 ], "mapped", [ 226 ] ], [ [ 195, 195 ], "mapped", [ 227 ] ], [ [ 196, 196 ], "mapped", [ 228 ] ], [ [ 197, 197 ], "mapped", [ 229 ] ], [ [ 198, 198 ], "mapped", [ 230 ] ], [ [ 199, 199 ], "mapped", [ 231 ] ], [ [ 200, 200 ], "mapped", [ 232 ] ], [ [ 201, 201 ], "mapped", [ 233 ] ], [ [ 202, 202 ], "mapped", [ 234 ] ], [ [ 203, 203 ], "mapped", [ 235 ] ], [ [ 204, 204 ], "mapped", [ 236 ] ], [ [ 205, 205 ], "mapped", [ 237 ] ], [ [ 206, 206 ], "mapped", [ 238 ] ], [ [ 207, 207 ], "mapped", [ 239 ] ], [ [ 208, 208 ], "mapped", [ 240 ] ], [ [ 209, 209 ], "mapped", [ 241 ] ], [ [ 210, 210 ], "mapped", [ 242 ] ], [ [ 211, 211 ], "mapped", [ 243 ] ], [ [ 212, 212 ], "mapped", [ 244 ] ], [ [ 213, 213 ], "mapped", [ 245 ] ], [ [ 214, 214 ], "mapped", [ 246 ] ], [ [ 215, 215 ], "valid", [ ], "NV8" ], [ [ 216, 216 ], "mapped", [ 248 ] ], [ [ 217, 217 ], "mapped", [ 249 ] ], [ [ 218, 218 ], "mapped", [ 250 ] ], [ [ 219, 219 ], "mapped", [ 251 ] ], [ [ 220, 220 ], "mapped", [ 252 ] ], [ [ 221, 221 ], "mapped", [ 253 ] ], [ [ 222, 222 ], "mapped", [ 254 ] ], [ [ 223, 223 ], "deviation", [ 115, 115 ] ], [ [ 224, 246 ], "valid" ], [ [ 247, 247 ], "valid", [ ], "NV8" ], [ [ 248, 255 ], "valid" ], [ [ 256, 256 ], "mapped", [ 257 ] ], [ [ 257, 257 ], "valid" ], [ [ 258, 258 ], "mapped", [ 259 ] ], [ [ 259, 259 ], "valid" ], [ [ 260, 260 ], "mapped", [ 261 ] ], [ [ 261, 261 ], "valid" ], [ [ 262, 262 ], "mapped", [ 263 ] ], [ [ 263, 263 ], "valid" ], [ [ 264, 264 ], "mapped", [ 265 ] ], [ [ 265, 265 ], "valid" ], [ [ 266, 266 ], "mapped", [ 267 ] ], [ [ 267, 267 ], "valid" ], [ [ 268, 268 ], "mapped", [ 269 ] ], [ [ 269, 269 ], "valid" ], [ [ 270, 270 ], "mapped", [ 271 ] ], [ [ 271, 271 ], "valid" ], [ [ 272, 272 ], "mapped", [ 273 ] ], [ [ 273, 273 ], "valid" ], [ [ 274, 274 ], "mapped", [ 275 ] ], [ [ 275, 275 ], "valid" ], [ [ 276, 276 ], "mapped", [ 277 ] ], [ [ 277, 277 ], "valid" ], [ [ 278, 278 ], "mapped", [ 279 ] ], [ [ 279, 279 ], "valid" ], [ [ 280, 280 ], "mapped", [ 281 ] ], [ [ 281, 281 ], "valid" ], [ [ 282, 282 ], "mapped", [ 283 ] ], [ [ 283, 283 ], "valid" ], [ [ 284, 284 ], "mapped", [ 285 ] ], [ [ 285, 285 ], "valid" ], [ [ 286, 286 ], "mapped", [ 287 ] ], [ [ 287, 287 ], "valid" ], [ [ 288, 288 ], "mapped", [ 289 ] ], [ [ 289, 289 ], "valid" ], [ [ 290, 290 ], "mapped", [ 291 ] ], [ [ 291, 291 ], "valid" ], [ [ 292, 292 ], "mapped", [ 293 ] ], [ [ 293, 293 ], "valid" ], [ [ 294, 294 ], "mapped", [ 295 ] ], [ [ 295, 295 ], "valid" ], [ [ 296, 296 ], "mapped", [ 297 ] ], [ [ 297, 297 ], "valid" ], [ [ 298, 298 ], "mapped", [ 299 ] ], [ [ 299, 299 ], "valid" ], [ [ 300, 300 ], "mapped", [ 301 ] ], [ [ 301, 301 ], "valid" ], [ [ 302, 302 ], "mapped", [ 303 ] ], [ [ 303, 303 ], "valid" ], [ [ 304, 304 ], "mapped", [ 105, 775 ] ], [ [ 305, 305 ], "valid" ], [ [ 306, 307 ], "mapped", [ 105, 106 ] ], [ [ 308, 308 ], "mapped", [ 309 ] ], [ [ 309, 309 ], "valid" ], [ [ 310, 310 ], "mapped", [ 311 ] ], [ [ 311, 312 ], "valid" ], [ [ 313, 313 ], "mapped", [ 314 ] ], [ [ 314, 314 ], "valid" ], [ [ 315, 315 ], "mapped", [ 316 ] ], [ [ 316, 316 ], "valid" ], [ [ 317, 317 ], "mapped", [ 318 ] ], [ [ 318, 318 ], "valid" ], [ [ 319, 320 ], "mapped", [ 108, 183 ] ], [ [ 321, 321 ], "mapped", [ 322 ] ], [ [ 322, 322 ], "valid" ], [ [ 323, 323 ], "mapped", [ 324 ] ], [ [ 324, 324 ], "valid" ], [ [ 325, 325 ], "mapped", [ 326 ] ], [ [ 326, 326 ], "valid" ], [ [ 327, 327 ], "mapped", [ 328 ] ], [ [ 328, 328 ], "valid" ], [ [ 329, 329 ], "mapped", [ 700, 110 ] ], [ [ 330, 330 ], "mapped", [ 331 ] ], [ [ 331, 331 ], "valid" ], [ [ 332, 332 ], "mapped", [ 333 ] ], [ [ 333, 333 ], "valid" ], [ [ 334, 334 ], "mapped", [ 335 ] ], [ [ 335, 335 ], "valid" ], [ [ 336, 336 ], "mapped", [ 337 ] ], [ [ 337, 337 ], "valid" ], [ [ 338, 338 ], "mapped", [ 339 ] ], [ [ 339, 339 ], "valid" ], [ [ 340, 340 ], "mapped", [ 341 ] ], [ [ 341, 341 ], "valid" ], [ [ 342, 342 ], "mapped", [ 343 ] ], [ [ 343, 343 ], "valid" ], [ [ 344, 344 ], "mapped", [ 345 ] ], [ [ 345, 345 ], "valid" ], [ [ 346, 346 ], "mapped", [ 347 ] ], [ [ 347, 347 ], "valid" ], [ [ 348, 348 ], "mapped", [ 349 ] ], [ [ 349, 349 ], "valid" ], [ [ 350, 350 ], "mapped", [ 351 ] ], [ [ 351, 351 ], "valid" ], [ [ 352, 352 ], "mapped", [ 353 ] ], [ [ 353, 353 ], "valid" ], [ [ 354, 354 ], "mapped", [ 355 ] ], [ [ 355, 355 ], "valid" ], [ [ 356, 356 ], "mapped", [ 357 ] ], [ [ 357, 357 ], "valid" ], [ [ 358, 358 ], "mapped", [ 359 ] ], [ [ 359, 359 ], "valid" ], [ [ 360, 360 ], "mapped", [ 361 ] ], [ [ 361, 361 ], "valid" ], [ [ 362, 362 ], "mapped", [ 363 ] ], [ [ 363, 363 ], "valid" ], [ [ 364, 364 ], "mapped", [ 365 ] ], [ [ 365, 365 ], "valid" ], [ [ 366, 366 ], "mapped", [ 367 ] ], [ [ 367, 367 ], "valid" ], [ [ 368, 368 ], "mapped", [ 369 ] ], [ [ 369, 369 ], "valid" ], [ [ 370, 370 ], "mapped", [ 371 ] ], [ [ 371, 371 ], "valid" ], [ [ 372, 372 ], "mapped", [ 373 ] ], [ [ 373, 373 ], "valid" ], [ [ 374, 374 ], "mapped", [ 375 ] ], [ [ 375, 375 ], "valid" ], [ [ 376, 376 ], "mapped", [ 255 ] ], [ [ 377, 377 ], "mapped", [ 378 ] ], [ [ 378, 378 ], "valid" ], [ [ 379, 379 ], "mapped", [ 380 ] ], [ [ 380, 380 ], "valid" ], [ [ 381, 381 ], "mapped", [ 382 ] ], [ [ 382, 382 ], "valid" ], [ [ 383, 383 ], "mapped", [ 115 ] ], [ [ 384, 384 ], "valid" ], [ [ 385, 385 ], "mapped", [ 595 ] ], [ [ 386, 386 ], "mapped", [ 387 ] ], [ [ 387, 387 ], "valid" ], [ [ 388, 388 ], "mapped", [ 389 ] ], [ [ 389, 389 ], "valid" ], [ [ 390, 390 ], "mapped", [ 596 ] ], [ [ 391, 391 ], "mapped", [ 392 ] ], [ [ 392, 392 ], "valid" ], [ [ 393, 393 ], "mapped", [ 598 ] ], [ [ 394, 394 ], "mapped", [ 599 ] ], [ [ 395, 395 ], "mapped", [ 396 ] ], [ [ 396, 397 ], "valid" ], [ [ 398, 398 ], "mapped", [ 477 ] ], [ [ 399, 399 ], "mapped", [ 601 ] ], [ [ 400, 400 ], "mapped", [ 603 ] ], [ [ 401, 401 ], "mapped", [ 402 ] ], [ [ 402, 402 ], "valid" ], [ [ 403, 403 ], "mapped", [ 608 ] ], [ [ 404, 404 ], "mapped", [ 611 ] ], [ [ 405, 405 ], "valid" ], [ [ 406, 406 ], "mapped", [ 617 ] ], [ [ 407, 407 ], "mapped", [ 616 ] ], [ [ 408, 408 ], "mapped", [ 409 ] ], [ [ 409, 411 ], "valid" ], [ [ 412, 412 ], "mapped", [ 623 ] ], [ [ 413, 413 ], "mapped", [ 626 ] ], [ [ 414, 414 ], "valid" ], [ [ 415, 415 ], "mapped", [ 629 ] ], [ [ 416, 416 ], "mapped", [ 417 ] ], [ [ 417, 417 ], "valid" ], [ [ 418, 418 ], "mapped", [ 419 ] ], [ [ 419, 419 ], "valid" ], [ [ 420, 420 ], "mapped", [ 421 ] ], [ [ 421, 421 ], "valid" ], [ [ 422, 422 ], "mapped", [ 640 ] ], [ [ 423, 423 ], "mapped", [ 424 ] ], [ [ 424, 424 ], "valid" ], [ [ 425, 425 ], "mapped", [ 643 ] ], [ [ 426, 427 ], "valid" ], [ [ 428, 428 ], "mapped", [ 429 ] ], [ [ 429, 429 ], "valid" ], [ [ 430, 430 ], "mapped", [ 648 ] ], [ [ 431, 431 ], "mapped", [ 432 ] ], [ [ 432, 432 ], "valid" ], [ [ 433, 433 ], "mapped", [ 650 ] ], [ [ 434, 434 ], "mapped", [ 651 ] ], [ [ 435, 435 ], "mapped", [ 436 ] ], [ [ 436, 436 ], "valid" ], [ [ 437, 437 ], "mapped", [ 438 ] ], [ [ 438, 438 ], "valid" ], [ [ 439, 439 ], "mapped", [ 658 ] ], [ [ 440, 440 ], "mapped", [ 441 ] ], [ [ 441, 443 ], "valid" ], [ [ 444, 444 ], "mapped", [ 445 ] ], [ [ 445, 451 ], "valid" ], [ [ 452, 454 ], "mapped", [ 100, 382 ] ], [ [ 455, 457 ], "mapped", [ 108, 106 ] ], [ [ 458, 460 ], "mapped", [ 110, 106 ] ], [ [ 461, 461 ], "mapped", [ 462 ] ], [ [ 462, 462 ], "valid" ], [ [ 463, 463 ], "mapped", [ 464 ] ], [ [ 464, 464 ], "valid" ], [ [ 465, 465 ], "mapped", [ 466 ] ], [ [ 466, 466 ], "valid" ], [ [ 467, 467 ], "mapped", [ 468 ] ], [ [ 468, 468 ], "valid" ], [ [ 469, 469 ], "mapped", [ 470 ] ], [ [ 470, 470 ], "valid" ], [ [ 471, 471 ], "mapped", [ 472 ] ], [ [ 472, 472 ], "valid" ], [ [ 473, 473 ], "mapped", [ 474 ] ], [ [ 474, 474 ], "valid" ], [ [ 475, 475 ], "mapped", [ 476 ] ], [ [ 476, 477 ], "valid" ], [ [ 478, 478 ], "mapped", [ 479 ] ], [ [ 479, 479 ], "valid" ], [ [ 480, 480 ], "mapped", [ 481 ] ], [ [ 481, 481 ], "valid" ], [ [ 482, 482 ], "mapped", [ 483 ] ], [ [ 483, 483 ], "valid" ], [ [ 484, 484 ], "mapped", [ 485 ] ], [ [ 485, 485 ], "valid" ], [ [ 486, 486 ], "mapped", [ 487 ] ], [ [ 487, 487 ], "valid" ], [ [ 488, 488 ], "mapped", [ 489 ] ], [ [ 489, 489 ], "valid" ], [ [ 490, 490 ], "mapped", [ 491 ] ], [ [ 491, 491 ], "valid" ], [ [ 492, 492 ], "mapped", [ 493 ] ], [ [ 493, 493 ], "valid" ], [ [ 494, 494 ], "mapped", [ 495 ] ], [ [ 495, 496 ], "valid" ], [ [ 497, 499 ], "mapped", [ 100, 122 ] ], [ [ 500, 500 ], "mapped", [ 501 ] ], [ [ 501, 501 ], "valid" ], [ [ 502, 502 ], "mapped", [ 405 ] ], [ [ 503, 503 ], "mapped", [ 447 ] ], [ [ 504, 504 ], "mapped", [ 505 ] ], [ [ 505, 505 ], "valid" ], [ [ 506, 506 ], "mapped", [ 507 ] ], [ [ 507, 507 ], "valid" ], [ [ 508, 508 ], "mapped", [ 509 ] ], [ [ 509, 509 ], "valid" ], [ [ 510, 510 ], "mapped", [ 511 ] ], [ [ 511, 511 ], "valid" ], [ [ 512, 512 ], "mapped", [ 513 ] ], [ [ 513, 513 ], "valid" ], [ [ 514, 514 ], "mapped", [ 515 ] ], [ [ 515, 515 ], "valid" ], [ [ 516, 516 ], "mapped", [ 517 ] ], [ [ 517, 517 ], "valid" ], [ [ 518, 518 ], "mapped", [ 519 ] ], [ [ 519, 519 ], "valid" ], [ [ 520, 520 ], "mapped", [ 521 ] ], [ [ 521, 521 ], "valid" ], [ [ 522, 522 ], "mapped", [ 523 ] ], [ [ 523, 523 ], "valid" ], [ [ 524, 524 ], "mapped", [ 525 ] ], [ [ 525, 525 ], "valid" ], [ [ 526, 526 ], "mapped", [ 527 ] ], [ [ 527, 527 ], "valid" ], [ [ 528, 528 ], "mapped", [ 529 ] ], [ [ 529, 529 ], "valid" ], [ [ 530, 530 ], "mapped", [ 531 ] ], [ [ 531, 531 ], "valid" ], [ [ 532, 532 ], "mapped", [ 533 ] ], [ [ 533, 533 ], "valid" ], [ [ 534, 534 ], "mapped", [ 535 ] ], [ [ 535, 535 ], "valid" ], [ [ 536, 536 ], "mapped", [ 537 ] ], [ [ 537, 537 ], "valid" ], [ [ 538, 538 ], "mapped", [ 539 ] ], [ [ 539, 539 ], "valid" ], [ [ 540, 540 ], "mapped", [ 541 ] ], [ [ 541, 541 ], "valid" ], [ [ 542, 542 ], "mapped", [ 543 ] ], [ [ 543, 543 ], "valid" ], [ [ 544, 544 ], "mapped", [ 414 ] ], [ [ 545, 545 ], "valid" ], [ [ 546, 546 ], "mapped", [ 547 ] ], [ [ 547, 547 ], "valid" ], [ [ 548, 548 ], "mapped", [ 549 ] ], [ [ 549, 549 ], "valid" ], [ [ 550, 550 ], "mapped", [ 551 ] ], [ [ 551, 551 ], "valid" ], [ [ 552, 552 ], "mapped", [ 553 ] ], [ [ 553, 553 ], "valid" ], [ [ 554, 554 ], "mapped", [ 555 ] ], [ [ 555, 555 ], "valid" ], [ [ 556, 556 ], "mapped", [ 557 ] ], [ [ 557, 557 ], "valid" ], [ [ 558, 558 ], "mapped", [ 559 ] ], [ [ 559, 559 ], "valid" ], [ [ 560, 560 ], "mapped", [ 561 ] ], [ [ 561, 561 ], "valid" ], [ [ 562, 562 ], "mapped", [ 563 ] ], [ [ 563, 563 ], "valid" ], [ [ 564, 566 ], "valid" ], [ [ 567, 569 ], "valid" ], [ [ 570, 570 ], "mapped", [ 11365 ] ], [ [ 571, 571 ], "mapped", [ 572 ] ], [ [ 572, 572 ], "valid" ], [ [ 573, 573 ], "mapped", [ 410 ] ], [ [ 574, 574 ], "mapped", [ 11366 ] ], [ [ 575, 576 ], "valid" ], [ [ 577, 577 ], "mapped", [ 578 ] ], [ [ 578, 578 ], "valid" ], [ [ 579, 579 ], "mapped", [ 384 ] ], [ [ 580, 580 ], "mapped", [ 649 ] ], [ [ 581, 581 ], "mapped", [ 652 ] ], [ [ 582, 582 ], "mapped", [ 583 ] ], [ [ 583, 583 ], "valid" ], [ [ 584, 584 ], "mapped", [ 585 ] ], [ [ 585, 585 ], "valid" ], [ [ 586, 586 ], "mapped", [ 587 ] ], [ [ 587, 587 ], "valid" ], [ [ 588, 588 ], "mapped", [ 589 ] ], [ [ 589, 589 ], "valid" ], [ [ 590, 590 ], "mapped", [ 591 ] ], [ [ 591, 591 ], "valid" ], [ [ 592, 680 ], "valid" ], [ [ 681, 685 ], "valid" ], [ [ 686, 687 ], "valid" ], [ [ 688, 688 ], "mapped", [ 104 ] ], [ [ 689, 689 ], "mapped", [ 614 ] ], [ [ 690, 690 ], "mapped", [ 106 ] ], [ [ 691, 691 ], "mapped", [ 114 ] ], [ [ 692, 692 ], "mapped", [ 633 ] ], [ [ 693, 693 ], "mapped", [ 635 ] ], [ [ 694, 694 ], "mapped", [ 641 ] ], [ [ 695, 695 ], "mapped", [ 119 ] ], [ [ 696, 696 ], "mapped", [ 121 ] ], [ [ 697, 705 ], "valid" ], [ [ 706, 709 ], "valid", [ ], "NV8" ], [ [ 710, 721 ], "valid" ], [ [ 722, 727 ], "valid", [ ], "NV8" ], [ [ 728, 728 ], "disallowed_STD3_mapped", [ 32, 774 ] ], [ [ 729, 729 ], "disallowed_STD3_mapped", [ 32, 775 ] ], [ [ 730, 730 ], "disallowed_STD3_mapped", [ 32, 778 ] ], [ [ 731, 731 ], "disallowed_STD3_mapped", [ 32, 808 ] ], [ [ 732, 732 ], "disallowed_STD3_mapped", [ 32, 771 ] ], [ [ 733, 733 ], "disallowed_STD3_mapped", [ 32, 779 ] ], [ [ 734, 734 ], "valid", [ ], "NV8" ], [ [ 735, 735 ], "valid", [ ], "NV8" ], [ [ 736, 736 ], "mapped", [ 611 ] ], [ [ 737, 737 ], "mapped", [ 108 ] ], [ [ 738, 738 ], "mapped", [ 115 ] ], [ [ 739, 739 ], "mapped", [ 120 ] ], [ [ 740, 740 ], "mapped", [ 661 ] ], [ [ 741, 745 ], "valid", [ ], "NV8" ], [ [ 746, 747 ], "valid", [ ], "NV8" ], [ [ 748, 748 ], "valid" ], [ [ 749, 749 ], "valid", [ ], "NV8" ], [ [ 750, 750 ], "valid" ], [ [ 751, 767 ], "valid", [ ], "NV8" ], [ [ 768, 831 ], "valid" ], [ [ 832, 832 ], "mapped", [ 768 ] ], [ [ 833, 833 ], "mapped", [ 769 ] ], [ [ 834, 834 ], "valid" ], [ [ 835, 835 ], "mapped", [ 787 ] ], [ [ 836, 836 ], "mapped", [ 776, 769 ] ], [ [ 837, 837 ], "mapped", [ 953 ] ], [ [ 838, 846 ], "valid" ], [ [ 847, 847 ], "ignored" ], [ [ 848, 855 ], "valid" ], [ [ 856, 860 ], "valid" ], [ [ 861, 863 ], "valid" ], [ [ 864, 865 ], "valid" ], [ [ 866, 866 ], "valid" ], [ [ 867, 879 ], "valid" ], [ [ 880, 880 ], "mapped", [ 881 ] ], [ [ 881, 881 ], "valid" ], [ [ 882, 882 ], "mapped", [ 883 ] ], [ [ 883, 883 ], "valid" ], [ [ 884, 884 ], "mapped", [ 697 ] ], [ [ 885, 885 ], "valid" ], [ [ 886, 886 ], "mapped", [ 887 ] ], [ [ 887, 887 ], "valid" ], [ [ 888, 889 ], "disallowed" ], [ [ 890, 890 ], "disallowed_STD3_mapped", [ 32, 953 ] ], [ [ 891, 893 ], "valid" ], [ [ 894, 894 ], "disallowed_STD3_mapped", [ 59 ] ], [ [ 895, 895 ], "mapped", [ 1011 ] ], [ [ 896, 899 ], "disallowed" ], [ [ 900, 900 ], "disallowed_STD3_mapped", [ 32, 769 ] ], [ [ 901, 901 ], "disallowed_STD3_mapped", [ 32, 776, 769 ] ], [ [ 902, 902 ], "mapped", [ 940 ] ], [ [ 903, 903 ], "mapped", [ 183 ] ], [ [ 904, 904 ], "mapped", [ 941 ] ], [ [ 905, 905 ], "mapped", [ 942 ] ], [ [ 906, 906 ], "mapped", [ 943 ] ], [ [ 907, 907 ], "disallowed" ], [ [ 908, 908 ], "mapped", [ 972 ] ], [ [ 909, 909 ], "disallowed" ], [ [ 910, 910 ], "mapped", [ 973 ] ], [ [ 911, 911 ], "mapped", [ 974 ] ], [ [ 912, 912 ], "valid" ], [ [ 913, 913 ], "mapped", [ 945 ] ], [ [ 914, 914 ], "mapped", [ 946 ] ], [ [ 915, 915 ], "mapped", [ 947 ] ], [ [ 916, 916 ], "mapped", [ 948 ] ], [ [ 917, 917 ], "mapped", [ 949 ] ], [ [ 918, 918 ], "mapped", [ 950 ] ], [ [ 919, 919 ], "mapped", [ 951 ] ], [ [ 920, 920 ], "mapped", [ 952 ] ], [ [ 921, 921 ], "mapped", [ 953 ] ], [ [ 922, 922 ], "mapped", [ 954 ] ], [ [ 923, 923 ], "mapped", [ 955 ] ], [ [ 924, 924 ], "mapped", [ 956 ] ], [ [ 925, 925 ], "mapped", [ 957 ] ], [ [ 926, 926 ], "mapped", [ 958 ] ], [ [ 927, 927 ], "mapped", [ 959 ] ], [ [ 928, 928 ], "mapped", [ 960 ] ], [ [ 929, 929 ], "mapped", [ 961 ] ], [ [ 930, 930 ], "disallowed" ], [ [ 931, 931 ], "mapped", [ 963 ] ], [ [ 932, 932 ], "mapped", [ 964 ] ], [ [ 933, 933 ], "mapped", [ 965 ] ], [ [ 934, 934 ], "mapped", [ 966 ] ], [ [ 935, 935 ], "mapped", [ 967 ] ], [ [ 936, 936 ], "mapped", [ 968 ] ], [ [ 937, 937 ], "mapped", [ 969 ] ], [ [ 938, 938 ], "mapped", [ 970 ] ], [ [ 939, 939 ], "mapped", [ 971 ] ], [ [ 940, 961 ], "valid" ], [ [ 962, 962 ], "deviation", [ 963 ] ], [ [ 963, 974 ], "valid" ], [ [ 975, 975 ], "mapped", [ 983 ] ], [ [ 976, 976 ], "mapped", [ 946 ] ], [ [ 977, 977 ], "mapped", [ 952 ] ], [ [ 978, 978 ], "mapped", [ 965 ] ], [ [ 979, 979 ], "mapped", [ 973 ] ], [ [ 980, 980 ], "mapped", [ 971 ] ], [ [ 981, 981 ], "mapped", [ 966 ] ], [ [ 982, 982 ], "mapped", [ 960 ] ], [ [ 983, 983 ], "valid" ], [ [ 984, 984 ], "mapped", [ 985 ] ], [ [ 985, 985 ], "valid" ], [ [ 986, 986 ], "mapped", [ 987 ] ], [ [ 987, 987 ], "valid" ], [ [ 988, 988 ], "mapped", [ 989 ] ], [ [ 989, 989 ], "valid" ], [ [ 990, 990 ], "mapped", [ 991 ] ], [ [ 991, 991 ], "valid" ], [ [ 992, 992 ], "mapped", [ 993 ] ], [ [ 993, 993 ], "valid" ], [ [ 994, 994 ], "mapped", [ 995 ] ], [ [ 995, 995 ], "valid" ], [ [ 996, 996 ], "mapped", [ 997 ] ], [ [ 997, 997 ], "valid" ], [ [ 998, 998 ], "mapped", [ 999 ] ], [ [ 999, 999 ], "valid" ], [ [ 1000, 1000 ], "mapped", [ 1001 ] ], [ [ 1001, 1001 ], "valid" ], [ [ 1002, 1002 ], "mapped", [ 1003 ] ], [ [ 1003, 1003 ], "valid" ], [ [ 1004, 1004 ], "mapped", [ 1005 ] ], [ [ 1005, 1005 ], "valid" ], [ [ 1006, 1006 ], "mapped", [ 1007 ] ], [ [ 1007, 1007 ], "valid" ], [ [ 1008, 1008 ], "mapped", [ 954 ] ], [ [ 1009, 1009 ], "mapped", [ 961 ] ], [ [ 1010, 1010 ], "mapped", [ 963 ] ], [ [ 1011, 1011 ], "valid" ], [ [ 1012, 1012 ], "mapped", [ 952 ] ], [ [ 1013, 1013 ], "mapped", [ 949 ] ], [ [ 1014, 1014 ], "valid", [ ], "NV8" ], [ [ 1015, 1015 ], "mapped", [ 1016 ] ], [ [ 1016, 1016 ], "valid" ], [ [ 1017, 1017 ], "mapped", [ 963 ] ], [ [ 1018, 1018 ], "mapped", [ 1019 ] ], [ [ 1019, 1019 ], "valid" ], [ [ 1020, 1020 ], "valid" ], [ [ 1021, 1021 ], "mapped", [ 891 ] ], [ [ 1022, 1022 ], "mapped", [ 892 ] ], [ [ 1023, 1023 ], "mapped", [ 893 ] ], [ [ 1024, 1024 ], "mapped", [ 1104 ] ], [ [ 1025, 1025 ], "mapped", [ 1105 ] ], [ [ 1026, 1026 ], "mapped", [ 1106 ] ], [ [ 1027, 1027 ], "mapped", [ 1107 ] ], [ [ 1028, 1028 ], "mapped", [ 1108 ] ], [ [ 1029, 1029 ], "mapped", [ 1109 ] ], [ [ 1030, 1030 ], "mapped", [ 1110 ] ], [ [ 1031, 1031 ], "mapped", [ 1111 ] ], [ [ 1032, 1032 ], "mapped", [ 1112 ] ], [ [ 1033, 1033 ], "mapped", [ 1113 ] ], [ [ 1034, 1034 ], "mapped", [ 1114 ] ], [ [ 1035, 1035 ], "mapped", [ 1115 ] ], [ [ 1036, 1036 ], "mapped", [ 1116 ] ], [ [ 1037, 1037 ], "mapped", [ 1117 ] ], [ [ 1038, 1038 ], "mapped", [ 1118 ] ], [ [ 1039, 1039 ], "mapped", [ 1119 ] ], [ [ 1040, 1040 ], "mapped", [ 1072 ] ], [ [ 1041, 1041 ], "mapped", [ 1073 ] ], [ [ 1042, 1042 ], "mapped", [ 1074 ] ], [ [ 1043, 1043 ], "mapped", [ 1075 ] ], [ [ 1044, 1044 ], "mapped", [ 1076 ] ], [ [ 1045, 1045 ], "mapped", [ 1077 ] ], [ [ 1046, 1046 ], "mapped", [ 1078 ] ], [ [ 1047, 1047 ], "mapped", [ 1079 ] ], [ [ 1048, 1048 ], "mapped", [ 1080 ] ], [ [ 1049, 1049 ], "mapped", [ 1081 ] ], [ [ 1050, 1050 ], "mapped", [ 1082 ] ], [ [ 1051, 1051 ], "mapped", [ 1083 ] ], [ [ 1052, 1052 ], "mapped", [ 1084 ] ], [ [ 1053, 1053 ], "mapped", [ 1085 ] ], [ [ 1054, 1054 ], "mapped", [ 1086 ] ], [ [ 1055, 1055 ], "mapped", [ 1087 ] ], [ [ 1056, 1056 ], "mapped", [ 1088 ] ], [ [ 1057, 1057 ], "mapped", [ 1089 ] ], [ [ 1058, 1058 ], "mapped", [ 1090 ] ], [ [ 1059, 1059 ], "mapped", [ 1091 ] ], [ [ 1060, 1060 ], "mapped", [ 1092 ] ], [ [ 1061, 1061 ], "mapped", [ 1093 ] ], [ [ 1062, 1062 ], "mapped", [ 1094 ] ], [ [ 1063, 1063 ], "mapped", [ 1095 ] ], [ [ 1064, 1064 ], "mapped", [ 1096 ] ], [ [ 1065, 1065 ], "mapped", [ 1097 ] ], [ [ 1066, 1066 ], "mapped", [ 1098 ] ], [ [ 1067, 1067 ], "mapped", [ 1099 ] ], [ [ 1068, 1068 ], "mapped", [ 1100 ] ], [ [ 1069, 1069 ], "mapped", [ 1101 ] ], [ [ 1070, 1070 ], "mapped", [ 1102 ] ], [ [ 1071, 1071 ], "mapped", [ 1103 ] ], [ [ 1072, 1103 ], "valid" ], [ [ 1104, 1104 ], "valid" ], [ [ 1105, 1116 ], "valid" ], [ [ 1117, 1117 ], "valid" ], [ [ 1118, 1119 ], "valid" ], [ [ 1120, 1120 ], "mapped", [ 1121 ] ], [ [ 1121, 1121 ], "valid" ], [ [ 1122, 1122 ], "mapped", [ 1123 ] ], [ [ 1123, 1123 ], "valid" ], [ [ 1124, 1124 ], "mapped", [ 1125 ] ], [ [ 1125, 1125 ], "valid" ], [ [ 1126, 1126 ], "mapped", [ 1127 ] ], [ [ 1127, 1127 ], "valid" ], [ [ 1128, 1128 ], "mapped", [ 1129 ] ], [ [ 1129, 1129 ], "valid" ], [ [ 1130, 1130 ], "mapped", [ 1131 ] ], [ [ 1131, 1131 ], "valid" ], [ [ 1132, 1132 ], "mapped", [ 1133 ] ], [ [ 1133, 1133 ], "valid" ], [ [ 1134, 1134 ], "mapped", [ 1135 ] ], [ [ 1135, 1135 ], "valid" ], [ [ 1136, 1136 ], "mapped", [ 1137 ] ], [ [ 1137, 1137 ], "valid" ], [ [ 1138, 1138 ], "mapped", [ 1139 ] ], [ [ 1139, 1139 ], "valid" ], [ [ 1140, 1140 ], "mapped", [ 1141 ] ], [ [ 1141, 1141 ], "valid" ], [ [ 1142, 1142 ], "mapped", [ 1143 ] ], [ [ 1143, 1143 ], "valid" ], [ [ 1144, 1144 ], "mapped", [ 1145 ] ], [ [ 1145, 1145 ], "valid" ], [ [ 1146, 1146 ], "mapped", [ 1147 ] ], [ [ 1147, 1147 ], "valid" ], [ [ 1148, 1148 ], "mapped", [ 1149 ] ], [ [ 1149, 1149 ], "valid" ], [ [ 1150, 1150 ], "mapped", [ 1151 ] ], [ [ 1151, 1151 ], "valid" ], [ [ 1152, 1152 ], "mapped", [ 1153 ] ], [ [ 1153, 1153 ], "valid" ], [ [ 1154, 1154 ], "valid", [ ], "NV8" ], [ [ 1155, 1158 ], "valid" ], [ [ 1159, 1159 ], "valid" ], [ [ 1160, 1161 ], "valid", [ ], "NV8" ], [ [ 1162, 1162 ], "mapped", [ 1163 ] ], [ [ 1163, 1163 ], "valid" ], [ [ 1164, 1164 ], "mapped", [ 1165 ] ], [ [ 1165, 1165 ], "valid" ], [ [ 1166, 1166 ], "mapped", [ 1167 ] ], [ [ 1167, 1167 ], "valid" ], [ [ 1168, 1168 ], "mapped", [ 1169 ] ], [ [ 1169, 1169 ], "valid" ], [ [ 1170, 1170 ], "mapped", [ 1171 ] ], [ [ 1171, 1171 ], "valid" ], [ [ 1172, 1172 ], "mapped", [ 1173 ] ], [ [ 1173, 1173 ], "valid" ], [ [ 1174, 1174 ], "mapped", [ 1175 ] ], [ [ 1175, 1175 ], "valid" ], [ [ 1176, 1176 ], "mapped", [ 1177 ] ], [ [ 1177, 1177 ], "valid" ], [ [ 1178, 1178 ], "mapped", [ 1179 ] ], [ [ 1179, 1179 ], "valid" ], [ [ 1180, 1180 ], "mapped", [ 1181 ] ], [ [ 1181, 1181 ], "valid" ], [ [ 1182, 1182 ], "mapped", [ 1183 ] ], [ [ 1183, 1183 ], "valid" ], [ [ 1184, 1184 ], "mapped", [ 1185 ] ], [ [ 1185, 1185 ], "valid" ], [ [ 1186, 1186 ], "mapped", [ 1187 ] ], [ [ 1187, 1187 ], "valid" ], [ [ 1188, 1188 ], "mapped", [ 1189 ] ], [ [ 1189, 1189 ], "valid" ], [ [ 1190, 1190 ], "mapped", [ 1191 ] ], [ [ 1191, 1191 ], "valid" ], [ [ 1192, 1192 ], "mapped", [ 1193 ] ], [ [ 1193, 1193 ], "valid" ], [ [ 1194, 1194 ], "mapped", [ 1195 ] ], [ [ 1195, 1195 ], "valid" ], [ [ 1196, 1196 ], "mapped", [ 1197 ] ], [ [ 1197, 1197 ], "valid" ], [ [ 1198, 1198 ], "mapped", [ 1199 ] ], [ [ 1199, 1199 ], "valid" ], [ [ 1200, 1200 ], "mapped", [ 1201 ] ], [ [ 1201, 1201 ], "valid" ], [ [ 1202, 1202 ], "mapped", [ 1203 ] ], [ [ 1203, 1203 ], "valid" ], [ [ 1204, 1204 ], "mapped", [ 1205 ] ], [ [ 1205, 1205 ], "valid" ], [ [ 1206, 1206 ], "mapped", [ 1207 ] ], [ [ 1207, 1207 ], "valid" ], [ [ 1208, 1208 ], "mapped", [ 1209 ] ], [ [ 1209, 1209 ], "valid" ], [ [ 1210, 1210 ], "mapped", [ 1211 ] ], [ [ 1211, 1211 ], "valid" ], [ [ 1212, 1212 ], "mapped", [ 1213 ] ], [ [ 1213, 1213 ], "valid" ], [ [ 1214, 1214 ], "mapped", [ 1215 ] ], [ [ 1215, 1215 ], "valid" ], [ [ 1216, 1216 ], "disallowed" ], [ [ 1217, 1217 ], "mapped", [ 1218 ] ], [ [ 1218, 1218 ], "valid" ], [ [ 1219, 1219 ], "mapped", [ 1220 ] ], [ [ 1220, 1220 ], "valid" ], [ [ 1221, 1221 ], "mapped", [ 1222 ] ], [ [ 1222, 1222 ], "valid" ], [ [ 1223, 1223 ], "mapped", [ 1224 ] ], [ [ 1224, 1224 ], "valid" ], [ [ 1225, 1225 ], "mapped", [ 1226 ] ], [ [ 1226, 1226 ], "valid" ], [ [ 1227, 1227 ], "mapped", [ 1228 ] ], [ [ 1228, 1228 ], "valid" ], [ [ 1229, 1229 ], "mapped", [ 1230 ] ], [ [ 1230, 1230 ], "valid" ], [ [ 1231, 1231 ], "valid" ], [ [ 1232, 1232 ], "mapped", [ 1233 ] ], [ [ 1233, 1233 ], "valid" ], [ [ 1234, 1234 ], "mapped", [ 1235 ] ], [ [ 1235, 1235 ], "valid" ], [ [ 1236, 1236 ], "mapped", [ 1237 ] ], [ [ 1237, 1237 ], "valid" ], [ [ 1238, 1238 ], "mapped", [ 1239 ] ], [ [ 1239, 1239 ], "valid" ], [ [ 1240, 1240 ], "mapped", [ 1241 ] ], [ [ 1241, 1241 ], "valid" ], [ [ 1242, 1242 ], "mapped", [ 1243 ] ], [ [ 1243, 1243 ], "valid" ], [ [ 1244, 1244 ], "mapped", [ 1245 ] ], [ [ 1245, 1245 ], "valid" ], [ [ 1246, 1246 ], "mapped", [ 1247 ] ], [ [ 1247, 1247 ], "valid" ], [ [ 1248, 1248 ], "mapped", [ 1249 ] ], [ [ 1249, 1249 ], "valid" ], [ [ 1250, 1250 ], "mapped", [ 1251 ] ], [ [ 1251, 1251 ], "valid" ], [ [ 1252, 1252 ], "mapped", [ 1253 ] ], [ [ 1253, 1253 ], "valid" ], [ [ 1254, 1254 ], "mapped", [ 1255 ] ], [ [ 1255, 1255 ], "valid" ], [ [ 1256, 1256 ], "mapped", [ 1257 ] ], [ [ 1257, 1257 ], "valid" ], [ [ 1258, 1258 ], "mapped", [ 1259 ] ], [ [ 1259, 1259 ], "valid" ], [ [ 1260, 1260 ], "mapped", [ 1261 ] ], [ [ 1261, 1261 ], "valid" ], [ [ 1262, 1262 ], "mapped", [ 1263 ] ], [ [ 1263, 1263 ], "valid" ], [ [ 1264, 1264 ], "mapped", [ 1265 ] ], [ [ 1265, 1265 ], "valid" ], [ [ 1266, 1266 ], "mapped", [ 1267 ] ], [ [ 1267, 1267 ], "valid" ], [ [ 1268, 1268 ], "mapped", [ 1269 ] ], [ [ 1269, 1269 ], "valid" ], [ [ 1270, 1270 ], "mapped", [ 1271 ] ], [ [ 1271, 1271 ], "valid" ], [ [ 1272, 1272 ], "mapped", [ 1273 ] ], [ [ 1273, 1273 ], "valid" ], [ [ 1274, 1274 ], "mapped", [ 1275 ] ], [ [ 1275, 1275 ], "valid" ], [ [ 1276, 1276 ], "mapped", [ 1277 ] ], [ [ 1277, 1277 ], "valid" ], [ [ 1278, 1278 ], "mapped", [ 1279 ] ], [ [ 1279, 1279 ], "valid" ], [ [ 1280, 1280 ], "mapped", [ 1281 ] ], [ [ 1281, 1281 ], "valid" ], [ [ 1282, 1282 ], "mapped", [ 1283 ] ], [ [ 1283, 1283 ], "valid" ], [ [ 1284, 1284 ], "mapped", [ 1285 ] ], [ [ 1285, 1285 ], "valid" ], [ [ 1286, 1286 ], "mapped", [ 1287 ] ], [ [ 1287, 1287 ], "valid" ], [ [ 1288, 1288 ], "mapped", [ 1289 ] ], [ [ 1289, 1289 ], "valid" ], [ [ 1290, 1290 ], "mapped", [ 1291 ] ], [ [ 1291, 1291 ], "valid" ], [ [ 1292, 1292 ], "mapped", [ 1293 ] ], [ [ 1293, 1293 ], "valid" ], [ [ 1294, 1294 ], "mapped", [ 1295 ] ], [ [ 1295, 1295 ], "valid" ], [ [ 1296, 1296 ], "mapped", [ 1297 ] ], [ [ 1297, 1297 ], "valid" ], [ [ 1298, 1298 ], "mapped", [ 1299 ] ], [ [ 1299, 1299 ], "valid" ], [ [ 1300, 1300 ], "mapped", [ 1301 ] ], [ [ 1301, 1301 ], "valid" ], [ [ 1302, 1302 ], "mapped", [ 1303 ] ], [ [ 1303, 1303 ], "valid" ], [ [ 1304, 1304 ], "mapped", [ 1305 ] ], [ [ 1305, 1305 ], "valid" ], [ [ 1306, 1306 ], "mapped", [ 1307 ] ], [ [ 1307, 1307 ], "valid" ], [ [ 1308, 1308 ], "mapped", [ 1309 ] ], [ [ 1309, 1309 ], "valid" ], [ [ 1310, 1310 ], "mapped", [ 1311 ] ], [ [ 1311, 1311 ], "valid" ], [ [ 1312, 1312 ], "mapped", [ 1313 ] ], [ [ 1313, 1313 ], "valid" ], [ [ 1314, 1314 ], "mapped", [ 1315 ] ], [ [ 1315, 1315 ], "valid" ], [ [ 1316, 1316 ], "mapped", [ 1317 ] ], [ [ 1317, 1317 ], "valid" ], [ [ 1318, 1318 ], "mapped", [ 1319 ] ], [ [ 1319, 1319 ], "valid" ], [ [ 1320, 1320 ], "mapped", [ 1321 ] ], [ [ 1321, 1321 ], "valid" ], [ [ 1322, 1322 ], "mapped", [ 1323 ] ], [ [ 1323, 1323 ], "valid" ], [ [ 1324, 1324 ], "mapped", [ 1325 ] ], [ [ 1325, 1325 ], "valid" ], [ [ 1326, 1326 ], "mapped", [ 1327 ] ], [ [ 1327, 1327 ], "valid" ], [ [ 1328, 1328 ], "disallowed" ], [ [ 1329, 1329 ], "mapped", [ 1377 ] ], [ [ 1330, 1330 ], "mapped", [ 1378 ] ], [ [ 1331, 1331 ], "mapped", [ 1379 ] ], [ [ 1332, 1332 ], "mapped", [ 1380 ] ], [ [ 1333, 1333 ], "mapped", [ 1381 ] ], [ [ 1334, 1334 ], "mapped", [ 1382 ] ], [ [ 1335, 1335 ], "mapped", [ 1383 ] ], [ [ 1336, 1336 ], "mapped", [ 1384 ] ], [ [ 1337, 1337 ], "mapped", [ 1385 ] ], [ [ 1338, 1338 ], "mapped", [ 1386 ] ], [ [ 1339, 1339 ], "mapped", [ 1387 ] ], [ [ 1340, 1340 ], "mapped", [ 1388 ] ], [ [ 1341, 1341 ], "mapped", [ 1389 ] ], [ [ 1342, 1342 ], "mapped", [ 1390 ] ], [ [ 1343, 1343 ], "mapped", [ 1391 ] ], [ [ 1344, 1344 ], "mapped", [ 1392 ] ], [ [ 1345, 1345 ], "mapped", [ 1393 ] ], [ [ 1346, 1346 ], "mapped", [ 1394 ] ], [ [ 1347, 1347 ], "mapped", [ 1395 ] ], [ [ 1348, 1348 ], "mapped", [ 1396 ] ], [ [ 1349, 1349 ], "mapped", [ 1397 ] ], [ [ 1350, 1350 ], "mapped", [ 1398 ] ], [ [ 1351, 1351 ], "mapped", [ 1399 ] ], [ [ 1352, 1352 ], "mapped", [ 1400 ] ], [ [ 1353, 1353 ], "mapped", [ 1401 ] ], [ [ 1354, 1354 ], "mapped", [ 1402 ] ], [ [ 1355, 1355 ], "mapped", [ 1403 ] ], [ [ 1356, 1356 ], "mapped", [ 1404 ] ], [ [ 1357, 1357 ], "mapped", [ 1405 ] ], [ [ 1358, 1358 ], "mapped", [ 1406 ] ], [ [ 1359, 1359 ], "mapped", [ 1407 ] ], [ [ 1360, 1360 ], "mapped", [ 1408 ] ], [ [ 1361, 1361 ], "mapped", [ 1409 ] ], [ [ 1362, 1362 ], "mapped", [ 1410 ] ], [ [ 1363, 1363 ], "mapped", [ 1411 ] ], [ [ 1364, 1364 ], "mapped", [ 1412 ] ], [ [ 1365, 1365 ], "mapped", [ 1413 ] ], [ [ 1366, 1366 ], "mapped", [ 1414 ] ], [ [ 1367, 1368 ], "disallowed" ], [ [ 1369, 1369 ], "valid" ], [ [ 1370, 1375 ], "valid", [ ], "NV8" ], [ [ 1376, 1376 ], "disallowed" ], [ [ 1377, 1414 ], "valid" ], [ [ 1415, 1415 ], "mapped", [ 1381, 1410 ] ], [ [ 1416, 1416 ], "disallowed" ], [ [ 1417, 1417 ], "valid", [ ], "NV8" ], [ [ 1418, 1418 ], "valid", [ ], "NV8" ], [ [ 1419, 1420 ], "disallowed" ], [ [ 1421, 1422 ], "valid", [ ], "NV8" ], [ [ 1423, 1423 ], "valid", [ ], "NV8" ], [ [ 1424, 1424 ], "disallowed" ], [ [ 1425, 1441 ], "valid" ], [ [ 1442, 1442 ], "valid" ], [ [ 1443, 1455 ], "valid" ], [ [ 1456, 1465 ], "valid" ], [ [ 1466, 1466 ], "valid" ], [ [ 1467, 1469 ], "valid" ], [ [ 1470, 1470 ], "valid", [ ], "NV8" ], [ [ 1471, 1471 ], "valid" ], [ [ 1472, 1472 ], "valid", [ ], "NV8" ], [ [ 1473, 1474 ], "valid" ], [ [ 1475, 1475 ], "valid", [ ], "NV8" ], [ [ 1476, 1476 ], "valid" ], [ [ 1477, 1477 ], "valid" ], [ [ 1478, 1478 ], "valid", [ ], "NV8" ], [ [ 1479, 1479 ], "valid" ], [ [ 1480, 1487 ], "disallowed" ], [ [ 1488, 1514 ], "valid" ], [ [ 1515, 1519 ], "disallowed" ], [ [ 1520, 1524 ], "valid" ], [ [ 1525, 1535 ], "disallowed" ], [ [ 1536, 1539 ], "disallowed" ], [ [ 1540, 1540 ], "disallowed" ], [ [ 1541, 1541 ], "disallowed" ], [ [ 1542, 1546 ], "valid", [ ], "NV8" ], [ [ 1547, 1547 ], "valid", [ ], "NV8" ], [ [ 1548, 1548 ], "valid", [ ], "NV8" ], [ [ 1549, 1551 ], "valid", [ ], "NV8" ], [ [ 1552, 1557 ], "valid" ], [ [ 1558, 1562 ], "valid" ], [ [ 1563, 1563 ], "valid", [ ], "NV8" ], [ [ 1564, 1564 ], "disallowed" ], [ [ 1565, 1565 ], "disallowed" ], [ [ 1566, 1566 ], "valid", [ ], "NV8" ], [ [ 1567, 1567 ], "valid", [ ], "NV8" ], [ [ 1568, 1568 ], "valid" ], [ [ 1569, 1594 ], "valid" ], [ [ 1595, 1599 ], "valid" ], [ [ 1600, 1600 ], "valid", [ ], "NV8" ], [ [ 1601, 1618 ], "valid" ], [ [ 1619, 1621 ], "valid" ], [ [ 1622, 1624 ], "valid" ], [ [ 1625, 1630 ], "valid" ], [ [ 1631, 1631 ], "valid" ], [ [ 1632, 1641 ], "valid" ], [ [ 1642, 1645 ], "valid", [ ], "NV8" ], [ [ 1646, 1647 ], "valid" ], [ [ 1648, 1652 ], "valid" ], [ [ 1653, 1653 ], "mapped", [ 1575, 1652 ] ], [ [ 1654, 1654 ], "mapped", [ 1608, 1652 ] ], [ [ 1655, 1655 ], "mapped", [ 1735, 1652 ] ], [ [ 1656, 1656 ], "mapped", [ 1610, 1652 ] ], [ [ 1657, 1719 ], "valid" ], [ [ 1720, 1721 ], "valid" ], [ [ 1722, 1726 ], "valid" ], [ [ 1727, 1727 ], "valid" ], [ [ 1728, 1742 ], "valid" ], [ [ 1743, 1743 ], "valid" ], [ [ 1744, 1747 ], "valid" ], [ [ 1748, 1748 ], "valid", [ ], "NV8" ], [ [ 1749, 1756 ], "valid" ], [ [ 1757, 1757 ], "disallowed" ], [ [ 1758, 1758 ], "valid", [ ], "NV8" ], [ [ 1759, 1768 ], "valid" ], [ [ 1769, 1769 ], "valid", [ ], "NV8" ], [ [ 1770, 1773 ], "valid" ], [ [ 1774, 1775 ], "valid" ], [ [ 1776, 1785 ], "valid" ], [ [ 1786, 1790 ], "valid" ], [ [ 1791, 1791 ], "valid" ], [ [ 1792, 1805 ], "valid", [ ], "NV8" ], [ [ 1806, 1806 ], "disallowed" ], [ [ 1807, 1807 ], "disallowed" ], [ [ 1808, 1836 ], "valid" ], [ [ 1837, 1839 ], "valid" ], [ [ 1840, 1866 ], "valid" ], [ [ 1867, 1868 ], "disallowed" ], [ [ 1869, 1871 ], "valid" ], [ [ 1872, 1901 ], "valid" ], [ [ 1902, 1919 ], "valid" ], [ [ 1920, 1968 ], "valid" ], [ [ 1969, 1969 ], "valid" ], [ [ 1970, 1983 ], "disallowed" ], [ [ 1984, 2037 ], "valid" ], [ [ 2038, 2042 ], "valid", [ ], "NV8" ], [ [ 2043, 2047 ], "disallowed" ], [ [ 2048, 2093 ], "valid" ], [ [ 2094, 2095 ], "disallowed" ], [ [ 2096, 2110 ], "valid", [ ], "NV8" ], [ [ 2111, 2111 ], "disallowed" ], [ [ 2112, 2139 ], "valid" ], [ [ 2140, 2141 ], "disallowed" ], [ [ 2142, 2142 ], "valid", [ ], "NV8" ], [ [ 2143, 2207 ], "disallowed" ], [ [ 2208, 2208 ], "valid" ], [ [ 2209, 2209 ], "valid" ], [ [ 2210, 2220 ], "valid" ], [ [ 2221, 2226 ], "valid" ], [ [ 2227, 2228 ], "valid" ], [ [ 2229, 2274 ], "disallowed" ], [ [ 2275, 2275 ], "valid" ], [ [ 2276, 2302 ], "valid" ], [ [ 2303, 2303 ], "valid" ], [ [ 2304, 2304 ], "valid" ], [ [ 2305, 2307 ], "valid" ], [ [ 2308, 2308 ], "valid" ], [ [ 2309, 2361 ], "valid" ], [ [ 2362, 2363 ], "valid" ], [ [ 2364, 2381 ], "valid" ], [ [ 2382, 2382 ], "valid" ], [ [ 2383, 2383 ], "valid" ], [ [ 2384, 2388 ], "valid" ], [ [ 2389, 2389 ], "valid" ], [ [ 2390, 2391 ], "valid" ], [ [ 2392, 2392 ], "mapped", [ 2325, 2364 ] ], [ [ 2393, 2393 ], "mapped", [ 2326, 2364 ] ], [ [ 2394, 2394 ], "mapped", [ 2327, 2364 ] ], [ [ 2395, 2395 ], "mapped", [ 2332, 2364 ] ], [ [ 2396, 2396 ], "mapped", [ 2337, 2364 ] ], [ [ 2397, 2397 ], "mapped", [ 2338, 2364 ] ], [ [ 2398, 2398 ], "mapped", [ 2347, 2364 ] ], [ [ 2399, 2399 ], "mapped", [ 2351, 2364 ] ], [ [ 2400, 2403 ], "valid" ], [ [ 2404, 2405 ], "valid", [ ], "NV8" ], [ [ 2406, 2415 ], "valid" ], [ [ 2416, 2416 ], "valid", [ ], "NV8" ], [ [ 2417, 2418 ], "valid" ], [ [ 2419, 2423 ], "valid" ], [ [ 2424, 2424 ], "valid" ], [ [ 2425, 2426 ], "valid" ], [ [ 2427, 2428 ], "valid" ], [ [ 2429, 2429 ], "valid" ], [ [ 2430, 2431 ], "valid" ], [ [ 2432, 2432 ], "valid" ], [ [ 2433, 2435 ], "valid" ], [ [ 2436, 2436 ], "disallowed" ], [ [ 2437, 2444 ], "valid" ], [ [ 2445, 2446 ], "disallowed" ], [ [ 2447, 2448 ], "valid" ], [ [ 2449, 2450 ], "disallowed" ], [ [ 2451, 2472 ], "valid" ], [ [ 2473, 2473 ], "disallowed" ], [ [ 2474, 2480 ], "valid" ], [ [ 2481, 2481 ], "disallowed" ], [ [ 2482, 2482 ], "valid" ], [ [ 2483, 2485 ], "disallowed" ], [ [ 2486, 2489 ], "valid" ], [ [ 2490, 2491 ], "disallowed" ], [ [ 2492, 2492 ], "valid" ], [ [ 2493, 2493 ], "valid" ], [ [ 2494, 2500 ], "valid" ], [ [ 2501, 2502 ], "disallowed" ], [ [ 2503, 2504 ], "valid" ], [ [ 2505, 2506 ], "disallowed" ], [ [ 2507, 2509 ], "valid" ], [ [ 2510, 2510 ], "valid" ], [ [ 2511, 2518 ], "disallowed" ], [ [ 2519, 2519 ], "valid" ], [ [ 2520, 2523 ], "disallowed" ], [ [ 2524, 2524 ], "mapped", [ 2465, 2492 ] ], [ [ 2525, 2525 ], "mapped", [ 2466, 2492 ] ], [ [ 2526, 2526 ], "disallowed" ], [ [ 2527, 2527 ], "mapped", [ 2479, 2492 ] ], [ [ 2528, 2531 ], "valid" ], [ [ 2532, 2533 ], "disallowed" ], [ [ 2534, 2545 ], "valid" ], [ [ 2546, 2554 ], "valid", [ ], "NV8" ], [ [ 2555, 2555 ], "valid", [ ], "NV8" ], [ [ 2556, 2560 ], "disallowed" ], [ [ 2561, 2561 ], "valid" ], [ [ 2562, 2562 ], "valid" ], [ [ 2563, 2563 ], "valid" ], [ [ 2564, 2564 ], "disallowed" ], [ [ 2565, 2570 ], "valid" ], [ [ 2571, 2574 ], "disallowed" ], [ [ 2575, 2576 ], "valid" ], [ [ 2577, 2578 ], "disallowed" ], [ [ 2579, 2600 ], "valid" ], [ [ 2601, 2601 ], "disallowed" ], [ [ 2602, 2608 ], "valid" ], [ [ 2609, 2609 ], "disallowed" ], [ [ 2610, 2610 ], "valid" ], [ [ 2611, 2611 ], "mapped", [ 2610, 2620 ] ], [ [ 2612, 2612 ], "disallowed" ], [ [ 2613, 2613 ], "valid" ], [ [ 2614, 2614 ], "mapped", [ 2616, 2620 ] ], [ [ 2615, 2615 ], "disallowed" ], [ [ 2616, 2617 ], "valid" ], [ [ 2618, 2619 ], "disallowed" ], [ [ 2620, 2620 ], "valid" ], [ [ 2621, 2621 ], "disallowed" ], [ [ 2622, 2626 ], "valid" ], [ [ 2627, 2630 ], "disallowed" ], [ [ 2631, 2632 ], "valid" ], [ [ 2633, 2634 ], "disallowed" ], [ [ 2635, 2637 ], "valid" ], [ [ 2638, 2640 ], "disallowed" ], [ [ 2641, 2641 ], "valid" ], [ [ 2642, 2648 ], "disallowed" ], [ [ 2649, 2649 ], "mapped", [ 2582, 2620 ] ], [ [ 2650, 2650 ], "mapped", [ 2583, 2620 ] ], [ [ 2651, 2651 ], "mapped", [ 2588, 2620 ] ], [ [ 2652, 2652 ], "valid" ], [ [ 2653, 2653 ], "disallowed" ], [ [ 2654, 2654 ], "mapped", [ 2603, 2620 ] ], [ [ 2655, 2661 ], "disallowed" ], [ [ 2662, 2676 ], "valid" ], [ [ 2677, 2677 ], "valid" ], [ [ 2678, 2688 ], "disallowed" ], [ [ 2689, 2691 ], "valid" ], [ [ 2692, 2692 ], "disallowed" ], [ [ 2693, 2699 ], "valid" ], [ [ 2700, 2700 ], "valid" ], [ [ 2701, 2701 ], "valid" ], [ [ 2702, 2702 ], "disallowed" ], [ [ 2703, 2705 ], "valid" ], [ [ 2706, 2706 ], "disallowed" ], [ [ 2707, 2728 ], "valid" ], [ [ 2729, 2729 ], "disallowed" ], [ [ 2730, 2736 ], "valid" ], [ [ 2737, 2737 ], "disallowed" ], [ [ 2738, 2739 ], "valid" ], [ [ 2740, 2740 ], "disallowed" ], [ [ 2741, 2745 ], "valid" ], [ [ 2746, 2747 ], "disallowed" ], [ [ 2748, 2757 ], "valid" ], [ [ 2758, 2758 ], "disallowed" ], [ [ 2759, 2761 ], "valid" ], [ [ 2762, 2762 ], "disallowed" ], [ [ 2763, 2765 ], "valid" ], [ [ 2766, 2767 ], "disallowed" ], [ [ 2768, 2768 ], "valid" ], [ [ 2769, 2783 ], "disallowed" ], [ [ 2784, 2784 ], "valid" ], [ [ 2785, 2787 ], "valid" ], [ [ 2788, 2789 ], "disallowed" ], [ [ 2790, 2799 ], "valid" ], [ [ 2800, 2800 ], "valid", [ ], "NV8" ], [ [ 2801, 2801 ], "valid", [ ], "NV8" ], [ [ 2802, 2808 ], "disallowed" ], [ [ 2809, 2809 ], "valid" ], [ [ 2810, 2816 ], "disallowed" ], [ [ 2817, 2819 ], "valid" ], [ [ 2820, 2820 ], "disallowed" ], [ [ 2821, 2828 ], "valid" ], [ [ 2829, 2830 ], "disallowed" ], [ [ 2831, 2832 ], "valid" ], [ [ 2833, 2834 ], "disallowed" ], [ [ 2835, 2856 ], "valid" ], [ [ 2857, 2857 ], "disallowed" ], [ [ 2858, 2864 ], "valid" ], [ [ 2865, 2865 ], "disallowed" ], [ [ 2866, 2867 ], "valid" ], [ [ 2868, 2868 ], "disallowed" ], [ [ 2869, 2869 ], "valid" ], [ [ 2870, 2873 ], "valid" ], [ [ 2874, 2875 ], "disallowed" ], [ [ 2876, 2883 ], "valid" ], [ [ 2884, 2884 ], "valid" ], [ [ 2885, 2886 ], "disallowed" ], [ [ 2887, 2888 ], "valid" ], [ [ 2889, 2890 ], "disallowed" ], [ [ 2891, 2893 ], "valid" ], [ [ 2894, 2901 ], "disallowed" ], [ [ 2902, 2903 ], "valid" ], [ [ 2904, 2907 ], "disallowed" ], [ [ 2908, 2908 ], "mapped", [ 2849, 2876 ] ], [ [ 2909, 2909 ], "mapped", [ 2850, 2876 ] ], [ [ 2910, 2910 ], "disallowed" ], [ [ 2911, 2913 ], "valid" ], [ [ 2914, 2915 ], "valid" ], [ [ 2916, 2917 ], "disallowed" ], [ [ 2918, 2927 ], "valid" ], [ [ 2928, 2928 ], "valid", [ ], "NV8" ], [ [ 2929, 2929 ], "valid" ], [ [ 2930, 2935 ], "valid", [ ], "NV8" ], [ [ 2936, 2945 ], "disallowed" ], [ [ 2946, 2947 ], "valid" ], [ [ 2948, 2948 ], "disallowed" ], [ [ 2949, 2954 ], "valid" ], [ [ 2955, 2957 ], "disallowed" ], [ [ 2958, 2960 ], "valid" ], [ [ 2961, 2961 ], "disallowed" ], [ [ 2962, 2965 ], "valid" ], [ [ 2966, 2968 ], "disallowed" ], [ [ 2969, 2970 ], "valid" ], [ [ 2971, 2971 ], "disallowed" ], [ [ 2972, 2972 ], "valid" ], [ [ 2973, 2973 ], "disallowed" ], [ [ 2974, 2975 ], "valid" ], [ [ 2976, 2978 ], "disallowed" ], [ [ 2979, 2980 ], "valid" ], [ [ 2981, 2983 ], "disallowed" ], [ [ 2984, 2986 ], "valid" ], [ [ 2987, 2989 ], "disallowed" ], [ [ 2990, 2997 ], "valid" ], [ [ 2998, 2998 ], "valid" ], [ [ 2999, 3001 ], "valid" ], [ [ 3002, 3005 ], "disallowed" ], [ [ 3006, 3010 ], "valid" ], [ [ 3011, 3013 ], "disallowed" ], [ [ 3014, 3016 ], "valid" ], [ [ 3017, 3017 ], "disallowed" ], [ [ 3018, 3021 ], "valid" ], [ [ 3022, 3023 ], "disallowed" ], [ [ 3024, 3024 ], "valid" ], [ [ 3025, 3030 ], "disallowed" ], [ [ 3031, 3031 ], "valid" ], [ [ 3032, 3045 ], "disallowed" ], [ [ 3046, 3046 ], "valid" ], [ [ 3047, 3055 ], "valid" ], [ [ 3056, 3058 ], "valid", [ ], "NV8" ], [ [ 3059, 3066 ], "valid", [ ], "NV8" ], [ [ 3067, 3071 ], "disallowed" ], [ [ 3072, 3072 ], "valid" ], [ [ 3073, 3075 ], "valid" ], [ [ 3076, 3076 ], "disallowed" ], [ [ 3077, 3084 ], "valid" ], [ [ 3085, 3085 ], "disallowed" ], [ [ 3086, 3088 ], "valid" ], [ [ 3089, 3089 ], "disallowed" ], [ [ 3090, 3112 ], "valid" ], [ [ 3113, 3113 ], "disallowed" ], [ [ 3114, 3123 ], "valid" ], [ [ 3124, 3124 ], "valid" ], [ [ 3125, 3129 ], "valid" ], [ [ 3130, 3132 ], "disallowed" ], [ [ 3133, 3133 ], "valid" ], [ [ 3134, 3140 ], "valid" ], [ [ 3141, 3141 ], "disallowed" ], [ [ 3142, 3144 ], "valid" ], [ [ 3145, 3145 ], "disallowed" ], [ [ 3146, 3149 ], "valid" ], [ [ 3150, 3156 ], "disallowed" ], [ [ 3157, 3158 ], "valid" ], [ [ 3159, 3159 ], "disallowed" ], [ [ 3160, 3161 ], "valid" ], [ [ 3162, 3162 ], "valid" ], [ [ 3163, 3167 ], "disallowed" ], [ [ 3168, 3169 ], "valid" ], [ [ 3170, 3171 ], "valid" ], [ [ 3172, 3173 ], "disallowed" ], [ [ 3174, 3183 ], "valid" ], [ [ 3184, 3191 ], "disallowed" ], [ [ 3192, 3199 ], "valid", [ ], "NV8" ], [ [ 3200, 3200 ], "disallowed" ], [ [ 3201, 3201 ], "valid" ], [ [ 3202, 3203 ], "valid" ], [ [ 3204, 3204 ], "disallowed" ], [ [ 3205, 3212 ], "valid" ], [ [ 3213, 3213 ], "disallowed" ], [ [ 3214, 3216 ], "valid" ], [ [ 3217, 3217 ], "disallowed" ], [ [ 3218, 3240 ], "valid" ], [ [ 3241, 3241 ], "disallowed" ], [ [ 3242, 3251 ], "valid" ], [ [ 3252, 3252 ], "disallowed" ], [ [ 3253, 3257 ], "valid" ], [ [ 3258, 3259 ], "disallowed" ], [ [ 3260, 3261 ], "valid" ], [ [ 3262, 3268 ], "valid" ], [ [ 3269, 3269 ], "disallowed" ], [ [ 3270, 3272 ], "valid" ], [ [ 3273, 3273 ], "disallowed" ], [ [ 3274, 3277 ], "valid" ], [ [ 3278, 3284 ], "disallowed" ], [ [ 3285, 3286 ], "valid" ], [ [ 3287, 3293 ], "disallowed" ], [ [ 3294, 3294 ], "valid" ], [ [ 3295, 3295 ], "disallowed" ], [ [ 3296, 3297 ], "valid" ], [ [ 3298, 3299 ], "valid" ], [ [ 3300, 3301 ], "disallowed" ], [ [ 3302, 3311 ], "valid" ], [ [ 3312, 3312 ], "disallowed" ], [ [ 3313, 3314 ], "valid" ], [ [ 3315, 3328 ], "disallowed" ], [ [ 3329, 3329 ], "valid" ], [ [ 3330, 3331 ], "valid" ], [ [ 3332, 3332 ], "disallowed" ], [ [ 3333, 3340 ], "valid" ], [ [ 3341, 3341 ], "disallowed" ], [ [ 3342, 3344 ], "valid" ], [ [ 3345, 3345 ], "disallowed" ], [ [ 3346, 3368 ], "valid" ], [ [ 3369, 3369 ], "valid" ], [ [ 3370, 3385 ], "valid" ], [ [ 3386, 3386 ], "valid" ], [ [ 3387, 3388 ], "disallowed" ], [ [ 3389, 3389 ], "valid" ], [ [ 3390, 3395 ], "valid" ], [ [ 3396, 3396 ], "valid" ], [ [ 3397, 3397 ], "disallowed" ], [ [ 3398, 3400 ], "valid" ], [ [ 3401, 3401 ], "disallowed" ], [ [ 3402, 3405 ], "valid" ], [ [ 3406, 3406 ], "valid" ], [ [ 3407, 3414 ], "disallowed" ], [ [ 3415, 3415 ], "valid" ], [ [ 3416, 3422 ], "disallowed" ], [ [ 3423, 3423 ], "valid" ], [ [ 3424, 3425 ], "valid" ], [ [ 3426, 3427 ], "valid" ], [ [ 3428, 3429 ], "disallowed" ], [ [ 3430, 3439 ], "valid" ], [ [ 3440, 3445 ], "valid", [ ], "NV8" ], [ [ 3446, 3448 ], "disallowed" ], [ [ 3449, 3449 ], "valid", [ ], "NV8" ], [ [ 3450, 3455 ], "valid" ], [ [ 3456, 3457 ], "disallowed" ], [ [ 3458, 3459 ], "valid" ], [ [ 3460, 3460 ], "disallowed" ], [ [ 3461, 3478 ], "valid" ], [ [ 3479, 3481 ], "disallowed" ], [ [ 3482, 3505 ], "valid" ], [ [ 3506, 3506 ], "disallowed" ], [ [ 3507, 3515 ], "valid" ], [ [ 3516, 3516 ], "disallowed" ], [ [ 3517, 3517 ], "valid" ], [ [ 3518, 3519 ], "disallowed" ], [ [ 3520, 3526 ], "valid" ], [ [ 3527, 3529 ], "disallowed" ], [ [ 3530, 3530 ], "valid" ], [ [ 3531, 3534 ], "disallowed" ], [ [ 3535, 3540 ], "valid" ], [ [ 3541, 3541 ], "disallowed" ], [ [ 3542, 3542 ], "valid" ], [ [ 3543, 3543 ], "disallowed" ], [ [ 3544, 3551 ], "valid" ], [ [ 3552, 3557 ], "disallowed" ], [ [ 3558, 3567 ], "valid" ], [ [ 3568, 3569 ], "disallowed" ], [ [ 3570, 3571 ], "valid" ], [ [ 3572, 3572 ], "valid", [ ], "NV8" ], [ [ 3573, 3584 ], "disallowed" ], [ [ 3585, 3634 ], "valid" ], [ [ 3635, 3635 ], "mapped", [ 3661, 3634 ] ], [ [ 3636, 3642 ], "valid" ], [ [ 3643, 3646 ], "disallowed" ], [ [ 3647, 3647 ], "valid", [ ], "NV8" ], [ [ 3648, 3662 ], "valid" ], [ [ 3663, 3663 ], "valid", [ ], "NV8" ], [ [ 3664, 3673 ], "valid" ], [ [ 3674, 3675 ], "valid", [ ], "NV8" ], [ [ 3676, 3712 ], "disallowed" ], [ [ 3713, 3714 ], "valid" ], [ [ 3715, 3715 ], "disallowed" ], [ [ 3716, 3716 ], "valid" ], [ [ 3717, 3718 ], "disallowed" ], [ [ 3719, 3720 ], "valid" ], [ [ 3721, 3721 ], "disallowed" ], [ [ 3722, 3722 ], "valid" ], [ [ 3723, 3724 ], "disallowed" ], [ [ 3725, 3725 ], "valid" ], [ [ 3726, 3731 ], "disallowed" ], [ [ 3732, 3735 ], "valid" ], [ [ 3736, 3736 ], "disallowed" ], [ [ 3737, 3743 ], "valid" ], [ [ 3744, 3744 ], "disallowed" ], [ [ 3745, 3747 ], "valid" ], [ [ 3748, 3748 ], "disallowed" ], [ [ 3749, 3749 ], "valid" ], [ [ 3750, 3750 ], "disallowed" ], [ [ 3751, 3751 ], "valid" ], [ [ 3752, 3753 ], "disallowed" ], [ [ 3754, 3755 ], "valid" ], [ [ 3756, 3756 ], "disallowed" ], [ [ 3757, 3762 ], "valid" ], [ [ 3763, 3763 ], "mapped", [ 3789, 3762 ] ], [ [ 3764, 3769 ], "valid" ], [ [ 3770, 3770 ], "disallowed" ], [ [ 3771, 3773 ], "valid" ], [ [ 3774, 3775 ], "disallowed" ], [ [ 3776, 3780 ], "valid" ], [ [ 3781, 3781 ], "disallowed" ], [ [ 3782, 3782 ], "valid" ], [ [ 3783, 3783 ], "disallowed" ], [ [ 3784, 3789 ], "valid" ], [ [ 3790, 3791 ], "disallowed" ], [ [ 3792, 3801 ], "valid" ], [ [ 3802, 3803 ], "disallowed" ], [ [ 3804, 3804 ], "mapped", [ 3755, 3737 ] ], [ [ 3805, 3805 ], "mapped", [ 3755, 3745 ] ], [ [ 3806, 3807 ], "valid" ], [ [ 3808, 3839 ], "disallowed" ], [ [ 3840, 3840 ], "valid" ], [ [ 3841, 3850 ], "valid", [ ], "NV8" ], [ [ 3851, 3851 ], "valid" ], [ [ 3852, 3852 ], "mapped", [ 3851 ] ], [ [ 3853, 3863 ], "valid", [ ], "NV8" ], [ [ 3864, 3865 ], "valid" ], [ [ 3866, 3871 ], "valid", [ ], "NV8" ], [ [ 3872, 3881 ], "valid" ], [ [ 3882, 3892 ], "valid", [ ], "NV8" ], [ [ 3893, 3893 ], "valid" ], [ [ 3894, 3894 ], "valid", [ ], "NV8" ], [ [ 3895, 3895 ], "valid" ], [ [ 3896, 3896 ], "valid", [ ], "NV8" ], [ [ 3897, 3897 ], "valid" ], [ [ 3898, 3901 ], "valid", [ ], "NV8" ], [ [ 3902, 3906 ], "valid" ], [ [ 3907, 3907 ], "mapped", [ 3906, 4023 ] ], [ [ 3908, 3911 ], "valid" ], [ [ 3912, 3912 ], "disallowed" ], [ [ 3913, 3916 ], "valid" ], [ [ 3917, 3917 ], "mapped", [ 3916, 4023 ] ], [ [ 3918, 3921 ], "valid" ], [ [ 3922, 3922 ], "mapped", [ 3921, 4023 ] ], [ [ 3923, 3926 ], "valid" ], [ [ 3927, 3927 ], "mapped", [ 3926, 4023 ] ], [ [ 3928, 3931 ], "valid" ], [ [ 3932, 3932 ], "mapped", [ 3931, 4023 ] ], [ [ 3933, 3944 ], "valid" ], [ [ 3945, 3945 ], "mapped", [ 3904, 4021 ] ], [ [ 3946, 3946 ], "valid" ], [ [ 3947, 3948 ], "valid" ], [ [ 3949, 3952 ], "disallowed" ], [ [ 3953, 3954 ], "valid" ], [ [ 3955, 3955 ], "mapped", [ 3953, 3954 ] ], [ [ 3956, 3956 ], "valid" ], [ [ 3957, 3957 ], "mapped", [ 3953, 3956 ] ], [ [ 3958, 3958 ], "mapped", [ 4018, 3968 ] ], [ [ 3959, 3959 ], "mapped", [ 4018, 3953, 3968 ] ], [ [ 3960, 3960 ], "mapped", [ 4019, 3968 ] ], [ [ 3961, 3961 ], "mapped", [ 4019, 3953, 3968 ] ], [ [ 3962, 3968 ], "valid" ], [ [ 3969, 3969 ], "mapped", [ 3953, 3968 ] ], [ [ 3970, 3972 ], "valid" ], [ [ 3973, 3973 ], "valid", [ ], "NV8" ], [ [ 3974, 3979 ], "valid" ], [ [ 3980, 3983 ], "valid" ], [ [ 3984, 3986 ], "valid" ], [ [ 3987, 3987 ], "mapped", [ 3986, 4023 ] ], [ [ 3988, 3989 ], "valid" ], [ [ 3990, 3990 ], "valid" ], [ [ 3991, 3991 ], "valid" ], [ [ 3992, 3992 ], "disallowed" ], [ [ 3993, 3996 ], "valid" ], [ [ 3997, 3997 ], "mapped", [ 3996, 4023 ] ], [ [ 3998, 4001 ], "valid" ], [ [ 4002, 4002 ], "mapped", [ 4001, 4023 ] ], [ [ 4003, 4006 ], "valid" ], [ [ 4007, 4007 ], "mapped", [ 4006, 4023 ] ], [ [ 4008, 4011 ], "valid" ], [ [ 4012, 4012 ], "mapped", [ 4011, 4023 ] ], [ [ 4013, 4013 ], "valid" ], [ [ 4014, 4016 ], "valid" ], [ [ 4017, 4023 ], "valid" ], [ [ 4024, 4024 ], "valid" ], [ [ 4025, 4025 ], "mapped", [ 3984, 4021 ] ], [ [ 4026, 4028 ], "valid" ], [ [ 4029, 4029 ], "disallowed" ], [ [ 4030, 4037 ], "valid", [ ], "NV8" ], [ [ 4038, 4038 ], "valid" ], [ [ 4039, 4044 ], "valid", [ ], "NV8" ], [ [ 4045, 4045 ], "disallowed" ], [ [ 4046, 4046 ], "valid", [ ], "NV8" ], [ [ 4047, 4047 ], "valid", [ ], "NV8" ], [ [ 4048, 4049 ], "valid", [ ], "NV8" ], [ [ 4050, 4052 ], "valid", [ ], "NV8" ], [ [ 4053, 4056 ], "valid", [ ], "NV8" ], [ [ 4057, 4058 ], "valid", [ ], "NV8" ], [ [ 4059, 4095 ], "disallowed" ], [ [ 4096, 4129 ], "valid" ], [ [ 4130, 4130 ], "valid" ], [ [ 4131, 4135 ], "valid" ], [ [ 4136, 4136 ], "valid" ], [ [ 4137, 4138 ], "valid" ], [ [ 4139, 4139 ], "valid" ], [ [ 4140, 4146 ], "valid" ], [ [ 4147, 4149 ], "valid" ], [ [ 4150, 4153 ], "valid" ], [ [ 4154, 4159 ], "valid" ], [ [ 4160, 4169 ], "valid" ], [ [ 4170, 4175 ], "valid", [ ], "NV8" ], [ [ 4176, 4185 ], "valid" ], [ [ 4186, 4249 ], "valid" ], [ [ 4250, 4253 ], "valid" ], [ [ 4254, 4255 ], "valid", [ ], "NV8" ], [ [ 4256, 4293 ], "disallowed" ], [ [ 4294, 4294 ], "disallowed" ], [ [ 4295, 4295 ], "mapped", [ 11559 ] ], [ [ 4296, 4300 ], "disallowed" ], [ [ 4301, 4301 ], "mapped", [ 11565 ] ], [ [ 4302, 4303 ], "disallowed" ], [ [ 4304, 4342 ], "valid" ], [ [ 4343, 4344 ], "valid" ], [ [ 4345, 4346 ], "valid" ], [ [ 4347, 4347 ], "valid", [ ], "NV8" ], [ [ 4348, 4348 ], "mapped", [ 4316 ] ], [ [ 4349, 4351 ], "valid" ], [ [ 4352, 4441 ], "valid", [ ], "NV8" ], [ [ 4442, 4446 ], "valid", [ ], "NV8" ], [ [ 4447, 4448 ], "disallowed" ], [ [ 4449, 4514 ], "valid", [ ], "NV8" ], [ [ 4515, 4519 ], "valid", [ ], "NV8" ], [ [ 4520, 4601 ], "valid", [ ], "NV8" ], [ [ 4602, 4607 ], "valid", [ ], "NV8" ], [ [ 4608, 4614 ], "valid" ], [ [ 4615, 4615 ], "valid" ], [ [ 4616, 4678 ], "valid" ], [ [ 4679, 4679 ], "valid" ], [ [ 4680, 4680 ], "valid" ], [ [ 4681, 4681 ], "disallowed" ], [ [ 4682, 4685 ], "valid" ], [ [ 4686, 4687 ], "disallowed" ], [ [ 4688, 4694 ], "valid" ], [ [ 4695, 4695 ], "disallowed" ], [ [ 4696, 4696 ], "valid" ], [ [ 4697, 4697 ], "disallowed" ], [ [ 4698, 4701 ], "valid" ], [ [ 4702, 4703 ], "disallowed" ], [ [ 4704, 4742 ], "valid" ], [ [ 4743, 4743 ], "valid" ], [ [ 4744, 4744 ], "valid" ], [ [ 4745, 4745 ], "disallowed" ], [ [ 4746, 4749 ], "valid" ], [ [ 4750, 4751 ], "disallowed" ], [ [ 4752, 4782 ], "valid" ], [ [ 4783, 4783 ], "valid" ], [ [ 4784, 4784 ], "valid" ], [ [ 4785, 4785 ], "disallowed" ], [ [ 4786, 4789 ], "valid" ], [ [ 4790, 4791 ], "disallowed" ], [ [ 4792, 4798 ], "valid" ], [ [ 4799, 4799 ], "disallowed" ], [ [ 4800, 4800 ], "valid" ], [ [ 4801, 4801 ], "disallowed" ], [ [ 4802, 4805 ], "valid" ], [ [ 4806, 4807 ], "disallowed" ], [ [ 4808, 4814 ], "valid" ], [ [ 4815, 4815 ], "valid" ], [ [ 4816, 4822 ], "valid" ], [ [ 4823, 4823 ], "disallowed" ], [ [ 4824, 4846 ], "valid" ], [ [ 4847, 4847 ], "valid" ], [ [ 4848, 4878 ], "valid" ], [ [ 4879, 4879 ], "valid" ], [ [ 4880, 4880 ], "valid" ], [ [ 4881, 4881 ], "disallowed" ], [ [ 4882, 4885 ], "valid" ], [ [ 4886, 4887 ], "disallowed" ], [ [ 4888, 4894 ], "valid" ], [ [ 4895, 4895 ], "valid" ], [ [ 4896, 4934 ], "valid" ], [ [ 4935, 4935 ], "valid" ], [ [ 4936, 4954 ], "valid" ], [ [ 4955, 4956 ], "disallowed" ], [ [ 4957, 4958 ], "valid" ], [ [ 4959, 4959 ], "valid" ], [ [ 4960, 4960 ], "valid", [ ], "NV8" ], [ [ 4961, 4988 ], "valid", [ ], "NV8" ], [ [ 4989, 4991 ], "disallowed" ], [ [ 4992, 5007 ], "valid" ], [ [ 5008, 5017 ], "valid", [ ], "NV8" ], [ [ 5018, 5023 ], "disallowed" ], [ [ 5024, 5108 ], "valid" ], [ [ 5109, 5109 ], "valid" ], [ [ 5110, 5111 ], "disallowed" ], [ [ 5112, 5112 ], "mapped", [ 5104 ] ], [ [ 5113, 5113 ], "mapped", [ 5105 ] ], [ [ 5114, 5114 ], "mapped", [ 5106 ] ], [ [ 5115, 5115 ], "mapped", [ 5107 ] ], [ [ 5116, 5116 ], "mapped", [ 5108 ] ], [ [ 5117, 5117 ], "mapped", [ 5109 ] ], [ [ 5118, 5119 ], "disallowed" ], [ [ 5120, 5120 ], "valid", [ ], "NV8" ], [ [ 5121, 5740 ], "valid" ], [ [ 5741, 5742 ], "valid", [ ], "NV8" ], [ [ 5743, 5750 ], "valid" ], [ [ 5751, 5759 ], "valid" ], [ [ 5760, 5760 ], "disallowed" ], [ [ 5761, 5786 ], "valid" ], [ [ 5787, 5788 ], "valid", [ ], "NV8" ], [ [ 5789, 5791 ], "disallowed" ], [ [ 5792, 5866 ], "valid" ], [ [ 5867, 5872 ], "valid", [ ], "NV8" ], [ [ 5873, 5880 ], "valid" ], [ [ 5881, 5887 ], "disallowed" ], [ [ 5888, 5900 ], "valid" ], [ [ 5901, 5901 ], "disallowed" ], [ [ 5902, 5908 ], "valid" ], [ [ 5909, 5919 ], "disallowed" ], [ [ 5920, 5940 ], "valid" ], [ [ 5941, 5942 ], "valid", [ ], "NV8" ], [ [ 5943, 5951 ], "disallowed" ], [ [ 5952, 5971 ], "valid" ], [ [ 5972, 5983 ], "disallowed" ], [ [ 5984, 5996 ], "valid" ], [ [ 5997, 5997 ], "disallowed" ], [ [ 5998, 6000 ], "valid" ], [ [ 6001, 6001 ], "disallowed" ], [ [ 6002, 6003 ], "valid" ], [ [ 6004, 6015 ], "disallowed" ], [ [ 6016, 6067 ], "valid" ], [ [ 6068, 6069 ], "disallowed" ], [ [ 6070, 6099 ], "valid" ], [ [ 6100, 6102 ], "valid", [ ], "NV8" ], [ [ 6103, 6103 ], "valid" ], [ [ 6104, 6107 ], "valid", [ ], "NV8" ], [ [ 6108, 6108 ], "valid" ], [ [ 6109, 6109 ], "valid" ], [ [ 6110, 6111 ], "disallowed" ], [ [ 6112, 6121 ], "valid" ], [ [ 6122, 6127 ], "disallowed" ], [ [ 6128, 6137 ], "valid", [ ], "NV8" ], [ [ 6138, 6143 ], "disallowed" ], [ [ 6144, 6149 ], "valid", [ ], "NV8" ], [ [ 6150, 6150 ], "disallowed" ], [ [ 6151, 6154 ], "valid", [ ], "NV8" ], [ [ 6155, 6157 ], "ignored" ], [ [ 6158, 6158 ], "disallowed" ], [ [ 6159, 6159 ], "disallowed" ], [ [ 6160, 6169 ], "valid" ], [ [ 6170, 6175 ], "disallowed" ], [ [ 6176, 6263 ], "valid" ], [ [ 6264, 6271 ], "disallowed" ], [ [ 6272, 6313 ], "valid" ], [ [ 6314, 6314 ], "valid" ], [ [ 6315, 6319 ], "disallowed" ], [ [ 6320, 6389 ], "valid" ], [ [ 6390, 6399 ], "disallowed" ], [ [ 6400, 6428 ], "valid" ], [ [ 6429, 6430 ], "valid" ], [ [ 6431, 6431 ], "disallowed" ], [ [ 6432, 6443 ], "valid" ], [ [ 6444, 6447 ], "disallowed" ], [ [ 6448, 6459 ], "valid" ], [ [ 6460, 6463 ], "disallowed" ], [ [ 6464, 6464 ], "valid", [ ], "NV8" ], [ [ 6465, 6467 ], "disallowed" ], [ [ 6468, 6469 ], "valid", [ ], "NV8" ], [ [ 6470, 6509 ], "valid" ], [ [ 6510, 6511 ], "disallowed" ], [ [ 6512, 6516 ], "valid" ], [ [ 6517, 6527 ], "disallowed" ], [ [ 6528, 6569 ], "valid" ], [ [ 6570, 6571 ], "valid" ], [ [ 6572, 6575 ], "disallowed" ], [ [ 6576, 6601 ], "valid" ], [ [ 6602, 6607 ], "disallowed" ], [ [ 6608, 6617 ], "valid" ], [ [ 6618, 6618 ], "valid", [ ], "XV8" ], [ [ 6619, 6621 ], "disallowed" ], [ [ 6622, 6623 ], "valid", [ ], "NV8" ], [ [ 6624, 6655 ], "valid", [ ], "NV8" ], [ [ 6656, 6683 ], "valid" ], [ [ 6684, 6685 ], "disallowed" ], [ [ 6686, 6687 ], "valid", [ ], "NV8" ], [ [ 6688, 6750 ], "valid" ], [ [ 6751, 6751 ], "disallowed" ], [ [ 6752, 6780 ], "valid" ], [ [ 6781, 6782 ], "disallowed" ], [ [ 6783, 6793 ], "valid" ], [ [ 6794, 6799 ], "disallowed" ], [ [ 6800, 6809 ], "valid" ], [ [ 6810, 6815 ], "disallowed" ], [ [ 6816, 6822 ], "valid", [ ], "NV8" ], [ [ 6823, 6823 ], "valid" ], [ [ 6824, 6829 ], "valid", [ ], "NV8" ], [ [ 6830, 6831 ], "disallowed" ], [ [ 6832, 6845 ], "valid" ], [ [ 6846, 6846 ], "valid", [ ], "NV8" ], [ [ 6847, 6911 ], "disallowed" ], [ [ 6912, 6987 ], "valid" ], [ [ 6988, 6991 ], "disallowed" ], [ [ 6992, 7001 ], "valid" ], [ [ 7002, 7018 ], "valid", [ ], "NV8" ], [ [ 7019, 7027 ], "valid" ], [ [ 7028, 7036 ], "valid", [ ], "NV8" ], [ [ 7037, 7039 ], "disallowed" ], [ [ 7040, 7082 ], "valid" ], [ [ 7083, 7085 ], "valid" ], [ [ 7086, 7097 ], "valid" ], [ [ 7098, 7103 ], "valid" ], [ [ 7104, 7155 ], "valid" ], [ [ 7156, 7163 ], "disallowed" ], [ [ 7164, 7167 ], "valid", [ ], "NV8" ], [ [ 7168, 7223 ], "valid" ], [ [ 7224, 7226 ], "disallowed" ], [ [ 7227, 7231 ], "valid", [ ], "NV8" ], [ [ 7232, 7241 ], "valid" ], [ [ 7242, 7244 ], "disallowed" ], [ [ 7245, 7293 ], "valid" ], [ [ 7294, 7295 ], "valid", [ ], "NV8" ], [ [ 7296, 7359 ], "disallowed" ], [ [ 7360, 7367 ], "valid", [ ], "NV8" ], [ [ 7368, 7375 ], "disallowed" ], [ [ 7376, 7378 ], "valid" ], [ [ 7379, 7379 ], "valid", [ ], "NV8" ], [ [ 7380, 7410 ], "valid" ], [ [ 7411, 7414 ], "valid" ], [ [ 7415, 7415 ], "disallowed" ], [ [ 7416, 7417 ], "valid" ], [ [ 7418, 7423 ], "disallowed" ], [ [ 7424, 7467 ], "valid" ], [ [ 7468, 7468 ], "mapped", [ 97 ] ], [ [ 7469, 7469 ], "mapped", [ 230 ] ], [ [ 7470, 7470 ], "mapped", [ 98 ] ], [ [ 7471, 7471 ], "valid" ], [ [ 7472, 7472 ], "mapped", [ 100 ] ], [ [ 7473, 7473 ], "mapped", [ 101 ] ], [ [ 7474, 7474 ], "mapped", [ 477 ] ], [ [ 7475, 7475 ], "mapped", [ 103 ] ], [ [ 7476, 7476 ], "mapped", [ 104 ] ], [ [ 7477, 7477 ], "mapped", [ 105 ] ], [ [ 7478, 7478 ], "mapped", [ 106 ] ], [ [ 7479, 7479 ], "mapped", [ 107 ] ], [ [ 7480, 7480 ], "mapped", [ 108 ] ], [ [ 7481, 7481 ], "mapped", [ 109 ] ], [ [ 7482, 7482 ], "mapped", [ 110 ] ], [ [ 7483, 7483 ], "valid" ], [ [ 7484, 7484 ], "mapped", [ 111 ] ], [ [ 7485, 7485 ], "mapped", [ 547 ] ], [ [ 7486, 7486 ], "mapped", [ 112 ] ], [ [ 7487, 7487 ], "mapped", [ 114 ] ], [ [ 7488, 7488 ], "mapped", [ 116 ] ], [ [ 7489, 7489 ], "mapped", [ 117 ] ], [ [ 7490, 7490 ], "mapped", [ 119 ] ], [ [ 7491, 7491 ], "mapped", [ 97 ] ], [ [ 7492, 7492 ], "mapped", [ 592 ] ], [ [ 7493, 7493 ], "mapped", [ 593 ] ], [ [ 7494, 7494 ], "mapped", [ 7426 ] ], [ [ 7495, 7495 ], "mapped", [ 98 ] ], [ [ 7496, 7496 ], "mapped", [ 100 ] ], [ [ 7497, 7497 ], "mapped", [ 101 ] ], [ [ 7498, 7498 ], "mapped", [ 601 ] ], [ [ 7499, 7499 ], "mapped", [ 603 ] ], [ [ 7500, 7500 ], "mapped", [ 604 ] ], [ [ 7501, 7501 ], "mapped", [ 103 ] ], [ [ 7502, 7502 ], "valid" ], [ [ 7503, 7503 ], "mapped", [ 107 ] ], [ [ 7504, 7504 ], "mapped", [ 109 ] ], [ [ 7505, 7505 ], "mapped", [ 331 ] ], [ [ 7506, 7506 ], "mapped", [ 111 ] ], [ [ 7507, 7507 ], "mapped", [ 596 ] ], [ [ 7508, 7508 ], "mapped", [ 7446 ] ], [ [ 7509, 7509 ], "mapped", [ 7447 ] ], [ [ 7510, 7510 ], "mapped", [ 112 ] ], [ [ 7511, 7511 ], "mapped", [ 116 ] ], [ [ 7512, 7512 ], "mapped", [ 117 ] ], [ [ 7513, 7513 ], "mapped", [ 7453 ] ], [ [ 7514, 7514 ], "mapped", [ 623 ] ], [ [ 7515, 7515 ], "mapped", [ 118 ] ], [ [ 7516, 7516 ], "mapped", [ 7461 ] ], [ [ 7517, 7517 ], "mapped", [ 946 ] ], [ [ 7518, 7518 ], "mapped", [ 947 ] ], [ [ 7519, 7519 ], "mapped", [ 948 ] ], [ [ 7520, 7520 ], "mapped", [ 966 ] ], [ [ 7521, 7521 ], "mapped", [ 967 ] ], [ [ 7522, 7522 ], "mapped", [ 105 ] ], [ [ 7523, 7523 ], "mapped", [ 114 ] ], [ [ 7524, 7524 ], "mapped", [ 117 ] ], [ [ 7525, 7525 ], "mapped", [ 118 ] ], [ [ 7526, 7526 ], "mapped", [ 946 ] ], [ [ 7527, 7527 ], "mapped", [ 947 ] ], [ [ 7528, 7528 ], "mapped", [ 961 ] ], [ [ 7529, 7529 ], "mapped", [ 966 ] ], [ [ 7530, 7530 ], "mapped", [ 967 ] ], [ [ 7531, 7531 ], "valid" ], [ [ 7532, 7543 ], "valid" ], [ [ 7544, 7544 ], "mapped", [ 1085 ] ], [ [ 7545, 7578 ], "valid" ], [ [ 7579, 7579 ], "mapped", [ 594 ] ], [ [ 7580, 7580 ], "mapped", [ 99 ] ], [ [ 7581, 7581 ], "mapped", [ 597 ] ], [ [ 7582, 7582 ], "mapped", [ 240 ] ], [ [ 7583, 7583 ], "mapped", [ 604 ] ], [ [ 7584, 7584 ], "mapped", [ 102 ] ], [ [ 7585, 7585 ], "mapped", [ 607 ] ], [ [ 7586, 7586 ], "mapped", [ 609 ] ], [ [ 7587, 7587 ], "mapped", [ 613 ] ], [ [ 7588, 7588 ], "mapped", [ 616 ] ], [ [ 7589, 7589 ], "mapped", [ 617 ] ], [ [ 7590, 7590 ], "mapped", [ 618 ] ], [ [ 7591, 7591 ], "mapped", [ 7547 ] ], [ [ 7592, 7592 ], "mapped", [ 669 ] ], [ [ 7593, 7593 ], "mapped", [ 621 ] ], [ [ 7594, 7594 ], "mapped", [ 7557 ] ], [ [ 7595, 7595 ], "mapped", [ 671 ] ], [ [ 7596, 7596 ], "mapped", [ 625 ] ], [ [ 7597, 7597 ], "mapped", [ 624 ] ], [ [ 7598, 7598 ], "mapped", [ 626 ] ], [ [ 7599, 7599 ], "mapped", [ 627 ] ], [ [ 7600, 7600 ], "mapped", [ 628 ] ], [ [ 7601, 7601 ], "mapped", [ 629 ] ], [ [ 7602, 7602 ], "mapped", [ 632 ] ], [ [ 7603, 7603 ], "mapped", [ 642 ] ], [ [ 7604, 7604 ], "mapped", [ 643 ] ], [ [ 7605, 7605 ], "mapped", [ 427 ] ], [ [ 7606, 7606 ], "mapped", [ 649 ] ], [ [ 7607, 7607 ], "mapped", [ 650 ] ], [ [ 7608, 7608 ], "mapped", [ 7452 ] ], [ [ 7609, 7609 ], "mapped", [ 651 ] ], [ [ 7610, 7610 ], "mapped", [ 652 ] ], [ [ 7611, 7611 ], "mapped", [ 122 ] ], [ [ 7612, 7612 ], "mapped", [ 656 ] ], [ [ 7613, 7613 ], "mapped", [ 657 ] ], [ [ 7614, 7614 ], "mapped", [ 658 ] ], [ [ 7615, 7615 ], "mapped", [ 952 ] ], [ [ 7616, 7619 ], "valid" ], [ [ 7620, 7626 ], "valid" ], [ [ 7627, 7654 ], "valid" ], [ [ 7655, 7669 ], "valid" ], [ [ 7670, 7675 ], "disallowed" ], [ [ 7676, 7676 ], "valid" ], [ [ 7677, 7677 ], "valid" ], [ [ 7678, 7679 ], "valid" ], [ [ 7680, 7680 ], "mapped", [ 7681 ] ], [ [ 7681, 7681 ], "valid" ], [ [ 7682, 7682 ], "mapped", [ 7683 ] ], [ [ 7683, 7683 ], "valid" ], [ [ 7684, 7684 ], "mapped", [ 7685 ] ], [ [ 7685, 7685 ], "valid" ], [ [ 7686, 7686 ], "mapped", [ 7687 ] ], [ [ 7687, 7687 ], "valid" ], [ [ 7688, 7688 ], "mapped", [ 7689 ] ], [ [ 7689, 7689 ], "valid" ], [ [ 7690, 7690 ], "mapped", [ 7691 ] ], [ [ 7691, 7691 ], "valid" ], [ [ 7692, 7692 ], "mapped", [ 7693 ] ], [ [ 7693, 7693 ], "valid" ], [ [ 7694, 7694 ], "mapped", [ 7695 ] ], [ [ 7695, 7695 ], "valid" ], [ [ 7696, 7696 ], "mapped", [ 7697 ] ], [ [ 7697, 7697 ], "valid" ], [ [ 7698, 7698 ], "mapped", [ 7699 ] ], [ [ 7699, 7699 ], "valid" ], [ [ 7700, 7700 ], "mapped", [ 7701 ] ], [ [ 7701, 7701 ], "valid" ], [ [ 7702, 7702 ], "mapped", [ 7703 ] ], [ [ 7703, 7703 ], "valid" ], [ [ 7704, 7704 ], "mapped", [ 7705 ] ], [ [ 7705, 7705 ], "valid" ], [ [ 7706, 7706 ], "mapped", [ 7707 ] ], [ [ 7707, 7707 ], "valid" ], [ [ 7708, 7708 ], "mapped", [ 7709 ] ], [ [ 7709, 7709 ], "valid" ], [ [ 7710, 7710 ], "mapped", [ 7711 ] ], [ [ 7711, 7711 ], "valid" ], [ [ 7712, 7712 ], "mapped", [ 7713 ] ], [ [ 7713, 7713 ], "valid" ], [ [ 7714, 7714 ], "mapped", [ 7715 ] ], [ [ 7715, 7715 ], "valid" ], [ [ 7716, 7716 ], "mapped", [ 7717 ] ], [ [ 7717, 7717 ], "valid" ], [ [ 7718, 7718 ], "mapped", [ 7719 ] ], [ [ 7719, 7719 ], "valid" ], [ [ 7720, 7720 ], "mapped", [ 7721 ] ], [ [ 7721, 7721 ], "valid" ], [ [ 7722, 7722 ], "mapped", [ 7723 ] ], [ [ 7723, 7723 ], "valid" ], [ [ 7724, 7724 ], "mapped", [ 7725 ] ], [ [ 7725, 7725 ], "valid" ], [ [ 7726, 7726 ], "mapped", [ 7727 ] ], [ [ 7727, 7727 ], "valid" ], [ [ 7728, 7728 ], "mapped", [ 7729 ] ], [ [ 7729, 7729 ], "valid" ], [ [ 7730, 7730 ], "mapped", [ 7731 ] ], [ [ 7731, 7731 ], "valid" ], [ [ 7732, 7732 ], "mapped", [ 7733 ] ], [ [ 7733, 7733 ], "valid" ], [ [ 7734, 7734 ], "mapped", [ 7735 ] ], [ [ 7735, 7735 ], "valid" ], [ [ 7736, 7736 ], "mapped", [ 7737 ] ], [ [ 7737, 7737 ], "valid" ], [ [ 7738, 7738 ], "mapped", [ 7739 ] ], [ [ 7739, 7739 ], "valid" ], [ [ 7740, 7740 ], "mapped", [ 7741 ] ], [ [ 7741, 7741 ], "valid" ], [ [ 7742, 7742 ], "mapped", [ 7743 ] ], [ [ 7743, 7743 ], "valid" ], [ [ 7744, 7744 ], "mapped", [ 7745 ] ], [ [ 7745, 7745 ], "valid" ], [ [ 7746, 7746 ], "mapped", [ 7747 ] ], [ [ 7747, 7747 ], "valid" ], [ [ 7748, 7748 ], "mapped", [ 7749 ] ], [ [ 7749, 7749 ], "valid" ], [ [ 7750, 7750 ], "mapped", [ 7751 ] ], [ [ 7751, 7751 ], "valid" ], [ [ 7752, 7752 ], "mapped", [ 7753 ] ], [ [ 7753, 7753 ], "valid" ], [ [ 7754, 7754 ], "mapped", [ 7755 ] ], [ [ 7755, 7755 ], "valid" ], [ [ 7756, 7756 ], "mapped", [ 7757 ] ], [ [ 7757, 7757 ], "valid" ], [ [ 7758, 7758 ], "mapped", [ 7759 ] ], [ [ 7759, 7759 ], "valid" ], [ [ 7760, 7760 ], "mapped", [ 7761 ] ], [ [ 7761, 7761 ], "valid" ], [ [ 7762, 7762 ], "mapped", [ 7763 ] ], [ [ 7763, 7763 ], "valid" ], [ [ 7764, 7764 ], "mapped", [ 7765 ] ], [ [ 7765, 7765 ], "valid" ], [ [ 7766, 7766 ], "mapped", [ 7767 ] ], [ [ 7767, 7767 ], "valid" ], [ [ 7768, 7768 ], "mapped", [ 7769 ] ], [ [ 7769, 7769 ], "valid" ], [ [ 7770, 7770 ], "mapped", [ 7771 ] ], [ [ 7771, 7771 ], "valid" ], [ [ 7772, 7772 ], "mapped", [ 7773 ] ], [ [ 7773, 7773 ], "valid" ], [ [ 7774, 7774 ], "mapped", [ 7775 ] ], [ [ 7775, 7775 ], "valid" ], [ [ 7776, 7776 ], "mapped", [ 7777 ] ], [ [ 7777, 7777 ], "valid" ], [ [ 7778, 7778 ], "mapped", [ 7779 ] ], [ [ 7779, 7779 ], "valid" ], [ [ 7780, 7780 ], "mapped", [ 7781 ] ], [ [ 7781, 7781 ], "valid" ], [ [ 7782, 7782 ], "mapped", [ 7783 ] ], [ [ 7783, 7783 ], "valid" ], [ [ 7784, 7784 ], "mapped", [ 7785 ] ], [ [ 7785, 7785 ], "valid" ], [ [ 7786, 7786 ], "mapped", [ 7787 ] ], [ [ 7787, 7787 ], "valid" ], [ [ 7788, 7788 ], "mapped", [ 7789 ] ], [ [ 7789, 7789 ], "valid" ], [ [ 7790, 7790 ], "mapped", [ 7791 ] ], [ [ 7791, 7791 ], "valid" ], [ [ 7792, 7792 ], "mapped", [ 7793 ] ], [ [ 7793, 7793 ], "valid" ], [ [ 7794, 7794 ], "mapped", [ 7795 ] ], [ [ 7795, 7795 ], "valid" ], [ [ 7796, 7796 ], "mapped", [ 7797 ] ], [ [ 7797, 7797 ], "valid" ], [ [ 7798, 7798 ], "mapped", [ 7799 ] ], [ [ 7799, 7799 ], "valid" ], [ [ 7800, 7800 ], "mapped", [ 7801 ] ], [ [ 7801, 7801 ], "valid" ], [ [ 7802, 7802 ], "mapped", [ 7803 ] ], [ [ 7803, 7803 ], "valid" ], [ [ 7804, 7804 ], "mapped", [ 7805 ] ], [ [ 7805, 7805 ], "valid" ], [ [ 7806, 7806 ], "mapped", [ 7807 ] ], [ [ 7807, 7807 ], "valid" ], [ [ 7808, 7808 ], "mapped", [ 7809 ] ], [ [ 7809, 7809 ], "valid" ], [ [ 7810, 7810 ], "mapped", [ 7811 ] ], [ [ 7811, 7811 ], "valid" ], [ [ 7812, 7812 ], "mapped", [ 7813 ] ], [ [ 7813, 7813 ], "valid" ], [ [ 7814, 7814 ], "mapped", [ 7815 ] ], [ [ 7815, 7815 ], "valid" ], [ [ 7816, 7816 ], "mapped", [ 7817 ] ], [ [ 7817, 7817 ], "valid" ], [ [ 7818, 7818 ], "mapped", [ 7819 ] ], [ [ 7819, 7819 ], "valid" ], [ [ 7820, 7820 ], "mapped", [ 7821 ] ], [ [ 7821, 7821 ], "valid" ], [ [ 7822, 7822 ], "mapped", [ 7823 ] ], [ [ 7823, 7823 ], "valid" ], [ [ 7824, 7824 ], "mapped", [ 7825 ] ], [ [ 7825, 7825 ], "valid" ], [ [ 7826, 7826 ], "mapped", [ 7827 ] ], [ [ 7827, 7827 ], "valid" ], [ [ 7828, 7828 ], "mapped", [ 7829 ] ], [ [ 7829, 7833 ], "valid" ], [ [ 7834, 7834 ], "mapped", [ 97, 702 ] ], [ [ 7835, 7835 ], "mapped", [ 7777 ] ], [ [ 7836, 7837 ], "valid" ], [ [ 7838, 7838 ], "mapped", [ 115, 115 ] ], [ [ 7839, 7839 ], "valid" ], [ [ 7840, 7840 ], "mapped", [ 7841 ] ], [ [ 7841, 7841 ], "valid" ], [ [ 7842, 7842 ], "mapped", [ 7843 ] ], [ [ 7843, 7843 ], "valid" ], [ [ 7844, 7844 ], "mapped", [ 7845 ] ], [ [ 7845, 7845 ], "valid" ], [ [ 7846, 7846 ], "mapped", [ 7847 ] ], [ [ 7847, 7847 ], "valid" ], [ [ 7848, 7848 ], "mapped", [ 7849 ] ], [ [ 7849, 7849 ], "valid" ], [ [ 7850, 7850 ], "mapped", [ 7851 ] ], [ [ 7851, 7851 ], "valid" ], [ [ 7852, 7852 ], "mapped", [ 7853 ] ], [ [ 7853, 7853 ], "valid" ], [ [ 7854, 7854 ], "mapped", [ 7855 ] ], [ [ 7855, 7855 ], "valid" ], [ [ 7856, 7856 ], "mapped", [ 7857 ] ], [ [ 7857, 7857 ], "valid" ], [ [ 7858, 7858 ], "mapped", [ 7859 ] ], [ [ 7859, 7859 ], "valid" ], [ [ 7860, 7860 ], "mapped", [ 7861 ] ], [ [ 7861, 7861 ], "valid" ], [ [ 7862, 7862 ], "mapped", [ 7863 ] ], [ [ 7863, 7863 ], "valid" ], [ [ 7864, 7864 ], "mapped", [ 7865 ] ], [ [ 7865, 7865 ], "valid" ], [ [ 7866, 7866 ], "mapped", [ 7867 ] ], [ [ 7867, 7867 ], "valid" ], [ [ 7868, 7868 ], "mapped", [ 7869 ] ], [ [ 7869, 7869 ], "valid" ], [ [ 7870, 7870 ], "mapped", [ 7871 ] ], [ [ 7871, 7871 ], "valid" ], [ [ 7872, 7872 ], "mapped", [ 7873 ] ], [ [ 7873, 7873 ], "valid" ], [ [ 7874, 7874 ], "mapped", [ 7875 ] ], [ [ 7875, 7875 ], "valid" ], [ [ 7876, 7876 ], "mapped", [ 7877 ] ], [ [ 7877, 7877 ], "valid" ], [ [ 7878, 7878 ], "mapped", [ 7879 ] ], [ [ 7879, 7879 ], "valid" ], [ [ 7880, 7880 ], "mapped", [ 7881 ] ], [ [ 7881, 7881 ], "valid" ], [ [ 7882, 7882 ], "mapped", [ 7883 ] ], [ [ 7883, 7883 ], "valid" ], [ [ 7884, 7884 ], "mapped", [ 7885 ] ], [ [ 7885, 7885 ], "valid" ], [ [ 7886, 7886 ], "mapped", [ 7887 ] ], [ [ 7887, 7887 ], "valid" ], [ [ 7888, 7888 ], "mapped", [ 7889 ] ], [ [ 7889, 7889 ], "valid" ], [ [ 7890, 7890 ], "mapped", [ 7891 ] ], [ [ 7891, 7891 ], "valid" ], [ [ 7892, 7892 ], "mapped", [ 7893 ] ], [ [ 7893, 7893 ], "valid" ], [ [ 7894, 7894 ], "mapped", [ 7895 ] ], [ [ 7895, 7895 ], "valid" ], [ [ 7896, 7896 ], "mapped", [ 7897 ] ], [ [ 7897, 7897 ], "valid" ], [ [ 7898, 7898 ], "mapped", [ 7899 ] ], [ [ 7899, 7899 ], "valid" ], [ [ 7900, 7900 ], "mapped", [ 7901 ] ], [ [ 7901, 7901 ], "valid" ], [ [ 7902, 7902 ], "mapped", [ 7903 ] ], [ [ 7903, 7903 ], "valid" ], [ [ 7904, 7904 ], "mapped", [ 7905 ] ], [ [ 7905, 7905 ], "valid" ], [ [ 7906, 7906 ], "mapped", [ 7907 ] ], [ [ 7907, 7907 ], "valid" ], [ [ 7908, 7908 ], "mapped", [ 7909 ] ], [ [ 7909, 7909 ], "valid" ], [ [ 7910, 7910 ], "mapped", [ 7911 ] ], [ [ 7911, 7911 ], "valid" ], [ [ 7912, 7912 ], "mapped", [ 7913 ] ], [ [ 7913, 7913 ], "valid" ], [ [ 7914, 7914 ], "mapped", [ 7915 ] ], [ [ 7915, 7915 ], "valid" ], [ [ 7916, 7916 ], "mapped", [ 7917 ] ], [ [ 7917, 7917 ], "valid" ], [ [ 7918, 7918 ], "mapped", [ 7919 ] ], [ [ 7919, 7919 ], "valid" ], [ [ 7920, 7920 ], "mapped", [ 7921 ] ], [ [ 7921, 7921 ], "valid" ], [ [ 7922, 7922 ], "mapped", [ 7923 ] ], [ [ 7923, 7923 ], "valid" ], [ [ 7924, 7924 ], "mapped", [ 7925 ] ], [ [ 7925, 7925 ], "valid" ], [ [ 7926, 7926 ], "mapped", [ 7927 ] ], [ [ 7927, 7927 ], "valid" ], [ [ 7928, 7928 ], "mapped", [ 7929 ] ], [ [ 7929, 7929 ], "valid" ], [ [ 7930, 7930 ], "mapped", [ 7931 ] ], [ [ 7931, 7931 ], "valid" ], [ [ 7932, 7932 ], "mapped", [ 7933 ] ], [ [ 7933, 7933 ], "valid" ], [ [ 7934, 7934 ], "mapped", [ 7935 ] ], [ [ 7935, 7935 ], "valid" ], [ [ 7936, 7943 ], "valid" ], [ [ 7944, 7944 ], "mapped", [ 7936 ] ], [ [ 7945, 7945 ], "mapped", [ 7937 ] ], [ [ 7946, 7946 ], "mapped", [ 7938 ] ], [ [ 7947, 7947 ], "mapped", [ 7939 ] ], [ [ 7948, 7948 ], "mapped", [ 7940 ] ], [ [ 7949, 7949 ], "mapped", [ 7941 ] ], [ [ 7950, 7950 ], "mapped", [ 7942 ] ], [ [ 7951, 7951 ], "mapped", [ 7943 ] ], [ [ 7952, 7957 ], "valid" ], [ [ 7958, 7959 ], "disallowed" ], [ [ 7960, 7960 ], "mapped", [ 7952 ] ], [ [ 7961, 7961 ], "mapped", [ 7953 ] ], [ [ 7962, 7962 ], "mapped", [ 7954 ] ], [ [ 7963, 7963 ], "mapped", [ 7955 ] ], [ [ 7964, 7964 ], "mapped", [ 7956 ] ], [ [ 7965, 7965 ], "mapped", [ 7957 ] ], [ [ 7966, 7967 ], "disallowed" ], [ [ 7968, 7975 ], "valid" ], [ [ 7976, 7976 ], "mapped", [ 7968 ] ], [ [ 7977, 7977 ], "mapped", [ 7969 ] ], [ [ 7978, 7978 ], "mapped", [ 7970 ] ], [ [ 7979, 7979 ], "mapped", [ 7971 ] ], [ [ 7980, 7980 ], "mapped", [ 7972 ] ], [ [ 7981, 7981 ], "mapped", [ 7973 ] ], [ [ 7982, 7982 ], "mapped", [ 7974 ] ], [ [ 7983, 7983 ], "mapped", [ 7975 ] ], [ [ 7984, 7991 ], "valid" ], [ [ 7992, 7992 ], "mapped", [ 7984 ] ], [ [ 7993, 7993 ], "mapped", [ 7985 ] ], [ [ 7994, 7994 ], "mapped", [ 7986 ] ], [ [ 7995, 7995 ], "mapped", [ 7987 ] ], [ [ 7996, 7996 ], "mapped", [ 7988 ] ], [ [ 7997, 7997 ], "mapped", [ 7989 ] ], [ [ 7998, 7998 ], "mapped", [ 7990 ] ], [ [ 7999, 7999 ], "mapped", [ 7991 ] ], [ [ 8000, 8005 ], "valid" ], [ [ 8006, 8007 ], "disallowed" ], [ [ 8008, 8008 ], "mapped", [ 8000 ] ], [ [ 8009, 8009 ], "mapped", [ 8001 ] ], [ [ 8010, 8010 ], "mapped", [ 8002 ] ], [ [ 8011, 8011 ], "mapped", [ 8003 ] ], [ [ 8012, 8012 ], "mapped", [ 8004 ] ], [ [ 8013, 8013 ], "mapped", [ 8005 ] ], [ [ 8014, 8015 ], "disallowed" ], [ [ 8016, 8023 ], "valid" ], [ [ 8024, 8024 ], "disallowed" ], [ [ 8025, 8025 ], "mapped", [ 8017 ] ], [ [ 8026, 8026 ], "disallowed" ], [ [ 8027, 8027 ], "mapped", [ 8019 ] ], [ [ 8028, 8028 ], "disallowed" ], [ [ 8029, 8029 ], "mapped", [ 8021 ] ], [ [ 8030, 8030 ], "disallowed" ], [ [ 8031, 8031 ], "mapped", [ 8023 ] ], [ [ 8032, 8039 ], "valid" ], [ [ 8040, 8040 ], "mapped", [ 8032 ] ], [ [ 8041, 8041 ], "mapped", [ 8033 ] ], [ [ 8042, 8042 ], "mapped", [ 8034 ] ], [ [ 8043, 8043 ], "mapped", [ 8035 ] ], [ [ 8044, 8044 ], "mapped", [ 8036 ] ], [ [ 8045, 8045 ], "mapped", [ 8037 ] ], [ [ 8046, 8046 ], "mapped", [ 8038 ] ], [ [ 8047, 8047 ], "mapped", [ 8039 ] ], [ [ 8048, 8048 ], "valid" ], [ [ 8049, 8049 ], "mapped", [ 940 ] ], [ [ 8050, 8050 ], "valid" ], [ [ 8051, 8051 ], "mapped", [ 941 ] ], [ [ 8052, 8052 ], "valid" ], [ [ 8053, 8053 ], "mapped", [ 942 ] ], [ [ 8054, 8054 ], "valid" ], [ [ 8055, 8055 ], "mapped", [ 943 ] ], [ [ 8056, 8056 ], "valid" ], [ [ 8057, 8057 ], "mapped", [ 972 ] ], [ [ 8058, 8058 ], "valid" ], [ [ 8059, 8059 ], "mapped", [ 973 ] ], [ [ 8060, 8060 ], "valid" ], [ [ 8061, 8061 ], "mapped", [ 974 ] ], [ [ 8062, 8063 ], "disallowed" ], [ [ 8064, 8064 ], "mapped", [ 7936, 953 ] ], [ [ 8065, 8065 ], "mapped", [ 7937, 953 ] ], [ [ 8066, 8066 ], "mapped", [ 7938, 953 ] ], [ [ 8067, 8067 ], "mapped", [ 7939, 953 ] ], [ [ 8068, 8068 ], "mapped", [ 7940, 953 ] ], [ [ 8069, 8069 ], "mapped", [ 7941, 953 ] ], [ [ 8070, 8070 ], "mapped", [ 7942, 953 ] ], [ [ 8071, 8071 ], "mapped", [ 7943, 953 ] ], [ [ 8072, 8072 ], "mapped", [ 7936, 953 ] ], [ [ 8073, 8073 ], "mapped", [ 7937, 953 ] ], [ [ 8074, 8074 ], "mapped", [ 7938, 953 ] ], [ [ 8075, 8075 ], "mapped", [ 7939, 953 ] ], [ [ 8076, 8076 ], "mapped", [ 7940, 953 ] ], [ [ 8077, 8077 ], "mapped", [ 7941, 953 ] ], [ [ 8078, 8078 ], "mapped", [ 7942, 953 ] ], [ [ 8079, 8079 ], "mapped", [ 7943, 953 ] ], [ [ 8080, 8080 ], "mapped", [ 7968, 953 ] ], [ [ 8081, 8081 ], "mapped", [ 7969, 953 ] ], [ [ 8082, 8082 ], "mapped", [ 7970, 953 ] ], [ [ 8083, 8083 ], "mapped", [ 7971, 953 ] ], [ [ 8084, 8084 ], "mapped", [ 7972, 953 ] ], [ [ 8085, 8085 ], "mapped", [ 7973, 953 ] ], [ [ 8086, 8086 ], "mapped", [ 7974, 953 ] ], [ [ 8087, 8087 ], "mapped", [ 7975, 953 ] ], [ [ 8088, 8088 ], "mapped", [ 7968, 953 ] ], [ [ 8089, 8089 ], "mapped", [ 7969, 953 ] ], [ [ 8090, 8090 ], "mapped", [ 7970, 953 ] ], [ [ 8091, 8091 ], "mapped", [ 7971, 953 ] ], [ [ 8092, 8092 ], "mapped", [ 7972, 953 ] ], [ [ 8093, 8093 ], "mapped", [ 7973, 953 ] ], [ [ 8094, 8094 ], "mapped", [ 7974, 953 ] ], [ [ 8095, 8095 ], "mapped", [ 7975, 953 ] ], [ [ 8096, 8096 ], "mapped", [ 8032, 953 ] ], [ [ 8097, 8097 ], "mapped", [ 8033, 953 ] ], [ [ 8098, 8098 ], "mapped", [ 8034, 953 ] ], [ [ 8099, 8099 ], "mapped", [ 8035, 953 ] ], [ [ 8100, 8100 ], "mapped", [ 8036, 953 ] ], [ [ 8101, 8101 ], "mapped", [ 8037, 953 ] ], [ [ 8102, 8102 ], "mapped", [ 8038, 953 ] ], [ [ 8103, 8103 ], "mapped", [ 8039, 953 ] ], [ [ 8104, 8104 ], "mapped", [ 8032, 953 ] ], [ [ 8105, 8105 ], "mapped", [ 8033, 953 ] ], [ [ 8106, 8106 ], "mapped", [ 8034, 953 ] ], [ [ 8107, 8107 ], "mapped", [ 8035, 953 ] ], [ [ 8108, 8108 ], "mapped", [ 8036, 953 ] ], [ [ 8109, 8109 ], "mapped", [ 8037, 953 ] ], [ [ 8110, 8110 ], "mapped", [ 8038, 953 ] ], [ [ 8111, 8111 ], "mapped", [ 8039, 953 ] ], [ [ 8112, 8113 ], "valid" ], [ [ 8114, 8114 ], "mapped", [ 8048, 953 ] ], [ [ 8115, 8115 ], "mapped", [ 945, 953 ] ], [ [ 8116, 8116 ], "mapped", [ 940, 953 ] ], [ [ 8117, 8117 ], "disallowed" ], [ [ 8118, 8118 ], "valid" ], [ [ 8119, 8119 ], "mapped", [ 8118, 953 ] ], [ [ 8120, 8120 ], "mapped", [ 8112 ] ], [ [ 8121, 8121 ], "mapped", [ 8113 ] ], [ [ 8122, 8122 ], "mapped", [ 8048 ] ], [ [ 8123, 8123 ], "mapped", [ 940 ] ], [ [ 8124, 8124 ], "mapped", [ 945, 953 ] ], [ [ 8125, 8125 ], "disallowed_STD3_mapped", [ 32, 787 ] ], [ [ 8126, 8126 ], "mapped", [ 953 ] ], [ [ 8127, 8127 ], "disallowed_STD3_mapped", [ 32, 787 ] ], [ [ 8128, 8128 ], "disallowed_STD3_mapped", [ 32, 834 ] ], [ [ 8129, 8129 ], "disallowed_STD3_mapped", [ 32, 776, 834 ] ], [ [ 8130, 8130 ], "mapped", [ 8052, 953 ] ], [ [ 8131, 8131 ], "mapped", [ 951, 953 ] ], [ [ 8132, 8132 ], "mapped", [ 942, 953 ] ], [ [ 8133, 8133 ], "disallowed" ], [ [ 8134, 8134 ], "valid" ], [ [ 8135, 8135 ], "mapped", [ 8134, 953 ] ], [ [ 8136, 8136 ], "mapped", [ 8050 ] ], [ [ 8137, 8137 ], "mapped", [ 941 ] ], [ [ 8138, 8138 ], "mapped", [ 8052 ] ], [ [ 8139, 8139 ], "mapped", [ 942 ] ], [ [ 8140, 8140 ], "mapped", [ 951, 953 ] ], [ [ 8141, 8141 ], "disallowed_STD3_mapped", [ 32, 787, 768 ] ], [ [ 8142, 8142 ], "disallowed_STD3_mapped", [ 32, 787, 769 ] ], [ [ 8143, 8143 ], "disallowed_STD3_mapped", [ 32, 787, 834 ] ], [ [ 8144, 8146 ], "valid" ], [ [ 8147, 8147 ], "mapped", [ 912 ] ], [ [ 8148, 8149 ], "disallowed" ], [ [ 8150, 8151 ], "valid" ], [ [ 8152, 8152 ], "mapped", [ 8144 ] ], [ [ 8153, 8153 ], "mapped", [ 8145 ] ], [ [ 8154, 8154 ], "mapped", [ 8054 ] ], [ [ 8155, 8155 ], "mapped", [ 943 ] ], [ [ 8156, 8156 ], "disallowed" ], [ [ 8157, 8157 ], "disallowed_STD3_mapped", [ 32, 788, 768 ] ], [ [ 8158, 8158 ], "disallowed_STD3_mapped", [ 32, 788, 769 ] ], [ [ 8159, 8159 ], "disallowed_STD3_mapped", [ 32, 788, 834 ] ], [ [ 8160, 8162 ], "valid" ], [ [ 8163, 8163 ], "mapped", [ 944 ] ], [ [ 8164, 8167 ], "valid" ], [ [ 8168, 8168 ], "mapped", [ 8160 ] ], [ [ 8169, 8169 ], "mapped", [ 8161 ] ], [ [ 8170, 8170 ], "mapped", [ 8058 ] ], [ [ 8171, 8171 ], "mapped", [ 973 ] ], [ [ 8172, 8172 ], "mapped", [ 8165 ] ], [ [ 8173, 8173 ], "disallowed_STD3_mapped", [ 32, 776, 768 ] ], [ [ 8174, 8174 ], "disallowed_STD3_mapped", [ 32, 776, 769 ] ], [ [ 8175, 8175 ], "disallowed_STD3_mapped", [ 96 ] ], [ [ 8176, 8177 ], "disallowed" ], [ [ 8178, 8178 ], "mapped", [ 8060, 953 ] ], [ [ 8179, 8179 ], "mapped", [ 969, 953 ] ], [ [ 8180, 8180 ], "mapped", [ 974, 953 ] ], [ [ 8181, 8181 ], "disallowed" ], [ [ 8182, 8182 ], "valid" ], [ [ 8183, 8183 ], "mapped", [ 8182, 953 ] ], [ [ 8184, 8184 ], "mapped", [ 8056 ] ], [ [ 8185, 8185 ], "mapped", [ 972 ] ], [ [ 8186, 8186 ], "mapped", [ 8060 ] ], [ [ 8187, 8187 ], "mapped", [ 974 ] ], [ [ 8188, 8188 ], "mapped", [ 969, 953 ] ], [ [ 8189, 8189 ], "disallowed_STD3_mapped", [ 32, 769 ] ], [ [ 8190, 8190 ], "disallowed_STD3_mapped", [ 32, 788 ] ], [ [ 8191, 8191 ], "disallowed" ], [ [ 8192, 8202 ], "disallowed_STD3_mapped", [ 32 ] ], [ [ 8203, 8203 ], "ignored" ], [ [ 8204, 8205 ], "deviation", [ ] ], [ [ 8206, 8207 ], "disallowed" ], [ [ 8208, 8208 ], "valid", [ ], "NV8" ], [ [ 8209, 8209 ], "mapped", [ 8208 ] ], [ [ 8210, 8214 ], "valid", [ ], "NV8" ], [ [ 8215, 8215 ], "disallowed_STD3_mapped", [ 32, 819 ] ], [ [ 8216, 8227 ], "valid", [ ], "NV8" ], [ [ 8228, 8230 ], "disallowed" ], [ [ 8231, 8231 ], "valid", [ ], "NV8" ], [ [ 8232, 8238 ], "disallowed" ], [ [ 8239, 8239 ], "disallowed_STD3_mapped", [ 32 ] ], [ [ 8240, 8242 ], "valid", [ ], "NV8" ], [ [ 8243, 8243 ], "mapped", [ 8242, 8242 ] ], [ [ 8244, 8244 ], "mapped", [ 8242, 8242, 8242 ] ], [ [ 8245, 8245 ], "valid", [ ], "NV8" ], [ [ 8246, 8246 ], "mapped", [ 8245, 8245 ] ], [ [ 8247, 8247 ], "mapped", [ 8245, 8245, 8245 ] ], [ [ 8248, 8251 ], "valid", [ ], "NV8" ], [ [ 8252, 8252 ], "disallowed_STD3_mapped", [ 33, 33 ] ], [ [ 8253, 8253 ], "valid", [ ], "NV8" ], [ [ 8254, 8254 ], "disallowed_STD3_mapped", [ 32, 773 ] ], [ [ 8255, 8262 ], "valid", [ ], "NV8" ], [ [ 8263, 8263 ], "disallowed_STD3_mapped", [ 63, 63 ] ], [ [ 8264, 8264 ], "disallowed_STD3_mapped", [ 63, 33 ] ], [ [ 8265, 8265 ], "disallowed_STD3_mapped", [ 33, 63 ] ], [ [ 8266, 8269 ], "valid", [ ], "NV8" ], [ [ 8270, 8274 ], "valid", [ ], "NV8" ], [ [ 8275, 8276 ], "valid", [ ], "NV8" ], [ [ 8277, 8278 ], "valid", [ ], "NV8" ], [ [ 8279, 8279 ], "mapped", [ 8242, 8242, 8242, 8242 ] ], [ [ 8280, 8286 ], "valid", [ ], "NV8" ], [ [ 8287, 8287 ], "disallowed_STD3_mapped", [ 32 ] ], [ [ 8288, 8288 ], "ignored" ], [ [ 8289, 8291 ], "disallowed" ], [ [ 8292, 8292 ], "ignored" ], [ [ 8293, 8293 ], "disallowed" ], [ [ 8294, 8297 ], "disallowed" ], [ [ 8298, 8303 ], "disallowed" ], [ [ 8304, 8304 ], "mapped", [ 48 ] ], [ [ 8305, 8305 ], "mapped", [ 105 ] ], [ [ 8306, 8307 ], "disallowed" ], [ [ 8308, 8308 ], "mapped", [ 52 ] ], [ [ 8309, 8309 ], "mapped", [ 53 ] ], [ [ 8310, 8310 ], "mapped", [ 54 ] ], [ [ 8311, 8311 ], "mapped", [ 55 ] ], [ [ 8312, 8312 ], "mapped", [ 56 ] ], [ [ 8313, 8313 ], "mapped", [ 57 ] ], [ [ 8314, 8314 ], "disallowed_STD3_mapped", [ 43 ] ], [ [ 8315, 8315 ], "mapped", [ 8722 ] ], [ [ 8316, 8316 ], "disallowed_STD3_mapped", [ 61 ] ], [ [ 8317, 8317 ], "disallowed_STD3_mapped", [ 40 ] ], [ [ 8318, 8318 ], "disallowed_STD3_mapped", [ 41 ] ], [ [ 8319, 8319 ], "mapped", [ 110 ] ], [ [ 8320, 8320 ], "mapped", [ 48 ] ], [ [ 8321, 8321 ], "mapped", [ 49 ] ], [ [ 8322, 8322 ], "mapped", [ 50 ] ], [ [ 8323, 8323 ], "mapped", [ 51 ] ], [ [ 8324, 8324 ], "mapped", [ 52 ] ], [ [ 8325, 8325 ], "mapped", [ 53 ] ], [ [ 8326, 8326 ], "mapped", [ 54 ] ], [ [ 8327, 8327 ], "mapped", [ 55 ] ], [ [ 8328, 8328 ], "mapped", [ 56 ] ], [ [ 8329, 8329 ], "mapped", [ 57 ] ], [ [ 8330, 8330 ], "disallowed_STD3_mapped", [ 43 ] ], [ [ 8331, 8331 ], "mapped", [ 8722 ] ], [ [ 8332, 8332 ], "disallowed_STD3_mapped", [ 61 ] ], [ [ 8333, 8333 ], "disallowed_STD3_mapped", [ 40 ] ], [ [ 8334, 8334 ], "disallowed_STD3_mapped", [ 41 ] ], [ [ 8335, 8335 ], "disallowed" ], [ [ 8336, 8336 ], "mapped", [ 97 ] ], [ [ 8337, 8337 ], "mapped", [ 101 ] ], [ [ 8338, 8338 ], "mapped", [ 111 ] ], [ [ 8339, 8339 ], "mapped", [ 120 ] ], [ [ 8340, 8340 ], "mapped", [ 601 ] ], [ [ 8341, 8341 ], "mapped", [ 104 ] ], [ [ 8342, 8342 ], "mapped", [ 107 ] ], [ [ 8343, 8343 ], "mapped", [ 108 ] ], [ [ 8344, 8344 ], "mapped", [ 109 ] ], [ [ 8345, 8345 ], "mapped", [ 110 ] ], [ [ 8346, 8346 ], "mapped", [ 112 ] ], [ [ 8347, 8347 ], "mapped", [ 115 ] ], [ [ 8348, 8348 ], "mapped", [ 116 ] ], [ [ 8349, 8351 ], "disallowed" ], [ [ 8352, 8359 ], "valid", [ ], "NV8" ], [ [ 8360, 8360 ], "mapped", [ 114, 115 ] ], [ [ 8361, 8362 ], "valid", [ ], "NV8" ], [ [ 8363, 8363 ], "valid", [ ], "NV8" ], [ [ 8364, 8364 ], "valid", [ ], "NV8" ], [ [ 8365, 8367 ], "valid", [ ], "NV8" ], [ [ 8368, 8369 ], "valid", [ ], "NV8" ], [ [ 8370, 8373 ], "valid", [ ], "NV8" ], [ [ 8374, 8376 ], "valid", [ ], "NV8" ], [ [ 8377, 8377 ], "valid", [ ], "NV8" ], [ [ 8378, 8378 ], "valid", [ ], "NV8" ], [ [ 8379, 8381 ], "valid", [ ], "NV8" ], [ [ 8382, 8382 ], "valid", [ ], "NV8" ], [ [ 8383, 8399 ], "disallowed" ], [ [ 8400, 8417 ], "valid", [ ], "NV8" ], [ [ 8418, 8419 ], "valid", [ ], "NV8" ], [ [ 8420, 8426 ], "valid", [ ], "NV8" ], [ [ 8427, 8427 ], "valid", [ ], "NV8" ], [ [ 8428, 8431 ], "valid", [ ], "NV8" ], [ [ 8432, 8432 ], "valid", [ ], "NV8" ], [ [ 8433, 8447 ], "disallowed" ], [ [ 8448, 8448 ], "disallowed_STD3_mapped", [ 97, 47, 99 ] ], [ [ 8449, 8449 ], "disallowed_STD3_mapped", [ 97, 47, 115 ] ], [ [ 8450, 8450 ], "mapped", [ 99 ] ], [ [ 8451, 8451 ], "mapped", [ 176, 99 ] ], [ [ 8452, 8452 ], "valid", [ ], "NV8" ], [ [ 8453, 8453 ], "disallowed_STD3_mapped", [ 99, 47, 111 ] ], [ [ 8454, 8454 ], "disallowed_STD3_mapped", [ 99, 47, 117 ] ], [ [ 8455, 8455 ], "mapped", [ 603 ] ], [ [ 8456, 8456 ], "valid", [ ], "NV8" ], [ [ 8457, 8457 ], "mapped", [ 176, 102 ] ], [ [ 8458, 8458 ], "mapped", [ 103 ] ], [ [ 8459, 8462 ], "mapped", [ 104 ] ], [ [ 8463, 8463 ], "mapped", [ 295 ] ], [ [ 8464, 8465 ], "mapped", [ 105 ] ], [ [ 8466, 8467 ], "mapped", [ 108 ] ], [ [ 8468, 8468 ], "valid", [ ], "NV8" ], [ [ 8469, 8469 ], "mapped", [ 110 ] ], [ [ 8470, 8470 ], "mapped", [ 110, 111 ] ], [ [ 8471, 8472 ], "valid", [ ], "NV8" ], [ [ 8473, 8473 ], "mapped", [ 112 ] ], [ [ 8474, 8474 ], "mapped", [ 113 ] ], [ [ 8475, 8477 ], "mapped", [ 114 ] ], [ [ 8478, 8479 ], "valid", [ ], "NV8" ], [ [ 8480, 8480 ], "mapped", [ 115, 109 ] ], [ [ 8481, 8481 ], "mapped", [ 116, 101, 108 ] ], [ [ 8482, 8482 ], "mapped", [ 116, 109 ] ], [ [ 8483, 8483 ], "valid", [ ], "NV8" ], [ [ 8484, 8484 ], "mapped", [ 122 ] ], [ [ 8485, 8485 ], "valid", [ ], "NV8" ], [ [ 8486, 8486 ], "mapped", [ 969 ] ], [ [ 8487, 8487 ], "valid", [ ], "NV8" ], [ [ 8488, 8488 ], "mapped", [ 122 ] ], [ [ 8489, 8489 ], "valid", [ ], "NV8" ], [ [ 8490, 8490 ], "mapped", [ 107 ] ], [ [ 8491, 8491 ], "mapped", [ 229 ] ], [ [ 8492, 8492 ], "mapped", [ 98 ] ], [ [ 8493, 8493 ], "mapped", [ 99 ] ], [ [ 8494, 8494 ], "valid", [ ], "NV8" ], [ [ 8495, 8496 ], "mapped", [ 101 ] ], [ [ 8497, 8497 ], "mapped", [ 102 ] ], [ [ 8498, 8498 ], "disallowed" ], [ [ 8499, 8499 ], "mapped", [ 109 ] ], [ [ 8500, 8500 ], "mapped", [ 111 ] ], [ [ 8501, 8501 ], "mapped", [ 1488 ] ], [ [ 8502, 8502 ], "mapped", [ 1489 ] ], [ [ 8503, 8503 ], "mapped", [ 1490 ] ], [ [ 8504, 8504 ], "mapped", [ 1491 ] ], [ [ 8505, 8505 ], "mapped", [ 105 ] ], [ [ 8506, 8506 ], "valid", [ ], "NV8" ], [ [ 8507, 8507 ], "mapped", [ 102, 97, 120 ] ], [ [ 8508, 8508 ], "mapped", [ 960 ] ], [ [ 8509, 8510 ], "mapped", [ 947 ] ], [ [ 8511, 8511 ], "mapped", [ 960 ] ], [ [ 8512, 8512 ], "mapped", [ 8721 ] ], [ [ 8513, 8516 ], "valid", [ ], "NV8" ], [ [ 8517, 8518 ], "mapped", [ 100 ] ], [ [ 8519, 8519 ], "mapped", [ 101 ] ], [ [ 8520, 8520 ], "mapped", [ 105 ] ], [ [ 8521, 8521 ], "mapped", [ 106 ] ], [ [ 8522, 8523 ], "valid", [ ], "NV8" ], [ [ 8524, 8524 ], "valid", [ ], "NV8" ], [ [ 8525, 8525 ], "valid", [ ], "NV8" ], [ [ 8526, 8526 ], "valid" ], [ [ 8527, 8527 ], "valid", [ ], "NV8" ], [ [ 8528, 8528 ], "mapped", [ 49, 8260, 55 ] ], [ [ 8529, 8529 ], "mapped", [ 49, 8260, 57 ] ], [ [ 8530, 8530 ], "mapped", [ 49, 8260, 49, 48 ] ], [ [ 8531, 8531 ], "mapped", [ 49, 8260, 51 ] ], [ [ 8532, 8532 ], "mapped", [ 50, 8260, 51 ] ], [ [ 8533, 8533 ], "mapped", [ 49, 8260, 53 ] ], [ [ 8534, 8534 ], "mapped", [ 50, 8260, 53 ] ], [ [ 8535, 8535 ], "mapped", [ 51, 8260, 53 ] ], [ [ 8536, 8536 ], "mapped", [ 52, 8260, 53 ] ], [ [ 8537, 8537 ], "mapped", [ 49, 8260, 54 ] ], [ [ 8538, 8538 ], "mapped", [ 53, 8260, 54 ] ], [ [ 8539, 8539 ], "mapped", [ 49, 8260, 56 ] ], [ [ 8540, 8540 ], "mapped", [ 51, 8260, 56 ] ], [ [ 8541, 8541 ], "mapped", [ 53, 8260, 56 ] ], [ [ 8542, 8542 ], "mapped", [ 55, 8260, 56 ] ], [ [ 8543, 8543 ], "mapped", [ 49, 8260 ] ], [ [ 8544, 8544 ], "mapped", [ 105 ] ], [ [ 8545, 8545 ], "mapped", [ 105, 105 ] ], [ [ 8546, 8546 ], "mapped", [ 105, 105, 105 ] ], [ [ 8547, 8547 ], "mapped", [ 105, 118 ] ], [ [ 8548, 8548 ], "mapped", [ 118 ] ], [ [ 8549, 8549 ], "mapped", [ 118, 105 ] ], [ [ 8550, 8550 ], "mapped", [ 118, 105, 105 ] ], [ [ 8551, 8551 ], "mapped", [ 118, 105, 105, 105 ] ], [ [ 8552, 8552 ], "mapped", [ 105, 120 ] ], [ [ 8553, 8553 ], "mapped", [ 120 ] ], [ [ 8554, 8554 ], "mapped", [ 120, 105 ] ], [ [ 8555, 8555 ], "mapped", [ 120, 105, 105 ] ], [ [ 8556, 8556 ], "mapped", [ 108 ] ], [ [ 8557, 8557 ], "mapped", [ 99 ] ], [ [ 8558, 8558 ], "mapped", [ 100 ] ], [ [ 8559, 8559 ], "mapped", [ 109 ] ], [ [ 8560, 8560 ], "mapped", [ 105 ] ], [ [ 8561, 8561 ], "mapped", [ 105, 105 ] ], [ [ 8562, 8562 ], "mapped", [ 105, 105, 105 ] ], [ [ 8563, 8563 ], "mapped", [ 105, 118 ] ], [ [ 8564, 8564 ], "mapped", [ 118 ] ], [ [ 8565, 8565 ], "mapped", [ 118, 105 ] ], [ [ 8566, 8566 ], "mapped", [ 118, 105, 105 ] ], [ [ 8567, 8567 ], "mapped", [ 118, 105, 105, 105 ] ], [ [ 8568, 8568 ], "mapped", [ 105, 120 ] ], [ [ 8569, 8569 ], "mapped", [ 120 ] ], [ [ 8570, 8570 ], "mapped", [ 120, 105 ] ], [ [ 8571, 8571 ], "mapped", [ 120, 105, 105 ] ], [ [ 8572, 8572 ], "mapped", [ 108 ] ], [ [ 8573, 8573 ], "mapped", [ 99 ] ], [ [ 8574, 8574 ], "mapped", [ 100 ] ], [ [ 8575, 8575 ], "mapped", [ 109 ] ], [ [ 8576, 8578 ], "valid", [ ], "NV8" ], [ [ 8579, 8579 ], "disallowed" ], [ [ 8580, 8580 ], "valid" ], [ [ 8581, 8584 ], "valid", [ ], "NV8" ], [ [ 8585, 8585 ], "mapped", [ 48, 8260, 51 ] ], [ [ 8586, 8587 ], "valid", [ ], "NV8" ], [ [ 8588, 8591 ], "disallowed" ], [ [ 8592, 8682 ], "valid", [ ], "NV8" ], [ [ 8683, 8691 ], "valid", [ ], "NV8" ], [ [ 8692, 8703 ], "valid", [ ], "NV8" ], [ [ 8704, 8747 ], "valid", [ ], "NV8" ], [ [ 8748, 8748 ], "mapped", [ 8747, 8747 ] ], [ [ 8749, 8749 ], "mapped", [ 8747, 8747, 8747 ] ], [ [ 8750, 8750 ], "valid", [ ], "NV8" ], [ [ 8751, 8751 ], "mapped", [ 8750, 8750 ] ], [ [ 8752, 8752 ], "mapped", [ 8750, 8750, 8750 ] ], [ [ 8753, 8799 ], "valid", [ ], "NV8" ], [ [ 8800, 8800 ], "disallowed_STD3_valid" ], [ [ 8801, 8813 ], "valid", [ ], "NV8" ], [ [ 8814, 8815 ], "disallowed_STD3_valid" ], [ [ 8816, 8945 ], "valid", [ ], "NV8" ], [ [ 8946, 8959 ], "valid", [ ], "NV8" ], [ [ 8960, 8960 ], "valid", [ ], "NV8" ], [ [ 8961, 8961 ], "valid", [ ], "NV8" ], [ [ 8962, 9000 ], "valid", [ ], "NV8" ], [ [ 9001, 9001 ], "mapped", [ 12296 ] ], [ [ 9002, 9002 ], "mapped", [ 12297 ] ], [ [ 9003, 9082 ], "valid", [ ], "NV8" ], [ [ 9083, 9083 ], "valid", [ ], "NV8" ], [ [ 9084, 9084 ], "valid", [ ], "NV8" ], [ [ 9085, 9114 ], "valid", [ ], "NV8" ], [ [ 9115, 9166 ], "valid", [ ], "NV8" ], [ [ 9167, 9168 ], "valid", [ ], "NV8" ], [ [ 9169, 9179 ], "valid", [ ], "NV8" ], [ [ 9180, 9191 ], "valid", [ ], "NV8" ], [ [ 9192, 9192 ], "valid", [ ], "NV8" ], [ [ 9193, 9203 ], "valid", [ ], "NV8" ], [ [ 9204, 9210 ], "valid", [ ], "NV8" ], [ [ 9211, 9215 ], "disallowed" ], [ [ 9216, 9252 ], "valid", [ ], "NV8" ], [ [ 9253, 9254 ], "valid", [ ], "NV8" ], [ [ 9255, 9279 ], "disallowed" ], [ [ 9280, 9290 ], "valid", [ ], "NV8" ], [ [ 9291, 9311 ], "disallowed" ], [ [ 9312, 9312 ], "mapped", [ 49 ] ], [ [ 9313, 9313 ], "mapped", [ 50 ] ], [ [ 9314, 9314 ], "mapped", [ 51 ] ], [ [ 9315, 9315 ], "mapped", [ 52 ] ], [ [ 9316, 9316 ], "mapped", [ 53 ] ], [ [ 9317, 9317 ], "mapped", [ 54 ] ], [ [ 9318, 9318 ], "mapped", [ 55 ] ], [ [ 9319, 9319 ], "mapped", [ 56 ] ], [ [ 9320, 9320 ], "mapped", [ 57 ] ], [ [ 9321, 9321 ], "mapped", [ 49, 48 ] ], [ [ 9322, 9322 ], "mapped", [ 49, 49 ] ], [ [ 9323, 9323 ], "mapped", [ 49, 50 ] ], [ [ 9324, 9324 ], "mapped", [ 49, 51 ] ], [ [ 9325, 9325 ], "mapped", [ 49, 52 ] ], [ [ 9326, 9326 ], "mapped", [ 49, 53 ] ], [ [ 9327, 9327 ], "mapped", [ 49, 54 ] ], [ [ 9328, 9328 ], "mapped", [ 49, 55 ] ], [ [ 9329, 9329 ], "mapped", [ 49, 56 ] ], [ [ 9330, 9330 ], "mapped", [ 49, 57 ] ], [ [ 9331, 9331 ], "mapped", [ 50, 48 ] ], [ [ 9332, 9332 ], "disallowed_STD3_mapped", [ 40, 49, 41 ] ], [ [ 9333, 9333 ], "disallowed_STD3_mapped", [ 40, 50, 41 ] ], [ [ 9334, 9334 ], "disallowed_STD3_mapped", [ 40, 51, 41 ] ], [ [ 9335, 9335 ], "disallowed_STD3_mapped", [ 40, 52, 41 ] ], [ [ 9336, 9336 ], "disallowed_STD3_mapped", [ 40, 53, 41 ] ], [ [ 9337, 9337 ], "disallowed_STD3_mapped", [ 40, 54, 41 ] ], [ [ 9338, 9338 ], "disallowed_STD3_mapped", [ 40, 55, 41 ] ], [ [ 9339, 9339 ], "disallowed_STD3_mapped", [ 40, 56, 41 ] ], [ [ 9340, 9340 ], "disallowed_STD3_mapped", [ 40, 57, 41 ] ], [ [ 9341, 9341 ], "disallowed_STD3_mapped", [ 40, 49, 48, 41 ] ], [ [ 9342, 9342 ], "disallowed_STD3_mapped", [ 40, 49, 49, 41 ] ], [ [ 9343, 9343 ], "disallowed_STD3_mapped", [ 40, 49, 50, 41 ] ], [ [ 9344, 9344 ], "disallowed_STD3_mapped", [ 40, 49, 51, 41 ] ], [ [ 9345, 9345 ], "disallowed_STD3_mapped", [ 40, 49, 52, 41 ] ], [ [ 9346, 9346 ], "disallowed_STD3_mapped", [ 40, 49, 53, 41 ] ], [ [ 9347, 9347 ], "disallowed_STD3_mapped", [ 40, 49, 54, 41 ] ], [ [ 9348, 9348 ], "disallowed_STD3_mapped", [ 40, 49, 55, 41 ] ], [ [ 9349, 9349 ], "disallowed_STD3_mapped", [ 40, 49, 56, 41 ] ], [ [ 9350, 9350 ], "disallowed_STD3_mapped", [ 40, 49, 57, 41 ] ], [ [ 9351, 9351 ], "disallowed_STD3_mapped", [ 40, 50, 48, 41 ] ], [ [ 9352, 9371 ], "disallowed" ], [ [ 9372, 9372 ], "disallowed_STD3_mapped", [ 40, 97, 41 ] ], [ [ 9373, 9373 ], "disallowed_STD3_mapped", [ 40, 98, 41 ] ], [ [ 9374, 9374 ], "disallowed_STD3_mapped", [ 40, 99, 41 ] ], [ [ 9375, 9375 ], "disallowed_STD3_mapped", [ 40, 100, 41 ] ], [ [ 9376, 9376 ], "disallowed_STD3_mapped", [ 40, 101, 41 ] ], [ [ 9377, 9377 ], "disallowed_STD3_mapped", [ 40, 102, 41 ] ], [ [ 9378, 9378 ], "disallowed_STD3_mapped", [ 40, 103, 41 ] ], [ [ 9379, 9379 ], "disallowed_STD3_mapped", [ 40, 104, 41 ] ], [ [ 9380, 9380 ], "disallowed_STD3_mapped", [ 40, 105, 41 ] ], [ [ 9381, 9381 ], "disallowed_STD3_mapped", [ 40, 106, 41 ] ], [ [ 9382, 9382 ], "disallowed_STD3_mapped", [ 40, 107, 41 ] ], [ [ 9383, 9383 ], "disallowed_STD3_mapped", [ 40, 108, 41 ] ], [ [ 9384, 9384 ], "disallowed_STD3_mapped", [ 40, 109, 41 ] ], [ [ 9385, 9385 ], "disallowed_STD3_mapped", [ 40, 110, 41 ] ], [ [ 9386, 9386 ], "disallowed_STD3_mapped", [ 40, 111, 41 ] ], [ [ 9387, 9387 ], "disallowed_STD3_mapped", [ 40, 112, 41 ] ], [ [ 9388, 9388 ], "disallowed_STD3_mapped", [ 40, 113, 41 ] ], [ [ 9389, 9389 ], "disallowed_STD3_mapped", [ 40, 114, 41 ] ], [ [ 9390, 9390 ], "disallowed_STD3_mapped", [ 40, 115, 41 ] ], [ [ 9391, 9391 ], "disallowed_STD3_mapped", [ 40, 116, 41 ] ], [ [ 9392, 9392 ], "disallowed_STD3_mapped", [ 40, 117, 41 ] ], [ [ 9393, 9393 ], "disallowed_STD3_mapped", [ 40, 118, 41 ] ], [ [ 9394, 9394 ], "disallowed_STD3_mapped", [ 40, 119, 41 ] ], [ [ 9395, 9395 ], "disallowed_STD3_mapped", [ 40, 120, 41 ] ], [ [ 9396, 9396 ], "disallowed_STD3_mapped", [ 40, 121, 41 ] ], [ [ 9397, 9397 ], "disallowed_STD3_mapped", [ 40, 122, 41 ] ], [ [ 9398, 9398 ], "mapped", [ 97 ] ], [ [ 9399, 9399 ], "mapped", [ 98 ] ], [ [ 9400, 9400 ], "mapped", [ 99 ] ], [ [ 9401, 9401 ], "mapped", [ 100 ] ], [ [ 9402, 9402 ], "mapped", [ 101 ] ], [ [ 9403, 9403 ], "mapped", [ 102 ] ], [ [ 9404, 9404 ], "mapped", [ 103 ] ], [ [ 9405, 9405 ], "mapped", [ 104 ] ], [ [ 9406, 9406 ], "mapped", [ 105 ] ], [ [ 9407, 9407 ], "mapped", [ 106 ] ], [ [ 9408, 9408 ], "mapped", [ 107 ] ], [ [ 9409, 9409 ], "mapped", [ 108 ] ], [ [ 9410, 9410 ], "mapped", [ 109 ] ], [ [ 9411, 9411 ], "mapped", [ 110 ] ], [ [ 9412, 9412 ], "mapped", [ 111 ] ], [ [ 9413, 9413 ], "mapped", [ 112 ] ], [ [ 9414, 9414 ], "mapped", [ 113 ] ], [ [ 9415, 9415 ], "mapped", [ 114 ] ], [ [ 9416, 9416 ], "mapped", [ 115 ] ], [ [ 9417, 9417 ], "mapped", [ 116 ] ], [ [ 9418, 9418 ], "mapped", [ 117 ] ], [ [ 9419, 9419 ], "mapped", [ 118 ] ], [ [ 9420, 9420 ], "mapped", [ 119 ] ], [ [ 9421, 9421 ], "mapped", [ 120 ] ], [ [ 9422, 9422 ], "mapped", [ 121 ] ], [ [ 9423, 9423 ], "mapped", [ 122 ] ], [ [ 9424, 9424 ], "mapped", [ 97 ] ], [ [ 9425, 9425 ], "mapped", [ 98 ] ], [ [ 9426, 9426 ], "mapped", [ 99 ] ], [ [ 9427, 9427 ], "mapped", [ 100 ] ], [ [ 9428, 9428 ], "mapped", [ 101 ] ], [ [ 9429, 9429 ], "mapped", [ 102 ] ], [ [ 9430, 9430 ], "mapped", [ 103 ] ], [ [ 9431, 9431 ], "mapped", [ 104 ] ], [ [ 9432, 9432 ], "mapped", [ 105 ] ], [ [ 9433, 9433 ], "mapped", [ 106 ] ], [ [ 9434, 9434 ], "mapped", [ 107 ] ], [ [ 9435, 9435 ], "mapped", [ 108 ] ], [ [ 9436, 9436 ], "mapped", [ 109 ] ], [ [ 9437, 9437 ], "mapped", [ 110 ] ], [ [ 9438, 9438 ], "mapped", [ 111 ] ], [ [ 9439, 9439 ], "mapped", [ 112 ] ], [ [ 9440, 9440 ], "mapped", [ 113 ] ], [ [ 9441, 9441 ], "mapped", [ 114 ] ], [ [ 9442, 9442 ], "mapped", [ 115 ] ], [ [ 9443, 9443 ], "mapped", [ 116 ] ], [ [ 9444, 9444 ], "mapped", [ 117 ] ], [ [ 9445, 9445 ], "mapped", [ 118 ] ], [ [ 9446, 9446 ], "mapped", [ 119 ] ], [ [ 9447, 9447 ], "mapped", [ 120 ] ], [ [ 9448, 9448 ], "mapped", [ 121 ] ], [ [ 9449, 9449 ], "mapped", [ 122 ] ], [ [ 9450, 9450 ], "mapped", [ 48 ] ], [ [ 9451, 9470 ], "valid", [ ], "NV8" ], [ [ 9471, 9471 ], "valid", [ ], "NV8" ], [ [ 9472, 9621 ], "valid", [ ], "NV8" ], [ [ 9622, 9631 ], "valid", [ ], "NV8" ], [ [ 9632, 9711 ], "valid", [ ], "NV8" ], [ [ 9712, 9719 ], "valid", [ ], "NV8" ], [ [ 9720, 9727 ], "valid", [ ], "NV8" ], [ [ 9728, 9747 ], "valid", [ ], "NV8" ], [ [ 9748, 9749 ], "valid", [ ], "NV8" ], [ [ 9750, 9751 ], "valid", [ ], "NV8" ], [ [ 9752, 9752 ], "valid", [ ], "NV8" ], [ [ 9753, 9753 ], "valid", [ ], "NV8" ], [ [ 9754, 9839 ], "valid", [ ], "NV8" ], [ [ 9840, 9841 ], "valid", [ ], "NV8" ], [ [ 9842, 9853 ], "valid", [ ], "NV8" ], [ [ 9854, 9855 ], "valid", [ ], "NV8" ], [ [ 9856, 9865 ], "valid", [ ], "NV8" ], [ [ 9866, 9873 ], "valid", [ ], "NV8" ], [ [ 9874, 9884 ], "valid", [ ], "NV8" ], [ [ 9885, 9885 ], "valid", [ ], "NV8" ], [ [ 9886, 9887 ], "valid", [ ], "NV8" ], [ [ 9888, 9889 ], "valid", [ ], "NV8" ], [ [ 9890, 9905 ], "valid", [ ], "NV8" ], [ [ 9906, 9906 ], "valid", [ ], "NV8" ], [ [ 9907, 9916 ], "valid", [ ], "NV8" ], [ [ 9917, 9919 ], "valid", [ ], "NV8" ], [ [ 9920, 9923 ], "valid", [ ], "NV8" ], [ [ 9924, 9933 ], "valid", [ ], "NV8" ], [ [ 9934, 9934 ], "valid", [ ], "NV8" ], [ [ 9935, 9953 ], "valid", [ ], "NV8" ], [ [ 9954, 9954 ], "valid", [ ], "NV8" ], [ [ 9955, 9955 ], "valid", [ ], "NV8" ], [ [ 9956, 9959 ], "valid", [ ], "NV8" ], [ [ 9960, 9983 ], "valid", [ ], "NV8" ], [ [ 9984, 9984 ], "valid", [ ], "NV8" ], [ [ 9985, 9988 ], "valid", [ ], "NV8" ], [ [ 9989, 9989 ], "valid", [ ], "NV8" ], [ [ 9990, 9993 ], "valid", [ ], "NV8" ], [ [ 9994, 9995 ], "valid", [ ], "NV8" ], [ [ 9996, 10023 ], "valid", [ ], "NV8" ], [ [ 10024, 10024 ], "valid", [ ], "NV8" ], [ [ 10025, 10059 ], "valid", [ ], "NV8" ], [ [ 10060, 10060 ], "valid", [ ], "NV8" ], [ [ 10061, 10061 ], "valid", [ ], "NV8" ], [ [ 10062, 10062 ], "valid", [ ], "NV8" ], [ [ 10063, 10066 ], "valid", [ ], "NV8" ], [ [ 10067, 10069 ], "valid", [ ], "NV8" ], [ [ 10070, 10070 ], "valid", [ ], "NV8" ], [ [ 10071, 10071 ], "valid", [ ], "NV8" ], [ [ 10072, 10078 ], "valid", [ ], "NV8" ], [ [ 10079, 10080 ], "valid", [ ], "NV8" ], [ [ 10081, 10087 ], "valid", [ ], "NV8" ], [ [ 10088, 10101 ], "valid", [ ], "NV8" ], [ [ 10102, 10132 ], "valid", [ ], "NV8" ], [ [ 10133, 10135 ], "valid", [ ], "NV8" ], [ [ 10136, 10159 ], "valid", [ ], "NV8" ], [ [ 10160, 10160 ], "valid", [ ], "NV8" ], [ [ 10161, 10174 ], "valid", [ ], "NV8" ], [ [ 10175, 10175 ], "valid", [ ], "NV8" ], [ [ 10176, 10182 ], "valid", [ ], "NV8" ], [ [ 10183, 10186 ], "valid", [ ], "NV8" ], [ [ 10187, 10187 ], "valid", [ ], "NV8" ], [ [ 10188, 10188 ], "valid", [ ], "NV8" ], [ [ 10189, 10189 ], "valid", [ ], "NV8" ], [ [ 10190, 10191 ], "valid", [ ], "NV8" ], [ [ 10192, 10219 ], "valid", [ ], "NV8" ], [ [ 10220, 10223 ], "valid", [ ], "NV8" ], [ [ 10224, 10239 ], "valid", [ ], "NV8" ], [ [ 10240, 10495 ], "valid", [ ], "NV8" ], [ [ 10496, 10763 ], "valid", [ ], "NV8" ], [ [ 10764, 10764 ], "mapped", [ 8747, 8747, 8747, 8747 ] ], [ [ 10765, 10867 ], "valid", [ ], "NV8" ], [ [ 10868, 10868 ], "disallowed_STD3_mapped", [ 58, 58, 61 ] ], [ [ 10869, 10869 ], "disallowed_STD3_mapped", [ 61, 61 ] ], [ [ 10870, 10870 ], "disallowed_STD3_mapped", [ 61, 61, 61 ] ], [ [ 10871, 10971 ], "valid", [ ], "NV8" ], [ [ 10972, 10972 ], "mapped", [ 10973, 824 ] ], [ [ 10973, 11007 ], "valid", [ ], "NV8" ], [ [ 11008, 11021 ], "valid", [ ], "NV8" ], [ [ 11022, 11027 ], "valid", [ ], "NV8" ], [ [ 11028, 11034 ], "valid", [ ], "NV8" ], [ [ 11035, 11039 ], "valid", [ ], "NV8" ], [ [ 11040, 11043 ], "valid", [ ], "NV8" ], [ [ 11044, 11084 ], "valid", [ ], "NV8" ], [ [ 11085, 11087 ], "valid", [ ], "NV8" ], [ [ 11088, 11092 ], "valid", [ ], "NV8" ], [ [ 11093, 11097 ], "valid", [ ], "NV8" ], [ [ 11098, 11123 ], "valid", [ ], "NV8" ], [ [ 11124, 11125 ], "disallowed" ], [ [ 11126, 11157 ], "valid", [ ], "NV8" ], [ [ 11158, 11159 ], "disallowed" ], [ [ 11160, 11193 ], "valid", [ ], "NV8" ], [ [ 11194, 11196 ], "disallowed" ], [ [ 11197, 11208 ], "valid", [ ], "NV8" ], [ [ 11209, 11209 ], "disallowed" ], [ [ 11210, 11217 ], "valid", [ ], "NV8" ], [ [ 11218, 11243 ], "disallowed" ], [ [ 11244, 11247 ], "valid", [ ], "NV8" ], [ [ 11248, 11263 ], "disallowed" ], [ [ 11264, 11264 ], "mapped", [ 11312 ] ], [ [ 11265, 11265 ], "mapped", [ 11313 ] ], [ [ 11266, 11266 ], "mapped", [ 11314 ] ], [ [ 11267, 11267 ], "mapped", [ 11315 ] ], [ [ 11268, 11268 ], "mapped", [ 11316 ] ], [ [ 11269, 11269 ], "mapped", [ 11317 ] ], [ [ 11270, 11270 ], "mapped", [ 11318 ] ], [ [ 11271, 11271 ], "mapped", [ 11319 ] ], [ [ 11272, 11272 ], "mapped", [ 11320 ] ], [ [ 11273, 11273 ], "mapped", [ 11321 ] ], [ [ 11274, 11274 ], "mapped", [ 11322 ] ], [ [ 11275, 11275 ], "mapped", [ 11323 ] ], [ [ 11276, 11276 ], "mapped", [ 11324 ] ], [ [ 11277, 11277 ], "mapped", [ 11325 ] ], [ [ 11278, 11278 ], "mapped", [ 11326 ] ], [ [ 11279, 11279 ], "mapped", [ 11327 ] ], [ [ 11280, 11280 ], "mapped", [ 11328 ] ], [ [ 11281, 11281 ], "mapped", [ 11329 ] ], [ [ 11282, 11282 ], "mapped", [ 11330 ] ], [ [ 11283, 11283 ], "mapped", [ 11331 ] ], [ [ 11284, 11284 ], "mapped", [ 11332 ] ], [ [ 11285, 11285 ], "mapped", [ 11333 ] ], [ [ 11286, 11286 ], "mapped", [ 11334 ] ], [ [ 11287, 11287 ], "mapped", [ 11335 ] ], [ [ 11288, 11288 ], "mapped", [ 11336 ] ], [ [ 11289, 11289 ], "mapped", [ 11337 ] ], [ [ 11290, 11290 ], "mapped", [ 11338 ] ], [ [ 11291, 11291 ], "mapped", [ 11339 ] ], [ [ 11292, 11292 ], "mapped", [ 11340 ] ], [ [ 11293, 11293 ], "mapped", [ 11341 ] ], [ [ 11294, 11294 ], "mapped", [ 11342 ] ], [ [ 11295, 11295 ], "mapped", [ 11343 ] ], [ [ 11296, 11296 ], "mapped", [ 11344 ] ], [ [ 11297, 11297 ], "mapped", [ 11345 ] ], [ [ 11298, 11298 ], "mapped", [ 11346 ] ], [ [ 11299, 11299 ], "mapped", [ 11347 ] ], [ [ 11300, 11300 ], "mapped", [ 11348 ] ], [ [ 11301, 11301 ], "mapped", [ 11349 ] ], [ [ 11302, 11302 ], "mapped", [ 11350 ] ], [ [ 11303, 11303 ], "mapped", [ 11351 ] ], [ [ 11304, 11304 ], "mapped", [ 11352 ] ], [ [ 11305, 11305 ], "mapped", [ 11353 ] ], [ [ 11306, 11306 ], "mapped", [ 11354 ] ], [ [ 11307, 11307 ], "mapped", [ 11355 ] ], [ [ 11308, 11308 ], "mapped", [ 11356 ] ], [ [ 11309, 11309 ], "mapped", [ 11357 ] ], [ [ 11310, 11310 ], "mapped", [ 11358 ] ], [ [ 11311, 11311 ], "disallowed" ], [ [ 11312, 11358 ], "valid" ], [ [ 11359, 11359 ], "disallowed" ], [ [ 11360, 11360 ], "mapped", [ 11361 ] ], [ [ 11361, 11361 ], "valid" ], [ [ 11362, 11362 ], "mapped", [ 619 ] ], [ [ 11363, 11363 ], "mapped", [ 7549 ] ], [ [ 11364, 11364 ], "mapped", [ 637 ] ], [ [ 11365, 11366 ], "valid" ], [ [ 11367, 11367 ], "mapped", [ 11368 ] ], [ [ 11368, 11368 ], "valid" ], [ [ 11369, 11369 ], "mapped", [ 11370 ] ], [ [ 11370, 11370 ], "valid" ], [ [ 11371, 11371 ], "mapped", [ 11372 ] ], [ [ 11372, 11372 ], "valid" ], [ [ 11373, 11373 ], "mapped", [ 593 ] ], [ [ 11374, 11374 ], "mapped", [ 625 ] ], [ [ 11375, 11375 ], "mapped", [ 592 ] ], [ [ 11376, 11376 ], "mapped", [ 594 ] ], [ [ 11377, 11377 ], "valid" ], [ [ 11378, 11378 ], "mapped", [ 11379 ] ], [ [ 11379, 11379 ], "valid" ], [ [ 11380, 11380 ], "valid" ], [ [ 11381, 11381 ], "mapped", [ 11382 ] ], [ [ 11382, 11383 ], "valid" ], [ [ 11384, 11387 ], "valid" ], [ [ 11388, 11388 ], "mapped", [ 106 ] ], [ [ 11389, 11389 ], "mapped", [ 118 ] ], [ [ 11390, 11390 ], "mapped", [ 575 ] ], [ [ 11391, 11391 ], "mapped", [ 576 ] ], [ [ 11392, 11392 ], "mapped", [ 11393 ] ], [ [ 11393, 11393 ], "valid" ], [ [ 11394, 11394 ], "mapped", [ 11395 ] ], [ [ 11395, 11395 ], "valid" ], [ [ 11396, 11396 ], "mapped", [ 11397 ] ], [ [ 11397, 11397 ], "valid" ], [ [ 11398, 11398 ], "mapped", [ 11399 ] ], [ [ 11399, 11399 ], "valid" ], [ [ 11400, 11400 ], "mapped", [ 11401 ] ], [ [ 11401, 11401 ], "valid" ], [ [ 11402, 11402 ], "mapped", [ 11403 ] ], [ [ 11403, 11403 ], "valid" ], [ [ 11404, 11404 ], "mapped", [ 11405 ] ], [ [ 11405, 11405 ], "valid" ], [ [ 11406, 11406 ], "mapped", [ 11407 ] ], [ [ 11407, 11407 ], "valid" ], [ [ 11408, 11408 ], "mapped", [ 11409 ] ], [ [ 11409, 11409 ], "valid" ], [ [ 11410, 11410 ], "mapped", [ 11411 ] ], [ [ 11411, 11411 ], "valid" ], [ [ 11412, 11412 ], "mapped", [ 11413 ] ], [ [ 11413, 11413 ], "valid" ], [ [ 11414, 11414 ], "mapped", [ 11415 ] ], [ [ 11415, 11415 ], "valid" ], [ [ 11416, 11416 ], "mapped", [ 11417 ] ], [ [ 11417, 11417 ], "valid" ], [ [ 11418, 11418 ], "mapped", [ 11419 ] ], [ [ 11419, 11419 ], "valid" ], [ [ 11420, 11420 ], "mapped", [ 11421 ] ], [ [ 11421, 11421 ], "valid" ], [ [ 11422, 11422 ], "mapped", [ 11423 ] ], [ [ 11423, 11423 ], "valid" ], [ [ 11424, 11424 ], "mapped", [ 11425 ] ], [ [ 11425, 11425 ], "valid" ], [ [ 11426, 11426 ], "mapped", [ 11427 ] ], [ [ 11427, 11427 ], "valid" ], [ [ 11428, 11428 ], "mapped", [ 11429 ] ], [ [ 11429, 11429 ], "valid" ], [ [ 11430, 11430 ], "mapped", [ 11431 ] ], [ [ 11431, 11431 ], "valid" ], [ [ 11432, 11432 ], "mapped", [ 11433 ] ], [ [ 11433, 11433 ], "valid" ], [ [ 11434, 11434 ], "mapped", [ 11435 ] ], [ [ 11435, 11435 ], "valid" ], [ [ 11436, 11436 ], "mapped", [ 11437 ] ], [ [ 11437, 11437 ], "valid" ], [ [ 11438, 11438 ], "mapped", [ 11439 ] ], [ [ 11439, 11439 ], "valid" ], [ [ 11440, 11440 ], "mapped", [ 11441 ] ], [ [ 11441, 11441 ], "valid" ], [ [ 11442, 11442 ], "mapped", [ 11443 ] ], [ [ 11443, 11443 ], "valid" ], [ [ 11444, 11444 ], "mapped", [ 11445 ] ], [ [ 11445, 11445 ], "valid" ], [ [ 11446, 11446 ], "mapped", [ 11447 ] ], [ [ 11447, 11447 ], "valid" ], [ [ 11448, 11448 ], "mapped", [ 11449 ] ], [ [ 11449, 11449 ], "valid" ], [ [ 11450, 11450 ], "mapped", [ 11451 ] ], [ [ 11451, 11451 ], "valid" ], [ [ 11452, 11452 ], "mapped", [ 11453 ] ], [ [ 11453, 11453 ], "valid" ], [ [ 11454, 11454 ], "mapped", [ 11455 ] ], [ [ 11455, 11455 ], "valid" ], [ [ 11456, 11456 ], "mapped", [ 11457 ] ], [ [ 11457, 11457 ], "valid" ], [ [ 11458, 11458 ], "mapped", [ 11459 ] ], [ [ 11459, 11459 ], "valid" ], [ [ 11460, 11460 ], "mapped", [ 11461 ] ], [ [ 11461, 11461 ], "valid" ], [ [ 11462, 11462 ], "mapped", [ 11463 ] ], [ [ 11463, 11463 ], "valid" ], [ [ 11464, 11464 ], "mapped", [ 11465 ] ], [ [ 11465, 11465 ], "valid" ], [ [ 11466, 11466 ], "mapped", [ 11467 ] ], [ [ 11467, 11467 ], "valid" ], [ [ 11468, 11468 ], "mapped", [ 11469 ] ], [ [ 11469, 11469 ], "valid" ], [ [ 11470, 11470 ], "mapped", [ 11471 ] ], [ [ 11471, 11471 ], "valid" ], [ [ 11472, 11472 ], "mapped", [ 11473 ] ], [ [ 11473, 11473 ], "valid" ], [ [ 11474, 11474 ], "mapped", [ 11475 ] ], [ [ 11475, 11475 ], "valid" ], [ [ 11476, 11476 ], "mapped", [ 11477 ] ], [ [ 11477, 11477 ], "valid" ], [ [ 11478, 11478 ], "mapped", [ 11479 ] ], [ [ 11479, 11479 ], "valid" ], [ [ 11480, 11480 ], "mapped", [ 11481 ] ], [ [ 11481, 11481 ], "valid" ], [ [ 11482, 11482 ], "mapped", [ 11483 ] ], [ [ 11483, 11483 ], "valid" ], [ [ 11484, 11484 ], "mapped", [ 11485 ] ], [ [ 11485, 11485 ], "valid" ], [ [ 11486, 11486 ], "mapped", [ 11487 ] ], [ [ 11487, 11487 ], "valid" ], [ [ 11488, 11488 ], "mapped", [ 11489 ] ], [ [ 11489, 11489 ], "valid" ], [ [ 11490, 11490 ], "mapped", [ 11491 ] ], [ [ 11491, 11492 ], "valid" ], [ [ 11493, 11498 ], "valid", [ ], "NV8" ], [ [ 11499, 11499 ], "mapped", [ 11500 ] ], [ [ 11500, 11500 ], "valid" ], [ [ 11501, 11501 ], "mapped", [ 11502 ] ], [ [ 11502, 11505 ], "valid" ], [ [ 11506, 11506 ], "mapped", [ 11507 ] ], [ [ 11507, 11507 ], "valid" ], [ [ 11508, 11512 ], "disallowed" ], [ [ 11513, 11519 ], "valid", [ ], "NV8" ], [ [ 11520, 11557 ], "valid" ], [ [ 11558, 11558 ], "disallowed" ], [ [ 11559, 11559 ], "valid" ], [ [ 11560, 11564 ], "disallowed" ], [ [ 11565, 11565 ], "valid" ], [ [ 11566, 11567 ], "disallowed" ], [ [ 11568, 11621 ], "valid" ], [ [ 11622, 11623 ], "valid" ], [ [ 11624, 11630 ], "disallowed" ], [ [ 11631, 11631 ], "mapped", [ 11617 ] ], [ [ 11632, 11632 ], "valid", [ ], "NV8" ], [ [ 11633, 11646 ], "disallowed" ], [ [ 11647, 11647 ], "valid" ], [ [ 11648, 11670 ], "valid" ], [ [ 11671, 11679 ], "disallowed" ], [ [ 11680, 11686 ], "valid" ], [ [ 11687, 11687 ], "disallowed" ], [ [ 11688, 11694 ], "valid" ], [ [ 11695, 11695 ], "disallowed" ], [ [ 11696, 11702 ], "valid" ], [ [ 11703, 11703 ], "disallowed" ], [ [ 11704, 11710 ], "valid" ], [ [ 11711, 11711 ], "disallowed" ], [ [ 11712, 11718 ], "valid" ], [ [ 11719, 11719 ], "disallowed" ], [ [ 11720, 11726 ], "valid" ], [ [ 11727, 11727 ], "disallowed" ], [ [ 11728, 11734 ], "valid" ], [ [ 11735, 11735 ], "disallowed" ], [ [ 11736, 11742 ], "valid" ], [ [ 11743, 11743 ], "disallowed" ], [ [ 11744, 11775 ], "valid" ], [ [ 11776, 11799 ], "valid", [ ], "NV8" ], [ [ 11800, 11803 ], "valid", [ ], "NV8" ], [ [ 11804, 11805 ], "valid", [ ], "NV8" ], [ [ 11806, 11822 ], "valid", [ ], "NV8" ], [ [ 11823, 11823 ], "valid" ], [ [ 11824, 11824 ], "valid", [ ], "NV8" ], [ [ 11825, 11825 ], "valid", [ ], "NV8" ], [ [ 11826, 11835 ], "valid", [ ], "NV8" ], [ [ 11836, 11842 ], "valid", [ ], "NV8" ], [ [ 11843, 11903 ], "disallowed" ], [ [ 11904, 11929 ], "valid", [ ], "NV8" ], [ [ 11930, 11930 ], "disallowed" ], [ [ 11931, 11934 ], "valid", [ ], "NV8" ], [ [ 11935, 11935 ], "mapped", [ 27597 ] ], [ [ 11936, 12018 ], "valid", [ ], "NV8" ], [ [ 12019, 12019 ], "mapped", [ 40863 ] ], [ [ 12020, 12031 ], "disallowed" ], [ [ 12032, 12032 ], "mapped", [ 19968 ] ], [ [ 12033, 12033 ], "mapped", [ 20008 ] ], [ [ 12034, 12034 ], "mapped", [ 20022 ] ], [ [ 12035, 12035 ], "mapped", [ 20031 ] ], [ [ 12036, 12036 ], "mapped", [ 20057 ] ], [ [ 12037, 12037 ], "mapped", [ 20101 ] ], [ [ 12038, 12038 ], "mapped", [ 20108 ] ], [ [ 12039, 12039 ], "mapped", [ 20128 ] ], [ [ 12040, 12040 ], "mapped", [ 20154 ] ], [ [ 12041, 12041 ], "mapped", [ 20799 ] ], [ [ 12042, 12042 ], "mapped", [ 20837 ] ], [ [ 12043, 12043 ], "mapped", [ 20843 ] ], [ [ 12044, 12044 ], "mapped", [ 20866 ] ], [ [ 12045, 12045 ], "mapped", [ 20886 ] ], [ [ 12046, 12046 ], "mapped", [ 20907 ] ], [ [ 12047, 12047 ], "mapped", [ 20960 ] ], [ [ 12048, 12048 ], "mapped", [ 20981 ] ], [ [ 12049, 12049 ], "mapped", [ 20992 ] ], [ [ 12050, 12050 ], "mapped", [ 21147 ] ], [ [ 12051, 12051 ], "mapped", [ 21241 ] ], [ [ 12052, 12052 ], "mapped", [ 21269 ] ], [ [ 12053, 12053 ], "mapped", [ 21274 ] ], [ [ 12054, 12054 ], "mapped", [ 21304 ] ], [ [ 12055, 12055 ], "mapped", [ 21313 ] ], [ [ 12056, 12056 ], "mapped", [ 21340 ] ], [ [ 12057, 12057 ], "mapped", [ 21353 ] ], [ [ 12058, 12058 ], "mapped", [ 21378 ] ], [ [ 12059, 12059 ], "mapped", [ 21430 ] ], [ [ 12060, 12060 ], "mapped", [ 21448 ] ], [ [ 12061, 12061 ], "mapped", [ 21475 ] ], [ [ 12062, 12062 ], "mapped", [ 22231 ] ], [ [ 12063, 12063 ], "mapped", [ 22303 ] ], [ [ 12064, 12064 ], "mapped", [ 22763 ] ], [ [ 12065, 12065 ], "mapped", [ 22786 ] ], [ [ 12066, 12066 ], "mapped", [ 22794 ] ], [ [ 12067, 12067 ], "mapped", [ 22805 ] ], [ [ 12068, 12068 ], "mapped", [ 22823 ] ], [ [ 12069, 12069 ], "mapped", [ 22899 ] ], [ [ 12070, 12070 ], "mapped", [ 23376 ] ], [ [ 12071, 12071 ], "mapped", [ 23424 ] ], [ [ 12072, 12072 ], "mapped", [ 23544 ] ], [ [ 12073, 12073 ], "mapped", [ 23567 ] ], [ [ 12074, 12074 ], "mapped", [ 23586 ] ], [ [ 12075, 12075 ], "mapped", [ 23608 ] ], [ [ 12076, 12076 ], "mapped", [ 23662 ] ], [ [ 12077, 12077 ], "mapped", [ 23665 ] ], [ [ 12078, 12078 ], "mapped", [ 24027 ] ], [ [ 12079, 12079 ], "mapped", [ 24037 ] ], [ [ 12080, 12080 ], "mapped", [ 24049 ] ], [ [ 12081, 12081 ], "mapped", [ 24062 ] ], [ [ 12082, 12082 ], "mapped", [ 24178 ] ], [ [ 12083, 12083 ], "mapped", [ 24186 ] ], [ [ 12084, 12084 ], "mapped", [ 24191 ] ], [ [ 12085, 12085 ], "mapped", [ 24308 ] ], [ [ 12086, 12086 ], "mapped", [ 24318 ] ], [ [ 12087, 12087 ], "mapped", [ 24331 ] ], [ [ 12088, 12088 ], "mapped", [ 24339 ] ], [ [ 12089, 12089 ], "mapped", [ 24400 ] ], [ [ 12090, 12090 ], "mapped", [ 24417 ] ], [ [ 12091, 12091 ], "mapped", [ 24435 ] ], [ [ 12092, 12092 ], "mapped", [ 24515 ] ], [ [ 12093, 12093 ], "mapped", [ 25096 ] ], [ [ 12094, 12094 ], "mapped", [ 25142 ] ], [ [ 12095, 12095 ], "mapped", [ 25163 ] ], [ [ 12096, 12096 ], "mapped", [ 25903 ] ], [ [ 12097, 12097 ], "mapped", [ 25908 ] ], [ [ 12098, 12098 ], "mapped", [ 25991 ] ], [ [ 12099, 12099 ], "mapped", [ 26007 ] ], [ [ 12100, 12100 ], "mapped", [ 26020 ] ], [ [ 12101, 12101 ], "mapped", [ 26041 ] ], [ [ 12102, 12102 ], "mapped", [ 26080 ] ], [ [ 12103, 12103 ], "mapped", [ 26085 ] ], [ [ 12104, 12104 ], "mapped", [ 26352 ] ], [ [ 12105, 12105 ], "mapped", [ 26376 ] ], [ [ 12106, 12106 ], "mapped", [ 26408 ] ], [ [ 12107, 12107 ], "mapped", [ 27424 ] ], [ [ 12108, 12108 ], "mapped", [ 27490 ] ], [ [ 12109, 12109 ], "mapped", [ 27513 ] ], [ [ 12110, 12110 ], "mapped", [ 27571 ] ], [ [ 12111, 12111 ], "mapped", [ 27595 ] ], [ [ 12112, 12112 ], "mapped", [ 27604 ] ], [ [ 12113, 12113 ], "mapped", [ 27611 ] ], [ [ 12114, 12114 ], "mapped", [ 27663 ] ], [ [ 12115, 12115 ], "mapped", [ 27668 ] ], [ [ 12116, 12116 ], "mapped", [ 27700 ] ], [ [ 12117, 12117 ], "mapped", [ 28779 ] ], [ [ 12118, 12118 ], "mapped", [ 29226 ] ], [ [ 12119, 12119 ], "mapped", [ 29238 ] ], [ [ 12120, 12120 ], "mapped", [ 29243 ] ], [ [ 12121, 12121 ], "mapped", [ 29247 ] ], [ [ 12122, 12122 ], "mapped", [ 29255 ] ], [ [ 12123, 12123 ], "mapped", [ 29273 ] ], [ [ 12124, 12124 ], "mapped", [ 29275 ] ], [ [ 12125, 12125 ], "mapped", [ 29356 ] ], [ [ 12126, 12126 ], "mapped", [ 29572 ] ], [ [ 12127, 12127 ], "mapped", [ 29577 ] ], [ [ 12128, 12128 ], "mapped", [ 29916 ] ], [ [ 12129, 12129 ], "mapped", [ 29926 ] ], [ [ 12130, 12130 ], "mapped", [ 29976 ] ], [ [ 12131, 12131 ], "mapped", [ 29983 ] ], [ [ 12132, 12132 ], "mapped", [ 29992 ] ], [ [ 12133, 12133 ], "mapped", [ 30000 ] ], [ [ 12134, 12134 ], "mapped", [ 30091 ] ], [ [ 12135, 12135 ], "mapped", [ 30098 ] ], [ [ 12136, 12136 ], "mapped", [ 30326 ] ], [ [ 12137, 12137 ], "mapped", [ 30333 ] ], [ [ 12138, 12138 ], "mapped", [ 30382 ] ], [ [ 12139, 12139 ], "mapped", [ 30399 ] ], [ [ 12140, 12140 ], "mapped", [ 30446 ] ], [ [ 12141, 12141 ], "mapped", [ 30683 ] ], [ [ 12142, 12142 ], "mapped", [ 30690 ] ], [ [ 12143, 12143 ], "mapped", [ 30707 ] ], [ [ 12144, 12144 ], "mapped", [ 31034 ] ], [ [ 12145, 12145 ], "mapped", [ 31160 ] ], [ [ 12146, 12146 ], "mapped", [ 31166 ] ], [ [ 12147, 12147 ], "mapped", [ 31348 ] ], [ [ 12148, 12148 ], "mapped", [ 31435 ] ], [ [ 12149, 12149 ], "mapped", [ 31481 ] ], [ [ 12150, 12150 ], "mapped", [ 31859 ] ], [ [ 12151, 12151 ], "mapped", [ 31992 ] ], [ [ 12152, 12152 ], "mapped", [ 32566 ] ], [ [ 12153, 12153 ], "mapped", [ 32593 ] ], [ [ 12154, 12154 ], "mapped", [ 32650 ] ], [ [ 12155, 12155 ], "mapped", [ 32701 ] ], [ [ 12156, 12156 ], "mapped", [ 32769 ] ], [ [ 12157, 12157 ], "mapped", [ 32780 ] ], [ [ 12158, 12158 ], "mapped", [ 32786 ] ], [ [ 12159, 12159 ], "mapped", [ 32819 ] ], [ [ 12160, 12160 ], "mapped", [ 32895 ] ], [ [ 12161, 12161 ], "mapped", [ 32905 ] ], [ [ 12162, 12162 ], "mapped", [ 33251 ] ], [ [ 12163, 12163 ], "mapped", [ 33258 ] ], [ [ 12164, 12164 ], "mapped", [ 33267 ] ], [ [ 12165, 12165 ], "mapped", [ 33276 ] ], [ [ 12166, 12166 ], "mapped", [ 33292 ] ], [ [ 12167, 12167 ], "mapped", [ 33307 ] ], [ [ 12168, 12168 ], "mapped", [ 33311 ] ], [ [ 12169, 12169 ], "mapped", [ 33390 ] ], [ [ 12170, 12170 ], "mapped", [ 33394 ] ], [ [ 12171, 12171 ], "mapped", [ 33400 ] ], [ [ 12172, 12172 ], "mapped", [ 34381 ] ], [ [ 12173, 12173 ], "mapped", [ 34411 ] ], [ [ 12174, 12174 ], "mapped", [ 34880 ] ], [ [ 12175, 12175 ], "mapped", [ 34892 ] ], [ [ 12176, 12176 ], "mapped", [ 34915 ] ], [ [ 12177, 12177 ], "mapped", [ 35198 ] ], [ [ 12178, 12178 ], "mapped", [ 35211 ] ], [ [ 12179, 12179 ], "mapped", [ 35282 ] ], [ [ 12180, 12180 ], "mapped", [ 35328 ] ], [ [ 12181, 12181 ], "mapped", [ 35895 ] ], [ [ 12182, 12182 ], "mapped", [ 35910 ] ], [ [ 12183, 12183 ], "mapped", [ 35925 ] ], [ [ 12184, 12184 ], "mapped", [ 35960 ] ], [ [ 12185, 12185 ], "mapped", [ 35997 ] ], [ [ 12186, 12186 ], "mapped", [ 36196 ] ], [ [ 12187, 12187 ], "mapped", [ 36208 ] ], [ [ 12188, 12188 ], "mapped", [ 36275 ] ], [ [ 12189, 12189 ], "mapped", [ 36523 ] ], [ [ 12190, 12190 ], "mapped", [ 36554 ] ], [ [ 12191, 12191 ], "mapped", [ 36763 ] ], [ [ 12192, 12192 ], "mapped", [ 36784 ] ], [ [ 12193, 12193 ], "mapped", [ 36789 ] ], [ [ 12194, 12194 ], "mapped", [ 37009 ] ], [ [ 12195, 12195 ], "mapped", [ 37193 ] ], [ [ 12196, 12196 ], "mapped", [ 37318 ] ], [ [ 12197, 12197 ], "mapped", [ 37324 ] ], [ [ 12198, 12198 ], "mapped", [ 37329 ] ], [ [ 12199, 12199 ], "mapped", [ 38263 ] ], [ [ 12200, 12200 ], "mapped", [ 38272 ] ], [ [ 12201, 12201 ], "mapped", [ 38428 ] ], [ [ 12202, 12202 ], "mapped", [ 38582 ] ], [ [ 12203, 12203 ], "mapped", [ 38585 ] ], [ [ 12204, 12204 ], "mapped", [ 38632 ] ], [ [ 12205, 12205 ], "mapped", [ 38737 ] ], [ [ 12206, 12206 ], "mapped", [ 38750 ] ], [ [ 12207, 12207 ], "mapped", [ 38754 ] ], [ [ 12208, 12208 ], "mapped", [ 38761 ] ], [ [ 12209, 12209 ], "mapped", [ 38859 ] ], [ [ 12210, 12210 ], "mapped", [ 38893 ] ], [ [ 12211, 12211 ], "mapped", [ 38899 ] ], [ [ 12212, 12212 ], "mapped", [ 38913 ] ], [ [ 12213, 12213 ], "mapped", [ 39080 ] ], [ [ 12214, 12214 ], "mapped", [ 39131 ] ], [ [ 12215, 12215 ], "mapped", [ 39135 ] ], [ [ 12216, 12216 ], "mapped", [ 39318 ] ], [ [ 12217, 12217 ], "mapped", [ 39321 ] ], [ [ 12218, 12218 ], "mapped", [ 39340 ] ], [ [ 12219, 12219 ], "mapped", [ 39592 ] ], [ [ 12220, 12220 ], "mapped", [ 39640 ] ], [ [ 12221, 12221 ], "mapped", [ 39647 ] ], [ [ 12222, 12222 ], "mapped", [ 39717 ] ], [ [ 12223, 12223 ], "mapped", [ 39727 ] ], [ [ 12224, 12224 ], "mapped", [ 39730 ] ], [ [ 12225, 12225 ], "mapped", [ 39740 ] ], [ [ 12226, 12226 ], "mapped", [ 39770 ] ], [ [ 12227, 12227 ], "mapped", [ 40165 ] ], [ [ 12228, 12228 ], "mapped", [ 40565 ] ], [ [ 12229, 12229 ], "mapped", [ 40575 ] ], [ [ 12230, 12230 ], "mapped", [ 40613 ] ], [ [ 12231, 12231 ], "mapped", [ 40635 ] ], [ [ 12232, 12232 ], "mapped", [ 40643 ] ], [ [ 12233, 12233 ], "mapped", [ 40653 ] ], [ [ 12234, 12234 ], "mapped", [ 40657 ] ], [ [ 12235, 12235 ], "mapped", [ 40697 ] ], [ [ 12236, 12236 ], "mapped", [ 40701 ] ], [ [ 12237, 12237 ], "mapped", [ 40718 ] ], [ [ 12238, 12238 ], "mapped", [ 40723 ] ], [ [ 12239, 12239 ], "mapped", [ 40736 ] ], [ [ 12240, 12240 ], "mapped", [ 40763 ] ], [ [ 12241, 12241 ], "mapped", [ 40778 ] ], [ [ 12242, 12242 ], "mapped", [ 40786 ] ], [ [ 12243, 12243 ], "mapped", [ 40845 ] ], [ [ 12244, 12244 ], "mapped", [ 40860 ] ], [ [ 12245, 12245 ], "mapped", [ 40864 ] ], [ [ 12246, 12271 ], "disallowed" ], [ [ 12272, 12283 ], "disallowed" ], [ [ 12284, 12287 ], "disallowed" ], [ [ 12288, 12288 ], "disallowed_STD3_mapped", [ 32 ] ], [ [ 12289, 12289 ], "valid", [ ], "NV8" ], [ [ 12290, 12290 ], "mapped", [ 46 ] ], [ [ 12291, 12292 ], "valid", [ ], "NV8" ], [ [ 12293, 12295 ], "valid" ], [ [ 12296, 12329 ], "valid", [ ], "NV8" ], [ [ 12330, 12333 ], "valid" ], [ [ 12334, 12341 ], "valid", [ ], "NV8" ], [ [ 12342, 12342 ], "mapped", [ 12306 ] ], [ [ 12343, 12343 ], "valid", [ ], "NV8" ], [ [ 12344, 12344 ], "mapped", [ 21313 ] ], [ [ 12345, 12345 ], "mapped", [ 21316 ] ], [ [ 12346, 12346 ], "mapped", [ 21317 ] ], [ [ 12347, 12347 ], "valid", [ ], "NV8" ], [ [ 12348, 12348 ], "valid" ], [ [ 12349, 12349 ], "valid", [ ], "NV8" ], [ [ 12350, 12350 ], "valid", [ ], "NV8" ], [ [ 12351, 12351 ], "valid", [ ], "NV8" ], [ [ 12352, 12352 ], "disallowed" ], [ [ 12353, 12436 ], "valid" ], [ [ 12437, 12438 ], "valid" ], [ [ 12439, 12440 ], "disallowed" ], [ [ 12441, 12442 ], "valid" ], [ [ 12443, 12443 ], "disallowed_STD3_mapped", [ 32, 12441 ] ], [ [ 12444, 12444 ], "disallowed_STD3_mapped", [ 32, 12442 ] ], [ [ 12445, 12446 ], "valid" ], [ [ 12447, 12447 ], "mapped", [ 12424, 12426 ] ], [ [ 12448, 12448 ], "valid", [ ], "NV8" ], [ [ 12449, 12542 ], "valid" ], [ [ 12543, 12543 ], "mapped", [ 12467, 12488 ] ], [ [ 12544, 12548 ], "disallowed" ], [ [ 12549, 12588 ], "valid" ], [ [ 12589, 12589 ], "valid" ], [ [ 12590, 12592 ], "disallowed" ], [ [ 12593, 12593 ], "mapped", [ 4352 ] ], [ [ 12594, 12594 ], "mapped", [ 4353 ] ], [ [ 12595, 12595 ], "mapped", [ 4522 ] ], [ [ 12596, 12596 ], "mapped", [ 4354 ] ], [ [ 12597, 12597 ], "mapped", [ 4524 ] ], [ [ 12598, 12598 ], "mapped", [ 4525 ] ], [ [ 12599, 12599 ], "mapped", [ 4355 ] ], [ [ 12600, 12600 ], "mapped", [ 4356 ] ], [ [ 12601, 12601 ], "mapped", [ 4357 ] ], [ [ 12602, 12602 ], "mapped", [ 4528 ] ], [ [ 12603, 12603 ], "mapped", [ 4529 ] ], [ [ 12604, 12604 ], "mapped", [ 4530 ] ], [ [ 12605, 12605 ], "mapped", [ 4531 ] ], [ [ 12606, 12606 ], "mapped", [ 4532 ] ], [ [ 12607, 12607 ], "mapped", [ 4533 ] ], [ [ 12608, 12608 ], "mapped", [ 4378 ] ], [ [ 12609, 12609 ], "mapped", [ 4358 ] ], [ [ 12610, 12610 ], "mapped", [ 4359 ] ], [ [ 12611, 12611 ], "mapped", [ 4360 ] ], [ [ 12612, 12612 ], "mapped", [ 4385 ] ], [ [ 12613, 12613 ], "mapped", [ 4361 ] ], [ [ 12614, 12614 ], "mapped", [ 4362 ] ], [ [ 12615, 12615 ], "mapped", [ 4363 ] ], [ [ 12616, 12616 ], "mapped", [ 4364 ] ], [ [ 12617, 12617 ], "mapped", [ 4365 ] ], [ [ 12618, 12618 ], "mapped", [ 4366 ] ], [ [ 12619, 12619 ], "mapped", [ 4367 ] ], [ [ 12620, 12620 ], "mapped", [ 4368 ] ], [ [ 12621, 12621 ], "mapped", [ 4369 ] ], [ [ 12622, 12622 ], "mapped", [ 4370 ] ], [ [ 12623, 12623 ], "mapped", [ 4449 ] ], [ [ 12624, 12624 ], "mapped", [ 4450 ] ], [ [ 12625, 12625 ], "mapped", [ 4451 ] ], [ [ 12626, 12626 ], "mapped", [ 4452 ] ], [ [ 12627, 12627 ], "mapped", [ 4453 ] ], [ [ 12628, 12628 ], "mapped", [ 4454 ] ], [ [ 12629, 12629 ], "mapped", [ 4455 ] ], [ [ 12630, 12630 ], "mapped", [ 4456 ] ], [ [ 12631, 12631 ], "mapped", [ 4457 ] ], [ [ 12632, 12632 ], "mapped", [ 4458 ] ], [ [ 12633, 12633 ], "mapped", [ 4459 ] ], [ [ 12634, 12634 ], "mapped", [ 4460 ] ], [ [ 12635, 12635 ], "mapped", [ 4461 ] ], [ [ 12636, 12636 ], "mapped", [ 4462 ] ], [ [ 12637, 12637 ], "mapped", [ 4463 ] ], [ [ 12638, 12638 ], "mapped", [ 4464 ] ], [ [ 12639, 12639 ], "mapped", [ 4465 ] ], [ [ 12640, 12640 ], "mapped", [ 4466 ] ], [ [ 12641, 12641 ], "mapped", [ 4467 ] ], [ [ 12642, 12642 ], "mapped", [ 4468 ] ], [ [ 12643, 12643 ], "mapped", [ 4469 ] ], [ [ 12644, 12644 ], "disallowed" ], [ [ 12645, 12645 ], "mapped", [ 4372 ] ], [ [ 12646, 12646 ], "mapped", [ 4373 ] ], [ [ 12647, 12647 ], "mapped", [ 4551 ] ], [ [ 12648, 12648 ], "mapped", [ 4552 ] ], [ [ 12649, 12649 ], "mapped", [ 4556 ] ], [ [ 12650, 12650 ], "mapped", [ 4558 ] ], [ [ 12651, 12651 ], "mapped", [ 4563 ] ], [ [ 12652, 12652 ], "mapped", [ 4567 ] ], [ [ 12653, 12653 ], "mapped", [ 4569 ] ], [ [ 12654, 12654 ], "mapped", [ 4380 ] ], [ [ 12655, 12655 ], "mapped", [ 4573 ] ], [ [ 12656, 12656 ], "mapped", [ 4575 ] ], [ [ 12657, 12657 ], "mapped", [ 4381 ] ], [ [ 12658, 12658 ], "mapped", [ 4382 ] ], [ [ 12659, 12659 ], "mapped", [ 4384 ] ], [ [ 12660, 12660 ], "mapped", [ 4386 ] ], [ [ 12661, 12661 ], "mapped", [ 4387 ] ], [ [ 12662, 12662 ], "mapped", [ 4391 ] ], [ [ 12663, 12663 ], "mapped", [ 4393 ] ], [ [ 12664, 12664 ], "mapped", [ 4395 ] ], [ [ 12665, 12665 ], "mapped", [ 4396 ] ], [ [ 12666, 12666 ], "mapped", [ 4397 ] ], [ [ 12667, 12667 ], "mapped", [ 4398 ] ], [ [ 12668, 12668 ], "mapped", [ 4399 ] ], [ [ 12669, 12669 ], "mapped", [ 4402 ] ], [ [ 12670, 12670 ], "mapped", [ 4406 ] ], [ [ 12671, 12671 ], "mapped", [ 4416 ] ], [ [ 12672, 12672 ], "mapped", [ 4423 ] ], [ [ 12673, 12673 ], "mapped", [ 4428 ] ], [ [ 12674, 12674 ], "mapped", [ 4593 ] ], [ [ 12675, 12675 ], "mapped", [ 4594 ] ], [ [ 12676, 12676 ], "mapped", [ 4439 ] ], [ [ 12677, 12677 ], "mapped", [ 4440 ] ], [ [ 12678, 12678 ], "mapped", [ 4441 ] ], [ [ 12679, 12679 ], "mapped", [ 4484 ] ], [ [ 12680, 12680 ], "mapped", [ 4485 ] ], [ [ 12681, 12681 ], "mapped", [ 4488 ] ], [ [ 12682, 12682 ], "mapped", [ 4497 ] ], [ [ 12683, 12683 ], "mapped", [ 4498 ] ], [ [ 12684, 12684 ], "mapped", [ 4500 ] ], [ [ 12685, 12685 ], "mapped", [ 4510 ] ], [ [ 12686, 12686 ], "mapped", [ 4513 ] ], [ [ 12687, 12687 ], "disallowed" ], [ [ 12688, 12689 ], "valid", [ ], "NV8" ], [ [ 12690, 12690 ], "mapped", [ 19968 ] ], [ [ 12691, 12691 ], "mapped", [ 20108 ] ], [ [ 12692, 12692 ], "mapped", [ 19977 ] ], [ [ 12693, 12693 ], "mapped", [ 22235 ] ], [ [ 12694, 12694 ], "mapped", [ 19978 ] ], [ [ 12695, 12695 ], "mapped", [ 20013 ] ], [ [ 12696, 12696 ], "mapped", [ 19979 ] ], [ [ 12697, 12697 ], "mapped", [ 30002 ] ], [ [ 12698, 12698 ], "mapped", [ 20057 ] ], [ [ 12699, 12699 ], "mapped", [ 19993 ] ], [ [ 12700, 12700 ], "mapped", [ 19969 ] ], [ [ 12701, 12701 ], "mapped", [ 22825 ] ], [ [ 12702, 12702 ], "mapped", [ 22320 ] ], [ [ 12703, 12703 ], "mapped", [ 20154 ] ], [ [ 12704, 12727 ], "valid" ], [ [ 12728, 12730 ], "valid" ], [ [ 12731, 12735 ], "disallowed" ], [ [ 12736, 12751 ], "valid", [ ], "NV8" ], [ [ 12752, 12771 ], "valid", [ ], "NV8" ], [ [ 12772, 12783 ], "disallowed" ], [ [ 12784, 12799 ], "valid" ], [ [ 12800, 12800 ], "disallowed_STD3_mapped", [ 40, 4352, 41 ] ], [ [ 12801, 12801 ], "disallowed_STD3_mapped", [ 40, 4354, 41 ] ], [ [ 12802, 12802 ], "disallowed_STD3_mapped", [ 40, 4355, 41 ] ], [ [ 12803, 12803 ], "disallowed_STD3_mapped", [ 40, 4357, 41 ] ], [ [ 12804, 12804 ], "disallowed_STD3_mapped", [ 40, 4358, 41 ] ], [ [ 12805, 12805 ], "disallowed_STD3_mapped", [ 40, 4359, 41 ] ], [ [ 12806, 12806 ], "disallowed_STD3_mapped", [ 40, 4361, 41 ] ], [ [ 12807, 12807 ], "disallowed_STD3_mapped", [ 40, 4363, 41 ] ], [ [ 12808, 12808 ], "disallowed_STD3_mapped", [ 40, 4364, 41 ] ], [ [ 12809, 12809 ], "disallowed_STD3_mapped", [ 40, 4366, 41 ] ], [ [ 12810, 12810 ], "disallowed_STD3_mapped", [ 40, 4367, 41 ] ], [ [ 12811, 12811 ], "disallowed_STD3_mapped", [ 40, 4368, 41 ] ], [ [ 12812, 12812 ], "disallowed_STD3_mapped", [ 40, 4369, 41 ] ], [ [ 12813, 12813 ], "disallowed_STD3_mapped", [ 40, 4370, 41 ] ], [ [ 12814, 12814 ], "disallowed_STD3_mapped", [ 40, 44032, 41 ] ], [ [ 12815, 12815 ], "disallowed_STD3_mapped", [ 40, 45208, 41 ] ], [ [ 12816, 12816 ], "disallowed_STD3_mapped", [ 40, 45796, 41 ] ], [ [ 12817, 12817 ], "disallowed_STD3_mapped", [ 40, 46972, 41 ] ], [ [ 12818, 12818 ], "disallowed_STD3_mapped", [ 40, 47560, 41 ] ], [ [ 12819, 12819 ], "disallowed_STD3_mapped", [ 40, 48148, 41 ] ], [ [ 12820, 12820 ], "disallowed_STD3_mapped", [ 40, 49324, 41 ] ], [ [ 12821, 12821 ], "disallowed_STD3_mapped", [ 40, 50500, 41 ] ], [ [ 12822, 12822 ], "disallowed_STD3_mapped", [ 40, 51088, 41 ] ], [ [ 12823, 12823 ], "disallowed_STD3_mapped", [ 40, 52264, 41 ] ], [ [ 12824, 12824 ], "disallowed_STD3_mapped", [ 40, 52852, 41 ] ], [ [ 12825, 12825 ], "disallowed_STD3_mapped", [ 40, 53440, 41 ] ], [ [ 12826, 12826 ], "disallowed_STD3_mapped", [ 40, 54028, 41 ] ], [ [ 12827, 12827 ], "disallowed_STD3_mapped", [ 40, 54616, 41 ] ], [ [ 12828, 12828 ], "disallowed_STD3_mapped", [ 40, 51452, 41 ] ], [ [ 12829, 12829 ], "disallowed_STD3_mapped", [ 40, 50724, 51204, 41 ] ], [ [ 12830, 12830 ], "disallowed_STD3_mapped", [ 40, 50724, 54980, 41 ] ], [ [ 12831, 12831 ], "disallowed" ], [ [ 12832, 12832 ], "disallowed_STD3_mapped", [ 40, 19968, 41 ] ], [ [ 12833, 12833 ], "disallowed_STD3_mapped", [ 40, 20108, 41 ] ], [ [ 12834, 12834 ], "disallowed_STD3_mapped", [ 40, 19977, 41 ] ], [ [ 12835, 12835 ], "disallowed_STD3_mapped", [ 40, 22235, 41 ] ], [ [ 12836, 12836 ], "disallowed_STD3_mapped", [ 40, 20116, 41 ] ], [ [ 12837, 12837 ], "disallowed_STD3_mapped", [ 40, 20845, 41 ] ], [ [ 12838, 12838 ], "disallowed_STD3_mapped", [ 40, 19971, 41 ] ], [ [ 12839, 12839 ], "disallowed_STD3_mapped", [ 40, 20843, 41 ] ], [ [ 12840, 12840 ], "disallowed_STD3_mapped", [ 40, 20061, 41 ] ], [ [ 12841, 12841 ], "disallowed_STD3_mapped", [ 40, 21313, 41 ] ], [ [ 12842, 12842 ], "disallowed_STD3_mapped", [ 40, 26376, 41 ] ], [ [ 12843, 12843 ], "disallowed_STD3_mapped", [ 40, 28779, 41 ] ], [ [ 12844, 12844 ], "disallowed_STD3_mapped", [ 40, 27700, 41 ] ], [ [ 12845, 12845 ], "disallowed_STD3_mapped", [ 40, 26408, 41 ] ], [ [ 12846, 12846 ], "disallowed_STD3_mapped", [ 40, 37329, 41 ] ], [ [ 12847, 12847 ], "disallowed_STD3_mapped", [ 40, 22303, 41 ] ], [ [ 12848, 12848 ], "disallowed_STD3_mapped", [ 40, 26085, 41 ] ], [ [ 12849, 12849 ], "disallowed_STD3_mapped", [ 40, 26666, 41 ] ], [ [ 12850, 12850 ], "disallowed_STD3_mapped", [ 40, 26377, 41 ] ], [ [ 12851, 12851 ], "disallowed_STD3_mapped", [ 40, 31038, 41 ] ], [ [ 12852, 12852 ], "disallowed_STD3_mapped", [ 40, 21517, 41 ] ], [ [ 12853, 12853 ], "disallowed_STD3_mapped", [ 40, 29305, 41 ] ], [ [ 12854, 12854 ], "disallowed_STD3_mapped", [ 40, 36001, 41 ] ], [ [ 12855, 12855 ], "disallowed_STD3_mapped", [ 40, 31069, 41 ] ], [ [ 12856, 12856 ], "disallowed_STD3_mapped", [ 40, 21172, 41 ] ], [ [ 12857, 12857 ], "disallowed_STD3_mapped", [ 40, 20195, 41 ] ], [ [ 12858, 12858 ], "disallowed_STD3_mapped", [ 40, 21628, 41 ] ], [ [ 12859, 12859 ], "disallowed_STD3_mapped", [ 40, 23398, 41 ] ], [ [ 12860, 12860 ], "disallowed_STD3_mapped", [ 40, 30435, 41 ] ], [ [ 12861, 12861 ], "disallowed_STD3_mapped", [ 40, 20225, 41 ] ], [ [ 12862, 12862 ], "disallowed_STD3_mapped", [ 40, 36039, 41 ] ], [ [ 12863, 12863 ], "disallowed_STD3_mapped", [ 40, 21332, 41 ] ], [ [ 12864, 12864 ], "disallowed_STD3_mapped", [ 40, 31085, 41 ] ], [ [ 12865, 12865 ], "disallowed_STD3_mapped", [ 40, 20241, 41 ] ], [ [ 12866, 12866 ], "disallowed_STD3_mapped", [ 40, 33258, 41 ] ], [ [ 12867, 12867 ], "disallowed_STD3_mapped", [ 40, 33267, 41 ] ], [ [ 12868, 12868 ], "mapped", [ 21839 ] ], [ [ 12869, 12869 ], "mapped", [ 24188 ] ], [ [ 12870, 12870 ], "mapped", [ 25991 ] ], [ [ 12871, 12871 ], "mapped", [ 31631 ] ], [ [ 12872, 12879 ], "valid", [ ], "NV8" ], [ [ 12880, 12880 ], "mapped", [ 112, 116, 101 ] ], [ [ 12881, 12881 ], "mapped", [ 50, 49 ] ], [ [ 12882, 12882 ], "mapped", [ 50, 50 ] ], [ [ 12883, 12883 ], "mapped", [ 50, 51 ] ], [ [ 12884, 12884 ], "mapped", [ 50, 52 ] ], [ [ 12885, 12885 ], "mapped", [ 50, 53 ] ], [ [ 12886, 12886 ], "mapped", [ 50, 54 ] ], [ [ 12887, 12887 ], "mapped", [ 50, 55 ] ], [ [ 12888, 12888 ], "mapped", [ 50, 56 ] ], [ [ 12889, 12889 ], "mapped", [ 50, 57 ] ], [ [ 12890, 12890 ], "mapped", [ 51, 48 ] ], [ [ 12891, 12891 ], "mapped", [ 51, 49 ] ], [ [ 12892, 12892 ], "mapped", [ 51, 50 ] ], [ [ 12893, 12893 ], "mapped", [ 51, 51 ] ], [ [ 12894, 12894 ], "mapped", [ 51, 52 ] ], [ [ 12895, 12895 ], "mapped", [ 51, 53 ] ], [ [ 12896, 12896 ], "mapped", [ 4352 ] ], [ [ 12897, 12897 ], "mapped", [ 4354 ] ], [ [ 12898, 12898 ], "mapped", [ 4355 ] ], [ [ 12899, 12899 ], "mapped", [ 4357 ] ], [ [ 12900, 12900 ], "mapped", [ 4358 ] ], [ [ 12901, 12901 ], "mapped", [ 4359 ] ], [ [ 12902, 12902 ], "mapped", [ 4361 ] ], [ [ 12903, 12903 ], "mapped", [ 4363 ] ], [ [ 12904, 12904 ], "mapped", [ 4364 ] ], [ [ 12905, 12905 ], "mapped", [ 4366 ] ], [ [ 12906, 12906 ], "mapped", [ 4367 ] ], [ [ 12907, 12907 ], "mapped", [ 4368 ] ], [ [ 12908, 12908 ], "mapped", [ 4369 ] ], [ [ 12909, 12909 ], "mapped", [ 4370 ] ], [ [ 12910, 12910 ], "mapped", [ 44032 ] ], [ [ 12911, 12911 ], "mapped", [ 45208 ] ], [ [ 12912, 12912 ], "mapped", [ 45796 ] ], [ [ 12913, 12913 ], "mapped", [ 46972 ] ], [ [ 12914, 12914 ], "mapped", [ 47560 ] ], [ [ 12915, 12915 ], "mapped", [ 48148 ] ], [ [ 12916, 12916 ], "mapped", [ 49324 ] ], [ [ 12917, 12917 ], "mapped", [ 50500 ] ], [ [ 12918, 12918 ], "mapped", [ 51088 ] ], [ [ 12919, 12919 ], "mapped", [ 52264 ] ], [ [ 12920, 12920 ], "mapped", [ 52852 ] ], [ [ 12921, 12921 ], "mapped", [ 53440 ] ], [ [ 12922, 12922 ], "mapped", [ 54028 ] ], [ [ 12923, 12923 ], "mapped", [ 54616 ] ], [ [ 12924, 12924 ], "mapped", [ 52280, 44256 ] ], [ [ 12925, 12925 ], "mapped", [ 51452, 51032 ] ], [ [ 12926, 12926 ], "mapped", [ 50864 ] ], [ [ 12927, 12927 ], "valid", [ ], "NV8" ], [ [ 12928, 12928 ], "mapped", [ 19968 ] ], [ [ 12929, 12929 ], "mapped", [ 20108 ] ], [ [ 12930, 12930 ], "mapped", [ 19977 ] ], [ [ 12931, 12931 ], "mapped", [ 22235 ] ], [ [ 12932, 12932 ], "mapped", [ 20116 ] ], [ [ 12933, 12933 ], "mapped", [ 20845 ] ], [ [ 12934, 12934 ], "mapped", [ 19971 ] ], [ [ 12935, 12935 ], "mapped", [ 20843 ] ], [ [ 12936, 12936 ], "mapped", [ 20061 ] ], [ [ 12937, 12937 ], "mapped", [ 21313 ] ], [ [ 12938, 12938 ], "mapped", [ 26376 ] ], [ [ 12939, 12939 ], "mapped", [ 28779 ] ], [ [ 12940, 12940 ], "mapped", [ 27700 ] ], [ [ 12941, 12941 ], "mapped", [ 26408 ] ], [ [ 12942, 12942 ], "mapped", [ 37329 ] ], [ [ 12943, 12943 ], "mapped", [ 22303 ] ], [ [ 12944, 12944 ], "mapped", [ 26085 ] ], [ [ 12945, 12945 ], "mapped", [ 26666 ] ], [ [ 12946, 12946 ], "mapped", [ 26377 ] ], [ [ 12947, 12947 ], "mapped", [ 31038 ] ], [ [ 12948, 12948 ], "mapped", [ 21517 ] ], [ [ 12949, 12949 ], "mapped", [ 29305 ] ], [ [ 12950, 12950 ], "mapped", [ 36001 ] ], [ [ 12951, 12951 ], "mapped", [ 31069 ] ], [ [ 12952, 12952 ], "mapped", [ 21172 ] ], [ [ 12953, 12953 ], "mapped", [ 31192 ] ], [ [ 12954, 12954 ], "mapped", [ 30007 ] ], [ [ 12955, 12955 ], "mapped", [ 22899 ] ], [ [ 12956, 12956 ], "mapped", [ 36969 ] ], [ [ 12957, 12957 ], "mapped", [ 20778 ] ], [ [ 12958, 12958 ], "mapped", [ 21360 ] ], [ [ 12959, 12959 ], "mapped", [ 27880 ] ], [ [ 12960, 12960 ], "mapped", [ 38917 ] ], [ [ 12961, 12961 ], "mapped", [ 20241 ] ], [ [ 12962, 12962 ], "mapped", [ 20889 ] ], [ [ 12963, 12963 ], "mapped", [ 27491 ] ], [ [ 12964, 12964 ], "mapped", [ 19978 ] ], [ [ 12965, 12965 ], "mapped", [ 20013 ] ], [ [ 12966, 12966 ], "mapped", [ 19979 ] ], [ [ 12967, 12967 ], "mapped", [ 24038 ] ], [ [ 12968, 12968 ], "mapped", [ 21491 ] ], [ [ 12969, 12969 ], "mapped", [ 21307 ] ], [ [ 12970, 12970 ], "mapped", [ 23447 ] ], [ [ 12971, 12971 ], "mapped", [ 23398 ] ], [ [ 12972, 12972 ], "mapped", [ 30435 ] ], [ [ 12973, 12973 ], "mapped", [ 20225 ] ], [ [ 12974, 12974 ], "mapped", [ 36039 ] ], [ [ 12975, 12975 ], "mapped", [ 21332 ] ], [ [ 12976, 12976 ], "mapped", [ 22812 ] ], [ [ 12977, 12977 ], "mapped", [ 51, 54 ] ], [ [ 12978, 12978 ], "mapped", [ 51, 55 ] ], [ [ 12979, 12979 ], "mapped", [ 51, 56 ] ], [ [ 12980, 12980 ], "mapped", [ 51, 57 ] ], [ [ 12981, 12981 ], "mapped", [ 52, 48 ] ], [ [ 12982, 12982 ], "mapped", [ 52, 49 ] ], [ [ 12983, 12983 ], "mapped", [ 52, 50 ] ], [ [ 12984, 12984 ], "mapped", [ 52, 51 ] ], [ [ 12985, 12985 ], "mapped", [ 52, 52 ] ], [ [ 12986, 12986 ], "mapped", [ 52, 53 ] ], [ [ 12987, 12987 ], "mapped", [ 52, 54 ] ], [ [ 12988, 12988 ], "mapped", [ 52, 55 ] ], [ [ 12989, 12989 ], "mapped", [ 52, 56 ] ], [ [ 12990, 12990 ], "mapped", [ 52, 57 ] ], [ [ 12991, 12991 ], "mapped", [ 53, 48 ] ], [ [ 12992, 12992 ], "mapped", [ 49, 26376 ] ], [ [ 12993, 12993 ], "mapped", [ 50, 26376 ] ], [ [ 12994, 12994 ], "mapped", [ 51, 26376 ] ], [ [ 12995, 12995 ], "mapped", [ 52, 26376 ] ], [ [ 12996, 12996 ], "mapped", [ 53, 26376 ] ], [ [ 12997, 12997 ], "mapped", [ 54, 26376 ] ], [ [ 12998, 12998 ], "mapped", [ 55, 26376 ] ], [ [ 12999, 12999 ], "mapped", [ 56, 26376 ] ], [ [ 13000, 13000 ], "mapped", [ 57, 26376 ] ], [ [ 13001, 13001 ], "mapped", [ 49, 48, 26376 ] ], [ [ 13002, 13002 ], "mapped", [ 49, 49, 26376 ] ], [ [ 13003, 13003 ], "mapped", [ 49, 50, 26376 ] ], [ [ 13004, 13004 ], "mapped", [ 104, 103 ] ], [ [ 13005, 13005 ], "mapped", [ 101, 114, 103 ] ], [ [ 13006, 13006 ], "mapped", [ 101, 118 ] ], [ [ 13007, 13007 ], "mapped", [ 108, 116, 100 ] ], [ [ 13008, 13008 ], "mapped", [ 12450 ] ], [ [ 13009, 13009 ], "mapped", [ 12452 ] ], [ [ 13010, 13010 ], "mapped", [ 12454 ] ], [ [ 13011, 13011 ], "mapped", [ 12456 ] ], [ [ 13012, 13012 ], "mapped", [ 12458 ] ], [ [ 13013, 13013 ], "mapped", [ 12459 ] ], [ [ 13014, 13014 ], "mapped", [ 12461 ] ], [ [ 13015, 13015 ], "mapped", [ 12463 ] ], [ [ 13016, 13016 ], "mapped", [ 12465 ] ], [ [ 13017, 13017 ], "mapped", [ 12467 ] ], [ [ 13018, 13018 ], "mapped", [ 12469 ] ], [ [ 13019, 13019 ], "mapped", [ 12471 ] ], [ [ 13020, 13020 ], "mapped", [ 12473 ] ], [ [ 13021, 13021 ], "mapped", [ 12475 ] ], [ [ 13022, 13022 ], "mapped", [ 12477 ] ], [ [ 13023, 13023 ], "mapped", [ 12479 ] ], [ [ 13024, 13024 ], "mapped", [ 12481 ] ], [ [ 13025, 13025 ], "mapped", [ 12484 ] ], [ [ 13026, 13026 ], "mapped", [ 12486 ] ], [ [ 13027, 13027 ], "mapped", [ 12488 ] ], [ [ 13028, 13028 ], "mapped", [ 12490 ] ], [ [ 13029, 13029 ], "mapped", [ 12491 ] ], [ [ 13030, 13030 ], "mapped", [ 12492 ] ], [ [ 13031, 13031 ], "mapped", [ 12493 ] ], [ [ 13032, 13032 ], "mapped", [ 12494 ] ], [ [ 13033, 13033 ], "mapped", [ 12495 ] ], [ [ 13034, 13034 ], "mapped", [ 12498 ] ], [ [ 13035, 13035 ], "mapped", [ 12501 ] ], [ [ 13036, 13036 ], "mapped", [ 12504 ] ], [ [ 13037, 13037 ], "mapped", [ 12507 ] ], [ [ 13038, 13038 ], "mapped", [ 12510 ] ], [ [ 13039, 13039 ], "mapped", [ 12511 ] ], [ [ 13040, 13040 ], "mapped", [ 12512 ] ], [ [ 13041, 13041 ], "mapped", [ 12513 ] ], [ [ 13042, 13042 ], "mapped", [ 12514 ] ], [ [ 13043, 13043 ], "mapped", [ 12516 ] ], [ [ 13044, 13044 ], "mapped", [ 12518 ] ], [ [ 13045, 13045 ], "mapped", [ 12520 ] ], [ [ 13046, 13046 ], "mapped", [ 12521 ] ], [ [ 13047, 13047 ], "mapped", [ 12522 ] ], [ [ 13048, 13048 ], "mapped", [ 12523 ] ], [ [ 13049, 13049 ], "mapped", [ 12524 ] ], [ [ 13050, 13050 ], "mapped", [ 12525 ] ], [ [ 13051, 13051 ], "mapped", [ 12527 ] ], [ [ 13052, 13052 ], "mapped", [ 12528 ] ], [ [ 13053, 13053 ], "mapped", [ 12529 ] ], [ [ 13054, 13054 ], "mapped", [ 12530 ] ], [ [ 13055, 13055 ], "disallowed" ], [ [ 13056, 13056 ], "mapped", [ 12450, 12497, 12540, 12488 ] ], [ [ 13057, 13057 ], "mapped", [ 12450, 12523, 12501, 12449 ] ], [ [ 13058, 13058 ], "mapped", [ 12450, 12531, 12506, 12450 ] ], [ [ 13059, 13059 ], "mapped", [ 12450, 12540, 12523 ] ], [ [ 13060, 13060 ], "mapped", [ 12452, 12491, 12531, 12464 ] ], [ [ 13061, 13061 ], "mapped", [ 12452, 12531, 12481 ] ], [ [ 13062, 13062 ], "mapped", [ 12454, 12457, 12531 ] ], [ [ 13063, 13063 ], "mapped", [ 12456, 12473, 12463, 12540, 12489 ] ], [ [ 13064, 13064 ], "mapped", [ 12456, 12540, 12459, 12540 ] ], [ [ 13065, 13065 ], "mapped", [ 12458, 12531, 12473 ] ], [ [ 13066, 13066 ], "mapped", [ 12458, 12540, 12512 ] ], [ [ 13067, 13067 ], "mapped", [ 12459, 12452, 12522 ] ], [ [ 13068, 13068 ], "mapped", [ 12459, 12521, 12483, 12488 ] ], [ [ 13069, 13069 ], "mapped", [ 12459, 12525, 12522, 12540 ] ], [ [ 13070, 13070 ], "mapped", [ 12460, 12525, 12531 ] ], [ [ 13071, 13071 ], "mapped", [ 12460, 12531, 12510 ] ], [ [ 13072, 13072 ], "mapped", [ 12462, 12460 ] ], [ [ 13073, 13073 ], "mapped", [ 12462, 12491, 12540 ] ], [ [ 13074, 13074 ], "mapped", [ 12461, 12517, 12522, 12540 ] ], [ [ 13075, 13075 ], "mapped", [ 12462, 12523, 12480, 12540 ] ], [ [ 13076, 13076 ], "mapped", [ 12461, 12525 ] ], [ [ 13077, 13077 ], "mapped", [ 12461, 12525, 12464, 12521, 12512 ] ], [ [ 13078, 13078 ], "mapped", [ 12461, 12525, 12513, 12540, 12488, 12523 ] ], [ [ 13079, 13079 ], "mapped", [ 12461, 12525, 12527, 12483, 12488 ] ], [ [ 13080, 13080 ], "mapped", [ 12464, 12521, 12512 ] ], [ [ 13081, 13081 ], "mapped", [ 12464, 12521, 12512, 12488, 12531 ] ], [ [ 13082, 13082 ], "mapped", [ 12463, 12523, 12476, 12452, 12525 ] ], [ [ 13083, 13083 ], "mapped", [ 12463, 12525, 12540, 12493 ] ], [ [ 13084, 13084 ], "mapped", [ 12465, 12540, 12473 ] ], [ [ 13085, 13085 ], "mapped", [ 12467, 12523, 12490 ] ], [ [ 13086, 13086 ], "mapped", [ 12467, 12540, 12509 ] ], [ [ 13087, 13087 ], "mapped", [ 12469, 12452, 12463, 12523 ] ], [ [ 13088, 13088 ], "mapped", [ 12469, 12531, 12481, 12540, 12512 ] ], [ [ 13089, 13089 ], "mapped", [ 12471, 12522, 12531, 12464 ] ], [ [ 13090, 13090 ], "mapped", [ 12475, 12531, 12481 ] ], [ [ 13091, 13091 ], "mapped", [ 12475, 12531, 12488 ] ], [ [ 13092, 13092 ], "mapped", [ 12480, 12540, 12473 ] ], [ [ 13093, 13093 ], "mapped", [ 12487, 12471 ] ], [ [ 13094, 13094 ], "mapped", [ 12489, 12523 ] ], [ [ 13095, 13095 ], "mapped", [ 12488, 12531 ] ], [ [ 13096, 13096 ], "mapped", [ 12490, 12494 ] ], [ [ 13097, 13097 ], "mapped", [ 12494, 12483, 12488 ] ], [ [ 13098, 13098 ], "mapped", [ 12495, 12452, 12484 ] ], [ [ 13099, 13099 ], "mapped", [ 12497, 12540, 12475, 12531, 12488 ] ], [ [ 13100, 13100 ], "mapped", [ 12497, 12540, 12484 ] ], [ [ 13101, 13101 ], "mapped", [ 12496, 12540, 12524, 12523 ] ], [ [ 13102, 13102 ], "mapped", [ 12500, 12450, 12473, 12488, 12523 ] ], [ [ 13103, 13103 ], "mapped", [ 12500, 12463, 12523 ] ], [ [ 13104, 13104 ], "mapped", [ 12500, 12467 ] ], [ [ 13105, 13105 ], "mapped", [ 12499, 12523 ] ], [ [ 13106, 13106 ], "mapped", [ 12501, 12449, 12521, 12483, 12489 ] ], [ [ 13107, 13107 ], "mapped", [ 12501, 12451, 12540, 12488 ] ], [ [ 13108, 13108 ], "mapped", [ 12502, 12483, 12471, 12455, 12523 ] ], [ [ 13109, 13109 ], "mapped", [ 12501, 12521, 12531 ] ], [ [ 13110, 13110 ], "mapped", [ 12504, 12463, 12479, 12540, 12523 ] ], [ [ 13111, 13111 ], "mapped", [ 12506, 12477 ] ], [ [ 13112, 13112 ], "mapped", [ 12506, 12491, 12498 ] ], [ [ 13113, 13113 ], "mapped", [ 12504, 12523, 12484 ] ], [ [ 13114, 13114 ], "mapped", [ 12506, 12531, 12473 ] ], [ [ 13115, 13115 ], "mapped", [ 12506, 12540, 12472 ] ], [ [ 13116, 13116 ], "mapped", [ 12505, 12540, 12479 ] ], [ [ 13117, 13117 ], "mapped", [ 12509, 12452, 12531, 12488 ] ], [ [ 13118, 13118 ], "mapped", [ 12508, 12523, 12488 ] ], [ [ 13119, 13119 ], "mapped", [ 12507, 12531 ] ], [ [ 13120, 13120 ], "mapped", [ 12509, 12531, 12489 ] ], [ [ 13121, 13121 ], "mapped", [ 12507, 12540, 12523 ] ], [ [ 13122, 13122 ], "mapped", [ 12507, 12540, 12531 ] ], [ [ 13123, 13123 ], "mapped", [ 12510, 12452, 12463, 12525 ] ], [ [ 13124, 13124 ], "mapped", [ 12510, 12452, 12523 ] ], [ [ 13125, 13125 ], "mapped", [ 12510, 12483, 12495 ] ], [ [ 13126, 13126 ], "mapped", [ 12510, 12523, 12463 ] ], [ [ 13127, 13127 ], "mapped", [ 12510, 12531, 12471, 12519, 12531 ] ], [ [ 13128, 13128 ], "mapped", [ 12511, 12463, 12525, 12531 ] ], [ [ 13129, 13129 ], "mapped", [ 12511, 12522 ] ], [ [ 13130, 13130 ], "mapped", [ 12511, 12522, 12496, 12540, 12523 ] ], [ [ 13131, 13131 ], "mapped", [ 12513, 12460 ] ], [ [ 13132, 13132 ], "mapped", [ 12513, 12460, 12488, 12531 ] ], [ [ 13133, 13133 ], "mapped", [ 12513, 12540, 12488, 12523 ] ], [ [ 13134, 13134 ], "mapped", [ 12516, 12540, 12489 ] ], [ [ 13135, 13135 ], "mapped", [ 12516, 12540, 12523 ] ], [ [ 13136, 13136 ], "mapped", [ 12518, 12450, 12531 ] ], [ [ 13137, 13137 ], "mapped", [ 12522, 12483, 12488, 12523 ] ], [ [ 13138, 13138 ], "mapped", [ 12522, 12521 ] ], [ [ 13139, 13139 ], "mapped", [ 12523, 12500, 12540 ] ], [ [ 13140, 13140 ], "mapped", [ 12523, 12540, 12502, 12523 ] ], [ [ 13141, 13141 ], "mapped", [ 12524, 12512 ] ], [ [ 13142, 13142 ], "mapped", [ 12524, 12531, 12488, 12466, 12531 ] ], [ [ 13143, 13143 ], "mapped", [ 12527, 12483, 12488 ] ], [ [ 13144, 13144 ], "mapped", [ 48, 28857 ] ], [ [ 13145, 13145 ], "mapped", [ 49, 28857 ] ], [ [ 13146, 13146 ], "mapped", [ 50, 28857 ] ], [ [ 13147, 13147 ], "mapped", [ 51, 28857 ] ], [ [ 13148, 13148 ], "mapped", [ 52, 28857 ] ], [ [ 13149, 13149 ], "mapped", [ 53, 28857 ] ], [ [ 13150, 13150 ], "mapped", [ 54, 28857 ] ], [ [ 13151, 13151 ], "mapped", [ 55, 28857 ] ], [ [ 13152, 13152 ], "mapped", [ 56, 28857 ] ], [ [ 13153, 13153 ], "mapped", [ 57, 28857 ] ], [ [ 13154, 13154 ], "mapped", [ 49, 48, 28857 ] ], [ [ 13155, 13155 ], "mapped", [ 49, 49, 28857 ] ], [ [ 13156, 13156 ], "mapped", [ 49, 50, 28857 ] ], [ [ 13157, 13157 ], "mapped", [ 49, 51, 28857 ] ], [ [ 13158, 13158 ], "mapped", [ 49, 52, 28857 ] ], [ [ 13159, 13159 ], "mapped", [ 49, 53, 28857 ] ], [ [ 13160, 13160 ], "mapped", [ 49, 54, 28857 ] ], [ [ 13161, 13161 ], "mapped", [ 49, 55, 28857 ] ], [ [ 13162, 13162 ], "mapped", [ 49, 56, 28857 ] ], [ [ 13163, 13163 ], "mapped", [ 49, 57, 28857 ] ], [ [ 13164, 13164 ], "mapped", [ 50, 48, 28857 ] ], [ [ 13165, 13165 ], "mapped", [ 50, 49, 28857 ] ], [ [ 13166, 13166 ], "mapped", [ 50, 50, 28857 ] ], [ [ 13167, 13167 ], "mapped", [ 50, 51, 28857 ] ], [ [ 13168, 13168 ], "mapped", [ 50, 52, 28857 ] ], [ [ 13169, 13169 ], "mapped", [ 104, 112, 97 ] ], [ [ 13170, 13170 ], "mapped", [ 100, 97 ] ], [ [ 13171, 13171 ], "mapped", [ 97, 117 ] ], [ [ 13172, 13172 ], "mapped", [ 98, 97, 114 ] ], [ [ 13173, 13173 ], "mapped", [ 111, 118 ] ], [ [ 13174, 13174 ], "mapped", [ 112, 99 ] ], [ [ 13175, 13175 ], "mapped", [ 100, 109 ] ], [ [ 13176, 13176 ], "mapped", [ 100, 109, 50 ] ], [ [ 13177, 13177 ], "mapped", [ 100, 109, 51 ] ], [ [ 13178, 13178 ], "mapped", [ 105, 117 ] ], [ [ 13179, 13179 ], "mapped", [ 24179, 25104 ] ], [ [ 13180, 13180 ], "mapped", [ 26157, 21644 ] ], [ [ 13181, 13181 ], "mapped", [ 22823, 27491 ] ], [ [ 13182, 13182 ], "mapped", [ 26126, 27835 ] ], [ [ 13183, 13183 ], "mapped", [ 26666, 24335, 20250, 31038 ] ], [ [ 13184, 13184 ], "mapped", [ 112, 97 ] ], [ [ 13185, 13185 ], "mapped", [ 110, 97 ] ], [ [ 13186, 13186 ], "mapped", [ 956, 97 ] ], [ [ 13187, 13187 ], "mapped", [ 109, 97 ] ], [ [ 13188, 13188 ], "mapped", [ 107, 97 ] ], [ [ 13189, 13189 ], "mapped", [ 107, 98 ] ], [ [ 13190, 13190 ], "mapped", [ 109, 98 ] ], [ [ 13191, 13191 ], "mapped", [ 103, 98 ] ], [ [ 13192, 13192 ], "mapped", [ 99, 97, 108 ] ], [ [ 13193, 13193 ], "mapped", [ 107, 99, 97, 108 ] ], [ [ 13194, 13194 ], "mapped", [ 112, 102 ] ], [ [ 13195, 13195 ], "mapped", [ 110, 102 ] ], [ [ 13196, 13196 ], "mapped", [ 956, 102 ] ], [ [ 13197, 13197 ], "mapped", [ 956, 103 ] ], [ [ 13198, 13198 ], "mapped", [ 109, 103 ] ], [ [ 13199, 13199 ], "mapped", [ 107, 103 ] ], [ [ 13200, 13200 ], "mapped", [ 104, 122 ] ], [ [ 13201, 13201 ], "mapped", [ 107, 104, 122 ] ], [ [ 13202, 13202 ], "mapped", [ 109, 104, 122 ] ], [ [ 13203, 13203 ], "mapped", [ 103, 104, 122 ] ], [ [ 13204, 13204 ], "mapped", [ 116, 104, 122 ] ], [ [ 13205, 13205 ], "mapped", [ 956, 108 ] ], [ [ 13206, 13206 ], "mapped", [ 109, 108 ] ], [ [ 13207, 13207 ], "mapped", [ 100, 108 ] ], [ [ 13208, 13208 ], "mapped", [ 107, 108 ] ], [ [ 13209, 13209 ], "mapped", [ 102, 109 ] ], [ [ 13210, 13210 ], "mapped", [ 110, 109 ] ], [ [ 13211, 13211 ], "mapped", [ 956, 109 ] ], [ [ 13212, 13212 ], "mapped", [ 109, 109 ] ], [ [ 13213, 13213 ], "mapped", [ 99, 109 ] ], [ [ 13214, 13214 ], "mapped", [ 107, 109 ] ], [ [ 13215, 13215 ], "mapped", [ 109, 109, 50 ] ], [ [ 13216, 13216 ], "mapped", [ 99, 109, 50 ] ], [ [ 13217, 13217 ], "mapped", [ 109, 50 ] ], [ [ 13218, 13218 ], "mapped", [ 107, 109, 50 ] ], [ [ 13219, 13219 ], "mapped", [ 109, 109, 51 ] ], [ [ 13220, 13220 ], "mapped", [ 99, 109, 51 ] ], [ [ 13221, 13221 ], "mapped", [ 109, 51 ] ], [ [ 13222, 13222 ], "mapped", [ 107, 109, 51 ] ], [ [ 13223, 13223 ], "mapped", [ 109, 8725, 115 ] ], [ [ 13224, 13224 ], "mapped", [ 109, 8725, 115, 50 ] ], [ [ 13225, 13225 ], "mapped", [ 112, 97 ] ], [ [ 13226, 13226 ], "mapped", [ 107, 112, 97 ] ], [ [ 13227, 13227 ], "mapped", [ 109, 112, 97 ] ], [ [ 13228, 13228 ], "mapped", [ 103, 112, 97 ] ], [ [ 13229, 13229 ], "mapped", [ 114, 97, 100 ] ], [ [ 13230, 13230 ], "mapped", [ 114, 97, 100, 8725, 115 ] ], [ [ 13231, 13231 ], "mapped", [ 114, 97, 100, 8725, 115, 50 ] ], [ [ 13232, 13232 ], "mapped", [ 112, 115 ] ], [ [ 13233, 13233 ], "mapped", [ 110, 115 ] ], [ [ 13234, 13234 ], "mapped", [ 956, 115 ] ], [ [ 13235, 13235 ], "mapped", [ 109, 115 ] ], [ [ 13236, 13236 ], "mapped", [ 112, 118 ] ], [ [ 13237, 13237 ], "mapped", [ 110, 118 ] ], [ [ 13238, 13238 ], "mapped", [ 956, 118 ] ], [ [ 13239, 13239 ], "mapped", [ 109, 118 ] ], [ [ 13240, 13240 ], "mapped", [ 107, 118 ] ], [ [ 13241, 13241 ], "mapped", [ 109, 118 ] ], [ [ 13242, 13242 ], "mapped", [ 112, 119 ] ], [ [ 13243, 13243 ], "mapped", [ 110, 119 ] ], [ [ 13244, 13244 ], "mapped", [ 956, 119 ] ], [ [ 13245, 13245 ], "mapped", [ 109, 119 ] ], [ [ 13246, 13246 ], "mapped", [ 107, 119 ] ], [ [ 13247, 13247 ], "mapped", [ 109, 119 ] ], [ [ 13248, 13248 ], "mapped", [ 107, 969 ] ], [ [ 13249, 13249 ], "mapped", [ 109, 969 ] ], [ [ 13250, 13250 ], "disallowed" ], [ [ 13251, 13251 ], "mapped", [ 98, 113 ] ], [ [ 13252, 13252 ], "mapped", [ 99, 99 ] ], [ [ 13253, 13253 ], "mapped", [ 99, 100 ] ], [ [ 13254, 13254 ], "mapped", [ 99, 8725, 107, 103 ] ], [ [ 13255, 13255 ], "disallowed" ], [ [ 13256, 13256 ], "mapped", [ 100, 98 ] ], [ [ 13257, 13257 ], "mapped", [ 103, 121 ] ], [ [ 13258, 13258 ], "mapped", [ 104, 97 ] ], [ [ 13259, 13259 ], "mapped", [ 104, 112 ] ], [ [ 13260, 13260 ], "mapped", [ 105, 110 ] ], [ [ 13261, 13261 ], "mapped", [ 107, 107 ] ], [ [ 13262, 13262 ], "mapped", [ 107, 109 ] ], [ [ 13263, 13263 ], "mapped", [ 107, 116 ] ], [ [ 13264, 13264 ], "mapped", [ 108, 109 ] ], [ [ 13265, 13265 ], "mapped", [ 108, 110 ] ], [ [ 13266, 13266 ], "mapped", [ 108, 111, 103 ] ], [ [ 13267, 13267 ], "mapped", [ 108, 120 ] ], [ [ 13268, 13268 ], "mapped", [ 109, 98 ] ], [ [ 13269, 13269 ], "mapped", [ 109, 105, 108 ] ], [ [ 13270, 13270 ], "mapped", [ 109, 111, 108 ] ], [ [ 13271, 13271 ], "mapped", [ 112, 104 ] ], [ [ 13272, 13272 ], "disallowed" ], [ [ 13273, 13273 ], "mapped", [ 112, 112, 109 ] ], [ [ 13274, 13274 ], "mapped", [ 112, 114 ] ], [ [ 13275, 13275 ], "mapped", [ 115, 114 ] ], [ [ 13276, 13276 ], "mapped", [ 115, 118 ] ], [ [ 13277, 13277 ], "mapped", [ 119, 98 ] ], [ [ 13278, 13278 ], "mapped", [ 118, 8725, 109 ] ], [ [ 13279, 13279 ], "mapped", [ 97, 8725, 109 ] ], [ [ 13280, 13280 ], "mapped", [ 49, 26085 ] ], [ [ 13281, 13281 ], "mapped", [ 50, 26085 ] ], [ [ 13282, 13282 ], "mapped", [ 51, 26085 ] ], [ [ 13283, 13283 ], "mapped", [ 52, 26085 ] ], [ [ 13284, 13284 ], "mapped", [ 53, 26085 ] ], [ [ 13285, 13285 ], "mapped", [ 54, 26085 ] ], [ [ 13286, 13286 ], "mapped", [ 55, 26085 ] ], [ [ 13287, 13287 ], "mapped", [ 56, 26085 ] ], [ [ 13288, 13288 ], "mapped", [ 57, 26085 ] ], [ [ 13289, 13289 ], "mapped", [ 49, 48, 26085 ] ], [ [ 13290, 13290 ], "mapped", [ 49, 49, 26085 ] ], [ [ 13291, 13291 ], "mapped", [ 49, 50, 26085 ] ], [ [ 13292, 13292 ], "mapped", [ 49, 51, 26085 ] ], [ [ 13293, 13293 ], "mapped", [ 49, 52, 26085 ] ], [ [ 13294, 13294 ], "mapped", [ 49, 53, 26085 ] ], [ [ 13295, 13295 ], "mapped", [ 49, 54, 26085 ] ], [ [ 13296, 13296 ], "mapped", [ 49, 55, 26085 ] ], [ [ 13297, 13297 ], "mapped", [ 49, 56, 26085 ] ], [ [ 13298, 13298 ], "mapped", [ 49, 57, 26085 ] ], [ [ 13299, 13299 ], "mapped", [ 50, 48, 26085 ] ], [ [ 13300, 13300 ], "mapped", [ 50, 49, 26085 ] ], [ [ 13301, 13301 ], "mapped", [ 50, 50, 26085 ] ], [ [ 13302, 13302 ], "mapped", [ 50, 51, 26085 ] ], [ [ 13303, 13303 ], "mapped", [ 50, 52, 26085 ] ], [ [ 13304, 13304 ], "mapped", [ 50, 53, 26085 ] ], [ [ 13305, 13305 ], "mapped", [ 50, 54, 26085 ] ], [ [ 13306, 13306 ], "mapped", [ 50, 55, 26085 ] ], [ [ 13307, 13307 ], "mapped", [ 50, 56, 26085 ] ], [ [ 13308, 13308 ], "mapped", [ 50, 57, 26085 ] ], [ [ 13309, 13309 ], "mapped", [ 51, 48, 26085 ] ], [ [ 13310, 13310 ], "mapped", [ 51, 49, 26085 ] ], [ [ 13311, 13311 ], "mapped", [ 103, 97, 108 ] ], [ [ 13312, 19893 ], "valid" ], [ [ 19894, 19903 ], "disallowed" ], [ [ 19904, 19967 ], "valid", [ ], "NV8" ], [ [ 19968, 40869 ], "valid" ], [ [ 40870, 40891 ], "valid" ], [ [ 40892, 40899 ], "valid" ], [ [ 40900, 40907 ], "valid" ], [ [ 40908, 40908 ], "valid" ], [ [ 40909, 40917 ], "valid" ], [ [ 40918, 40959 ], "disallowed" ], [ [ 40960, 42124 ], "valid" ], [ [ 42125, 42127 ], "disallowed" ], [ [ 42128, 42145 ], "valid", [ ], "NV8" ], [ [ 42146, 42147 ], "valid", [ ], "NV8" ], [ [ 42148, 42163 ], "valid", [ ], "NV8" ], [ [ 42164, 42164 ], "valid", [ ], "NV8" ], [ [ 42165, 42176 ], "valid", [ ], "NV8" ], [ [ 42177, 42177 ], "valid", [ ], "NV8" ], [ [ 42178, 42180 ], "valid", [ ], "NV8" ], [ [ 42181, 42181 ], "valid", [ ], "NV8" ], [ [ 42182, 42182 ], "valid", [ ], "NV8" ], [ [ 42183, 42191 ], "disallowed" ], [ [ 42192, 42237 ], "valid" ], [ [ 42238, 42239 ], "valid", [ ], "NV8" ], [ [ 42240, 42508 ], "valid" ], [ [ 42509, 42511 ], "valid", [ ], "NV8" ], [ [ 42512, 42539 ], "valid" ], [ [ 42540, 42559 ], "disallowed" ], [ [ 42560, 42560 ], "mapped", [ 42561 ] ], [ [ 42561, 42561 ], "valid" ], [ [ 42562, 42562 ], "mapped", [ 42563 ] ], [ [ 42563, 42563 ], "valid" ], [ [ 42564, 42564 ], "mapped", [ 42565 ] ], [ [ 42565, 42565 ], "valid" ], [ [ 42566, 42566 ], "mapped", [ 42567 ] ], [ [ 42567, 42567 ], "valid" ], [ [ 42568, 42568 ], "mapped", [ 42569 ] ], [ [ 42569, 42569 ], "valid" ], [ [ 42570, 42570 ], "mapped", [ 42571 ] ], [ [ 42571, 42571 ], "valid" ], [ [ 42572, 42572 ], "mapped", [ 42573 ] ], [ [ 42573, 42573 ], "valid" ], [ [ 42574, 42574 ], "mapped", [ 42575 ] ], [ [ 42575, 42575 ], "valid" ], [ [ 42576, 42576 ], "mapped", [ 42577 ] ], [ [ 42577, 42577 ], "valid" ], [ [ 42578, 42578 ], "mapped", [ 42579 ] ], [ [ 42579, 42579 ], "valid" ], [ [ 42580, 42580 ], "mapped", [ 42581 ] ], [ [ 42581, 42581 ], "valid" ], [ [ 42582, 42582 ], "mapped", [ 42583 ] ], [ [ 42583, 42583 ], "valid" ], [ [ 42584, 42584 ], "mapped", [ 42585 ] ], [ [ 42585, 42585 ], "valid" ], [ [ 42586, 42586 ], "mapped", [ 42587 ] ], [ [ 42587, 42587 ], "valid" ], [ [ 42588, 42588 ], "mapped", [ 42589 ] ], [ [ 42589, 42589 ], "valid" ], [ [ 42590, 42590 ], "mapped", [ 42591 ] ], [ [ 42591, 42591 ], "valid" ], [ [ 42592, 42592 ], "mapped", [ 42593 ] ], [ [ 42593, 42593 ], "valid" ], [ [ 42594, 42594 ], "mapped", [ 42595 ] ], [ [ 42595, 42595 ], "valid" ], [ [ 42596, 42596 ], "mapped", [ 42597 ] ], [ [ 42597, 42597 ], "valid" ], [ [ 42598, 42598 ], "mapped", [ 42599 ] ], [ [ 42599, 42599 ], "valid" ], [ [ 42600, 42600 ], "mapped", [ 42601 ] ], [ [ 42601, 42601 ], "valid" ], [ [ 42602, 42602 ], "mapped", [ 42603 ] ], [ [ 42603, 42603 ], "valid" ], [ [ 42604, 42604 ], "mapped", [ 42605 ] ], [ [ 42605, 42607 ], "valid" ], [ [ 42608, 42611 ], "valid", [ ], "NV8" ], [ [ 42612, 42619 ], "valid" ], [ [ 42620, 42621 ], "valid" ], [ [ 42622, 42622 ], "valid", [ ], "NV8" ], [ [ 42623, 42623 ], "valid" ], [ [ 42624, 42624 ], "mapped", [ 42625 ] ], [ [ 42625, 42625 ], "valid" ], [ [ 42626, 42626 ], "mapped", [ 42627 ] ], [ [ 42627, 42627 ], "valid" ], [ [ 42628, 42628 ], "mapped", [ 42629 ] ], [ [ 42629, 42629 ], "valid" ], [ [ 42630, 42630 ], "mapped", [ 42631 ] ], [ [ 42631, 42631 ], "valid" ], [ [ 42632, 42632 ], "mapped", [ 42633 ] ], [ [ 42633, 42633 ], "valid" ], [ [ 42634, 42634 ], "mapped", [ 42635 ] ], [ [ 42635, 42635 ], "valid" ], [ [ 42636, 42636 ], "mapped", [ 42637 ] ], [ [ 42637, 42637 ], "valid" ], [ [ 42638, 42638 ], "mapped", [ 42639 ] ], [ [ 42639, 42639 ], "valid" ], [ [ 42640, 42640 ], "mapped", [ 42641 ] ], [ [ 42641, 42641 ], "valid" ], [ [ 42642, 42642 ], "mapped", [ 42643 ] ], [ [ 42643, 42643 ], "valid" ], [ [ 42644, 42644 ], "mapped", [ 42645 ] ], [ [ 42645, 42645 ], "valid" ], [ [ 42646, 42646 ], "mapped", [ 42647 ] ], [ [ 42647, 42647 ], "valid" ], [ [ 42648, 42648 ], "mapped", [ 42649 ] ], [ [ 42649, 42649 ], "valid" ], [ [ 42650, 42650 ], "mapped", [ 42651 ] ], [ [ 42651, 42651 ], "valid" ], [ [ 42652, 42652 ], "mapped", [ 1098 ] ], [ [ 42653, 42653 ], "mapped", [ 1100 ] ], [ [ 42654, 42654 ], "valid" ], [ [ 42655, 42655 ], "valid" ], [ [ 42656, 42725 ], "valid" ], [ [ 42726, 42735 ], "valid", [ ], "NV8" ], [ [ 42736, 42737 ], "valid" ], [ [ 42738, 42743 ], "valid", [ ], "NV8" ], [ [ 42744, 42751 ], "disallowed" ], [ [ 42752, 42774 ], "valid", [ ], "NV8" ], [ [ 42775, 42778 ], "valid" ], [ [ 42779, 42783 ], "valid" ], [ [ 42784, 42785 ], "valid", [ ], "NV8" ], [ [ 42786, 42786 ], "mapped", [ 42787 ] ], [ [ 42787, 42787 ], "valid" ], [ [ 42788, 42788 ], "mapped", [ 42789 ] ], [ [ 42789, 42789 ], "valid" ], [ [ 42790, 42790 ], "mapped", [ 42791 ] ], [ [ 42791, 42791 ], "valid" ], [ [ 42792, 42792 ], "mapped", [ 42793 ] ], [ [ 42793, 42793 ], "valid" ], [ [ 42794, 42794 ], "mapped", [ 42795 ] ], [ [ 42795, 42795 ], "valid" ], [ [ 42796, 42796 ], "mapped", [ 42797 ] ], [ [ 42797, 42797 ], "valid" ], [ [ 42798, 42798 ], "mapped", [ 42799 ] ], [ [ 42799, 42801 ], "valid" ], [ [ 42802, 42802 ], "mapped", [ 42803 ] ], [ [ 42803, 42803 ], "valid" ], [ [ 42804, 42804 ], "mapped", [ 42805 ] ], [ [ 42805, 42805 ], "valid" ], [ [ 42806, 42806 ], "mapped", [ 42807 ] ], [ [ 42807, 42807 ], "valid" ], [ [ 42808, 42808 ], "mapped", [ 42809 ] ], [ [ 42809, 42809 ], "valid" ], [ [ 42810, 42810 ], "mapped", [ 42811 ] ], [ [ 42811, 42811 ], "valid" ], [ [ 42812, 42812 ], "mapped", [ 42813 ] ], [ [ 42813, 42813 ], "valid" ], [ [ 42814, 42814 ], "mapped", [ 42815 ] ], [ [ 42815, 42815 ], "valid" ], [ [ 42816, 42816 ], "mapped", [ 42817 ] ], [ [ 42817, 42817 ], "valid" ], [ [ 42818, 42818 ], "mapped", [ 42819 ] ], [ [ 42819, 42819 ], "valid" ], [ [ 42820, 42820 ], "mapped", [ 42821 ] ], [ [ 42821, 42821 ], "valid" ], [ [ 42822, 42822 ], "mapped", [ 42823 ] ], [ [ 42823, 42823 ], "valid" ], [ [ 42824, 42824 ], "mapped", [ 42825 ] ], [ [ 42825, 42825 ], "valid" ], [ [ 42826, 42826 ], "mapped", [ 42827 ] ], [ [ 42827, 42827 ], "valid" ], [ [ 42828, 42828 ], "mapped", [ 42829 ] ], [ [ 42829, 42829 ], "valid" ], [ [ 42830, 42830 ], "mapped", [ 42831 ] ], [ [ 42831, 42831 ], "valid" ], [ [ 42832, 42832 ], "mapped", [ 42833 ] ], [ [ 42833, 42833 ], "valid" ], [ [ 42834, 42834 ], "mapped", [ 42835 ] ], [ [ 42835, 42835 ], "valid" ], [ [ 42836, 42836 ], "mapped", [ 42837 ] ], [ [ 42837, 42837 ], "valid" ], [ [ 42838, 42838 ], "mapped", [ 42839 ] ], [ [ 42839, 42839 ], "valid" ], [ [ 42840, 42840 ], "mapped", [ 42841 ] ], [ [ 42841, 42841 ], "valid" ], [ [ 42842, 42842 ], "mapped", [ 42843 ] ], [ [ 42843, 42843 ], "valid" ], [ [ 42844, 42844 ], "mapped", [ 42845 ] ], [ [ 42845, 42845 ], "valid" ], [ [ 42846, 42846 ], "mapped", [ 42847 ] ], [ [ 42847, 42847 ], "valid" ], [ [ 42848, 42848 ], "mapped", [ 42849 ] ], [ [ 42849, 42849 ], "valid" ], [ [ 42850, 42850 ], "mapped", [ 42851 ] ], [ [ 42851, 42851 ], "valid" ], [ [ 42852, 42852 ], "mapped", [ 42853 ] ], [ [ 42853, 42853 ], "valid" ], [ [ 42854, 42854 ], "mapped", [ 42855 ] ], [ [ 42855, 42855 ], "valid" ], [ [ 42856, 42856 ], "mapped", [ 42857 ] ], [ [ 42857, 42857 ], "valid" ], [ [ 42858, 42858 ], "mapped", [ 42859 ] ], [ [ 42859, 42859 ], "valid" ], [ [ 42860, 42860 ], "mapped", [ 42861 ] ], [ [ 42861, 42861 ], "valid" ], [ [ 42862, 42862 ], "mapped", [ 42863 ] ], [ [ 42863, 42863 ], "valid" ], [ [ 42864, 42864 ], "mapped", [ 42863 ] ], [ [ 42865, 42872 ], "valid" ], [ [ 42873, 42873 ], "mapped", [ 42874 ] ], [ [ 42874, 42874 ], "valid" ], [ [ 42875, 42875 ], "mapped", [ 42876 ] ], [ [ 42876, 42876 ], "valid" ], [ [ 42877, 42877 ], "mapped", [ 7545 ] ], [ [ 42878, 42878 ], "mapped", [ 42879 ] ], [ [ 42879, 42879 ], "valid" ], [ [ 42880, 42880 ], "mapped", [ 42881 ] ], [ [ 42881, 42881 ], "valid" ], [ [ 42882, 42882 ], "mapped", [ 42883 ] ], [ [ 42883, 42883 ], "valid" ], [ [ 42884, 42884 ], "mapped", [ 42885 ] ], [ [ 42885, 42885 ], "valid" ], [ [ 42886, 42886 ], "mapped", [ 42887 ] ], [ [ 42887, 42888 ], "valid" ], [ [ 42889, 42890 ], "valid", [ ], "NV8" ], [ [ 42891, 42891 ], "mapped", [ 42892 ] ], [ [ 42892, 42892 ], "valid" ], [ [ 42893, 42893 ], "mapped", [ 613 ] ], [ [ 42894, 42894 ], "valid" ], [ [ 42895, 42895 ], "valid" ], [ [ 42896, 42896 ], "mapped", [ 42897 ] ], [ [ 42897, 42897 ], "valid" ], [ [ 42898, 42898 ], "mapped", [ 42899 ] ], [ [ 42899, 42899 ], "valid" ], [ [ 42900, 42901 ], "valid" ], [ [ 42902, 42902 ], "mapped", [ 42903 ] ], [ [ 42903, 42903 ], "valid" ], [ [ 42904, 42904 ], "mapped", [ 42905 ] ], [ [ 42905, 42905 ], "valid" ], [ [ 42906, 42906 ], "mapped", [ 42907 ] ], [ [ 42907, 42907 ], "valid" ], [ [ 42908, 42908 ], "mapped", [ 42909 ] ], [ [ 42909, 42909 ], "valid" ], [ [ 42910, 42910 ], "mapped", [ 42911 ] ], [ [ 42911, 42911 ], "valid" ], [ [ 42912, 42912 ], "mapped", [ 42913 ] ], [ [ 42913, 42913 ], "valid" ], [ [ 42914, 42914 ], "mapped", [ 42915 ] ], [ [ 42915, 42915 ], "valid" ], [ [ 42916, 42916 ], "mapped", [ 42917 ] ], [ [ 42917, 42917 ], "valid" ], [ [ 42918, 42918 ], "mapped", [ 42919 ] ], [ [ 42919, 42919 ], "valid" ], [ [ 42920, 42920 ], "mapped", [ 42921 ] ], [ [ 42921, 42921 ], "valid" ], [ [ 42922, 42922 ], "mapped", [ 614 ] ], [ [ 42923, 42923 ], "mapped", [ 604 ] ], [ [ 42924, 42924 ], "mapped", [ 609 ] ], [ [ 42925, 42925 ], "mapped", [ 620 ] ], [ [ 42926, 42927 ], "disallowed" ], [ [ 42928, 42928 ], "mapped", [ 670 ] ], [ [ 42929, 42929 ], "mapped", [ 647 ] ], [ [ 42930, 42930 ], "mapped", [ 669 ] ], [ [ 42931, 42931 ], "mapped", [ 43859 ] ], [ [ 42932, 42932 ], "mapped", [ 42933 ] ], [ [ 42933, 42933 ], "valid" ], [ [ 42934, 42934 ], "mapped", [ 42935 ] ], [ [ 42935, 42935 ], "valid" ], [ [ 42936, 42998 ], "disallowed" ], [ [ 42999, 42999 ], "valid" ], [ [ 43000, 43000 ], "mapped", [ 295 ] ], [ [ 43001, 43001 ], "mapped", [ 339 ] ], [ [ 43002, 43002 ], "valid" ], [ [ 43003, 43007 ], "valid" ], [ [ 43008, 43047 ], "valid" ], [ [ 43048, 43051 ], "valid", [ ], "NV8" ], [ [ 43052, 43055 ], "disallowed" ], [ [ 43056, 43065 ], "valid", [ ], "NV8" ], [ [ 43066, 43071 ], "disallowed" ], [ [ 43072, 43123 ], "valid" ], [ [ 43124, 43127 ], "valid", [ ], "NV8" ], [ [ 43128, 43135 ], "disallowed" ], [ [ 43136, 43204 ], "valid" ], [ [ 43205, 43213 ], "disallowed" ], [ [ 43214, 43215 ], "valid", [ ], "NV8" ], [ [ 43216, 43225 ], "valid" ], [ [ 43226, 43231 ], "disallowed" ], [ [ 43232, 43255 ], "valid" ], [ [ 43256, 43258 ], "valid", [ ], "NV8" ], [ [ 43259, 43259 ], "valid" ], [ [ 43260, 43260 ], "valid", [ ], "NV8" ], [ [ 43261, 43261 ], "valid" ], [ [ 43262, 43263 ], "disallowed" ], [ [ 43264, 43309 ], "valid" ], [ [ 43310, 43311 ], "valid", [ ], "NV8" ], [ [ 43312, 43347 ], "valid" ], [ [ 43348, 43358 ], "disallowed" ], [ [ 43359, 43359 ], "valid", [ ], "NV8" ], [ [ 43360, 43388 ], "valid", [ ], "NV8" ], [ [ 43389, 43391 ], "disallowed" ], [ [ 43392, 43456 ], "valid" ], [ [ 43457, 43469 ], "valid", [ ], "NV8" ], [ [ 43470, 43470 ], "disallowed" ], [ [ 43471, 43481 ], "valid" ], [ [ 43482, 43485 ], "disallowed" ], [ [ 43486, 43487 ], "valid", [ ], "NV8" ], [ [ 43488, 43518 ], "valid" ], [ [ 43519, 43519 ], "disallowed" ], [ [ 43520, 43574 ], "valid" ], [ [ 43575, 43583 ], "disallowed" ], [ [ 43584, 43597 ], "valid" ], [ [ 43598, 43599 ], "disallowed" ], [ [ 43600, 43609 ], "valid" ], [ [ 43610, 43611 ], "disallowed" ], [ [ 43612, 43615 ], "valid", [ ], "NV8" ], [ [ 43616, 43638 ], "valid" ], [ [ 43639, 43641 ], "valid", [ ], "NV8" ], [ [ 43642, 43643 ], "valid" ], [ [ 43644, 43647 ], "valid" ], [ [ 43648, 43714 ], "valid" ], [ [ 43715, 43738 ], "disallowed" ], [ [ 43739, 43741 ], "valid" ], [ [ 43742, 43743 ], "valid", [ ], "NV8" ], [ [ 43744, 43759 ], "valid" ], [ [ 43760, 43761 ], "valid", [ ], "NV8" ], [ [ 43762, 43766 ], "valid" ], [ [ 43767, 43776 ], "disallowed" ], [ [ 43777, 43782 ], "valid" ], [ [ 43783, 43784 ], "disallowed" ], [ [ 43785, 43790 ], "valid" ], [ [ 43791, 43792 ], "disallowed" ], [ [ 43793, 43798 ], "valid" ], [ [ 43799, 43807 ], "disallowed" ], [ [ 43808, 43814 ], "valid" ], [ [ 43815, 43815 ], "disallowed" ], [ [ 43816, 43822 ], "valid" ], [ [ 43823, 43823 ], "disallowed" ], [ [ 43824, 43866 ], "valid" ], [ [ 43867, 43867 ], "valid", [ ], "NV8" ], [ [ 43868, 43868 ], "mapped", [ 42791 ] ], [ [ 43869, 43869 ], "mapped", [ 43831 ] ], [ [ 43870, 43870 ], "mapped", [ 619 ] ], [ [ 43871, 43871 ], "mapped", [ 43858 ] ], [ [ 43872, 43875 ], "valid" ], [ [ 43876, 43877 ], "valid" ], [ [ 43878, 43887 ], "disallowed" ], [ [ 43888, 43888 ], "mapped", [ 5024 ] ], [ [ 43889, 43889 ], "mapped", [ 5025 ] ], [ [ 43890, 43890 ], "mapped", [ 5026 ] ], [ [ 43891, 43891 ], "mapped", [ 5027 ] ], [ [ 43892, 43892 ], "mapped", [ 5028 ] ], [ [ 43893, 43893 ], "mapped", [ 5029 ] ], [ [ 43894, 43894 ], "mapped", [ 5030 ] ], [ [ 43895, 43895 ], "mapped", [ 5031 ] ], [ [ 43896, 43896 ], "mapped", [ 5032 ] ], [ [ 43897, 43897 ], "mapped", [ 5033 ] ], [ [ 43898, 43898 ], "mapped", [ 5034 ] ], [ [ 43899, 43899 ], "mapped", [ 5035 ] ], [ [ 43900, 43900 ], "mapped", [ 5036 ] ], [ [ 43901, 43901 ], "mapped", [ 5037 ] ], [ [ 43902, 43902 ], "mapped", [ 5038 ] ], [ [ 43903, 43903 ], "mapped", [ 5039 ] ], [ [ 43904, 43904 ], "mapped", [ 5040 ] ], [ [ 43905, 43905 ], "mapped", [ 5041 ] ], [ [ 43906, 43906 ], "mapped", [ 5042 ] ], [ [ 43907, 43907 ], "mapped", [ 5043 ] ], [ [ 43908, 43908 ], "mapped", [ 5044 ] ], [ [ 43909, 43909 ], "mapped", [ 5045 ] ], [ [ 43910, 43910 ], "mapped", [ 5046 ] ], [ [ 43911, 43911 ], "mapped", [ 5047 ] ], [ [ 43912, 43912 ], "mapped", [ 5048 ] ], [ [ 43913, 43913 ], "mapped", [ 5049 ] ], [ [ 43914, 43914 ], "mapped", [ 5050 ] ], [ [ 43915, 43915 ], "mapped", [ 5051 ] ], [ [ 43916, 43916 ], "mapped", [ 5052 ] ], [ [ 43917, 43917 ], "mapped", [ 5053 ] ], [ [ 43918, 43918 ], "mapped", [ 5054 ] ], [ [ 43919, 43919 ], "mapped", [ 5055 ] ], [ [ 43920, 43920 ], "mapped", [ 5056 ] ], [ [ 43921, 43921 ], "mapped", [ 5057 ] ], [ [ 43922, 43922 ], "mapped", [ 5058 ] ], [ [ 43923, 43923 ], "mapped", [ 5059 ] ], [ [ 43924, 43924 ], "mapped", [ 5060 ] ], [ [ 43925, 43925 ], "mapped", [ 5061 ] ], [ [ 43926, 43926 ], "mapped", [ 5062 ] ], [ [ 43927, 43927 ], "mapped", [ 5063 ] ], [ [ 43928, 43928 ], "mapped", [ 5064 ] ], [ [ 43929, 43929 ], "mapped", [ 5065 ] ], [ [ 43930, 43930 ], "mapped", [ 5066 ] ], [ [ 43931, 43931 ], "mapped", [ 5067 ] ], [ [ 43932, 43932 ], "mapped", [ 5068 ] ], [ [ 43933, 43933 ], "mapped", [ 5069 ] ], [ [ 43934, 43934 ], "mapped", [ 5070 ] ], [ [ 43935, 43935 ], "mapped", [ 5071 ] ], [ [ 43936, 43936 ], "mapped", [ 5072 ] ], [ [ 43937, 43937 ], "mapped", [ 5073 ] ], [ [ 43938, 43938 ], "mapped", [ 5074 ] ], [ [ 43939, 43939 ], "mapped", [ 5075 ] ], [ [ 43940, 43940 ], "mapped", [ 5076 ] ], [ [ 43941, 43941 ], "mapped", [ 5077 ] ], [ [ 43942, 43942 ], "mapped", [ 5078 ] ], [ [ 43943, 43943 ], "mapped", [ 5079 ] ], [ [ 43944, 43944 ], "mapped", [ 5080 ] ], [ [ 43945, 43945 ], "mapped", [ 5081 ] ], [ [ 43946, 43946 ], "mapped", [ 5082 ] ], [ [ 43947, 43947 ], "mapped", [ 5083 ] ], [ [ 43948, 43948 ], "mapped", [ 5084 ] ], [ [ 43949, 43949 ], "mapped", [ 5085 ] ], [ [ 43950, 43950 ], "mapped", [ 5086 ] ], [ [ 43951, 43951 ], "mapped", [ 5087 ] ], [ [ 43952, 43952 ], "mapped", [ 5088 ] ], [ [ 43953, 43953 ], "mapped", [ 5089 ] ], [ [ 43954, 43954 ], "mapped", [ 5090 ] ], [ [ 43955, 43955 ], "mapped", [ 5091 ] ], [ [ 43956, 43956 ], "mapped", [ 5092 ] ], [ [ 43957, 43957 ], "mapped", [ 5093 ] ], [ [ 43958, 43958 ], "mapped", [ 5094 ] ], [ [ 43959, 43959 ], "mapped", [ 5095 ] ], [ [ 43960, 43960 ], "mapped", [ 5096 ] ], [ [ 43961, 43961 ], "mapped", [ 5097 ] ], [ [ 43962, 43962 ], "mapped", [ 5098 ] ], [ [ 43963, 43963 ], "mapped", [ 5099 ] ], [ [ 43964, 43964 ], "mapped", [ 5100 ] ], [ [ 43965, 43965 ], "mapped", [ 5101 ] ], [ [ 43966, 43966 ], "mapped", [ 5102 ] ], [ [ 43967, 43967 ], "mapped", [ 5103 ] ], [ [ 43968, 44010 ], "valid" ], [ [ 44011, 44011 ], "valid", [ ], "NV8" ], [ [ 44012, 44013 ], "valid" ], [ [ 44014, 44015 ], "disallowed" ], [ [ 44016, 44025 ], "valid" ], [ [ 44026, 44031 ], "disallowed" ], [ [ 44032, 55203 ], "valid" ], [ [ 55204, 55215 ], "disallowed" ], [ [ 55216, 55238 ], "valid", [ ], "NV8" ], [ [ 55239, 55242 ], "disallowed" ], [ [ 55243, 55291 ], "valid", [ ], "NV8" ], [ [ 55292, 55295 ], "disallowed" ], [ [ 55296, 57343 ], "disallowed" ], [ [ 57344, 63743 ], "disallowed" ], [ [ 63744, 63744 ], "mapped", [ 35912 ] ], [ [ 63745, 63745 ], "mapped", [ 26356 ] ], [ [ 63746, 63746 ], "mapped", [ 36554 ] ], [ [ 63747, 63747 ], "mapped", [ 36040 ] ], [ [ 63748, 63748 ], "mapped", [ 28369 ] ], [ [ 63749, 63749 ], "mapped", [ 20018 ] ], [ [ 63750, 63750 ], "mapped", [ 21477 ] ], [ [ 63751, 63752 ], "mapped", [ 40860 ] ], [ [ 63753, 63753 ], "mapped", [ 22865 ] ], [ [ 63754, 63754 ], "mapped", [ 37329 ] ], [ [ 63755, 63755 ], "mapped", [ 21895 ] ], [ [ 63756, 63756 ], "mapped", [ 22856 ] ], [ [ 63757, 63757 ], "mapped", [ 25078 ] ], [ [ 63758, 63758 ], "mapped", [ 30313 ] ], [ [ 63759, 63759 ], "mapped", [ 32645 ] ], [ [ 63760, 63760 ], "mapped", [ 34367 ] ], [ [ 63761, 63761 ], "mapped", [ 34746 ] ], [ [ 63762, 63762 ], "mapped", [ 35064 ] ], [ [ 63763, 63763 ], "mapped", [ 37007 ] ], [ [ 63764, 63764 ], "mapped", [ 27138 ] ], [ [ 63765, 63765 ], "mapped", [ 27931 ] ], [ [ 63766, 63766 ], "mapped", [ 28889 ] ], [ [ 63767, 63767 ], "mapped", [ 29662 ] ], [ [ 63768, 63768 ], "mapped", [ 33853 ] ], [ [ 63769, 63769 ], "mapped", [ 37226 ] ], [ [ 63770, 63770 ], "mapped", [ 39409 ] ], [ [ 63771, 63771 ], "mapped", [ 20098 ] ], [ [ 63772, 63772 ], "mapped", [ 21365 ] ], [ [ 63773, 63773 ], "mapped", [ 27396 ] ], [ [ 63774, 63774 ], "mapped", [ 29211 ] ], [ [ 63775, 63775 ], "mapped", [ 34349 ] ], [ [ 63776, 63776 ], "mapped", [ 40478 ] ], [ [ 63777, 63777 ], "mapped", [ 23888 ] ], [ [ 63778, 63778 ], "mapped", [ 28651 ] ], [ [ 63779, 63779 ], "mapped", [ 34253 ] ], [ [ 63780, 63780 ], "mapped", [ 35172 ] ], [ [ 63781, 63781 ], "mapped", [ 25289 ] ], [ [ 63782, 63782 ], "mapped", [ 33240 ] ], [ [ 63783, 63783 ], "mapped", [ 34847 ] ], [ [ 63784, 63784 ], "mapped", [ 24266 ] ], [ [ 63785, 63785 ], "mapped", [ 26391 ] ], [ [ 63786, 63786 ], "mapped", [ 28010 ] ], [ [ 63787, 63787 ], "mapped", [ 29436 ] ], [ [ 63788, 63788 ], "mapped", [ 37070 ] ], [ [ 63789, 63789 ], "mapped", [ 20358 ] ], [ [ 63790, 63790 ], "mapped", [ 20919 ] ], [ [ 63791, 63791 ], "mapped", [ 21214 ] ], [ [ 63792, 63792 ], "mapped", [ 25796 ] ], [ [ 63793, 63793 ], "mapped", [ 27347 ] ], [ [ 63794, 63794 ], "mapped", [ 29200 ] ], [ [ 63795, 63795 ], "mapped", [ 30439 ] ], [ [ 63796, 63796 ], "mapped", [ 32769 ] ], [ [ 63797, 63797 ], "mapped", [ 34310 ] ], [ [ 63798, 63798 ], "mapped", [ 34396 ] ], [ [ 63799, 63799 ], "mapped", [ 36335 ] ], [ [ 63800, 63800 ], "mapped", [ 38706 ] ], [ [ 63801, 63801 ], "mapped", [ 39791 ] ], [ [ 63802, 63802 ], "mapped", [ 40442 ] ], [ [ 63803, 63803 ], "mapped", [ 30860 ] ], [ [ 63804, 63804 ], "mapped", [ 31103 ] ], [ [ 63805, 63805 ], "mapped", [ 32160 ] ], [ [ 63806, 63806 ], "mapped", [ 33737 ] ], [ [ 63807, 63807 ], "mapped", [ 37636 ] ], [ [ 63808, 63808 ], "mapped", [ 40575 ] ], [ [ 63809, 63809 ], "mapped", [ 35542 ] ], [ [ 63810, 63810 ], "mapped", [ 22751 ] ], [ [ 63811, 63811 ], "mapped", [ 24324 ] ], [ [ 63812, 63812 ], "mapped", [ 31840 ] ], [ [ 63813, 63813 ], "mapped", [ 32894 ] ], [ [ 63814, 63814 ], "mapped", [ 29282 ] ], [ [ 63815, 63815 ], "mapped", [ 30922 ] ], [ [ 63816, 63816 ], "mapped", [ 36034 ] ], [ [ 63817, 63817 ], "mapped", [ 38647 ] ], [ [ 63818, 63818 ], "mapped", [ 22744 ] ], [ [ 63819, 63819 ], "mapped", [ 23650 ] ], [ [ 63820, 63820 ], "mapped", [ 27155 ] ], [ [ 63821, 63821 ], "mapped", [ 28122 ] ], [ [ 63822, 63822 ], "mapped", [ 28431 ] ], [ [ 63823, 63823 ], "mapped", [ 32047 ] ], [ [ 63824, 63824 ], "mapped", [ 32311 ] ], [ [ 63825, 63825 ], "mapped", [ 38475 ] ], [ [ 63826, 63826 ], "mapped", [ 21202 ] ], [ [ 63827, 63827 ], "mapped", [ 32907 ] ], [ [ 63828, 63828 ], "mapped", [ 20956 ] ], [ [ 63829, 63829 ], "mapped", [ 20940 ] ], [ [ 63830, 63830 ], "mapped", [ 31260 ] ], [ [ 63831, 63831 ], "mapped", [ 32190 ] ], [ [ 63832, 63832 ], "mapped", [ 33777 ] ], [ [ 63833, 63833 ], "mapped", [ 38517 ] ], [ [ 63834, 63834 ], "mapped", [ 35712 ] ], [ [ 63835, 63835 ], "mapped", [ 25295 ] ], [ [ 63836, 63836 ], "mapped", [ 27138 ] ], [ [ 63837, 63837 ], "mapped", [ 35582 ] ], [ [ 63838, 63838 ], "mapped", [ 20025 ] ], [ [ 63839, 63839 ], "mapped", [ 23527 ] ], [ [ 63840, 63840 ], "mapped", [ 24594 ] ], [ [ 63841, 63841 ], "mapped", [ 29575 ] ], [ [ 63842, 63842 ], "mapped", [ 30064 ] ], [ [ 63843, 63843 ], "mapped", [ 21271 ] ], [ [ 63844, 63844 ], "mapped", [ 30971 ] ], [ [ 63845, 63845 ], "mapped", [ 20415 ] ], [ [ 63846, 63846 ], "mapped", [ 24489 ] ], [ [ 63847, 63847 ], "mapped", [ 19981 ] ], [ [ 63848, 63848 ], "mapped", [ 27852 ] ], [ [ 63849, 63849 ], "mapped", [ 25976 ] ], [ [ 63850, 63850 ], "mapped", [ 32034 ] ], [ [ 63851, 63851 ], "mapped", [ 21443 ] ], [ [ 63852, 63852 ], "mapped", [ 22622 ] ], [ [ 63853, 63853 ], "mapped", [ 30465 ] ], [ [ 63854, 63854 ], "mapped", [ 33865 ] ], [ [ 63855, 63855 ], "mapped", [ 35498 ] ], [ [ 63856, 63856 ], "mapped", [ 27578 ] ], [ [ 63857, 63857 ], "mapped", [ 36784 ] ], [ [ 63858, 63858 ], "mapped", [ 27784 ] ], [ [ 63859, 63859 ], "mapped", [ 25342 ] ], [ [ 63860, 63860 ], "mapped", [ 33509 ] ], [ [ 63861, 63861 ], "mapped", [ 25504 ] ], [ [ 63862, 63862 ], "mapped", [ 30053 ] ], [ [ 63863, 63863 ], "mapped", [ 20142 ] ], [ [ 63864, 63864 ], "mapped", [ 20841 ] ], [ [ 63865, 63865 ], "mapped", [ 20937 ] ], [ [ 63866, 63866 ], "mapped", [ 26753 ] ], [ [ 63867, 63867 ], "mapped", [ 31975 ] ], [ [ 63868, 63868 ], "mapped", [ 33391 ] ], [ [ 63869, 63869 ], "mapped", [ 35538 ] ], [ [ 63870, 63870 ], "mapped", [ 37327 ] ], [ [ 63871, 63871 ], "mapped", [ 21237 ] ], [ [ 63872, 63872 ], "mapped", [ 21570 ] ], [ [ 63873, 63873 ], "mapped", [ 22899 ] ], [ [ 63874, 63874 ], "mapped", [ 24300 ] ], [ [ 63875, 63875 ], "mapped", [ 26053 ] ], [ [ 63876, 63876 ], "mapped", [ 28670 ] ], [ [ 63877, 63877 ], "mapped", [ 31018 ] ], [ [ 63878, 63878 ], "mapped", [ 38317 ] ], [ [ 63879, 63879 ], "mapped", [ 39530 ] ], [ [ 63880, 63880 ], "mapped", [ 40599 ] ], [ [ 63881, 63881 ], "mapped", [ 40654 ] ], [ [ 63882, 63882 ], "mapped", [ 21147 ] ], [ [ 63883, 63883 ], "mapped", [ 26310 ] ], [ [ 63884, 63884 ], "mapped", [ 27511 ] ], [ [ 63885, 63885 ], "mapped", [ 36706 ] ], [ [ 63886, 63886 ], "mapped", [ 24180 ] ], [ [ 63887, 63887 ], "mapped", [ 24976 ] ], [ [ 63888, 63888 ], "mapped", [ 25088 ] ], [ [ 63889, 63889 ], "mapped", [ 25754 ] ], [ [ 63890, 63890 ], "mapped", [ 28451 ] ], [ [ 63891, 63891 ], "mapped", [ 29001 ] ], [ [ 63892, 63892 ], "mapped", [ 29833 ] ], [ [ 63893, 63893 ], "mapped", [ 31178 ] ], [ [ 63894, 63894 ], "mapped", [ 32244 ] ], [ [ 63895, 63895 ], "mapped", [ 32879 ] ], [ [ 63896, 63896 ], "mapped", [ 36646 ] ], [ [ 63897, 63897 ], "mapped", [ 34030 ] ], [ [ 63898, 63898 ], "mapped", [ 36899 ] ], [ [ 63899, 63899 ], "mapped", [ 37706 ] ], [ [ 63900, 63900 ], "mapped", [ 21015 ] ], [ [ 63901, 63901 ], "mapped", [ 21155 ] ], [ [ 63902, 63902 ], "mapped", [ 21693 ] ], [ [ 63903, 63903 ], "mapped", [ 28872 ] ], [ [ 63904, 63904 ], "mapped", [ 35010 ] ], [ [ 63905, 63905 ], "mapped", [ 35498 ] ], [ [ 63906, 63906 ], "mapped", [ 24265 ] ], [ [ 63907, 63907 ], "mapped", [ 24565 ] ], [ [ 63908, 63908 ], "mapped", [ 25467 ] ], [ [ 63909, 63909 ], "mapped", [ 27566 ] ], [ [ 63910, 63910 ], "mapped", [ 31806 ] ], [ [ 63911, 63911 ], "mapped", [ 29557 ] ], [ [ 63912, 63912 ], "mapped", [ 20196 ] ], [ [ 63913, 63913 ], "mapped", [ 22265 ] ], [ [ 63914, 63914 ], "mapped", [ 23527 ] ], [ [ 63915, 63915 ], "mapped", [ 23994 ] ], [ [ 63916, 63916 ], "mapped", [ 24604 ] ], [ [ 63917, 63917 ], "mapped", [ 29618 ] ], [ [ 63918, 63918 ], "mapped", [ 29801 ] ], [ [ 63919, 63919 ], "mapped", [ 32666 ] ], [ [ 63920, 63920 ], "mapped", [ 32838 ] ], [ [ 63921, 63921 ], "mapped", [ 37428 ] ], [ [ 63922, 63922 ], "mapped", [ 38646 ] ], [ [ 63923, 63923 ], "mapped", [ 38728 ] ], [ [ 63924, 63924 ], "mapped", [ 38936 ] ], [ [ 63925, 63925 ], "mapped", [ 20363 ] ], [ [ 63926, 63926 ], "mapped", [ 31150 ] ], [ [ 63927, 63927 ], "mapped", [ 37300 ] ], [ [ 63928, 63928 ], "mapped", [ 38584 ] ], [ [ 63929, 63929 ], "mapped", [ 24801 ] ], [ [ 63930, 63930 ], "mapped", [ 20102 ] ], [ [ 63931, 63931 ], "mapped", [ 20698 ] ], [ [ 63932, 63932 ], "mapped", [ 23534 ] ], [ [ 63933, 63933 ], "mapped", [ 23615 ] ], [ [ 63934, 63934 ], "mapped", [ 26009 ] ], [ [ 63935, 63935 ], "mapped", [ 27138 ] ], [ [ 63936, 63936 ], "mapped", [ 29134 ] ], [ [ 63937, 63937 ], "mapped", [ 30274 ] ], [ [ 63938, 63938 ], "mapped", [ 34044 ] ], [ [ 63939, 63939 ], "mapped", [ 36988 ] ], [ [ 63940, 63940 ], "mapped", [ 40845 ] ], [ [ 63941, 63941 ], "mapped", [ 26248 ] ], [ [ 63942, 63942 ], "mapped", [ 38446 ] ], [ [ 63943, 63943 ], "mapped", [ 21129 ] ], [ [ 63944, 63944 ], "mapped", [ 26491 ] ], [ [ 63945, 63945 ], "mapped", [ 26611 ] ], [ [ 63946, 63946 ], "mapped", [ 27969 ] ], [ [ 63947, 63947 ], "mapped", [ 28316 ] ], [ [ 63948, 63948 ], "mapped", [ 29705 ] ], [ [ 63949, 63949 ], "mapped", [ 30041 ] ], [ [ 63950, 63950 ], "mapped", [ 30827 ] ], [ [ 63951, 63951 ], "mapped", [ 32016 ] ], [ [ 63952, 63952 ], "mapped", [ 39006 ] ], [ [ 63953, 63953 ], "mapped", [ 20845 ] ], [ [ 63954, 63954 ], "mapped", [ 25134 ] ], [ [ 63955, 63955 ], "mapped", [ 38520 ] ], [ [ 63956, 63956 ], "mapped", [ 20523 ] ], [ [ 63957, 63957 ], "mapped", [ 23833 ] ], [ [ 63958, 63958 ], "mapped", [ 28138 ] ], [ [ 63959, 63959 ], "mapped", [ 36650 ] ], [ [ 63960, 63960 ], "mapped", [ 24459 ] ], [ [ 63961, 63961 ], "mapped", [ 24900 ] ], [ [ 63962, 63962 ], "mapped", [ 26647 ] ], [ [ 63963, 63963 ], "mapped", [ 29575 ] ], [ [ 63964, 63964 ], "mapped", [ 38534 ] ], [ [ 63965, 63965 ], "mapped", [ 21033 ] ], [ [ 63966, 63966 ], "mapped", [ 21519 ] ], [ [ 63967, 63967 ], "mapped", [ 23653 ] ], [ [ 63968, 63968 ], "mapped", [ 26131 ] ], [ [ 63969, 63969 ], "mapped", [ 26446 ] ], [ [ 63970, 63970 ], "mapped", [ 26792 ] ], [ [ 63971, 63971 ], "mapped", [ 27877 ] ], [ [ 63972, 63972 ], "mapped", [ 29702 ] ], [ [ 63973, 63973 ], "mapped", [ 30178 ] ], [ [ 63974, 63974 ], "mapped", [ 32633 ] ], [ [ 63975, 63975 ], "mapped", [ 35023 ] ], [ [ 63976, 63976 ], "mapped", [ 35041 ] ], [ [ 63977, 63977 ], "mapped", [ 37324 ] ], [ [ 63978, 63978 ], "mapped", [ 38626 ] ], [ [ 63979, 63979 ], "mapped", [ 21311 ] ], [ [ 63980, 63980 ], "mapped", [ 28346 ] ], [ [ 63981, 63981 ], "mapped", [ 21533 ] ], [ [ 63982, 63982 ], "mapped", [ 29136 ] ], [ [ 63983, 63983 ], "mapped", [ 29848 ] ], [ [ 63984, 63984 ], "mapped", [ 34298 ] ], [ [ 63985, 63985 ], "mapped", [ 38563 ] ], [ [ 63986, 63986 ], "mapped", [ 40023 ] ], [ [ 63987, 63987 ], "mapped", [ 40607 ] ], [ [ 63988, 63988 ], "mapped", [ 26519 ] ], [ [ 63989, 63989 ], "mapped", [ 28107 ] ], [ [ 63990, 63990 ], "mapped", [ 33256 ] ], [ [ 63991, 63991 ], "mapped", [ 31435 ] ], [ [ 63992, 63992 ], "mapped", [ 31520 ] ], [ [ 63993, 63993 ], "mapped", [ 31890 ] ], [ [ 63994, 63994 ], "mapped", [ 29376 ] ], [ [ 63995, 63995 ], "mapped", [ 28825 ] ], [ [ 63996, 63996 ], "mapped", [ 35672 ] ], [ [ 63997, 63997 ], "mapped", [ 20160 ] ], [ [ 63998, 63998 ], "mapped", [ 33590 ] ], [ [ 63999, 63999 ], "mapped", [ 21050 ] ], [ [ 64000, 64000 ], "mapped", [ 20999 ] ], [ [ 64001, 64001 ], "mapped", [ 24230 ] ], [ [ 64002, 64002 ], "mapped", [ 25299 ] ], [ [ 64003, 64003 ], "mapped", [ 31958 ] ], [ [ 64004, 64004 ], "mapped", [ 23429 ] ], [ [ 64005, 64005 ], "mapped", [ 27934 ] ], [ [ 64006, 64006 ], "mapped", [ 26292 ] ], [ [ 64007, 64007 ], "mapped", [ 36667 ] ], [ [ 64008, 64008 ], "mapped", [ 34892 ] ], [ [ 64009, 64009 ], "mapped", [ 38477 ] ], [ [ 64010, 64010 ], "mapped", [ 35211 ] ], [ [ 64011, 64011 ], "mapped", [ 24275 ] ], [ [ 64012, 64012 ], "mapped", [ 20800 ] ], [ [ 64013, 64013 ], "mapped", [ 21952 ] ], [ [ 64014, 64015 ], "valid" ], [ [ 64016, 64016 ], "mapped", [ 22618 ] ], [ [ 64017, 64017 ], "valid" ], [ [ 64018, 64018 ], "mapped", [ 26228 ] ], [ [ 64019, 64020 ], "valid" ], [ [ 64021, 64021 ], "mapped", [ 20958 ] ], [ [ 64022, 64022 ], "mapped", [ 29482 ] ], [ [ 64023, 64023 ], "mapped", [ 30410 ] ], [ [ 64024, 64024 ], "mapped", [ 31036 ] ], [ [ 64025, 64025 ], "mapped", [ 31070 ] ], [ [ 64026, 64026 ], "mapped", [ 31077 ] ], [ [ 64027, 64027 ], "mapped", [ 31119 ] ], [ [ 64028, 64028 ], "mapped", [ 38742 ] ], [ [ 64029, 64029 ], "mapped", [ 31934 ] ], [ [ 64030, 64030 ], "mapped", [ 32701 ] ], [ [ 64031, 64031 ], "valid" ], [ [ 64032, 64032 ], "mapped", [ 34322 ] ], [ [ 64033, 64033 ], "valid" ], [ [ 64034, 64034 ], "mapped", [ 35576 ] ], [ [ 64035, 64036 ], "valid" ], [ [ 64037, 64037 ], "mapped", [ 36920 ] ], [ [ 64038, 64038 ], "mapped", [ 37117 ] ], [ [ 64039, 64041 ], "valid" ], [ [ 64042, 64042 ], "mapped", [ 39151 ] ], [ [ 64043, 64043 ], "mapped", [ 39164 ] ], [ [ 64044, 64044 ], "mapped", [ 39208 ] ], [ [ 64045, 64045 ], "mapped", [ 40372 ] ], [ [ 64046, 64046 ], "mapped", [ 37086 ] ], [ [ 64047, 64047 ], "mapped", [ 38583 ] ], [ [ 64048, 64048 ], "mapped", [ 20398 ] ], [ [ 64049, 64049 ], "mapped", [ 20711 ] ], [ [ 64050, 64050 ], "mapped", [ 20813 ] ], [ [ 64051, 64051 ], "mapped", [ 21193 ] ], [ [ 64052, 64052 ], "mapped", [ 21220 ] ], [ [ 64053, 64053 ], "mapped", [ 21329 ] ], [ [ 64054, 64054 ], "mapped", [ 21917 ] ], [ [ 64055, 64055 ], "mapped", [ 22022 ] ], [ [ 64056, 64056 ], "mapped", [ 22120 ] ], [ [ 64057, 64057 ], "mapped", [ 22592 ] ], [ [ 64058, 64058 ], "mapped", [ 22696 ] ], [ [ 64059, 64059 ], "mapped", [ 23652 ] ], [ [ 64060, 64060 ], "mapped", [ 23662 ] ], [ [ 64061, 64061 ], "mapped", [ 24724 ] ], [ [ 64062, 64062 ], "mapped", [ 24936 ] ], [ [ 64063, 64063 ], "mapped", [ 24974 ] ], [ [ 64064, 64064 ], "mapped", [ 25074 ] ], [ [ 64065, 64065 ], "mapped", [ 25935 ] ], [ [ 64066, 64066 ], "mapped", [ 26082 ] ], [ [ 64067, 64067 ], "mapped", [ 26257 ] ], [ [ 64068, 64068 ], "mapped", [ 26757 ] ], [ [ 64069, 64069 ], "mapped", [ 28023 ] ], [ [ 64070, 64070 ], "mapped", [ 28186 ] ], [ [ 64071, 64071 ], "mapped", [ 28450 ] ], [ [ 64072, 64072 ], "mapped", [ 29038 ] ], [ [ 64073, 64073 ], "mapped", [ 29227 ] ], [ [ 64074, 64074 ], "mapped", [ 29730 ] ], [ [ 64075, 64075 ], "mapped", [ 30865 ] ], [ [ 64076, 64076 ], "mapped", [ 31038 ] ], [ [ 64077, 64077 ], "mapped", [ 31049 ] ], [ [ 64078, 64078 ], "mapped", [ 31048 ] ], [ [ 64079, 64079 ], "mapped", [ 31056 ] ], [ [ 64080, 64080 ], "mapped", [ 31062 ] ], [ [ 64081, 64081 ], "mapped", [ 31069 ] ], [ [ 64082, 64082 ], "mapped", [ 31117 ] ], [ [ 64083, 64083 ], "mapped", [ 31118 ] ], [ [ 64084, 64084 ], "mapped", [ 31296 ] ], [ [ 64085, 64085 ], "mapped", [ 31361 ] ], [ [ 64086, 64086 ], "mapped", [ 31680 ] ], [ [ 64087, 64087 ], "mapped", [ 32244 ] ], [ [ 64088, 64088 ], "mapped", [ 32265 ] ], [ [ 64089, 64089 ], "mapped", [ 32321 ] ], [ [ 64090, 64090 ], "mapped", [ 32626 ] ], [ [ 64091, 64091 ], "mapped", [ 32773 ] ], [ [ 64092, 64092 ], "mapped", [ 33261 ] ], [ [ 64093, 64094 ], "mapped", [ 33401 ] ], [ [ 64095, 64095 ], "mapped", [ 33879 ] ], [ [ 64096, 64096 ], "mapped", [ 35088 ] ], [ [ 64097, 64097 ], "mapped", [ 35222 ] ], [ [ 64098, 64098 ], "mapped", [ 35585 ] ], [ [ 64099, 64099 ], "mapped", [ 35641 ] ], [ [ 64100, 64100 ], "mapped", [ 36051 ] ], [ [ 64101, 64101 ], "mapped", [ 36104 ] ], [ [ 64102, 64102 ], "mapped", [ 36790 ] ], [ [ 64103, 64103 ], "mapped", [ 36920 ] ], [ [ 64104, 64104 ], "mapped", [ 38627 ] ], [ [ 64105, 64105 ], "mapped", [ 38911 ] ], [ [ 64106, 64106 ], "mapped", [ 38971 ] ], [ [ 64107, 64107 ], "mapped", [ 24693 ] ], [ [ 64108, 64108 ], "mapped", [ 148206 ] ], [ [ 64109, 64109 ], "mapped", [ 33304 ] ], [ [ 64110, 64111 ], "disallowed" ], [ [ 64112, 64112 ], "mapped", [ 20006 ] ], [ [ 64113, 64113 ], "mapped", [ 20917 ] ], [ [ 64114, 64114 ], "mapped", [ 20840 ] ], [ [ 64115, 64115 ], "mapped", [ 20352 ] ], [ [ 64116, 64116 ], "mapped", [ 20805 ] ], [ [ 64117, 64117 ], "mapped", [ 20864 ] ], [ [ 64118, 64118 ], "mapped", [ 21191 ] ], [ [ 64119, 64119 ], "mapped", [ 21242 ] ], [ [ 64120, 64120 ], "mapped", [ 21917 ] ], [ [ 64121, 64121 ], "mapped", [ 21845 ] ], [ [ 64122, 64122 ], "mapped", [ 21913 ] ], [ [ 64123, 64123 ], "mapped", [ 21986 ] ], [ [ 64124, 64124 ], "mapped", [ 22618 ] ], [ [ 64125, 64125 ], "mapped", [ 22707 ] ], [ [ 64126, 64126 ], "mapped", [ 22852 ] ], [ [ 64127, 64127 ], "mapped", [ 22868 ] ], [ [ 64128, 64128 ], "mapped", [ 23138 ] ], [ [ 64129, 64129 ], "mapped", [ 23336 ] ], [ [ 64130, 64130 ], "mapped", [ 24274 ] ], [ [ 64131, 64131 ], "mapped", [ 24281 ] ], [ [ 64132, 64132 ], "mapped", [ 24425 ] ], [ [ 64133, 64133 ], "mapped", [ 24493 ] ], [ [ 64134, 64134 ], "mapped", [ 24792 ] ], [ [ 64135, 64135 ], "mapped", [ 24910 ] ], [ [ 64136, 64136 ], "mapped", [ 24840 ] ], [ [ 64137, 64137 ], "mapped", [ 24974 ] ], [ [ 64138, 64138 ], "mapped", [ 24928 ] ], [ [ 64139, 64139 ], "mapped", [ 25074 ] ], [ [ 64140, 64140 ], "mapped", [ 25140 ] ], [ [ 64141, 64141 ], "mapped", [ 25540 ] ], [ [ 64142, 64142 ], "mapped", [ 25628 ] ], [ [ 64143, 64143 ], "mapped", [ 25682 ] ], [ [ 64144, 64144 ], "mapped", [ 25942 ] ], [ [ 64145, 64145 ], "mapped", [ 26228 ] ], [ [ 64146, 64146 ], "mapped", [ 26391 ] ], [ [ 64147, 64147 ], "mapped", [ 26395 ] ], [ [ 64148, 64148 ], "mapped", [ 26454 ] ], [ [ 64149, 64149 ], "mapped", [ 27513 ] ], [ [ 64150, 64150 ], "mapped", [ 27578 ] ], [ [ 64151, 64151 ], "mapped", [ 27969 ] ], [ [ 64152, 64152 ], "mapped", [ 28379 ] ], [ [ 64153, 64153 ], "mapped", [ 28363 ] ], [ [ 64154, 64154 ], "mapped", [ 28450 ] ], [ [ 64155, 64155 ], "mapped", [ 28702 ] ], [ [ 64156, 64156 ], "mapped", [ 29038 ] ], [ [ 64157, 64157 ], "mapped", [ 30631 ] ], [ [ 64158, 64158 ], "mapped", [ 29237 ] ], [ [ 64159, 64159 ], "mapped", [ 29359 ] ], [ [ 64160, 64160 ], "mapped", [ 29482 ] ], [ [ 64161, 64161 ], "mapped", [ 29809 ] ], [ [ 64162, 64162 ], "mapped", [ 29958 ] ], [ [ 64163, 64163 ], "mapped", [ 30011 ] ], [ [ 64164, 64164 ], "mapped", [ 30237 ] ], [ [ 64165, 64165 ], "mapped", [ 30239 ] ], [ [ 64166, 64166 ], "mapped", [ 30410 ] ], [ [ 64167, 64167 ], "mapped", [ 30427 ] ], [ [ 64168, 64168 ], "mapped", [ 30452 ] ], [ [ 64169, 64169 ], "mapped", [ 30538 ] ], [ [ 64170, 64170 ], "mapped", [ 30528 ] ], [ [ 64171, 64171 ], "mapped", [ 30924 ] ], [ [ 64172, 64172 ], "mapped", [ 31409 ] ], [ [ 64173, 64173 ], "mapped", [ 31680 ] ], [ [ 64174, 64174 ], "mapped", [ 31867 ] ], [ [ 64175, 64175 ], "mapped", [ 32091 ] ], [ [ 64176, 64176 ], "mapped", [ 32244 ] ], [ [ 64177, 64177 ], "mapped", [ 32574 ] ], [ [ 64178, 64178 ], "mapped", [ 32773 ] ], [ [ 64179, 64179 ], "mapped", [ 33618 ] ], [ [ 64180, 64180 ], "mapped", [ 33775 ] ], [ [ 64181, 64181 ], "mapped", [ 34681 ] ], [ [ 64182, 64182 ], "mapped", [ 35137 ] ], [ [ 64183, 64183 ], "mapped", [ 35206 ] ], [ [ 64184, 64184 ], "mapped", [ 35222 ] ], [ [ 64185, 64185 ], "mapped", [ 35519 ] ], [ [ 64186, 64186 ], "mapped", [ 35576 ] ], [ [ 64187, 64187 ], "mapped", [ 35531 ] ], [ [ 64188, 64188 ], "mapped", [ 35585 ] ], [ [ 64189, 64189 ], "mapped", [ 35582 ] ], [ [ 64190, 64190 ], "mapped", [ 35565 ] ], [ [ 64191, 64191 ], "mapped", [ 35641 ] ], [ [ 64192, 64192 ], "mapped", [ 35722 ] ], [ [ 64193, 64193 ], "mapped", [ 36104 ] ], [ [ 64194, 64194 ], "mapped", [ 36664 ] ], [ [ 64195, 64195 ], "mapped", [ 36978 ] ], [ [ 64196, 64196 ], "mapped", [ 37273 ] ], [ [ 64197, 64197 ], "mapped", [ 37494 ] ], [ [ 64198, 64198 ], "mapped", [ 38524 ] ], [ [ 64199, 64199 ], "mapped", [ 38627 ] ], [ [ 64200, 64200 ], "mapped", [ 38742 ] ], [ [ 64201, 64201 ], "mapped", [ 38875 ] ], [ [ 64202, 64202 ], "mapped", [ 38911 ] ], [ [ 64203, 64203 ], "mapped", [ 38923 ] ], [ [ 64204, 64204 ], "mapped", [ 38971 ] ], [ [ 64205, 64205 ], "mapped", [ 39698 ] ], [ [ 64206, 64206 ], "mapped", [ 40860 ] ], [ [ 64207, 64207 ], "mapped", [ 141386 ] ], [ [ 64208, 64208 ], "mapped", [ 141380 ] ], [ [ 64209, 64209 ], "mapped", [ 144341 ] ], [ [ 64210, 64210 ], "mapped", [ 15261 ] ], [ [ 64211, 64211 ], "mapped", [ 16408 ] ], [ [ 64212, 64212 ], "mapped", [ 16441 ] ], [ [ 64213, 64213 ], "mapped", [ 152137 ] ], [ [ 64214, 64214 ], "mapped", [ 154832 ] ], [ [ 64215, 64215 ], "mapped", [ 163539 ] ], [ [ 64216, 64216 ], "mapped", [ 40771 ] ], [ [ 64217, 64217 ], "mapped", [ 40846 ] ], [ [ 64218, 64255 ], "disallowed" ], [ [ 64256, 64256 ], "mapped", [ 102, 102 ] ], [ [ 64257, 64257 ], "mapped", [ 102, 105 ] ], [ [ 64258, 64258 ], "mapped", [ 102, 108 ] ], [ [ 64259, 64259 ], "mapped", [ 102, 102, 105 ] ], [ [ 64260, 64260 ], "mapped", [ 102, 102, 108 ] ], [ [ 64261, 64262 ], "mapped", [ 115, 116 ] ], [ [ 64263, 64274 ], "disallowed" ], [ [ 64275, 64275 ], "mapped", [ 1396, 1398 ] ], [ [ 64276, 64276 ], "mapped", [ 1396, 1381 ] ], [ [ 64277, 64277 ], "mapped", [ 1396, 1387 ] ], [ [ 64278, 64278 ], "mapped", [ 1406, 1398 ] ], [ [ 64279, 64279 ], "mapped", [ 1396, 1389 ] ], [ [ 64280, 64284 ], "disallowed" ], [ [ 64285, 64285 ], "mapped", [ 1497, 1460 ] ], [ [ 64286, 64286 ], "valid" ], [ [ 64287, 64287 ], "mapped", [ 1522, 1463 ] ], [ [ 64288, 64288 ], "mapped", [ 1506 ] ], [ [ 64289, 64289 ], "mapped", [ 1488 ] ], [ [ 64290, 64290 ], "mapped", [ 1491 ] ], [ [ 64291, 64291 ], "mapped", [ 1492 ] ], [ [ 64292, 64292 ], "mapped", [ 1499 ] ], [ [ 64293, 64293 ], "mapped", [ 1500 ] ], [ [ 64294, 64294 ], "mapped", [ 1501 ] ], [ [ 64295, 64295 ], "mapped", [ 1512 ] ], [ [ 64296, 64296 ], "mapped", [ 1514 ] ], [ [ 64297, 64297 ], "disallowed_STD3_mapped", [ 43 ] ], [ [ 64298, 64298 ], "mapped", [ 1513, 1473 ] ], [ [ 64299, 64299 ], "mapped", [ 1513, 1474 ] ], [ [ 64300, 64300 ], "mapped", [ 1513, 1468, 1473 ] ], [ [ 64301, 64301 ], "mapped", [ 1513, 1468, 1474 ] ], [ [ 64302, 64302 ], "mapped", [ 1488, 1463 ] ], [ [ 64303, 64303 ], "mapped", [ 1488, 1464 ] ], [ [ 64304, 64304 ], "mapped", [ 1488, 1468 ] ], [ [ 64305, 64305 ], "mapped", [ 1489, 1468 ] ], [ [ 64306, 64306 ], "mapped", [ 1490, 1468 ] ], [ [ 64307, 64307 ], "mapped", [ 1491, 1468 ] ], [ [ 64308, 64308 ], "mapped", [ 1492, 1468 ] ], [ [ 64309, 64309 ], "mapped", [ 1493, 1468 ] ], [ [ 64310, 64310 ], "mapped", [ 1494, 1468 ] ], [ [ 64311, 64311 ], "disallowed" ], [ [ 64312, 64312 ], "mapped", [ 1496, 1468 ] ], [ [ 64313, 64313 ], "mapped", [ 1497, 1468 ] ], [ [ 64314, 64314 ], "mapped", [ 1498, 1468 ] ], [ [ 64315, 64315 ], "mapped", [ 1499, 1468 ] ], [ [ 64316, 64316 ], "mapped", [ 1500, 1468 ] ], [ [ 64317, 64317 ], "disallowed" ], [ [ 64318, 64318 ], "mapped", [ 1502, 1468 ] ], [ [ 64319, 64319 ], "disallowed" ], [ [ 64320, 64320 ], "mapped", [ 1504, 1468 ] ], [ [ 64321, 64321 ], "mapped", [ 1505, 1468 ] ], [ [ 64322, 64322 ], "disallowed" ], [ [ 64323, 64323 ], "mapped", [ 1507, 1468 ] ], [ [ 64324, 64324 ], "mapped", [ 1508, 1468 ] ], [ [ 64325, 64325 ], "disallowed" ], [ [ 64326, 64326 ], "mapped", [ 1510, 1468 ] ], [ [ 64327, 64327 ], "mapped", [ 1511, 1468 ] ], [ [ 64328, 64328 ], "mapped", [ 1512, 1468 ] ], [ [ 64329, 64329 ], "mapped", [ 1513, 1468 ] ], [ [ 64330, 64330 ], "mapped", [ 1514, 1468 ] ], [ [ 64331, 64331 ], "mapped", [ 1493, 1465 ] ], [ [ 64332, 64332 ], "mapped", [ 1489, 1471 ] ], [ [ 64333, 64333 ], "mapped", [ 1499, 1471 ] ], [ [ 64334, 64334 ], "mapped", [ 1508, 1471 ] ], [ [ 64335, 64335 ], "mapped", [ 1488, 1500 ] ], [ [ 64336, 64337 ], "mapped", [ 1649 ] ], [ [ 64338, 64341 ], "mapped", [ 1659 ] ], [ [ 64342, 64345 ], "mapped", [ 1662 ] ], [ [ 64346, 64349 ], "mapped", [ 1664 ] ], [ [ 64350, 64353 ], "mapped", [ 1658 ] ], [ [ 64354, 64357 ], "mapped", [ 1663 ] ], [ [ 64358, 64361 ], "mapped", [ 1657 ] ], [ [ 64362, 64365 ], "mapped", [ 1700 ] ], [ [ 64366, 64369 ], "mapped", [ 1702 ] ], [ [ 64370, 64373 ], "mapped", [ 1668 ] ], [ [ 64374, 64377 ], "mapped", [ 1667 ] ], [ [ 64378, 64381 ], "mapped", [ 1670 ] ], [ [ 64382, 64385 ], "mapped", [ 1671 ] ], [ [ 64386, 64387 ], "mapped", [ 1677 ] ], [ [ 64388, 64389 ], "mapped", [ 1676 ] ], [ [ 64390, 64391 ], "mapped", [ 1678 ] ], [ [ 64392, 64393 ], "mapped", [ 1672 ] ], [ [ 64394, 64395 ], "mapped", [ 1688 ] ], [ [ 64396, 64397 ], "mapped", [ 1681 ] ], [ [ 64398, 64401 ], "mapped", [ 1705 ] ], [ [ 64402, 64405 ], "mapped", [ 1711 ] ], [ [ 64406, 64409 ], "mapped", [ 1715 ] ], [ [ 64410, 64413 ], "mapped", [ 1713 ] ], [ [ 64414, 64415 ], "mapped", [ 1722 ] ], [ [ 64416, 64419 ], "mapped", [ 1723 ] ], [ [ 64420, 64421 ], "mapped", [ 1728 ] ], [ [ 64422, 64425 ], "mapped", [ 1729 ] ], [ [ 64426, 64429 ], "mapped", [ 1726 ] ], [ [ 64430, 64431 ], "mapped", [ 1746 ] ], [ [ 64432, 64433 ], "mapped", [ 1747 ] ], [ [ 64434, 64449 ], "valid", [ ], "NV8" ], [ [ 64450, 64466 ], "disallowed" ], [ [ 64467, 64470 ], "mapped", [ 1709 ] ], [ [ 64471, 64472 ], "mapped", [ 1735 ] ], [ [ 64473, 64474 ], "mapped", [ 1734 ] ], [ [ 64475, 64476 ], "mapped", [ 1736 ] ], [ [ 64477, 64477 ], "mapped", [ 1735, 1652 ] ], [ [ 64478, 64479 ], "mapped", [ 1739 ] ], [ [ 64480, 64481 ], "mapped", [ 1733 ] ], [ [ 64482, 64483 ], "mapped", [ 1737 ] ], [ [ 64484, 64487 ], "mapped", [ 1744 ] ], [ [ 64488, 64489 ], "mapped", [ 1609 ] ], [ [ 64490, 64491 ], "mapped", [ 1574, 1575 ] ], [ [ 64492, 64493 ], "mapped", [ 1574, 1749 ] ], [ [ 64494, 64495 ], "mapped", [ 1574, 1608 ] ], [ [ 64496, 64497 ], "mapped", [ 1574, 1735 ] ], [ [ 64498, 64499 ], "mapped", [ 1574, 1734 ] ], [ [ 64500, 64501 ], "mapped", [ 1574, 1736 ] ], [ [ 64502, 64504 ], "mapped", [ 1574, 1744 ] ], [ [ 64505, 64507 ], "mapped", [ 1574, 1609 ] ], [ [ 64508, 64511 ], "mapped", [ 1740 ] ], [ [ 64512, 64512 ], "mapped", [ 1574, 1580 ] ], [ [ 64513, 64513 ], "mapped", [ 1574, 1581 ] ], [ [ 64514, 64514 ], "mapped", [ 1574, 1605 ] ], [ [ 64515, 64515 ], "mapped", [ 1574, 1609 ] ], [ [ 64516, 64516 ], "mapped", [ 1574, 1610 ] ], [ [ 64517, 64517 ], "mapped", [ 1576, 1580 ] ], [ [ 64518, 64518 ], "mapped", [ 1576, 1581 ] ], [ [ 64519, 64519 ], "mapped", [ 1576, 1582 ] ], [ [ 64520, 64520 ], "mapped", [ 1576, 1605 ] ], [ [ 64521, 64521 ], "mapped", [ 1576, 1609 ] ], [ [ 64522, 64522 ], "mapped", [ 1576, 1610 ] ], [ [ 64523, 64523 ], "mapped", [ 1578, 1580 ] ], [ [ 64524, 64524 ], "mapped", [ 1578, 1581 ] ], [ [ 64525, 64525 ], "mapped", [ 1578, 1582 ] ], [ [ 64526, 64526 ], "mapped", [ 1578, 1605 ] ], [ [ 64527, 64527 ], "mapped", [ 1578, 1609 ] ], [ [ 64528, 64528 ], "mapped", [ 1578, 1610 ] ], [ [ 64529, 64529 ], "mapped", [ 1579, 1580 ] ], [ [ 64530, 64530 ], "mapped", [ 1579, 1605 ] ], [ [ 64531, 64531 ], "mapped", [ 1579, 1609 ] ], [ [ 64532, 64532 ], "mapped", [ 1579, 1610 ] ], [ [ 64533, 64533 ], "mapped", [ 1580, 1581 ] ], [ [ 64534, 64534 ], "mapped", [ 1580, 1605 ] ], [ [ 64535, 64535 ], "mapped", [ 1581, 1580 ] ], [ [ 64536, 64536 ], "mapped", [ 1581, 1605 ] ], [ [ 64537, 64537 ], "mapped", [ 1582, 1580 ] ], [ [ 64538, 64538 ], "mapped", [ 1582, 1581 ] ], [ [ 64539, 64539 ], "mapped", [ 1582, 1605 ] ], [ [ 64540, 64540 ], "mapped", [ 1587, 1580 ] ], [ [ 64541, 64541 ], "mapped", [ 1587, 1581 ] ], [ [ 64542, 64542 ], "mapped", [ 1587, 1582 ] ], [ [ 64543, 64543 ], "mapped", [ 1587, 1605 ] ], [ [ 64544, 64544 ], "mapped", [ 1589, 1581 ] ], [ [ 64545, 64545 ], "mapped", [ 1589, 1605 ] ], [ [ 64546, 64546 ], "mapped", [ 1590, 1580 ] ], [ [ 64547, 64547 ], "mapped", [ 1590, 1581 ] ], [ [ 64548, 64548 ], "mapped", [ 1590, 1582 ] ], [ [ 64549, 64549 ], "mapped", [ 1590, 1605 ] ], [ [ 64550, 64550 ], "mapped", [ 1591, 1581 ] ], [ [ 64551, 64551 ], "mapped", [ 1591, 1605 ] ], [ [ 64552, 64552 ], "mapped", [ 1592, 1605 ] ], [ [ 64553, 64553 ], "mapped", [ 1593, 1580 ] ], [ [ 64554, 64554 ], "mapped", [ 1593, 1605 ] ], [ [ 64555, 64555 ], "mapped", [ 1594, 1580 ] ], [ [ 64556, 64556 ], "mapped", [ 1594, 1605 ] ], [ [ 64557, 64557 ], "mapped", [ 1601, 1580 ] ], [ [ 64558, 64558 ], "mapped", [ 1601, 1581 ] ], [ [ 64559, 64559 ], "mapped", [ 1601, 1582 ] ], [ [ 64560, 64560 ], "mapped", [ 1601, 1605 ] ], [ [ 64561, 64561 ], "mapped", [ 1601, 1609 ] ], [ [ 64562, 64562 ], "mapped", [ 1601, 1610 ] ], [ [ 64563, 64563 ], "mapped", [ 1602, 1581 ] ], [ [ 64564, 64564 ], "mapped", [ 1602, 1605 ] ], [ [ 64565, 64565 ], "mapped", [ 1602, 1609 ] ], [ [ 64566, 64566 ], "mapped", [ 1602, 1610 ] ], [ [ 64567, 64567 ], "mapped", [ 1603, 1575 ] ], [ [ 64568, 64568 ], "mapped", [ 1603, 1580 ] ], [ [ 64569, 64569 ], "mapped", [ 1603, 1581 ] ], [ [ 64570, 64570 ], "mapped", [ 1603, 1582 ] ], [ [ 64571, 64571 ], "mapped", [ 1603, 1604 ] ], [ [ 64572, 64572 ], "mapped", [ 1603, 1605 ] ], [ [ 64573, 64573 ], "mapped", [ 1603, 1609 ] ], [ [ 64574, 64574 ], "mapped", [ 1603, 1610 ] ], [ [ 64575, 64575 ], "mapped", [ 1604, 1580 ] ], [ [ 64576, 64576 ], "mapped", [ 1604, 1581 ] ], [ [ 64577, 64577 ], "mapped", [ 1604, 1582 ] ], [ [ 64578, 64578 ], "mapped", [ 1604, 1605 ] ], [ [ 64579, 64579 ], "mapped", [ 1604, 1609 ] ], [ [ 64580, 64580 ], "mapped", [ 1604, 1610 ] ], [ [ 64581, 64581 ], "mapped", [ 1605, 1580 ] ], [ [ 64582, 64582 ], "mapped", [ 1605, 1581 ] ], [ [ 64583, 64583 ], "mapped", [ 1605, 1582 ] ], [ [ 64584, 64584 ], "mapped", [ 1605, 1605 ] ], [ [ 64585, 64585 ], "mapped", [ 1605, 1609 ] ], [ [ 64586, 64586 ], "mapped", [ 1605, 1610 ] ], [ [ 64587, 64587 ], "mapped", [ 1606, 1580 ] ], [ [ 64588, 64588 ], "mapped", [ 1606, 1581 ] ], [ [ 64589, 64589 ], "mapped", [ 1606, 1582 ] ], [ [ 64590, 64590 ], "mapped", [ 1606, 1605 ] ], [ [ 64591, 64591 ], "mapped", [ 1606, 1609 ] ], [ [ 64592, 64592 ], "mapped", [ 1606, 1610 ] ], [ [ 64593, 64593 ], "mapped", [ 1607, 1580 ] ], [ [ 64594, 64594 ], "mapped", [ 1607, 1605 ] ], [ [ 64595, 64595 ], "mapped", [ 1607, 1609 ] ], [ [ 64596, 64596 ], "mapped", [ 1607, 1610 ] ], [ [ 64597, 64597 ], "mapped", [ 1610, 1580 ] ], [ [ 64598, 64598 ], "mapped", [ 1610, 1581 ] ], [ [ 64599, 64599 ], "mapped", [ 1610, 1582 ] ], [ [ 64600, 64600 ], "mapped", [ 1610, 1605 ] ], [ [ 64601, 64601 ], "mapped", [ 1610, 1609 ] ], [ [ 64602, 64602 ], "mapped", [ 1610, 1610 ] ], [ [ 64603, 64603 ], "mapped", [ 1584, 1648 ] ], [ [ 64604, 64604 ], "mapped", [ 1585, 1648 ] ], [ [ 64605, 64605 ], "mapped", [ 1609, 1648 ] ], [ [ 64606, 64606 ], "disallowed_STD3_mapped", [ 32, 1612, 1617 ] ], [ [ 64607, 64607 ], "disallowed_STD3_mapped", [ 32, 1613, 1617 ] ], [ [ 64608, 64608 ], "disallowed_STD3_mapped", [ 32, 1614, 1617 ] ], [ [ 64609, 64609 ], "disallowed_STD3_mapped", [ 32, 1615, 1617 ] ], [ [ 64610, 64610 ], "disallowed_STD3_mapped", [ 32, 1616, 1617 ] ], [ [ 64611, 64611 ], "disallowed_STD3_mapped", [ 32, 1617, 1648 ] ], [ [ 64612, 64612 ], "mapped", [ 1574, 1585 ] ], [ [ 64613, 64613 ], "mapped", [ 1574, 1586 ] ], [ [ 64614, 64614 ], "mapped", [ 1574, 1605 ] ], [ [ 64615, 64615 ], "mapped", [ 1574, 1606 ] ], [ [ 64616, 64616 ], "mapped", [ 1574, 1609 ] ], [ [ 64617, 64617 ], "mapped", [ 1574, 1610 ] ], [ [ 64618, 64618 ], "mapped", [ 1576, 1585 ] ], [ [ 64619, 64619 ], "mapped", [ 1576, 1586 ] ], [ [ 64620, 64620 ], "mapped", [ 1576, 1605 ] ], [ [ 64621, 64621 ], "mapped", [ 1576, 1606 ] ], [ [ 64622, 64622 ], "mapped", [ 1576, 1609 ] ], [ [ 64623, 64623 ], "mapped", [ 1576, 1610 ] ], [ [ 64624, 64624 ], "mapped", [ 1578, 1585 ] ], [ [ 64625, 64625 ], "mapped", [ 1578, 1586 ] ], [ [ 64626, 64626 ], "mapped", [ 1578, 1605 ] ], [ [ 64627, 64627 ], "mapped", [ 1578, 1606 ] ], [ [ 64628, 64628 ], "mapped", [ 1578, 1609 ] ], [ [ 64629, 64629 ], "mapped", [ 1578, 1610 ] ], [ [ 64630, 64630 ], "mapped", [ 1579, 1585 ] ], [ [ 64631, 64631 ], "mapped", [ 1579, 1586 ] ], [ [ 64632, 64632 ], "mapped", [ 1579, 1605 ] ], [ [ 64633, 64633 ], "mapped", [ 1579, 1606 ] ], [ [ 64634, 64634 ], "mapped", [ 1579, 1609 ] ], [ [ 64635, 64635 ], "mapped", [ 1579, 1610 ] ], [ [ 64636, 64636 ], "mapped", [ 1601, 1609 ] ], [ [ 64637, 64637 ], "mapped", [ 1601, 1610 ] ], [ [ 64638, 64638 ], "mapped", [ 1602, 1609 ] ], [ [ 64639, 64639 ], "mapped", [ 1602, 1610 ] ], [ [ 64640, 64640 ], "mapped", [ 1603, 1575 ] ], [ [ 64641, 64641 ], "mapped", [ 1603, 1604 ] ], [ [ 64642, 64642 ], "mapped", [ 1603, 1605 ] ], [ [ 64643, 64643 ], "mapped", [ 1603, 1609 ] ], [ [ 64644, 64644 ], "mapped", [ 1603, 1610 ] ], [ [ 64645, 64645 ], "mapped", [ 1604, 1605 ] ], [ [ 64646, 64646 ], "mapped", [ 1604, 1609 ] ], [ [ 64647, 64647 ], "mapped", [ 1604, 1610 ] ], [ [ 64648, 64648 ], "mapped", [ 1605, 1575 ] ], [ [ 64649, 64649 ], "mapped", [ 1605, 1605 ] ], [ [ 64650, 64650 ], "mapped", [ 1606, 1585 ] ], [ [ 64651, 64651 ], "mapped", [ 1606, 1586 ] ], [ [ 64652, 64652 ], "mapped", [ 1606, 1605 ] ], [ [ 64653, 64653 ], "mapped", [ 1606, 1606 ] ], [ [ 64654, 64654 ], "mapped", [ 1606, 1609 ] ], [ [ 64655, 64655 ], "mapped", [ 1606, 1610 ] ], [ [ 64656, 64656 ], "mapped", [ 1609, 1648 ] ], [ [ 64657, 64657 ], "mapped", [ 1610, 1585 ] ], [ [ 64658, 64658 ], "mapped", [ 1610, 1586 ] ], [ [ 64659, 64659 ], "mapped", [ 1610, 1605 ] ], [ [ 64660, 64660 ], "mapped", [ 1610, 1606 ] ], [ [ 64661, 64661 ], "mapped", [ 1610, 1609 ] ], [ [ 64662, 64662 ], "mapped", [ 1610, 1610 ] ], [ [ 64663, 64663 ], "mapped", [ 1574, 1580 ] ], [ [ 64664, 64664 ], "mapped", [ 1574, 1581 ] ], [ [ 64665, 64665 ], "mapped", [ 1574, 1582 ] ], [ [ 64666, 64666 ], "mapped", [ 1574, 1605 ] ], [ [ 64667, 64667 ], "mapped", [ 1574, 1607 ] ], [ [ 64668, 64668 ], "mapped", [ 1576, 1580 ] ], [ [ 64669, 64669 ], "mapped", [ 1576, 1581 ] ], [ [ 64670, 64670 ], "mapped", [ 1576, 1582 ] ], [ [ 64671, 64671 ], "mapped", [ 1576, 1605 ] ], [ [ 64672, 64672 ], "mapped", [ 1576, 1607 ] ], [ [ 64673, 64673 ], "mapped", [ 1578, 1580 ] ], [ [ 64674, 64674 ], "mapped", [ 1578, 1581 ] ], [ [ 64675, 64675 ], "mapped", [ 1578, 1582 ] ], [ [ 64676, 64676 ], "mapped", [ 1578, 1605 ] ], [ [ 64677, 64677 ], "mapped", [ 1578, 1607 ] ], [ [ 64678, 64678 ], "mapped", [ 1579, 1605 ] ], [ [ 64679, 64679 ], "mapped", [ 1580, 1581 ] ], [ [ 64680, 64680 ], "mapped", [ 1580, 1605 ] ], [ [ 64681, 64681 ], "mapped", [ 1581, 1580 ] ], [ [ 64682, 64682 ], "mapped", [ 1581, 1605 ] ], [ [ 64683, 64683 ], "mapped", [ 1582, 1580 ] ], [ [ 64684, 64684 ], "mapped", [ 1582, 1605 ] ], [ [ 64685, 64685 ], "mapped", [ 1587, 1580 ] ], [ [ 64686, 64686 ], "mapped", [ 1587, 1581 ] ], [ [ 64687, 64687 ], "mapped", [ 1587, 1582 ] ], [ [ 64688, 64688 ], "mapped", [ 1587, 1605 ] ], [ [ 64689, 64689 ], "mapped", [ 1589, 1581 ] ], [ [ 64690, 64690 ], "mapped", [ 1589, 1582 ] ], [ [ 64691, 64691 ], "mapped", [ 1589, 1605 ] ], [ [ 64692, 64692 ], "mapped", [ 1590, 1580 ] ], [ [ 64693, 64693 ], "mapped", [ 1590, 1581 ] ], [ [ 64694, 64694 ], "mapped", [ 1590, 1582 ] ], [ [ 64695, 64695 ], "mapped", [ 1590, 1605 ] ], [ [ 64696, 64696 ], "mapped", [ 1591, 1581 ] ], [ [ 64697, 64697 ], "mapped", [ 1592, 1605 ] ], [ [ 64698, 64698 ], "mapped", [ 1593, 1580 ] ], [ [ 64699, 64699 ], "mapped", [ 1593, 1605 ] ], [ [ 64700, 64700 ], "mapped", [ 1594, 1580 ] ], [ [ 64701, 64701 ], "mapped", [ 1594, 1605 ] ], [ [ 64702, 64702 ], "mapped", [ 1601, 1580 ] ], [ [ 64703, 64703 ], "mapped", [ 1601, 1581 ] ], [ [ 64704, 64704 ], "mapped", [ 1601, 1582 ] ], [ [ 64705, 64705 ], "mapped", [ 1601, 1605 ] ], [ [ 64706, 64706 ], "mapped", [ 1602, 1581 ] ], [ [ 64707, 64707 ], "mapped", [ 1602, 1605 ] ], [ [ 64708, 64708 ], "mapped", [ 1603, 1580 ] ], [ [ 64709, 64709 ], "mapped", [ 1603, 1581 ] ], [ [ 64710, 64710 ], "mapped", [ 1603, 1582 ] ], [ [ 64711, 64711 ], "mapped", [ 1603, 1604 ] ], [ [ 64712, 64712 ], "mapped", [ 1603, 1605 ] ], [ [ 64713, 64713 ], "mapped", [ 1604, 1580 ] ], [ [ 64714, 64714 ], "mapped", [ 1604, 1581 ] ], [ [ 64715, 64715 ], "mapped", [ 1604, 1582 ] ], [ [ 64716, 64716 ], "mapped", [ 1604, 1605 ] ], [ [ 64717, 64717 ], "mapped", [ 1604, 1607 ] ], [ [ 64718, 64718 ], "mapped", [ 1605, 1580 ] ], [ [ 64719, 64719 ], "mapped", [ 1605, 1581 ] ], [ [ 64720, 64720 ], "mapped", [ 1605, 1582 ] ], [ [ 64721, 64721 ], "mapped", [ 1605, 1605 ] ], [ [ 64722, 64722 ], "mapped", [ 1606, 1580 ] ], [ [ 64723, 64723 ], "mapped", [ 1606, 1581 ] ], [ [ 64724, 64724 ], "mapped", [ 1606, 1582 ] ], [ [ 64725, 64725 ], "mapped", [ 1606, 1605 ] ], [ [ 64726, 64726 ], "mapped", [ 1606, 1607 ] ], [ [ 64727, 64727 ], "mapped", [ 1607, 1580 ] ], [ [ 64728, 64728 ], "mapped", [ 1607, 1605 ] ], [ [ 64729, 64729 ], "mapped", [ 1607, 1648 ] ], [ [ 64730, 64730 ], "mapped", [ 1610, 1580 ] ], [ [ 64731, 64731 ], "mapped", [ 1610, 1581 ] ], [ [ 64732, 64732 ], "mapped", [ 1610, 1582 ] ], [ [ 64733, 64733 ], "mapped", [ 1610, 1605 ] ], [ [ 64734, 64734 ], "mapped", [ 1610, 1607 ] ], [ [ 64735, 64735 ], "mapped", [ 1574, 1605 ] ], [ [ 64736, 64736 ], "mapped", [ 1574, 1607 ] ], [ [ 64737, 64737 ], "mapped", [ 1576, 1605 ] ], [ [ 64738, 64738 ], "mapped", [ 1576, 1607 ] ], [ [ 64739, 64739 ], "mapped", [ 1578, 1605 ] ], [ [ 64740, 64740 ], "mapped", [ 1578, 1607 ] ], [ [ 64741, 64741 ], "mapped", [ 1579, 1605 ] ], [ [ 64742, 64742 ], "mapped", [ 1579, 1607 ] ], [ [ 64743, 64743 ], "mapped", [ 1587, 1605 ] ], [ [ 64744, 64744 ], "mapped", [ 1587, 1607 ] ], [ [ 64745, 64745 ], "mapped", [ 1588, 1605 ] ], [ [ 64746, 64746 ], "mapped", [ 1588, 1607 ] ], [ [ 64747, 64747 ], "mapped", [ 1603, 1604 ] ], [ [ 64748, 64748 ], "mapped", [ 1603, 1605 ] ], [ [ 64749, 64749 ], "mapped", [ 1604, 1605 ] ], [ [ 64750, 64750 ], "mapped", [ 1606, 1605 ] ], [ [ 64751, 64751 ], "mapped", [ 1606, 1607 ] ], [ [ 64752, 64752 ], "mapped", [ 1610, 1605 ] ], [ [ 64753, 64753 ], "mapped", [ 1610, 1607 ] ], [ [ 64754, 64754 ], "mapped", [ 1600, 1614, 1617 ] ], [ [ 64755, 64755 ], "mapped", [ 1600, 1615, 1617 ] ], [ [ 64756, 64756 ], "mapped", [ 1600, 1616, 1617 ] ], [ [ 64757, 64757 ], "mapped", [ 1591, 1609 ] ], [ [ 64758, 64758 ], "mapped", [ 1591, 1610 ] ], [ [ 64759, 64759 ], "mapped", [ 1593, 1609 ] ], [ [ 64760, 64760 ], "mapped", [ 1593, 1610 ] ], [ [ 64761, 64761 ], "mapped", [ 1594, 1609 ] ], [ [ 64762, 64762 ], "mapped", [ 1594, 1610 ] ], [ [ 64763, 64763 ], "mapped", [ 1587, 1609 ] ], [ [ 64764, 64764 ], "mapped", [ 1587, 1610 ] ], [ [ 64765, 64765 ], "mapped", [ 1588, 1609 ] ], [ [ 64766, 64766 ], "mapped", [ 1588, 1610 ] ], [ [ 64767, 64767 ], "mapped", [ 1581, 1609 ] ], [ [ 64768, 64768 ], "mapped", [ 1581, 1610 ] ], [ [ 64769, 64769 ], "mapped", [ 1580, 1609 ] ], [ [ 64770, 64770 ], "mapped", [ 1580, 1610 ] ], [ [ 64771, 64771 ], "mapped", [ 1582, 1609 ] ], [ [ 64772, 64772 ], "mapped", [ 1582, 1610 ] ], [ [ 64773, 64773 ], "mapped", [ 1589, 1609 ] ], [ [ 64774, 64774 ], "mapped", [ 1589, 1610 ] ], [ [ 64775, 64775 ], "mapped", [ 1590, 1609 ] ], [ [ 64776, 64776 ], "mapped", [ 1590, 1610 ] ], [ [ 64777, 64777 ], "mapped", [ 1588, 1580 ] ], [ [ 64778, 64778 ], "mapped", [ 1588, 1581 ] ], [ [ 64779, 64779 ], "mapped", [ 1588, 1582 ] ], [ [ 64780, 64780 ], "mapped", [ 1588, 1605 ] ], [ [ 64781, 64781 ], "mapped", [ 1588, 1585 ] ], [ [ 64782, 64782 ], "mapped", [ 1587, 1585 ] ], [ [ 64783, 64783 ], "mapped", [ 1589, 1585 ] ], [ [ 64784, 64784 ], "mapped", [ 1590, 1585 ] ], [ [ 64785, 64785 ], "mapped", [ 1591, 1609 ] ], [ [ 64786, 64786 ], "mapped", [ 1591, 1610 ] ], [ [ 64787, 64787 ], "mapped", [ 1593, 1609 ] ], [ [ 64788, 64788 ], "mapped", [ 1593, 1610 ] ], [ [ 64789, 64789 ], "mapped", [ 1594, 1609 ] ], [ [ 64790, 64790 ], "mapped", [ 1594, 1610 ] ], [ [ 64791, 64791 ], "mapped", [ 1587, 1609 ] ], [ [ 64792, 64792 ], "mapped", [ 1587, 1610 ] ], [ [ 64793, 64793 ], "mapped", [ 1588, 1609 ] ], [ [ 64794, 64794 ], "mapped", [ 1588, 1610 ] ], [ [ 64795, 64795 ], "mapped", [ 1581, 1609 ] ], [ [ 64796, 64796 ], "mapped", [ 1581, 1610 ] ], [ [ 64797, 64797 ], "mapped", [ 1580, 1609 ] ], [ [ 64798, 64798 ], "mapped", [ 1580, 1610 ] ], [ [ 64799, 64799 ], "mapped", [ 1582, 1609 ] ], [ [ 64800, 64800 ], "mapped", [ 1582, 1610 ] ], [ [ 64801, 64801 ], "mapped", [ 1589, 1609 ] ], [ [ 64802, 64802 ], "mapped", [ 1589, 1610 ] ], [ [ 64803, 64803 ], "mapped", [ 1590, 1609 ] ], [ [ 64804, 64804 ], "mapped", [ 1590, 1610 ] ], [ [ 64805, 64805 ], "mapped", [ 1588, 1580 ] ], [ [ 64806, 64806 ], "mapped", [ 1588, 1581 ] ], [ [ 64807, 64807 ], "mapped", [ 1588, 1582 ] ], [ [ 64808, 64808 ], "mapped", [ 1588, 1605 ] ], [ [ 64809, 64809 ], "mapped", [ 1588, 1585 ] ], [ [ 64810, 64810 ], "mapped", [ 1587, 1585 ] ], [ [ 64811, 64811 ], "mapped", [ 1589, 1585 ] ], [ [ 64812, 64812 ], "mapped", [ 1590, 1585 ] ], [ [ 64813, 64813 ], "mapped", [ 1588, 1580 ] ], [ [ 64814, 64814 ], "mapped", [ 1588, 1581 ] ], [ [ 64815, 64815 ], "mapped", [ 1588, 1582 ] ], [ [ 64816, 64816 ], "mapped", [ 1588, 1605 ] ], [ [ 64817, 64817 ], "mapped", [ 1587, 1607 ] ], [ [ 64818, 64818 ], "mapped", [ 1588, 1607 ] ], [ [ 64819, 64819 ], "mapped", [ 1591, 1605 ] ], [ [ 64820, 64820 ], "mapped", [ 1587, 1580 ] ], [ [ 64821, 64821 ], "mapped", [ 1587, 1581 ] ], [ [ 64822, 64822 ], "mapped", [ 1587, 1582 ] ], [ [ 64823, 64823 ], "mapped", [ 1588, 1580 ] ], [ [ 64824, 64824 ], "mapped", [ 1588, 1581 ] ], [ [ 64825, 64825 ], "mapped", [ 1588, 1582 ] ], [ [ 64826, 64826 ], "mapped", [ 1591, 1605 ] ], [ [ 64827, 64827 ], "mapped", [ 1592, 1605 ] ], [ [ 64828, 64829 ], "mapped", [ 1575, 1611 ] ], [ [ 64830, 64831 ], "valid", [ ], "NV8" ], [ [ 64832, 64847 ], "disallowed" ], [ [ 64848, 64848 ], "mapped", [ 1578, 1580, 1605 ] ], [ [ 64849, 64850 ], "mapped", [ 1578, 1581, 1580 ] ], [ [ 64851, 64851 ], "mapped", [ 1578, 1581, 1605 ] ], [ [ 64852, 64852 ], "mapped", [ 1578, 1582, 1605 ] ], [ [ 64853, 64853 ], "mapped", [ 1578, 1605, 1580 ] ], [ [ 64854, 64854 ], "mapped", [ 1578, 1605, 1581 ] ], [ [ 64855, 64855 ], "mapped", [ 1578, 1605, 1582 ] ], [ [ 64856, 64857 ], "mapped", [ 1580, 1605, 1581 ] ], [ [ 64858, 64858 ], "mapped", [ 1581, 1605, 1610 ] ], [ [ 64859, 64859 ], "mapped", [ 1581, 1605, 1609 ] ], [ [ 64860, 64860 ], "mapped", [ 1587, 1581, 1580 ] ], [ [ 64861, 64861 ], "mapped", [ 1587, 1580, 1581 ] ], [ [ 64862, 64862 ], "mapped", [ 1587, 1580, 1609 ] ], [ [ 64863, 64864 ], "mapped", [ 1587, 1605, 1581 ] ], [ [ 64865, 64865 ], "mapped", [ 1587, 1605, 1580 ] ], [ [ 64866, 64867 ], "mapped", [ 1587, 1605, 1605 ] ], [ [ 64868, 64869 ], "mapped", [ 1589, 1581, 1581 ] ], [ [ 64870, 64870 ], "mapped", [ 1589, 1605, 1605 ] ], [ [ 64871, 64872 ], "mapped", [ 1588, 1581, 1605 ] ], [ [ 64873, 64873 ], "mapped", [ 1588, 1580, 1610 ] ], [ [ 64874, 64875 ], "mapped", [ 1588, 1605, 1582 ] ], [ [ 64876, 64877 ], "mapped", [ 1588, 1605, 1605 ] ], [ [ 64878, 64878 ], "mapped", [ 1590, 1581, 1609 ] ], [ [ 64879, 64880 ], "mapped", [ 1590, 1582, 1605 ] ], [ [ 64881, 64882 ], "mapped", [ 1591, 1605, 1581 ] ], [ [ 64883, 64883 ], "mapped", [ 1591, 1605, 1605 ] ], [ [ 64884, 64884 ], "mapped", [ 1591, 1605, 1610 ] ], [ [ 64885, 64885 ], "mapped", [ 1593, 1580, 1605 ] ], [ [ 64886, 64887 ], "mapped", [ 1593, 1605, 1605 ] ], [ [ 64888, 64888 ], "mapped", [ 1593, 1605, 1609 ] ], [ [ 64889, 64889 ], "mapped", [ 1594, 1605, 1605 ] ], [ [ 64890, 64890 ], "mapped", [ 1594, 1605, 1610 ] ], [ [ 64891, 64891 ], "mapped", [ 1594, 1605, 1609 ] ], [ [ 64892, 64893 ], "mapped", [ 1601, 1582, 1605 ] ], [ [ 64894, 64894 ], "mapped", [ 1602, 1605, 1581 ] ], [ [ 64895, 64895 ], "mapped", [ 1602, 1605, 1605 ] ], [ [ 64896, 64896 ], "mapped", [ 1604, 1581, 1605 ] ], [ [ 64897, 64897 ], "mapped", [ 1604, 1581, 1610 ] ], [ [ 64898, 64898 ], "mapped", [ 1604, 1581, 1609 ] ], [ [ 64899, 64900 ], "mapped", [ 1604, 1580, 1580 ] ], [ [ 64901, 64902 ], "mapped", [ 1604, 1582, 1605 ] ], [ [ 64903, 64904 ], "mapped", [ 1604, 1605, 1581 ] ], [ [ 64905, 64905 ], "mapped", [ 1605, 1581, 1580 ] ], [ [ 64906, 64906 ], "mapped", [ 1605, 1581, 1605 ] ], [ [ 64907, 64907 ], "mapped", [ 1605, 1581, 1610 ] ], [ [ 64908, 64908 ], "mapped", [ 1605, 1580, 1581 ] ], [ [ 64909, 64909 ], "mapped", [ 1605, 1580, 1605 ] ], [ [ 64910, 64910 ], "mapped", [ 1605, 1582, 1580 ] ], [ [ 64911, 64911 ], "mapped", [ 1605, 1582, 1605 ] ], [ [ 64912, 64913 ], "disallowed" ], [ [ 64914, 64914 ], "mapped", [ 1605, 1580, 1582 ] ], [ [ 64915, 64915 ], "mapped", [ 1607, 1605, 1580 ] ], [ [ 64916, 64916 ], "mapped", [ 1607, 1605, 1605 ] ], [ [ 64917, 64917 ], "mapped", [ 1606, 1581, 1605 ] ], [ [ 64918, 64918 ], "mapped", [ 1606, 1581, 1609 ] ], [ [ 64919, 64920 ], "mapped", [ 1606, 1580, 1605 ] ], [ [ 64921, 64921 ], "mapped", [ 1606, 1580, 1609 ] ], [ [ 64922, 64922 ], "mapped", [ 1606, 1605, 1610 ] ], [ [ 64923, 64923 ], "mapped", [ 1606, 1605, 1609 ] ], [ [ 64924, 64925 ], "mapped", [ 1610, 1605, 1605 ] ], [ [ 64926, 64926 ], "mapped", [ 1576, 1582, 1610 ] ], [ [ 64927, 64927 ], "mapped", [ 1578, 1580, 1610 ] ], [ [ 64928, 64928 ], "mapped", [ 1578, 1580, 1609 ] ], [ [ 64929, 64929 ], "mapped", [ 1578, 1582, 1610 ] ], [ [ 64930, 64930 ], "mapped", [ 1578, 1582, 1609 ] ], [ [ 64931, 64931 ], "mapped", [ 1578, 1605, 1610 ] ], [ [ 64932, 64932 ], "mapped", [ 1578, 1605, 1609 ] ], [ [ 64933, 64933 ], "mapped", [ 1580, 1605, 1610 ] ], [ [ 64934, 64934 ], "mapped", [ 1580, 1581, 1609 ] ], [ [ 64935, 64935 ], "mapped", [ 1580, 1605, 1609 ] ], [ [ 64936, 64936 ], "mapped", [ 1587, 1582, 1609 ] ], [ [ 64937, 64937 ], "mapped", [ 1589, 1581, 1610 ] ], [ [ 64938, 64938 ], "mapped", [ 1588, 1581, 1610 ] ], [ [ 64939, 64939 ], "mapped", [ 1590, 1581, 1610 ] ], [ [ 64940, 64940 ], "mapped", [ 1604, 1580, 1610 ] ], [ [ 64941, 64941 ], "mapped", [ 1604, 1605, 1610 ] ], [ [ 64942, 64942 ], "mapped", [ 1610, 1581, 1610 ] ], [ [ 64943, 64943 ], "mapped", [ 1610, 1580, 1610 ] ], [ [ 64944, 64944 ], "mapped", [ 1610, 1605, 1610 ] ], [ [ 64945, 64945 ], "mapped", [ 1605, 1605, 1610 ] ], [ [ 64946, 64946 ], "mapped", [ 1602, 1605, 1610 ] ], [ [ 64947, 64947 ], "mapped", [ 1606, 1581, 1610 ] ], [ [ 64948, 64948 ], "mapped", [ 1602, 1605, 1581 ] ], [ [ 64949, 64949 ], "mapped", [ 1604, 1581, 1605 ] ], [ [ 64950, 64950 ], "mapped", [ 1593, 1605, 1610 ] ], [ [ 64951, 64951 ], "mapped", [ 1603, 1605, 1610 ] ], [ [ 64952, 64952 ], "mapped", [ 1606, 1580, 1581 ] ], [ [ 64953, 64953 ], "mapped", [ 1605, 1582, 1610 ] ], [ [ 64954, 64954 ], "mapped", [ 1604, 1580, 1605 ] ], [ [ 64955, 64955 ], "mapped", [ 1603, 1605, 1605 ] ], [ [ 64956, 64956 ], "mapped", [ 1604, 1580, 1605 ] ], [ [ 64957, 64957 ], "mapped", [ 1606, 1580, 1581 ] ], [ [ 64958, 64958 ], "mapped", [ 1580, 1581, 1610 ] ], [ [ 64959, 64959 ], "mapped", [ 1581, 1580, 1610 ] ], [ [ 64960, 64960 ], "mapped", [ 1605, 1580, 1610 ] ], [ [ 64961, 64961 ], "mapped", [ 1601, 1605, 1610 ] ], [ [ 64962, 64962 ], "mapped", [ 1576, 1581, 1610 ] ], [ [ 64963, 64963 ], "mapped", [ 1603, 1605, 1605 ] ], [ [ 64964, 64964 ], "mapped", [ 1593, 1580, 1605 ] ], [ [ 64965, 64965 ], "mapped", [ 1589, 1605, 1605 ] ], [ [ 64966, 64966 ], "mapped", [ 1587, 1582, 1610 ] ], [ [ 64967, 64967 ], "mapped", [ 1606, 1580, 1610 ] ], [ [ 64968, 64975 ], "disallowed" ], [ [ 64976, 65007 ], "disallowed" ], [ [ 65008, 65008 ], "mapped", [ 1589, 1604, 1746 ] ], [ [ 65009, 65009 ], "mapped", [ 1602, 1604, 1746 ] ], [ [ 65010, 65010 ], "mapped", [ 1575, 1604, 1604, 1607 ] ], [ [ 65011, 65011 ], "mapped", [ 1575, 1603, 1576, 1585 ] ], [ [ 65012, 65012 ], "mapped", [ 1605, 1581, 1605, 1583 ] ], [ [ 65013, 65013 ], "mapped", [ 1589, 1604, 1593, 1605 ] ], [ [ 65014, 65014 ], "mapped", [ 1585, 1587, 1608, 1604 ] ], [ [ 65015, 65015 ], "mapped", [ 1593, 1604, 1610, 1607 ] ], [ [ 65016, 65016 ], "mapped", [ 1608, 1587, 1604, 1605 ] ], [ [ 65017, 65017 ], "mapped", [ 1589, 1604, 1609 ] ], [ [ 65018, 65018 ], "disallowed_STD3_mapped", [ 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605 ] ], [ [ 65019, 65019 ], "disallowed_STD3_mapped", [ 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607 ] ], [ [ 65020, 65020 ], "mapped", [ 1585, 1740, 1575, 1604 ] ], [ [ 65021, 65021 ], "valid", [ ], "NV8" ], [ [ 65022, 65023 ], "disallowed" ], [ [ 65024, 65039 ], "ignored" ], [ [ 65040, 65040 ], "disallowed_STD3_mapped", [ 44 ] ], [ [ 65041, 65041 ], "mapped", [ 12289 ] ], [ [ 65042, 65042 ], "disallowed" ], [ [ 65043, 65043 ], "disallowed_STD3_mapped", [ 58 ] ], [ [ 65044, 65044 ], "disallowed_STD3_mapped", [ 59 ] ], [ [ 65045, 65045 ], "disallowed_STD3_mapped", [ 33 ] ], [ [ 65046, 65046 ], "disallowed_STD3_mapped", [ 63 ] ], [ [ 65047, 65047 ], "mapped", [ 12310 ] ], [ [ 65048, 65048 ], "mapped", [ 12311 ] ], [ [ 65049, 65049 ], "disallowed" ], [ [ 65050, 65055 ], "disallowed" ], [ [ 65056, 65059 ], "valid" ], [ [ 65060, 65062 ], "valid" ], [ [ 65063, 65069 ], "valid" ], [ [ 65070, 65071 ], "valid" ], [ [ 65072, 65072 ], "disallowed" ], [ [ 65073, 65073 ], "mapped", [ 8212 ] ], [ [ 65074, 65074 ], "mapped", [ 8211 ] ], [ [ 65075, 65076 ], "disallowed_STD3_mapped", [ 95 ] ], [ [ 65077, 65077 ], "disallowed_STD3_mapped", [ 40 ] ], [ [ 65078, 65078 ], "disallowed_STD3_mapped", [ 41 ] ], [ [ 65079, 65079 ], "disallowed_STD3_mapped", [ 123 ] ], [ [ 65080, 65080 ], "disallowed_STD3_mapped", [ 125 ] ], [ [ 65081, 65081 ], "mapped", [ 12308 ] ], [ [ 65082, 65082 ], "mapped", [ 12309 ] ], [ [ 65083, 65083 ], "mapped", [ 12304 ] ], [ [ 65084, 65084 ], "mapped", [ 12305 ] ], [ [ 65085, 65085 ], "mapped", [ 12298 ] ], [ [ 65086, 65086 ], "mapped", [ 12299 ] ], [ [ 65087, 65087 ], "mapped", [ 12296 ] ], [ [ 65088, 65088 ], "mapped", [ 12297 ] ], [ [ 65089, 65089 ], "mapped", [ 12300 ] ], [ [ 65090, 65090 ], "mapped", [ 12301 ] ], [ [ 65091, 65091 ], "mapped", [ 12302 ] ], [ [ 65092, 65092 ], "mapped", [ 12303 ] ], [ [ 65093, 65094 ], "valid", [ ], "NV8" ], [ [ 65095, 65095 ], "disallowed_STD3_mapped", [ 91 ] ], [ [ 65096, 65096 ], "disallowed_STD3_mapped", [ 93 ] ], [ [ 65097, 65100 ], "disallowed_STD3_mapped", [ 32, 773 ] ], [ [ 65101, 65103 ], "disallowed_STD3_mapped", [ 95 ] ], [ [ 65104, 65104 ], "disallowed_STD3_mapped", [ 44 ] ], [ [ 65105, 65105 ], "mapped", [ 12289 ] ], [ [ 65106, 65106 ], "disallowed" ], [ [ 65107, 65107 ], "disallowed" ], [ [ 65108, 65108 ], "disallowed_STD3_mapped", [ 59 ] ], [ [ 65109, 65109 ], "disallowed_STD3_mapped", [ 58 ] ], [ [ 65110, 65110 ], "disallowed_STD3_mapped", [ 63 ] ], [ [ 65111, 65111 ], "disallowed_STD3_mapped", [ 33 ] ], [ [ 65112, 65112 ], "mapped", [ 8212 ] ], [ [ 65113, 65113 ], "disallowed_STD3_mapped", [ 40 ] ], [ [ 65114, 65114 ], "disallowed_STD3_mapped", [ 41 ] ], [ [ 65115, 65115 ], "disallowed_STD3_mapped", [ 123 ] ], [ [ 65116, 65116 ], "disallowed_STD3_mapped", [ 125 ] ], [ [ 65117, 65117 ], "mapped", [ 12308 ] ], [ [ 65118, 65118 ], "mapped", [ 12309 ] ], [ [ 65119, 65119 ], "disallowed_STD3_mapped", [ 35 ] ], [ [ 65120, 65120 ], "disallowed_STD3_mapped", [ 38 ] ], [ [ 65121, 65121 ], "disallowed_STD3_mapped", [ 42 ] ], [ [ 65122, 65122 ], "disallowed_STD3_mapped", [ 43 ] ], [ [ 65123, 65123 ], "mapped", [ 45 ] ], [ [ 65124, 65124 ], "disallowed_STD3_mapped", [ 60 ] ], [ [ 65125, 65125 ], "disallowed_STD3_mapped", [ 62 ] ], [ [ 65126, 65126 ], "disallowed_STD3_mapped", [ 61 ] ], [ [ 65127, 65127 ], "disallowed" ], [ [ 65128, 65128 ], "disallowed_STD3_mapped", [ 92 ] ], [ [ 65129, 65129 ], "disallowed_STD3_mapped", [ 36 ] ], [ [ 65130, 65130 ], "disallowed_STD3_mapped", [ 37 ] ], [ [ 65131, 65131 ], "disallowed_STD3_mapped", [ 64 ] ], [ [ 65132, 65135 ], "disallowed" ], [ [ 65136, 65136 ], "disallowed_STD3_mapped", [ 32, 1611 ] ], [ [ 65137, 65137 ], "mapped", [ 1600, 1611 ] ], [ [ 65138, 65138 ], "disallowed_STD3_mapped", [ 32, 1612 ] ], [ [ 65139, 65139 ], "valid" ], [ [ 65140, 65140 ], "disallowed_STD3_mapped", [ 32, 1613 ] ], [ [ 65141, 65141 ], "disallowed" ], [ [ 65142, 65142 ], "disallowed_STD3_mapped", [ 32, 1614 ] ], [ [ 65143, 65143 ], "mapped", [ 1600, 1614 ] ], [ [ 65144, 65144 ], "disallowed_STD3_mapped", [ 32, 1615 ] ], [ [ 65145, 65145 ], "mapped", [ 1600, 1615 ] ], [ [ 65146, 65146 ], "disallowed_STD3_mapped", [ 32, 1616 ] ], [ [ 65147, 65147 ], "mapped", [ 1600, 1616 ] ], [ [ 65148, 65148 ], "disallowed_STD3_mapped", [ 32, 1617 ] ], [ [ 65149, 65149 ], "mapped", [ 1600, 1617 ] ], [ [ 65150, 65150 ], "disallowed_STD3_mapped", [ 32, 1618 ] ], [ [ 65151, 65151 ], "mapped", [ 1600, 1618 ] ], [ [ 65152, 65152 ], "mapped", [ 1569 ] ], [ [ 65153, 65154 ], "mapped", [ 1570 ] ], [ [ 65155, 65156 ], "mapped", [ 1571 ] ], [ [ 65157, 65158 ], "mapped", [ 1572 ] ], [ [ 65159, 65160 ], "mapped", [ 1573 ] ], [ [ 65161, 65164 ], "mapped", [ 1574 ] ], [ [ 65165, 65166 ], "mapped", [ 1575 ] ], [ [ 65167, 65170 ], "mapped", [ 1576 ] ], [ [ 65171, 65172 ], "mapped", [ 1577 ] ], [ [ 65173, 65176 ], "mapped", [ 1578 ] ], [ [ 65177, 65180 ], "mapped", [ 1579 ] ], [ [ 65181, 65184 ], "mapped", [ 1580 ] ], [ [ 65185, 65188 ], "mapped", [ 1581 ] ], [ [ 65189, 65192 ], "mapped", [ 1582 ] ], [ [ 65193, 65194 ], "mapped", [ 1583 ] ], [ [ 65195, 65196 ], "mapped", [ 1584 ] ], [ [ 65197, 65198 ], "mapped", [ 1585 ] ], [ [ 65199, 65200 ], "mapped", [ 1586 ] ], [ [ 65201, 65204 ], "mapped", [ 1587 ] ], [ [ 65205, 65208 ], "mapped", [ 1588 ] ], [ [ 65209, 65212 ], "mapped", [ 1589 ] ], [ [ 65213, 65216 ], "mapped", [ 1590 ] ], [ [ 65217, 65220 ], "mapped", [ 1591 ] ], [ [ 65221, 65224 ], "mapped", [ 1592 ] ], [ [ 65225, 65228 ], "mapped", [ 1593 ] ], [ [ 65229, 65232 ], "mapped", [ 1594 ] ], [ [ 65233, 65236 ], "mapped", [ 1601 ] ], [ [ 65237, 65240 ], "mapped", [ 1602 ] ], [ [ 65241, 65244 ], "mapped", [ 1603 ] ], [ [ 65245, 65248 ], "mapped", [ 1604 ] ], [ [ 65249, 65252 ], "mapped", [ 1605 ] ], [ [ 65253, 65256 ], "mapped", [ 1606 ] ], [ [ 65257, 65260 ], "mapped", [ 1607 ] ], [ [ 65261, 65262 ], "mapped", [ 1608 ] ], [ [ 65263, 65264 ], "mapped", [ 1609 ] ], [ [ 65265, 65268 ], "mapped", [ 1610 ] ], [ [ 65269, 65270 ], "mapped", [ 1604, 1570 ] ], [ [ 65271, 65272 ], "mapped", [ 1604, 1571 ] ], [ [ 65273, 65274 ], "mapped", [ 1604, 1573 ] ], [ [ 65275, 65276 ], "mapped", [ 1604, 1575 ] ], [ [ 65277, 65278 ], "disallowed" ], [ [ 65279, 65279 ], "ignored" ], [ [ 65280, 65280 ], "disallowed" ], [ [ 65281, 65281 ], "disallowed_STD3_mapped", [ 33 ] ], [ [ 65282, 65282 ], "disallowed_STD3_mapped", [ 34 ] ], [ [ 65283, 65283 ], "disallowed_STD3_mapped", [ 35 ] ], [ [ 65284, 65284 ], "disallowed_STD3_mapped", [ 36 ] ], [ [ 65285, 65285 ], "disallowed_STD3_mapped", [ 37 ] ], [ [ 65286, 65286 ], "disallowed_STD3_mapped", [ 38 ] ], [ [ 65287, 65287 ], "disallowed_STD3_mapped", [ 39 ] ], [ [ 65288, 65288 ], "disallowed_STD3_mapped", [ 40 ] ], [ [ 65289, 65289 ], "disallowed_STD3_mapped", [ 41 ] ], [ [ 65290, 65290 ], "disallowed_STD3_mapped", [ 42 ] ], [ [ 65291, 65291 ], "disallowed_STD3_mapped", [ 43 ] ], [ [ 65292, 65292 ], "disallowed_STD3_mapped", [ 44 ] ], [ [ 65293, 65293 ], "mapped", [ 45 ] ], [ [ 65294, 65294 ], "mapped", [ 46 ] ], [ [ 65295, 65295 ], "disallowed_STD3_mapped", [ 47 ] ], [ [ 65296, 65296 ], "mapped", [ 48 ] ], [ [ 65297, 65297 ], "mapped", [ 49 ] ], [ [ 65298, 65298 ], "mapped", [ 50 ] ], [ [ 65299, 65299 ], "mapped", [ 51 ] ], [ [ 65300, 65300 ], "mapped", [ 52 ] ], [ [ 65301, 65301 ], "mapped", [ 53 ] ], [ [ 65302, 65302 ], "mapped", [ 54 ] ], [ [ 65303, 65303 ], "mapped", [ 55 ] ], [ [ 65304, 65304 ], "mapped", [ 56 ] ], [ [ 65305, 65305 ], "mapped", [ 57 ] ], [ [ 65306, 65306 ], "disallowed_STD3_mapped", [ 58 ] ], [ [ 65307, 65307 ], "disallowed_STD3_mapped", [ 59 ] ], [ [ 65308, 65308 ], "disallowed_STD3_mapped", [ 60 ] ], [ [ 65309, 65309 ], "disallowed_STD3_mapped", [ 61 ] ], [ [ 65310, 65310 ], "disallowed_STD3_mapped", [ 62 ] ], [ [ 65311, 65311 ], "disallowed_STD3_mapped", [ 63 ] ], [ [ 65312, 65312 ], "disallowed_STD3_mapped", [ 64 ] ], [ [ 65313, 65313 ], "mapped", [ 97 ] ], [ [ 65314, 65314 ], "mapped", [ 98 ] ], [ [ 65315, 65315 ], "mapped", [ 99 ] ], [ [ 65316, 65316 ], "mapped", [ 100 ] ], [ [ 65317, 65317 ], "mapped", [ 101 ] ], [ [ 65318, 65318 ], "mapped", [ 102 ] ], [ [ 65319, 65319 ], "mapped", [ 103 ] ], [ [ 65320, 65320 ], "mapped", [ 104 ] ], [ [ 65321, 65321 ], "mapped", [ 105 ] ], [ [ 65322, 65322 ], "mapped", [ 106 ] ], [ [ 65323, 65323 ], "mapped", [ 107 ] ], [ [ 65324, 65324 ], "mapped", [ 108 ] ], [ [ 65325, 65325 ], "mapped", [ 109 ] ], [ [ 65326, 65326 ], "mapped", [ 110 ] ], [ [ 65327, 65327 ], "mapped", [ 111 ] ], [ [ 65328, 65328 ], "mapped", [ 112 ] ], [ [ 65329, 65329 ], "mapped", [ 113 ] ], [ [ 65330, 65330 ], "mapped", [ 114 ] ], [ [ 65331, 65331 ], "mapped", [ 115 ] ], [ [ 65332, 65332 ], "mapped", [ 116 ] ], [ [ 65333, 65333 ], "mapped", [ 117 ] ], [ [ 65334, 65334 ], "mapped", [ 118 ] ], [ [ 65335, 65335 ], "mapped", [ 119 ] ], [ [ 65336, 65336 ], "mapped", [ 120 ] ], [ [ 65337, 65337 ], "mapped", [ 121 ] ], [ [ 65338, 65338 ], "mapped", [ 122 ] ], [ [ 65339, 65339 ], "disallowed_STD3_mapped", [ 91 ] ], [ [ 65340, 65340 ], "disallowed_STD3_mapped", [ 92 ] ], [ [ 65341, 65341 ], "disallowed_STD3_mapped", [ 93 ] ], [ [ 65342, 65342 ], "disallowed_STD3_mapped", [ 94 ] ], [ [ 65343, 65343 ], "disallowed_STD3_mapped", [ 95 ] ], [ [ 65344, 65344 ], "disallowed_STD3_mapped", [ 96 ] ], [ [ 65345, 65345 ], "mapped", [ 97 ] ], [ [ 65346, 65346 ], "mapped", [ 98 ] ], [ [ 65347, 65347 ], "mapped", [ 99 ] ], [ [ 65348, 65348 ], "mapped", [ 100 ] ], [ [ 65349, 65349 ], "mapped", [ 101 ] ], [ [ 65350, 65350 ], "mapped", [ 102 ] ], [ [ 65351, 65351 ], "mapped", [ 103 ] ], [ [ 65352, 65352 ], "mapped", [ 104 ] ], [ [ 65353, 65353 ], "mapped", [ 105 ] ], [ [ 65354, 65354 ], "mapped", [ 106 ] ], [ [ 65355, 65355 ], "mapped", [ 107 ] ], [ [ 65356, 65356 ], "mapped", [ 108 ] ], [ [ 65357, 65357 ], "mapped", [ 109 ] ], [ [ 65358, 65358 ], "mapped", [ 110 ] ], [ [ 65359, 65359 ], "mapped", [ 111 ] ], [ [ 65360, 65360 ], "mapped", [ 112 ] ], [ [ 65361, 65361 ], "mapped", [ 113 ] ], [ [ 65362, 65362 ], "mapped", [ 114 ] ], [ [ 65363, 65363 ], "mapped", [ 115 ] ], [ [ 65364, 65364 ], "mapped", [ 116 ] ], [ [ 65365, 65365 ], "mapped", [ 117 ] ], [ [ 65366, 65366 ], "mapped", [ 118 ] ], [ [ 65367, 65367 ], "mapped", [ 119 ] ], [ [ 65368, 65368 ], "mapped", [ 120 ] ], [ [ 65369, 65369 ], "mapped", [ 121 ] ], [ [ 65370, 65370 ], "mapped", [ 122 ] ], [ [ 65371, 65371 ], "disallowed_STD3_mapped", [ 123 ] ], [ [ 65372, 65372 ], "disallowed_STD3_mapped", [ 124 ] ], [ [ 65373, 65373 ], "disallowed_STD3_mapped", [ 125 ] ], [ [ 65374, 65374 ], "disallowed_STD3_mapped", [ 126 ] ], [ [ 65375, 65375 ], "mapped", [ 10629 ] ], [ [ 65376, 65376 ], "mapped", [ 10630 ] ], [ [ 65377, 65377 ], "mapped", [ 46 ] ], [ [ 65378, 65378 ], "mapped", [ 12300 ] ], [ [ 65379, 65379 ], "mapped", [ 12301 ] ], [ [ 65380, 65380 ], "mapped", [ 12289 ] ], [ [ 65381, 65381 ], "mapped", [ 12539 ] ], [ [ 65382, 65382 ], "mapped", [ 12530 ] ], [ [ 65383, 65383 ], "mapped", [ 12449 ] ], [ [ 65384, 65384 ], "mapped", [ 12451 ] ], [ [ 65385, 65385 ], "mapped", [ 12453 ] ], [ [ 65386, 65386 ], "mapped", [ 12455 ] ], [ [ 65387, 65387 ], "mapped", [ 12457 ] ], [ [ 65388, 65388 ], "mapped", [ 12515 ] ], [ [ 65389, 65389 ], "mapped", [ 12517 ] ], [ [ 65390, 65390 ], "mapped", [ 12519 ] ], [ [ 65391, 65391 ], "mapped", [ 12483 ] ], [ [ 65392, 65392 ], "mapped", [ 12540 ] ], [ [ 65393, 65393 ], "mapped", [ 12450 ] ], [ [ 65394, 65394 ], "mapped", [ 12452 ] ], [ [ 65395, 65395 ], "mapped", [ 12454 ] ], [ [ 65396, 65396 ], "mapped", [ 12456 ] ], [ [ 65397, 65397 ], "mapped", [ 12458 ] ], [ [ 65398, 65398 ], "mapped", [ 12459 ] ], [ [ 65399, 65399 ], "mapped", [ 12461 ] ], [ [ 65400, 65400 ], "mapped", [ 12463 ] ], [ [ 65401, 65401 ], "mapped", [ 12465 ] ], [ [ 65402, 65402 ], "mapped", [ 12467 ] ], [ [ 65403, 65403 ], "mapped", [ 12469 ] ], [ [ 65404, 65404 ], "mapped", [ 12471 ] ], [ [ 65405, 65405 ], "mapped", [ 12473 ] ], [ [ 65406, 65406 ], "mapped", [ 12475 ] ], [ [ 65407, 65407 ], "mapped", [ 12477 ] ], [ [ 65408, 65408 ], "mapped", [ 12479 ] ], [ [ 65409, 65409 ], "mapped", [ 12481 ] ], [ [ 65410, 65410 ], "mapped", [ 12484 ] ], [ [ 65411, 65411 ], "mapped", [ 12486 ] ], [ [ 65412, 65412 ], "mapped", [ 12488 ] ], [ [ 65413, 65413 ], "mapped", [ 12490 ] ], [ [ 65414, 65414 ], "mapped", [ 12491 ] ], [ [ 65415, 65415 ], "mapped", [ 12492 ] ], [ [ 65416, 65416 ], "mapped", [ 12493 ] ], [ [ 65417, 65417 ], "mapped", [ 12494 ] ], [ [ 65418, 65418 ], "mapped", [ 12495 ] ], [ [ 65419, 65419 ], "mapped", [ 12498 ] ], [ [ 65420, 65420 ], "mapped", [ 12501 ] ], [ [ 65421, 65421 ], "mapped", [ 12504 ] ], [ [ 65422, 65422 ], "mapped", [ 12507 ] ], [ [ 65423, 65423 ], "mapped", [ 12510 ] ], [ [ 65424, 65424 ], "mapped", [ 12511 ] ], [ [ 65425, 65425 ], "mapped", [ 12512 ] ], [ [ 65426, 65426 ], "mapped", [ 12513 ] ], [ [ 65427, 65427 ], "mapped", [ 12514 ] ], [ [ 65428, 65428 ], "mapped", [ 12516 ] ], [ [ 65429, 65429 ], "mapped", [ 12518 ] ], [ [ 65430, 65430 ], "mapped", [ 12520 ] ], [ [ 65431, 65431 ], "mapped", [ 12521 ] ], [ [ 65432, 65432 ], "mapped", [ 12522 ] ], [ [ 65433, 65433 ], "mapped", [ 12523 ] ], [ [ 65434, 65434 ], "mapped", [ 12524 ] ], [ [ 65435, 65435 ], "mapped", [ 12525 ] ], [ [ 65436, 65436 ], "mapped", [ 12527 ] ], [ [ 65437, 65437 ], "mapped", [ 12531 ] ], [ [ 65438, 65438 ], "mapped", [ 12441 ] ], [ [ 65439, 65439 ], "mapped", [ 12442 ] ], [ [ 65440, 65440 ], "disallowed" ], [ [ 65441, 65441 ], "mapped", [ 4352 ] ], [ [ 65442, 65442 ], "mapped", [ 4353 ] ], [ [ 65443, 65443 ], "mapped", [ 4522 ] ], [ [ 65444, 65444 ], "mapped", [ 4354 ] ], [ [ 65445, 65445 ], "mapped", [ 4524 ] ], [ [ 65446, 65446 ], "mapped", [ 4525 ] ], [ [ 65447, 65447 ], "mapped", [ 4355 ] ], [ [ 65448, 65448 ], "mapped", [ 4356 ] ], [ [ 65449, 65449 ], "mapped", [ 4357 ] ], [ [ 65450, 65450 ], "mapped", [ 4528 ] ], [ [ 65451, 65451 ], "mapped", [ 4529 ] ], [ [ 65452, 65452 ], "mapped", [ 4530 ] ], [ [ 65453, 65453 ], "mapped", [ 4531 ] ], [ [ 65454, 65454 ], "mapped", [ 4532 ] ], [ [ 65455, 65455 ], "mapped", [ 4533 ] ], [ [ 65456, 65456 ], "mapped", [ 4378 ] ], [ [ 65457, 65457 ], "mapped", [ 4358 ] ], [ [ 65458, 65458 ], "mapped", [ 4359 ] ], [ [ 65459, 65459 ], "mapped", [ 4360 ] ], [ [ 65460, 65460 ], "mapped", [ 4385 ] ], [ [ 65461, 65461 ], "mapped", [ 4361 ] ], [ [ 65462, 65462 ], "mapped", [ 4362 ] ], [ [ 65463, 65463 ], "mapped", [ 4363 ] ], [ [ 65464, 65464 ], "mapped", [ 4364 ] ], [ [ 65465, 65465 ], "mapped", [ 4365 ] ], [ [ 65466, 65466 ], "mapped", [ 4366 ] ], [ [ 65467, 65467 ], "mapped", [ 4367 ] ], [ [ 65468, 65468 ], "mapped", [ 4368 ] ], [ [ 65469, 65469 ], "mapped", [ 4369 ] ], [ [ 65470, 65470 ], "mapped", [ 4370 ] ], [ [ 65471, 65473 ], "disallowed" ], [ [ 65474, 65474 ], "mapped", [ 4449 ] ], [ [ 65475, 65475 ], "mapped", [ 4450 ] ], [ [ 65476, 65476 ], "mapped", [ 4451 ] ], [ [ 65477, 65477 ], "mapped", [ 4452 ] ], [ [ 65478, 65478 ], "mapped", [ 4453 ] ], [ [ 65479, 65479 ], "mapped", [ 4454 ] ], [ [ 65480, 65481 ], "disallowed" ], [ [ 65482, 65482 ], "mapped", [ 4455 ] ], [ [ 65483, 65483 ], "mapped", [ 4456 ] ], [ [ 65484, 65484 ], "mapped", [ 4457 ] ], [ [ 65485, 65485 ], "mapped", [ 4458 ] ], [ [ 65486, 65486 ], "mapped", [ 4459 ] ], [ [ 65487, 65487 ], "mapped", [ 4460 ] ], [ [ 65488, 65489 ], "disallowed" ], [ [ 65490, 65490 ], "mapped", [ 4461 ] ], [ [ 65491, 65491 ], "mapped", [ 4462 ] ], [ [ 65492, 65492 ], "mapped", [ 4463 ] ], [ [ 65493, 65493 ], "mapped", [ 4464 ] ], [ [ 65494, 65494 ], "mapped", [ 4465 ] ], [ [ 65495, 65495 ], "mapped", [ 4466 ] ], [ [ 65496, 65497 ], "disallowed" ], [ [ 65498, 65498 ], "mapped", [ 4467 ] ], [ [ 65499, 65499 ], "mapped", [ 4468 ] ], [ [ 65500, 65500 ], "mapped", [ 4469 ] ], [ [ 65501, 65503 ], "disallowed" ], [ [ 65504, 65504 ], "mapped", [ 162 ] ], [ [ 65505, 65505 ], "mapped", [ 163 ] ], [ [ 65506, 65506 ], "mapped", [ 172 ] ], [ [ 65507, 65507 ], "disallowed_STD3_mapped", [ 32, 772 ] ], [ [ 65508, 65508 ], "mapped", [ 166 ] ], [ [ 65509, 65509 ], "mapped", [ 165 ] ], [ [ 65510, 65510 ], "mapped", [ 8361 ] ], [ [ 65511, 65511 ], "disallowed" ], [ [ 65512, 65512 ], "mapped", [ 9474 ] ], [ [ 65513, 65513 ], "mapped", [ 8592 ] ], [ [ 65514, 65514 ], "mapped", [ 8593 ] ], [ [ 65515, 65515 ], "mapped", [ 8594 ] ], [ [ 65516, 65516 ], "mapped", [ 8595 ] ], [ [ 65517, 65517 ], "mapped", [ 9632 ] ], [ [ 65518, 65518 ], "mapped", [ 9675 ] ], [ [ 65519, 65528 ], "disallowed" ], [ [ 65529, 65531 ], "disallowed" ], [ [ 65532, 65532 ], "disallowed" ], [ [ 65533, 65533 ], "disallowed" ], [ [ 65534, 65535 ], "disallowed" ], [ [ 65536, 65547 ], "valid" ], [ [ 65548, 65548 ], "disallowed" ], [ [ 65549, 65574 ], "valid" ], [ [ 65575, 65575 ], "disallowed" ], [ [ 65576, 65594 ], "valid" ], [ [ 65595, 65595 ], "disallowed" ], [ [ 65596, 65597 ], "valid" ], [ [ 65598, 65598 ], "disallowed" ], [ [ 65599, 65613 ], "valid" ], [ [ 65614, 65615 ], "disallowed" ], [ [ 65616, 65629 ], "valid" ], [ [ 65630, 65663 ], "disallowed" ], [ [ 65664, 65786 ], "valid" ], [ [ 65787, 65791 ], "disallowed" ], [ [ 65792, 65794 ], "valid", [ ], "NV8" ], [ [ 65795, 65798 ], "disallowed" ], [ [ 65799, 65843 ], "valid", [ ], "NV8" ], [ [ 65844, 65846 ], "disallowed" ], [ [ 65847, 65855 ], "valid", [ ], "NV8" ], [ [ 65856, 65930 ], "valid", [ ], "NV8" ], [ [ 65931, 65932 ], "valid", [ ], "NV8" ], [ [ 65933, 65935 ], "disallowed" ], [ [ 65936, 65947 ], "valid", [ ], "NV8" ], [ [ 65948, 65951 ], "disallowed" ], [ [ 65952, 65952 ], "valid", [ ], "NV8" ], [ [ 65953, 65999 ], "disallowed" ], [ [ 66000, 66044 ], "valid", [ ], "NV8" ], [ [ 66045, 66045 ], "valid" ], [ [ 66046, 66175 ], "disallowed" ], [ [ 66176, 66204 ], "valid" ], [ [ 66205, 66207 ], "disallowed" ], [ [ 66208, 66256 ], "valid" ], [ [ 66257, 66271 ], "disallowed" ], [ [ 66272, 66272 ], "valid" ], [ [ 66273, 66299 ], "valid", [ ], "NV8" ], [ [ 66300, 66303 ], "disallowed" ], [ [ 66304, 66334 ], "valid" ], [ [ 66335, 66335 ], "valid" ], [ [ 66336, 66339 ], "valid", [ ], "NV8" ], [ [ 66340, 66351 ], "disallowed" ], [ [ 66352, 66368 ], "valid" ], [ [ 66369, 66369 ], "valid", [ ], "NV8" ], [ [ 66370, 66377 ], "valid" ], [ [ 66378, 66378 ], "valid", [ ], "NV8" ], [ [ 66379, 66383 ], "disallowed" ], [ [ 66384, 66426 ], "valid" ], [ [ 66427, 66431 ], "disallowed" ], [ [ 66432, 66461 ], "valid" ], [ [ 66462, 66462 ], "disallowed" ], [ [ 66463, 66463 ], "valid", [ ], "NV8" ], [ [ 66464, 66499 ], "valid" ], [ [ 66500, 66503 ], "disallowed" ], [ [ 66504, 66511 ], "valid" ], [ [ 66512, 66517 ], "valid", [ ], "NV8" ], [ [ 66518, 66559 ], "disallowed" ], [ [ 66560, 66560 ], "mapped", [ 66600 ] ], [ [ 66561, 66561 ], "mapped", [ 66601 ] ], [ [ 66562, 66562 ], "mapped", [ 66602 ] ], [ [ 66563, 66563 ], "mapped", [ 66603 ] ], [ [ 66564, 66564 ], "mapped", [ 66604 ] ], [ [ 66565, 66565 ], "mapped", [ 66605 ] ], [ [ 66566, 66566 ], "mapped", [ 66606 ] ], [ [ 66567, 66567 ], "mapped", [ 66607 ] ], [ [ 66568, 66568 ], "mapped", [ 66608 ] ], [ [ 66569, 66569 ], "mapped", [ 66609 ] ], [ [ 66570, 66570 ], "mapped", [ 66610 ] ], [ [ 66571, 66571 ], "mapped", [ 66611 ] ], [ [ 66572, 66572 ], "mapped", [ 66612 ] ], [ [ 66573, 66573 ], "mapped", [ 66613 ] ], [ [ 66574, 66574 ], "mapped", [ 66614 ] ], [ [ 66575, 66575 ], "mapped", [ 66615 ] ], [ [ 66576, 66576 ], "mapped", [ 66616 ] ], [ [ 66577, 66577 ], "mapped", [ 66617 ] ], [ [ 66578, 66578 ], "mapped", [ 66618 ] ], [ [ 66579, 66579 ], "mapped", [ 66619 ] ], [ [ 66580, 66580 ], "mapped", [ 66620 ] ], [ [ 66581, 66581 ], "mapped", [ 66621 ] ], [ [ 66582, 66582 ], "mapped", [ 66622 ] ], [ [ 66583, 66583 ], "mapped", [ 66623 ] ], [ [ 66584, 66584 ], "mapped", [ 66624 ] ], [ [ 66585, 66585 ], "mapped", [ 66625 ] ], [ [ 66586, 66586 ], "mapped", [ 66626 ] ], [ [ 66587, 66587 ], "mapped", [ 66627 ] ], [ [ 66588, 66588 ], "mapped", [ 66628 ] ], [ [ 66589, 66589 ], "mapped", [ 66629 ] ], [ [ 66590, 66590 ], "mapped", [ 66630 ] ], [ [ 66591, 66591 ], "mapped", [ 66631 ] ], [ [ 66592, 66592 ], "mapped", [ 66632 ] ], [ [ 66593, 66593 ], "mapped", [ 66633 ] ], [ [ 66594, 66594 ], "mapped", [ 66634 ] ], [ [ 66595, 66595 ], "mapped", [ 66635 ] ], [ [ 66596, 66596 ], "mapped", [ 66636 ] ], [ [ 66597, 66597 ], "mapped", [ 66637 ] ], [ [ 66598, 66598 ], "mapped", [ 66638 ] ], [ [ 66599, 66599 ], "mapped", [ 66639 ] ], [ [ 66600, 66637 ], "valid" ], [ [ 66638, 66717 ], "valid" ], [ [ 66718, 66719 ], "disallowed" ], [ [ 66720, 66729 ], "valid" ], [ [ 66730, 66815 ], "disallowed" ], [ [ 66816, 66855 ], "valid" ], [ [ 66856, 66863 ], "disallowed" ], [ [ 66864, 66915 ], "valid" ], [ [ 66916, 66926 ], "disallowed" ], [ [ 66927, 66927 ], "valid", [ ], "NV8" ], [ [ 66928, 67071 ], "disallowed" ], [ [ 67072, 67382 ], "valid" ], [ [ 67383, 67391 ], "disallowed" ], [ [ 67392, 67413 ], "valid" ], [ [ 67414, 67423 ], "disallowed" ], [ [ 67424, 67431 ], "valid" ], [ [ 67432, 67583 ], "disallowed" ], [ [ 67584, 67589 ], "valid" ], [ [ 67590, 67591 ], "disallowed" ], [ [ 67592, 67592 ], "valid" ], [ [ 67593, 67593 ], "disallowed" ], [ [ 67594, 67637 ], "valid" ], [ [ 67638, 67638 ], "disallowed" ], [ [ 67639, 67640 ], "valid" ], [ [ 67641, 67643 ], "disallowed" ], [ [ 67644, 67644 ], "valid" ], [ [ 67645, 67646 ], "disallowed" ], [ [ 67647, 67647 ], "valid" ], [ [ 67648, 67669 ], "valid" ], [ [ 67670, 67670 ], "disallowed" ], [ [ 67671, 67679 ], "valid", [ ], "NV8" ], [ [ 67680, 67702 ], "valid" ], [ [ 67703, 67711 ], "valid", [ ], "NV8" ], [ [ 67712, 67742 ], "valid" ], [ [ 67743, 67750 ], "disallowed" ], [ [ 67751, 67759 ], "valid", [ ], "NV8" ], [ [ 67760, 67807 ], "disallowed" ], [ [ 67808, 67826 ], "valid" ], [ [ 67827, 67827 ], "disallowed" ], [ [ 67828, 67829 ], "valid" ], [ [ 67830, 67834 ], "disallowed" ], [ [ 67835, 67839 ], "valid", [ ], "NV8" ], [ [ 67840, 67861 ], "valid" ], [ [ 67862, 67865 ], "valid", [ ], "NV8" ], [ [ 67866, 67867 ], "valid", [ ], "NV8" ], [ [ 67868, 67870 ], "disallowed" ], [ [ 67871, 67871 ], "valid", [ ], "NV8" ], [ [ 67872, 67897 ], "valid" ], [ [ 67898, 67902 ], "disallowed" ], [ [ 67903, 67903 ], "valid", [ ], "NV8" ], [ [ 67904, 67967 ], "disallowed" ], [ [ 67968, 68023 ], "valid" ], [ [ 68024, 68027 ], "disallowed" ], [ [ 68028, 68029 ], "valid", [ ], "NV8" ], [ [ 68030, 68031 ], "valid" ], [ [ 68032, 68047 ], "valid", [ ], "NV8" ], [ [ 68048, 68049 ], "disallowed" ], [ [ 68050, 68095 ], "valid", [ ], "NV8" ], [ [ 68096, 68099 ], "valid" ], [ [ 68100, 68100 ], "disallowed" ], [ [ 68101, 68102 ], "valid" ], [ [ 68103, 68107 ], "disallowed" ], [ [ 68108, 68115 ], "valid" ], [ [ 68116, 68116 ], "disallowed" ], [ [ 68117, 68119 ], "valid" ], [ [ 68120, 68120 ], "disallowed" ], [ [ 68121, 68147 ], "valid" ], [ [ 68148, 68151 ], "disallowed" ], [ [ 68152, 68154 ], "valid" ], [ [ 68155, 68158 ], "disallowed" ], [ [ 68159, 68159 ], "valid" ], [ [ 68160, 68167 ], "valid", [ ], "NV8" ], [ [ 68168, 68175 ], "disallowed" ], [ [ 68176, 68184 ], "valid", [ ], "NV8" ], [ [ 68185, 68191 ], "disallowed" ], [ [ 68192, 68220 ], "valid" ], [ [ 68221, 68223 ], "valid", [ ], "NV8" ], [ [ 68224, 68252 ], "valid" ], [ [ 68253, 68255 ], "valid", [ ], "NV8" ], [ [ 68256, 68287 ], "disallowed" ], [ [ 68288, 68295 ], "valid" ], [ [ 68296, 68296 ], "valid", [ ], "NV8" ], [ [ 68297, 68326 ], "valid" ], [ [ 68327, 68330 ], "disallowed" ], [ [ 68331, 68342 ], "valid", [ ], "NV8" ], [ [ 68343, 68351 ], "disallowed" ], [ [ 68352, 68405 ], "valid" ], [ [ 68406, 68408 ], "disallowed" ], [ [ 68409, 68415 ], "valid", [ ], "NV8" ], [ [ 68416, 68437 ], "valid" ], [ [ 68438, 68439 ], "disallowed" ], [ [ 68440, 68447 ], "valid", [ ], "NV8" ], [ [ 68448, 68466 ], "valid" ], [ [ 68467, 68471 ], "disallowed" ], [ [ 68472, 68479 ], "valid", [ ], "NV8" ], [ [ 68480, 68497 ], "valid" ], [ [ 68498, 68504 ], "disallowed" ], [ [ 68505, 68508 ], "valid", [ ], "NV8" ], [ [ 68509, 68520 ], "disallowed" ], [ [ 68521, 68527 ], "valid", [ ], "NV8" ], [ [ 68528, 68607 ], "disallowed" ], [ [ 68608, 68680 ], "valid" ], [ [ 68681, 68735 ], "disallowed" ], [ [ 68736, 68736 ], "mapped", [ 68800 ] ], [ [ 68737, 68737 ], "mapped", [ 68801 ] ], [ [ 68738, 68738 ], "mapped", [ 68802 ] ], [ [ 68739, 68739 ], "mapped", [ 68803 ] ], [ [ 68740, 68740 ], "mapped", [ 68804 ] ], [ [ 68741, 68741 ], "mapped", [ 68805 ] ], [ [ 68742, 68742 ], "mapped", [ 68806 ] ], [ [ 68743, 68743 ], "mapped", [ 68807 ] ], [ [ 68744, 68744 ], "mapped", [ 68808 ] ], [ [ 68745, 68745 ], "mapped", [ 68809 ] ], [ [ 68746, 68746 ], "mapped", [ 68810 ] ], [ [ 68747, 68747 ], "mapped", [ 68811 ] ], [ [ 68748, 68748 ], "mapped", [ 68812 ] ], [ [ 68749, 68749 ], "mapped", [ 68813 ] ], [ [ 68750, 68750 ], "mapped", [ 68814 ] ], [ [ 68751, 68751 ], "mapped", [ 68815 ] ], [ [ 68752, 68752 ], "mapped", [ 68816 ] ], [ [ 68753, 68753 ], "mapped", [ 68817 ] ], [ [ 68754, 68754 ], "mapped", [ 68818 ] ], [ [ 68755, 68755 ], "mapped", [ 68819 ] ], [ [ 68756, 68756 ], "mapped", [ 68820 ] ], [ [ 68757, 68757 ], "mapped", [ 68821 ] ], [ [ 68758, 68758 ], "mapped", [ 68822 ] ], [ [ 68759, 68759 ], "mapped", [ 68823 ] ], [ [ 68760, 68760 ], "mapped", [ 68824 ] ], [ [ 68761, 68761 ], "mapped", [ 68825 ] ], [ [ 68762, 68762 ], "mapped", [ 68826 ] ], [ [ 68763, 68763 ], "mapped", [ 68827 ] ], [ [ 68764, 68764 ], "mapped", [ 68828 ] ], [ [ 68765, 68765 ], "mapped", [ 68829 ] ], [ [ 68766, 68766 ], "mapped", [ 68830 ] ], [ [ 68767, 68767 ], "mapped", [ 68831 ] ], [ [ 68768, 68768 ], "mapped", [ 68832 ] ], [ [ 68769, 68769 ], "mapped", [ 68833 ] ], [ [ 68770, 68770 ], "mapped", [ 68834 ] ], [ [ 68771, 68771 ], "mapped", [ 68835 ] ], [ [ 68772, 68772 ], "mapped", [ 68836 ] ], [ [ 68773, 68773 ], "mapped", [ 68837 ] ], [ [ 68774, 68774 ], "mapped", [ 68838 ] ], [ [ 68775, 68775 ], "mapped", [ 68839 ] ], [ [ 68776, 68776 ], "mapped", [ 68840 ] ], [ [ 68777, 68777 ], "mapped", [ 68841 ] ], [ [ 68778, 68778 ], "mapped", [ 68842 ] ], [ [ 68779, 68779 ], "mapped", [ 68843 ] ], [ [ 68780, 68780 ], "mapped", [ 68844 ] ], [ [ 68781, 68781 ], "mapped", [ 68845 ] ], [ [ 68782, 68782 ], "mapped", [ 68846 ] ], [ [ 68783, 68783 ], "mapped", [ 68847 ] ], [ [ 68784, 68784 ], "mapped", [ 68848 ] ], [ [ 68785, 68785 ], "mapped", [ 68849 ] ], [ [ 68786, 68786 ], "mapped", [ 68850 ] ], [ [ 68787, 68799 ], "disallowed" ], [ [ 68800, 68850 ], "valid" ], [ [ 68851, 68857 ], "disallowed" ], [ [ 68858, 68863 ], "valid", [ ], "NV8" ], [ [ 68864, 69215 ], "disallowed" ], [ [ 69216, 69246 ], "valid", [ ], "NV8" ], [ [ 69247, 69631 ], "disallowed" ], [ [ 69632, 69702 ], "valid" ], [ [ 69703, 69709 ], "valid", [ ], "NV8" ], [ [ 69710, 69713 ], "disallowed" ], [ [ 69714, 69733 ], "valid", [ ], "NV8" ], [ [ 69734, 69743 ], "valid" ], [ [ 69744, 69758 ], "disallowed" ], [ [ 69759, 69759 ], "valid" ], [ [ 69760, 69818 ], "valid" ], [ [ 69819, 69820 ], "valid", [ ], "NV8" ], [ [ 69821, 69821 ], "disallowed" ], [ [ 69822, 69825 ], "valid", [ ], "NV8" ], [ [ 69826, 69839 ], "disallowed" ], [ [ 69840, 69864 ], "valid" ], [ [ 69865, 69871 ], "disallowed" ], [ [ 69872, 69881 ], "valid" ], [ [ 69882, 69887 ], "disallowed" ], [ [ 69888, 69940 ], "valid" ], [ [ 69941, 69941 ], "disallowed" ], [ [ 69942, 69951 ], "valid" ], [ [ 69952, 69955 ], "valid", [ ], "NV8" ], [ [ 69956, 69967 ], "disallowed" ], [ [ 69968, 70003 ], "valid" ], [ [ 70004, 70005 ], "valid", [ ], "NV8" ], [ [ 70006, 70006 ], "valid" ], [ [ 70007, 70015 ], "disallowed" ], [ [ 70016, 70084 ], "valid" ], [ [ 70085, 70088 ], "valid", [ ], "NV8" ], [ [ 70089, 70089 ], "valid", [ ], "NV8" ], [ [ 70090, 70092 ], "valid" ], [ [ 70093, 70093 ], "valid", [ ], "NV8" ], [ [ 70094, 70095 ], "disallowed" ], [ [ 70096, 70105 ], "valid" ], [ [ 70106, 70106 ], "valid" ], [ [ 70107, 70107 ], "valid", [ ], "NV8" ], [ [ 70108, 70108 ], "valid" ], [ [ 70109, 70111 ], "valid", [ ], "NV8" ], [ [ 70112, 70112 ], "disallowed" ], [ [ 70113, 70132 ], "valid", [ ], "NV8" ], [ [ 70133, 70143 ], "disallowed" ], [ [ 70144, 70161 ], "valid" ], [ [ 70162, 70162 ], "disallowed" ], [ [ 70163, 70199 ], "valid" ], [ [ 70200, 70205 ], "valid", [ ], "NV8" ], [ [ 70206, 70271 ], "disallowed" ], [ [ 70272, 70278 ], "valid" ], [ [ 70279, 70279 ], "disallowed" ], [ [ 70280, 70280 ], "valid" ], [ [ 70281, 70281 ], "disallowed" ], [ [ 70282, 70285 ], "valid" ], [ [ 70286, 70286 ], "disallowed" ], [ [ 70287, 70301 ], "valid" ], [ [ 70302, 70302 ], "disallowed" ], [ [ 70303, 70312 ], "valid" ], [ [ 70313, 70313 ], "valid", [ ], "NV8" ], [ [ 70314, 70319 ], "disallowed" ], [ [ 70320, 70378 ], "valid" ], [ [ 70379, 70383 ], "disallowed" ], [ [ 70384, 70393 ], "valid" ], [ [ 70394, 70399 ], "disallowed" ], [ [ 70400, 70400 ], "valid" ], [ [ 70401, 70403 ], "valid" ], [ [ 70404, 70404 ], "disallowed" ], [ [ 70405, 70412 ], "valid" ], [ [ 70413, 70414 ], "disallowed" ], [ [ 70415, 70416 ], "valid" ], [ [ 70417, 70418 ], "disallowed" ], [ [ 70419, 70440 ], "valid" ], [ [ 70441, 70441 ], "disallowed" ], [ [ 70442, 70448 ], "valid" ], [ [ 70449, 70449 ], "disallowed" ], [ [ 70450, 70451 ], "valid" ], [ [ 70452, 70452 ], "disallowed" ], [ [ 70453, 70457 ], "valid" ], [ [ 70458, 70459 ], "disallowed" ], [ [ 70460, 70468 ], "valid" ], [ [ 70469, 70470 ], "disallowed" ], [ [ 70471, 70472 ], "valid" ], [ [ 70473, 70474 ], "disallowed" ], [ [ 70475, 70477 ], "valid" ], [ [ 70478, 70479 ], "disallowed" ], [ [ 70480, 70480 ], "valid" ], [ [ 70481, 70486 ], "disallowed" ], [ [ 70487, 70487 ], "valid" ], [ [ 70488, 70492 ], "disallowed" ], [ [ 70493, 70499 ], "valid" ], [ [ 70500, 70501 ], "disallowed" ], [ [ 70502, 70508 ], "valid" ], [ [ 70509, 70511 ], "disallowed" ], [ [ 70512, 70516 ], "valid" ], [ [ 70517, 70783 ], "disallowed" ], [ [ 70784, 70853 ], "valid" ], [ [ 70854, 70854 ], "valid", [ ], "NV8" ], [ [ 70855, 70855 ], "valid" ], [ [ 70856, 70863 ], "disallowed" ], [ [ 70864, 70873 ], "valid" ], [ [ 70874, 71039 ], "disallowed" ], [ [ 71040, 71093 ], "valid" ], [ [ 71094, 71095 ], "disallowed" ], [ [ 71096, 71104 ], "valid" ], [ [ 71105, 71113 ], "valid", [ ], "NV8" ], [ [ 71114, 71127 ], "valid", [ ], "NV8" ], [ [ 71128, 71133 ], "valid" ], [ [ 71134, 71167 ], "disallowed" ], [ [ 71168, 71232 ], "valid" ], [ [ 71233, 71235 ], "valid", [ ], "NV8" ], [ [ 71236, 71236 ], "valid" ], [ [ 71237, 71247 ], "disallowed" ], [ [ 71248, 71257 ], "valid" ], [ [ 71258, 71295 ], "disallowed" ], [ [ 71296, 71351 ], "valid" ], [ [ 71352, 71359 ], "disallowed" ], [ [ 71360, 71369 ], "valid" ], [ [ 71370, 71423 ], "disallowed" ], [ [ 71424, 71449 ], "valid" ], [ [ 71450, 71452 ], "disallowed" ], [ [ 71453, 71467 ], "valid" ], [ [ 71468, 71471 ], "disallowed" ], [ [ 71472, 71481 ], "valid" ], [ [ 71482, 71487 ], "valid", [ ], "NV8" ], [ [ 71488, 71839 ], "disallowed" ], [ [ 71840, 71840 ], "mapped", [ 71872 ] ], [ [ 71841, 71841 ], "mapped", [ 71873 ] ], [ [ 71842, 71842 ], "mapped", [ 71874 ] ], [ [ 71843, 71843 ], "mapped", [ 71875 ] ], [ [ 71844, 71844 ], "mapped", [ 71876 ] ], [ [ 71845, 71845 ], "mapped", [ 71877 ] ], [ [ 71846, 71846 ], "mapped", [ 71878 ] ], [ [ 71847, 71847 ], "mapped", [ 71879 ] ], [ [ 71848, 71848 ], "mapped", [ 71880 ] ], [ [ 71849, 71849 ], "mapped", [ 71881 ] ], [ [ 71850, 71850 ], "mapped", [ 71882 ] ], [ [ 71851, 71851 ], "mapped", [ 71883 ] ], [ [ 71852, 71852 ], "mapped", [ 71884 ] ], [ [ 71853, 71853 ], "mapped", [ 71885 ] ], [ [ 71854, 71854 ], "mapped", [ 71886 ] ], [ [ 71855, 71855 ], "mapped", [ 71887 ] ], [ [ 71856, 71856 ], "mapped", [ 71888 ] ], [ [ 71857, 71857 ], "mapped", [ 71889 ] ], [ [ 71858, 71858 ], "mapped", [ 71890 ] ], [ [ 71859, 71859 ], "mapped", [ 71891 ] ], [ [ 71860, 71860 ], "mapped", [ 71892 ] ], [ [ 71861, 71861 ], "mapped", [ 71893 ] ], [ [ 71862, 71862 ], "mapped", [ 71894 ] ], [ [ 71863, 71863 ], "mapped", [ 71895 ] ], [ [ 71864, 71864 ], "mapped", [ 71896 ] ], [ [ 71865, 71865 ], "mapped", [ 71897 ] ], [ [ 71866, 71866 ], "mapped", [ 71898 ] ], [ [ 71867, 71867 ], "mapped", [ 71899 ] ], [ [ 71868, 71868 ], "mapped", [ 71900 ] ], [ [ 71869, 71869 ], "mapped", [ 71901 ] ], [ [ 71870, 71870 ], "mapped", [ 71902 ] ], [ [ 71871, 71871 ], "mapped", [ 71903 ] ], [ [ 71872, 71913 ], "valid" ], [ [ 71914, 71922 ], "valid", [ ], "NV8" ], [ [ 71923, 71934 ], "disallowed" ], [ [ 71935, 71935 ], "valid" ], [ [ 71936, 72383 ], "disallowed" ], [ [ 72384, 72440 ], "valid" ], [ [ 72441, 73727 ], "disallowed" ], [ [ 73728, 74606 ], "valid" ], [ [ 74607, 74648 ], "valid" ], [ [ 74649, 74649 ], "valid" ], [ [ 74650, 74751 ], "disallowed" ], [ [ 74752, 74850 ], "valid", [ ], "NV8" ], [ [ 74851, 74862 ], "valid", [ ], "NV8" ], [ [ 74863, 74863 ], "disallowed" ], [ [ 74864, 74867 ], "valid", [ ], "NV8" ], [ [ 74868, 74868 ], "valid", [ ], "NV8" ], [ [ 74869, 74879 ], "disallowed" ], [ [ 74880, 75075 ], "valid" ], [ [ 75076, 77823 ], "disallowed" ], [ [ 77824, 78894 ], "valid" ], [ [ 78895, 82943 ], "disallowed" ], [ [ 82944, 83526 ], "valid" ], [ [ 83527, 92159 ], "disallowed" ], [ [ 92160, 92728 ], "valid" ], [ [ 92729, 92735 ], "disallowed" ], [ [ 92736, 92766 ], "valid" ], [ [ 92767, 92767 ], "disallowed" ], [ [ 92768, 92777 ], "valid" ], [ [ 92778, 92781 ], "disallowed" ], [ [ 92782, 92783 ], "valid", [ ], "NV8" ], [ [ 92784, 92879 ], "disallowed" ], [ [ 92880, 92909 ], "valid" ], [ [ 92910, 92911 ], "disallowed" ], [ [ 92912, 92916 ], "valid" ], [ [ 92917, 92917 ], "valid", [ ], "NV8" ], [ [ 92918, 92927 ], "disallowed" ], [ [ 92928, 92982 ], "valid" ], [ [ 92983, 92991 ], "valid", [ ], "NV8" ], [ [ 92992, 92995 ], "valid" ], [ [ 92996, 92997 ], "valid", [ ], "NV8" ], [ [ 92998, 93007 ], "disallowed" ], [ [ 93008, 93017 ], "valid" ], [ [ 93018, 93018 ], "disallowed" ], [ [ 93019, 93025 ], "valid", [ ], "NV8" ], [ [ 93026, 93026 ], "disallowed" ], [ [ 93027, 93047 ], "valid" ], [ [ 93048, 93052 ], "disallowed" ], [ [ 93053, 93071 ], "valid" ], [ [ 93072, 93951 ], "disallowed" ], [ [ 93952, 94020 ], "valid" ], [ [ 94021, 94031 ], "disallowed" ], [ [ 94032, 94078 ], "valid" ], [ [ 94079, 94094 ], "disallowed" ], [ [ 94095, 94111 ], "valid" ], [ [ 94112, 110591 ], "disallowed" ], [ [ 110592, 110593 ], "valid" ], [ [ 110594, 113663 ], "disallowed" ], [ [ 113664, 113770 ], "valid" ], [ [ 113771, 113775 ], "disallowed" ], [ [ 113776, 113788 ], "valid" ], [ [ 113789, 113791 ], "disallowed" ], [ [ 113792, 113800 ], "valid" ], [ [ 113801, 113807 ], "disallowed" ], [ [ 113808, 113817 ], "valid" ], [ [ 113818, 113819 ], "disallowed" ], [ [ 113820, 113820 ], "valid", [ ], "NV8" ], [ [ 113821, 113822 ], "valid" ], [ [ 113823, 113823 ], "valid", [ ], "NV8" ], [ [ 113824, 113827 ], "ignored" ], [ [ 113828, 118783 ], "disallowed" ], [ [ 118784, 119029 ], "valid", [ ], "NV8" ], [ [ 119030, 119039 ], "disallowed" ], [ [ 119040, 119078 ], "valid", [ ], "NV8" ], [ [ 119079, 119080 ], "disallowed" ], [ [ 119081, 119081 ], "valid", [ ], "NV8" ], [ [ 119082, 119133 ], "valid", [ ], "NV8" ], [ [ 119134, 119134 ], "mapped", [ 119127, 119141 ] ], [ [ 119135, 119135 ], "mapped", [ 119128, 119141 ] ], [ [ 119136, 119136 ], "mapped", [ 119128, 119141, 119150 ] ], [ [ 119137, 119137 ], "mapped", [ 119128, 119141, 119151 ] ], [ [ 119138, 119138 ], "mapped", [ 119128, 119141, 119152 ] ], [ [ 119139, 119139 ], "mapped", [ 119128, 119141, 119153 ] ], [ [ 119140, 119140 ], "mapped", [ 119128, 119141, 119154 ] ], [ [ 119141, 119154 ], "valid", [ ], "NV8" ], [ [ 119155, 119162 ], "disallowed" ], [ [ 119163, 119226 ], "valid", [ ], "NV8" ], [ [ 119227, 119227 ], "mapped", [ 119225, 119141 ] ], [ [ 119228, 119228 ], "mapped", [ 119226, 119141 ] ], [ [ 119229, 119229 ], "mapped", [ 119225, 119141, 119150 ] ], [ [ 119230, 119230 ], "mapped", [ 119226, 119141, 119150 ] ], [ [ 119231, 119231 ], "mapped", [ 119225, 119141, 119151 ] ], [ [ 119232, 119232 ], "mapped", [ 119226, 119141, 119151 ] ], [ [ 119233, 119261 ], "valid", [ ], "NV8" ], [ [ 119262, 119272 ], "valid", [ ], "NV8" ], [ [ 119273, 119295 ], "disallowed" ], [ [ 119296, 119365 ], "valid", [ ], "NV8" ], [ [ 119366, 119551 ], "disallowed" ], [ [ 119552, 119638 ], "valid", [ ], "NV8" ], [ [ 119639, 119647 ], "disallowed" ], [ [ 119648, 119665 ], "valid", [ ], "NV8" ], [ [ 119666, 119807 ], "disallowed" ], [ [ 119808, 119808 ], "mapped", [ 97 ] ], [ [ 119809, 119809 ], "mapped", [ 98 ] ], [ [ 119810, 119810 ], "mapped", [ 99 ] ], [ [ 119811, 119811 ], "mapped", [ 100 ] ], [ [ 119812, 119812 ], "mapped", [ 101 ] ], [ [ 119813, 119813 ], "mapped", [ 102 ] ], [ [ 119814, 119814 ], "mapped", [ 103 ] ], [ [ 119815, 119815 ], "mapped", [ 104 ] ], [ [ 119816, 119816 ], "mapped", [ 105 ] ], [ [ 119817, 119817 ], "mapped", [ 106 ] ], [ [ 119818, 119818 ], "mapped", [ 107 ] ], [ [ 119819, 119819 ], "mapped", [ 108 ] ], [ [ 119820, 119820 ], "mapped", [ 109 ] ], [ [ 119821, 119821 ], "mapped", [ 110 ] ], [ [ 119822, 119822 ], "mapped", [ 111 ] ], [ [ 119823, 119823 ], "mapped", [ 112 ] ], [ [ 119824, 119824 ], "mapped", [ 113 ] ], [ [ 119825, 119825 ], "mapped", [ 114 ] ], [ [ 119826, 119826 ], "mapped", [ 115 ] ], [ [ 119827, 119827 ], "mapped", [ 116 ] ], [ [ 119828, 119828 ], "mapped", [ 117 ] ], [ [ 119829, 119829 ], "mapped", [ 118 ] ], [ [ 119830, 119830 ], "mapped", [ 119 ] ], [ [ 119831, 119831 ], "mapped", [ 120 ] ], [ [ 119832, 119832 ], "mapped", [ 121 ] ], [ [ 119833, 119833 ], "mapped", [ 122 ] ], [ [ 119834, 119834 ], "mapped", [ 97 ] ], [ [ 119835, 119835 ], "mapped", [ 98 ] ], [ [ 119836, 119836 ], "mapped", [ 99 ] ], [ [ 119837, 119837 ], "mapped", [ 100 ] ], [ [ 119838, 119838 ], "mapped", [ 101 ] ], [ [ 119839, 119839 ], "mapped", [ 102 ] ], [ [ 119840, 119840 ], "mapped", [ 103 ] ], [ [ 119841, 119841 ], "mapped", [ 104 ] ], [ [ 119842, 119842 ], "mapped", [ 105 ] ], [ [ 119843, 119843 ], "mapped", [ 106 ] ], [ [ 119844, 119844 ], "mapped", [ 107 ] ], [ [ 119845, 119845 ], "mapped", [ 108 ] ], [ [ 119846, 119846 ], "mapped", [ 109 ] ], [ [ 119847, 119847 ], "mapped", [ 110 ] ], [ [ 119848, 119848 ], "mapped", [ 111 ] ], [ [ 119849, 119849 ], "mapped", [ 112 ] ], [ [ 119850, 119850 ], "mapped", [ 113 ] ], [ [ 119851, 119851 ], "mapped", [ 114 ] ], [ [ 119852, 119852 ], "mapped", [ 115 ] ], [ [ 119853, 119853 ], "mapped", [ 116 ] ], [ [ 119854, 119854 ], "mapped", [ 117 ] ], [ [ 119855, 119855 ], "mapped", [ 118 ] ], [ [ 119856, 119856 ], "mapped", [ 119 ] ], [ [ 119857, 119857 ], "mapped", [ 120 ] ], [ [ 119858, 119858 ], "mapped", [ 121 ] ], [ [ 119859, 119859 ], "mapped", [ 122 ] ], [ [ 119860, 119860 ], "mapped", [ 97 ] ], [ [ 119861, 119861 ], "mapped", [ 98 ] ], [ [ 119862, 119862 ], "mapped", [ 99 ] ], [ [ 119863, 119863 ], "mapped", [ 100 ] ], [ [ 119864, 119864 ], "mapped", [ 101 ] ], [ [ 119865, 119865 ], "mapped", [ 102 ] ], [ [ 119866, 119866 ], "mapped", [ 103 ] ], [ [ 119867, 119867 ], "mapped", [ 104 ] ], [ [ 119868, 119868 ], "mapped", [ 105 ] ], [ [ 119869, 119869 ], "mapped", [ 106 ] ], [ [ 119870, 119870 ], "mapped", [ 107 ] ], [ [ 119871, 119871 ], "mapped", [ 108 ] ], [ [ 119872, 119872 ], "mapped", [ 109 ] ], [ [ 119873, 119873 ], "mapped", [ 110 ] ], [ [ 119874, 119874 ], "mapped", [ 111 ] ], [ [ 119875, 119875 ], "mapped", [ 112 ] ], [ [ 119876, 119876 ], "mapped", [ 113 ] ], [ [ 119877, 119877 ], "mapped", [ 114 ] ], [ [ 119878, 119878 ], "mapped", [ 115 ] ], [ [ 119879, 119879 ], "mapped", [ 116 ] ], [ [ 119880, 119880 ], "mapped", [ 117 ] ], [ [ 119881, 119881 ], "mapped", [ 118 ] ], [ [ 119882, 119882 ], "mapped", [ 119 ] ], [ [ 119883, 119883 ], "mapped", [ 120 ] ], [ [ 119884, 119884 ], "mapped", [ 121 ] ], [ [ 119885, 119885 ], "mapped", [ 122 ] ], [ [ 119886, 119886 ], "mapped", [ 97 ] ], [ [ 119887, 119887 ], "mapped", [ 98 ] ], [ [ 119888, 119888 ], "mapped", [ 99 ] ], [ [ 119889, 119889 ], "mapped", [ 100 ] ], [ [ 119890, 119890 ], "mapped", [ 101 ] ], [ [ 119891, 119891 ], "mapped", [ 102 ] ], [ [ 119892, 119892 ], "mapped", [ 103 ] ], [ [ 119893, 119893 ], "disallowed" ], [ [ 119894, 119894 ], "mapped", [ 105 ] ], [ [ 119895, 119895 ], "mapped", [ 106 ] ], [ [ 119896, 119896 ], "mapped", [ 107 ] ], [ [ 119897, 119897 ], "mapped", [ 108 ] ], [ [ 119898, 119898 ], "mapped", [ 109 ] ], [ [ 119899, 119899 ], "mapped", [ 110 ] ], [ [ 119900, 119900 ], "mapped", [ 111 ] ], [ [ 119901, 119901 ], "mapped", [ 112 ] ], [ [ 119902, 119902 ], "mapped", [ 113 ] ], [ [ 119903, 119903 ], "mapped", [ 114 ] ], [ [ 119904, 119904 ], "mapped", [ 115 ] ], [ [ 119905, 119905 ], "mapped", [ 116 ] ], [ [ 119906, 119906 ], "mapped", [ 117 ] ], [ [ 119907, 119907 ], "mapped", [ 118 ] ], [ [ 119908, 119908 ], "mapped", [ 119 ] ], [ [ 119909, 119909 ], "mapped", [ 120 ] ], [ [ 119910, 119910 ], "mapped", [ 121 ] ], [ [ 119911, 119911 ], "mapped", [ 122 ] ], [ [ 119912, 119912 ], "mapped", [ 97 ] ], [ [ 119913, 119913 ], "mapped", [ 98 ] ], [ [ 119914, 119914 ], "mapped", [ 99 ] ], [ [ 119915, 119915 ], "mapped", [ 100 ] ], [ [ 119916, 119916 ], "mapped", [ 101 ] ], [ [ 119917, 119917 ], "mapped", [ 102 ] ], [ [ 119918, 119918 ], "mapped", [ 103 ] ], [ [ 119919, 119919 ], "mapped", [ 104 ] ], [ [ 119920, 119920 ], "mapped", [ 105 ] ], [ [ 119921, 119921 ], "mapped", [ 106 ] ], [ [ 119922, 119922 ], "mapped", [ 107 ] ], [ [ 119923, 119923 ], "mapped", [ 108 ] ], [ [ 119924, 119924 ], "mapped", [ 109 ] ], [ [ 119925, 119925 ], "mapped", [ 110 ] ], [ [ 119926, 119926 ], "mapped", [ 111 ] ], [ [ 119927, 119927 ], "mapped", [ 112 ] ], [ [ 119928, 119928 ], "mapped", [ 113 ] ], [ [ 119929, 119929 ], "mapped", [ 114 ] ], [ [ 119930, 119930 ], "mapped", [ 115 ] ], [ [ 119931, 119931 ], "mapped", [ 116 ] ], [ [ 119932, 119932 ], "mapped", [ 117 ] ], [ [ 119933, 119933 ], "mapped", [ 118 ] ], [ [ 119934, 119934 ], "mapped", [ 119 ] ], [ [ 119935, 119935 ], "mapped", [ 120 ] ], [ [ 119936, 119936 ], "mapped", [ 121 ] ], [ [ 119937, 119937 ], "mapped", [ 122 ] ], [ [ 119938, 119938 ], "mapped", [ 97 ] ], [ [ 119939, 119939 ], "mapped", [ 98 ] ], [ [ 119940, 119940 ], "mapped", [ 99 ] ], [ [ 119941, 119941 ], "mapped", [ 100 ] ], [ [ 119942, 119942 ], "mapped", [ 101 ] ], [ [ 119943, 119943 ], "mapped", [ 102 ] ], [ [ 119944, 119944 ], "mapped", [ 103 ] ], [ [ 119945, 119945 ], "mapped", [ 104 ] ], [ [ 119946, 119946 ], "mapped", [ 105 ] ], [ [ 119947, 119947 ], "mapped", [ 106 ] ], [ [ 119948, 119948 ], "mapped", [ 107 ] ], [ [ 119949, 119949 ], "mapped", [ 108 ] ], [ [ 119950, 119950 ], "mapped", [ 109 ] ], [ [ 119951, 119951 ], "mapped", [ 110 ] ], [ [ 119952, 119952 ], "mapped", [ 111 ] ], [ [ 119953, 119953 ], "mapped", [ 112 ] ], [ [ 119954, 119954 ], "mapped", [ 113 ] ], [ [ 119955, 119955 ], "mapped", [ 114 ] ], [ [ 119956, 119956 ], "mapped", [ 115 ] ], [ [ 119957, 119957 ], "mapped", [ 116 ] ], [ [ 119958, 119958 ], "mapped", [ 117 ] ], [ [ 119959, 119959 ], "mapped", [ 118 ] ], [ [ 119960, 119960 ], "mapped", [ 119 ] ], [ [ 119961, 119961 ], "mapped", [ 120 ] ], [ [ 119962, 119962 ], "mapped", [ 121 ] ], [ [ 119963, 119963 ], "mapped", [ 122 ] ], [ [ 119964, 119964 ], "mapped", [ 97 ] ], [ [ 119965, 119965 ], "disallowed" ], [ [ 119966, 119966 ], "mapped", [ 99 ] ], [ [ 119967, 119967 ], "mapped", [ 100 ] ], [ [ 119968, 119969 ], "disallowed" ], [ [ 119970, 119970 ], "mapped", [ 103 ] ], [ [ 119971, 119972 ], "disallowed" ], [ [ 119973, 119973 ], "mapped", [ 106 ] ], [ [ 119974, 119974 ], "mapped", [ 107 ] ], [ [ 119975, 119976 ], "disallowed" ], [ [ 119977, 119977 ], "mapped", [ 110 ] ], [ [ 119978, 119978 ], "mapped", [ 111 ] ], [ [ 119979, 119979 ], "mapped", [ 112 ] ], [ [ 119980, 119980 ], "mapped", [ 113 ] ], [ [ 119981, 119981 ], "disallowed" ], [ [ 119982, 119982 ], "mapped", [ 115 ] ], [ [ 119983, 119983 ], "mapped", [ 116 ] ], [ [ 119984, 119984 ], "mapped", [ 117 ] ], [ [ 119985, 119985 ], "mapped", [ 118 ] ], [ [ 119986, 119986 ], "mapped", [ 119 ] ], [ [ 119987, 119987 ], "mapped", [ 120 ] ], [ [ 119988, 119988 ], "mapped", [ 121 ] ], [ [ 119989, 119989 ], "mapped", [ 122 ] ], [ [ 119990, 119990 ], "mapped", [ 97 ] ], [ [ 119991, 119991 ], "mapped", [ 98 ] ], [ [ 119992, 119992 ], "mapped", [ 99 ] ], [ [ 119993, 119993 ], "mapped", [ 100 ] ], [ [ 119994, 119994 ], "disallowed" ], [ [ 119995, 119995 ], "mapped", [ 102 ] ], [ [ 119996, 119996 ], "disallowed" ], [ [ 119997, 119997 ], "mapped", [ 104 ] ], [ [ 119998, 119998 ], "mapped", [ 105 ] ], [ [ 119999, 119999 ], "mapped", [ 106 ] ], [ [ 120000, 120000 ], "mapped", [ 107 ] ], [ [ 120001, 120001 ], "mapped", [ 108 ] ], [ [ 120002, 120002 ], "mapped", [ 109 ] ], [ [ 120003, 120003 ], "mapped", [ 110 ] ], [ [ 120004, 120004 ], "disallowed" ], [ [ 120005, 120005 ], "mapped", [ 112 ] ], [ [ 120006, 120006 ], "mapped", [ 113 ] ], [ [ 120007, 120007 ], "mapped", [ 114 ] ], [ [ 120008, 120008 ], "mapped", [ 115 ] ], [ [ 120009, 120009 ], "mapped", [ 116 ] ], [ [ 120010, 120010 ], "mapped", [ 117 ] ], [ [ 120011, 120011 ], "mapped", [ 118 ] ], [ [ 120012, 120012 ], "mapped", [ 119 ] ], [ [ 120013, 120013 ], "mapped", [ 120 ] ], [ [ 120014, 120014 ], "mapped", [ 121 ] ], [ [ 120015, 120015 ], "mapped", [ 122 ] ], [ [ 120016, 120016 ], "mapped", [ 97 ] ], [ [ 120017, 120017 ], "mapped", [ 98 ] ], [ [ 120018, 120018 ], "mapped", [ 99 ] ], [ [ 120019, 120019 ], "mapped", [ 100 ] ], [ [ 120020, 120020 ], "mapped", [ 101 ] ], [ [ 120021, 120021 ], "mapped", [ 102 ] ], [ [ 120022, 120022 ], "mapped", [ 103 ] ], [ [ 120023, 120023 ], "mapped", [ 104 ] ], [ [ 120024, 120024 ], "mapped", [ 105 ] ], [ [ 120025, 120025 ], "mapped", [ 106 ] ], [ [ 120026, 120026 ], "mapped", [ 107 ] ], [ [ 120027, 120027 ], "mapped", [ 108 ] ], [ [ 120028, 120028 ], "mapped", [ 109 ] ], [ [ 120029, 120029 ], "mapped", [ 110 ] ], [ [ 120030, 120030 ], "mapped", [ 111 ] ], [ [ 120031, 120031 ], "mapped", [ 112 ] ], [ [ 120032, 120032 ], "mapped", [ 113 ] ], [ [ 120033, 120033 ], "mapped", [ 114 ] ], [ [ 120034, 120034 ], "mapped", [ 115 ] ], [ [ 120035, 120035 ], "mapped", [ 116 ] ], [ [ 120036, 120036 ], "mapped", [ 117 ] ], [ [ 120037, 120037 ], "mapped", [ 118 ] ], [ [ 120038, 120038 ], "mapped", [ 119 ] ], [ [ 120039, 120039 ], "mapped", [ 120 ] ], [ [ 120040, 120040 ], "mapped", [ 121 ] ], [ [ 120041, 120041 ], "mapped", [ 122 ] ], [ [ 120042, 120042 ], "mapped", [ 97 ] ], [ [ 120043, 120043 ], "mapped", [ 98 ] ], [ [ 120044, 120044 ], "mapped", [ 99 ] ], [ [ 120045, 120045 ], "mapped", [ 100 ] ], [ [ 120046, 120046 ], "mapped", [ 101 ] ], [ [ 120047, 120047 ], "mapped", [ 102 ] ], [ [ 120048, 120048 ], "mapped", [ 103 ] ], [ [ 120049, 120049 ], "mapped", [ 104 ] ], [ [ 120050, 120050 ], "mapped", [ 105 ] ], [ [ 120051, 120051 ], "mapped", [ 106 ] ], [ [ 120052, 120052 ], "mapped", [ 107 ] ], [ [ 120053, 120053 ], "mapped", [ 108 ] ], [ [ 120054, 120054 ], "mapped", [ 109 ] ], [ [ 120055, 120055 ], "mapped", [ 110 ] ], [ [ 120056, 120056 ], "mapped", [ 111 ] ], [ [ 120057, 120057 ], "mapped", [ 112 ] ], [ [ 120058, 120058 ], "mapped", [ 113 ] ], [ [ 120059, 120059 ], "mapped", [ 114 ] ], [ [ 120060, 120060 ], "mapped", [ 115 ] ], [ [ 120061, 120061 ], "mapped", [ 116 ] ], [ [ 120062, 120062 ], "mapped", [ 117 ] ], [ [ 120063, 120063 ], "mapped", [ 118 ] ], [ [ 120064, 120064 ], "mapped", [ 119 ] ], [ [ 120065, 120065 ], "mapped", [ 120 ] ], [ [ 120066, 120066 ], "mapped", [ 121 ] ], [ [ 120067, 120067 ], "mapped", [ 122 ] ], [ [ 120068, 120068 ], "mapped", [ 97 ] ], [ [ 120069, 120069 ], "mapped", [ 98 ] ], [ [ 120070, 120070 ], "disallowed" ], [ [ 120071, 120071 ], "mapped", [ 100 ] ], [ [ 120072, 120072 ], "mapped", [ 101 ] ], [ [ 120073, 120073 ], "mapped", [ 102 ] ], [ [ 120074, 120074 ], "mapped", [ 103 ] ], [ [ 120075, 120076 ], "disallowed" ], [ [ 120077, 120077 ], "mapped", [ 106 ] ], [ [ 120078, 120078 ], "mapped", [ 107 ] ], [ [ 120079, 120079 ], "mapped", [ 108 ] ], [ [ 120080, 120080 ], "mapped", [ 109 ] ], [ [ 120081, 120081 ], "mapped", [ 110 ] ], [ [ 120082, 120082 ], "mapped", [ 111 ] ], [ [ 120083, 120083 ], "mapped", [ 112 ] ], [ [ 120084, 120084 ], "mapped", [ 113 ] ], [ [ 120085, 120085 ], "disallowed" ], [ [ 120086, 120086 ], "mapped", [ 115 ] ], [ [ 120087, 120087 ], "mapped", [ 116 ] ], [ [ 120088, 120088 ], "mapped", [ 117 ] ], [ [ 120089, 120089 ], "mapped", [ 118 ] ], [ [ 120090, 120090 ], "mapped", [ 119 ] ], [ [ 120091, 120091 ], "mapped", [ 120 ] ], [ [ 120092, 120092 ], "mapped", [ 121 ] ], [ [ 120093, 120093 ], "disallowed" ], [ [ 120094, 120094 ], "mapped", [ 97 ] ], [ [ 120095, 120095 ], "mapped", [ 98 ] ], [ [ 120096, 120096 ], "mapped", [ 99 ] ], [ [ 120097, 120097 ], "mapped", [ 100 ] ], [ [ 120098, 120098 ], "mapped", [ 101 ] ], [ [ 120099, 120099 ], "mapped", [ 102 ] ], [ [ 120100, 120100 ], "mapped", [ 103 ] ], [ [ 120101, 120101 ], "mapped", [ 104 ] ], [ [ 120102, 120102 ], "mapped", [ 105 ] ], [ [ 120103, 120103 ], "mapped", [ 106 ] ], [ [ 120104, 120104 ], "mapped", [ 107 ] ], [ [ 120105, 120105 ], "mapped", [ 108 ] ], [ [ 120106, 120106 ], "mapped", [ 109 ] ], [ [ 120107, 120107 ], "mapped", [ 110 ] ], [ [ 120108, 120108 ], "mapped", [ 111 ] ], [ [ 120109, 120109 ], "mapped", [ 112 ] ], [ [ 120110, 120110 ], "mapped", [ 113 ] ], [ [ 120111, 120111 ], "mapped", [ 114 ] ], [ [ 120112, 120112 ], "mapped", [ 115 ] ], [ [ 120113, 120113 ], "mapped", [ 116 ] ], [ [ 120114, 120114 ], "mapped", [ 117 ] ], [ [ 120115, 120115 ], "mapped", [ 118 ] ], [ [ 120116, 120116 ], "mapped", [ 119 ] ], [ [ 120117, 120117 ], "mapped", [ 120 ] ], [ [ 120118, 120118 ], "mapped", [ 121 ] ], [ [ 120119, 120119 ], "mapped", [ 122 ] ], [ [ 120120, 120120 ], "mapped", [ 97 ] ], [ [ 120121, 120121 ], "mapped", [ 98 ] ], [ [ 120122, 120122 ], "disallowed" ], [ [ 120123, 120123 ], "mapped", [ 100 ] ], [ [ 120124, 120124 ], "mapped", [ 101 ] ], [ [ 120125, 120125 ], "mapped", [ 102 ] ], [ [ 120126, 120126 ], "mapped", [ 103 ] ], [ [ 120127, 120127 ], "disallowed" ], [ [ 120128, 120128 ], "mapped", [ 105 ] ], [ [ 120129, 120129 ], "mapped", [ 106 ] ], [ [ 120130, 120130 ], "mapped", [ 107 ] ], [ [ 120131, 120131 ], "mapped", [ 108 ] ], [ [ 120132, 120132 ], "mapped", [ 109 ] ], [ [ 120133, 120133 ], "disallowed" ], [ [ 120134, 120134 ], "mapped", [ 111 ] ], [ [ 120135, 120137 ], "disallowed" ], [ [ 120138, 120138 ], "mapped", [ 115 ] ], [ [ 120139, 120139 ], "mapped", [ 116 ] ], [ [ 120140, 120140 ], "mapped", [ 117 ] ], [ [ 120141, 120141 ], "mapped", [ 118 ] ], [ [ 120142, 120142 ], "mapped", [ 119 ] ], [ [ 120143, 120143 ], "mapped", [ 120 ] ], [ [ 120144, 120144 ], "mapped", [ 121 ] ], [ [ 120145, 120145 ], "disallowed" ], [ [ 120146, 120146 ], "mapped", [ 97 ] ], [ [ 120147, 120147 ], "mapped", [ 98 ] ], [ [ 120148, 120148 ], "mapped", [ 99 ] ], [ [ 120149, 120149 ], "mapped", [ 100 ] ], [ [ 120150, 120150 ], "mapped", [ 101 ] ], [ [ 120151, 120151 ], "mapped", [ 102 ] ], [ [ 120152, 120152 ], "mapped", [ 103 ] ], [ [ 120153, 120153 ], "mapped", [ 104 ] ], [ [ 120154, 120154 ], "mapped", [ 105 ] ], [ [ 120155, 120155 ], "mapped", [ 106 ] ], [ [ 120156, 120156 ], "mapped", [ 107 ] ], [ [ 120157, 120157 ], "mapped", [ 108 ] ], [ [ 120158, 120158 ], "mapped", [ 109 ] ], [ [ 120159, 120159 ], "mapped", [ 110 ] ], [ [ 120160, 120160 ], "mapped", [ 111 ] ], [ [ 120161, 120161 ], "mapped", [ 112 ] ], [ [ 120162, 120162 ], "mapped", [ 113 ] ], [ [ 120163, 120163 ], "mapped", [ 114 ] ], [ [ 120164, 120164 ], "mapped", [ 115 ] ], [ [ 120165, 120165 ], "mapped", [ 116 ] ], [ [ 120166, 120166 ], "mapped", [ 117 ] ], [ [ 120167, 120167 ], "mapped", [ 118 ] ], [ [ 120168, 120168 ], "mapped", [ 119 ] ], [ [ 120169, 120169 ], "mapped", [ 120 ] ], [ [ 120170, 120170 ], "mapped", [ 121 ] ], [ [ 120171, 120171 ], "mapped", [ 122 ] ], [ [ 120172, 120172 ], "mapped", [ 97 ] ], [ [ 120173, 120173 ], "mapped", [ 98 ] ], [ [ 120174, 120174 ], "mapped", [ 99 ] ], [ [ 120175, 120175 ], "mapped", [ 100 ] ], [ [ 120176, 120176 ], "mapped", [ 101 ] ], [ [ 120177, 120177 ], "mapped", [ 102 ] ], [ [ 120178, 120178 ], "mapped", [ 103 ] ], [ [ 120179, 120179 ], "mapped", [ 104 ] ], [ [ 120180, 120180 ], "mapped", [ 105 ] ], [ [ 120181, 120181 ], "mapped", [ 106 ] ], [ [ 120182, 120182 ], "mapped", [ 107 ] ], [ [ 120183, 120183 ], "mapped", [ 108 ] ], [ [ 120184, 120184 ], "mapped", [ 109 ] ], [ [ 120185, 120185 ], "mapped", [ 110 ] ], [ [ 120186, 120186 ], "mapped", [ 111 ] ], [ [ 120187, 120187 ], "mapped", [ 112 ] ], [ [ 120188, 120188 ], "mapped", [ 113 ] ], [ [ 120189, 120189 ], "mapped", [ 114 ] ], [ [ 120190, 120190 ], "mapped", [ 115 ] ], [ [ 120191, 120191 ], "mapped", [ 116 ] ], [ [ 120192, 120192 ], "mapped", [ 117 ] ], [ [ 120193, 120193 ], "mapped", [ 118 ] ], [ [ 120194, 120194 ], "mapped", [ 119 ] ], [ [ 120195, 120195 ], "mapped", [ 120 ] ], [ [ 120196, 120196 ], "mapped", [ 121 ] ], [ [ 120197, 120197 ], "mapped", [ 122 ] ], [ [ 120198, 120198 ], "mapped", [ 97 ] ], [ [ 120199, 120199 ], "mapped", [ 98 ] ], [ [ 120200, 120200 ], "mapped", [ 99 ] ], [ [ 120201, 120201 ], "mapped", [ 100 ] ], [ [ 120202, 120202 ], "mapped", [ 101 ] ], [ [ 120203, 120203 ], "mapped", [ 102 ] ], [ [ 120204, 120204 ], "mapped", [ 103 ] ], [ [ 120205, 120205 ], "mapped", [ 104 ] ], [ [ 120206, 120206 ], "mapped", [ 105 ] ], [ [ 120207, 120207 ], "mapped", [ 106 ] ], [ [ 120208, 120208 ], "mapped", [ 107 ] ], [ [ 120209, 120209 ], "mapped", [ 108 ] ], [ [ 120210, 120210 ], "mapped", [ 109 ] ], [ [ 120211, 120211 ], "mapped", [ 110 ] ], [ [ 120212, 120212 ], "mapped", [ 111 ] ], [ [ 120213, 120213 ], "mapped", [ 112 ] ], [ [ 120214, 120214 ], "mapped", [ 113 ] ], [ [ 120215, 120215 ], "mapped", [ 114 ] ], [ [ 120216, 120216 ], "mapped", [ 115 ] ], [ [ 120217, 120217 ], "mapped", [ 116 ] ], [ [ 120218, 120218 ], "mapped", [ 117 ] ], [ [ 120219, 120219 ], "mapped", [ 118 ] ], [ [ 120220, 120220 ], "mapped", [ 119 ] ], [ [ 120221, 120221 ], "mapped", [ 120 ] ], [ [ 120222, 120222 ], "mapped", [ 121 ] ], [ [ 120223, 120223 ], "mapped", [ 122 ] ], [ [ 120224, 120224 ], "mapped", [ 97 ] ], [ [ 120225, 120225 ], "mapped", [ 98 ] ], [ [ 120226, 120226 ], "mapped", [ 99 ] ], [ [ 120227, 120227 ], "mapped", [ 100 ] ], [ [ 120228, 120228 ], "mapped", [ 101 ] ], [ [ 120229, 120229 ], "mapped", [ 102 ] ], [ [ 120230, 120230 ], "mapped", [ 103 ] ], [ [ 120231, 120231 ], "mapped", [ 104 ] ], [ [ 120232, 120232 ], "mapped", [ 105 ] ], [ [ 120233, 120233 ], "mapped", [ 106 ] ], [ [ 120234, 120234 ], "mapped", [ 107 ] ], [ [ 120235, 120235 ], "mapped", [ 108 ] ], [ [ 120236, 120236 ], "mapped", [ 109 ] ], [ [ 120237, 120237 ], "mapped", [ 110 ] ], [ [ 120238, 120238 ], "mapped", [ 111 ] ], [ [ 120239, 120239 ], "mapped", [ 112 ] ], [ [ 120240, 120240 ], "mapped", [ 113 ] ], [ [ 120241, 120241 ], "mapped", [ 114 ] ], [ [ 120242, 120242 ], "mapped", [ 115 ] ], [ [ 120243, 120243 ], "mapped", [ 116 ] ], [ [ 120244, 120244 ], "mapped", [ 117 ] ], [ [ 120245, 120245 ], "mapped", [ 118 ] ], [ [ 120246, 120246 ], "mapped", [ 119 ] ], [ [ 120247, 120247 ], "mapped", [ 120 ] ], [ [ 120248, 120248 ], "mapped", [ 121 ] ], [ [ 120249, 120249 ], "mapped", [ 122 ] ], [ [ 120250, 120250 ], "mapped", [ 97 ] ], [ [ 120251, 120251 ], "mapped", [ 98 ] ], [ [ 120252, 120252 ], "mapped", [ 99 ] ], [ [ 120253, 120253 ], "mapped", [ 100 ] ], [ [ 120254, 120254 ], "mapped", [ 101 ] ], [ [ 120255, 120255 ], "mapped", [ 102 ] ], [ [ 120256, 120256 ], "mapped", [ 103 ] ], [ [ 120257, 120257 ], "mapped", [ 104 ] ], [ [ 120258, 120258 ], "mapped", [ 105 ] ], [ [ 120259, 120259 ], "mapped", [ 106 ] ], [ [ 120260, 120260 ], "mapped", [ 107 ] ], [ [ 120261, 120261 ], "mapped", [ 108 ] ], [ [ 120262, 120262 ], "mapped", [ 109 ] ], [ [ 120263, 120263 ], "mapped", [ 110 ] ], [ [ 120264, 120264 ], "mapped", [ 111 ] ], [ [ 120265, 120265 ], "mapped", [ 112 ] ], [ [ 120266, 120266 ], "mapped", [ 113 ] ], [ [ 120267, 120267 ], "mapped", [ 114 ] ], [ [ 120268, 120268 ], "mapped", [ 115 ] ], [ [ 120269, 120269 ], "mapped", [ 116 ] ], [ [ 120270, 120270 ], "mapped", [ 117 ] ], [ [ 120271, 120271 ], "mapped", [ 118 ] ], [ [ 120272, 120272 ], "mapped", [ 119 ] ], [ [ 120273, 120273 ], "mapped", [ 120 ] ], [ [ 120274, 120274 ], "mapped", [ 121 ] ], [ [ 120275, 120275 ], "mapped", [ 122 ] ], [ [ 120276, 120276 ], "mapped", [ 97 ] ], [ [ 120277, 120277 ], "mapped", [ 98 ] ], [ [ 120278, 120278 ], "mapped", [ 99 ] ], [ [ 120279, 120279 ], "mapped", [ 100 ] ], [ [ 120280, 120280 ], "mapped", [ 101 ] ], [ [ 120281, 120281 ], "mapped", [ 102 ] ], [ [ 120282, 120282 ], "mapped", [ 103 ] ], [ [ 120283, 120283 ], "mapped", [ 104 ] ], [ [ 120284, 120284 ], "mapped", [ 105 ] ], [ [ 120285, 120285 ], "mapped", [ 106 ] ], [ [ 120286, 120286 ], "mapped", [ 107 ] ], [ [ 120287, 120287 ], "mapped", [ 108 ] ], [ [ 120288, 120288 ], "mapped", [ 109 ] ], [ [ 120289, 120289 ], "mapped", [ 110 ] ], [ [ 120290, 120290 ], "mapped", [ 111 ] ], [ [ 120291, 120291 ], "mapped", [ 112 ] ], [ [ 120292, 120292 ], "mapped", [ 113 ] ], [ [ 120293, 120293 ], "mapped", [ 114 ] ], [ [ 120294, 120294 ], "mapped", [ 115 ] ], [ [ 120295, 120295 ], "mapped", [ 116 ] ], [ [ 120296, 120296 ], "mapped", [ 117 ] ], [ [ 120297, 120297 ], "mapped", [ 118 ] ], [ [ 120298, 120298 ], "mapped", [ 119 ] ], [ [ 120299, 120299 ], "mapped", [ 120 ] ], [ [ 120300, 120300 ], "mapped", [ 121 ] ], [ [ 120301, 120301 ], "mapped", [ 122 ] ], [ [ 120302, 120302 ], "mapped", [ 97 ] ], [ [ 120303, 120303 ], "mapped", [ 98 ] ], [ [ 120304, 120304 ], "mapped", [ 99 ] ], [ [ 120305, 120305 ], "mapped", [ 100 ] ], [ [ 120306, 120306 ], "mapped", [ 101 ] ], [ [ 120307, 120307 ], "mapped", [ 102 ] ], [ [ 120308, 120308 ], "mapped", [ 103 ] ], [ [ 120309, 120309 ], "mapped", [ 104 ] ], [ [ 120310, 120310 ], "mapped", [ 105 ] ], [ [ 120311, 120311 ], "mapped", [ 106 ] ], [ [ 120312, 120312 ], "mapped", [ 107 ] ], [ [ 120313, 120313 ], "mapped", [ 108 ] ], [ [ 120314, 120314 ], "mapped", [ 109 ] ], [ [ 120315, 120315 ], "mapped", [ 110 ] ], [ [ 120316, 120316 ], "mapped", [ 111 ] ], [ [ 120317, 120317 ], "mapped", [ 112 ] ], [ [ 120318, 120318 ], "mapped", [ 113 ] ], [ [ 120319, 120319 ], "mapped", [ 114 ] ], [ [ 120320, 120320 ], "mapped", [ 115 ] ], [ [ 120321, 120321 ], "mapped", [ 116 ] ], [ [ 120322, 120322 ], "mapped", [ 117 ] ], [ [ 120323, 120323 ], "mapped", [ 118 ] ], [ [ 120324, 120324 ], "mapped", [ 119 ] ], [ [ 120325, 120325 ], "mapped", [ 120 ] ], [ [ 120326, 120326 ], "mapped", [ 121 ] ], [ [ 120327, 120327 ], "mapped", [ 122 ] ], [ [ 120328, 120328 ], "mapped", [ 97 ] ], [ [ 120329, 120329 ], "mapped", [ 98 ] ], [ [ 120330, 120330 ], "mapped", [ 99 ] ], [ [ 120331, 120331 ], "mapped", [ 100 ] ], [ [ 120332, 120332 ], "mapped", [ 101 ] ], [ [ 120333, 120333 ], "mapped", [ 102 ] ], [ [ 120334, 120334 ], "mapped", [ 103 ] ], [ [ 120335, 120335 ], "mapped", [ 104 ] ], [ [ 120336, 120336 ], "mapped", [ 105 ] ], [ [ 120337, 120337 ], "mapped", [ 106 ] ], [ [ 120338, 120338 ], "mapped", [ 107 ] ], [ [ 120339, 120339 ], "mapped", [ 108 ] ], [ [ 120340, 120340 ], "mapped", [ 109 ] ], [ [ 120341, 120341 ], "mapped", [ 110 ] ], [ [ 120342, 120342 ], "mapped", [ 111 ] ], [ [ 120343, 120343 ], "mapped", [ 112 ] ], [ [ 120344, 120344 ], "mapped", [ 113 ] ], [ [ 120345, 120345 ], "mapped", [ 114 ] ], [ [ 120346, 120346 ], "mapped", [ 115 ] ], [ [ 120347, 120347 ], "mapped", [ 116 ] ], [ [ 120348, 120348 ], "mapped", [ 117 ] ], [ [ 120349, 120349 ], "mapped", [ 118 ] ], [ [ 120350, 120350 ], "mapped", [ 119 ] ], [ [ 120351, 120351 ], "mapped", [ 120 ] ], [ [ 120352, 120352 ], "mapped", [ 121 ] ], [ [ 120353, 120353 ], "mapped", [ 122 ] ], [ [ 120354, 120354 ], "mapped", [ 97 ] ], [ [ 120355, 120355 ], "mapped", [ 98 ] ], [ [ 120356, 120356 ], "mapped", [ 99 ] ], [ [ 120357, 120357 ], "mapped", [ 100 ] ], [ [ 120358, 120358 ], "mapped", [ 101 ] ], [ [ 120359, 120359 ], "mapped", [ 102 ] ], [ [ 120360, 120360 ], "mapped", [ 103 ] ], [ [ 120361, 120361 ], "mapped", [ 104 ] ], [ [ 120362, 120362 ], "mapped", [ 105 ] ], [ [ 120363, 120363 ], "mapped", [ 106 ] ], [ [ 120364, 120364 ], "mapped", [ 107 ] ], [ [ 120365, 120365 ], "mapped", [ 108 ] ], [ [ 120366, 120366 ], "mapped", [ 109 ] ], [ [ 120367, 120367 ], "mapped", [ 110 ] ], [ [ 120368, 120368 ], "mapped", [ 111 ] ], [ [ 120369, 120369 ], "mapped", [ 112 ] ], [ [ 120370, 120370 ], "mapped", [ 113 ] ], [ [ 120371, 120371 ], "mapped", [ 114 ] ], [ [ 120372, 120372 ], "mapped", [ 115 ] ], [ [ 120373, 120373 ], "mapped", [ 116 ] ], [ [ 120374, 120374 ], "mapped", [ 117 ] ], [ [ 120375, 120375 ], "mapped", [ 118 ] ], [ [ 120376, 120376 ], "mapped", [ 119 ] ], [ [ 120377, 120377 ], "mapped", [ 120 ] ], [ [ 120378, 120378 ], "mapped", [ 121 ] ], [ [ 120379, 120379 ], "mapped", [ 122 ] ], [ [ 120380, 120380 ], "mapped", [ 97 ] ], [ [ 120381, 120381 ], "mapped", [ 98 ] ], [ [ 120382, 120382 ], "mapped", [ 99 ] ], [ [ 120383, 120383 ], "mapped", [ 100 ] ], [ [ 120384, 120384 ], "mapped", [ 101 ] ], [ [ 120385, 120385 ], "mapped", [ 102 ] ], [ [ 120386, 120386 ], "mapped", [ 103 ] ], [ [ 120387, 120387 ], "mapped", [ 104 ] ], [ [ 120388, 120388 ], "mapped", [ 105 ] ], [ [ 120389, 120389 ], "mapped", [ 106 ] ], [ [ 120390, 120390 ], "mapped", [ 107 ] ], [ [ 120391, 120391 ], "mapped", [ 108 ] ], [ [ 120392, 120392 ], "mapped", [ 109 ] ], [ [ 120393, 120393 ], "mapped", [ 110 ] ], [ [ 120394, 120394 ], "mapped", [ 111 ] ], [ [ 120395, 120395 ], "mapped", [ 112 ] ], [ [ 120396, 120396 ], "mapped", [ 113 ] ], [ [ 120397, 120397 ], "mapped", [ 114 ] ], [ [ 120398, 120398 ], "mapped", [ 115 ] ], [ [ 120399, 120399 ], "mapped", [ 116 ] ], [ [ 120400, 120400 ], "mapped", [ 117 ] ], [ [ 120401, 120401 ], "mapped", [ 118 ] ], [ [ 120402, 120402 ], "mapped", [ 119 ] ], [ [ 120403, 120403 ], "mapped", [ 120 ] ], [ [ 120404, 120404 ], "mapped", [ 121 ] ], [ [ 120405, 120405 ], "mapped", [ 122 ] ], [ [ 120406, 120406 ], "mapped", [ 97 ] ], [ [ 120407, 120407 ], "mapped", [ 98 ] ], [ [ 120408, 120408 ], "mapped", [ 99 ] ], [ [ 120409, 120409 ], "mapped", [ 100 ] ], [ [ 120410, 120410 ], "mapped", [ 101 ] ], [ [ 120411, 120411 ], "mapped", [ 102 ] ], [ [ 120412, 120412 ], "mapped", [ 103 ] ], [ [ 120413, 120413 ], "mapped", [ 104 ] ], [ [ 120414, 120414 ], "mapped", [ 105 ] ], [ [ 120415, 120415 ], "mapped", [ 106 ] ], [ [ 120416, 120416 ], "mapped", [ 107 ] ], [ [ 120417, 120417 ], "mapped", [ 108 ] ], [ [ 120418, 120418 ], "mapped", [ 109 ] ], [ [ 120419, 120419 ], "mapped", [ 110 ] ], [ [ 120420, 120420 ], "mapped", [ 111 ] ], [ [ 120421, 120421 ], "mapped", [ 112 ] ], [ [ 120422, 120422 ], "mapped", [ 113 ] ], [ [ 120423, 120423 ], "mapped", [ 114 ] ], [ [ 120424, 120424 ], "mapped", [ 115 ] ], [ [ 120425, 120425 ], "mapped", [ 116 ] ], [ [ 120426, 120426 ], "mapped", [ 117 ] ], [ [ 120427, 120427 ], "mapped", [ 118 ] ], [ [ 120428, 120428 ], "mapped", [ 119 ] ], [ [ 120429, 120429 ], "mapped", [ 120 ] ], [ [ 120430, 120430 ], "mapped", [ 121 ] ], [ [ 120431, 120431 ], "mapped", [ 122 ] ], [ [ 120432, 120432 ], "mapped", [ 97 ] ], [ [ 120433, 120433 ], "mapped", [ 98 ] ], [ [ 120434, 120434 ], "mapped", [ 99 ] ], [ [ 120435, 120435 ], "mapped", [ 100 ] ], [ [ 120436, 120436 ], "mapped", [ 101 ] ], [ [ 120437, 120437 ], "mapped", [ 102 ] ], [ [ 120438, 120438 ], "mapped", [ 103 ] ], [ [ 120439, 120439 ], "mapped", [ 104 ] ], [ [ 120440, 120440 ], "mapped", [ 105 ] ], [ [ 120441, 120441 ], "mapped", [ 106 ] ], [ [ 120442, 120442 ], "mapped", [ 107 ] ], [ [ 120443, 120443 ], "mapped", [ 108 ] ], [ [ 120444, 120444 ], "mapped", [ 109 ] ], [ [ 120445, 120445 ], "mapped", [ 110 ] ], [ [ 120446, 120446 ], "mapped", [ 111 ] ], [ [ 120447, 120447 ], "mapped", [ 112 ] ], [ [ 120448, 120448 ], "mapped", [ 113 ] ], [ [ 120449, 120449 ], "mapped", [ 114 ] ], [ [ 120450, 120450 ], "mapped", [ 115 ] ], [ [ 120451, 120451 ], "mapped", [ 116 ] ], [ [ 120452, 120452 ], "mapped", [ 117 ] ], [ [ 120453, 120453 ], "mapped", [ 118 ] ], [ [ 120454, 120454 ], "mapped", [ 119 ] ], [ [ 120455, 120455 ], "mapped", [ 120 ] ], [ [ 120456, 120456 ], "mapped", [ 121 ] ], [ [ 120457, 120457 ], "mapped", [ 122 ] ], [ [ 120458, 120458 ], "mapped", [ 97 ] ], [ [ 120459, 120459 ], "mapped", [ 98 ] ], [ [ 120460, 120460 ], "mapped", [ 99 ] ], [ [ 120461, 120461 ], "mapped", [ 100 ] ], [ [ 120462, 120462 ], "mapped", [ 101 ] ], [ [ 120463, 120463 ], "mapped", [ 102 ] ], [ [ 120464, 120464 ], "mapped", [ 103 ] ], [ [ 120465, 120465 ], "mapped", [ 104 ] ], [ [ 120466, 120466 ], "mapped", [ 105 ] ], [ [ 120467, 120467 ], "mapped", [ 106 ] ], [ [ 120468, 120468 ], "mapped", [ 107 ] ], [ [ 120469, 120469 ], "mapped", [ 108 ] ], [ [ 120470, 120470 ], "mapped", [ 109 ] ], [ [ 120471, 120471 ], "mapped", [ 110 ] ], [ [ 120472, 120472 ], "mapped", [ 111 ] ], [ [ 120473, 120473 ], "mapped", [ 112 ] ], [ [ 120474, 120474 ], "mapped", [ 113 ] ], [ [ 120475, 120475 ], "mapped", [ 114 ] ], [ [ 120476, 120476 ], "mapped", [ 115 ] ], [ [ 120477, 120477 ], "mapped", [ 116 ] ], [ [ 120478, 120478 ], "mapped", [ 117 ] ], [ [ 120479, 120479 ], "mapped", [ 118 ] ], [ [ 120480, 120480 ], "mapped", [ 119 ] ], [ [ 120481, 120481 ], "mapped", [ 120 ] ], [ [ 120482, 120482 ], "mapped", [ 121 ] ], [ [ 120483, 120483 ], "mapped", [ 122 ] ], [ [ 120484, 120484 ], "mapped", [ 305 ] ], [ [ 120485, 120485 ], "mapped", [ 567 ] ], [ [ 120486, 120487 ], "disallowed" ], [ [ 120488, 120488 ], "mapped", [ 945 ] ], [ [ 120489, 120489 ], "mapped", [ 946 ] ], [ [ 120490, 120490 ], "mapped", [ 947 ] ], [ [ 120491, 120491 ], "mapped", [ 948 ] ], [ [ 120492, 120492 ], "mapped", [ 949 ] ], [ [ 120493, 120493 ], "mapped", [ 950 ] ], [ [ 120494, 120494 ], "mapped", [ 951 ] ], [ [ 120495, 120495 ], "mapped", [ 952 ] ], [ [ 120496, 120496 ], "mapped", [ 953 ] ], [ [ 120497, 120497 ], "mapped", [ 954 ] ], [ [ 120498, 120498 ], "mapped", [ 955 ] ], [ [ 120499, 120499 ], "mapped", [ 956 ] ], [ [ 120500, 120500 ], "mapped", [ 957 ] ], [ [ 120501, 120501 ], "mapped", [ 958 ] ], [ [ 120502, 120502 ], "mapped", [ 959 ] ], [ [ 120503, 120503 ], "mapped", [ 960 ] ], [ [ 120504, 120504 ], "mapped", [ 961 ] ], [ [ 120505, 120505 ], "mapped", [ 952 ] ], [ [ 120506, 120506 ], "mapped", [ 963 ] ], [ [ 120507, 120507 ], "mapped", [ 964 ] ], [ [ 120508, 120508 ], "mapped", [ 965 ] ], [ [ 120509, 120509 ], "mapped", [ 966 ] ], [ [ 120510, 120510 ], "mapped", [ 967 ] ], [ [ 120511, 120511 ], "mapped", [ 968 ] ], [ [ 120512, 120512 ], "mapped", [ 969 ] ], [ [ 120513, 120513 ], "mapped", [ 8711 ] ], [ [ 120514, 120514 ], "mapped", [ 945 ] ], [ [ 120515, 120515 ], "mapped", [ 946 ] ], [ [ 120516, 120516 ], "mapped", [ 947 ] ], [ [ 120517, 120517 ], "mapped", [ 948 ] ], [ [ 120518, 120518 ], "mapped", [ 949 ] ], [ [ 120519, 120519 ], "mapped", [ 950 ] ], [ [ 120520, 120520 ], "mapped", [ 951 ] ], [ [ 120521, 120521 ], "mapped", [ 952 ] ], [ [ 120522, 120522 ], "mapped", [ 953 ] ], [ [ 120523, 120523 ], "mapped", [ 954 ] ], [ [ 120524, 120524 ], "mapped", [ 955 ] ], [ [ 120525, 120525 ], "mapped", [ 956 ] ], [ [ 120526, 120526 ], "mapped", [ 957 ] ], [ [ 120527, 120527 ], "mapped", [ 958 ] ], [ [ 120528, 120528 ], "mapped", [ 959 ] ], [ [ 120529, 120529 ], "mapped", [ 960 ] ], [ [ 120530, 120530 ], "mapped", [ 961 ] ], [ [ 120531, 120532 ], "mapped", [ 963 ] ], [ [ 120533, 120533 ], "mapped", [ 964 ] ], [ [ 120534, 120534 ], "mapped", [ 965 ] ], [ [ 120535, 120535 ], "mapped", [ 966 ] ], [ [ 120536, 120536 ], "mapped", [ 967 ] ], [ [ 120537, 120537 ], "mapped", [ 968 ] ], [ [ 120538, 120538 ], "mapped", [ 969 ] ], [ [ 120539, 120539 ], "mapped", [ 8706 ] ], [ [ 120540, 120540 ], "mapped", [ 949 ] ], [ [ 120541, 120541 ], "mapped", [ 952 ] ], [ [ 120542, 120542 ], "mapped", [ 954 ] ], [ [ 120543, 120543 ], "mapped", [ 966 ] ], [ [ 120544, 120544 ], "mapped", [ 961 ] ], [ [ 120545, 120545 ], "mapped", [ 960 ] ], [ [ 120546, 120546 ], "mapped", [ 945 ] ], [ [ 120547, 120547 ], "mapped", [ 946 ] ], [ [ 120548, 120548 ], "mapped", [ 947 ] ], [ [ 120549, 120549 ], "mapped", [ 948 ] ], [ [ 120550, 120550 ], "mapped", [ 949 ] ], [ [ 120551, 120551 ], "mapped", [ 950 ] ], [ [ 120552, 120552 ], "mapped", [ 951 ] ], [ [ 120553, 120553 ], "mapped", [ 952 ] ], [ [ 120554, 120554 ], "mapped", [ 953 ] ], [ [ 120555, 120555 ], "mapped", [ 954 ] ], [ [ 120556, 120556 ], "mapped", [ 955 ] ], [ [ 120557, 120557 ], "mapped", [ 956 ] ], [ [ 120558, 120558 ], "mapped", [ 957 ] ], [ [ 120559, 120559 ], "mapped", [ 958 ] ], [ [ 120560, 120560 ], "mapped", [ 959 ] ], [ [ 120561, 120561 ], "mapped", [ 960 ] ], [ [ 120562, 120562 ], "mapped", [ 961 ] ], [ [ 120563, 120563 ], "mapped", [ 952 ] ], [ [ 120564, 120564 ], "mapped", [ 963 ] ], [ [ 120565, 120565 ], "mapped", [ 964 ] ], [ [ 120566, 120566 ], "mapped", [ 965 ] ], [ [ 120567, 120567 ], "mapped", [ 966 ] ], [ [ 120568, 120568 ], "mapped", [ 967 ] ], [ [ 120569, 120569 ], "mapped", [ 968 ] ], [ [ 120570, 120570 ], "mapped", [ 969 ] ], [ [ 120571, 120571 ], "mapped", [ 8711 ] ], [ [ 120572, 120572 ], "mapped", [ 945 ] ], [ [ 120573, 120573 ], "mapped", [ 946 ] ], [ [ 120574, 120574 ], "mapped", [ 947 ] ], [ [ 120575, 120575 ], "mapped", [ 948 ] ], [ [ 120576, 120576 ], "mapped", [ 949 ] ], [ [ 120577, 120577 ], "mapped", [ 950 ] ], [ [ 120578, 120578 ], "mapped", [ 951 ] ], [ [ 120579, 120579 ], "mapped", [ 952 ] ], [ [ 120580, 120580 ], "mapped", [ 953 ] ], [ [ 120581, 120581 ], "mapped", [ 954 ] ], [ [ 120582, 120582 ], "mapped", [ 955 ] ], [ [ 120583, 120583 ], "mapped", [ 956 ] ], [ [ 120584, 120584 ], "mapped", [ 957 ] ], [ [ 120585, 120585 ], "mapped", [ 958 ] ], [ [ 120586, 120586 ], "mapped", [ 959 ] ], [ [ 120587, 120587 ], "mapped", [ 960 ] ], [ [ 120588, 120588 ], "mapped", [ 961 ] ], [ [ 120589, 120590 ], "mapped", [ 963 ] ], [ [ 120591, 120591 ], "mapped", [ 964 ] ], [ [ 120592, 120592 ], "mapped", [ 965 ] ], [ [ 120593, 120593 ], "mapped", [ 966 ] ], [ [ 120594, 120594 ], "mapped", [ 967 ] ], [ [ 120595, 120595 ], "mapped", [ 968 ] ], [ [ 120596, 120596 ], "mapped", [ 969 ] ], [ [ 120597, 120597 ], "mapped", [ 8706 ] ], [ [ 120598, 120598 ], "mapped", [ 949 ] ], [ [ 120599, 120599 ], "mapped", [ 952 ] ], [ [ 120600, 120600 ], "mapped", [ 954 ] ], [ [ 120601, 120601 ], "mapped", [ 966 ] ], [ [ 120602, 120602 ], "mapped", [ 961 ] ], [ [ 120603, 120603 ], "mapped", [ 960 ] ], [ [ 120604, 120604 ], "mapped", [ 945 ] ], [ [ 120605, 120605 ], "mapped", [ 946 ] ], [ [ 120606, 120606 ], "mapped", [ 947 ] ], [ [ 120607, 120607 ], "mapped", [ 948 ] ], [ [ 120608, 120608 ], "mapped", [ 949 ] ], [ [ 120609, 120609 ], "mapped", [ 950 ] ], [ [ 120610, 120610 ], "mapped", [ 951 ] ], [ [ 120611, 120611 ], "mapped", [ 952 ] ], [ [ 120612, 120612 ], "mapped", [ 953 ] ], [ [ 120613, 120613 ], "mapped", [ 954 ] ], [ [ 120614, 120614 ], "mapped", [ 955 ] ], [ [ 120615, 120615 ], "mapped", [ 956 ] ], [ [ 120616, 120616 ], "mapped", [ 957 ] ], [ [ 120617, 120617 ], "mapped", [ 958 ] ], [ [ 120618, 120618 ], "mapped", [ 959 ] ], [ [ 120619, 120619 ], "mapped", [ 960 ] ], [ [ 120620, 120620 ], "mapped", [ 961 ] ], [ [ 120621, 120621 ], "mapped", [ 952 ] ], [ [ 120622, 120622 ], "mapped", [ 963 ] ], [ [ 120623, 120623 ], "mapped", [ 964 ] ], [ [ 120624, 120624 ], "mapped", [ 965 ] ], [ [ 120625, 120625 ], "mapped", [ 966 ] ], [ [ 120626, 120626 ], "mapped", [ 967 ] ], [ [ 120627, 120627 ], "mapped", [ 968 ] ], [ [ 120628, 120628 ], "mapped", [ 969 ] ], [ [ 120629, 120629 ], "mapped", [ 8711 ] ], [ [ 120630, 120630 ], "mapped", [ 945 ] ], [ [ 120631, 120631 ], "mapped", [ 946 ] ], [ [ 120632, 120632 ], "mapped", [ 947 ] ], [ [ 120633, 120633 ], "mapped", [ 948 ] ], [ [ 120634, 120634 ], "mapped", [ 949 ] ], [ [ 120635, 120635 ], "mapped", [ 950 ] ], [ [ 120636, 120636 ], "mapped", [ 951 ] ], [ [ 120637, 120637 ], "mapped", [ 952 ] ], [ [ 120638, 120638 ], "mapped", [ 953 ] ], [ [ 120639, 120639 ], "mapped", [ 954 ] ], [ [ 120640, 120640 ], "mapped", [ 955 ] ], [ [ 120641, 120641 ], "mapped", [ 956 ] ], [ [ 120642, 120642 ], "mapped", [ 957 ] ], [ [ 120643, 120643 ], "mapped", [ 958 ] ], [ [ 120644, 120644 ], "mapped", [ 959 ] ], [ [ 120645, 120645 ], "mapped", [ 960 ] ], [ [ 120646, 120646 ], "mapped", [ 961 ] ], [ [ 120647, 120648 ], "mapped", [ 963 ] ], [ [ 120649, 120649 ], "mapped", [ 964 ] ], [ [ 120650, 120650 ], "mapped", [ 965 ] ], [ [ 120651, 120651 ], "mapped", [ 966 ] ], [ [ 120652, 120652 ], "mapped", [ 967 ] ], [ [ 120653, 120653 ], "mapped", [ 968 ] ], [ [ 120654, 120654 ], "mapped", [ 969 ] ], [ [ 120655, 120655 ], "mapped", [ 8706 ] ], [ [ 120656, 120656 ], "mapped", [ 949 ] ], [ [ 120657, 120657 ], "mapped", [ 952 ] ], [ [ 120658, 120658 ], "mapped", [ 954 ] ], [ [ 120659, 120659 ], "mapped", [ 966 ] ], [ [ 120660, 120660 ], "mapped", [ 961 ] ], [ [ 120661, 120661 ], "mapped", [ 960 ] ], [ [ 120662, 120662 ], "mapped", [ 945 ] ], [ [ 120663, 120663 ], "mapped", [ 946 ] ], [ [ 120664, 120664 ], "mapped", [ 947 ] ], [ [ 120665, 120665 ], "mapped", [ 948 ] ], [ [ 120666, 120666 ], "mapped", [ 949 ] ], [ [ 120667, 120667 ], "mapped", [ 950 ] ], [ [ 120668, 120668 ], "mapped", [ 951 ] ], [ [ 120669, 120669 ], "mapped", [ 952 ] ], [ [ 120670, 120670 ], "mapped", [ 953 ] ], [ [ 120671, 120671 ], "mapped", [ 954 ] ], [ [ 120672, 120672 ], "mapped", [ 955 ] ], [ [ 120673, 120673 ], "mapped", [ 956 ] ], [ [ 120674, 120674 ], "mapped", [ 957 ] ], [ [ 120675, 120675 ], "mapped", [ 958 ] ], [ [ 120676, 120676 ], "mapped", [ 959 ] ], [ [ 120677, 120677 ], "mapped", [ 960 ] ], [ [ 120678, 120678 ], "mapped", [ 961 ] ], [ [ 120679, 120679 ], "mapped", [ 952 ] ], [ [ 120680, 120680 ], "mapped", [ 963 ] ], [ [ 120681, 120681 ], "mapped", [ 964 ] ], [ [ 120682, 120682 ], "mapped", [ 965 ] ], [ [ 120683, 120683 ], "mapped", [ 966 ] ], [ [ 120684, 120684 ], "mapped", [ 967 ] ], [ [ 120685, 120685 ], "mapped", [ 968 ] ], [ [ 120686, 120686 ], "mapped", [ 969 ] ], [ [ 120687, 120687 ], "mapped", [ 8711 ] ], [ [ 120688, 120688 ], "mapped", [ 945 ] ], [ [ 120689, 120689 ], "mapped", [ 946 ] ], [ [ 120690, 120690 ], "mapped", [ 947 ] ], [ [ 120691, 120691 ], "mapped", [ 948 ] ], [ [ 120692, 120692 ], "mapped", [ 949 ] ], [ [ 120693, 120693 ], "mapped", [ 950 ] ], [ [ 120694, 120694 ], "mapped", [ 951 ] ], [ [ 120695, 120695 ], "mapped", [ 952 ] ], [ [ 120696, 120696 ], "mapped", [ 953 ] ], [ [ 120697, 120697 ], "mapped", [ 954 ] ], [ [ 120698, 120698 ], "mapped", [ 955 ] ], [ [ 120699, 120699 ], "mapped", [ 956 ] ], [ [ 120700, 120700 ], "mapped", [ 957 ] ], [ [ 120701, 120701 ], "mapped", [ 958 ] ], [ [ 120702, 120702 ], "mapped", [ 959 ] ], [ [ 120703, 120703 ], "mapped", [ 960 ] ], [ [ 120704, 120704 ], "mapped", [ 961 ] ], [ [ 120705, 120706 ], "mapped", [ 963 ] ], [ [ 120707, 120707 ], "mapped", [ 964 ] ], [ [ 120708, 120708 ], "mapped", [ 965 ] ], [ [ 120709, 120709 ], "mapped", [ 966 ] ], [ [ 120710, 120710 ], "mapped", [ 967 ] ], [ [ 120711, 120711 ], "mapped", [ 968 ] ], [ [ 120712, 120712 ], "mapped", [ 969 ] ], [ [ 120713, 120713 ], "mapped", [ 8706 ] ], [ [ 120714, 120714 ], "mapped", [ 949 ] ], [ [ 120715, 120715 ], "mapped", [ 952 ] ], [ [ 120716, 120716 ], "mapped", [ 954 ] ], [ [ 120717, 120717 ], "mapped", [ 966 ] ], [ [ 120718, 120718 ], "mapped", [ 961 ] ], [ [ 120719, 120719 ], "mapped", [ 960 ] ], [ [ 120720, 120720 ], "mapped", [ 945 ] ], [ [ 120721, 120721 ], "mapped", [ 946 ] ], [ [ 120722, 120722 ], "mapped", [ 947 ] ], [ [ 120723, 120723 ], "mapped", [ 948 ] ], [ [ 120724, 120724 ], "mapped", [ 949 ] ], [ [ 120725, 120725 ], "mapped", [ 950 ] ], [ [ 120726, 120726 ], "mapped", [ 951 ] ], [ [ 120727, 120727 ], "mapped", [ 952 ] ], [ [ 120728, 120728 ], "mapped", [ 953 ] ], [ [ 120729, 120729 ], "mapped", [ 954 ] ], [ [ 120730, 120730 ], "mapped", [ 955 ] ], [ [ 120731, 120731 ], "mapped", [ 956 ] ], [ [ 120732, 120732 ], "mapped", [ 957 ] ], [ [ 120733, 120733 ], "mapped", [ 958 ] ], [ [ 120734, 120734 ], "mapped", [ 959 ] ], [ [ 120735, 120735 ], "mapped", [ 960 ] ], [ [ 120736, 120736 ], "mapped", [ 961 ] ], [ [ 120737, 120737 ], "mapped", [ 952 ] ], [ [ 120738, 120738 ], "mapped", [ 963 ] ], [ [ 120739, 120739 ], "mapped", [ 964 ] ], [ [ 120740, 120740 ], "mapped", [ 965 ] ], [ [ 120741, 120741 ], "mapped", [ 966 ] ], [ [ 120742, 120742 ], "mapped", [ 967 ] ], [ [ 120743, 120743 ], "mapped", [ 968 ] ], [ [ 120744, 120744 ], "mapped", [ 969 ] ], [ [ 120745, 120745 ], "mapped", [ 8711 ] ], [ [ 120746, 120746 ], "mapped", [ 945 ] ], [ [ 120747, 120747 ], "mapped", [ 946 ] ], [ [ 120748, 120748 ], "mapped", [ 947 ] ], [ [ 120749, 120749 ], "mapped", [ 948 ] ], [ [ 120750, 120750 ], "mapped", [ 949 ] ], [ [ 120751, 120751 ], "mapped", [ 950 ] ], [ [ 120752, 120752 ], "mapped", [ 951 ] ], [ [ 120753, 120753 ], "mapped", [ 952 ] ], [ [ 120754, 120754 ], "mapped", [ 953 ] ], [ [ 120755, 120755 ], "mapped", [ 954 ] ], [ [ 120756, 120756 ], "mapped", [ 955 ] ], [ [ 120757, 120757 ], "mapped", [ 956 ] ], [ [ 120758, 120758 ], "mapped", [ 957 ] ], [ [ 120759, 120759 ], "mapped", [ 958 ] ], [ [ 120760, 120760 ], "mapped", [ 959 ] ], [ [ 120761, 120761 ], "mapped", [ 960 ] ], [ [ 120762, 120762 ], "mapped", [ 961 ] ], [ [ 120763, 120764 ], "mapped", [ 963 ] ], [ [ 120765, 120765 ], "mapped", [ 964 ] ], [ [ 120766, 120766 ], "mapped", [ 965 ] ], [ [ 120767, 120767 ], "mapped", [ 966 ] ], [ [ 120768, 120768 ], "mapped", [ 967 ] ], [ [ 120769, 120769 ], "mapped", [ 968 ] ], [ [ 120770, 120770 ], "mapped", [ 969 ] ], [ [ 120771, 120771 ], "mapped", [ 8706 ] ], [ [ 120772, 120772 ], "mapped", [ 949 ] ], [ [ 120773, 120773 ], "mapped", [ 952 ] ], [ [ 120774, 120774 ], "mapped", [ 954 ] ], [ [ 120775, 120775 ], "mapped", [ 966 ] ], [ [ 120776, 120776 ], "mapped", [ 961 ] ], [ [ 120777, 120777 ], "mapped", [ 960 ] ], [ [ 120778, 120779 ], "mapped", [ 989 ] ], [ [ 120780, 120781 ], "disallowed" ], [ [ 120782, 120782 ], "mapped", [ 48 ] ], [ [ 120783, 120783 ], "mapped", [ 49 ] ], [ [ 120784, 120784 ], "mapped", [ 50 ] ], [ [ 120785, 120785 ], "mapped", [ 51 ] ], [ [ 120786, 120786 ], "mapped", [ 52 ] ], [ [ 120787, 120787 ], "mapped", [ 53 ] ], [ [ 120788, 120788 ], "mapped", [ 54 ] ], [ [ 120789, 120789 ], "mapped", [ 55 ] ], [ [ 120790, 120790 ], "mapped", [ 56 ] ], [ [ 120791, 120791 ], "mapped", [ 57 ] ], [ [ 120792, 120792 ], "mapped", [ 48 ] ], [ [ 120793, 120793 ], "mapped", [ 49 ] ], [ [ 120794, 120794 ], "mapped", [ 50 ] ], [ [ 120795, 120795 ], "mapped", [ 51 ] ], [ [ 120796, 120796 ], "mapped", [ 52 ] ], [ [ 120797, 120797 ], "mapped", [ 53 ] ], [ [ 120798, 120798 ], "mapped", [ 54 ] ], [ [ 120799, 120799 ], "mapped", [ 55 ] ], [ [ 120800, 120800 ], "mapped", [ 56 ] ], [ [ 120801, 120801 ], "mapped", [ 57 ] ], [ [ 120802, 120802 ], "mapped", [ 48 ] ], [ [ 120803, 120803 ], "mapped", [ 49 ] ], [ [ 120804, 120804 ], "mapped", [ 50 ] ], [ [ 120805, 120805 ], "mapped", [ 51 ] ], [ [ 120806, 120806 ], "mapped", [ 52 ] ], [ [ 120807, 120807 ], "mapped", [ 53 ] ], [ [ 120808, 120808 ], "mapped", [ 54 ] ], [ [ 120809, 120809 ], "mapped", [ 55 ] ], [ [ 120810, 120810 ], "mapped", [ 56 ] ], [ [ 120811, 120811 ], "mapped", [ 57 ] ], [ [ 120812, 120812 ], "mapped", [ 48 ] ], [ [ 120813, 120813 ], "mapped", [ 49 ] ], [ [ 120814, 120814 ], "mapped", [ 50 ] ], [ [ 120815, 120815 ], "mapped", [ 51 ] ], [ [ 120816, 120816 ], "mapped", [ 52 ] ], [ [ 120817, 120817 ], "mapped", [ 53 ] ], [ [ 120818, 120818 ], "mapped", [ 54 ] ], [ [ 120819, 120819 ], "mapped", [ 55 ] ], [ [ 120820, 120820 ], "mapped", [ 56 ] ], [ [ 120821, 120821 ], "mapped", [ 57 ] ], [ [ 120822, 120822 ], "mapped", [ 48 ] ], [ [ 120823, 120823 ], "mapped", [ 49 ] ], [ [ 120824, 120824 ], "mapped", [ 50 ] ], [ [ 120825, 120825 ], "mapped", [ 51 ] ], [ [ 120826, 120826 ], "mapped", [ 52 ] ], [ [ 120827, 120827 ], "mapped", [ 53 ] ], [ [ 120828, 120828 ], "mapped", [ 54 ] ], [ [ 120829, 120829 ], "mapped", [ 55 ] ], [ [ 120830, 120830 ], "mapped", [ 56 ] ], [ [ 120831, 120831 ], "mapped", [ 57 ] ], [ [ 120832, 121343 ], "valid", [ ], "NV8" ], [ [ 121344, 121398 ], "valid" ], [ [ 121399, 121402 ], "valid", [ ], "NV8" ], [ [ 121403, 121452 ], "valid" ], [ [ 121453, 121460 ], "valid", [ ], "NV8" ], [ [ 121461, 121461 ], "valid" ], [ [ 121462, 121475 ], "valid", [ ], "NV8" ], [ [ 121476, 121476 ], "valid" ], [ [ 121477, 121483 ], "valid", [ ], "NV8" ], [ [ 121484, 121498 ], "disallowed" ], [ [ 121499, 121503 ], "valid" ], [ [ 121504, 121504 ], "disallowed" ], [ [ 121505, 121519 ], "valid" ], [ [ 121520, 124927 ], "disallowed" ], [ [ 124928, 125124 ], "valid" ], [ [ 125125, 125126 ], "disallowed" ], [ [ 125127, 125135 ], "valid", [ ], "NV8" ], [ [ 125136, 125142 ], "valid" ], [ [ 125143, 126463 ], "disallowed" ], [ [ 126464, 126464 ], "mapped", [ 1575 ] ], [ [ 126465, 126465 ], "mapped", [ 1576 ] ], [ [ 126466, 126466 ], "mapped", [ 1580 ] ], [ [ 126467, 126467 ], "mapped", [ 1583 ] ], [ [ 126468, 126468 ], "disallowed" ], [ [ 126469, 126469 ], "mapped", [ 1608 ] ], [ [ 126470, 126470 ], "mapped", [ 1586 ] ], [ [ 126471, 126471 ], "mapped", [ 1581 ] ], [ [ 126472, 126472 ], "mapped", [ 1591 ] ], [ [ 126473, 126473 ], "mapped", [ 1610 ] ], [ [ 126474, 126474 ], "mapped", [ 1603 ] ], [ [ 126475, 126475 ], "mapped", [ 1604 ] ], [ [ 126476, 126476 ], "mapped", [ 1605 ] ], [ [ 126477, 126477 ], "mapped", [ 1606 ] ], [ [ 126478, 126478 ], "mapped", [ 1587 ] ], [ [ 126479, 126479 ], "mapped", [ 1593 ] ], [ [ 126480, 126480 ], "mapped", [ 1601 ] ], [ [ 126481, 126481 ], "mapped", [ 1589 ] ], [ [ 126482, 126482 ], "mapped", [ 1602 ] ], [ [ 126483, 126483 ], "mapped", [ 1585 ] ], [ [ 126484, 126484 ], "mapped", [ 1588 ] ], [ [ 126485, 126485 ], "mapped", [ 1578 ] ], [ [ 126486, 126486 ], "mapped", [ 1579 ] ], [ [ 126487, 126487 ], "mapped", [ 1582 ] ], [ [ 126488, 126488 ], "mapped", [ 1584 ] ], [ [ 126489, 126489 ], "mapped", [ 1590 ] ], [ [ 126490, 126490 ], "mapped", [ 1592 ] ], [ [ 126491, 126491 ], "mapped", [ 1594 ] ], [ [ 126492, 126492 ], "mapped", [ 1646 ] ], [ [ 126493, 126493 ], "mapped", [ 1722 ] ], [ [ 126494, 126494 ], "mapped", [ 1697 ] ], [ [ 126495, 126495 ], "mapped", [ 1647 ] ], [ [ 126496, 126496 ], "disallowed" ], [ [ 126497, 126497 ], "mapped", [ 1576 ] ], [ [ 126498, 126498 ], "mapped", [ 1580 ] ], [ [ 126499, 126499 ], "disallowed" ], [ [ 126500, 126500 ], "mapped", [ 1607 ] ], [ [ 126501, 126502 ], "disallowed" ], [ [ 126503, 126503 ], "mapped", [ 1581 ] ], [ [ 126504, 126504 ], "disallowed" ], [ [ 126505, 126505 ], "mapped", [ 1610 ] ], [ [ 126506, 126506 ], "mapped", [ 1603 ] ], [ [ 126507, 126507 ], "mapped", [ 1604 ] ], [ [ 126508, 126508 ], "mapped", [ 1605 ] ], [ [ 126509, 126509 ], "mapped", [ 1606 ] ], [ [ 126510, 126510 ], "mapped", [ 1587 ] ], [ [ 126511, 126511 ], "mapped", [ 1593 ] ], [ [ 126512, 126512 ], "mapped", [ 1601 ] ], [ [ 126513, 126513 ], "mapped", [ 1589 ] ], [ [ 126514, 126514 ], "mapped", [ 1602 ] ], [ [ 126515, 126515 ], "disallowed" ], [ [ 126516, 126516 ], "mapped", [ 1588 ] ], [ [ 126517, 126517 ], "mapped", [ 1578 ] ], [ [ 126518, 126518 ], "mapped", [ 1579 ] ], [ [ 126519, 126519 ], "mapped", [ 1582 ] ], [ [ 126520, 126520 ], "disallowed" ], [ [ 126521, 126521 ], "mapped", [ 1590 ] ], [ [ 126522, 126522 ], "disallowed" ], [ [ 126523, 126523 ], "mapped", [ 1594 ] ], [ [ 126524, 126529 ], "disallowed" ], [ [ 126530, 126530 ], "mapped", [ 1580 ] ], [ [ 126531, 126534 ], "disallowed" ], [ [ 126535, 126535 ], "mapped", [ 1581 ] ], [ [ 126536, 126536 ], "disallowed" ], [ [ 126537, 126537 ], "mapped", [ 1610 ] ], [ [ 126538, 126538 ], "disallowed" ], [ [ 126539, 126539 ], "mapped", [ 1604 ] ], [ [ 126540, 126540 ], "disallowed" ], [ [ 126541, 126541 ], "mapped", [ 1606 ] ], [ [ 126542, 126542 ], "mapped", [ 1587 ] ], [ [ 126543, 126543 ], "mapped", [ 1593 ] ], [ [ 126544, 126544 ], "disallowed" ], [ [ 126545, 126545 ], "mapped", [ 1589 ] ], [ [ 126546, 126546 ], "mapped", [ 1602 ] ], [ [ 126547, 126547 ], "disallowed" ], [ [ 126548, 126548 ], "mapped", [ 1588 ] ], [ [ 126549, 126550 ], "disallowed" ], [ [ 126551, 126551 ], "mapped", [ 1582 ] ], [ [ 126552, 126552 ], "disallowed" ], [ [ 126553, 126553 ], "mapped", [ 1590 ] ], [ [ 126554, 126554 ], "disallowed" ], [ [ 126555, 126555 ], "mapped", [ 1594 ] ], [ [ 126556, 126556 ], "disallowed" ], [ [ 126557, 126557 ], "mapped", [ 1722 ] ], [ [ 126558, 126558 ], "disallowed" ], [ [ 126559, 126559 ], "mapped", [ 1647 ] ], [ [ 126560, 126560 ], "disallowed" ], [ [ 126561, 126561 ], "mapped", [ 1576 ] ], [ [ 126562, 126562 ], "mapped", [ 1580 ] ], [ [ 126563, 126563 ], "disallowed" ], [ [ 126564, 126564 ], "mapped", [ 1607 ] ], [ [ 126565, 126566 ], "disallowed" ], [ [ 126567, 126567 ], "mapped", [ 1581 ] ], [ [ 126568, 126568 ], "mapped", [ 1591 ] ], [ [ 126569, 126569 ], "mapped", [ 1610 ] ], [ [ 126570, 126570 ], "mapped", [ 1603 ] ], [ [ 126571, 126571 ], "disallowed" ], [ [ 126572, 126572 ], "mapped", [ 1605 ] ], [ [ 126573, 126573 ], "mapped", [ 1606 ] ], [ [ 126574, 126574 ], "mapped", [ 1587 ] ], [ [ 126575, 126575 ], "mapped", [ 1593 ] ], [ [ 126576, 126576 ], "mapped", [ 1601 ] ], [ [ 126577, 126577 ], "mapped", [ 1589 ] ], [ [ 126578, 126578 ], "mapped", [ 1602 ] ], [ [ 126579, 126579 ], "disallowed" ], [ [ 126580, 126580 ], "mapped", [ 1588 ] ], [ [ 126581, 126581 ], "mapped", [ 1578 ] ], [ [ 126582, 126582 ], "mapped", [ 1579 ] ], [ [ 126583, 126583 ], "mapped", [ 1582 ] ], [ [ 126584, 126584 ], "disallowed" ], [ [ 126585, 126585 ], "mapped", [ 1590 ] ], [ [ 126586, 126586 ], "mapped", [ 1592 ] ], [ [ 126587, 126587 ], "mapped", [ 1594 ] ], [ [ 126588, 126588 ], "mapped", [ 1646 ] ], [ [ 126589, 126589 ], "disallowed" ], [ [ 126590, 126590 ], "mapped", [ 1697 ] ], [ [ 126591, 126591 ], "disallowed" ], [ [ 126592, 126592 ], "mapped", [ 1575 ] ], [ [ 126593, 126593 ], "mapped", [ 1576 ] ], [ [ 126594, 126594 ], "mapped", [ 1580 ] ], [ [ 126595, 126595 ], "mapped", [ 1583 ] ], [ [ 126596, 126596 ], "mapped", [ 1607 ] ], [ [ 126597, 126597 ], "mapped", [ 1608 ] ], [ [ 126598, 126598 ], "mapped", [ 1586 ] ], [ [ 126599, 126599 ], "mapped", [ 1581 ] ], [ [ 126600, 126600 ], "mapped", [ 1591 ] ], [ [ 126601, 126601 ], "mapped", [ 1610 ] ], [ [ 126602, 126602 ], "disallowed" ], [ [ 126603, 126603 ], "mapped", [ 1604 ] ], [ [ 126604, 126604 ], "mapped", [ 1605 ] ], [ [ 126605, 126605 ], "mapped", [ 1606 ] ], [ [ 126606, 126606 ], "mapped", [ 1587 ] ], [ [ 126607, 126607 ], "mapped", [ 1593 ] ], [ [ 126608, 126608 ], "mapped", [ 1601 ] ], [ [ 126609, 126609 ], "mapped", [ 1589 ] ], [ [ 126610, 126610 ], "mapped", [ 1602 ] ], [ [ 126611, 126611 ], "mapped", [ 1585 ] ], [ [ 126612, 126612 ], "mapped", [ 1588 ] ], [ [ 126613, 126613 ], "mapped", [ 1578 ] ], [ [ 126614, 126614 ], "mapped", [ 1579 ] ], [ [ 126615, 126615 ], "mapped", [ 1582 ] ], [ [ 126616, 126616 ], "mapped", [ 1584 ] ], [ [ 126617, 126617 ], "mapped", [ 1590 ] ], [ [ 126618, 126618 ], "mapped", [ 1592 ] ], [ [ 126619, 126619 ], "mapped", [ 1594 ] ], [ [ 126620, 126624 ], "disallowed" ], [ [ 126625, 126625 ], "mapped", [ 1576 ] ], [ [ 126626, 126626 ], "mapped", [ 1580 ] ], [ [ 126627, 126627 ], "mapped", [ 1583 ] ], [ [ 126628, 126628 ], "disallowed" ], [ [ 126629, 126629 ], "mapped", [ 1608 ] ], [ [ 126630, 126630 ], "mapped", [ 1586 ] ], [ [ 126631, 126631 ], "mapped", [ 1581 ] ], [ [ 126632, 126632 ], "mapped", [ 1591 ] ], [ [ 126633, 126633 ], "mapped", [ 1610 ] ], [ [ 126634, 126634 ], "disallowed" ], [ [ 126635, 126635 ], "mapped", [ 1604 ] ], [ [ 126636, 126636 ], "mapped", [ 1605 ] ], [ [ 126637, 126637 ], "mapped", [ 1606 ] ], [ [ 126638, 126638 ], "mapped", [ 1587 ] ], [ [ 126639, 126639 ], "mapped", [ 1593 ] ], [ [ 126640, 126640 ], "mapped", [ 1601 ] ], [ [ 126641, 126641 ], "mapped", [ 1589 ] ], [ [ 126642, 126642 ], "mapped", [ 1602 ] ], [ [ 126643, 126643 ], "mapped", [ 1585 ] ], [ [ 126644, 126644 ], "mapped", [ 1588 ] ], [ [ 126645, 126645 ], "mapped", [ 1578 ] ], [ [ 126646, 126646 ], "mapped", [ 1579 ] ], [ [ 126647, 126647 ], "mapped", [ 1582 ] ], [ [ 126648, 126648 ], "mapped", [ 1584 ] ], [ [ 126649, 126649 ], "mapped", [ 1590 ] ], [ [ 126650, 126650 ], "mapped", [ 1592 ] ], [ [ 126651, 126651 ], "mapped", [ 1594 ] ], [ [ 126652, 126703 ], "disallowed" ], [ [ 126704, 126705 ], "valid", [ ], "NV8" ], [ [ 126706, 126975 ], "disallowed" ], [ [ 126976, 127019 ], "valid", [ ], "NV8" ], [ [ 127020, 127023 ], "disallowed" ], [ [ 127024, 127123 ], "valid", [ ], "NV8" ], [ [ 127124, 127135 ], "disallowed" ], [ [ 127136, 127150 ], "valid", [ ], "NV8" ], [ [ 127151, 127152 ], "disallowed" ], [ [ 127153, 127166 ], "valid", [ ], "NV8" ], [ [ 127167, 127167 ], "valid", [ ], "NV8" ], [ [ 127168, 127168 ], "disallowed" ], [ [ 127169, 127183 ], "valid", [ ], "NV8" ], [ [ 127184, 127184 ], "disallowed" ], [ [ 127185, 127199 ], "valid", [ ], "NV8" ], [ [ 127200, 127221 ], "valid", [ ], "NV8" ], [ [ 127222, 127231 ], "disallowed" ], [ [ 127232, 127232 ], "disallowed" ], [ [ 127233, 127233 ], "disallowed_STD3_mapped", [ 48, 44 ] ], [ [ 127234, 127234 ], "disallowed_STD3_mapped", [ 49, 44 ] ], [ [ 127235, 127235 ], "disallowed_STD3_mapped", [ 50, 44 ] ], [ [ 127236, 127236 ], "disallowed_STD3_mapped", [ 51, 44 ] ], [ [ 127237, 127237 ], "disallowed_STD3_mapped", [ 52, 44 ] ], [ [ 127238, 127238 ], "disallowed_STD3_mapped", [ 53, 44 ] ], [ [ 127239, 127239 ], "disallowed_STD3_mapped", [ 54, 44 ] ], [ [ 127240, 127240 ], "disallowed_STD3_mapped", [ 55, 44 ] ], [ [ 127241, 127241 ], "disallowed_STD3_mapped", [ 56, 44 ] ], [ [ 127242, 127242 ], "disallowed_STD3_mapped", [ 57, 44 ] ], [ [ 127243, 127244 ], "valid", [ ], "NV8" ], [ [ 127245, 127247 ], "disallowed" ], [ [ 127248, 127248 ], "disallowed_STD3_mapped", [ 40, 97, 41 ] ], [ [ 127249, 127249 ], "disallowed_STD3_mapped", [ 40, 98, 41 ] ], [ [ 127250, 127250 ], "disallowed_STD3_mapped", [ 40, 99, 41 ] ], [ [ 127251, 127251 ], "disallowed_STD3_mapped", [ 40, 100, 41 ] ], [ [ 127252, 127252 ], "disallowed_STD3_mapped", [ 40, 101, 41 ] ], [ [ 127253, 127253 ], "disallowed_STD3_mapped", [ 40, 102, 41 ] ], [ [ 127254, 127254 ], "disallowed_STD3_mapped", [ 40, 103, 41 ] ], [ [ 127255, 127255 ], "disallowed_STD3_mapped", [ 40, 104, 41 ] ], [ [ 127256, 127256 ], "disallowed_STD3_mapped", [ 40, 105, 41 ] ], [ [ 127257, 127257 ], "disallowed_STD3_mapped", [ 40, 106, 41 ] ], [ [ 127258, 127258 ], "disallowed_STD3_mapped", [ 40, 107, 41 ] ], [ [ 127259, 127259 ], "disallowed_STD3_mapped", [ 40, 108, 41 ] ], [ [ 127260, 127260 ], "disallowed_STD3_mapped", [ 40, 109, 41 ] ], [ [ 127261, 127261 ], "disallowed_STD3_mapped", [ 40, 110, 41 ] ], [ [ 127262, 127262 ], "disallowed_STD3_mapped", [ 40, 111, 41 ] ], [ [ 127263, 127263 ], "disallowed_STD3_mapped", [ 40, 112, 41 ] ], [ [ 127264, 127264 ], "disallowed_STD3_mapped", [ 40, 113, 41 ] ], [ [ 127265, 127265 ], "disallowed_STD3_mapped", [ 40, 114, 41 ] ], [ [ 127266, 127266 ], "disallowed_STD3_mapped", [ 40, 115, 41 ] ], [ [ 127267, 127267 ], "disallowed_STD3_mapped", [ 40, 116, 41 ] ], [ [ 127268, 127268 ], "disallowed_STD3_mapped", [ 40, 117, 41 ] ], [ [ 127269, 127269 ], "disallowed_STD3_mapped", [ 40, 118, 41 ] ], [ [ 127270, 127270 ], "disallowed_STD3_mapped", [ 40, 119, 41 ] ], [ [ 127271, 127271 ], "disallowed_STD3_mapped", [ 40, 120, 41 ] ], [ [ 127272, 127272 ], "disallowed_STD3_mapped", [ 40, 121, 41 ] ], [ [ 127273, 127273 ], "disallowed_STD3_mapped", [ 40, 122, 41 ] ], [ [ 127274, 127274 ], "mapped", [ 12308, 115, 12309 ] ], [ [ 127275, 127275 ], "mapped", [ 99 ] ], [ [ 127276, 127276 ], "mapped", [ 114 ] ], [ [ 127277, 127277 ], "mapped", [ 99, 100 ] ], [ [ 127278, 127278 ], "mapped", [ 119, 122 ] ], [ [ 127279, 127279 ], "disallowed" ], [ [ 127280, 127280 ], "mapped", [ 97 ] ], [ [ 127281, 127281 ], "mapped", [ 98 ] ], [ [ 127282, 127282 ], "mapped", [ 99 ] ], [ [ 127283, 127283 ], "mapped", [ 100 ] ], [ [ 127284, 127284 ], "mapped", [ 101 ] ], [ [ 127285, 127285 ], "mapped", [ 102 ] ], [ [ 127286, 127286 ], "mapped", [ 103 ] ], [ [ 127287, 127287 ], "mapped", [ 104 ] ], [ [ 127288, 127288 ], "mapped", [ 105 ] ], [ [ 127289, 127289 ], "mapped", [ 106 ] ], [ [ 127290, 127290 ], "mapped", [ 107 ] ], [ [ 127291, 127291 ], "mapped", [ 108 ] ], [ [ 127292, 127292 ], "mapped", [ 109 ] ], [ [ 127293, 127293 ], "mapped", [ 110 ] ], [ [ 127294, 127294 ], "mapped", [ 111 ] ], [ [ 127295, 127295 ], "mapped", [ 112 ] ], [ [ 127296, 127296 ], "mapped", [ 113 ] ], [ [ 127297, 127297 ], "mapped", [ 114 ] ], [ [ 127298, 127298 ], "mapped", [ 115 ] ], [ [ 127299, 127299 ], "mapped", [ 116 ] ], [ [ 127300, 127300 ], "mapped", [ 117 ] ], [ [ 127301, 127301 ], "mapped", [ 118 ] ], [ [ 127302, 127302 ], "mapped", [ 119 ] ], [ [ 127303, 127303 ], "mapped", [ 120 ] ], [ [ 127304, 127304 ], "mapped", [ 121 ] ], [ [ 127305, 127305 ], "mapped", [ 122 ] ], [ [ 127306, 127306 ], "mapped", [ 104, 118 ] ], [ [ 127307, 127307 ], "mapped", [ 109, 118 ] ], [ [ 127308, 127308 ], "mapped", [ 115, 100 ] ], [ [ 127309, 127309 ], "mapped", [ 115, 115 ] ], [ [ 127310, 127310 ], "mapped", [ 112, 112, 118 ] ], [ [ 127311, 127311 ], "mapped", [ 119, 99 ] ], [ [ 127312, 127318 ], "valid", [ ], "NV8" ], [ [ 127319, 127319 ], "valid", [ ], "NV8" ], [ [ 127320, 127326 ], "valid", [ ], "NV8" ], [ [ 127327, 127327 ], "valid", [ ], "NV8" ], [ [ 127328, 127337 ], "valid", [ ], "NV8" ], [ [ 127338, 127338 ], "mapped", [ 109, 99 ] ], [ [ 127339, 127339 ], "mapped", [ 109, 100 ] ], [ [ 127340, 127343 ], "disallowed" ], [ [ 127344, 127352 ], "valid", [ ], "NV8" ], [ [ 127353, 127353 ], "valid", [ ], "NV8" ], [ [ 127354, 127354 ], "valid", [ ], "NV8" ], [ [ 127355, 127356 ], "valid", [ ], "NV8" ], [ [ 127357, 127358 ], "valid", [ ], "NV8" ], [ [ 127359, 127359 ], "valid", [ ], "NV8" ], [ [ 127360, 127369 ], "valid", [ ], "NV8" ], [ [ 127370, 127373 ], "valid", [ ], "NV8" ], [ [ 127374, 127375 ], "valid", [ ], "NV8" ], [ [ 127376, 127376 ], "mapped", [ 100, 106 ] ], [ [ 127377, 127386 ], "valid", [ ], "NV8" ], [ [ 127387, 127461 ], "disallowed" ], [ [ 127462, 127487 ], "valid", [ ], "NV8" ], [ [ 127488, 127488 ], "mapped", [ 12411, 12363 ] ], [ [ 127489, 127489 ], "mapped", [ 12467, 12467 ] ], [ [ 127490, 127490 ], "mapped", [ 12469 ] ], [ [ 127491, 127503 ], "disallowed" ], [ [ 127504, 127504 ], "mapped", [ 25163 ] ], [ [ 127505, 127505 ], "mapped", [ 23383 ] ], [ [ 127506, 127506 ], "mapped", [ 21452 ] ], [ [ 127507, 127507 ], "mapped", [ 12487 ] ], [ [ 127508, 127508 ], "mapped", [ 20108 ] ], [ [ 127509, 127509 ], "mapped", [ 22810 ] ], [ [ 127510, 127510 ], "mapped", [ 35299 ] ], [ [ 127511, 127511 ], "mapped", [ 22825 ] ], [ [ 127512, 127512 ], "mapped", [ 20132 ] ], [ [ 127513, 127513 ], "mapped", [ 26144 ] ], [ [ 127514, 127514 ], "mapped", [ 28961 ] ], [ [ 127515, 127515 ], "mapped", [ 26009 ] ], [ [ 127516, 127516 ], "mapped", [ 21069 ] ], [ [ 127517, 127517 ], "mapped", [ 24460 ] ], [ [ 127518, 127518 ], "mapped", [ 20877 ] ], [ [ 127519, 127519 ], "mapped", [ 26032 ] ], [ [ 127520, 127520 ], "mapped", [ 21021 ] ], [ [ 127521, 127521 ], "mapped", [ 32066 ] ], [ [ 127522, 127522 ], "mapped", [ 29983 ] ], [ [ 127523, 127523 ], "mapped", [ 36009 ] ], [ [ 127524, 127524 ], "mapped", [ 22768 ] ], [ [ 127525, 127525 ], "mapped", [ 21561 ] ], [ [ 127526, 127526 ], "mapped", [ 28436 ] ], [ [ 127527, 127527 ], "mapped", [ 25237 ] ], [ [ 127528, 127528 ], "mapped", [ 25429 ] ], [ [ 127529, 127529 ], "mapped", [ 19968 ] ], [ [ 127530, 127530 ], "mapped", [ 19977 ] ], [ [ 127531, 127531 ], "mapped", [ 36938 ] ], [ [ 127532, 127532 ], "mapped", [ 24038 ] ], [ [ 127533, 127533 ], "mapped", [ 20013 ] ], [ [ 127534, 127534 ], "mapped", [ 21491 ] ], [ [ 127535, 127535 ], "mapped", [ 25351 ] ], [ [ 127536, 127536 ], "mapped", [ 36208 ] ], [ [ 127537, 127537 ], "mapped", [ 25171 ] ], [ [ 127538, 127538 ], "mapped", [ 31105 ] ], [ [ 127539, 127539 ], "mapped", [ 31354 ] ], [ [ 127540, 127540 ], "mapped", [ 21512 ] ], [ [ 127541, 127541 ], "mapped", [ 28288 ] ], [ [ 127542, 127542 ], "mapped", [ 26377 ] ], [ [ 127543, 127543 ], "mapped", [ 26376 ] ], [ [ 127544, 127544 ], "mapped", [ 30003 ] ], [ [ 127545, 127545 ], "mapped", [ 21106 ] ], [ [ 127546, 127546 ], "mapped", [ 21942 ] ], [ [ 127547, 127551 ], "disallowed" ], [ [ 127552, 127552 ], "mapped", [ 12308, 26412, 12309 ] ], [ [ 127553, 127553 ], "mapped", [ 12308, 19977, 12309 ] ], [ [ 127554, 127554 ], "mapped", [ 12308, 20108, 12309 ] ], [ [ 127555, 127555 ], "mapped", [ 12308, 23433, 12309 ] ], [ [ 127556, 127556 ], "mapped", [ 12308, 28857, 12309 ] ], [ [ 127557, 127557 ], "mapped", [ 12308, 25171, 12309 ] ], [ [ 127558, 127558 ], "mapped", [ 12308, 30423, 12309 ] ], [ [ 127559, 127559 ], "mapped", [ 12308, 21213, 12309 ] ], [ [ 127560, 127560 ], "mapped", [ 12308, 25943, 12309 ] ], [ [ 127561, 127567 ], "disallowed" ], [ [ 127568, 127568 ], "mapped", [ 24471 ] ], [ [ 127569, 127569 ], "mapped", [ 21487 ] ], [ [ 127570, 127743 ], "disallowed" ], [ [ 127744, 127776 ], "valid", [ ], "NV8" ], [ [ 127777, 127788 ], "valid", [ ], "NV8" ], [ [ 127789, 127791 ], "valid", [ ], "NV8" ], [ [ 127792, 127797 ], "valid", [ ], "NV8" ], [ [ 127798, 127798 ], "valid", [ ], "NV8" ], [ [ 127799, 127868 ], "valid", [ ], "NV8" ], [ [ 127869, 127869 ], "valid", [ ], "NV8" ], [ [ 127870, 127871 ], "valid", [ ], "NV8" ], [ [ 127872, 127891 ], "valid", [ ], "NV8" ], [ [ 127892, 127903 ], "valid", [ ], "NV8" ], [ [ 127904, 127940 ], "valid", [ ], "NV8" ], [ [ 127941, 127941 ], "valid", [ ], "NV8" ], [ [ 127942, 127946 ], "valid", [ ], "NV8" ], [ [ 127947, 127950 ], "valid", [ ], "NV8" ], [ [ 127951, 127955 ], "valid", [ ], "NV8" ], [ [ 127956, 127967 ], "valid", [ ], "NV8" ], [ [ 127968, 127984 ], "valid", [ ], "NV8" ], [ [ 127985, 127991 ], "valid", [ ], "NV8" ], [ [ 127992, 127999 ], "valid", [ ], "NV8" ], [ [ 128000, 128062 ], "valid", [ ], "NV8" ], [ [ 128063, 128063 ], "valid", [ ], "NV8" ], [ [ 128064, 128064 ], "valid", [ ], "NV8" ], [ [ 128065, 128065 ], "valid", [ ], "NV8" ], [ [ 128066, 128247 ], "valid", [ ], "NV8" ], [ [ 128248, 128248 ], "valid", [ ], "NV8" ], [ [ 128249, 128252 ], "valid", [ ], "NV8" ], [ [ 128253, 128254 ], "valid", [ ], "NV8" ], [ [ 128255, 128255 ], "valid", [ ], "NV8" ], [ [ 128256, 128317 ], "valid", [ ], "NV8" ], [ [ 128318, 128319 ], "valid", [ ], "NV8" ], [ [ 128320, 128323 ], "valid", [ ], "NV8" ], [ [ 128324, 128330 ], "valid", [ ], "NV8" ], [ [ 128331, 128335 ], "valid", [ ], "NV8" ], [ [ 128336, 128359 ], "valid", [ ], "NV8" ], [ [ 128360, 128377 ], "valid", [ ], "NV8" ], [ [ 128378, 128378 ], "disallowed" ], [ [ 128379, 128419 ], "valid", [ ], "NV8" ], [ [ 128420, 128420 ], "disallowed" ], [ [ 128421, 128506 ], "valid", [ ], "NV8" ], [ [ 128507, 128511 ], "valid", [ ], "NV8" ], [ [ 128512, 128512 ], "valid", [ ], "NV8" ], [ [ 128513, 128528 ], "valid", [ ], "NV8" ], [ [ 128529, 128529 ], "valid", [ ], "NV8" ], [ [ 128530, 128532 ], "valid", [ ], "NV8" ], [ [ 128533, 128533 ], "valid", [ ], "NV8" ], [ [ 128534, 128534 ], "valid", [ ], "NV8" ], [ [ 128535, 128535 ], "valid", [ ], "NV8" ], [ [ 128536, 128536 ], "valid", [ ], "NV8" ], [ [ 128537, 128537 ], "valid", [ ], "NV8" ], [ [ 128538, 128538 ], "valid", [ ], "NV8" ], [ [ 128539, 128539 ], "valid", [ ], "NV8" ], [ [ 128540, 128542 ], "valid", [ ], "NV8" ], [ [ 128543, 128543 ], "valid", [ ], "NV8" ], [ [ 128544, 128549 ], "valid", [ ], "NV8" ], [ [ 128550, 128551 ], "valid", [ ], "NV8" ], [ [ 128552, 128555 ], "valid", [ ], "NV8" ], [ [ 128556, 128556 ], "valid", [ ], "NV8" ], [ [ 128557, 128557 ], "valid", [ ], "NV8" ], [ [ 128558, 128559 ], "valid", [ ], "NV8" ], [ [ 128560, 128563 ], "valid", [ ], "NV8" ], [ [ 128564, 128564 ], "valid", [ ], "NV8" ], [ [ 128565, 128576 ], "valid", [ ], "NV8" ], [ [ 128577, 128578 ], "valid", [ ], "NV8" ], [ [ 128579, 128580 ], "valid", [ ], "NV8" ], [ [ 128581, 128591 ], "valid", [ ], "NV8" ], [ [ 128592, 128639 ], "valid", [ ], "NV8" ], [ [ 128640, 128709 ], "valid", [ ], "NV8" ], [ [ 128710, 128719 ], "valid", [ ], "NV8" ], [ [ 128720, 128720 ], "valid", [ ], "NV8" ], [ [ 128721, 128735 ], "disallowed" ], [ [ 128736, 128748 ], "valid", [ ], "NV8" ], [ [ 128749, 128751 ], "disallowed" ], [ [ 128752, 128755 ], "valid", [ ], "NV8" ], [ [ 128756, 128767 ], "disallowed" ], [ [ 128768, 128883 ], "valid", [ ], "NV8" ], [ [ 128884, 128895 ], "disallowed" ], [ [ 128896, 128980 ], "valid", [ ], "NV8" ], [ [ 128981, 129023 ], "disallowed" ], [ [ 129024, 129035 ], "valid", [ ], "NV8" ], [ [ 129036, 129039 ], "disallowed" ], [ [ 129040, 129095 ], "valid", [ ], "NV8" ], [ [ 129096, 129103 ], "disallowed" ], [ [ 129104, 129113 ], "valid", [ ], "NV8" ], [ [ 129114, 129119 ], "disallowed" ], [ [ 129120, 129159 ], "valid", [ ], "NV8" ], [ [ 129160, 129167 ], "disallowed" ], [ [ 129168, 129197 ], "valid", [ ], "NV8" ], [ [ 129198, 129295 ], "disallowed" ], [ [ 129296, 129304 ], "valid", [ ], "NV8" ], [ [ 129305, 129407 ], "disallowed" ], [ [ 129408, 129412 ], "valid", [ ], "NV8" ], [ [ 129413, 129471 ], "disallowed" ], [ [ 129472, 129472 ], "valid", [ ], "NV8" ], [ [ 129473, 131069 ], "disallowed" ], [ [ 131070, 131071 ], "disallowed" ], [ [ 131072, 173782 ], "valid" ], [ [ 173783, 173823 ], "disallowed" ], [ [ 173824, 177972 ], "valid" ], [ [ 177973, 177983 ], "disallowed" ], [ [ 177984, 178205 ], "valid" ], [ [ 178206, 178207 ], "disallowed" ], [ [ 178208, 183969 ], "valid" ], [ [ 183970, 194559 ], "disallowed" ], [ [ 194560, 194560 ], "mapped", [ 20029 ] ], [ [ 194561, 194561 ], "mapped", [ 20024 ] ], [ [ 194562, 194562 ], "mapped", [ 20033 ] ], [ [ 194563, 194563 ], "mapped", [ 131362 ] ], [ [ 194564, 194564 ], "mapped", [ 20320 ] ], [ [ 194565, 194565 ], "mapped", [ 20398 ] ], [ [ 194566, 194566 ], "mapped", [ 20411 ] ], [ [ 194567, 194567 ], "mapped", [ 20482 ] ], [ [ 194568, 194568 ], "mapped", [ 20602 ] ], [ [ 194569, 194569 ], "mapped", [ 20633 ] ], [ [ 194570, 194570 ], "mapped", [ 20711 ] ], [ [ 194571, 194571 ], "mapped", [ 20687 ] ], [ [ 194572, 194572 ], "mapped", [ 13470 ] ], [ [ 194573, 194573 ], "mapped", [ 132666 ] ], [ [ 194574, 194574 ], "mapped", [ 20813 ] ], [ [ 194575, 194575 ], "mapped", [ 20820 ] ], [ [ 194576, 194576 ], "mapped", [ 20836 ] ], [ [ 194577, 194577 ], "mapped", [ 20855 ] ], [ [ 194578, 194578 ], "mapped", [ 132380 ] ], [ [ 194579, 194579 ], "mapped", [ 13497 ] ], [ [ 194580, 194580 ], "mapped", [ 20839 ] ], [ [ 194581, 194581 ], "mapped", [ 20877 ] ], [ [ 194582, 194582 ], "mapped", [ 132427 ] ], [ [ 194583, 194583 ], "mapped", [ 20887 ] ], [ [ 194584, 194584 ], "mapped", [ 20900 ] ], [ [ 194585, 194585 ], "mapped", [ 20172 ] ], [ [ 194586, 194586 ], "mapped", [ 20908 ] ], [ [ 194587, 194587 ], "mapped", [ 20917 ] ], [ [ 194588, 194588 ], "mapped", [ 168415 ] ], [ [ 194589, 194589 ], "mapped", [ 20981 ] ], [ [ 194590, 194590 ], "mapped", [ 20995 ] ], [ [ 194591, 194591 ], "mapped", [ 13535 ] ], [ [ 194592, 194592 ], "mapped", [ 21051 ] ], [ [ 194593, 194593 ], "mapped", [ 21062 ] ], [ [ 194594, 194594 ], "mapped", [ 21106 ] ], [ [ 194595, 194595 ], "mapped", [ 21111 ] ], [ [ 194596, 194596 ], "mapped", [ 13589 ] ], [ [ 194597, 194597 ], "mapped", [ 21191 ] ], [ [ 194598, 194598 ], "mapped", [ 21193 ] ], [ [ 194599, 194599 ], "mapped", [ 21220 ] ], [ [ 194600, 194600 ], "mapped", [ 21242 ] ], [ [ 194601, 194601 ], "mapped", [ 21253 ] ], [ [ 194602, 194602 ], "mapped", [ 21254 ] ], [ [ 194603, 194603 ], "mapped", [ 21271 ] ], [ [ 194604, 194604 ], "mapped", [ 21321 ] ], [ [ 194605, 194605 ], "mapped", [ 21329 ] ], [ [ 194606, 194606 ], "mapped", [ 21338 ] ], [ [ 194607, 194607 ], "mapped", [ 21363 ] ], [ [ 194608, 194608 ], "mapped", [ 21373 ] ], [ [ 194609, 194611 ], "mapped", [ 21375 ] ], [ [ 194612, 194612 ], "mapped", [ 133676 ] ], [ [ 194613, 194613 ], "mapped", [ 28784 ] ], [ [ 194614, 194614 ], "mapped", [ 21450 ] ], [ [ 194615, 194615 ], "mapped", [ 21471 ] ], [ [ 194616, 194616 ], "mapped", [ 133987 ] ], [ [ 194617, 194617 ], "mapped", [ 21483 ] ], [ [ 194618, 194618 ], "mapped", [ 21489 ] ], [ [ 194619, 194619 ], "mapped", [ 21510 ] ], [ [ 194620, 194620 ], "mapped", [ 21662 ] ], [ [ 194621, 194621 ], "mapped", [ 21560 ] ], [ [ 194622, 194622 ], "mapped", [ 21576 ] ], [ [ 194623, 194623 ], "mapped", [ 21608 ] ], [ [ 194624, 194624 ], "mapped", [ 21666 ] ], [ [ 194625, 194625 ], "mapped", [ 21750 ] ], [ [ 194626, 194626 ], "mapped", [ 21776 ] ], [ [ 194627, 194627 ], "mapped", [ 21843 ] ], [ [ 194628, 194628 ], "mapped", [ 21859 ] ], [ [ 194629, 194630 ], "mapped", [ 21892 ] ], [ [ 194631, 194631 ], "mapped", [ 21913 ] ], [ [ 194632, 194632 ], "mapped", [ 21931 ] ], [ [ 194633, 194633 ], "mapped", [ 21939 ] ], [ [ 194634, 194634 ], "mapped", [ 21954 ] ], [ [ 194635, 194635 ], "mapped", [ 22294 ] ], [ [ 194636, 194636 ], "mapped", [ 22022 ] ], [ [ 194637, 194637 ], "mapped", [ 22295 ] ], [ [ 194638, 194638 ], "mapped", [ 22097 ] ], [ [ 194639, 194639 ], "mapped", [ 22132 ] ], [ [ 194640, 194640 ], "mapped", [ 20999 ] ], [ [ 194641, 194641 ], "mapped", [ 22766 ] ], [ [ 194642, 194642 ], "mapped", [ 22478 ] ], [ [ 194643, 194643 ], "mapped", [ 22516 ] ], [ [ 194644, 194644 ], "mapped", [ 22541 ] ], [ [ 194645, 194645 ], "mapped", [ 22411 ] ], [ [ 194646, 194646 ], "mapped", [ 22578 ] ], [ [ 194647, 194647 ], "mapped", [ 22577 ] ], [ [ 194648, 194648 ], "mapped", [ 22700 ] ], [ [ 194649, 194649 ], "mapped", [ 136420 ] ], [ [ 194650, 194650 ], "mapped", [ 22770 ] ], [ [ 194651, 194651 ], "mapped", [ 22775 ] ], [ [ 194652, 194652 ], "mapped", [ 22790 ] ], [ [ 194653, 194653 ], "mapped", [ 22810 ] ], [ [ 194654, 194654 ], "mapped", [ 22818 ] ], [ [ 194655, 194655 ], "mapped", [ 22882 ] ], [ [ 194656, 194656 ], "mapped", [ 136872 ] ], [ [ 194657, 194657 ], "mapped", [ 136938 ] ], [ [ 194658, 194658 ], "mapped", [ 23020 ] ], [ [ 194659, 194659 ], "mapped", [ 23067 ] ], [ [ 194660, 194660 ], "mapped", [ 23079 ] ], [ [ 194661, 194661 ], "mapped", [ 23000 ] ], [ [ 194662, 194662 ], "mapped", [ 23142 ] ], [ [ 194663, 194663 ], "mapped", [ 14062 ] ], [ [ 194664, 194664 ], "disallowed" ], [ [ 194665, 194665 ], "mapped", [ 23304 ] ], [ [ 194666, 194667 ], "mapped", [ 23358 ] ], [ [ 194668, 194668 ], "mapped", [ 137672 ] ], [ [ 194669, 194669 ], "mapped", [ 23491 ] ], [ [ 194670, 194670 ], "mapped", [ 23512 ] ], [ [ 194671, 194671 ], "mapped", [ 23527 ] ], [ [ 194672, 194672 ], "mapped", [ 23539 ] ], [ [ 194673, 194673 ], "mapped", [ 138008 ] ], [ [ 194674, 194674 ], "mapped", [ 23551 ] ], [ [ 194675, 194675 ], "mapped", [ 23558 ] ], [ [ 194676, 194676 ], "disallowed" ], [ [ 194677, 194677 ], "mapped", [ 23586 ] ], [ [ 194678, 194678 ], "mapped", [ 14209 ] ], [ [ 194679, 194679 ], "mapped", [ 23648 ] ], [ [ 194680, 194680 ], "mapped", [ 23662 ] ], [ [ 194681, 194681 ], "mapped", [ 23744 ] ], [ [ 194682, 194682 ], "mapped", [ 23693 ] ], [ [ 194683, 194683 ], "mapped", [ 138724 ] ], [ [ 194684, 194684 ], "mapped", [ 23875 ] ], [ [ 194685, 194685 ], "mapped", [ 138726 ] ], [ [ 194686, 194686 ], "mapped", [ 23918 ] ], [ [ 194687, 194687 ], "mapped", [ 23915 ] ], [ [ 194688, 194688 ], "mapped", [ 23932 ] ], [ [ 194689, 194689 ], "mapped", [ 24033 ] ], [ [ 194690, 194690 ], "mapped", [ 24034 ] ], [ [ 194691, 194691 ], "mapped", [ 14383 ] ], [ [ 194692, 194692 ], "mapped", [ 24061 ] ], [ [ 194693, 194693 ], "mapped", [ 24104 ] ], [ [ 194694, 194694 ], "mapped", [ 24125 ] ], [ [ 194695, 194695 ], "mapped", [ 24169 ] ], [ [ 194696, 194696 ], "mapped", [ 14434 ] ], [ [ 194697, 194697 ], "mapped", [ 139651 ] ], [ [ 194698, 194698 ], "mapped", [ 14460 ] ], [ [ 194699, 194699 ], "mapped", [ 24240 ] ], [ [ 194700, 194700 ], "mapped", [ 24243 ] ], [ [ 194701, 194701 ], "mapped", [ 24246 ] ], [ [ 194702, 194702 ], "mapped", [ 24266 ] ], [ [ 194703, 194703 ], "mapped", [ 172946 ] ], [ [ 194704, 194704 ], "mapped", [ 24318 ] ], [ [ 194705, 194706 ], "mapped", [ 140081 ] ], [ [ 194707, 194707 ], "mapped", [ 33281 ] ], [ [ 194708, 194709 ], "mapped", [ 24354 ] ], [ [ 194710, 194710 ], "mapped", [ 14535 ] ], [ [ 194711, 194711 ], "mapped", [ 144056 ] ], [ [ 194712, 194712 ], "mapped", [ 156122 ] ], [ [ 194713, 194713 ], "mapped", [ 24418 ] ], [ [ 194714, 194714 ], "mapped", [ 24427 ] ], [ [ 194715, 194715 ], "mapped", [ 14563 ] ], [ [ 194716, 194716 ], "mapped", [ 24474 ] ], [ [ 194717, 194717 ], "mapped", [ 24525 ] ], [ [ 194718, 194718 ], "mapped", [ 24535 ] ], [ [ 194719, 194719 ], "mapped", [ 24569 ] ], [ [ 194720, 194720 ], "mapped", [ 24705 ] ], [ [ 194721, 194721 ], "mapped", [ 14650 ] ], [ [ 194722, 194722 ], "mapped", [ 14620 ] ], [ [ 194723, 194723 ], "mapped", [ 24724 ] ], [ [ 194724, 194724 ], "mapped", [ 141012 ] ], [ [ 194725, 194725 ], "mapped", [ 24775 ] ], [ [ 194726, 194726 ], "mapped", [ 24904 ] ], [ [ 194727, 194727 ], "mapped", [ 24908 ] ], [ [ 194728, 194728 ], "mapped", [ 24910 ] ], [ [ 194729, 194729 ], "mapped", [ 24908 ] ], [ [ 194730, 194730 ], "mapped", [ 24954 ] ], [ [ 194731, 194731 ], "mapped", [ 24974 ] ], [ [ 194732, 194732 ], "mapped", [ 25010 ] ], [ [ 194733, 194733 ], "mapped", [ 24996 ] ], [ [ 194734, 194734 ], "mapped", [ 25007 ] ], [ [ 194735, 194735 ], "mapped", [ 25054 ] ], [ [ 194736, 194736 ], "mapped", [ 25074 ] ], [ [ 194737, 194737 ], "mapped", [ 25078 ] ], [ [ 194738, 194738 ], "mapped", [ 25104 ] ], [ [ 194739, 194739 ], "mapped", [ 25115 ] ], [ [ 194740, 194740 ], "mapped", [ 25181 ] ], [ [ 194741, 194741 ], "mapped", [ 25265 ] ], [ [ 194742, 194742 ], "mapped", [ 25300 ] ], [ [ 194743, 194743 ], "mapped", [ 25424 ] ], [ [ 194744, 194744 ], "mapped", [ 142092 ] ], [ [ 194745, 194745 ], "mapped", [ 25405 ] ], [ [ 194746, 194746 ], "mapped", [ 25340 ] ], [ [ 194747, 194747 ], "mapped", [ 25448 ] ], [ [ 194748, 194748 ], "mapped", [ 25475 ] ], [ [ 194749, 194749 ], "mapped", [ 25572 ] ], [ [ 194750, 194750 ], "mapped", [ 142321 ] ], [ [ 194751, 194751 ], "mapped", [ 25634 ] ], [ [ 194752, 194752 ], "mapped", [ 25541 ] ], [ [ 194753, 194753 ], "mapped", [ 25513 ] ], [ [ 194754, 194754 ], "mapped", [ 14894 ] ], [ [ 194755, 194755 ], "mapped", [ 25705 ] ], [ [ 194756, 194756 ], "mapped", [ 25726 ] ], [ [ 194757, 194757 ], "mapped", [ 25757 ] ], [ [ 194758, 194758 ], "mapped", [ 25719 ] ], [ [ 194759, 194759 ], "mapped", [ 14956 ] ], [ [ 194760, 194760 ], "mapped", [ 25935 ] ], [ [ 194761, 194761 ], "mapped", [ 25964 ] ], [ [ 194762, 194762 ], "mapped", [ 143370 ] ], [ [ 194763, 194763 ], "mapped", [ 26083 ] ], [ [ 194764, 194764 ], "mapped", [ 26360 ] ], [ [ 194765, 194765 ], "mapped", [ 26185 ] ], [ [ 194766, 194766 ], "mapped", [ 15129 ] ], [ [ 194767, 194767 ], "mapped", [ 26257 ] ], [ [ 194768, 194768 ], "mapped", [ 15112 ] ], [ [ 194769, 194769 ], "mapped", [ 15076 ] ], [ [ 194770, 194770 ], "mapped", [ 20882 ] ], [ [ 194771, 194771 ], "mapped", [ 20885 ] ], [ [ 194772, 194772 ], "mapped", [ 26368 ] ], [ [ 194773, 194773 ], "mapped", [ 26268 ] ], [ [ 194774, 194774 ], "mapped", [ 32941 ] ], [ [ 194775, 194775 ], "mapped", [ 17369 ] ], [ [ 194776, 194776 ], "mapped", [ 26391 ] ], [ [ 194777, 194777 ], "mapped", [ 26395 ] ], [ [ 194778, 194778 ], "mapped", [ 26401 ] ], [ [ 194779, 194779 ], "mapped", [ 26462 ] ], [ [ 194780, 194780 ], "mapped", [ 26451 ] ], [ [ 194781, 194781 ], "mapped", [ 144323 ] ], [ [ 194782, 194782 ], "mapped", [ 15177 ] ], [ [ 194783, 194783 ], "mapped", [ 26618 ] ], [ [ 194784, 194784 ], "mapped", [ 26501 ] ], [ [ 194785, 194785 ], "mapped", [ 26706 ] ], [ [ 194786, 194786 ], "mapped", [ 26757 ] ], [ [ 194787, 194787 ], "mapped", [ 144493 ] ], [ [ 194788, 194788 ], "mapped", [ 26766 ] ], [ [ 194789, 194789 ], "mapped", [ 26655 ] ], [ [ 194790, 194790 ], "mapped", [ 26900 ] ], [ [ 194791, 194791 ], "mapped", [ 15261 ] ], [ [ 194792, 194792 ], "mapped", [ 26946 ] ], [ [ 194793, 194793 ], "mapped", [ 27043 ] ], [ [ 194794, 194794 ], "mapped", [ 27114 ] ], [ [ 194795, 194795 ], "mapped", [ 27304 ] ], [ [ 194796, 194796 ], "mapped", [ 145059 ] ], [ [ 194797, 194797 ], "mapped", [ 27355 ] ], [ [ 194798, 194798 ], "mapped", [ 15384 ] ], [ [ 194799, 194799 ], "mapped", [ 27425 ] ], [ [ 194800, 194800 ], "mapped", [ 145575 ] ], [ [ 194801, 194801 ], "mapped", [ 27476 ] ], [ [ 194802, 194802 ], "mapped", [ 15438 ] ], [ [ 194803, 194803 ], "mapped", [ 27506 ] ], [ [ 194804, 194804 ], "mapped", [ 27551 ] ], [ [ 194805, 194805 ], "mapped", [ 27578 ] ], [ [ 194806, 194806 ], "mapped", [ 27579 ] ], [ [ 194807, 194807 ], "mapped", [ 146061 ] ], [ [ 194808, 194808 ], "mapped", [ 138507 ] ], [ [ 194809, 194809 ], "mapped", [ 146170 ] ], [ [ 194810, 194810 ], "mapped", [ 27726 ] ], [ [ 194811, 194811 ], "mapped", [ 146620 ] ], [ [ 194812, 194812 ], "mapped", [ 27839 ] ], [ [ 194813, 194813 ], "mapped", [ 27853 ] ], [ [ 194814, 194814 ], "mapped", [ 27751 ] ], [ [ 194815, 194815 ], "mapped", [ 27926 ] ], [ [ 194816, 194816 ], "mapped", [ 27966 ] ], [ [ 194817, 194817 ], "mapped", [ 28023 ] ], [ [ 194818, 194818 ], "mapped", [ 27969 ] ], [ [ 194819, 194819 ], "mapped", [ 28009 ] ], [ [ 194820, 194820 ], "mapped", [ 28024 ] ], [ [ 194821, 194821 ], "mapped", [ 28037 ] ], [ [ 194822, 194822 ], "mapped", [ 146718 ] ], [ [ 194823, 194823 ], "mapped", [ 27956 ] ], [ [ 194824, 194824 ], "mapped", [ 28207 ] ], [ [ 194825, 194825 ], "mapped", [ 28270 ] ], [ [ 194826, 194826 ], "mapped", [ 15667 ] ], [ [ 194827, 194827 ], "mapped", [ 28363 ] ], [ [ 194828, 194828 ], "mapped", [ 28359 ] ], [ [ 194829, 194829 ], "mapped", [ 147153 ] ], [ [ 194830, 194830 ], "mapped", [ 28153 ] ], [ [ 194831, 194831 ], "mapped", [ 28526 ] ], [ [ 194832, 194832 ], "mapped", [ 147294 ] ], [ [ 194833, 194833 ], "mapped", [ 147342 ] ], [ [ 194834, 194834 ], "mapped", [ 28614 ] ], [ [ 194835, 194835 ], "mapped", [ 28729 ] ], [ [ 194836, 194836 ], "mapped", [ 28702 ] ], [ [ 194837, 194837 ], "mapped", [ 28699 ] ], [ [ 194838, 194838 ], "mapped", [ 15766 ] ], [ [ 194839, 194839 ], "mapped", [ 28746 ] ], [ [ 194840, 194840 ], "mapped", [ 28797 ] ], [ [ 194841, 194841 ], "mapped", [ 28791 ] ], [ [ 194842, 194842 ], "mapped", [ 28845 ] ], [ [ 194843, 194843 ], "mapped", [ 132389 ] ], [ [ 194844, 194844 ], "mapped", [ 28997 ] ], [ [ 194845, 194845 ], "mapped", [ 148067 ] ], [ [ 194846, 194846 ], "mapped", [ 29084 ] ], [ [ 194847, 194847 ], "disallowed" ], [ [ 194848, 194848 ], "mapped", [ 29224 ] ], [ [ 194849, 194849 ], "mapped", [ 29237 ] ], [ [ 194850, 194850 ], "mapped", [ 29264 ] ], [ [ 194851, 194851 ], "mapped", [ 149000 ] ], [ [ 194852, 194852 ], "mapped", [ 29312 ] ], [ [ 194853, 194853 ], "mapped", [ 29333 ] ], [ [ 194854, 194854 ], "mapped", [ 149301 ] ], [ [ 194855, 194855 ], "mapped", [ 149524 ] ], [ [ 194856, 194856 ], "mapped", [ 29562 ] ], [ [ 194857, 194857 ], "mapped", [ 29579 ] ], [ [ 194858, 194858 ], "mapped", [ 16044 ] ], [ [ 194859, 194859 ], "mapped", [ 29605 ] ], [ [ 194860, 194861 ], "mapped", [ 16056 ] ], [ [ 194862, 194862 ], "mapped", [ 29767 ] ], [ [ 194863, 194863 ], "mapped", [ 29788 ] ], [ [ 194864, 194864 ], "mapped", [ 29809 ] ], [ [ 194865, 194865 ], "mapped", [ 29829 ] ], [ [ 194866, 194866 ], "mapped", [ 29898 ] ], [ [ 194867, 194867 ], "mapped", [ 16155 ] ], [ [ 194868, 194868 ], "mapped", [ 29988 ] ], [ [ 194869, 194869 ], "mapped", [ 150582 ] ], [ [ 194870, 194870 ], "mapped", [ 30014 ] ], [ [ 194871, 194871 ], "mapped", [ 150674 ] ], [ [ 194872, 194872 ], "mapped", [ 30064 ] ], [ [ 194873, 194873 ], "mapped", [ 139679 ] ], [ [ 194874, 194874 ], "mapped", [ 30224 ] ], [ [ 194875, 194875 ], "mapped", [ 151457 ] ], [ [ 194876, 194876 ], "mapped", [ 151480 ] ], [ [ 194877, 194877 ], "mapped", [ 151620 ] ], [ [ 194878, 194878 ], "mapped", [ 16380 ] ], [ [ 194879, 194879 ], "mapped", [ 16392 ] ], [ [ 194880, 194880 ], "mapped", [ 30452 ] ], [ [ 194881, 194881 ], "mapped", [ 151795 ] ], [ [ 194882, 194882 ], "mapped", [ 151794 ] ], [ [ 194883, 194883 ], "mapped", [ 151833 ] ], [ [ 194884, 194884 ], "mapped", [ 151859 ] ], [ [ 194885, 194885 ], "mapped", [ 30494 ] ], [ [ 194886, 194887 ], "mapped", [ 30495 ] ], [ [ 194888, 194888 ], "mapped", [ 30538 ] ], [ [ 194889, 194889 ], "mapped", [ 16441 ] ], [ [ 194890, 194890 ], "mapped", [ 30603 ] ], [ [ 194891, 194891 ], "mapped", [ 16454 ] ], [ [ 194892, 194892 ], "mapped", [ 16534 ] ], [ [ 194893, 194893 ], "mapped", [ 152605 ] ], [ [ 194894, 194894 ], "mapped", [ 30798 ] ], [ [ 194895, 194895 ], "mapped", [ 30860 ] ], [ [ 194896, 194896 ], "mapped", [ 30924 ] ], [ [ 194897, 194897 ], "mapped", [ 16611 ] ], [ [ 194898, 194898 ], "mapped", [ 153126 ] ], [ [ 194899, 194899 ], "mapped", [ 31062 ] ], [ [ 194900, 194900 ], "mapped", [ 153242 ] ], [ [ 194901, 194901 ], "mapped", [ 153285 ] ], [ [ 194902, 194902 ], "mapped", [ 31119 ] ], [ [ 194903, 194903 ], "mapped", [ 31211 ] ], [ [ 194904, 194904 ], "mapped", [ 16687 ] ], [ [ 194905, 194905 ], "mapped", [ 31296 ] ], [ [ 194906, 194906 ], "mapped", [ 31306 ] ], [ [ 194907, 194907 ], "mapped", [ 31311 ] ], [ [ 194908, 194908 ], "mapped", [ 153980 ] ], [ [ 194909, 194910 ], "mapped", [ 154279 ] ], [ [ 194911, 194911 ], "disallowed" ], [ [ 194912, 194912 ], "mapped", [ 16898 ] ], [ [ 194913, 194913 ], "mapped", [ 154539 ] ], [ [ 194914, 194914 ], "mapped", [ 31686 ] ], [ [ 194915, 194915 ], "mapped", [ 31689 ] ], [ [ 194916, 194916 ], "mapped", [ 16935 ] ], [ [ 194917, 194917 ], "mapped", [ 154752 ] ], [ [ 194918, 194918 ], "mapped", [ 31954 ] ], [ [ 194919, 194919 ], "mapped", [ 17056 ] ], [ [ 194920, 194920 ], "mapped", [ 31976 ] ], [ [ 194921, 194921 ], "mapped", [ 31971 ] ], [ [ 194922, 194922 ], "mapped", [ 32000 ] ], [ [ 194923, 194923 ], "mapped", [ 155526 ] ], [ [ 194924, 194924 ], "mapped", [ 32099 ] ], [ [ 194925, 194925 ], "mapped", [ 17153 ] ], [ [ 194926, 194926 ], "mapped", [ 32199 ] ], [ [ 194927, 194927 ], "mapped", [ 32258 ] ], [ [ 194928, 194928 ], "mapped", [ 32325 ] ], [ [ 194929, 194929 ], "mapped", [ 17204 ] ], [ [ 194930, 194930 ], "mapped", [ 156200 ] ], [ [ 194931, 194931 ], "mapped", [ 156231 ] ], [ [ 194932, 194932 ], "mapped", [ 17241 ] ], [ [ 194933, 194933 ], "mapped", [ 156377 ] ], [ [ 194934, 194934 ], "mapped", [ 32634 ] ], [ [ 194935, 194935 ], "mapped", [ 156478 ] ], [ [ 194936, 194936 ], "mapped", [ 32661 ] ], [ [ 194937, 194937 ], "mapped", [ 32762 ] ], [ [ 194938, 194938 ], "mapped", [ 32773 ] ], [ [ 194939, 194939 ], "mapped", [ 156890 ] ], [ [ 194940, 194940 ], "mapped", [ 156963 ] ], [ [ 194941, 194941 ], "mapped", [ 32864 ] ], [ [ 194942, 194942 ], "mapped", [ 157096 ] ], [ [ 194943, 194943 ], "mapped", [ 32880 ] ], [ [ 194944, 194944 ], "mapped", [ 144223 ] ], [ [ 194945, 194945 ], "mapped", [ 17365 ] ], [ [ 194946, 194946 ], "mapped", [ 32946 ] ], [ [ 194947, 194947 ], "mapped", [ 33027 ] ], [ [ 194948, 194948 ], "mapped", [ 17419 ] ], [ [ 194949, 194949 ], "mapped", [ 33086 ] ], [ [ 194950, 194950 ], "mapped", [ 23221 ] ], [ [ 194951, 194951 ], "mapped", [ 157607 ] ], [ [ 194952, 194952 ], "mapped", [ 157621 ] ], [ [ 194953, 194953 ], "mapped", [ 144275 ] ], [ [ 194954, 194954 ], "mapped", [ 144284 ] ], [ [ 194955, 194955 ], "mapped", [ 33281 ] ], [ [ 194956, 194956 ], "mapped", [ 33284 ] ], [ [ 194957, 194957 ], "mapped", [ 36766 ] ], [ [ 194958, 194958 ], "mapped", [ 17515 ] ], [ [ 194959, 194959 ], "mapped", [ 33425 ] ], [ [ 194960, 194960 ], "mapped", [ 33419 ] ], [ [ 194961, 194961 ], "mapped", [ 33437 ] ], [ [ 194962, 194962 ], "mapped", [ 21171 ] ], [ [ 194963, 194963 ], "mapped", [ 33457 ] ], [ [ 194964, 194964 ], "mapped", [ 33459 ] ], [ [ 194965, 194965 ], "mapped", [ 33469 ] ], [ [ 194966, 194966 ], "mapped", [ 33510 ] ], [ [ 194967, 194967 ], "mapped", [ 158524 ] ], [ [ 194968, 194968 ], "mapped", [ 33509 ] ], [ [ 194969, 194969 ], "mapped", [ 33565 ] ], [ [ 194970, 194970 ], "mapped", [ 33635 ] ], [ [ 194971, 194971 ], "mapped", [ 33709 ] ], [ [ 194972, 194972 ], "mapped", [ 33571 ] ], [ [ 194973, 194973 ], "mapped", [ 33725 ] ], [ [ 194974, 194974 ], "mapped", [ 33767 ] ], [ [ 194975, 194975 ], "mapped", [ 33879 ] ], [ [ 194976, 194976 ], "mapped", [ 33619 ] ], [ [ 194977, 194977 ], "mapped", [ 33738 ] ], [ [ 194978, 194978 ], "mapped", [ 33740 ] ], [ [ 194979, 194979 ], "mapped", [ 33756 ] ], [ [ 194980, 194980 ], "mapped", [ 158774 ] ], [ [ 194981, 194981 ], "mapped", [ 159083 ] ], [ [ 194982, 194982 ], "mapped", [ 158933 ] ], [ [ 194983, 194983 ], "mapped", [ 17707 ] ], [ [ 194984, 194984 ], "mapped", [ 34033 ] ], [ [ 194985, 194985 ], "mapped", [ 34035 ] ], [ [ 194986, 194986 ], "mapped", [ 34070 ] ], [ [ 194987, 194987 ], "mapped", [ 160714 ] ], [ [ 194988, 194988 ], "mapped", [ 34148 ] ], [ [ 194989, 194989 ], "mapped", [ 159532 ] ], [ [ 194990, 194990 ], "mapped", [ 17757 ] ], [ [ 194991, 194991 ], "mapped", [ 17761 ] ], [ [ 194992, 194992 ], "mapped", [ 159665 ] ], [ [ 194993, 194993 ], "mapped", [ 159954 ] ], [ [ 194994, 194994 ], "mapped", [ 17771 ] ], [ [ 194995, 194995 ], "mapped", [ 34384 ] ], [ [ 194996, 194996 ], "mapped", [ 34396 ] ], [ [ 194997, 194997 ], "mapped", [ 34407 ] ], [ [ 194998, 194998 ], "mapped", [ 34409 ] ], [ [ 194999, 194999 ], "mapped", [ 34473 ] ], [ [ 195000, 195000 ], "mapped", [ 34440 ] ], [ [ 195001, 195001 ], "mapped", [ 34574 ] ], [ [ 195002, 195002 ], "mapped", [ 34530 ] ], [ [ 195003, 195003 ], "mapped", [ 34681 ] ], [ [ 195004, 195004 ], "mapped", [ 34600 ] ], [ [ 195005, 195005 ], "mapped", [ 34667 ] ], [ [ 195006, 195006 ], "mapped", [ 34694 ] ], [ [ 195007, 195007 ], "disallowed" ], [ [ 195008, 195008 ], "mapped", [ 34785 ] ], [ [ 195009, 195009 ], "mapped", [ 34817 ] ], [ [ 195010, 195010 ], "mapped", [ 17913 ] ], [ [ 195011, 195011 ], "mapped", [ 34912 ] ], [ [ 195012, 195012 ], "mapped", [ 34915 ] ], [ [ 195013, 195013 ], "mapped", [ 161383 ] ], [ [ 195014, 195014 ], "mapped", [ 35031 ] ], [ [ 195015, 195015 ], "mapped", [ 35038 ] ], [ [ 195016, 195016 ], "mapped", [ 17973 ] ], [ [ 195017, 195017 ], "mapped", [ 35066 ] ], [ [ 195018, 195018 ], "mapped", [ 13499 ] ], [ [ 195019, 195019 ], "mapped", [ 161966 ] ], [ [ 195020, 195020 ], "mapped", [ 162150 ] ], [ [ 195021, 195021 ], "mapped", [ 18110 ] ], [ [ 195022, 195022 ], "mapped", [ 18119 ] ], [ [ 195023, 195023 ], "mapped", [ 35488 ] ], [ [ 195024, 195024 ], "mapped", [ 35565 ] ], [ [ 195025, 195025 ], "mapped", [ 35722 ] ], [ [ 195026, 195026 ], "mapped", [ 35925 ] ], [ [ 195027, 195027 ], "mapped", [ 162984 ] ], [ [ 195028, 195028 ], "mapped", [ 36011 ] ], [ [ 195029, 195029 ], "mapped", [ 36033 ] ], [ [ 195030, 195030 ], "mapped", [ 36123 ] ], [ [ 195031, 195031 ], "mapped", [ 36215 ] ], [ [ 195032, 195032 ], "mapped", [ 163631 ] ], [ [ 195033, 195033 ], "mapped", [ 133124 ] ], [ [ 195034, 195034 ], "mapped", [ 36299 ] ], [ [ 195035, 195035 ], "mapped", [ 36284 ] ], [ [ 195036, 195036 ], "mapped", [ 36336 ] ], [ [ 195037, 195037 ], "mapped", [ 133342 ] ], [ [ 195038, 195038 ], "mapped", [ 36564 ] ], [ [ 195039, 195039 ], "mapped", [ 36664 ] ], [ [ 195040, 195040 ], "mapped", [ 165330 ] ], [ [ 195041, 195041 ], "mapped", [ 165357 ] ], [ [ 195042, 195042 ], "mapped", [ 37012 ] ], [ [ 195043, 195043 ], "mapped", [ 37105 ] ], [ [ 195044, 195044 ], "mapped", [ 37137 ] ], [ [ 195045, 195045 ], "mapped", [ 165678 ] ], [ [ 195046, 195046 ], "mapped", [ 37147 ] ], [ [ 195047, 195047 ], "mapped", [ 37432 ] ], [ [ 195048, 195048 ], "mapped", [ 37591 ] ], [ [ 195049, 195049 ], "mapped", [ 37592 ] ], [ [ 195050, 195050 ], "mapped", [ 37500 ] ], [ [ 195051, 195051 ], "mapped", [ 37881 ] ], [ [ 195052, 195052 ], "mapped", [ 37909 ] ], [ [ 195053, 195053 ], "mapped", [ 166906 ] ], [ [ 195054, 195054 ], "mapped", [ 38283 ] ], [ [ 195055, 195055 ], "mapped", [ 18837 ] ], [ [ 195056, 195056 ], "mapped", [ 38327 ] ], [ [ 195057, 195057 ], "mapped", [ 167287 ] ], [ [ 195058, 195058 ], "mapped", [ 18918 ] ], [ [ 195059, 195059 ], "mapped", [ 38595 ] ], [ [ 195060, 195060 ], "mapped", [ 23986 ] ], [ [ 195061, 195061 ], "mapped", [ 38691 ] ], [ [ 195062, 195062 ], "mapped", [ 168261 ] ], [ [ 195063, 195063 ], "mapped", [ 168474 ] ], [ [ 195064, 195064 ], "mapped", [ 19054 ] ], [ [ 195065, 195065 ], "mapped", [ 19062 ] ], [ [ 195066, 195066 ], "mapped", [ 38880 ] ], [ [ 195067, 195067 ], "mapped", [ 168970 ] ], [ [ 195068, 195068 ], "mapped", [ 19122 ] ], [ [ 195069, 195069 ], "mapped", [ 169110 ] ], [ [ 195070, 195071 ], "mapped", [ 38923 ] ], [ [ 195072, 195072 ], "mapped", [ 38953 ] ], [ [ 195073, 195073 ], "mapped", [ 169398 ] ], [ [ 195074, 195074 ], "mapped", [ 39138 ] ], [ [ 195075, 195075 ], "mapped", [ 19251 ] ], [ [ 195076, 195076 ], "mapped", [ 39209 ] ], [ [ 195077, 195077 ], "mapped", [ 39335 ] ], [ [ 195078, 195078 ], "mapped", [ 39362 ] ], [ [ 195079, 195079 ], "mapped", [ 39422 ] ], [ [ 195080, 195080 ], "mapped", [ 19406 ] ], [ [ 195081, 195081 ], "mapped", [ 170800 ] ], [ [ 195082, 195082 ], "mapped", [ 39698 ] ], [ [ 195083, 195083 ], "mapped", [ 40000 ] ], [ [ 195084, 195084 ], "mapped", [ 40189 ] ], [ [ 195085, 195085 ], "mapped", [ 19662 ] ], [ [ 195086, 195086 ], "mapped", [ 19693 ] ], [ [ 195087, 195087 ], "mapped", [ 40295 ] ], [ [ 195088, 195088 ], "mapped", [ 172238 ] ], [ [ 195089, 195089 ], "mapped", [ 19704 ] ], [ [ 195090, 195090 ], "mapped", [ 172293 ] ], [ [ 195091, 195091 ], "mapped", [ 172558 ] ], [ [ 195092, 195092 ], "mapped", [ 172689 ] ], [ [ 195093, 195093 ], "mapped", [ 40635 ] ], [ [ 195094, 195094 ], "mapped", [ 19798 ] ], [ [ 195095, 195095 ], "mapped", [ 40697 ] ], [ [ 195096, 195096 ], "mapped", [ 40702 ] ], [ [ 195097, 195097 ], "mapped", [ 40709 ] ], [ [ 195098, 195098 ], "mapped", [ 40719 ] ], [ [ 195099, 195099 ], "mapped", [ 40726 ] ], [ [ 195100, 195100 ], "mapped", [ 40763 ] ], [ [ 195101, 195101 ], "mapped", [ 173568 ] ], [ [ 195102, 196605 ], "disallowed" ], [ [ 196606, 196607 ], "disallowed" ], [ [ 196608, 262141 ], "disallowed" ], [ [ 262142, 262143 ], "disallowed" ], [ [ 262144, 327677 ], "disallowed" ], [ [ 327678, 327679 ], "disallowed" ], [ [ 327680, 393213 ], "disallowed" ], [ [ 393214, 393215 ], "disallowed" ], [ [ 393216, 458749 ], "disallowed" ], [ [ 458750, 458751 ], "disallowed" ], [ [ 458752, 524285 ], "disallowed" ], [ [ 524286, 524287 ], "disallowed" ], [ [ 524288, 589821 ], "disallowed" ], [ [ 589822, 589823 ], "disallowed" ], [ [ 589824, 655357 ], "disallowed" ], [ [ 655358, 655359 ], "disallowed" ], [ [ 655360, 720893 ], "disallowed" ], [ [ 720894, 720895 ], "disallowed" ], [ [ 720896, 786429 ], "disallowed" ], [ [ 786430, 786431 ], "disallowed" ], [ [ 786432, 851965 ], "disallowed" ], [ [ 851966, 851967 ], "disallowed" ], [ [ 851968, 917501 ], "disallowed" ], [ [ 917502, 917503 ], "disallowed" ], [ [ 917504, 917504 ], "disallowed" ], [ [ 917505, 917505 ], "disallowed" ], [ [ 917506, 917535 ], "disallowed" ], [ [ 917536, 917631 ], "disallowed" ], [ [ 917632, 917759 ], "disallowed" ], [ [ 917760, 917999 ], "ignored" ], [ [ 918000, 983037 ], "disallowed" ], [ [ 983038, 983039 ], "disallowed" ], [ [ 983040, 1048573 ], "disallowed" ], [ [ 1048574, 1048575 ], "disallowed" ], [ [ 1048576, 1114109 ], "disallowed" ], [ [ 1114110, 1114111 ], "disallowed" ] ]; var punycode = require$$0$3; var mappingTable = require$$1; var PROCESSING_OPTIONS = { TRANSITIONAL: 0, NONTRANSITIONAL: 1 }; function normalize$1(str) { // fix bug in v8 return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); } function findStatus(val) { var start = 0; var end = mappingTable.length - 1; while (start <= end) { var mid = Math.floor((start + end) / 2); var target = mappingTable[mid]; if (target[0][0] <= val && target[0][1] >= val) { return target; } else if (target[0][0] > val) { end = mid - 1; } else { start = mid + 1; } } return null; } var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; function countSymbols(string) { return string // replace every surrogate pair with a BMP symbol .replace(regexAstralSymbols, '_') // then get the length .length; } function mapChars(domain_name, useSTD3, processing_option) { var hasError = false; var processed = ""; var len = countSymbols(domain_name); for (var i = 0; i < len; ++i) { var codePoint = domain_name.codePointAt(i); var status = findStatus(codePoint); switch (status[1]) { case "disallowed": hasError = true; processed += String.fromCodePoint(codePoint); break; case "ignored": break; case "mapped": processed += String.fromCodePoint.apply(String, status[2]); break; case "deviation": if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { processed += String.fromCodePoint.apply(String, status[2]); } else { processed += String.fromCodePoint(codePoint); } break; case "valid": processed += String.fromCodePoint(codePoint); break; case "disallowed_STD3_mapped": if (useSTD3) { hasError = true; processed += String.fromCodePoint(codePoint); } else { processed += String.fromCodePoint.apply(String, status[2]); } break; case "disallowed_STD3_valid": if (useSTD3) { hasError = true; } processed += String.fromCodePoint(codePoint); break; } } return { string: processed, error: hasError }; } var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; function validateLabel(label, processing_option) { if (label.substr(0, 4) === "xn--") { label = punycode.toUnicode(label); PROCESSING_OPTIONS.NONTRANSITIONAL; } var error = false; if (normalize$1(label) !== label || (label[3] === "-" && label[4] === "-") || label[0] === "-" || label[label.length - 1] === "-" || label.indexOf(".") !== -1 || label.search(combiningMarksRegex) === 0) { error = true; } var len = countSymbols(label); for (var i = 0; i < len; ++i) { var status = findStatus(label.codePointAt(i)); if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && status[1] !== "valid" && status[1] !== "deviation")) { error = true; break; } } return { label: label, error: error }; } function processing(domain_name, useSTD3, processing_option) { var result = mapChars(domain_name, useSTD3, processing_option); result.string = normalize$1(result.string); var labels = result.string.split("."); for (var i = 0; i < labels.length; ++i) { try { var validation = validateLabel(labels[i]); labels[i] = validation.label; result.error = result.error || validation.error; } catch(e) { result.error = true; } } return { string: labels.join("."), error: result.error }; } tr46.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { var result = processing(domain_name, useSTD3, processing_option); var labels = result.string.split("."); labels = labels.map(function(l) { try { return punycode.toASCII(l); } catch(e) { result.error = true; return l; } }); if (verifyDnsLength) { var total = labels.slice(0, labels.length - 1).join(".").length; if (total.length > 253 || total.length === 0) { result.error = true; } for (var i=0; i < labels.length; ++i) { if (labels.length > 63 || labels.length === 0) { result.error = true; break; } } } if (result.error) return null; return labels.join("."); }; tr46.toUnicode = function(domain_name, useSTD3) { var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); return { domain: result.string, error: result.error }; }; tr46.PROCESSING_OPTIONS = PROCESSING_OPTIONS; (function (module) { const punycode = require$$0$3; const tr46$1 = tr46; const specialSchemes = { ftp: 21, file: null, gopher: 70, http: 80, https: 443, ws: 80, wss: 443 }; const failure = Symbol("failure"); function countSymbols(str) { return punycode.ucs2.decode(str).length; } function at(input, idx) { const c = input[idx]; return isNaN(c) ? undefined : String.fromCodePoint(c); } function isASCIIDigit(c) { return c >= 0x30 && c <= 0x39; } function isASCIIAlpha(c) { return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); } function isASCIIAlphanumeric(c) { return isASCIIAlpha(c) || isASCIIDigit(c); } function isASCIIHex(c) { return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); } function isSingleDot(buffer) { return buffer === "." || buffer.toLowerCase() === "%2e"; } function isDoubleDot(buffer) { buffer = buffer.toLowerCase(); return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; } function isWindowsDriveLetterCodePoints(cp1, cp2) { return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); } function isWindowsDriveLetterString(string) { return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); } function isNormalizedWindowsDriveLetterString(string) { return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; } function containsForbiddenHostCodePoint(string) { return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; } function containsForbiddenHostCodePointExcludingPercent(string) { return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; } function isSpecialScheme(scheme) { return specialSchemes[scheme] !== undefined; } function isSpecial(url) { return isSpecialScheme(url.scheme); } function defaultPort(scheme) { return specialSchemes[scheme]; } function percentEncode(c) { let hex = c.toString(16).toUpperCase(); if (hex.length === 1) { hex = "0" + hex; } return "%" + hex; } function utf8PercentEncode(c) { const buf = new Buffer(c); let str = ""; for (let i = 0; i < buf.length; ++i) { str += percentEncode(buf[i]); } return str; } function utf8PercentDecode(str) { const input = new Buffer(str); const output = []; for (let i = 0; i < input.length; ++i) { if (input[i] !== 37) { output.push(input[i]); } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); i += 2; } else { output.push(input[i]); } } return new Buffer(output).toString(); } function isC0ControlPercentEncode(c) { return c <= 0x1F || c > 0x7E; } const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); function isPathPercentEncode(c) { return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); } const extraUserinfoPercentEncodeSet = new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); function isUserinfoPercentEncode(c) { return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); } function percentEncodeChar(c, encodeSetPredicate) { const cStr = String.fromCodePoint(c); if (encodeSetPredicate(c)) { return utf8PercentEncode(cStr); } return cStr; } function parseIPv4Number(input) { let R = 10; if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { input = input.substring(2); R = 16; } else if (input.length >= 2 && input.charAt(0) === "0") { input = input.substring(1); R = 8; } if (input === "") { return 0; } const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); if (regex.test(input)) { return failure; } return parseInt(input, R); } function parseIPv4(input) { const parts = input.split("."); if (parts[parts.length - 1] === "") { if (parts.length > 1) { parts.pop(); } } if (parts.length > 4) { return input; } const numbers = []; for (const part of parts) { if (part === "") { return input; } const n = parseIPv4Number(part); if (n === failure) { return input; } numbers.push(n); } for (let i = 0; i < numbers.length - 1; ++i) { if (numbers[i] > 255) { return failure; } } if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { return failure; } let ipv4 = numbers.pop(); let counter = 0; for (const n of numbers) { ipv4 += n * Math.pow(256, 3 - counter); ++counter; } return ipv4; } function serializeIPv4(address) { let output = ""; let n = address; for (let i = 1; i <= 4; ++i) { output = String(n % 256) + output; if (i !== 4) { output = "." + output; } n = Math.floor(n / 256); } return output; } function parseIPv6(input) { const address = [0, 0, 0, 0, 0, 0, 0, 0]; let pieceIndex = 0; let compress = null; let pointer = 0; input = punycode.ucs2.decode(input); if (input[pointer] === 58) { if (input[pointer + 1] !== 58) { return failure; } pointer += 2; ++pieceIndex; compress = pieceIndex; } while (pointer < input.length) { if (pieceIndex === 8) { return failure; } if (input[pointer] === 58) { if (compress !== null) { return failure; } ++pointer; ++pieceIndex; compress = pieceIndex; continue; } let value = 0; let length = 0; while (length < 4 && isASCIIHex(input[pointer])) { value = value * 0x10 + parseInt(at(input, pointer), 16); ++pointer; ++length; } if (input[pointer] === 46) { if (length === 0) { return failure; } pointer -= length; if (pieceIndex > 6) { return failure; } let numbersSeen = 0; while (input[pointer] !== undefined) { let ipv4Piece = null; if (numbersSeen > 0) { if (input[pointer] === 46 && numbersSeen < 4) { ++pointer; } else { return failure; } } if (!isASCIIDigit(input[pointer])) { return failure; } while (isASCIIDigit(input[pointer])) { const number = parseInt(at(input, pointer)); if (ipv4Piece === null) { ipv4Piece = number; } else if (ipv4Piece === 0) { return failure; } else { ipv4Piece = ipv4Piece * 10 + number; } if (ipv4Piece > 255) { return failure; } ++pointer; } address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; ++numbersSeen; if (numbersSeen === 2 || numbersSeen === 4) { ++pieceIndex; } } if (numbersSeen !== 4) { return failure; } break; } else if (input[pointer] === 58) { ++pointer; if (input[pointer] === undefined) { return failure; } } else if (input[pointer] !== undefined) { return failure; } address[pieceIndex] = value; ++pieceIndex; } if (compress !== null) { let swaps = pieceIndex - compress; pieceIndex = 7; while (pieceIndex !== 0 && swaps > 0) { const temp = address[compress + swaps - 1]; address[compress + swaps - 1] = address[pieceIndex]; address[pieceIndex] = temp; --pieceIndex; --swaps; } } else if (compress === null && pieceIndex !== 8) { return failure; } return address; } function serializeIPv6(address) { let output = ""; const seqResult = findLongestZeroSequence(address); const compress = seqResult.idx; let ignore0 = false; for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { if (ignore0 && address[pieceIndex] === 0) { continue; } else if (ignore0) { ignore0 = false; } if (compress === pieceIndex) { const separator = pieceIndex === 0 ? "::" : ":"; output += separator; ignore0 = true; continue; } output += address[pieceIndex].toString(16); if (pieceIndex !== 7) { output += ":"; } } return output; } function parseHost(input, isSpecialArg) { if (input[0] === "[") { if (input[input.length - 1] !== "]") { return failure; } return parseIPv6(input.substring(1, input.length - 1)); } if (!isSpecialArg) { return parseOpaqueHost(input); } const domain = utf8PercentDecode(input); const asciiDomain = tr46$1.toASCII(domain, false, tr46$1.PROCESSING_OPTIONS.NONTRANSITIONAL, false); if (asciiDomain === null) { return failure; } if (containsForbiddenHostCodePoint(asciiDomain)) { return failure; } const ipv4Host = parseIPv4(asciiDomain); if (typeof ipv4Host === "number" || ipv4Host === failure) { return ipv4Host; } return asciiDomain; } function parseOpaqueHost(input) { if (containsForbiddenHostCodePointExcludingPercent(input)) { return failure; } let output = ""; const decoded = punycode.ucs2.decode(input); for (let i = 0; i < decoded.length; ++i) { output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); } return output; } function findLongestZeroSequence(arr) { let maxIdx = null; let maxLen = 1; // only find elements > 1 let currStart = null; let currLen = 0; for (let i = 0; i < arr.length; ++i) { if (arr[i] !== 0) { if (currLen > maxLen) { maxIdx = currStart; maxLen = currLen; } currStart = null; currLen = 0; } else { if (currStart === null) { currStart = i; } ++currLen; } } // if trailing zeros if (currLen > maxLen) { maxIdx = currStart; maxLen = currLen; } return { idx: maxIdx, len: maxLen }; } function serializeHost(host) { if (typeof host === "number") { return serializeIPv4(host); } // IPv6 serializer if (host instanceof Array) { return "[" + serializeIPv6(host) + "]"; } return host; } function trimControlChars(url) { return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); } function trimTabAndNewline(url) { return url.replace(/\u0009|\u000A|\u000D/g, ""); } function shortenPath(url) { const path = url.path; if (path.length === 0) { return; } if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { return; } path.pop(); } function includesCredentials(url) { return url.username !== "" || url.password !== ""; } function cannotHaveAUsernamePasswordPort(url) { return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; } function isNormalizedWindowsDriveLetter(string) { return /^[A-Za-z]:$/.test(string); } function URLStateMachine(input, base, encodingOverride, url, stateOverride) { this.pointer = 0; this.input = input; this.base = base || null; this.encodingOverride = encodingOverride || "utf-8"; this.stateOverride = stateOverride; this.url = url; this.failure = false; this.parseError = false; if (!this.url) { this.url = { scheme: "", username: "", password: "", host: null, port: null, path: [], query: null, fragment: null, cannotBeABaseURL: false }; const res = trimControlChars(this.input); if (res !== this.input) { this.parseError = true; } this.input = res; } const res = trimTabAndNewline(this.input); if (res !== this.input) { this.parseError = true; } this.input = res; this.state = stateOverride || "scheme start"; this.buffer = ""; this.atFlag = false; this.arrFlag = false; this.passwordTokenSeenFlag = false; this.input = punycode.ucs2.decode(this.input); for (; this.pointer <= this.input.length; ++this.pointer) { const c = this.input[this.pointer]; const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); // exec state machine const ret = this["parse " + this.state](c, cStr); if (!ret) { break; // terminate algorithm } else if (ret === failure) { this.failure = true; break; } } } URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { if (isASCIIAlpha(c)) { this.buffer += cStr.toLowerCase(); this.state = "scheme"; } else if (!this.stateOverride) { this.state = "no scheme"; --this.pointer; } else { this.parseError = true; return failure; } return true; }; URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { this.buffer += cStr.toLowerCase(); } else if (c === 58) { if (this.stateOverride) { if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { return false; } if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { return false; } if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { return false; } if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { return false; } } this.url.scheme = this.buffer; this.buffer = ""; if (this.stateOverride) { return false; } if (this.url.scheme === "file") { if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { this.parseError = true; } this.state = "file"; } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { this.state = "special relative or authority"; } else if (isSpecial(this.url)) { this.state = "special authority slashes"; } else if (this.input[this.pointer + 1] === 47) { this.state = "path or authority"; ++this.pointer; } else { this.url.cannotBeABaseURL = true; this.url.path.push(""); this.state = "cannot-be-a-base-URL path"; } } else if (!this.stateOverride) { this.buffer = ""; this.state = "no scheme"; this.pointer = -1; } else { this.parseError = true; return failure; } return true; }; URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { return failure; } else if (this.base.cannotBeABaseURL && c === 35) { this.url.scheme = this.base.scheme; this.url.path = this.base.path.slice(); this.url.query = this.base.query; this.url.fragment = ""; this.url.cannotBeABaseURL = true; this.state = "fragment"; } else if (this.base.scheme === "file") { this.state = "file"; --this.pointer; } else { this.state = "relative"; --this.pointer; } return true; }; URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { if (c === 47 && this.input[this.pointer + 1] === 47) { this.state = "special authority ignore slashes"; ++this.pointer; } else { this.parseError = true; this.state = "relative"; --this.pointer; } return true; }; URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { if (c === 47) { this.state = "authority"; } else { this.state = "path"; --this.pointer; } return true; }; URLStateMachine.prototype["parse relative"] = function parseRelative(c) { this.url.scheme = this.base.scheme; if (isNaN(c)) { this.url.username = this.base.username; this.url.password = this.base.password; this.url.host = this.base.host; this.url.port = this.base.port; this.url.path = this.base.path.slice(); this.url.query = this.base.query; } else if (c === 47) { this.state = "relative slash"; } else if (c === 63) { this.url.username = this.base.username; this.url.password = this.base.password; this.url.host = this.base.host; this.url.port = this.base.port; this.url.path = this.base.path.slice(); this.url.query = ""; this.state = "query"; } else if (c === 35) { this.url.username = this.base.username; this.url.password = this.base.password; this.url.host = this.base.host; this.url.port = this.base.port; this.url.path = this.base.path.slice(); this.url.query = this.base.query; this.url.fragment = ""; this.state = "fragment"; } else if (isSpecial(this.url) && c === 92) { this.parseError = true; this.state = "relative slash"; } else { this.url.username = this.base.username; this.url.password = this.base.password; this.url.host = this.base.host; this.url.port = this.base.port; this.url.path = this.base.path.slice(0, this.base.path.length - 1); this.state = "path"; --this.pointer; } return true; }; URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { if (isSpecial(this.url) && (c === 47 || c === 92)) { if (c === 92) { this.parseError = true; } this.state = "special authority ignore slashes"; } else if (c === 47) { this.state = "authority"; } else { this.url.username = this.base.username; this.url.password = this.base.password; this.url.host = this.base.host; this.url.port = this.base.port; this.state = "path"; --this.pointer; } return true; }; URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { if (c === 47 && this.input[this.pointer + 1] === 47) { this.state = "special authority ignore slashes"; ++this.pointer; } else { this.parseError = true; this.state = "special authority ignore slashes"; --this.pointer; } return true; }; URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { if (c !== 47 && c !== 92) { this.state = "authority"; --this.pointer; } else { this.parseError = true; } return true; }; URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { if (c === 64) { this.parseError = true; if (this.atFlag) { this.buffer = "%40" + this.buffer; } this.atFlag = true; // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars const len = countSymbols(this.buffer); for (let pointer = 0; pointer < len; ++pointer) { const codePoint = this.buffer.codePointAt(pointer); if (codePoint === 58 && !this.passwordTokenSeenFlag) { this.passwordTokenSeenFlag = true; continue; } const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); if (this.passwordTokenSeenFlag) { this.url.password += encodedCodePoints; } else { this.url.username += encodedCodePoints; } } this.buffer = ""; } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || (isSpecial(this.url) && c === 92)) { if (this.atFlag && this.buffer === "") { this.parseError = true; return failure; } this.pointer -= countSymbols(this.buffer) + 1; this.buffer = ""; this.state = "host"; } else { this.buffer += cStr; } return true; }; URLStateMachine.prototype["parse hostname"] = URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { if (this.stateOverride && this.url.scheme === "file") { --this.pointer; this.state = "file host"; } else if (c === 58 && !this.arrFlag) { if (this.buffer === "") { this.parseError = true; return failure; } const host = parseHost(this.buffer, isSpecial(this.url)); if (host === failure) { return failure; } this.url.host = host; this.buffer = ""; this.state = "port"; if (this.stateOverride === "hostname") { return false; } } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || (isSpecial(this.url) && c === 92)) { --this.pointer; if (isSpecial(this.url) && this.buffer === "") { this.parseError = true; return failure; } else if (this.stateOverride && this.buffer === "" && (includesCredentials(this.url) || this.url.port !== null)) { this.parseError = true; return false; } const host = parseHost(this.buffer, isSpecial(this.url)); if (host === failure) { return failure; } this.url.host = host; this.buffer = ""; this.state = "path start"; if (this.stateOverride) { return false; } } else { if (c === 91) { this.arrFlag = true; } else if (c === 93) { this.arrFlag = false; } this.buffer += cStr; } return true; }; URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { if (isASCIIDigit(c)) { this.buffer += cStr; } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || (isSpecial(this.url) && c === 92) || this.stateOverride) { if (this.buffer !== "") { const port = parseInt(this.buffer); if (port > Math.pow(2, 16) - 1) { this.parseError = true; return failure; } this.url.port = port === defaultPort(this.url.scheme) ? null : port; this.buffer = ""; } if (this.stateOverride) { return false; } this.state = "path start"; --this.pointer; } else { this.parseError = true; return failure; } return true; }; const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); URLStateMachine.prototype["parse file"] = function parseFile(c) { this.url.scheme = "file"; if (c === 47 || c === 92) { if (c === 92) { this.parseError = true; } this.state = "file slash"; } else if (this.base !== null && this.base.scheme === "file") { if (isNaN(c)) { this.url.host = this.base.host; this.url.path = this.base.path.slice(); this.url.query = this.base.query; } else if (c === 63) { this.url.host = this.base.host; this.url.path = this.base.path.slice(); this.url.query = ""; this.state = "query"; } else if (c === 35) { this.url.host = this.base.host; this.url.path = this.base.path.slice(); this.url.query = this.base.query; this.url.fragment = ""; this.state = "fragment"; } else { if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { this.url.host = this.base.host; this.url.path = this.base.path.slice(); shortenPath(this.url); } else { this.parseError = true; } this.state = "path"; --this.pointer; } } else { this.state = "path"; --this.pointer; } return true; }; URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { if (c === 47 || c === 92) { if (c === 92) { this.parseError = true; } this.state = "file host"; } else { if (this.base !== null && this.base.scheme === "file") { if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { this.url.path.push(this.base.path[0]); } else { this.url.host = this.base.host; } } this.state = "path"; --this.pointer; } return true; }; URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { --this.pointer; if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { this.parseError = true; this.state = "path"; } else if (this.buffer === "") { this.url.host = ""; if (this.stateOverride) { return false; } this.state = "path start"; } else { let host = parseHost(this.buffer, isSpecial(this.url)); if (host === failure) { return failure; } if (host === "localhost") { host = ""; } this.url.host = host; if (this.stateOverride) { return false; } this.buffer = ""; this.state = "path start"; } } else { this.buffer += cStr; } return true; }; URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { if (isSpecial(this.url)) { if (c === 92) { this.parseError = true; } this.state = "path"; if (c !== 47 && c !== 92) { --this.pointer; } } else if (!this.stateOverride && c === 63) { this.url.query = ""; this.state = "query"; } else if (!this.stateOverride && c === 35) { this.url.fragment = ""; this.state = "fragment"; } else if (c !== undefined) { this.state = "path"; if (c !== 47) { --this.pointer; } } return true; }; URLStateMachine.prototype["parse path"] = function parsePath(c) { if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || (!this.stateOverride && (c === 63 || c === 35))) { if (isSpecial(this.url) && c === 92) { this.parseError = true; } if (isDoubleDot(this.buffer)) { shortenPath(this.url); if (c !== 47 && !(isSpecial(this.url) && c === 92)) { this.url.path.push(""); } } else if (isSingleDot(this.buffer) && c !== 47 && !(isSpecial(this.url) && c === 92)) { this.url.path.push(""); } else if (!isSingleDot(this.buffer)) { if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { if (this.url.host !== "" && this.url.host !== null) { this.parseError = true; this.url.host = ""; } this.buffer = this.buffer[0] + ":"; } this.url.path.push(this.buffer); } this.buffer = ""; if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { while (this.url.path.length > 1 && this.url.path[0] === "") { this.parseError = true; this.url.path.shift(); } } if (c === 63) { this.url.query = ""; this.state = "query"; } if (c === 35) { this.url.fragment = ""; this.state = "fragment"; } } else { // TODO: If c is not a URL code point and not "%", parse error. if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { this.parseError = true; } this.buffer += percentEncodeChar(c, isPathPercentEncode); } return true; }; URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { if (c === 63) { this.url.query = ""; this.state = "query"; } else if (c === 35) { this.url.fragment = ""; this.state = "fragment"; } else { // TODO: Add: not a URL code point if (!isNaN(c) && c !== 37) { this.parseError = true; } if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { this.parseError = true; } if (!isNaN(c)) { this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); } } return true; }; URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { if (isNaN(c) || (!this.stateOverride && c === 35)) { if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { this.encodingOverride = "utf-8"; } const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead for (let i = 0; i < buffer.length; ++i) { if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || buffer[i] === 0x3C || buffer[i] === 0x3E) { this.url.query += percentEncode(buffer[i]); } else { this.url.query += String.fromCodePoint(buffer[i]); } } this.buffer = ""; if (c === 35) { this.url.fragment = ""; this.state = "fragment"; } } else { // TODO: If c is not a URL code point and not "%", parse error. if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { this.parseError = true; } this.buffer += cStr; } return true; }; URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { if (isNaN(c)) ; else if (c === 0x0) { this.parseError = true; } else { // TODO: If c is not a URL code point and not "%", parse error. if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { this.parseError = true; } this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); } return true; }; function serializeURL(url, excludeFragment) { let output = url.scheme + ":"; if (url.host !== null) { output += "//"; if (url.username !== "" || url.password !== "") { output += url.username; if (url.password !== "") { output += ":" + url.password; } output += "@"; } output += serializeHost(url.host); if (url.port !== null) { output += ":" + url.port; } } else if (url.host === null && url.scheme === "file") { output += "//"; } if (url.cannotBeABaseURL) { output += url.path[0]; } else { for (const string of url.path) { output += "/" + string; } } if (url.query !== null) { output += "?" + url.query; } if (!excludeFragment && url.fragment !== null) { output += "#" + url.fragment; } return output; } function serializeOrigin(tuple) { let result = tuple.scheme + "://"; result += serializeHost(tuple.host); if (tuple.port !== null) { result += ":" + tuple.port; } return result; } module.exports.serializeURL = serializeURL; module.exports.serializeURLOrigin = function (url) { // https://url.spec.whatwg.org/#concept-url-origin switch (url.scheme) { case "blob": try { return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); } catch (e) { // serializing an opaque origin returns "null" return "null"; } case "ftp": case "gopher": case "http": case "https": case "ws": case "wss": return serializeOrigin({ scheme: url.scheme, host: url.host, port: url.port }); case "file": // spec says "exercise to the reader", chrome says "file://" return "file://"; default: // serializing an opaque origin returns "null" return "null"; } }; module.exports.basicURLParse = function (input, options) { if (options === undefined) { options = {}; } const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); if (usm.failure) { return "failure"; } return usm.url; }; module.exports.setTheUsername = function (url, username) { url.username = ""; const decoded = punycode.ucs2.decode(username); for (let i = 0; i < decoded.length; ++i) { url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); } }; module.exports.setThePassword = function (url, password) { url.password = ""; const decoded = punycode.ucs2.decode(password); for (let i = 0; i < decoded.length; ++i) { url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); } }; module.exports.serializeHost = serializeHost; module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; module.exports.serializeInteger = function (integer) { return String(integer); }; module.exports.parseURL = function (input, options) { if (options === undefined) { options = {}; } // We don't handle blobs, so this just delegates: return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); }; } (urlStateMachine)); const usm = urlStateMachine.exports; URLImpl.implementation = class URLImpl { constructor(constructorArgs) { const url = constructorArgs[0]; const base = constructorArgs[1]; let parsedBase = null; if (base !== undefined) { parsedBase = usm.basicURLParse(base); if (parsedBase === "failure") { throw new TypeError("Invalid base URL"); } } const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); if (parsedURL === "failure") { throw new TypeError("Invalid URL"); } this._url = parsedURL; // TODO: query stuff } get href() { return usm.serializeURL(this._url); } set href(v) { const parsedURL = usm.basicURLParse(v); if (parsedURL === "failure") { throw new TypeError("Invalid URL"); } this._url = parsedURL; } get origin() { return usm.serializeURLOrigin(this._url); } get protocol() { return this._url.scheme + ":"; } set protocol(v) { usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); } get username() { return this._url.username; } set username(v) { if (usm.cannotHaveAUsernamePasswordPort(this._url)) { return; } usm.setTheUsername(this._url, v); } get password() { return this._url.password; } set password(v) { if (usm.cannotHaveAUsernamePasswordPort(this._url)) { return; } usm.setThePassword(this._url, v); } get host() { const url = this._url; if (url.host === null) { return ""; } if (url.port === null) { return usm.serializeHost(url.host); } return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); } set host(v) { if (this._url.cannotBeABaseURL) { return; } usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); } get hostname() { if (this._url.host === null) { return ""; } return usm.serializeHost(this._url.host); } set hostname(v) { if (this._url.cannotBeABaseURL) { return; } usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); } get port() { if (this._url.port === null) { return ""; } return usm.serializeInteger(this._url.port); } set port(v) { if (usm.cannotHaveAUsernamePasswordPort(this._url)) { return; } if (v === "") { this._url.port = null; } else { usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); } } get pathname() { if (this._url.cannotBeABaseURL) { return this._url.path[0]; } if (this._url.path.length === 0) { return ""; } return "/" + this._url.path.join("/"); } set pathname(v) { if (this._url.cannotBeABaseURL) { return; } this._url.path = []; usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); } get search() { if (this._url.query === null || this._url.query === "") { return ""; } return "?" + this._url.query; } set search(v) { // TODO: query stuff const url = this._url; if (v === "") { url.query = null; return; } const input = v[0] === "?" ? v.substring(1) : v; url.query = ""; usm.basicURLParse(input, { url, stateOverride: "query" }); } get hash() { if (this._url.fragment === null || this._url.fragment === "") { return ""; } return "#" + this._url.fragment; } set hash(v) { if (v === "") { this._url.fragment = null; return; } const input = v[0] === "#" ? v.substring(1) : v; this._url.fragment = ""; usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); } toJSON() { return this.href; } }; (function (module) { const conversions = lib$1; const utils$1 = utils.exports; const Impl = URLImpl; const impl = utils$1.implSymbol; function URL(url) { if (!this || this[impl] || !(this instanceof URL)) { throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); } if (arguments.length < 1) { throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); } const args = []; for (let i = 0; i < arguments.length && i < 2; ++i) { args[i] = arguments[i]; } args[0] = conversions["USVString"](args[0]); if (args[1] !== undefined) { args[1] = conversions["USVString"](args[1]); } module.exports.setup(this, args); } URL.prototype.toJSON = function toJSON() { if (!this || !module.exports.is(this)) { throw new TypeError("Illegal invocation"); } const args = []; for (let i = 0; i < arguments.length && i < 0; ++i) { args[i] = arguments[i]; } return this[impl].toJSON.apply(this[impl], args); }; Object.defineProperty(URL.prototype, "href", { get() { return this[impl].href; }, set(V) { V = conversions["USVString"](V); this[impl].href = V; }, enumerable: true, configurable: true }); URL.prototype.toString = function () { if (!this || !module.exports.is(this)) { throw new TypeError("Illegal invocation"); } return this.href; }; Object.defineProperty(URL.prototype, "origin", { get() { return this[impl].origin; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "protocol", { get() { return this[impl].protocol; }, set(V) { V = conversions["USVString"](V); this[impl].protocol = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "username", { get() { return this[impl].username; }, set(V) { V = conversions["USVString"](V); this[impl].username = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "password", { get() { return this[impl].password; }, set(V) { V = conversions["USVString"](V); this[impl].password = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "host", { get() { return this[impl].host; }, set(V) { V = conversions["USVString"](V); this[impl].host = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "hostname", { get() { return this[impl].hostname; }, set(V) { V = conversions["USVString"](V); this[impl].hostname = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "port", { get() { return this[impl].port; }, set(V) { V = conversions["USVString"](V); this[impl].port = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "pathname", { get() { return this[impl].pathname; }, set(V) { V = conversions["USVString"](V); this[impl].pathname = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "search", { get() { return this[impl].search; }, set(V) { V = conversions["USVString"](V); this[impl].search = V; }, enumerable: true, configurable: true }); Object.defineProperty(URL.prototype, "hash", { get() { return this[impl].hash; }, set(V) { V = conversions["USVString"](V); this[impl].hash = V; }, enumerable: true, configurable: true }); module.exports = { is(obj) { return !!obj && obj[impl] instanceof Impl.implementation; }, create(constructorArgs, privateData) { let obj = Object.create(URL.prototype); this.setup(obj, constructorArgs, privateData); return obj; }, setup(obj, constructorArgs, privateData) { if (!privateData) privateData = {}; privateData.wrapper = obj; obj[impl] = new Impl.implementation(constructorArgs, privateData); obj[impl][utils$1.wrapperSymbol] = obj; }, interface: URL, expose: { Window: { URL: URL }, Worker: { URL: URL } } }; } (URL$2)); publicApi.URL = URL$2.exports.interface; publicApi.serializeURL = urlStateMachine.exports.serializeURL; publicApi.serializeURLOrigin = urlStateMachine.exports.serializeURLOrigin; publicApi.basicURLParse = urlStateMachine.exports.basicURLParse; publicApi.setTheUsername = urlStateMachine.exports.setTheUsername; publicApi.setThePassword = urlStateMachine.exports.setThePassword; publicApi.serializeHost = urlStateMachine.exports.serializeHost; publicApi.serializeInteger = urlStateMachine.exports.serializeInteger; publicApi.parseURL = urlStateMachine.exports.parseURL; // Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js // fix for "Readable" isn't a named export issue const Readable = Stream.Readable; const BUFFER = Symbol('buffer'); const TYPE = Symbol('type'); class Blob { constructor() { this[TYPE] = ''; const blobParts = arguments[0]; const options = arguments[1]; const buffers = []; let size = 0; if (blobParts) { const a = blobParts; const length = Number(a.length); for (let i = 0; i < length; i++) { const element = a[i]; let buffer; if (element instanceof Buffer) { buffer = element; } else if (ArrayBuffer.isView(element)) { buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); } else if (element instanceof ArrayBuffer) { buffer = Buffer.from(element); } else if (element instanceof Blob) { buffer = element[BUFFER]; } else { buffer = Buffer.from(typeof element === 'string' ? element : String(element)); } size += buffer.length; buffers.push(buffer); } } this[BUFFER] = Buffer.concat(buffers); let type = options && options.type !== undefined && String(options.type).toLowerCase(); if (type && !/[^\u0020-\u007E]/.test(type)) { this[TYPE] = type; } } get size() { return this[BUFFER].length; } get type() { return this[TYPE]; } text() { return Promise.resolve(this[BUFFER].toString()); } arrayBuffer() { const buf = this[BUFFER]; const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); return Promise.resolve(ab); } stream() { const readable = new Readable(); readable._read = function () {}; readable.push(this[BUFFER]); readable.push(null); return readable; } toString() { return '[object Blob]'; } slice() { const size = this.size; const start = arguments[0]; const end = arguments[1]; let relativeStart, relativeEnd; if (start === undefined) { relativeStart = 0; } else if (start < 0) { relativeStart = Math.max(size + start, 0); } else { relativeStart = Math.min(start, size); } if (end === undefined) { relativeEnd = size; } else if (end < 0) { relativeEnd = Math.max(size + end, 0); } else { relativeEnd = Math.min(end, size); } const span = Math.max(relativeEnd - relativeStart, 0); const buffer = this[BUFFER]; const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); const blob = new Blob([], { type: arguments[2] }); blob[BUFFER] = slicedBuffer; return blob; } } Object.defineProperties(Blob.prototype, { size: { enumerable: true }, type: { enumerable: true }, slice: { enumerable: true } }); Object.defineProperty(Blob.prototype, Symbol.toStringTag, { value: 'Blob', writable: false, enumerable: false, configurable: true }); /** * fetch-error.js * * FetchError interface for operational errors */ /** * Create FetchError instance * * @param String message Error message for human * @param String type Error type for machine * @param String systemError For Node.js system error * @return FetchError */ function FetchError(message, type, systemError) { Error.call(this, message); this.message = message; this.type = type; // when err.type is `system`, err.code contains system error code if (systemError) { this.code = this.errno = systemError.code; } // hide custom error implementation details from end-users Error.captureStackTrace(this, this.constructor); } FetchError.prototype = Object.create(Error.prototype); FetchError.prototype.constructor = FetchError; FetchError.prototype.name = 'FetchError'; let convert; try { convert = require('encoding').convert; } catch (e) {} const INTERNALS = Symbol('Body internals'); // fix an issue where "PassThrough" isn't a named export for node <10 const PassThrough = Stream.PassThrough; /** * Body mixin * * Ref: https://fetch.spec.whatwg.org/#body * * @param Stream body Readable stream * @param Object opts Response options * @return Void */ function Body$1(body) { var _this = this; var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$size = _ref.size; let size = _ref$size === undefined ? 0 : _ref$size; var _ref$timeout = _ref.timeout; let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; if (body == null) { // body is undefined or null body = null; } else if (isURLSearchParams(body)) { // body is a URLSearchParams body = Buffer.from(body.toString()); } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { // body is ArrayBuffer body = Buffer.from(body); } else if (ArrayBuffer.isView(body)) { // body is ArrayBufferView body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); } else if (body instanceof Stream) ; else { // none of the above // coerce to string then buffer body = Buffer.from(String(body)); } this[INTERNALS] = { body, disturbed: false, error: null }; this.size = size; this.timeout = timeout; if (body instanceof Stream) { body.on('error', function (err) { const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); _this[INTERNALS].error = error; }); } } Body$1.prototype = { get body() { return this[INTERNALS].body; }, get bodyUsed() { return this[INTERNALS].disturbed; }, /** * Decode response as ArrayBuffer * * @return Promise */ arrayBuffer() { return consumeBody.call(this).then(function (buf) { return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); }); }, /** * Return raw response as Blob * * @return Promise */ blob() { let ct = this.headers && this.headers.get('content-type') || ''; return consumeBody.call(this).then(function (buf) { return Object.assign( // Prevent copying new Blob([], { type: ct.toLowerCase() }), { [BUFFER]: buf }); }); }, /** * Decode response as json * * @return Promise */ json() { var _this2 = this; return consumeBody.call(this).then(function (buffer) { try { return JSON.parse(buffer.toString()); } catch (err) { return Body$1.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); } }); }, /** * Decode response as text * * @return Promise */ text() { return consumeBody.call(this).then(function (buffer) { return buffer.toString(); }); }, /** * Decode response as buffer (non-spec api) * * @return Promise */ buffer() { return consumeBody.call(this); }, /** * Decode response as text, while automatically detecting the encoding and * trying to decode to UTF-8 (non-spec api) * * @return Promise */ textConverted() { var _this3 = this; return consumeBody.call(this).then(function (buffer) { return convertBody(buffer, _this3.headers); }); } }; // In browsers, all properties are enumerable. Object.defineProperties(Body$1.prototype, { body: { enumerable: true }, bodyUsed: { enumerable: true }, arrayBuffer: { enumerable: true }, blob: { enumerable: true }, json: { enumerable: true }, text: { enumerable: true } }); Body$1.mixIn = function (proto) { for (const name of Object.getOwnPropertyNames(Body$1.prototype)) { // istanbul ignore else: future proof if (!(name in proto)) { const desc = Object.getOwnPropertyDescriptor(Body$1.prototype, name); Object.defineProperty(proto, name, desc); } } }; /** * Consume and convert an entire Body to a Buffer. * * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body * * @return Promise */ function consumeBody() { var _this4 = this; if (this[INTERNALS].disturbed) { return Body$1.Promise.reject(new TypeError(`body used already for: ${this.url}`)); } this[INTERNALS].disturbed = true; if (this[INTERNALS].error) { return Body$1.Promise.reject(this[INTERNALS].error); } let body = this.body; // body is null if (body === null) { return Body$1.Promise.resolve(Buffer.alloc(0)); } // body is blob if (isBlob(body)) { body = body.stream(); } // body is buffer if (Buffer.isBuffer(body)) { return Body$1.Promise.resolve(body); } // istanbul ignore if: should never happen if (!(body instanceof Stream)) { return Body$1.Promise.resolve(Buffer.alloc(0)); } // body is stream // get ready to actually consume the body let accum = []; let accumBytes = 0; let abort = false; return new Body$1.Promise(function (resolve, reject) { let resTimeout; // allow timeout on slow response body if (_this4.timeout) { resTimeout = setTimeout(function () { abort = true; reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); }, _this4.timeout); } // handle stream errors body.on('error', function (err) { if (err.name === 'AbortError') { // if the request was aborted, reject with this Error abort = true; reject(err); } else { // other errors, such as incorrect content-encoding reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); } }); body.on('data', function (chunk) { if (abort || chunk === null) { return; } if (_this4.size && accumBytes + chunk.length > _this4.size) { abort = true; reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); return; } accumBytes += chunk.length; accum.push(chunk); }); body.on('end', function () { if (abort) { return; } clearTimeout(resTimeout); try { resolve(Buffer.concat(accum, accumBytes)); } catch (err) { // handle streams that have accumulated too much data (issue #414) reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); } }); }); } /** * Detect buffer encoding and convert to target encoding * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding * * @param Buffer buffer Incoming buffer * @param String encoding Target encoding * @return String */ function convertBody(buffer, headers) { if (typeof convert !== 'function') { throw new Error('The package `encoding` must be installed to use the textConverted() function'); } const ct = headers.get('content-type'); let charset = 'utf-8'; let res, str; // header if (ct) { res = /charset=([^;]*)/i.exec(ct); } // no charset in content type, peek at response body for at most 1024 bytes str = buffer.slice(0, 1024).toString(); // html5 if (!res && str) { res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; this[MAP] = Object.create(null); if (init instanceof Headers$1) { const rawHeaders = init.raw(); const headerNames = Object.keys(rawHeaders); for (const headerName of headerNames) { for (const value of rawHeaders[headerName]) { this.append(headerName, value); } } return; } // We don't worry about converting prop to ByteString here as append() // will handle it. if (init == null) ; else if (typeof init === 'object') { const method = init[Symbol.iterator]; if (method != null) { if (typeof method !== 'function') { throw new TypeError('Header pairs must be iterable'); } // sequence> // Note: per spec we have to first exhaust the lists then process them const pairs = []; for (const pair of init) { if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { throw new TypeError('Each header pair must be iterable'); } pairs.push(Array.from(pair)); } for (const pair of pairs) { if (pair.length !== 2) { throw new TypeError('Each header pair must be a name/value tuple'); } this.append(pair[0], pair[1]); } } else { // record for (const key of Object.keys(init)) { const value = init[key]; this.append(key, value); } } } else { throw new TypeError('Provided initializer must be an object'); } } /** * Return combined header value given name * * @param String name Header name * @return Mixed */ get(name) { name = `${name}`; validateName(name); const key = find(this[MAP], name); if (key === undefined) { return null; } return this[MAP][key].join(', '); } /** * Iterate over all headers * * @param Function callback Executed for each item with parameters (value, name, thisArg) * @param Boolean thisArg `this` context for callback function * @return Void */ forEach(callback) { let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; let pairs = getHeaders(this); let i = 0; while (i < pairs.length) { var _pairs$i = pairs[i]; const name = _pairs$i[0], value = _pairs$i[1]; callback.call(thisArg, value, name, this); pairs = getHeaders(this); i++; } } /** * Overwrite header values given name * * @param String name Header name * @param String value Header value * @return Void */ set(name, value) { name = `${name}`; value = `${value}`; validateName(name); validateValue(value); const key = find(this[MAP], name); this[MAP][key !== undefined ? key : name] = [value]; } /** * Append a value onto existing header * * @param String name Header name * @param String value Header value * @return Void */ append(name, value) { name = `${name}`; value = `${value}`; validateName(name); validateValue(value); const key = find(this[MAP], name); if (key !== undefined) { this[MAP][key].push(value); } else { this[MAP][name] = [value]; } } /** * Check for header name existence * * @param String name Header name * @return Boolean */ has(name) { name = `${name}`; validateName(name); return find(this[MAP], name) !== undefined; } /** * Delete all header values given name * * @param String name Header name * @return Void */ delete(name) { name = `${name}`; validateName(name); const key = find(this[MAP], name); if (key !== undefined) { delete this[MAP][key]; } } /** * Return raw headers (non-spec api) * * @return Object */ raw() { return this[MAP]; } /** * Get an iterator on keys. * * @return Iterator */ keys() { return createHeadersIterator(this, 'key'); } /** * Get an iterator on values. * * @return Iterator */ values() { return createHeadersIterator(this, 'value'); } /** * Get an iterator on entries. * * This is the default iterator of the Headers object. * * @return Iterator */ [Symbol.iterator]() { return createHeadersIterator(this, 'key+value'); } } Headers$1.prototype.entries = Headers$1.prototype[Symbol.iterator]; Object.defineProperty(Headers$1.prototype, Symbol.toStringTag, { value: 'Headers', writable: false, enumerable: false, configurable: true }); Object.defineProperties(Headers$1.prototype, { get: { enumerable: true }, forEach: { enumerable: true }, set: { enumerable: true }, append: { enumerable: true }, has: { enumerable: true }, delete: { enumerable: true }, keys: { enumerable: true }, values: { enumerable: true }, entries: { enumerable: true } }); function getHeaders(headers) { let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; const keys = Object.keys(headers[MAP]).sort(); return keys.map(kind === 'key' ? function (k) { return k.toLowerCase(); } : kind === 'value' ? function (k) { return headers[MAP][k].join(', '); } : function (k) { return [k.toLowerCase(), headers[MAP][k].join(', ')]; }); } const INTERNAL = Symbol('internal'); function createHeadersIterator(target, kind) { const iterator = Object.create(HeadersIteratorPrototype); iterator[INTERNAL] = { target, kind, index: 0 }; return iterator; } const HeadersIteratorPrototype = Object.setPrototypeOf({ next() { // istanbul ignore if if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { throw new TypeError('Value of `this` is not a HeadersIterator'); } var _INTERNAL = this[INTERNAL]; const target = _INTERNAL.target, kind = _INTERNAL.kind, index = _INTERNAL.index; const values = getHeaders(target, kind); const len = values.length; if (index >= len) { return { value: undefined, done: true }; } this[INTERNAL].index = index + 1; return { value: values[index], done: false }; } }, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { value: 'HeadersIterator', writable: false, enumerable: false, configurable: true }); /** * Export the Headers object in a form that Node.js can consume. * * @param Headers headers * @return Object */ function exportNodeCompatibleHeaders(headers) { const obj = Object.assign({ __proto__: null }, headers[MAP]); // http.request() only supports string as Host header. This hack makes // specifying custom Host header possible. const hostHeaderKey = find(headers[MAP], 'Host'); if (hostHeaderKey !== undefined) { obj[hostHeaderKey] = obj[hostHeaderKey][0]; } return obj; } /** * Create a Headers object from an object of headers, ignoring those that do * not conform to HTTP grammar productions. * * @param Object obj Object of headers * @return Headers */ function createHeadersLenient(obj) { const headers = new Headers$1(); for (const name of Object.keys(obj)) { if (invalidTokenRegex.test(name)) { continue; } if (Array.isArray(obj[name])) { for (const val of obj[name]) { if (invalidHeaderCharRegex.test(val)) { continue; } if (headers[MAP][name] === undefined) { headers[MAP][name] = [val]; } else { headers[MAP][name].push(val); } } } else if (!invalidHeaderCharRegex.test(obj[name])) { headers[MAP][name] = [obj[name]]; } } return headers; } const INTERNALS$1 = Symbol('Response internals'); // fix an issue where "STATUS_CODES" aren't a named export for node <10 const STATUS_CODES = http.STATUS_CODES; /** * Response class * * @param Stream body Readable stream * @param Object opts Response options * @return Void */ class Response$2 { constructor() { let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; Body$1.call(this, body, opts); const status = opts.status || 200; const headers = new Headers$1(opts.headers); if (body != null && !headers.has('Content-Type')) { const contentType = extractContentType(body); if (contentType) { headers.append('Content-Type', contentType); } } this[INTERNALS$1] = { url: opts.url, status, statusText: opts.statusText || STATUS_CODES[status], headers, counter: opts.counter }; } get url() { return this[INTERNALS$1].url || ''; } get status() { return this[INTERNALS$1].status; } /** * Convenience property representing if the request ended normally */ get ok() { return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; } get redirected() { return this[INTERNALS$1].counter > 0; } get statusText() { return this[INTERNALS$1].statusText; } get headers() { return this[INTERNALS$1].headers; } /** * Clone this response * * @return Response */ clone() { return new Response$2(clone(this), { url: this.url, status: this.status, statusText: this.statusText, headers: this.headers, ok: this.ok, redirected: this.redirected }); } } Body$1.mixIn(Response$2.prototype); Object.defineProperties(Response$2.prototype, { url: { enumerable: true }, status: { enumerable: true }, ok: { enumerable: true }, redirected: { enumerable: true }, statusText: { enumerable: true }, headers: { enumerable: true }, clone: { enumerable: true } }); Object.defineProperty(Response$2.prototype, Symbol.toStringTag, { value: 'Response', writable: false, enumerable: false, configurable: true }); const INTERNALS$2 = Symbol('Request internals'); const URL$1 = Url.URL || publicApi.URL; // fix an issue where "format", "parse" aren't a named export for node <10 const parse_url = Url.parse; const format_url = Url.format; /** * Wrapper around `new URL` to handle arbitrary URLs * * @param {string} urlStr * @return {void} */ function parseURL(urlStr) { /* Check whether the URL is absolute or not Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 */ if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { urlStr = new URL$1(urlStr).toString(); } // Fallback to old implementation for arbitrary URLs return parse_url(urlStr); } const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; /** * Check if a value is an instance of Request. * * @param Mixed input * @return Boolean */ function isRequest(input) { return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; } function isAbortSignal(signal) { const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); return !!(proto && proto.constructor.name === 'AbortSignal'); } /** * Request class * * @param Mixed input Url or Request instance * @param Object init Custom options * @return Void */ class Request$2 { constructor(input) { let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let parsedURL; // normalize input if (!isRequest(input)) { if (input && input.href) { // in order to support Node.js' Url objects; though WHATWG's URL objects // will fall into this branch also (since their `toString()` will return // `href` property anyway) parsedURL = parseURL(input.href); } else { // coerce input to a string before attempting to parse parsedURL = parseURL(`${input}`); } input = {}; } else { parsedURL = parseURL(input.url); } let method = init.method || input.method || 'GET'; method = method.toUpperCase(); if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { throw new TypeError('Request with GET/HEAD method cannot have body'); } let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; Body$1.call(this, inputBody, { timeout: init.timeout || input.timeout || 0, size: init.size || input.size || 0 }); const headers = new Headers$1(init.headers || input.headers || {}); if (inputBody != null && !headers.has('Content-Type')) { const contentType = extractContentType(inputBody); if (contentType) { headers.append('Content-Type', contentType); } } let signal = isRequest(input) ? input.signal : null; if ('signal' in init) signal = init.signal; if (signal != null && !isAbortSignal(signal)) { throw new TypeError('Expected signal to be an instanceof AbortSignal'); } this[INTERNALS$2] = { method, redirect: init.redirect || input.redirect || 'follow', headers, parsedURL, signal }; // node-fetch-only options this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; this.counter = init.counter || input.counter || 0; this.agent = init.agent || input.agent; } get method() { return this[INTERNALS$2].method; } get url() { return format_url(this[INTERNALS$2].parsedURL); } get headers() { return this[INTERNALS$2].headers; } get redirect() { return this[INTERNALS$2].redirect; } get signal() { return this[INTERNALS$2].signal; } /** * Clone this request * * @return Request */ clone() { return new Request$2(this); } } Body$1.mixIn(Request$2.prototype); Object.defineProperty(Request$2.prototype, Symbol.toStringTag, { value: 'Request', writable: false, enumerable: false, configurable: true }); Object.defineProperties(Request$2.prototype, { method: { enumerable: true }, url: { enumerable: true }, headers: { enumerable: true }, redirect: { enumerable: true }, clone: { enumerable: true }, signal: { enumerable: true } }); /** * Convert a Request to Node.js http request options. * * @param Request A Request instance * @return Object The options object to be passed to http.request */ function getNodeRequestOptions(request) { const parsedURL = request[INTERNALS$2].parsedURL; const headers = new Headers$1(request[INTERNALS$2].headers); // fetch step 1.3 if (!headers.has('Accept')) { headers.set('Accept', '*/*'); } // Basic fetch if (!parsedURL.protocol || !parsedURL.hostname) { throw new TypeError('Only absolute URLs are supported'); } if (!/^https?:$/.test(parsedURL.protocol)) { throw new TypeError('Only HTTP(S) protocols are supported'); } if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); } // HTTP-network-or-cache fetch steps 2.4-2.7 let contentLengthValue = null; if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { contentLengthValue = '0'; } if (request.body != null) { const totalBytes = getTotalBytes(request); if (typeof totalBytes === 'number') { contentLengthValue = String(totalBytes); } } if (contentLengthValue) { headers.set('Content-Length', contentLengthValue); } // HTTP-network-or-cache fetch step 2.11 if (!headers.has('User-Agent')) { headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); } // HTTP-network-or-cache fetch step 2.15 if (request.compress && !headers.has('Accept-Encoding')) { headers.set('Accept-Encoding', 'gzip,deflate'); } let agent = request.agent; if (typeof agent === 'function') { agent = agent(parsedURL); } if (!headers.has('Connection') && !agent) { headers.set('Connection', 'close'); } // HTTP-network fetch step 4.2 // chunked encoding is handled by Node.js return Object.assign({}, parsedURL, { method: request.method, headers: exportNodeCompatibleHeaders(headers), agent }); } /** * abort-error.js * * AbortError interface for cancelled requests */ /** * Create AbortError instance * * @param String message Error message for human * @return AbortError */ function AbortError(message) { Error.call(this, message); this.type = 'aborted'; this.message = message; // hide custom error implementation details from end-users Error.captureStackTrace(this, this.constructor); } AbortError.prototype = Object.create(Error.prototype); AbortError.prototype.constructor = AbortError; AbortError.prototype.name = 'AbortError'; const URL$1$1 = Url.URL || publicApi.URL; // fix an issue where "PassThrough", "resolve" aren't a named export for node <10 const PassThrough$1 = Stream.PassThrough; const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { const orig = new URL$1$1(original).hostname; const dest = new URL$1$1(destination).hostname; return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); }; /** * Fetch function * * @param Mixed url Absolute url or Request instance * @param Object opts Fetch options * @return Promise */ function fetch$2(url, opts) { // allow custom promise if (!fetch$2.Promise) { throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); } Body$1.Promise = fetch$2.Promise; // wrap http.request into fetch return new fetch$2.Promise(function (resolve, reject) { // build request object const request = new Request$2(url, opts); const options = getNodeRequestOptions(request); const send = (options.protocol === 'https:' ? https : http).request; const signal = request.signal; let response = null; const abort = function abort() { let error = new AbortError('The user aborted a request.'); reject(error); if (request.body && request.body instanceof Stream.Readable) { request.body.destroy(error); } if (!response || !response.body) return; response.body.emit('error', error); }; if (signal && signal.aborted) { abort(); return; } const abortAndFinalize = function abortAndFinalize() { abort(); finalize(); }; // send request const req = send(options); let reqTimeout; if (signal) { signal.addEventListener('abort', abortAndFinalize); } function finalize() { req.abort(); if (signal) signal.removeEventListener('abort', abortAndFinalize); clearTimeout(reqTimeout); } if (request.timeout) { req.once('socket', function (socket) { reqTimeout = setTimeout(function () { reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); finalize(); }, request.timeout); }); } req.on('error', function (err) { reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); finalize(); }); req.on('response', function (res) { clearTimeout(reqTimeout); const headers = createHeadersLenient(res.headers); // HTTP fetch step 5 if (fetch$2.isRedirect(res.statusCode)) { // HTTP fetch step 5.2 const location = headers.get('Location'); // HTTP fetch step 5.3 let locationURL = null; try { locationURL = location === null ? null : new URL$1$1(location, request.url).toString(); } catch (err) { // error here can only be invalid URL in Location: header // do not throw when options.redirect == manual // let the user extract the errorneous redirect URL if (request.redirect !== 'manual') { reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); finalize(); return; } } // HTTP fetch step 5.5 switch (request.redirect) { case 'error': reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); finalize(); return; case 'manual': // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. if (locationURL !== null) { // handle corrupted header try { headers.set('Location', locationURL); } catch (err) { // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request reject(err); } } break; case 'follow': // HTTP-redirect fetch step 2 if (locationURL === null) { break; } // HTTP-redirect fetch step 5 if (request.counter >= request.follow) { reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); finalize(); return; } // HTTP-redirect fetch step 6 (counter increment) // Create a new Request object. const requestOpts = { headers: new Headers$1(request.headers), follow: request.follow, counter: request.counter + 1, agent: request.agent, compress: request.compress, method: request.method, body: request.body, signal: request.signal, timeout: request.timeout, size: request.size }; if (!isDomainOrSubdomain(request.url, locationURL)) { for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { requestOpts.headers.delete(name); } } // HTTP-redirect fetch step 9 if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); finalize(); return; } // HTTP-redirect fetch step 11 if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { requestOpts.method = 'GET'; requestOpts.body = undefined; requestOpts.headers.delete('content-length'); } // HTTP-redirect fetch step 15 resolve(fetch$2(new Request$2(locationURL, requestOpts))); finalize(); return; } } // prepare response res.once('end', function () { if (signal) signal.removeEventListener('abort', abortAndFinalize); }); let body = res.pipe(new PassThrough$1()); const response_options = { url: request.url, status: res.statusCode, statusText: res.statusMessage, headers: headers, size: request.size, timeout: request.timeout, counter: request.counter }; // HTTP-network fetch step 12.1.1.3 const codings = headers.get('Content-Encoding'); // HTTP-network fetch step 12.1.1.4: handle content codings // in following scenarios we ignore compression support // 1. compression support is disabled // 2. HEAD request // 3. no Content-Encoding header // 4. no content response (204) // 5. content not modified response (304) if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { response = new Response$2(body, response_options); resolve(response); return; } // For Node v6+ // Be less strict when decoding compressed responses, since sometimes // servers send slightly invalid responses that are still accepted // by common browsers. // Always using Z_SYNC_FLUSH is what cURL does. const zlibOptions = { flush: zlib.Z_SYNC_FLUSH, finishFlush: zlib.Z_SYNC_FLUSH }; // for gzip if (codings == 'gzip' || codings == 'x-gzip') { body = body.pipe(zlib.createGunzip(zlibOptions)); response = new Response$2(body, response_options); resolve(response); return; } // for deflate if (codings == 'deflate' || codings == 'x-deflate') { // handle the infamous raw deflate response from old servers // a hack for old IIS and Apache servers const raw = res.pipe(new PassThrough$1()); raw.once('data', function (chunk) { // see http://stackoverflow.com/questions/37519828 if ((chunk[0] & 0x0F) === 0x08) { body = body.pipe(zlib.createInflate()); } else { body = body.pipe(zlib.createInflateRaw()); } response = new Response$2(body, response_options); resolve(response); }); return; } // for br if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { body = body.pipe(zlib.createBrotliDecompress()); response = new Response$2(body, response_options); resolve(response); return; } // otherwise, use response as-is response = new Response$2(body, response_options); resolve(response); }); writeToStream(req, request); }); } /** * Redirect code matching * * @param Number code Status code * @return Boolean */ fetch$2.isRedirect = function (code) { return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; }; // expose Promise fetch$2.Promise = global.Promise; var lib = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': fetch$2, Headers: Headers$1, Request: Request$2, Response: Response$2, FetchError: FetchError }); var require$$12 = /*@__PURE__*/getAugmentedNamespace(lib); var cjs = {}; var FormDataEncoder = {}; var createBoundary = {}; var hasRequiredCreateBoundary; function requireCreateBoundary () { if (hasRequiredCreateBoundary) return createBoundary; hasRequiredCreateBoundary = 1; Object.defineProperty(createBoundary, "__esModule", { value: true }); const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; function createBoundary$1() { let size = 16; let res = ""; while (size--) { res += alphabet[(Math.random() * alphabet.length) << 0]; } return res; } createBoundary.default = createBoundary$1; return createBoundary; } var isPlainObject = {}; var hasRequiredIsPlainObject; function requireIsPlainObject () { if (hasRequiredIsPlainObject) return isPlainObject; hasRequiredIsPlainObject = 1; Object.defineProperty(isPlainObject, "__esModule", { value: true }); const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); function isPlainObject$1(value) { if (getType(value) !== "object") { return false; } const pp = Object.getPrototypeOf(value); if (pp === null || pp === undefined) { return true; } const Ctor = pp.constructor && pp.constructor.toString(); return Ctor === Object.toString(); } isPlainObject.default = isPlainObject$1; return isPlainObject; } var normalizeValue = {}; var hasRequiredNormalizeValue; function requireNormalizeValue () { if (hasRequiredNormalizeValue) return normalizeValue; hasRequiredNormalizeValue = 1; Object.defineProperty(normalizeValue, "__esModule", { value: true }); const normalizeValue$1 = (value) => String(value) .replace(/\r|\n/g, (match, i, str) => { if ((match === "\r" && str[i + 1] !== "\n") || (match === "\n" && str[i - 1] !== "\r")) { return "\r\n"; } return match; }); normalizeValue.default = normalizeValue$1; return normalizeValue; } var escapeName = {}; var hasRequiredEscapeName; function requireEscapeName () { if (hasRequiredEscapeName) return escapeName; hasRequiredEscapeName = 1; Object.defineProperty(escapeName, "__esModule", { value: true }); const escapeName$1 = (name) => String(name) .replace(/\r/g, "%0D") .replace(/\n/g, "%0A") .replace(/"/g, "%22"); escapeName.default = escapeName$1; return escapeName; } var isFileLike = {}; var isFunction = {}; var hasRequiredIsFunction; function requireIsFunction () { if (hasRequiredIsFunction) return isFunction; hasRequiredIsFunction = 1; Object.defineProperty(isFunction, "__esModule", { value: true }); const isFunction$1 = (value) => (typeof value === "function"); isFunction.default = isFunction$1; return isFunction; } var hasRequiredIsFileLike; function requireIsFileLike () { if (hasRequiredIsFileLike) return isFileLike; hasRequiredIsFileLike = 1; var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(isFileLike, "__esModule", { value: true }); isFileLike.isFileLike = void 0; const isFunction_1 = __importDefault(requireIsFunction()); const isFileLike$1 = (value) => Boolean(value && typeof value === "object" && (0, isFunction_1.default)(value.constructor) && value[Symbol.toStringTag] === "File" && (0, isFunction_1.default)(value.stream) && value.name != null && value.size != null && value.lastModified != null); isFileLike.isFileLike = isFileLike$1; return isFileLike; } var isFormData = {}; var hasRequiredIsFormData; function requireIsFormData () { if (hasRequiredIsFormData) return isFormData; hasRequiredIsFormData = 1; (function (exports) { var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isFormDataLike = exports.isFormData = void 0; const isFunction_1 = __importDefault(requireIsFunction()); const isFormData = (value) => Boolean(value && (0, isFunction_1.default)(value.constructor) && value[Symbol.toStringTag] === "FormData" && (0, isFunction_1.default)(value.append) && (0, isFunction_1.default)(value.getAll) && (0, isFunction_1.default)(value.entries) && (0, isFunction_1.default)(value[Symbol.iterator])); exports.isFormData = isFormData; exports.isFormDataLike = exports.isFormData; } (isFormData)); return isFormData; } var hasRequiredFormDataEncoder; function requireFormDataEncoder () { if (hasRequiredFormDataEncoder) return FormDataEncoder; hasRequiredFormDataEncoder = 1; var __classPrivateFieldSet = (commonjsGlobal && commonjsGlobal.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (commonjsGlobal && commonjsGlobal.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _FormDataEncoder_instances, _FormDataEncoder_CRLF, _FormDataEncoder_CRLF_BYTES, _FormDataEncoder_CRLF_BYTES_LENGTH, _FormDataEncoder_DASHES, _FormDataEncoder_encoder, _FormDataEncoder_footer, _FormDataEncoder_form, _FormDataEncoder_options, _FormDataEncoder_getFieldHeader; Object.defineProperty(FormDataEncoder, "__esModule", { value: true }); FormDataEncoder.Encoder = FormDataEncoder.FormDataEncoder = void 0; const createBoundary_1 = __importDefault(requireCreateBoundary()); const isPlainObject_1 = __importDefault(requireIsPlainObject()); const normalizeValue_1 = __importDefault(requireNormalizeValue()); const escapeName_1 = __importDefault(requireEscapeName()); const isFileLike_1 = requireIsFileLike(); const isFormData_1 = requireIsFormData(); const defaultOptions = { enableAdditionalHeaders: false }; class FormDataEncoder$1 { constructor(form, boundaryOrOptions, options) { _FormDataEncoder_instances.add(this); _FormDataEncoder_CRLF.set(this, "\r\n"); _FormDataEncoder_CRLF_BYTES.set(this, void 0); _FormDataEncoder_CRLF_BYTES_LENGTH.set(this, void 0); _FormDataEncoder_DASHES.set(this, "-".repeat(2)); _FormDataEncoder_encoder.set(this, new TextEncoder()); _FormDataEncoder_footer.set(this, void 0); _FormDataEncoder_form.set(this, void 0); _FormDataEncoder_options.set(this, void 0); if (!(0, isFormData_1.isFormData)(form)) { throw new TypeError("Expected first argument to be a FormData instance."); } let boundary; if ((0, isPlainObject_1.default)(boundaryOrOptions)) { options = boundaryOrOptions; } else { boundary = boundaryOrOptions; } if (!boundary) { boundary = (0, createBoundary_1.default)(); } if (typeof boundary !== "string") { throw new TypeError("Expected boundary argument to be a string."); } if (options && !(0, isPlainObject_1.default)(options)) { throw new TypeError("Expected options argument to be an object."); } __classPrivateFieldSet(this, _FormDataEncoder_form, form, "f"); __classPrivateFieldSet(this, _FormDataEncoder_options, { ...defaultOptions, ...options }, "f"); __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")), "f"); __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f").byteLength, "f"); this.boundary = `form-data-boundary-${boundary}`; this.contentType = `multipart/form-data; boundary=${this.boundary}`; __classPrivateFieldSet(this, _FormDataEncoder_footer, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`), "f"); this.contentLength = String(this.getContentLength()); this.headers = Object.freeze({ "Content-Type": this.contentType, "Content-Length": this.contentLength }); Object.defineProperties(this, { boundary: { writable: false, configurable: false }, contentType: { writable: false, configurable: false }, contentLength: { writable: false, configurable: false }, headers: { writable: false, configurable: false } }); } getContentLength() { let length = 0; for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f")) { const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); length += __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value).byteLength; length += (0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength; length += __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, "f"); } return length + __classPrivateFieldGet(this, _FormDataEncoder_footer, "f").byteLength; } *values() { for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f").entries()) { const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); yield __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value); yield value; yield __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f"); } yield __classPrivateFieldGet(this, _FormDataEncoder_footer, "f"); } async *encode() { for (const part of this.values()) { if ((0, isFileLike_1.isFileLike)(part)) { yield* part.stream(); } else { yield part; } } } [(_FormDataEncoder_CRLF = new WeakMap(), _FormDataEncoder_CRLF_BYTES = new WeakMap(), _FormDataEncoder_CRLF_BYTES_LENGTH = new WeakMap(), _FormDataEncoder_DASHES = new WeakMap(), _FormDataEncoder_encoder = new WeakMap(), _FormDataEncoder_footer = new WeakMap(), _FormDataEncoder_form = new WeakMap(), _FormDataEncoder_options = new WeakMap(), _FormDataEncoder_instances = new WeakSet(), _FormDataEncoder_getFieldHeader = function _FormDataEncoder_getFieldHeader(name, value) { let header = ""; header += `${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; header += `Content-Disposition: form-data; name="${(0, escapeName_1.default)(name)}"`; if ((0, isFileLike_1.isFileLike)(value)) { header += `; filename="${(0, escapeName_1.default)(value.name)}"${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; header += `Content-Type: ${value.type || "application/octet-stream"}`; } if (__classPrivateFieldGet(this, _FormDataEncoder_options, "f").enableAdditionalHeaders === true) { header += `${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}Content-Length: ${(0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength}`; } return __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${header}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`); }, Symbol.iterator)]() { return this.values(); } [Symbol.asyncIterator]() { return this.encode(); } } FormDataEncoder.FormDataEncoder = FormDataEncoder$1; FormDataEncoder.Encoder = FormDataEncoder$1; return FormDataEncoder; } var FileLike = {}; var hasRequiredFileLike; function requireFileLike () { if (hasRequiredFileLike) return FileLike; hasRequiredFileLike = 1; Object.defineProperty(FileLike, "__esModule", { value: true }); return FileLike; } var FormDataLike = {}; var hasRequiredFormDataLike; function requireFormDataLike () { if (hasRequiredFormDataLike) return FormDataLike; hasRequiredFormDataLike = 1; Object.defineProperty(FormDataLike, "__esModule", { value: true }); return FormDataLike; } var hasRequiredCjs; function requireCjs () { if (hasRequiredCjs) return cjs; hasRequiredCjs = 1; (function (exports) { var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); __exportStar(requireFormDataEncoder(), exports); __exportStar(requireFileLike(), exports); __exportStar(requireFormDataLike(), exports); __exportStar(requireIsFileLike(), exports); __exportStar(requireIsFormData(), exports); } (cjs)); return cjs; } const handleFileRequest = handleFileRequest$1; var createNodePonyfill$1 = function createNodePonyfill(opts = {}) { const ponyfills = {}; if (!opts.useNodeFetch) { ponyfills.fetch = globalThis.fetch; // To enable: import {fetch} from 'cross-fetch' ponyfills.Headers = globalThis.Headers; ponyfills.Request = globalThis.Request; ponyfills.Response = globalThis.Response; ponyfills.FormData = globalThis.FormData; ponyfills.File = globalThis.File; } ponyfills.AbortController = globalThis.AbortController; ponyfills.ReadableStream = globalThis.ReadableStream; ponyfills.WritableStream = globalThis.WritableStream; ponyfills.TransformStream = globalThis.TransformStream; ponyfills.Blob = globalThis.Blob; ponyfills.crypto = globalThis.crypto; if (!globalThis.Event || !globalThis.EventTarget) { requireEventTargetPolyfill(); } ponyfills.Event = globalThis.Event; ponyfills.EventTarget = globalThis.EventTarget; if (!ponyfills.AbortController) { const abortControllerModule = require$$2; ponyfills.AbortController = abortControllerModule.default || abortControllerModule; } if (!ponyfills.Blob) { const bufferModule = require$$6$1; ponyfills.Blob = bufferModule.Blob; } if (!ponyfills.Blob) { const formDataModule = require$$4; ponyfills.Blob = formDataModule.Blob; } if (!ponyfills.ReadableStream) { try { const streamsWeb = require("stream/web"); ponyfills.ReadableStream = streamsWeb.ReadableStream; ponyfills.WritableStream = streamsWeb.WritableStream; ponyfills.TransformStream = streamsWeb.TransformStream; } catch (e) { const streamsWeb = require$$6; ponyfills.ReadableStream = streamsWeb.ReadableStream; ponyfills.WritableStream = streamsWeb.WritableStream; ponyfills.TransformStream = streamsWeb.TransformStream; } } ponyfills.btoa = globalThis.btoa; if (!ponyfills.btoa) { ponyfills.btoa = function btoa(data) { return Buffer.from(data, 'binary').toString('base64'); }; } ponyfills.TextEncoder = function TextEncoder(encoding = 'utf-8') { return { encode(str) { return Buffer.from(str, encoding); } } }; ponyfills.TextDecoder = function TextDecoder(encoding = 'utf-8') { return { decode(buf) { return Buffer.from(buf).toString(encoding); } } }; // ReadableStream doesn't handle aborting properly, so we need to patch it ponyfills.ReadableStream = class PonyfillReadableStream extends ponyfills.ReadableStream { constructor(underlyingSource, ...opts) { super({ ...underlyingSource, cancel: (e) => { this.cancelled = true; if (underlyingSource.cancel) { return underlyingSource.cancel(e); } } }, ...opts); this.underlyingSource = underlyingSource; } [Symbol.asyncIterator]() { const asyncIterator = super[Symbol.asyncIterator](); return { next: (...args) => asyncIterator.next(...args), throw: (...args) => asyncIterator.throw(...args), return: async (e) => { const originalResult = await asyncIterator.return(e); if (!this.cancelled) { this.cancelled = true; if (this.underlyingSource.cancel) { await this.underlyingSource.cancel(e); } } return originalResult; } } } async cancel(e) { const originalResult = !super.locked && await super.cancel(e); if (!this.cancelled) { this.cancelled = true; if (this.underlyingSource.cancel) { await this.underlyingSource.cancel(e); } } return originalResult; } }; if (!ponyfills.crypto) { const cryptoModule = crypto__default__default; ponyfills.crypto = cryptoModule.webcrypto; } if (!ponyfills.crypto) { const cryptoPonyfill = require$$8; ponyfills.crypto = new cryptoPonyfill.Crypto(); } // If any of classes of Fetch API is missing, we need to ponyfill them. if (!ponyfills.fetch || !ponyfills.Request || !ponyfills.Headers || !ponyfills.Response || !ponyfills.FormData || !ponyfills.File || opts.useNodeFetch) { const [ nodeMajorStr, nodeMinorStr ] = process.versions.node.split('.'); const nodeMajor = parseInt(nodeMajorStr); const nodeMinor = parseInt(nodeMinorStr); const getFormDataMethod = requireGetFormDataMethod(); if (!opts.useNodeFetch && (nodeMajor > 16 || (nodeMajor === 16 && nodeMinor >= 5))) { const undici = requireUndici(); if (!ponyfills.Headers) { ponyfills.Headers = undici.Headers; } const OriginalRequest = ponyfills.Request || undici.Request; class Request extends OriginalRequest { constructor(requestOrUrl, options) { if (typeof requestOrUrl === "string") { options = options || {}; if (options.body != null && options.body.read && options.body.on) { const readable = options.body; options.body = new ponyfills.ReadableStream({ pull(controller) { const chunk = readable.read(); if (chunk != null) { controller.enqueue(chunk); } else { controller.close(); } }, close(e) { readable.destroy(e); } }); } super(requestOrUrl, options); const contentType = this.headers.get("content-type"); if (contentType && contentType.startsWith("multipart/form-data")) { this.headers.set("content-type", contentType.split(', ')[0]); } } else { super(requestOrUrl); } this.formData = getFormDataMethod(undici.File, opts.formDataLimits); } } ponyfills.Request = Request; const originalFetch = ponyfills.fetch || undici.fetch; const fetch = function (requestOrUrl, options) { if (typeof requestOrUrl === "string") { // We cannot use our ctor because it leaks on Node 18's global fetch return originalFetch(requestOrUrl, options); } if (requestOrUrl.url.startsWith('file:')) { return handleFileRequest(requestOrUrl.url, ponyfills.Response); } return originalFetch(requestOrUrl); }; ponyfills.fetch = fetch; if (!ponyfills.Response) { ponyfills.Response = undici.Response; } if (!ponyfills.FormData) { ponyfills.FormData = undici.FormData; } if (!ponyfills.File) { ponyfills.File = undici.File; } } else { const nodeFetch = require$$12; const realFetch = ponyfills.fetch || nodeFetch.default || nodeFetch; if (!ponyfills.Headers) { ponyfills.Headers = nodeFetch.Headers; // Sveltekit if (globalThis.Headers) { Object.defineProperty(globalThis.Headers, Symbol.hasInstance, { value(obj) { return obj && obj.get && obj.set && obj.delete && obj.has && obj.append; }, configurable: true, }); } } const formDataEncoderModule = requireCjs(); const streams = Stream; const formDataModule = require$$4; if (!ponyfills.FormData) { ponyfills.FormData = formDataModule.FormData; } if (!ponyfills.File) { ponyfills.File = formDataModule.File; } const OriginalRequest = ponyfills.Request || nodeFetch.Request; class Request extends OriginalRequest { constructor(requestOrUrl, options) { if (typeof requestOrUrl === "string") { // Support schemaless URIs on the server for parity with the browser. // Ex: //github.com/ -> https://github.com/ if (/^\/\//.test(requestOrUrl)) { requestOrUrl = "https:" + requestOrUrl; } options = options || {}; options.headers = new ponyfills.Headers(options.headers || {}); options.headers.set('Connection', 'keep-alive'); if (options.body != null) { if (options.body[Symbol.toStringTag] === 'FormData') { const encoder = new formDataEncoderModule.FormDataEncoder(options.body); for (const headerKey in encoder.headers) { options.headers.set(headerKey, encoder.headers[headerKey]); } options.body = streams.Readable.from(encoder.encode()); } if (options.body[Symbol.toStringTag] === 'ReadableStream') { options.body = streams.Readable.fromWeb ? streams.Readable.fromWeb(options.body) : streams.Readable.from(options.body); } } super(requestOrUrl, options); } else { super(requestOrUrl); } this.formData = getFormDataMethod(formDataModule.File, opts.formDataLimits); } } ponyfills.Request = Request; const fetch = function (requestOrUrl, options) { if (typeof requestOrUrl === "string") { return fetch(new Request(requestOrUrl, options)); } if (requestOrUrl.url.startsWith('file:')) { return handleFileRequest(requestOrUrl.url, ponyfills.Response); } return realFetch(requestOrUrl); }; ponyfills.fetch = fetch; const OriginalResponse = ponyfills.Response || nodeFetch.Response; ponyfills.Response = function Response(body, init) { if (body != null && body[Symbol.toStringTag] === 'ReadableStream') { const actualBody = streams.Readable.fromWeb ? streams.Readable.fromWeb(body) : streams.Readable.from(body, { emitClose: true, autoDestroy: true, }); actualBody.on('pause', () => { body.cancel(); }); actualBody.on('close', () => { body.cancel(); }); // Polyfill ReadableStream is not working well with node-fetch's Response return new OriginalResponse(actualBody, init); } return new OriginalResponse(body, init); }; } } return ponyfills; }; const createNodePonyfill = createNodePonyfill$1; const ponyfills = createNodePonyfill(); var fetch$1 = ponyfills.fetch; ponyfills.Headers; var Request$1 = ponyfills.Request; var Response$1 = ponyfills.Response; ponyfills.FormData; ponyfills.AbortController; var ReadableStream = ponyfills.ReadableStream; ponyfills.WritableStream; ponyfills.TransformStream; ponyfills.Blob; ponyfills.File; ponyfills.crypto; ponyfills.btoa; ponyfills.TextEncoder; ponyfills.TextDecoder; ponyfills.Event; ponyfills.EventTarget; async function processRequest({ request, params, enveloped, fetchAPI, onResultProcessHooks, }) { // Parse GraphQLParams const document = enveloped.parse(params.query); // Validate parsed Document Node enveloped.validate(enveloped.schema, document); // Build the context for the execution const contextValue = (await enveloped.contextFactory()); const executionArgs = { schema: enveloped.schema, document, contextValue, variableValues: params.variables, operationName: params.operationName, }; // Get the actual operation const operation = getOperationAST(document, params.operationName); // Choose the right executor const executeFn = (operation === null || operation === void 0 ? void 0 : operation.operation) === 'subscription' ? enveloped.subscribe : enveloped.execute; // Get the result to be processed const result = await executeFn(executionArgs); let resultProcessor; for (const onResultProcessHook of onResultProcessHooks) { await onResultProcessHook({ request, result, resultProcessor, setResultProcessor(newResultProcessor) { resultProcessor = newResultProcessor; }, }); } // If no result processor found for this result, return an error if (!resultProcessor) { return new fetchAPI.Response(null, { status: 406, statusText: 'Not Acceptable', }); } return resultProcessor(result, fetchAPI); } function getCORSHeadersByRequestAndOptions(request, corsOptions) { var _a, _b; const headers = {}; if (corsOptions === false) { return headers; } // If defined origins have '*' or undefined by any means, we should allow all origins if (corsOptions.origin == null || corsOptions.origin.length === 0 || corsOptions.origin.includes('*')) { const currentOrigin = request.headers.get('origin'); // If origin is available in the headers, use it if (currentOrigin != null) { headers['Access-Control-Allow-Origin'] = currentOrigin; // Vary by origin because there are multiple origins headers['Vary'] = 'Origin'; } else { headers['Access-Control-Allow-Origin'] = '*'; } } else if (typeof corsOptions.origin === 'string') { // If there is one specific origin is specified, use it directly headers['Access-Control-Allow-Origin'] = corsOptions.origin; } else if (Array.isArray(corsOptions.origin)) { // If there is only one origin defined in the array, consider it as a single one if (corsOptions.origin.length === 1) { headers['Access-Control-Allow-Origin'] = corsOptions.origin[0]; } else { const currentOrigin = request.headers.get('origin'); if (currentOrigin != null && corsOptions.origin.includes(currentOrigin)) { // If origin is available in the headers, use it headers['Access-Control-Allow-Origin'] = currentOrigin; // Vary by origin because there are multiple origins headers['Vary'] = 'Origin'; } else { // There is no origin found in the headers, so we should return null headers['Access-Control-Allow-Origin'] = 'null'; } } } if ((_a = corsOptions.methods) === null || _a === void 0 ? void 0 : _a.length) { headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', '); } else { const requestMethod = request.headers.get('access-control-request-method'); if (requestMethod) { headers['Access-Control-Allow-Methods'] = requestMethod; } } if ((_b = corsOptions.allowedHeaders) === null || _b === void 0 ? void 0 : _b.length) { headers['Access-Control-Allow-Headers'] = corsOptions.allowedHeaders.join(', '); } else { const requestHeaders = request.headers.get('access-control-request-headers'); if (requestHeaders) { headers['Access-Control-Allow-Headers'] = requestHeaders; if (headers['Vary']) { headers['Vary'] += ', Access-Control-Request-Headers'; } headers['Vary'] = 'Access-Control-Request-Headers'; } } if (corsOptions.credentials != null) { if (corsOptions.credentials === true) { headers['Access-Control-Allow-Credentials'] = 'true'; } } else if (headers['Access-Control-Allow-Origin'] !== '*') { headers['Access-Control-Allow-Credentials'] = 'true'; } if (corsOptions.exposedHeaders) { headers['Access-Control-Expose-Headers'] = corsOptions.exposedHeaders.join(', '); } if (corsOptions.maxAge) { headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString(); } return headers; } async function getCORSResponseHeaders(request, corsOptionsFactory, serverContext) { const corsOptions = await corsOptionsFactory(request, serverContext); return getCORSHeadersByRequestAndOptions(request, corsOptions); } function useCORS(options) { let corsOptionsFactory = () => ({}); if (options != null) { if (typeof options === 'function') { corsOptionsFactory = options; } else if (typeof options === 'object') { const corsOptions = { ...options, }; corsOptionsFactory = () => corsOptions; } else if (options === false) { corsOptionsFactory = () => false; } } return { async onRequest({ request, serverContext, fetchAPI, endResponse }) { if (request.method.toUpperCase() === 'OPTIONS') { const headers = await getCORSResponseHeaders(request, corsOptionsFactory, serverContext); const response = new fetchAPI.Response(null, { status: 204, headers: { ...headers, 'Content-Length': '0', }, }); endResponse(response); } }, async onResponse({ request, serverContext, response }) { const headers = await getCORSResponseHeaders(request, corsOptionsFactory, serverContext); for (const headerName in headers) { response.headers.set(headerName, headers[headerName]); } }, }; } function useHealthCheck(options) { const id = (options === null || options === void 0 ? void 0 : options.id) || Date.now().toString(); const logger = (options === null || options === void 0 ? void 0 : options.logger) || console; return { async onRequest({ request, endResponse, fetchAPI }) { const requestPath = request.url.split('?')[0]; if (requestPath.endsWith('/health')) { logger.debug(`Responding Health Check`); const response = new fetchAPI.Response(JSON.stringify({ message: 'alive', }), { status: 200, headers: { 'Content-Type': 'application/json', 'x-yoga-id': id, }, }); endResponse(response); } else if (requestPath.endsWith('/readiness')) { logger.debug(`Responding Readiness Check`); const readinessResponse = await fetchAPI.fetch(request.url.replace('/readiness', '/health')); const { message } = await readinessResponse.json(); if (readinessResponse.status === 200 && readinessResponse.headers.get('x-yoga-id') === id && message === 'alive') { const response = new fetchAPI.Response(JSON.stringify({ message: 'ready', }), { status: 200, headers: { 'Content-Type': 'application/json', }, }); endResponse(response); } else { throw createGraphQLError(`Readiness check failed with status ${readinessResponse.status}`); } } }, }; } var graphiqlHTML = "__TITLE__
"; function shouldRenderGraphiQL({ headers, method }) { var _a; return method === 'GET' && !!((_a = headers === null || headers === void 0 ? void 0 : headers.get('accept')) === null || _a === void 0 ? void 0 : _a.includes('text/html')); } const renderGraphiQL = (opts) => graphiqlHTML .replace('__TITLE__', (opts === null || opts === void 0 ? void 0 : opts.title) || 'Yoga GraphiQL') .replace('__OPTS__', JSON.stringify(opts !== null && opts !== void 0 ? opts : {})); function useGraphiQL(config) { var _a, _b; const logger = (_a = config === null || config === void 0 ? void 0 : config.logger) !== null && _a !== void 0 ? _a : console; let graphiqlOptionsFactory; if (typeof (config === null || config === void 0 ? void 0 : config.options) === 'function') { graphiqlOptionsFactory = config === null || config === void 0 ? void 0 : config.options; } else if (typeof (config === null || config === void 0 ? void 0 : config.options) === 'object') { graphiqlOptionsFactory = () => config === null || config === void 0 ? void 0 : config.options; } else if ((config === null || config === void 0 ? void 0 : config.options) === false) { graphiqlOptionsFactory = () => false; } else { graphiqlOptionsFactory = () => ({}); } const renderer = (_b = config === null || config === void 0 ? void 0 : config.render) !== null && _b !== void 0 ? _b : renderGraphiQL; return { async onRequest({ request, serverContext, fetchAPI, endResponse }) { const requestPath = request.url.split('?')[0]; if ((config === null || config === void 0 ? void 0 : config.endpoint) != null && !requestPath.endsWith(config === null || config === void 0 ? void 0 : config.endpoint)) { logger.debug(`Responding 404 Not Found`); const response = new fetchAPI.Response(`Unable to ${request.method} ${requestPath}`, { status: 404, statusText: `Not Found`, }); endResponse(response); } else if (shouldRenderGraphiQL(request)) { logger.debug(`Rendering GraphiQL`); const graphiqlOptions = graphiqlOptionsFactory(request, serverContext); if (graphiqlOptions) { const graphiQLBody = await renderer({ endpoint: config === null || config === void 0 ? void 0 : config.endpoint, ...(graphiqlOptions === true ? {} : graphiqlOptions), }); const response = new fetchAPI.Response(graphiQLBody, { headers: { 'Content-Type': 'text/html', }, status: 200, }); endResponse(response); } } }, }; } const DEFAULT_MATCHER = () => true; function useRequestParser(options) { const matchFn = options.match || DEFAULT_MATCHER; return { onRequestParse({ request, setRequestParser }) { if (matchFn(request)) { setRequestParser(function useRequestParserFn(request) { return options.parse(request); }); } }, }; } function parseURLSearchParams(requestBody) { const searchParams = new URLSearchParams(requestBody); const operationName = searchParams.get('operationName') || undefined; const query = searchParams.get('query') || undefined; const variablesStr = searchParams.get('variables') || undefined; const extensionsStr = searchParams.get('extensions') || undefined; return { operationName, query, variables: variablesStr ? JSON.parse(variablesStr) : undefined, extensions: extensionsStr ? JSON.parse(extensionsStr) : undefined, }; } function isContentTypeMatch(request, expectedContentType) { const contentType = request.headers.get('content-type'); return (contentType === expectedContentType || !!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(`${expectedContentType};`))); } function isGETRequest(request) { return request.method === 'GET'; } function parseGETRequest(request) { const [, searchParamsStr] = request.url.split('?'); return parseURLSearchParams(searchParamsStr); } function isPOSTJsonRequest(request) { return request.method === 'POST'; } async function parsePOSTJsonRequest(request) { const requestBody = await request.json(); return { operationName: requestBody.operationName, query: requestBody.query, variables: requestBody.variables, extensions: requestBody.extensions, }; } function dset(obj, keys, val) { keys.split && (keys=keys.split('.')); var i=0, l=keys.length, t=obj, x, k; while (i < l) { k = keys[i++]; if (k === '__proto__' || k === 'constructor' || k === 'prototype') break; t = t[k] = (i === l) ? val : (typeof(x=t[k])===typeof(keys)) ? x : (keys[i]*0 !== 0 || !!~(''+keys[i]).indexOf('.')) ? {} : []; } } function isPOSTMultipartRequest(request) { return (request.method === 'POST' && isContentTypeMatch(request, 'multipart/form-data')); } async function parsePOSTMultipartRequest(request) { var _a, _b; let requestBody; try { requestBody = await request.formData(); } catch (e) { // Trick for @whatwg-node/fetch errors on Node.js // TODO: This needs a better solution if (e instanceof Error && e.message.startsWith('File size limit exceeded: ')) { throw createGraphQLError(e.message, { extensions: { http: { status: 413, }, }, }); } throw e; } const operationsStr = ((_a = requestBody.get('operations')) === null || _a === void 0 ? void 0 : _a.toString()) || '{}'; const operations = JSON.parse(operationsStr); const mapStr = ((_b = requestBody.get('map')) === null || _b === void 0 ? void 0 : _b.toString()) || '{}'; const map = JSON.parse(mapStr); for (const fileIndex in map) { const file = requestBody.get(fileIndex); const keys = map[fileIndex]; for (const key of keys) { dset(operations, key, file); } } return { operationName: operations.operationName, query: operations.query, variables: operations.variables, extensions: operations.extensions, }; } function isPOSTGraphQLStringRequest(request) { return (request.method === 'POST' && isContentTypeMatch(request, 'application/graphql')); } async function parsePOSTGraphQLStringRequest(request) { const requestBody = await request.text(); return { query: requestBody, }; } function useResultProcessor(options) { const isMatch = options.match || (() => true); return { onResultProcess({ request, result, setResultProcessor }) { if (isMatch(request, result)) { setResultProcessor(options.processResult); } }, }; } let encodeString; if (globalThis.Buffer) { encodeString = function encodeStringWithBuffer(str) { return globalThis.Buffer.from(str, 'utf8'); }; } else { const textEncoder = new TextEncoder(); encodeString = function encodeStringWithTextEncoder(str) { return textEncoder.encode(str); }; } function isRegularResult(request, result) { return !isAsyncIterable(result); } function processRegularResult(executionResult, fetchAPI) { const responseBody = JSON.stringify(executionResult); const decodedString = encodeString(responseBody); const headersInit = { 'Content-Type': 'application/json', 'Content-Length': decodedString.byteLength.toString(), }; const responseInit = { headers: headersInit, status: 200, }; return new fetchAPI.Response(decodedString, responseInit); } function isPushResult(request, result) { var _a; return (isAsyncIterable$1(result) && !!((_a = request.headers.get('accept')) === null || _a === void 0 ? void 0 : _a.includes('text/event-stream'))); } function processPushResult(result, fetchAPI) { const headersInit = { 'Content-Type': 'text/event-stream', Connection: 'keep-alive', 'Cache-Control': 'no-cache', 'Content-Encoding': 'none', }; const responseInit = { headers: headersInit, status: 200, }; let iterator; const readableStream = new fetchAPI.ReadableStream({ start() { iterator = result[Symbol.asyncIterator](); }, async pull(controller) { const { done, value } = await iterator.next(); if (value != null) { const chunk = JSON.stringify(value); controller.enqueue(encodeString(`data: ${chunk}\n\n`)); } if (done) { controller.close(); } }, async cancel(e) { var _a; await ((_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator, e)); }, }); return new fetchAPI.Response(readableStream, responseInit); } function isMultipartResult(request, result) { var _a; return (isAsyncIterable$1(result) && !!((_a = request.headers.get('accept')) === null || _a === void 0 ? void 0 : _a.includes('multipart/mixed'))); } function processMultipartResult(executionPatchResultIterable, fetchAPI) { const headersInit = { Connection: 'keep-alive', 'Content-Type': 'multipart/mixed; boundary="-"', 'Transfer-Encoding': 'chunked', }; const responseInit = { headers: headersInit, status: 200, }; let iterator; const readableStream = new fetchAPI.ReadableStream({ start(controller) { iterator = executionPatchResultIterable[Symbol.asyncIterator](); controller.enqueue(encodeString(`---`)); }, async pull(controller) { const { done, value } = await iterator.next(); if (value != null) { controller.enqueue(encodeString('\r\n')); controller.enqueue(encodeString('Content-Type: application/json; charset=utf-8')); controller.enqueue(encodeString('\r\n')); const chunk = JSON.stringify(value); const encodedChunk = encodeString(chunk); controller.enqueue(encodeString('Content-Length: ' + encodedChunk.byteLength)); controller.enqueue(encodeString('\r\n')); controller.enqueue(encodeString('\r\n')); controller.enqueue(encodedChunk); controller.enqueue(encodeString('\r\n')); controller.enqueue(encodeString('---')); } if (done) { controller.enqueue(encodeString('\r\n-----\r\n')); controller.close(); } }, async cancel(e) { var _a; await ((_a = iterator.return) === null || _a === void 0 ? void 0 : _a.call(iterator, e)); }, }); return new fetchAPI.Response(readableStream, responseInit); } function isPOSTFormUrlEncodedRequest(request) { return (request.method === 'POST' && isContentTypeMatch(request, 'application/x-www-form-urlencoded')); } async function parsePOSTFormUrlEncodedRequest(request) { const requestBody = await request.text(); return parseURLSearchParams(requestBody); } function isAggregateError(obj) { return obj != null && typeof obj === 'object' && 'errors' in obj; } function hasToString(obj) { return obj != null && typeof obj.toString === 'function'; } function handleError(error, errors = []) { if (isAggregateError(error)) { for (const singleError of error.errors) { errors.push(...handleError(singleError)); } } else if (error instanceof GraphQLError) { errors.push(error); } else if (error instanceof Error) { errors.push(createGraphQLError(error.message)); } else if (typeof error === 'string') { errors.push(createGraphQLError(error)); } else if (hasToString(error)) { errors.push(createGraphQLError(error.toString())); } else { errors.push(createGraphQLError('Unexpected error!')); } return errors; } function useCheckMethodForGraphQL() { return { onRequest({ request }) { if (request.method !== 'GET' && request.method !== 'POST') { throw createGraphQLError('GraphQL only supports GET and POST requests.', { extensions: { http: { status: 405, headers: { Allow: 'GET, POST', }, }, }, }); } }, }; } function useCheckGraphQLQueryParam() { return { onRequestParse() { return { onRequestParseDone({ params }) { if (params.query == null) { throw createGraphQLError('Must provide query string.', { extensions: { http: { status: 400, headers: { Allow: 'GET, POST', }, }, }, }); } const queryParamType = typeof params.query; if (queryParamType !== 'string') { throw createGraphQLError(`Expected "query" to be "string" but given "${queryParamType}".`, { extensions: { http: { status: 400, headers: { Allow: 'GET, POST', }, }, }, }); } }, }; }, }; } function useHTTPValidationError() { return { onValidate() { return ({ valid, result }) => { if (!valid) { result.forEach((error) => { error.extensions.http = { status: 400, }; }); throw new AggregateErrorImpl(result); } }; }, }; } function usePreventMutationViaGET() { return { onParse() { // We should improve this by getting Yoga stuff from the hook params directly instead of the context return ({ result, context: { request, operationName } }) => { var _a; if (result instanceof Error) { if (result instanceof GraphQLError) { result.extensions.http = { status: 400, }; } throw result; } const operation = result ? (_a = getOperationAST(result, operationName)) !== null && _a !== void 0 ? _a : undefined : undefined; if (!operation) { throw createGraphQLError('Could not determine what operation to execute.', { extensions: { http: { status: 400, }, }, }); } if (operation.operation === 'mutation' && request.method === 'GET') { throw createGraphQLError('Can only perform a mutation operation from a POST request.', { extensions: { http: { status: 405, headers: { Allow: 'POST', }, }, }, }); } }; }, }; } function getDefaultSchema() { return makeExecutableSchema({ typeDefs: /* GraphQL */ ` """ Greetings from GraphQL Yoga! """ type Query { greetings: String } type Subscription { """ Current Time """ time: String } `, resolvers: { Query: { greetings: () => 'This is the `greetings` field of the root `Query` type', }, Subscription: { time: { async *subscribe() { while (true) { yield { time: new Date().toISOString() }; await new Promise((resolve) => setTimeout(resolve, 1000)); } }, }, }, }, }); } /** * Base class that can be extended to create a GraphQL server with any HTTP server framework. * @internal */ class YogaServer { constructor(options) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; this.handleRequest = async (request, ...args) => { const response = await this.getResponse(request, ...args); for (const onResponseHook of this.onResponseHooks) { await onResponseHook({ request, response, serverContext: args[0], }); } return response; }; this.fetch = (input, init) => { let request; if (typeof input === 'string') { request = new this.fetchAPI.Request(input, init); } else { request = input; } return this.handleRequest(request, init); }; // FetchEvent is not available in all envs this.fetchEventListener = (event) => event.respondWith(this.handleRequest(event.request, event)); this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : 'yoga'; this.fetchAPI = { Request: (_c = (_b = options === null || options === void 0 ? void 0 : options.fetchAPI) === null || _b === void 0 ? void 0 : _b.Request) !== null && _c !== void 0 ? _c : Request$1, Response: (_e = (_d = options === null || options === void 0 ? void 0 : options.fetchAPI) === null || _d === void 0 ? void 0 : _d.Response) !== null && _e !== void 0 ? _e : Response$1, fetch: (_g = (_f = options === null || options === void 0 ? void 0 : options.fetchAPI) === null || _f === void 0 ? void 0 : _f.fetch) !== null && _g !== void 0 ? _g : fetch$1, ReadableStream: (_j = (_h = options === null || options === void 0 ? void 0 : options.fetchAPI) === null || _h === void 0 ? void 0 : _h.ReadableStream) !== null && _j !== void 0 ? _j : ReadableStream, }; const schema = (options === null || options === void 0 ? void 0 : options.schema) ? isSchema(options.schema) ? options.schema : makeExecutableSchema({ typeDefs: options.schema.typeDefs, resolvers: options.schema.resolvers, }) : getDefaultSchema(); const logger = (options === null || options === void 0 ? void 0 : options.logging) != null ? options.logging : true; this.logger = typeof logger === 'boolean' ? logger === true ? defaultYogaLogger : { debug: () => { }, error: () => { }, warn: () => { }, info: () => { }, } : logger; const maskedErrors = (_k = options === null || options === void 0 ? void 0 : options.maskedErrors) !== null && _k !== void 0 ? _k : true; const server = this; this.endpoint = options === null || options === void 0 ? void 0 : options.endpoint; this.plugins = [ // Use the schema provided by the user enableIf(schema != null, useSchema(schema)), // Performance things enableIf((options === null || options === void 0 ? void 0 : options.parserCache) !== false, () => useParserCache(typeof (options === null || options === void 0 ? void 0 : options.parserCache) === 'object' ? options === null || options === void 0 ? void 0 : options.parserCache : undefined)), enableIf((options === null || options === void 0 ? void 0 : options.validationCache) !== false, () => useValidationCache({ cache: typeof (options === null || options === void 0 ? void 0 : options.validationCache) === 'object' ? options === null || options === void 0 ? void 0 : options.validationCache : undefined, })), // Log events - useful for debugging purposes enableIf(logger !== false, useLogger({ skipIntrospection: true, logFn: (eventName, events) => { switch (eventName) { case 'execute-start': case 'subscribe-start': this.logger.debug(titleBold('Execution start')); const { query, operationName, variables, extensions, } = events.args.contextValue; this.logger.debug(titleBold('Received GraphQL operation:')); this.logger.debug({ query, operationName, variables, extensions, }); break; case 'execute-end': case 'subscribe-end': this.logger.debug(titleBold('Execution end')); this.logger.debug({ result: events.result, }); break; } }, })), enableIf((options === null || options === void 0 ? void 0 : options.context) != null, useExtendContext(async (initialContext) => { if (options === null || options === void 0 ? void 0 : options.context) { if (typeof options.context === 'function') { return options.context(initialContext); } return options.context; } })), // Middlewares before processing the incoming HTTP request useHealthCheck({ id: this.id, logger: this.logger, }), enableIf((options === null || options === void 0 ? void 0 : options.graphiql) !== false, () => useGraphiQL({ get endpoint() { return server.endpoint; }, options: options === null || options === void 0 ? void 0 : options.graphiql, render: options === null || options === void 0 ? void 0 : options.renderGraphiQL, logger: this.logger, })), enableIf((options === null || options === void 0 ? void 0 : options.cors) !== false, () => useCORS(options === null || options === void 0 ? void 0 : options.cors)), // Middlewares before the GraphQL execution useCheckMethodForGraphQL(), useRequestParser({ match: isGETRequest, parse: parseGETRequest, }), useRequestParser({ match: isPOSTJsonRequest, parse: parsePOSTJsonRequest, }), enableIf((options === null || options === void 0 ? void 0 : options.multipart) !== false, () => useRequestParser({ match: isPOSTMultipartRequest, parse: parsePOSTMultipartRequest, })), useRequestParser({ match: isPOSTGraphQLStringRequest, parse: parsePOSTGraphQLStringRequest, }), useRequestParser({ match: isPOSTFormUrlEncodedRequest, parse: parsePOSTFormUrlEncodedRequest, }), // Middlewares after the GraphQL execution useResultProcessor({ match: isRegularResult, processResult: processRegularResult, }), useResultProcessor({ match: isPushResult, processResult: processPushResult, }), useResultProcessor({ match: isMultipartResult, processResult: processMultipartResult, }), ...((_l = options === null || options === void 0 ? void 0 : options.plugins) !== null && _l !== void 0 ? _l : []), useCheckGraphQLQueryParam(), // To make sure those are called at the end { onPluginInit({ addPlugin }) { addPlugin( // We make sure that the user doesn't send a mutation with GET usePreventMutationViaGET()); if (!!maskedErrors) { addPlugin(useMaskedErrors(typeof maskedErrors === 'object' ? maskedErrors : undefined)); } addPlugin( // We handle validation errors at the end useHTTPValidationError()); }, }, ]; this.getEnveloped = envelop({ plugins: this.plugins, }); this.onRequestHooks = []; this.onRequestParseHooks = []; this.onResultProcessHooks = []; this.onResponseHooks = []; for (const plugin of this.plugins) { if (plugin) { if (plugin.onRequestParse) { this.onRequestParseHooks.push(plugin.onRequestParse); } if (plugin.onRequest) { this.onRequestHooks.push(plugin.onRequest); } if (plugin.onResultProcess) { this.onResultProcessHooks.push(plugin.onResultProcess); } if (plugin.onResponse) { this.onResponseHooks.push(plugin.onResponse); } } } } async getResponse(request, ...args) { var _a, _b; const serverContext = args[0]; try { for (const onRequestHook of this.onRequestHooks) { let response; await onRequestHook({ request, serverContext, fetchAPI: this.fetchAPI, endResponse(newResponse) { response = newResponse; }, }); if (response) { return response; } } let requestParser; const onRequestParseDoneList = []; for (const onRequestParse of this.onRequestParseHooks) { const onRequestParseResult = await onRequestParse({ request, requestParser, setRequestParser(parser) { requestParser = parser; }, }); if ((onRequestParseResult === null || onRequestParseResult === void 0 ? void 0 : onRequestParseResult.onRequestParseDone) != null) { onRequestParseDoneList.push(onRequestParseResult.onRequestParseDone); } } this.logger.debug(`Parsing request to extract GraphQL parameters`); if (!requestParser) { return new this.fetchAPI.Response('Request is not valid', { status: 400, statusText: 'Bad Request', }); } let params = await requestParser(request); for (const onRequestParseDone of onRequestParseDoneList) { await onRequestParseDone({ params, setParams(newParams) { params = newParams; }, }); } const initialContext = { request, ...params, ...serverContext, }; const enveloped = this.getEnveloped(initialContext); this.logger.debug(`Processing GraphQL Parameters`); const result = await processRequest({ request, params, enveloped, fetchAPI: this.fetchAPI, onResultProcessHooks: this.onResultProcessHooks, }); return result; } catch (error) { const finalResponseInit = { status: 200, headers: { 'Content-Type': 'application/json', }, }; const errors = handleError(error); for (const error of errors) { if ((_a = error.extensions) === null || _a === void 0 ? void 0 : _a.http) { if (error.extensions.http.status && ((_b = error.extensions) === null || _b === void 0 ? void 0 : _b.http.status) > finalResponseInit.status) { finalResponseInit.status = error.extensions.http.status; } if (error.extensions.http.headers) { Object.assign(finalResponseInit.headers, error.extensions.http.headers); } // Remove http extensions from the final response error.extensions.http = undefined; } } const payload = { data: null, errors, }; const decodedString = encodeString(JSON.stringify(payload)); finalResponseInit.headers['Content-Length'] = decodedString.byteLength.toString(); return new this.fetchAPI.Response(decodedString, finalResponseInit); } } /** * Testing utility to mock http request for GraphQL endpoint * * * Example - Test a simple query * ```ts * const { response, executionResult } = await yoga.inject({ * document: "query { ping }", * }) * expect(response.status).toBe(200) * expect(executionResult.data.ping).toBe('pong') * ``` **/ async inject({ document, variables, operationName, headers, serverContext, }) { const request = new this.fetchAPI.Request('http://localhost/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', ...headers, }, body: JSON.stringify({ query: document && (typeof document === 'string' ? document : print(document)), variables, operationName, }), }); const response = await this.handleRequest(request, serverContext); let executionResult = null; if (response.headers.get('content-type') === 'application/json') { executionResult = await response.json(); } return { response, executionResult, }; } start() { self.addEventListener('fetch', this.fetchEventListener); } stop() { self.removeEventListener('fetch', this.fetchEventListener); } } function createServer(options) { const server = new YogaServer(options); // TODO: Will be removed once we get rid of classes const fnHandler = (input, ctx) => { // Is input a container object over Request? if (input.request) { // In this input is also the context return server.handleRequest(input.request, input); } // Or is it Request itself? // Then ctx is present and it is the context return server.handleRequest(input, ctx); }; return new Proxy(server, { // It should have all the attributes of the handler function and the server instance has: (_, prop) => { return prop in fnHandler || prop in server; }, get: (_, prop) => { if (server[prop]) { if (server[prop].bind) { return server[prop].bind(server); } return server[prop]; } if (fnHandler[prop]) { if (fnHandler[prop].bind) { return fnHandler[prop].bind(fnHandler); } return fnHandler[prop]; } }, apply(_, __, [input, ctx]) { return fnHandler(input, ctx); }, }); } /// /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. 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. ***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __values(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __await(v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } function __asyncGenerator(thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } } /** An error subclass which is thrown when there are too many pending push or next operations on a single repeater. */ var RepeaterOverflowError = /** @class */ (function (_super) { __extends(RepeaterOverflowError, _super); function RepeaterOverflowError(message) { var _this = _super.call(this, message) || this; Object.defineProperty(_this, "name", { value: "RepeaterOverflowError", enumerable: false, }); if (typeof Object.setPrototypeOf === "function") { Object.setPrototypeOf(_this, _this.constructor.prototype); } else { _this.__proto__ = _this.constructor.prototype; } if (typeof Error.captureStackTrace === "function") { Error.captureStackTrace(_this, _this.constructor); } return _this; } return RepeaterOverflowError; }(Error)); /** A buffer which allows you to push a set amount of values to the repeater without pushes waiting or throwing errors. */ /** @class */ ((function () { function FixedBuffer(capacity) { if (capacity < 0) { throw new RangeError("Capacity may not be less than 0"); } this._c = capacity; this._q = []; } Object.defineProperty(FixedBuffer.prototype, "empty", { get: function () { return this._q.length === 0; }, enumerable: false, configurable: true }); Object.defineProperty(FixedBuffer.prototype, "full", { get: function () { return this._q.length >= this._c; }, enumerable: false, configurable: true }); FixedBuffer.prototype.add = function (value) { if (this.full) { throw new Error("Buffer full"); } else { this._q.push(value); } }; FixedBuffer.prototype.remove = function () { if (this.empty) { throw new Error("Buffer empty"); } return this._q.shift(); }; return FixedBuffer; })()); // TODO: Use a circular buffer here. /** Sliding buffers allow you to push a set amount of values to the repeater without pushes waiting or throwing errors. If the number of values exceeds the capacity set in the constructor, the buffer will discard the earliest values added. */ /** @class */ ((function () { function SlidingBuffer(capacity) { if (capacity < 1) { throw new RangeError("Capacity may not be less than 1"); } this._c = capacity; this._q = []; } Object.defineProperty(SlidingBuffer.prototype, "empty", { get: function () { return this._q.length === 0; }, enumerable: false, configurable: true }); Object.defineProperty(SlidingBuffer.prototype, "full", { get: function () { return false; }, enumerable: false, configurable: true }); SlidingBuffer.prototype.add = function (value) { while (this._q.length >= this._c) { this._q.shift(); } this._q.push(value); }; SlidingBuffer.prototype.remove = function () { if (this.empty) { throw new Error("Buffer empty"); } return this._q.shift(); }; return SlidingBuffer; })()); /** Dropping buffers allow you to push a set amount of values to the repeater without the push function waiting or throwing errors. If the number of values exceeds the capacity set in the constructor, the buffer will discard the latest values added. */ /** @class */ ((function () { function DroppingBuffer(capacity) { if (capacity < 1) { throw new RangeError("Capacity may not be less than 1"); } this._c = capacity; this._q = []; } Object.defineProperty(DroppingBuffer.prototype, "empty", { get: function () { return this._q.length === 0; }, enumerable: false, configurable: true }); Object.defineProperty(DroppingBuffer.prototype, "full", { get: function () { return false; }, enumerable: false, configurable: true }); DroppingBuffer.prototype.add = function (value) { if (this._q.length < this._c) { this._q.push(value); } }; DroppingBuffer.prototype.remove = function () { if (this.empty) { throw new Error("Buffer empty"); } return this._q.shift(); }; return DroppingBuffer; })()); /** Makes sure promise-likes don’t cause unhandled rejections. */ function swallow(value) { if (value != null && typeof value.then === "function") { value.then(NOOP, NOOP); } } /*** REPEATER STATES ***/ /** The following is an enumeration of all possible repeater states. These states are ordered, and a repeater may only advance to higher states. */ /** The initial state of the repeater. */ var Initial = 0; /** Repeaters advance to this state the first time the next method is called on the repeater. */ var Started = 1; /** Repeaters advance to this state when the stop function is called. */ var Stopped = 2; /** Repeaters advance to this state when there are no values left to be pulled from the repeater. */ var Done = 3; /** Repeaters advance to this state if an error is thrown into the repeater. */ var Rejected = 4; /** The maximum number of push or next operations which may exist on a single repeater. */ var MAX_QUEUE_LENGTH = 1024; var NOOP = function () { }; /** A helper function used to mimic the behavior of async generators where the final iteration is consumed. */ function consumeExecution(r) { var err = r.err; var execution = Promise.resolve(r.execution).then(function (value) { if (err != null) { throw err; } return value; }); r.err = undefined; r.execution = execution.then(function () { return undefined; }, function () { return undefined; }); return r.pending === undefined ? execution : r.pending.then(function () { return execution; }); } /** A helper function for building iterations from values. Promises are unwrapped, so that iterations never have their value property set to a promise. */ function createIteration(r, value) { var done = r.state >= Done; return Promise.resolve(value).then(function (value) { if (!done && r.state >= Rejected) { return consumeExecution(r).then(function (value) { return ({ value: value, done: true, }); }); } return { value: value, done: done }; }); } /** * This function is bound and passed to the executor as the stop argument. * * Advances state to Stopped. */ function stop(r, err) { var e_1, _a; if (r.state >= Stopped) { return; } r.state = Stopped; r.onnext(); r.onstop(); if (r.err == null) { r.err = err; } if (r.pushes.length === 0 && (typeof r.buffer === "undefined" || r.buffer.empty)) { finish(r); } else { try { for (var _b = __values(r.pushes), _d = _b.next(); !_d.done; _d = _b.next()) { var push_1 = _d.value; push_1.resolve(); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } } /** * The difference between stopping a repeater vs finishing a repeater is that stopping a repeater allows next to continue to drain values from the push queue and buffer, while finishing a repeater will clear all pending values and end iteration immediately. Once, a repeater is finished, all iterations will have the done property set to true. * * Advances state to Done. */ function finish(r) { var e_2, _a; if (r.state >= Done) { return; } if (r.state < Stopped) { stop(r); } r.state = Done; r.buffer = undefined; try { for (var _b = __values(r.nexts), _d = _b.next(); !_d.done; _d = _b.next()) { var next = _d.value; var execution = r.pending === undefined ? consumeExecution(r) : r.pending.then(function () { return consumeExecution(r); }); next.resolve(createIteration(r, execution)); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_d && !_d.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } r.pushes = []; r.nexts = []; } /** * Called when a promise passed to push rejects, or when a push call is unhandled. * * Advances state to Rejected. */ function reject(r) { if (r.state >= Rejected) { return; } if (r.state < Done) { finish(r); } r.state = Rejected; } /** This function is bound and passed to the executor as the push argument. */ function push(r, value) { swallow(value); if (r.pushes.length >= MAX_QUEUE_LENGTH) { throw new RepeaterOverflowError("No more than " + MAX_QUEUE_LENGTH + " pending calls to push are allowed on a single repeater."); } else if (r.state >= Stopped) { return Promise.resolve(undefined); } var valueP = r.pending === undefined ? Promise.resolve(value) : r.pending.then(function () { return value; }); valueP = valueP.catch(function (err) { if (r.state < Stopped) { r.err = err; } reject(r); return undefined; // void :( }); var nextP; if (r.nexts.length) { var next_1 = r.nexts.shift(); next_1.resolve(createIteration(r, valueP)); if (r.nexts.length) { nextP = Promise.resolve(r.nexts[0].value); } else { nextP = new Promise(function (resolve) { return (r.onnext = resolve); }); } } else if (typeof r.buffer !== "undefined" && !r.buffer.full) { r.buffer.add(valueP); nextP = Promise.resolve(undefined); } else { nextP = new Promise(function (resolve) { return r.pushes.push({ resolve: resolve, value: valueP }); }); } // If an error is thrown into the repeater via the next or throw methods, we give the repeater a chance to handle this by rejecting the promise returned from push. If the push call is not immediately handled we throw the next iteration of the repeater. // To check that the promise returned from push is floating, we modify the then and catch methods of the returned promise so that they flip the floating flag. The push function actually does not return a promise, because modern engines do not call the then and catch methods on native promises. By making next a plain old javascript object, we ensure that the then and catch methods will be called. var floating = true; var next = {}; var unhandled = nextP.catch(function (err) { if (floating) { throw err; } return undefined; // void :( }); next.then = function (onfulfilled, onrejected) { floating = false; return Promise.prototype.then.call(nextP, onfulfilled, onrejected); }; next.catch = function (onrejected) { floating = false; return Promise.prototype.catch.call(nextP, onrejected); }; next.finally = nextP.finally.bind(nextP); r.pending = valueP .then(function () { return unhandled; }) .catch(function (err) { r.err = err; reject(r); }); return next; } /** * Creates the stop callable promise which is passed to the executor */ function createStop(r) { var stop1 = stop.bind(null, r); var stopP = new Promise(function (resolve) { return (r.onstop = resolve); }); stop1.then = stopP.then.bind(stopP); stop1.catch = stopP.catch.bind(stopP); stop1.finally = stopP.finally.bind(stopP); return stop1; } /** * Calls the executor passed into the constructor. This function is called the first time the next method is called on the repeater. * * Advances state to Started. */ function execute(r) { if (r.state >= Started) { return; } r.state = Started; var push1 = push.bind(null, r); var stop1 = createStop(r); r.execution = new Promise(function (resolve) { return resolve(r.executor(push1, stop1)); }); // TODO: We should consider stopping all repeaters when the executor settles. r.execution.catch(function () { return stop(r); }); } var records = new WeakMap(); // NOTE: While repeaters implement and are assignable to the AsyncGenerator interface, and you can use the types interchangeably, we don’t use typescript’s implements syntax here because this would make supporting earlier versions of typescript trickier. This is because TypeScript version 3.6 changed the iterator types by adding the TReturn and TNext type parameters. var Repeater = /** @class */ (function () { function Repeater(executor, buffer) { records.set(this, { executor: executor, buffer: buffer, err: undefined, state: Initial, pushes: [], nexts: [], pending: undefined, execution: undefined, onnext: NOOP, onstop: NOOP, }); } Repeater.prototype.next = function (value) { swallow(value); var r = records.get(this); if (r === undefined) { throw new Error("WeakMap error"); } if (r.nexts.length >= MAX_QUEUE_LENGTH) { throw new RepeaterOverflowError("No more than " + MAX_QUEUE_LENGTH + " pending calls to next are allowed on a single repeater."); } if (r.state <= Initial) { execute(r); } r.onnext(value); if (typeof r.buffer !== "undefined" && !r.buffer.empty) { var result = createIteration(r, r.buffer.remove()); if (r.pushes.length) { var push_2 = r.pushes.shift(); r.buffer.add(push_2.value); r.onnext = push_2.resolve; } return result; } else if (r.pushes.length) { var push_3 = r.pushes.shift(); r.onnext = push_3.resolve; return createIteration(r, push_3.value); } else if (r.state >= Stopped) { finish(r); return createIteration(r, consumeExecution(r)); } return new Promise(function (resolve) { return r.nexts.push({ resolve: resolve, value: value }); }); }; Repeater.prototype.return = function (value) { swallow(value); var r = records.get(this); if (r === undefined) { throw new Error("WeakMap error"); } finish(r); // We override the execution because return should always return the value passed in. r.execution = Promise.resolve(r.execution).then(function () { return value; }); return createIteration(r, consumeExecution(r)); }; Repeater.prototype.throw = function (err) { var r = records.get(this); if (r === undefined) { throw new Error("WeakMap error"); } if (r.state <= Initial || r.state >= Stopped || (typeof r.buffer !== "undefined" && !r.buffer.empty)) { finish(r); // If r.err is already set, that mean the repeater has already produced an error, so we throw that error rather than the error passed in, because doing so might be more informative for the caller. if (r.err == null) { r.err = err; } return createIteration(r, consumeExecution(r)); } return this.next(Promise.reject(err)); }; Repeater.prototype[Symbol.asyncIterator] = function () { return this; }; // TODO: Remove these static methods from the class. Repeater.race = race; Repeater.merge = merge; Repeater.zip = zip; Repeater.latest = latest; return Repeater; }()); /*** COMBINATOR FUNCTIONS ***/ // TODO: move these combinators to their own file. function getIterators(values, options) { var e_3, _a; var iters = []; var _loop_1 = function (value) { if (value != null && typeof value[Symbol.asyncIterator] === "function") { iters.push(value[Symbol.asyncIterator]()); } else if (value != null && typeof value[Symbol.iterator] === "function") { iters.push(value[Symbol.iterator]()); } else { iters.push((function valueToAsyncIterator() { return __asyncGenerator(this, arguments, function valueToAsyncIterator_1() { return __generator(this, function (_a) { switch (_a.label) { case 0: if (!options.yieldValues) return [3 /*break*/, 3]; return [4 /*yield*/, __await(value)]; case 1: return [4 /*yield*/, _a.sent()]; case 2: _a.sent(); _a.label = 3; case 3: if (!options.returnValues) return [3 /*break*/, 5]; return [4 /*yield*/, __await(value)]; case 4: return [2 /*return*/, _a.sent()]; case 5: return [2 /*return*/]; } }); }); })()); } }; try { for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) { var value = values_1_1.value; _loop_1(value); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1); } finally { if (e_3) throw e_3.error; } } return iters; } // NOTE: whenever you see any variables called `advance` or `advances`, know that it is a hack to get around the fact that `Promise.race` leaks memory. These variables are intended to be set to the resolve function of a promise which is constructed and awaited as an alternative to Promise.race. For more information, see this comment in the Node.js issue tracker: https://github.com/nodejs/node/issues/17469#issuecomment-685216777. function race(contenders) { var _this = this; var iters = getIterators(contenders, { returnValues: true }); return new Repeater(function (push, stop) { return __awaiter(_this, void 0, void 0, function () { var advance, stopped, finalIteration, iteration, i_1, _loop_2; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!iters.length) { stop(); return [2 /*return*/]; } stopped = false; stop.then(function () { advance(); stopped = true; }); _a.label = 1; case 1: _a.trys.push([1, , 5, 7]); iteration = void 0; i_1 = 0; _loop_2 = function () { var j, iters_1, iters_1_1, iter; var e_4, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: j = i_1; try { for (iters_1 = (e_4 = void 0, __values(iters)), iters_1_1 = iters_1.next(); !iters_1_1.done; iters_1_1 = iters_1.next()) { iter = iters_1_1.value; Promise.resolve(iter.next()).then(function (iteration) { if (iteration.done) { stop(); if (finalIteration === undefined) { finalIteration = iteration; } } else if (i_1 === j) { // This iterator has won, advance i and resolve the promise. i_1++; advance(iteration); } }, function (err) { return stop(err); }); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (iters_1_1 && !iters_1_1.done && (_a = iters_1.return)) _a.call(iters_1); } finally { if (e_4) throw e_4.error; } } return [4 /*yield*/, new Promise(function (resolve) { return (advance = resolve); })]; case 1: iteration = _b.sent(); if (!(iteration !== undefined)) return [3 /*break*/, 3]; return [4 /*yield*/, push(iteration.value)]; case 2: _b.sent(); _b.label = 3; case 3: return [2 /*return*/]; } }); }; _a.label = 2; case 2: if (!!stopped) return [3 /*break*/, 4]; return [5 /*yield**/, _loop_2()]; case 3: _a.sent(); return [3 /*break*/, 2]; case 4: return [2 /*return*/, finalIteration && finalIteration.value]; case 5: stop(); return [4 /*yield*/, Promise.race(iters.map(function (iter) { return iter.return && iter.return(); }))]; case 6: _a.sent(); return [7 /*endfinally*/]; case 7: return [2 /*return*/]; } }); }); }); } function merge(contenders) { var _this = this; var iters = getIterators(contenders, { yieldValues: true }); return new Repeater(function (push, stop) { return __awaiter(_this, void 0, void 0, function () { var advances, stopped, finalIteration; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!iters.length) { stop(); return [2 /*return*/]; } advances = []; stopped = false; stop.then(function () { var e_5, _a; stopped = true; try { for (var advances_1 = __values(advances), advances_1_1 = advances_1.next(); !advances_1_1.done; advances_1_1 = advances_1.next()) { var advance = advances_1_1.value; advance(); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (advances_1_1 && !advances_1_1.done && (_a = advances_1.return)) _a.call(advances_1); } finally { if (e_5) throw e_5.error; } } }); _a.label = 1; case 1: _a.trys.push([1, , 3, 4]); return [4 /*yield*/, Promise.all(iters.map(function (iter, i) { return __awaiter(_this, void 0, void 0, function () { var iteration, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: _b.trys.push([0, , 6, 9]); _b.label = 1; case 1: if (!!stopped) return [3 /*break*/, 5]; Promise.resolve(iter.next()).then(function (iteration) { return advances[i](iteration); }, function (err) { return stop(err); }); return [4 /*yield*/, new Promise(function (resolve) { advances[i] = resolve; })]; case 2: iteration = _b.sent(); if (!(iteration !== undefined)) return [3 /*break*/, 4]; if (iteration.done) { finalIteration = iteration; return [2 /*return*/]; } return [4 /*yield*/, push(iteration.value)]; case 3: _b.sent(); _b.label = 4; case 4: return [3 /*break*/, 1]; case 5: return [3 /*break*/, 9]; case 6: _a = iter.return; if (!_a) return [3 /*break*/, 8]; return [4 /*yield*/, iter.return()]; case 7: _a = (_b.sent()); _b.label = 8; case 8: return [7 /*endfinally*/]; case 9: return [2 /*return*/]; } }); }); }))]; case 2: _a.sent(); return [2 /*return*/, finalIteration && finalIteration.value]; case 3: stop(); return [7 /*endfinally*/]; case 4: return [2 /*return*/]; } }); }); }); } function zip(contenders) { var _this = this; var iters = getIterators(contenders, { returnValues: true }); return new Repeater(function (push, stop) { return __awaiter(_this, void 0, void 0, function () { var advance, stopped, iterations, values; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!iters.length) { stop(); return [2 /*return*/, []]; } stopped = false; stop.then(function () { advance(); stopped = true; }); _a.label = 1; case 1: _a.trys.push([1, , 6, 8]); _a.label = 2; case 2: if (!!stopped) return [3 /*break*/, 5]; Promise.all(iters.map(function (iter) { return iter.next(); })).then(function (iterations) { return advance(iterations); }, function (err) { return stop(err); }); return [4 /*yield*/, new Promise(function (resolve) { return (advance = resolve); })]; case 3: iterations = _a.sent(); if (iterations === undefined) { return [2 /*return*/]; } values = iterations.map(function (iteration) { return iteration.value; }); if (iterations.some(function (iteration) { return iteration.done; })) { return [2 /*return*/, values]; } return [4 /*yield*/, push(values)]; case 4: _a.sent(); return [3 /*break*/, 2]; case 5: return [3 /*break*/, 8]; case 6: stop(); return [4 /*yield*/, Promise.all(iters.map(function (iter) { return iter.return && iter.return(); }))]; case 7: _a.sent(); return [7 /*endfinally*/]; case 8: return [2 /*return*/]; } }); }); }); } function latest(contenders) { var _this = this; var iters = getIterators(contenders, { yieldValues: true, returnValues: true, }); return new Repeater(function (push, stop) { return __awaiter(_this, void 0, void 0, function () { var advance, advances, stopped, iterations_1, values_2; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!iters.length) { stop(); return [2 /*return*/, []]; } advances = []; stopped = false; stop.then(function () { var e_6, _a; advance(); try { for (var advances_2 = __values(advances), advances_2_1 = advances_2.next(); !advances_2_1.done; advances_2_1 = advances_2.next()) { var advance1 = advances_2_1.value; advance1(); } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (advances_2_1 && !advances_2_1.done && (_a = advances_2.return)) _a.call(advances_2); } finally { if (e_6) throw e_6.error; } } stopped = true; }); _a.label = 1; case 1: _a.trys.push([1, , 5, 7]); Promise.all(iters.map(function (iter) { return iter.next(); })).then(function (iterations) { return advance(iterations); }, function (err) { return stop(err); }); return [4 /*yield*/, new Promise(function (resolve) { return (advance = resolve); })]; case 2: iterations_1 = _a.sent(); if (iterations_1 === undefined) { return [2 /*return*/]; } values_2 = iterations_1.map(function (iteration) { return iteration.value; }); if (iterations_1.every(function (iteration) { return iteration.done; })) { return [2 /*return*/, values_2]; } // We continuously yield and mutate the same values array so we shallow copy it each time it is pushed. return [4 /*yield*/, push(values_2.slice())]; case 3: // We continuously yield and mutate the same values array so we shallow copy it each time it is pushed. _a.sent(); return [4 /*yield*/, Promise.all(iters.map(function (iter, i) { return __awaiter(_this, void 0, void 0, function () { var iteration; return __generator(this, function (_a) { switch (_a.label) { case 0: if (iterations_1[i].done) { return [2 /*return*/, iterations_1[i].value]; } _a.label = 1; case 1: if (!!stopped) return [3 /*break*/, 4]; Promise.resolve(iter.next()).then(function (iteration) { return advances[i](iteration); }, function (err) { return stop(err); }); return [4 /*yield*/, new Promise(function (resolve) { return (advances[i] = resolve); })]; case 2: iteration = _a.sent(); if (iteration === undefined) { return [2 /*return*/, iterations_1[i].value]; } else if (iteration.done) { return [2 /*return*/, iteration.value]; } values_2[i] = iteration.value; return [4 /*yield*/, push(values_2.slice())]; case 3: _a.sent(); return [3 /*break*/, 1]; case 4: return [2 /*return*/]; } }); }); }))]; case 4: return [2 /*return*/, _a.sent()]; case 5: stop(); return [4 /*yield*/, Promise.all(iters.map(function (iter) { return iter.return && iter.return(); }))]; case 6: _a.sent(); return [7 /*endfinally*/]; case 7: return [2 /*return*/]; } }); }); }); } const FETCH_EVENT = "$FETCH"; function getRouteMatches$1(routes, path, method) { const segments = path.split("/").filter(Boolean); routeLoop: for (const route of routes) { const matchSegments = route.matchSegments; if (segments.length < matchSegments.length || !route.wildcard && segments.length > matchSegments.length) { continue; } for (let index = 0; index < matchSegments.length; index++) { const match = matchSegments[index]; if (!match) { continue; } if (segments[index] !== match) { continue routeLoop; } } const handler = route[method]; if (handler === "skip" || handler === void 0) { return; } const params = {}; for (const { type, name, index } of route.params) { if (type === ":") { params[name] = segments[index]; } else { params[name] = segments.slice(index).join("/"); } } return { handler, params }; } } let apiRoutes$1; const registerApiRoutes = (routes) => { apiRoutes$1 = routes; }; async function internalFetch(route, init) { if (route.startsWith("http")) { return await fetch(route, init); } let url = new URL(route, "http://internal"); const request = new Request(url.href, init); const handler = getRouteMatches$1(apiRoutes$1, url.pathname, request.method.toLowerCase()); let apiEvent = Object.freeze({ request, params: handler.params, env: {}, $type: FETCH_EVENT, fetch: internalFetch }); const response = await handler.handler(apiEvent); return response; } const XSolidStartLocationHeader = "x-solidstart-location"; const LocationHeader = "Location"; const ContentTypeHeader = "content-type"; const XSolidStartResponseTypeHeader = "x-solidstart-response-type"; const XSolidStartContentTypeHeader = "x-solidstart-content-type"; const XSolidStartOrigin = "x-solidstart-origin"; const JSONResponseType = "application/json"; function redirect(url, init = 302) { let responseInit = init; if (typeof responseInit === "number") { responseInit = { status: responseInit }; } else if (typeof responseInit.status === "undefined") { responseInit.status = 302; } if (url === "") { url = "/"; } let headers = new Headers(responseInit.headers); headers.set(LocationHeader, url); const response = new Response(null, { ...responseInit, headers }); return response; } const redirectStatusCodes = /* @__PURE__ */ new Set([204, 301, 302, 303, 307, 308]); function isRedirectResponse(response) { return response && response instanceof Response && redirectStatusCodes.has(response.status); } class ResponseError extends Error { status; headers; name = "ResponseError"; ok; statusText; redirected; url; constructor(response) { let message = JSON.stringify({ $type: "response", status: response.status, message: response.statusText, headers: [...response.headers.entries()] }); super(message); this.status = response.status; this.headers = new Map([...response.headers.entries()]); this.url = response.url; this.ok = response.ok; this.statusText = response.statusText; this.redirected = response.redirected; this.bodyUsed = false; this.type = response.type; this.response = () => response; } response; type; clone() { return this.response(); } get body() { return this.response().body; } bodyUsed; async arrayBuffer() { return await this.response().arrayBuffer(); } async blob() { return await this.response().blob(); } async formData() { return await this.response().formData(); } async text() { return await this.response().text(); } async json() { return await this.response().json(); } } function renderAsync(fn, options) { return () => async (event) => { let pageEvent = createPageEvent(event); let markup = await renderToStringAsync(() => fn(pageEvent), options); if (pageEvent.routerContext.url) { return redirect(pageEvent.routerContext.url, { headers: pageEvent.responseHeaders }); } markup = handleIslandsRouting(pageEvent, markup); return new Response(markup, { status: pageEvent.getStatusCode(), headers: pageEvent.responseHeaders }); }; } function createPageEvent(event) { let responseHeaders = new Headers({ "Content-Type": "text/html" }); const prevPath = event.request.headers.get("x-solid-referrer"); let statusCode = 200; function setStatusCode(code) { statusCode = code; } function getStatusCode() { return statusCode; } const pageEvent = Object.freeze({ request: event.request, prevUrl: prevPath, routerContext: {}, tags: [], env: event.env, $type: FETCH_EVENT, responseHeaders, setStatusCode, getStatusCode, fetch: internalFetch }); return pageEvent; } function handleIslandsRouting(pageEvent, markup) { return markup; } const MetaContext = createContext(); const cascadingTags = ["title", "meta"]; const getTagType = tag => tag.tag + (tag.name ? `.${tag.name}"` : ""); const MetaProvider = props => { const cascadedTagInstances = new Map(); // TODO: use one element for all tags of the same type, just swap out const actions = { addClientTag: tag => { let tagType = getTagType(tag); if (cascadingTags.indexOf(tag.tag) !== -1) { // only cascading tags need to be kept as singletons if (!cascadedTagInstances.has(tagType)) { cascadedTagInstances.set(tagType, []); } let instances = cascadedTagInstances.get(tagType); let index = instances.length; instances = [...instances, tag]; // track indices synchronously cascadedTagInstances.set(tagType, instances); return index; } return -1; }, removeClientTag: (tag, index) => { const tagName = getTagType(tag); if (tag.ref) { const t = cascadedTagInstances.get(tagName); if (t) { if (tag.ref.parentNode) { tag.ref.parentNode.removeChild(tag.ref); for (let i = index - 1; i >= 0; i--) { if (t[i] != null) { document.head.appendChild(t[i].ref); } } } t[index] = null; cascadedTagInstances.set(tagName, t); } else { if (tag.ref.parentNode) { tag.ref.parentNode.removeChild(tag.ref); } } } } }; { actions.addServerTag = tagDesc => { const { tags = [] } = props; // tweak only cascading tags if (cascadingTags.indexOf(tagDesc.tag) !== -1) { const index = tags.findIndex(prev => { const prevName = prev.props.name || prev.props.property; const nextName = tagDesc.props.name || tagDesc.props.property; return prev.tag === tagDesc.tag && prevName === nextName; }); if (index !== -1) { tags.splice(index, 1); } } tags.push(tagDesc); }; if (Array.isArray(props.tags) === false) { throw Error("tags array should be passed to in node"); } } return createComponent(MetaContext.Provider, { value: actions, get children() { return props.children; } }); }; const MetaTag = (tag, props) => { const id = createUniqueId(); const c = useContext(MetaContext); if (!c) throw new Error(" should be in the tree"); useHead({ tag, props, id, get name() { return props.name || props.property; } }); return null; }; function useHead(tagDesc) { const { addClientTag, removeClientTag, addServerTag } = useContext(MetaContext); createRenderEffect(() => { if (!isServer) ; }); { addServerTag(tagDesc); return null; } } function renderTags(tags) { return tags.map(tag => { const keys = Object.keys(tag.props); const props = keys.map(k => k === "children" ? "" : ` ${k}="${tag.props[k]}"`).join(""); return tag.props.children ? `<${tag.tag} data-sm="${tag.id}"${props}>${// Tags might contain multiple text children: // example - {myCompany} Array.isArray(tag.props.children) ? tag.props.children.join("") : tag.props.children}` : `<${tag.tag} data-sm="${tag.id}"${props}/>`; }).join(""); } const Title = props => MetaTag("title", props); const Meta$1 = props => MetaTag("meta", props); function normalizeIntegration(integration) { if (!integration) { return { signal: createSignal({ value: "" }) }; } else if (Array.isArray(integration)) { return { signal: integration }; } return integration; } function staticIntegration(obj) { return { signal: [() => obj, next => Object.assign(obj, next)] }; } const hasSchemeRegex = /^(?:[a-z0-9]+:)?\/\//i; const trimPathRegex = /^\/+|\/+$/g; function normalize(path, omitSlash = false) { const s = path.replace(trimPathRegex, ""); return s ? (omitSlash || /^[?#]/.test(s) ? s : "/" + s) : ""; } function resolvePath(base, path, from) { if (hasSchemeRegex.test(path)) { return undefined; } const basePath = normalize(base); const fromPath = from && normalize(from); let result = ""; if (!fromPath || path.startsWith("/")) { result = basePath; } else if (fromPath.toLowerCase().indexOf(basePath.toLowerCase()) !== 0) { result = basePath + fromPath; } else { result = fromPath; } return (result || "/") + normalize(path, !result); } function invariant(value, message) { if (value == null) { throw new Error(message); } return value; } function joinPaths(from, to) { return normalize(from).replace(/\/*(\*.*)?$/g, "") + normalize(to); } function extractSearchParams(url) { const params = {}; url.searchParams.forEach((value, key) => { params[key] = value; }); return params; } function urlDecode(str, isQuery) { return decodeURIComponent(isQuery ? str.replace(/\+/g, " ") : str); } function createMatcher(path, partial) { const [pattern, splat] = path.split("/*", 2); const segments = pattern.split("/").filter(Boolean); const len = segments.length; return (location) => { const locSegments = location.split("/").filter(Boolean); const lenDiff = locSegments.length - len; if (lenDiff < 0 || (lenDiff > 0 && splat === undefined && !partial)) { return null; } const match = { path: len ? "" : "/", params: {} }; for (let i = 0; i < len; i++) { const segment = segments[i]; const locSegment = locSegments[i]; if (segment[0] === ":") { match.params[segment.slice(1)] = locSegment; } else if (segment.localeCompare(locSegment, undefined, { sensitivity: "base" }) !== 0) { return null; } match.path += `/${locSegment}`; } if (splat) { match.params[splat] = lenDiff ? locSegments.slice(-lenDiff).join("/") : ""; } return match; }; } function scoreRoute(route) { const [pattern, splat] = route.pattern.split("/*", 2); const segments = pattern.split("/").filter(Boolean); return segments.reduce((score, segment) => score + (segment.startsWith(":") ? 2 : 3), segments.length - (splat === undefined ? 0 : 1)); } function createMemoObject(fn) { const map = new Map(); const owner = getOwner(); return new Proxy({}, { get(_, property) { if (!map.has(property)) { runWithOwner(owner, () => map.set(property, createMemo(() => fn()[property]))); } return map.get(property)(); }, getOwnPropertyDescriptor() { return { enumerable: true, configurable: true }; }, ownKeys() { return Reflect.ownKeys(fn()); } }); } function expandOptionals(pattern) { let match = /(\/?\:[^\/]+)\?/.exec(pattern); if (!match) return [pattern]; let prefix = pattern.slice(0, match.index); let suffix = pattern.slice(match.index + match[0].length); const prefixes = [prefix, (prefix += match[1])]; // This section handles adjacent optional params. We don't actually want all permuations since // that will lead to equivalent routes which have the same number of params. For example // `/:a?/:b?/:c`? only has the unique expansion: `/`, `/:a`, `/:a/:b`, `/:a/:b/:c` and we can // discard `/:b`, `/:c`, `/:b/:c` by building them up in order and not recursing. This also helps // ensure predictability where earlier params have precidence. while ((match = /^(\/\:[^\/]+)\?/.exec(suffix))) { prefixes.push((prefix += match[1])); suffix = suffix.slice(match[0].length); } return expandOptionals(suffix).reduce((results, expansion) => [...results, ...prefixes.map(p => p + expansion)], []); } const MAX_REDIRECTS = 100; const RouterContextObj = createContext(); const RouteContextObj = createContext(); const useRouter = () => invariant(useContext(RouterContextObj), "Make sure your app is wrapped in a "); let TempRoute; const useRoute = () => TempRoute || useContext(RouteContextObj) || useRouter().base; function createRoutes(routeDef, base = "", fallback) { const { component, data, children } = routeDef; const isLeaf = !children || (Array.isArray(children) && !children.length); const shared = { key: routeDef, element: component ? () => createComponent(component, {}) : () => { const { element } = routeDef; return element === undefined && fallback ? createComponent(fallback, {}) : element; }, preload: routeDef.component ? component.preload : routeDef.preload, data }; return asArray(routeDef.path).reduce((acc, path) => { for (const originalPath of expandOptionals(path)) { const path = joinPaths(base, originalPath); const pattern = isLeaf ? path : path.split("/*", 1)[0]; acc.push({ ...shared, originalPath, pattern, matcher: createMatcher(pattern, !isLeaf) }); } return acc; }, []); } function createBranch(routes, index = 0) { return { routes, score: scoreRoute(routes[routes.length - 1]) * 10000 - index, matcher(location) { const matches = []; for (let i = routes.length - 1; i >= 0; i--) { const route = routes[i]; const match = route.matcher(location); if (!match) { return null; } matches.unshift({ ...match, route }); } return matches; } }; } function asArray(value) { return Array.isArray(value) ? value : [value]; } function createBranches(routeDef, base = "", fallback, stack = [], branches = []) { const routeDefs = asArray(routeDef); for (let i = 0, len = routeDefs.length; i < len; i++) { const def = routeDefs[i]; if (def && typeof def === "object" && def.hasOwnProperty("path")) { const routes = createRoutes(def, base, fallback); for (const route of routes) { stack.push(route); if (def.children) { createBranches(def.children, route.pattern, fallback, stack, branches); } else { const branch = createBranch([...stack], branches.length); branches.push(branch); } stack.pop(); } } } // Stack will be empty on final return return stack.length ? branches : branches.sort((a, b) => b.score - a.score); } function getRouteMatches(branches, location) { for (let i = 0, len = branches.length; i < len; i++) { const match = branches[i].matcher(location); if (match) { return match; } } return []; } function createLocation(path, state) { const origin = new URL("http://sar"); const url = createMemo(prev => { const path_ = path(); try { return new URL(path_, origin); } catch (err) { console.error(`Invalid path ${path_}`); return prev; } }, origin); const pathname = createMemo(() => urlDecode(url().pathname)); const search = createMemo(() => urlDecode(url().search, true)); const hash = createMemo(() => urlDecode(url().hash)); const key = createMemo(() => ""); return { get pathname() { return pathname(); }, get search() { return search(); }, get hash() { return hash(); }, get state() { return state(); }, get key() { return key(); }, query: createMemoObject(on(search, () => extractSearchParams(url()))) }; } function createRouterContext(integration, base = "", data, out) { const { signal: [source, setSource], utils = {} } = normalizeIntegration(integration); const parsePath = utils.parsePath || (p => p); const renderPath = utils.renderPath || (p => p); const basePath = resolvePath("", base); const output = out ? Object.assign(out, { matches: [], url: undefined }) : undefined; if (basePath === undefined) { throw new Error(`${basePath} is not a valid base path`); } else if (basePath && !source().value) { setSource({ value: basePath, replace: true, scroll: false }); } const [isRouting, start] = useTransition(); const [reference, setReference] = createSignal(source().value); const [state, setState] = createSignal(source().state); const location = createLocation(reference, state); const referrers = []; const baseRoute = { pattern: basePath, params: {}, path: () => basePath, outlet: () => null, resolvePath(to) { return resolvePath(basePath, to); } }; if (data) { try { TempRoute = baseRoute; baseRoute.data = data({ data: undefined, params: {}, location, navigate: navigatorFactory(baseRoute) }); } finally { TempRoute = undefined; } } function navigateFromRoute(route, to, options) { // Untrack in case someone navigates in an effect - don't want to track `reference` or route paths untrack(() => { if (typeof to === "number") { if (!to) ; else if (utils.go) { utils.go(to); } else { console.warn("Router integration does not support relative routing"); } return; } const { replace, resolve, scroll, state: nextState } = { replace: false, resolve: true, scroll: true, ...options }; const resolvedTo = resolve ? route.resolvePath(to) : resolvePath("", to); if (resolvedTo === undefined) { throw new Error(`Path '${to}' is not a routable path`); } else if (referrers.length >= MAX_REDIRECTS) { throw new Error("Too many redirects"); } const current = reference(); if (resolvedTo !== current || nextState !== state()) { { if (output) { output.url = resolvedTo; } setSource({ value: resolvedTo, replace, scroll, state: nextState }); } } }); } function navigatorFactory(route) { // Workaround for vite issue (https://github.com/vitejs/vite/issues/3803) route = route || useContext(RouteContextObj) || baseRoute; return (to, options) => navigateFromRoute(route, to, options); } createRenderEffect(() => { const { value, state } = source(); // Untrack this whole block so `start` doesn't cause Solid's Listener to be preserved untrack(() => { if (value !== reference()) { start(() => { setReference(value); setState(state); }); } }); }); return { base: baseRoute, out: output, location, isRouting, renderPath, parsePath, navigatorFactory }; } function createRouteContext(router, parent, child, match) { const { base, location, navigatorFactory } = router; const { pattern, element: outlet, preload, data } = match().route; const path = createMemo(() => match().path); const params = createMemoObject(() => match().params); preload && preload(); const route = { parent, pattern, get child() { return child(); }, path, params, data: parent.data, outlet, resolvePath(to) { return resolvePath(base.path(), to, path()); } }; if (data) { try { TempRoute = route; route.data = data({ data: parent.data, params, location, navigate: navigatorFactory(route) }); } finally { TempRoute = undefined; } } return route; } const Router = props => { const { source, url, base, data, out } = props; const integration = source || (staticIntegration({ value: url || "" }) ); const routerState = createRouterContext(integration, base, data, out); return createComponent(RouterContextObj.Provider, { value: routerState, get children() { return props.children; } }); }; const Routes$1 = props => { const router = useRouter(); const parentRoute = useRoute(); const routeDefs = children(() => props.children); const branches = createMemo(() => createBranches(routeDefs(), joinPaths(parentRoute.pattern, props.base || ""), Outlet)); const matches = createMemo(() => getRouteMatches(branches(), router.location.pathname)); if (router.out) { router.out.matches.push(matches().map(({ route, path, params }) => ({ originalPath: route.originalPath, pattern: route.pattern, path, params }))); } const disposers = []; let root; const routeStates = createMemo(on(matches, (nextMatches, prevMatches, prev) => { let equal = prevMatches && nextMatches.length === prevMatches.length; const next = []; for (let i = 0, len = nextMatches.length; i < len; i++) { const prevMatch = prevMatches && prevMatches[i]; const nextMatch = nextMatches[i]; if (prev && prevMatch && nextMatch.route.key === prevMatch.route.key) { next[i] = prev[i]; } else { equal = false; if (disposers[i]) { disposers[i](); } createRoot(dispose => { disposers[i] = dispose; next[i] = createRouteContext(router, next[i - 1] || parentRoute, () => routeStates()[i + 1], () => matches()[i]); }); } } disposers.splice(nextMatches.length).forEach(dispose => dispose()); if (prev && equal) { return prev; } root = next[0]; return next; })); return createComponent(Show, { get when() { return routeStates() && root; }, children: route => createComponent(RouteContextObj.Provider, { value: route, get children() { return route.outlet(); } }) }); }; const Outlet = () => { const route = useRoute(); return createComponent(Show, { get when() { return route.child; }, children: child => createComponent(RouteContextObj.Provider, { value: child, get children() { return child.outlet(); } }) }); }; class ServerError extends Error { constructor(message, { stack } = {}) { super(message); this.name = "ServerError"; if (stack) { this.stack = stack; } } } class FormError extends ServerError { constructor(message, { fieldErrors = {}, form, fields, stack } = {}) { super(message, { stack }); this.formError = message; this.name = "FormError"; this.fields = fields || Object.fromEntries(typeof form !== "undefined" ? form.entries() : []) || {}; this.fieldErrors = fieldErrors; } } const ServerContext = createContext({}); function Routes(props) { return createComponent(Routes$1, { get children() { return props.children; } }); } const _tmpl$$5 = ["

", "

", "
"]; function ErrorBoundary(props) { return createComponent(ErrorBoundary$1, { fallback: e => { return createComponent(Show, { get when() { return !props.fallback; }, get fallback() { return props.fallback(e); }, get children() { return createComponent(ErrorMessage, { error: e }); } }); }, get children() { return props.children; } }); } function ErrorMessage(props) { return ssr(_tmpl$$5, ssrHydrationKey(), "padding:" + "16px", "background-color:" + "rgba(252, 165, 165)" + (";color:" + "rgb(153, 27, 27)") + (";border-radius:" + "5px") + (";overflow:" + "scroll") + (";padding:" + "16px") + (";margin-bottom:" + "8px"), "font-weight:" + "bold", escape$1(props.error.message), "color:" + "rgba(252, 165, 165)" + (";background-color:" + "rgb(153, 27, 27)") + (";border-radius:" + "5px") + (";padding:" + "4px 8px"), "margin-top:" + "8px" + (";width:" + "100%"), escape$1(props.error.stack)); } const server$ = (fn) => { throw new Error("Should be compiled away"); }; async function parseRequest(event) { let request = event.request; let contentType = request.headers.get(ContentTypeHeader); let name = new URL(request.url).pathname, args = []; if (contentType) { if (contentType === JSONResponseType) { let text = await request.text(); try { args = JSON.parse(text, (key, value) => { if (!value) { return value; } if (value.$type === "fetch_event") { return event; } if (value.$type === "headers") { let headers = new Headers(); request.headers.forEach((value2, key2) => headers.set(key2, value2)); value.values.forEach(([key2, value2]) => headers.set(key2, value2)); return headers; } if (value.$type === "request") { return new Request(value.url, { method: value.method, headers: value.headers }); } return value; }); } catch (e) { throw new Error(`Error parsing request body: ${text}`); } } else if (contentType.includes("form")) { let formData = await request.clone().formData(); args = [formData, event]; } } return [name, args]; } function respondWith(request, data, responseType) { if (data instanceof ResponseError) { data = data.clone(); } if (data instanceof Response) { if (isRedirectResponse(data) && request.headers.get(XSolidStartOrigin) === "client") { let headers = new Headers(data.headers); headers.set(XSolidStartOrigin, "server"); headers.set(XSolidStartLocationHeader, data.headers.get(LocationHeader)); headers.set(XSolidStartResponseTypeHeader, responseType); headers.set(XSolidStartContentTypeHeader, "response"); return new Response(null, { status: 204, statusText: "Redirected", headers }); } else if (data.status === 101) { return data; } else { let headers = new Headers(data.headers); headers.set(XSolidStartOrigin, "server"); headers.set(XSolidStartResponseTypeHeader, responseType); headers.set(XSolidStartContentTypeHeader, "response"); return new Response(data.body, { status: data.status, statusText: data.statusText, headers }); } } else if (data instanceof FormError) { return new Response( JSON.stringify({ error: { message: data.message, stack: "", formError: data.formError, fields: data.fields, fieldErrors: data.fieldErrors } }), { status: 400, headers: { [XSolidStartResponseTypeHeader]: responseType, [XSolidStartContentTypeHeader]: "form-error" } } ); } else if (data instanceof ServerError) { return new Response( JSON.stringify({ error: { message: data.message, stack: "" } }), { status: 400, headers: { [XSolidStartResponseTypeHeader]: responseType, [XSolidStartContentTypeHeader]: "server-error" } } ); } else if (data instanceof Error) { console.error(data); return new Response( JSON.stringify({ error: { message: "Internal Server Error", stack: "", status: data.status } }), { status: data.status || 500, headers: { [XSolidStartResponseTypeHeader]: responseType, [XSolidStartContentTypeHeader]: "error" } } ); } else if (typeof data === "object" || typeof data === "string" || typeof data === "number" || typeof data === "boolean") { return new Response(JSON.stringify(data), { status: 200, headers: { [ContentTypeHeader]: "application/json", [XSolidStartResponseTypeHeader]: responseType, [XSolidStartContentTypeHeader]: "json" } }); } return new Response("null", { status: 200, headers: { [ContentTypeHeader]: "application/json", [XSolidStartContentTypeHeader]: "json", [XSolidStartResponseTypeHeader]: responseType } }); } async function handleServerRequest(event) { const url = new URL(event.request.url); if (server$.hasHandler(url.pathname)) { try { let [name, args] = await parseRequest(event); let handler = server$.getHandler(name); if (!handler) { throw { status: 404, message: "Handler Not Found for " + name }; } const data = await handler.call(event, ...Array.isArray(args) ? args : [args]); return respondWith(event.request, data, "return"); } catch (error) { return respondWith(event.request, error, "throw"); } } return null; } const handlers = /* @__PURE__ */ new Map(); server$.createHandler = (_fn, hash) => { let fn = function(...args) { let ctx; if (typeof this === "object") { ctx = this; } else if (sharedConfig.context && sharedConfig.context.requestContext) { ctx = sharedConfig.context.requestContext; } else { ctx = { request: new URL(hash, "http://localhost:3000").href, responseHeaders: new Headers() }; } const execute = async () => { try { let e = await _fn.call(ctx, ...args); return e; } catch (e) { if (/[A-Za-z]+ is not defined/.test(e.message)) { const error = new Error( e.message + "\n You probably are using a variable defined in a closure in your server function." ); error.stack = e.stack; throw error; } throw e; } }; return execute(); }; fn.url = hash; fn.action = function(...args) { return fn.call(this, ...args); }; return fn; }; server$.registerHandler = function(route, handler) { handlers.set(route, handler); }; server$.getHandler = function(route) { return handlers.get(route); }; server$.hasHandler = function(route) { return handlers.has(route); }; server$.fetch = internalFetch; function HttpStatusCode(props) { const context = useContext(ServerContext); { context.setStatusCode(props.code); } onCleanup(() => { { context.setStatusCode(200); } }); return null; } const _tmpl$$4 = ["", "", "

Page Not Found

Visit docs.solidjs.com/start to learn how to build SolidStart apps.

"]; function NotFound() { return ssr(_tmpl$$4, ssrHydrationKey(), escape$1(createComponent(Title, { children: "Not Found" })), escape$1(createComponent(HttpStatusCode, { code: 404 }))); } const _tmpl$$3 = ["Clicks: ", ""]; function Counter() { const [count, setCount] = createSignal(0); return ssr(_tmpl$$3, ssrHydrationKey(), escape$1(count)); } const _tmpl$$2 = ["", "

Hello world!

", "

Visit docs.solidjs.com/start to learn how to build SolidStart apps.

"]; function Home() { return ssr(_tmpl$$2, ssrHydrationKey(), escape$1(createComponent(Title, { children: "Hello World" })), escape$1(createComponent(Counter, {}))); } /// const routesConfig = { routes: [{ component: NotFound, path: "/*404" }, { component: Home, path: "/" }], routeLayouts: { "/*404": { "id": "/*404", "layouts": [] }, "/": { "id": "/", "layouts": [] } } }; /** * Routes are the file system based routes, used by Solid App Router to show the current page according to the URL. */ const FileRoutes = () => { return routesConfig.routes; }; const _tmpl$$1 = [""], _tmpl$2$1 = [""]; function getAssetsFromManifest(manifest, routerContext) { const match = routerContext.matches.reduce((memo, m) => { if (m.length) { const fullPath = m.reduce((previous, match) => previous + match.originalPath, ""); const route = routesConfig.routeLayouts[fullPath]; if (route) { memo.push(...(manifest[route.id] || [])); const layoutsManifestEntries = route.layouts.flatMap(manifestKey => manifest[manifestKey] || []); memo.push(...layoutsManifestEntries); } } return memo; }, []); match.push(...(manifest["entry-client"] || [])); const links = match.reduce((r, src) => { r[src.href] = src.type === "style" ? ssr(_tmpl$$1, ssrHydrationKey(), ssrAttribute("href", escape$1(src.href, true), false)) : src.type === "script" ? ssr(_tmpl$2$1, ssrHydrationKey(), ssrAttribute("href", escape$1(src.href, true), false)) : undefined; return r; }, {}); return Object.values(links); } /** * Links are used to load assets for the server rendered HTML * @returns {JSXElement} */ function Links() { const context = useContext(ServerContext); return createComponent(Assets, { get children() { return getAssetsFromManifest(context.env.manifest, context.routerContext); } }); } function Meta() { const context = useContext(ServerContext); // @ts-expect-error The ssr() types do not match the Assets child types return createComponent(Assets, { get children() { return ssr(renderTags(context.tags)); } }); } const _tmpl$4 = [""]; const isDev = "production" === "development"; const isIslands = false; function Scripts() { const context = useContext(ServerContext); return [createComponent(HydrationScript, {}), isIslands , createComponent(NoHydration, { get children() { return (ssr(_tmpl$4, ssrHydrationKey(), ssrAttribute("src", escape$1(context.env.manifest["entry-client"][0].href, true), false)) ); } }), isDev ]; } function Html(props) { { return ssrElement("html", props, undefined, false); } } function Head(props) { { return ssrElement("head", props, () => [props.children, createComponent(Meta, {}), createComponent(Links, {})], false); } } function Body(props) { { return ssrElement("body", props, () => props.children , false); } } const _tmpl$ = ["Index"], _tmpl$2 = ["About"]; function Root() { return createComponent(Html, { lang: "en", get children() { return [createComponent(Head, { get children() { return [createComponent(Title, { children: "SolidStart - Bare" }), createComponent(Meta$1, { charset: "utf-8" }), createComponent(Meta$1, { name: "viewport", content: "width=device-width, initial-scale=1" })]; } }), createComponent(Body, { get children() { return [createComponent(Suspense, { get children() { return createComponent(ErrorBoundary, { get children() { return [ssr(_tmpl$, ssrHydrationKey()), ssr(_tmpl$2, ssrHydrationKey()), createComponent(Routes, { get children() { return createComponent(FileRoutes, {}); } })]; } }); } }), createComponent(Scripts, {})]; } })]; } }); } const server$1 = createServer({ schema: { typeDefs: ` type Query { hello: String } `, resolvers: { Query: { hello: () => "Hello from Yoga!" } } } }); const handler = ({ request }) => { return server$1.handleRequest(request); }; const get = handler; const post = handler; const api = [ { get: "skip", path: "/*404" }, { get: get, post: post, path: "/graphql" }, { get: "skip", path: "/" } ]; function routeToMatchRoute(route) { const segments = route.path.split("/").filter(Boolean); const params = []; const matchSegments = []; let score = route.path.endsWith("/") ? 4 : 0; let wildcard = false; for (const [index, segment] of segments.entries()) { if (segment[0] === ":") { const name = segment.slice(1); score += 3; params.push({ type: ":", name, index }); matchSegments.push(null); } else if (segment[0] === "*") { params.push({ type: "*", name: segment.slice(1), index }); wildcard = true; } else { score += 4; matchSegments.push(segment); } } return { ...route, score, params, matchSegments, wildcard }; } const allRoutes = api.map(routeToMatchRoute).sort((a, b) => b.score - a.score); registerApiRoutes(allRoutes); function getApiHandler(url, method) { return getRouteMatches$1(allRoutes, url.pathname, method.toLowerCase()); } const apiRoutes = ({ forward }) => { return async (event) => { let apiHandler = getApiHandler(new URL(event.request.url), event.request.method); if (apiHandler) { let apiEvent = Object.freeze({ request: event.request, params: apiHandler.params, env: event.env, $type: FETCH_EVENT, fetch: internalFetch }); try { return await apiHandler.handler(apiEvent); } catch (error) { if (error instanceof Response) { return error; } return new Response(JSON.stringify(error), { status: 500 }); } } return await forward(event); }; }; const inlineServerFunctions = ({ forward }) => { return async (event) => { const url = new URL(event.request.url); if (server$.hasHandler(url.pathname)) { let contentType = event.request.headers.get(ContentTypeHeader); let origin = event.request.headers.get(XSolidStartOrigin); let formRequestBody; if (contentType != null && contentType.includes("form") && !(origin != null && origin.includes("client"))) { let [read1, read2] = event.request.body.tee(); formRequestBody = new Request(event.request.url, { body: read2, headers: event.request.headers, method: event.request.method }); event.request = new Request(event.request.url, { body: read1, headers: event.request.headers, method: event.request.method }); } let serverFunctionEvent = Object.freeze({ request: event.request, fetch: internalFetch, $type: FETCH_EVENT, env: event.env }); const serverResponse = await handleServerRequest(serverFunctionEvent); let responseContentType = serverResponse.headers.get(XSolidStartContentTypeHeader); if (formRequestBody && responseContentType !== null && responseContentType.includes("error")) { const formData = await formRequestBody.formData(); let entries = [...formData.entries()]; return new Response(null, { status: 302, headers: { Location: new URL(event.request.headers.get("referer")).pathname + "?form=" + encodeURIComponent( JSON.stringify({ url: url.pathname, entries, ...await serverResponse.json() }) ) } }); } return serverResponse; } const response = await forward(event); return response; }; }; const rootData = Object.values(/* #__PURE__ */ Object.assign({}))[0]; const dataFn = rootData ? rootData.default : undefined; /** Function responsible for listening for streamed [operations]{@link Operation}. */ /** This composes an array of Exchanges into a single ExchangeIO function */ const composeMiddleware = exchanges => ({ forward }) => exchanges.reduceRight((forward, exchange) => exchange({ forward }), forward); function createHandler(...exchanges) { const exchange = composeMiddleware([apiRoutes, inlineServerFunctions, ...exchanges]); return async event => { return await exchange({ forward: async op => { return new Response(null, { status: 404 }); } })(event); }; } function StartRouter(props) { return createComponent(Router, props); } const docType = ssr(""); function StartServer({ event }) { const parsed = new URL(event.request.url); const path = parsed.pathname + parsed.search; sharedConfig.context.requestContext = event; return createComponent(ServerContext.Provider, { value: event, get children() { return createComponent(MetaProvider, { get tags() { return event.tags; }, get children() { return createComponent(StartRouter, { url: path, get out() { return event.routerContext; }, location: path, get prevLocation() { return event.prevUrl; }, data: dataFn, get routes() { return routesConfig.routes; }, get children() { return [docType, createComponent(Root, {})]; } }); } }); } }); } const entryServer = createHandler(renderAsync(event => createComponent(StartServer, { event: event }))); const assetManifest = JSON.parse(manifestJSON); var server = { async fetch(request, env, ctx) { if (request.headers.get("Upgrade") === "websocket") { const url = new URL(request.url); const durableObjectId = env.DO_WEBSOCKET.idFromName(url.pathname + url.search); const durableObjectStub = env.DO_WEBSOCKET.get(durableObjectId); const response = await durableObjectStub.fetch(request); return response; } env.manifest = manifest; env.getStaticAsset = async request => { return await dist.getAssetFromKV( { request, waitUntil(promise) { return ctx.waitUntil(promise); } }, { ASSET_NAMESPACE: env.__STATIC_CONTENT, ASSET_MANIFEST: assetManifest } ); }; env.getStaticHTML = async path => { return await env.getStaticAsset(new Request(new URL(path + ".html", request.url.toString()))); }; try { return await env.getStaticAsset(request); } catch (e) { if (!(e instanceof dist.NotFoundError || e instanceof dist.MethodNotAllowedError)) { return new Response("An unexpected error occurred", { status: 500 }); } } return entryServer({ request: request, env }); } }; export { server as default };