ascii-side-of-the-moon 1.0.8 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/astronomy.ts","../src/render/ascii.json","../src/render/renderer.ts"],"names":["Astronomy","AstronomyNS","addDays","d","days","normalizeDegrees","angle","normalizeHourAngle","hours","h","isWaxingAt","date","today","calculateParallacticAngle","location","eq","siderealTimeHours","longitudeHours","hourAngleRad","latitudeRad","declinationRad","numerator","denominator","computeMoonPosition","observer","horizon","getMoonState","observerLocation","illum","lib","getMoonPhase","moonState","phaseAngleDeg","illuminatedFraction","waxing","a0","a","FULL_EPS","NEW_EPS","QUARTER_EPS","NEAR_FULL_FRAC","NEAR_NEW_FRAC","NEAR_HALF_FRAC","ascii_default","FRAME_W","FRAME_H","BASE_ANGLE_OFFSET","asciiMoonDim","asciiArt","lines","minX","maxX","minY","maxY","line","y","firstNonSpace","lastNonSpace","width","height","clamp","v","lo","hi","rad","phaseSunVector","isWaxing","elatDeg","elat","sx","sy","sz","sy1","sz1","mag","litIntensity","xn","yn","dx","dy","offsets","total","samples","ox","oy","x","rsq","nz","dot","findNearestMoonState","state","bestIndex","bestDistance","moon","distDiff","elatDiff","elonDiff","totalDiff","CHAR_ASPECT","rotateCharacters","ascii","angleDeg","centerX","centerY","cx","cy","rads","cosA","sinA","output","outY","outX","srcDx","srcDy","srcX","srcY","char","row","renderMoon","_options","showHorizon","nearestMoon","asciiLines","dim","intens","rawInc","inDisc","discCells","litCells","iy","ix","moonX","moonY","r2","I","litMask","frac","target","candidates","b","k","out","src","composed","finalArt","rotationCenter","overlayHorizon","art","moonDim","pos","altitude","radiusDeg","topAlt","degreesPerChar","horizonRow","label","makeHorizonLine","content","remaining","left","right"],"mappings":"mCAKA,IAAMA,EAA8D,CAAA,CAAA,OAAA,EAAWC,CAAAA,CAE/E,SAASC,CAAAA,CAAQC,CAAAA,CAASC,CAAAA,CAAc,CACtC,IAAM,CAAA,CAAI,IAAI,KAAKD,CAAAA,CAAE,OAAA,EAAS,CAAA,CAC9B,OAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,SAAQ,CAAIC,CAAI,EACrB,CACT,CAEO,SAASC,CAAAA,CAAiBC,CAAAA,CAAe,CAC9C,OAAA,CAAQA,CAAAA,CAAQ,IAAM,GAAA,EAAO,GAC/B,CAEO,SAASC,CAAAA,CAAmBC,EAAe,CAChD,IAAIC,CAAAA,CAAAA,CAAKD,CAAAA,CAAQ,GAAK,EAAA,EAAM,EAAA,CAC5B,OAAIC,CAAAA,CAAI,EAAA,GAAIA,GAAK,EAAA,CAAA,CACVA,CACT,CAEA,SAASC,CAAAA,CAAWC,EAAqB,CACvC,IAAMC,EAASZ,CAAAA,CAAU,YAAA,CAAaA,EAAU,IAAA,CAAK,IAAA,CAAMW,CAAI,CAAA,CAAiC,eAEhG,OADkBX,CAAAA,CAAU,aAAaA,CAAAA,CAAU,IAAA,CAAK,KAAME,CAAAA,CAAQS,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAiC,eAC7FC,CACpB,CAEO,SAASC,CAAAA,CAA0BF,CAAAA,CAAYG,EAA4BC,CAAAA,CAA2B,CAC3G,IAAMC,CAAAA,CAAoBhB,EAAU,YAAA,CAAaW,CAAI,EAC/CM,CAAAA,CAAiBH,CAAAA,CAAS,UAAY,EAAA,CAEtCI,CAAAA,CADiBX,EAAmBU,CAAAA,CAAiBD,CAAAA,CAAoBD,EAAG,EAAE,CAAA,CAC9C,GAAKf,CAAAA,CAAU,OAAA,CAC/CmB,EAAcL,CAAAA,CAAS,QAAA,CAAWd,CAAAA,CAAU,OAAA,CAC5CoB,EAAiBL,CAAAA,CAAG,GAAA,CAAMf,EAAU,OAAA,CACpCqB,CAAAA,CAAY,KAAK,GAAA,CAAIH,CAAY,EACjCI,CAAAA,CAAc,IAAA,CAAK,IAAIH,CAAW,CAAA,CAAI,KAAK,GAAA,CAAIC,CAAc,EAAI,IAAA,CAAK,GAAA,CAAIA,CAAc,CAAA,CAAI,KAAK,GAAA,CAAIF,CAAY,EACvH,OAAO,IAAA,CAAK,MAAMG,CAAAA,CAAWC,CAAW,EAAItB,CAAAA,CAAU,OACxD,CAEA,SAASuB,CAAAA,CAAoBZ,EAAYG,CAAAA,CAA0C,CACjF,IAAMU,CAAAA,CAAW,IAAIxB,CAAAA,CAAU,QAAA,CAASc,EAAS,QAAA,CAAUA,CAAAA,CAAS,UAAWA,CAAAA,CAAS,eAAA,EAAmB,CAAC,CAAA,CACtGC,CAAAA,CAAKf,EAAU,OAAA,CAAQA,CAAAA,CAAU,KAAK,IAAA,CAAMW,CAAAA,CAAMa,EAAU,IAAA,CAAM,IAAI,EACtEC,CAAAA,CAAUzB,CAAAA,CAAU,OAAA,CAAQW,CAAAA,CAAMa,EAAUT,CAAAA,CAAG,EAAA,CAAIA,EAAG,GAAA,CAAK,QAAQ,EACzE,OAAO,CACL,QAASV,CAAAA,CAAiBoB,CAAAA,CAAQ,OAAO,CAAA,CACzC,QAAA,CAAUA,EAAQ,QAAA,CAClB,gBAAA,CAAkBZ,EAA0BF,CAAAA,CAAMG,CAAAA,CAAUC,CAAE,CAChE,CACF,CAEO,SAASW,EAAaf,CAAAA,CAAYgB,CAAAA,CAAgD,CACvF,IAAMC,CAAAA,CAAQ5B,EAAU,YAAA,CAAaA,CAAAA,CAAU,KAAK,IAAA,CAAMW,CAAI,EACxDkB,CAAAA,CAAM7B,CAAAA,CAAU,UAAUW,CAAI,CAAA,CACpC,OAAO,CACL,KAAAA,CAAAA,CACA,KAAA,CAAO,CACL,aAAA,CAAeiB,CAAAA,CAAM,YACrB,mBAAA,CAAqBA,CAAAA,CAAM,eAC3B,QAAA,CAAUlB,CAAAA,CAAWC,CAAI,CAC3B,CAAA,CACA,KAAM,CACJ,UAAA,CAAYkB,EAAI,OAAA,CAChB,kBAAA,CAAoBA,CAAAA,CAAI,QAC1B,EACA,SAAA,CAAW,CACT,KAAMA,CAAAA,CAAI,IAAA,CACV,KAAMA,CAAAA,CAAI,IACZ,EACA,QAAA,CAAUF,CAAAA,CAAmBJ,EAAoBZ,CAAAA,CAAMgB,CAAgB,EAAI,MAC7E,CACF,CAYO,SAASG,CAAAA,CAAaC,CAAAA,CAA8B,CACzD,GAAM,CAAE,aAAA,CAAAC,EAAe,mBAAA,CAAAC,CAAoB,EAAIF,CAAAA,CAAU,KAAA,CAEnDG,EAASH,CAAAA,CAAU,KAAA,CAAM,UAAaC,CAAAA,CAAgB,EAAA,CAGtDG,GAAOH,CAAAA,CAAgB,GAAA,CAAO,KAAO,GAAA,CACrCI,CAAAA,CAAID,CAAAA,CAAK,GAAA,CAAM,IAAMA,CAAAA,CAAKA,CAAAA,CAG1BE,EAAW,EAAA,CACXC,CAAAA,CAAU,GACVC,CAAAA,CAAc,CAAA,CAGdC,EAAiB,GAAA,CACjBC,CAAAA,CAAiB,IACjBC,CAAAA,CAAiB,GAAA,CAGvB,OAAIN,CAAAA,EAAKC,CAAAA,EAAYJ,GAAuBO,CAAAA,CAAuB,WAAA,CAC/DJ,CAAAA,EAAK,GAAA,CAAME,GAAWL,CAAAA,EAAuBQ,CAAAA,CAAsB,WAGnE,IAAA,CAAK,GAAA,CAAIL,EAAI,EAAE,CAAA,EAAKG,GAAe,IAAA,CAAK,GAAA,CAAIN,EAAsB,EAAG,CAAA,EAAKS,EACrER,CAAAA,CAAS,eAAA,CAAkB,eAIhCE,CAAAA,CAAI,EAAA,CACCF,CAAAA,CAAS,gBAAA,CAAmB,iBAG9BA,CAAAA,CAAS,iBAAA,CAAoB,iBACtC,CCtHA,IAAAS,EAAA,CACE,KAAA,CAAS,CACP,CACE,KAAA,CAAS,EACT,WAAA,CAAe,QAAA,CACf,eAAkB,MAAA,CAClB,cAAA,CAAkB,OAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,IAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,IAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,IAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,CAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,CAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,IAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,OACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,OACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,IAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,MAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,MAAA,CAClB,cAAA,CAAkB,KAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CAAA,CACA,CACE,KAAA,CAAS,EAAA,CACT,WAAA,CAAe,SACf,cAAA,CAAkB,KAAA,CAClB,cAAA,CAAkB,IAAA,CAClB,KAAA,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CACX,CACF,CACF,CAAA,CCxNO,IAAMC,CAAAA,CAAU,GACVC,CAAAA,CAAU,EAAA,CAMVC,CAAAA,CAAoB,EAAA,CAW1B,SAASC,CAAAA,CAAaC,CAAAA,CAAuC,CAClE,IAAMC,CAAAA,CAAQD,EAAS,KAAA,CAAM;AAAA,CAAI,CAAA,CAE7BE,EAAO,CAAA,CAAA,CAAA,CACPC,CAAAA,CAAO,KACPC,CAAAA,CAAO,CAAA,CAAA,CAAA,CACPC,EAAO,EAAA,CAAA,CAAA,CAeX,GAZAJ,EAAM,OAAA,CAAQ,CAACK,EAAMC,CAAAA,GAAM,CACzB,IAAMC,CAAAA,CAAgBF,CAAAA,CAAK,OAAO,IAAI,CAAA,CACtC,GAAIE,CAAAA,GAAkB,EAAA,CAAI,CACxB,IAAMC,CAAAA,CAAeH,EAAK,MAAA,CAAO,MAAM,EACvCJ,CAAAA,CAAO,IAAA,CAAK,IAAIA,CAAAA,CAAMM,CAAa,EACnCL,CAAAA,CAAO,IAAA,CAAK,IAAIA,CAAAA,CAAMM,CAAAA,GAAiB,EAAA,CAAKH,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAIG,EAAe,CAAC,CAAA,CAC1EL,IAAS,CAAA,CAAA,CAAA,GAAUA,CAAAA,CAAOG,GAC9BF,CAAAA,CAAOE,EACT,CACF,CAAC,CAAA,CAGGL,IAAS,CAAA,CAAA,CAAA,CACX,OAAO,CACL,KAAA,CAAON,CAAAA,CACP,OAAQC,CAAAA,CACR,OAAA,CAAS,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,CAAC,EAC/B,OAAA,CAAS,IAAA,CAAK,MAAMC,CAAAA,CAAU,CAAC,CACjC,CAAA,CAGF,IAAMa,EAAQP,CAAAA,CAAOD,CAAAA,CAAO,EACtBS,CAAAA,CAASN,CAAAA,CAAOD,EAAO,CAAA,CAE7B,OAAO,CACL,KAAA,CAAOM,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,OAAA,CAAST,CAAAA,CAAO,KAAK,KAAA,CAAMQ,CAAAA,CAAQ,CAAC,CAAA,CACpC,OAAA,CAASN,EAAO,IAAA,CAAK,KAAA,CAAMO,EAAS,CAAC,CACvC,CACF,CAGO,SAASC,EAAMC,CAAAA,CAAWC,CAAAA,CAAYC,EAAY,CACvD,OAAO,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAI,IAAA,CAAK,IAAID,CAAAA,CAAID,CAAC,CAAC,CACrC,CAGA,SAASG,CAAAA,CAAI7D,CAAAA,CAAmB,CAC9B,OAAQA,CAAAA,CAAI,KAAK,EAAA,CAAM,GACzB,CASO,SAAS8D,CAAAA,CAAejC,EAAuBkC,CAAAA,CAAoBC,CAAAA,CAAkB,CAAA,CAAG,CAC7F,IAAM/B,CAAAA,CAAI4B,EAAIhC,CAAa,CAAA,CACrBoC,EAAOJ,CAAAA,CAAIG,CAAO,EAIlBE,CAAAA,CAAAA,CADOH,CAAAA,CAAW,EAAI,EAAA,EACV,IAAA,CAAK,IAAI9B,CAAC,CAAA,CACxBkC,EAAK,CAAA,CACLC,CAAAA,CAAK,KAAK,GAAA,CAAInC,CAAC,CAAA,CAIboC,CAAAA,CAAM,CAACD,CAAAA,CAAK,KAAK,GAAA,CAAIH,CAAI,EACzBK,CAAAA,CAAOF,CAAAA,CAAK,KAAK,GAAA,CAAIH,CAAI,EAC/BE,CAAAA,CAAKE,CAAAA,CACLD,EAAKE,CAAAA,CAGL,IAAMC,EAAM,IAAA,CAAK,IAAA,CAAKL,EAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAE,CAAA,CACjD,OAAO,CACL,EAAA,CAAIF,EAAKK,CAAAA,CACT,EAAA,CAAIJ,EAAKI,CAAAA,CACT,EAAA,CAAIH,EAAKG,CACX,CACF,CAiBO,SAASC,CAAAA,CAAaC,EAAYC,CAAAA,CAAYR,CAAAA,CAAYC,EAAYC,CAAAA,CAAY,CAEvF,IAAMO,CAAAA,CAAK,CAAA,CAAMlC,EACXmC,CAAAA,CAAK,CAAA,CAAMlC,EAGXmC,CAAAA,CAAU,CAAC,KAAM,KAAA,CAAO,CAAA,CAAG,IAAM,EAAG,CAAA,CAEtCC,EAAQ,CAAA,CACRC,CAAAA,CAAU,EAEd,IAAA,IAAWC,CAAAA,IAAMH,EACf,IAAA,IAAWI,CAAAA,IAAMJ,CAAAA,CAAS,CACxB,IAAMK,CAAAA,CAAIT,EAAKO,CAAAA,CAAKL,CAAAA,CACdvB,EAAIsB,CAAAA,CAAKO,CAAAA,CAAKL,EACdO,CAAAA,CAAMD,CAAAA,CAAIA,EAAI9B,CAAAA,CAAIA,CAAAA,CACxB,GAAI+B,CAAAA,CAAM,CAAA,CAAG,SAEb,IAAMC,CAAAA,CAAK,KAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,CAAA,CAAID,CAAG,CAAC,CAAA,CACnCE,CAAAA,CAAMH,EAAIhB,CAAAA,CAAKd,CAAAA,CAAIe,EAAKiB,CAAAA,CAAKhB,CAAAA,CACnCU,GAAS,IAAA,CAAK,GAAA,CAAI,EAAGO,CAAG,CAAA,CACxBN,IACF,CAGF,OAAIA,IAAY,CAAA,CAAU,CAAA,CACnBD,CAAAA,CAAQC,CACjB,CAGA,SAASO,EAAqBC,CAAAA,CAAkB,CAK9C,IAAIC,CAAAA,CAAY,CAAA,CACZC,EAAe,CAAA,CAAA,CAAA,CAEnB,IAAA,IAAS,EAAI,CAAA,CAAG,CAAA,CAAIjD,EAAS,KAAA,CAAM,MAAA,CAAQ,IAAK,CAC9C,IAAMkD,EAAOlD,CAAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CACvBmD,CAAAA,CAAW,IAAA,CAAK,IAAID,CAAAA,CAAK,WAAA,CAAcH,EAAM,IAAA,CAAK,UAAU,EAAI,CAAA,CAChEK,CAAAA,CAAW,KAAK,GAAA,CAAIF,CAAAA,CAAK,eAAiBH,CAAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAI,GAAA,CAClEM,EAAW,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAK,cAAA,CAAiBH,CAAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAI,GAAA,CAElEO,EAAYH,CAAAA,CAAWC,CAAAA,CAAWC,EACpCC,CAAAA,CAAYL,CAAAA,GACdA,EAAeK,CAAAA,CACfN,CAAAA,CAAY,GAEhB,CAEA,OAAOhD,EAAS,KAAA,CAAMgD,CAAS,CACjC,CAMA,IAAMO,CAAAA,CAAc,EAAA,CAAK,EAAA,CAalB,SAASC,EAAiBC,CAAAA,CAAeC,CAAAA,CAAkBC,EAAkBC,CAAAA,CAA0B,CAE5G,IAAMjG,CAAAA,CAAAA,CAAU+F,CAAAA,CAAW,IAAO,GAAA,EAAO,GAAA,CACzC,GAAI,IAAA,CAAK,GAAA,CAAI/F,CAAK,CAAA,CAAI,EAAA,CAAK,OAAO8F,CAAAA,CAElC,IAAMnD,CAAAA,CAAQmD,CAAAA,CAAM,KAAA,CAAM;AAAA,CAAI,CAAA,CACxBzC,CAAAA,CAASV,CAAAA,CAAM,MAAA,CACfS,CAAAA,CAAQT,CAAAA,CAAM,CAAC,CAAA,EAAG,MAAA,EAAU,CAAA,CAG5BuD,CAAAA,CAAKF,CAAAA,EAAAA,CAAY5C,CAAAA,CAAQ,CAAA,EAAK,CAAA,CAC9B+C,CAAAA,CAAKF,CAAAA,EAAAA,CAAY5C,CAAAA,CAAS,CAAA,EAAK,CAAA,CAG/B+C,CAAAA,CAAQpG,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAM,GAAA,CAC3BqG,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAI,CAAA,CACpBE,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAIF,CAAI,CAAA,CAGpBG,CAAAA,CAAqB,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQlD,CAAO,CAAA,CAAG,IAAM,KAAA,CAAMD,CAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAGtF,IAAA,IAASoD,CAAAA,CAAO,CAAA,CAAGA,CAAAA,CAAOnD,CAAAA,CAAQmD,CAAAA,EAAAA,CAChC,IAAA,IAASC,CAAAA,CAAO,CAAA,CAAGA,CAAAA,CAAOrD,CAAAA,CAAOqD,IAAQ,CAGvC,IAAMjC,CAAAA,CAAKiC,CAAAA,CAAOP,CAAAA,CACZzB,CAAAA,CAAAA,CAAM+B,CAAAA,CAAOL,CAAAA,EAAMP,CAAAA,CAKnBc,CAAAA,CAAQlC,CAAAA,CAAK6B,CAAAA,CAAO5B,CAAAA,CAAK6B,CAAAA,CACzBK,CAAAA,CAAQnC,CAAAA,CAAK8B,CAAAA,CAAO7B,CAAAA,CAAK4B,CAAAA,CAGzBO,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAQR,CAAE,CAAA,CAC5BW,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAOF,CAAAA,CAAQf,CAAAA,CAAeO,CAAE,CAAA,CAGlD,GAAIS,CAAAA,EAAQ,CAAA,EAAKA,CAAAA,CAAOxD,CAAAA,EAASyD,CAAAA,EAAQ,CAAA,EAAKA,CAAAA,CAAOxD,CAAAA,CAAQ,CAC3D,IAAMyD,CAAAA,CAAOnE,CAAAA,CAAMkE,CAAI,CAAA,GAAID,CAAI,CAAA,EAAK,IACpCL,CAAAA,CAAOC,CAAI,CAAA,CAAEC,CAAI,CAAA,CAAIK,EACvB,CACF,CAGF,OAAOP,CAAAA,CAAO,GAAA,CAAIQ,CAAAA,EAAOA,CAAAA,CAAI,IAAA,CAAK,EAAE,CAAC,EAAE,IAAA,CAAK;AAAA,CAAI,CAClD,CASO,SAASC,CAAAA,CAAW5B,EAAkB6B,CAAAA,CAA0B,EAAC,CAAW,CAEjF,IAAMC,CAAAA,CAAAA,CADUD,GAAY,EAAC,EACD,WAAA,GAAgB,KAAA,CAEtCE,CAAAA,CAAchC,CAAAA,CAAqBC,CAAK,CAAA,CACxCgC,CAAAA,CAAaD,CAAAA,CAAY,KAAA,CAAM,KAAA,CAAM;AAAA,CAAI,EAGzCE,CAAAA,CAAM5E,CAAAA,CAAa0E,EAAY,KAAK,CAAA,CAGpC,CAAE,EAAA,CAAApD,CAAAA,CAAI,EAAA,CAAAC,CAAAA,CAAI,GAAAC,CAAG,CAAA,CAAIN,EACrByB,CAAAA,CAAM,KAAA,CAAM,cACZA,CAAAA,CAAM,KAAA,CAAM,QAAA,CACZA,CAAAA,CAAM,UAAU,IAClB,CAAA,CAGMkC,EAAqB,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ/E,CAAQ,EAAG,IAAM,KAAA,CAAMD,CAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA,CACjFiF,EAAqB,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQhF,CAAQ,CAAA,CAAG,IAAM,MAAMD,CAAO,CAAA,CAAE,KAAK,EAAE,CAAC,EAClFkF,CAAAA,CAAsB,KAAA,CAAM,KAAK,CAAE,MAAA,CAAQjF,CAAQ,CAAA,CAAG,IAAM,MAAMD,CAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,CAExFmF,CAAAA,CAAY,EACZC,CAAAA,CAAW,CAAA,CAEf,QAASC,CAAAA,CAAK,CAAA,CAAGA,EAAKpF,CAAAA,CAASoF,CAAAA,EAAAA,CAC7B,QAASC,CAAAA,CAAK,CAAA,CAAGA,EAAKtF,CAAAA,CAASsF,CAAAA,EAAAA,CAAM,CAEnC,IAAMC,CAAAA,CAAQD,CAAAA,CAAKP,CAAAA,CAAI,QACjBS,CAAAA,CAAQH,CAAAA,CAAKN,EAAI,OAAA,CACjB/C,CAAAA,CAAKuD,GAASR,CAAAA,CAAI,KAAA,CAAQ,CAAA,CAAA,CAC1B9C,CAAAA,CAAKuD,GAAST,CAAAA,CAAI,MAAA,CAAS,GAE3BU,CAAAA,CAAKzD,CAAAA,CAAKA,EAAKC,CAAAA,CAAKA,CAAAA,CAC1B,GAAIwD,CAAAA,CAAK,EAAG,CACVT,CAAAA,CAAOK,CAAE,CAAA,CAAEC,CAAE,EAAI,CAAA,CACjBL,CAAAA,CAAOI,CAAE,CAAA,CAAEC,CAAE,EAAI,EAAA,CACjB,QACF,CAEAJ,CAAAA,CAAOG,CAAE,EAAEC,CAAE,CAAA,CAAI,IAAA,CACjBH,CAAAA,EAAAA,CAGA,IAAMO,CAAAA,CAAI3D,CAAAA,CAAaC,EAAIC,CAAAA,CAAIR,CAAAA,CAAIC,EAAIC,CAAE,CAAA,CACzCqD,EAAOK,CAAE,CAAA,CAAEC,CAAE,CAAA,CAAII,CAAAA,CACbA,EAAI,CAAA,EAAGN,CAAAA,EAAAA,CAGX,IAAMzC,CAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAG,CAAA,CAAI8C,CAAE,CAAC,CAAA,CACxCR,EAAOI,CAAE,CAAA,CAAEC,CAAE,CAAA,CAAItD,CAAAA,CAAKP,EAAKQ,CAAAA,CAAKP,CAAAA,CAAKiB,EAAKhB,EAC5C,CAIF,IAAMgE,CAAAA,CAAuB,KAAA,CAAM,IAAA,CAAK,CAAE,OAAQ1F,CAAQ,CAAA,CAAG,IAAM,KAAA,CAAMD,CAAO,EAAE,IAAA,CAAK,KAAK,CAAC,CAAA,CAE7F,GAAIoF,CAAAA,CAAW,CAAA,CAEb,QAASC,CAAAA,CAAK,CAAA,CAAGA,EAAKpF,CAAAA,CAASoF,CAAAA,EAAAA,CAC7B,IAAA,IAASC,CAAAA,CAAK,EAAGA,CAAAA,CAAKtF,CAAAA,CAASsF,IAC7BK,CAAAA,CAAQN,CAAE,EAAEC,CAAE,CAAA,CAAIN,EAAOK,CAAE,CAAA,CAAEC,CAAE,CAAA,CAAI,CAAA,CAAA,KAGlC,CAGL,IAAMM,CAAAA,CAAO5E,EAAM8B,CAAAA,CAAM,KAAA,CAAM,mBAAA,EAAuB,CAAA,CAAG,EAAG,CAAC,CAAA,CACvD+C,EAAS,IAAA,CAAK,GAAA,CAAI,EAAG,IAAA,CAAK,KAAA,CAAMD,EAAOT,CAAS,CAAC,EAEjDW,CAAAA,CAA2D,GACjE,IAAA,IAAST,CAAAA,CAAK,EAAGA,CAAAA,CAAKpF,CAAAA,CAASoF,CAAAA,EAAAA,CAC7B,IAAA,IAASC,EAAK,CAAA,CAAGA,CAAAA,CAAKtF,EAASsF,CAAAA,EAAAA,CACxBJ,CAAAA,CAAOG,CAAE,CAAA,CAAEC,CAAE,GAClBQ,CAAAA,CAAW,IAAA,CAAK,CAAE,EAAA,CAAAR,CAAAA,CAAI,GAAAD,CAAAA,CAAI,CAAA,CAAGJ,EAAOI,CAAE,CAAA,CAAEC,CAAE,CAAE,CAAC,CAAA,CAIjDQ,CAAAA,CAAW,KAAK,CAACtG,CAAAA,CAAGuG,IAAMA,CAAAA,CAAE,CAAA,CAAIvG,CAAAA,CAAE,CAAC,EAEnC,IAAA,IAASwG,CAAAA,CAAI,EAAGA,CAAAA,CAAI,IAAA,CAAK,IAAIH,CAAAA,CAAQC,CAAAA,CAAW,MAAM,CAAA,CAAGE,IAAK,CAC5D,GAAM,CAAE,EAAA,CAAAV,CAAAA,CAAI,GAAAD,CAAG,CAAA,CAAIS,EAAWE,CAAC,CAAA,CAC/BL,EAAQN,CAAE,CAAA,CAAEC,CAAE,CAAA,CAAI,KACpB,CACF,CAGA,IAAMW,CAAAA,CAAgB,GACtB,IAAA,IAASZ,CAAAA,CAAK,EAAGA,CAAAA,CAAKpF,CAAAA,CAASoF,IAAM,CACnC,IAAIZ,EAAM,EAAA,CACJyB,CAAAA,CAAMpB,EAAWO,CAAE,CAAA,EAAK,GAC9B,IAAA,IAASC,CAAAA,CAAK,EAAGA,CAAAA,CAAKtF,CAAAA,CAASsF,CAAAA,EAAAA,CACzBK,CAAAA,CAAQN,CAAE,CAAA,CAAEC,CAAE,EAChBb,CAAAA,EAAOyB,CAAAA,CAAIZ,CAAE,CAAA,EAAK,GAAA,CAElBb,GAAO,GAAA,CAGXwB,CAAAA,CAAI,KAAKxB,CAAG,EACd,CAEA,IAAM0B,CAAAA,CAAWF,EAAI,IAAA,CAAK;AAAA,CAAI,CAAA,CAG1BG,CAAAA,CAAWD,CAAAA,CACf,GAAIrD,EAAM,QAAA,EAAU,gBAAA,GAAqB,MAAA,CAAW,CAIlD,IAAMuD,CAAAA,CAAiBtB,CAAAA,CACvBqB,CAAAA,CAAW7C,CAAAA,CACT4C,EACArD,CAAAA,CAAM,QAAA,CAAS,gBAAA,CAAmB5C,CAAAA,CAClCmG,EAAe,OAAA,CACfA,CAAAA,CAAe,OACjB,EACF,CAEA,OAAOzB,CAAAA,CAAc0B,CAAAA,CAAeF,CAAAA,CAAUtD,EAAOiC,CAAG,CAAA,CAAIqB,CAC9D,CAEA,SAASE,CAAAA,CAAeC,CAAAA,CAAazD,CAAAA,CAAkB0D,CAAAA,CAAsC,CAC3F,IAAMC,CAAAA,CAAM3D,CAAAA,CAAM,QAAA,CAElB,GADI,CAAC2D,CAAAA,EACD3D,CAAAA,CAAM,IAAA,CAAK,oBAAsB,CAAA,CAAG,OAAOyD,CAAAA,CAE/C,IAAMG,EAAWD,CAAAA,CAAI,QAAA,EAAY,CAAA,CAC3BE,CAAAA,CAAY7D,EAAM,IAAA,CAAK,kBAAA,CAAqB,CAAA,CAC5C8D,CAAAA,CAASF,EAAWC,CAAAA,CAI1B,GAHkBD,CAAAA,CAAWC,CAAAA,EAGZ,EACf,OAAOJ,CAAAA,CAGT,IAAMlG,CAAAA,CAAQkG,EAAI,KAAA,CAAM;AAAA,CAAI,CAAA,CACtBM,CAAAA,CAAiB/D,CAAAA,CAAM,IAAA,CAAK,kBAAA,CAAqB,KAAK,GAAA,CAAI,CAAA,CAAG0D,CAAAA,CAAQ,MAAM,CAAA,CAC7EM,CAAAA,CAAaN,EAAQ,OAAA,CAAUE,CAAAA,CAAWG,CAAAA,CAC9CC,CAAAA,CAAa,IAAA,CAAK,KAAA,CAAM9F,CAAAA,CAAM8F,CAAAA,CAAY,CAAA,CAAG7G,CAAAA,CAAU,CAAC,CAAC,CAAA,CAEzD,IAAI8G,EACJ,OAAIH,CAAAA,EAAU,CAAA,CAEZG,CAAAA,CAAQ,CAAA,EADM,IAAA,CAAK,IAAIL,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAQ,EAAE,CAC9C,CAAA,kBAAA,CAAA,CAEhBK,CAAAA,CAAQ,SAAA,CAGV1G,CAAAA,CAAMyG,CAAU,CAAA,CAAIE,CAAAA,CAAgBD,CAAK,CAAA,CAClC1G,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAAS2G,CAAAA,CAAgBD,CAAAA,CAAe,CAEtC,IAAIE,CAAAA,CAAU,CAAA,EAAA,EADKF,CAAAA,CAAM,IAAA,EAAK,CAAE,QAAQ,MAAA,CAAQ,GAAG,CACtB,CAAA,EAAA,CAAA,CAI7B,GAHIE,CAAAA,CAAQ,MAAA,CAASjH,CAAAA,GACnBiH,CAAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAGjH,CAAO,CAAA,CAAA,CAEhCiH,EAAQ,MAAA,GAAWjH,CAAAA,CAAS,OAAOiH,CAAAA,CAEvC,IAAMC,CAAAA,CAAYlH,CAAAA,CAAUiH,CAAAA,CAAQ,MAAA,CAC9BE,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAY,CAAC,EAC/BE,CAAAA,CAAQF,CAAAA,CAAYC,CAAAA,CAC1B,OAAO,GAAA,CAAI,MAAA,CAAOA,CAAI,CAAA,CAAIF,CAAAA,CAAU,GAAA,CAAI,MAAA,CAAOG,CAAK,CACtD","file":"index.mjs","sourcesContent":["import * as AstronomyNS from \"astronomy-engine\";\nimport type { EquatorialCoordinates } from \"astronomy-engine\";\nimport type { MoonPosition, MoonState, ObserverLocation } from \"./types\";\n\n// Interop: in some loaders the API is on the default export, in others on the namespace.\nconst Astronomy = (AstronomyNS as { default?: typeof AstronomyNS }).default ?? AstronomyNS;\n\nfunction addDays(d: Date, days: number) {\n const n = new Date(d.getTime());\n n.setDate(n.getDate() + days);\n return n;\n}\n\nexport function normalizeDegrees(angle: number) {\n return (angle % 360 + 360) % 360;\n}\n\nexport function normalizeHourAngle(hours: number) {\n let h = (hours % 24 + 24) % 24;\n if (h > 12) h -= 24;\n return h;\n}\n\nfunction isWaxingAt(date: Date): boolean {\n const today = (Astronomy.Illumination(Astronomy.Body.Moon, date) as { phase_fraction: number }).phase_fraction;\n const tomorrow = (Astronomy.Illumination(Astronomy.Body.Moon, addDays(date, 1)) as { phase_fraction: number }).phase_fraction;\n return tomorrow > today;\n}\n\nexport function calculateParallacticAngle(date: Date, location: ObserverLocation, eq: EquatorialCoordinates) {\n const siderealTimeHours = Astronomy.SiderealTime(date);\n const longitudeHours = location.longitude / 15;\n const hourAngleHours = normalizeHourAngle(longitudeHours + siderealTimeHours - eq.ra);\n const hourAngleRad = hourAngleHours * 15 * Astronomy.DEG2RAD;\n const latitudeRad = location.latitude * Astronomy.DEG2RAD;\n const declinationRad = eq.dec * Astronomy.DEG2RAD;\n const numerator = Math.sin(hourAngleRad);\n const denominator = Math.tan(latitudeRad) * Math.cos(declinationRad) - Math.sin(declinationRad) * Math.cos(hourAngleRad);\n return Math.atan2(numerator, denominator) * Astronomy.RAD2DEG;\n}\n\nfunction computeMoonPosition(date: Date, location: ObserverLocation): MoonPosition {\n const observer = new Astronomy.Observer(location.latitude, location.longitude, location.elevationMeters ?? 0);\n const eq = Astronomy.Equator(Astronomy.Body.Moon, date, observer, true, true);\n const horizon = Astronomy.Horizon(date, observer, eq.ra, eq.dec, \"normal\");\n return {\n azimuth: normalizeDegrees(horizon.azimuth),\n altitude: horizon.altitude,\n parallacticAngle: calculateParallacticAngle(date, location, eq)\n };\n}\n\nexport function getMoonState(date: Date, observerLocation?: ObserverLocation): MoonState {\n const illum = Astronomy.Illumination(Astronomy.Body.Moon, date) as { phase_angle: number; phase_fraction: number };\n const lib = Astronomy.Libration(date) as { dist_km: number; diam_deg: number; elon: number; elat: number };\n return {\n date,\n phase: {\n phaseAngleDeg: illum.phase_angle,\n illuminatedFraction: illum.phase_fraction,\n isWaxing: isWaxingAt(date)\n },\n size: {\n distanceKm: lib.dist_km,\n angularDiameterDeg: lib.diam_deg\n },\n libration: {\n elon: lib.elon,\n elat: lib.elat\n },\n position: observerLocation ? computeMoonPosition(date, observerLocation) : undefined\n };\n}\n\n/**\n * Returns the English name for the moon phase using phase angle (preferred) with small tolerances.\n * Conventions (Astronomy Engine):\n * - phaseAngleDeg = 0° → Full Moon\n * - phaseAngleDeg = 180° → New Moon\n * - phaseAngleDeg ≈ 90° → Quarter (half-illuminated)\n *\n * We fold angles > 180° into [0..180] symmetry and use `isWaxing` to disambiguate waxing vs waning,\n * and First vs Last Quarter. Illumination fraction is used only as a secondary fallback threshold.\n */\nexport function getMoonPhase(moonState: MoonState): string {\n const { phaseAngleDeg, illuminatedFraction } = moonState.phase;\n // Prefer provided waxing flag; if missing, make a best-effort guess from angle (ambiguous, but safer than undefined).\n const waxing = moonState.phase.isWaxing ?? (phaseAngleDeg > 90);\n\n // Normalize to [0, 360), then fold to [0, 180] for symmetry about Full/New.\n const a0 = ((phaseAngleDeg % 360) + 360) % 360;\n const a = a0 > 180 ? 360 - a0 : a0; // 0..180\n\n // Angular tolerances (degrees)\n const FULL_EPS = 10; // within ±10° of full\n const NEW_EPS = 10; // within ±10° of new\n const QUARTER_EPS = 8; // within ±8° of quarter\n\n // Secondary illumination fallbacks for robustness\n const NEAR_FULL_FRAC = 0.98; // ≥98% illuminated ⇒ Full\n const NEAR_NEW_FRAC = 0.02; // ≤2% illuminated ⇒ New\n const NEAR_HALF_FRAC = 0.02; // within ±2% of 0.5 ⇒ Quarter\n\n // Full / New via angle or strong illumination thresholds\n if (a <= FULL_EPS || illuminatedFraction >= NEAR_FULL_FRAC) return \"Full Moon\";\n if (a >= 180 - NEW_EPS || illuminatedFraction <= NEAR_NEW_FRAC) return \"New Moon\";\n\n // Quarters: angular ±eps around 90°, or illumination very near 0.5\n if (Math.abs(a - 90) <= QUARTER_EPS || Math.abs(illuminatedFraction - 0.5) <= NEAR_HALF_FRAC) {\n return waxing ? \"First Quarter\" : \"Last Quarter\";\n }\n\n // Remaining regions split into gibbous (near full, a < 90) vs crescent (near new, a > 90)\n if (a < 90) {\n return waxing ? \"Waxing Gibbous\" : \"Waning Gibbous\";\n }\n // a > 90\n return waxing ? \"Waxing Crescent\" : \"Waning Crescent\";\n}\n","{\n \"moons\": [\n {\n \"index\": 0,\n \"distance_km\": 405493.5,\n \"libration_elat\": -0.888,\n \"libration_elon\": -0.412,\n \"ascii\": \" \\n \\n ._ . - . \\n ,_++> a, +. `-. \\n zr' ^ ~\\\")ssy_ss_. e__ \\n ^' w3$B$#R$2tBW&`x. \\n M@$@@E@@$YAm5Q@s<T \\n _*4Fk ;_ . : _r 4$g$B` `T!~4Z HDb*y_ \\n 7w=:-yyXm#sg@$$@$#Z . R$@$@R$?@` \\n ,Z$Kj9@W@$@@@@@@BG@w., / e$$0@5@Bbl\\\" \\n } z$@@y@@@@@@@@@$$@@@B@w$L cyM%H$$WP=K* \\n /^ 9M@@@@@@@@@@@@@@@@@$@@$~ y, ?#$$; 'L \\n MF. ?E@$$@@@@$@@@@@@@@@@g *z'_. ,Z@@ + \\n >w% E@@@@@@@@@@@@@@$@@@$$$%>$k- `y*.~$xtv \\n ##y$_-_y_aL` ~@@@@@@@@@@$@$@@@@@$@$$yB@$$/~ ~^Q+ \\n kXB@@_g@@@A`wgy@@$@@@@@@@@@@@$@@@$B@@@$@$I ~_ \\n \\\"_K@$Rb$^ ~MW$@$B@@@@@@$@$@@$@B$$@@@@5%sW v$v+ \\n #U@W$9@W_ .yd@$@@$@@$@$@@@$$$@$$M$M@2B@&@zgM `\\\"+ \\n [F*$E$@g@d@RR$E@@@$$@R@@@@@Rg@B$@$@0$@2@@_ypJ~ \\n \\\\'MB@PR$@$@@$$$@g@@@@@@$$$$$@E0@G$@g@$$A$MgV( \\n ^>Y$W3$@05$@B$$$@@@@M@$@R@@@BR$0$a@$@$@$@K? \\n ~4&BWB@@@@@@@$@@@@$@@@@@B@$$@B$NEBgW$~^\\\" \\n `^^T&~v$R$B@@$@BB$$y@$$E@$$@A&N0M\\\"~~ \\n 'Nv?52EMJ!_@$5g@@$R@RA$@E@7nF\\\"^ \\n \\\"^ 74~0~#<ERggkA=s3p4yyL. ` \\n ` ``^^ ^@n8m+\\\"`^ \\n \\n \\n\"\n },\n {\n \"index\": 1,\n \"distance_km\": 361882.7,\n \"libration_elat\": 5.044,\n \"libration_elon\": 0.661,\n \"ascii\": \" \\n . -r.. \\n _1{ *~ ML1W>u, _ . ^.., \\n y/ ^w@@$@sEgg_9u_{_ \\n ` .yyB@$4@@@e#jmg\\\\Wk\\\"*+. \\n ` -@R4@sF~~$WJ'R/~Z$%bk~\\\\ \\n ,\\\"_ ^ . m _w@$@@\\\\ \\\\@Rw@$h@k@K7, \\n ~T'~. _y y-w(4$a$@$F@$ : 'Z@$@R@R$@L \\n _L_<A@@@gy$$$@@$g$@@g_ y -9@@@$@W#)y=k_ \\n a@@2g@@@@@@@@$@@$$@@$@$g$y. >3[~~QM$ZW\\\" ~_ \\n d$@@@@@@@@@@@@@@@@$@B@B@$%` ,M '=$$$ 1 \\n { #[$@@@@@@@@@@@@@@@@$@@@@@@x4# -w -r?M@w V\\\\ \\n ?% , 4$B@@@@@@@@@@@@@@@@@@$$$@@\\\"H[db^ sEM!^*aVc \\n y'_ jZ@@@@@@$@@@@@@@@$@@$@@@$$M@E@@$%~ . ~\\\"\\\\ \\n %vM_ _ _} \\\"0@@@@@@$@@@@@B@@@@$@@@@@@@@M@@Z* Pj \\n <5%BgP,vg@@$Yf`y4@@@@@@@@$@@$@@@$@@@@B$@@$@$@WzK yyu~ \\n @2E$gW@@5F~ 4@@@@@@$@@@@@@@$@@$@@@@$@0@$@@$g@n$sz`1H'i \\n +A@@$g$Z' _2$@@@@$$@@@$$$@@@B$@$@@@$B@@A$@4@#4yJj k \\n '&@K@@@HE__xamB@g@@@@@@@@$@@@@@$@@@@$@@@A@g04$Wg#HB7\\\"' \\n HeAERBg$$@$$A@@0@$$B@@@@@@R@@$$$@$@@$5@B@a@b@W@WEU. \\n (~4@@E@@@W@@g@$$@@$@@@0MRWB@@$$5$@@$0$$@g@$$$@eRr/ \\n \\\"gj4ZE4@@$M$@$@$g$@@$@@W$@@A@$@$B@B@EB@00BBWTlM \\n ^$F2@E$$$0@@@B@@0@@$@$@@$@gB@@$$EP$$$bRN#^~ \\n \\\"EZ8$ERAzBM@$B@@$$Z@ga@@2$@@g@0@9mwa4~`< \\n `!7RvsyJ_D$@~$0$$B@@@00%@$4AT2Ef7^< \\n T$('@KEWc54$2Z$M$R#@MUT@NK1 \\\" \\n `T^^+{$)$2a73I9;@%RcM`\\\" \\n ~'\\\"`'~ \\n\"\n },\n {\n \"index\": 2,\n \"distance_km\": 363474.7,\n \"libration_elat\": -4.493,\n \"libration_elon\": 2.394,\n \"ascii\": \" _ \\n . .- T - -, \\n -bZ?-aLrw*j_ : . \\n : _$Y^ ~ ^-XRyw|,, ~- \\n F`` _#@@dgsgs _2_! \\n _ : . y@@@@$zE$AD21ftW' \\n _yWBxm' *- : . __ \\\"N$@@UOF4@b\\\\%sB7WR.' \\n `s;wd__1 W_;Vn@yyag@$@5 `~ ,s,<%[gs/k \\n t$$2AW@@@$@@$$@$$@@E$# r . \\\"@@$D$Wjny \\n -:; . q@@@$$$$@$$$@@@@@@$@@@W _ K@5@$5E55Z \\n v2K ~0@@@@@@@@@@@@@@@@@@B@@$$ylD y$@@5d@~Ewx \\n _V$(. 7HB@$@@@@@@@@@@@@@$@@5$$@@F~ T d@gs | \\n /v a; ; ```@@@$@@@@@@@B@@@$@@@@@$@ ,, ' ^T0$ \\n L0@@$ v@$@@@@@@@@@@$@@@@@$@$@B;y: y,. +^ A$ , \\n \\\\b2Y$$E{x2gz@L=_D5@@@@@@@@@@@$@@@@@$@@@$y_tw$@_ u\\\"^ ^W%' \\n WLA$$@$%@@@@@B`Y=L@@$@@@@@@@@@$$@@@@@@$@$E@R@$@E \\\"{ \\n ]y@NB@@@$$F ^B@@@B$@@@@@@$@@@@@$$@@@@@$@s0$@Z . \\n {4X$@$@aR=e _R$@$@$$@@@@@@@$$$B@@@$@@@@E5@PYE\\\\ y) \\n @*AgMB$$R5aR@@R$g@@@@@@@@@@@@@$@$@@B$$#$@Qjm@TdW/ j\\\"/ \\n #aZW$MBMR@0@@@$@A@$@$@@@@$@$@@@W@$@E$@@$$WgHP%^~hu` \\n `%$0$F$@$0@@@@B$$@@@@@@$@B@@E$@@@%@$@@@@$@W$@$BZ~ \\n 4?9@dB$$R$@@$B$MB$@@@$$$$@$$@5@$@g@g@B$9b$@AZG \\n *E@R$MR$$@@AZ$$R$@@$R$5$@@@D@$$$$$@ZE3@@a`^ \\n AA-j_^AT$$E@E@$@$@$RB2@Wa@$@%R@@$5BT~v \\n ^@V%@5@Q5WXE@@@R2@@RWR$b@$4@$WXMW] \\n r'AF)[%st$@BEc$E@Bx?t5_@\\\"T`^ \\n ~^ !7iT5$Z@@R0HW~4! \\n ~ ~~ ` \\n\"\n },\n {\n \"index\": 3,\n \"distance_km\": 363808.5,\n \"libration_elat\": -0.275,\n \"libration_elon\": 0.915,\n \"ascii\": \" \\n \\\\ l.r \\n ._u:UK4 ^v w_ ~ ^\\\\ . \\n . . v> ` ` `^4@Rj_Qx__ MBm \\n .(~ 2g@$@@zgWi9%Qd|4 \\n {0@@$5@@@B~D#gmHgk\\\"M \\n _$g.y = _ _gDg$M\\\" `TYr~Z^ 1RvqF^ \\n \\\"~`K'.:,_L _w_s2@y$$$@@R` !@%g@R*Mz#{ \\n . &yg^YR@@s@$B$@@@@@W0Z ,@$0@$BRXU \\\\ \\n w@@$f$$$$@@@@A@@@$B$@@&_ G; @@@B@@Zj0k#x \\n M g@@@@@$@@@@@@@@@@@@@@@$@@@$+- -MM~~W@$# `!v \\n !Xe =#$@@@@@0$@@@@@@B@$@@@$@@. =r . 44$$ ' \\n M]| . \\\"@@@@@@@@@@$$@@@@@@@@@@$xfi m . wu=Az. $ \\n `[#< J@@@@@@@@@@@@@@@@@@@@$@@g@_42s_ y?% ^K}@! \\n <my$yy} ww,a_ .~$$@@@@@@@@@$@@@@@@@@R$$@B@@@$zs' ~`~ \\n XNv9$@p$$@$$E3L*y0@@@@@@@@$@@@@@@@@@@$@@$@W2@gM- -. \\n 'Vd@$Z@@@@\\\"` $$@@E@@@@@@@@@@@$@@@$$$@$@@$@$NKc . ,j1, \\n wkBQR@@%k,! ,z@R$@@@@@@@@@@@@@@@@M@@@@@@$$@Wg\\\\$g* %>V \\n `VJ$$s&0Bv_J$$0B0@$$$@$@@@@$@@$@$@$@$@@$$$@@@f@YF_L` ' \\n ??K#gZ@@$@@@$s2$$@@@$@@@$$@@@B$@$$$@@G@R@ERBB@g#Xfuf \\n twZRW2$@@@$$$@@@@$@@$$@$@B$@@$E@$0@@@E@M$@M5$@WyL \\n ~\\\"E@@yE@@$@@$@@$@$@B@$$$@$E@@@$@$@$@$@@@@ER@27>\\\" \\n ^!F5#g@@$@$$@EE$$@@@@$W@@M@@$$@0@@gKzBBK%9~ \\n `'^~~^T~7R@g@R$$@B$@MQ$a$BE@@$gE@$HJP5(~ \\n ` '}K$@g#R#0$15$@$Z@R@@BRz@$@V[Qe\\\\ \\n `f='^4ysMh$54T$W42@PE~FfW&9~~ \\n '~=\\\\ <?^F0%~>BR$?)^T\\\"` \\n ` ~ ~~ \\n\"\n },\n {\n \"index\": 4,\n \"distance_km\": 364350.7,\n \"libration_elat\": -5.105,\n \"libration_elon\": -1.866,\n \"ascii\": \" \\n . - ``` e . \\n , -zq{^o{.1n, = \\\":\\\"y . \\n . _Z0~ ` -ZAmLi,.. '_, \\n M\\\" X@yygyw-x_2/Gk. \\n . . . jg$@@$$g@@$1?V#WR}^_ \\n s*R W M/ ;.. 4$5W$$RF@$WgEZ99@2q'\\\\ \\n . 'w._w_y_7__-z@$ym@@@$2' T~~_$'/@2@*7j, \\n y@ghT@@@$@@@@$@@@@$$W<- 7$E#@B$g4N \\n ,} . y@@@W2B$@B@@@@@@@@$g@$ , / ug$$@B$@@8w; \\n /|r 5B@@@@@@@@@R@@g@@@$@@@@@_w@ 7A@$@K@C45)|! \\n hM: ^4$$@@@$$@@@@@@@$@@@B@@@@=^k _:4'~~@@$w'~`m; \\n ^\\\"Z' ` . ~ 4@@@@@@@@@@@@@@$@@$@@@$ j_f^ =@@@ '\\\\ \\n (g@@ _. 5@@@@@@@@@@@$@@@@@@$@@$4BW_yL _ 4YT@s .\\\\ \\n eRZ$9@,Wgs$g,-{V$@@@@@@@@@@$@@@@@@$@$@@@zy@@_.\\\\#FF RB@~^ \\n '|@@@sB@$$@B P=yg@@$@@@@@@@@@@@@@@@@$@@$$@$$@$F\\\" ^U . \\n \\\\wAb@B@@$` $@@@@@@@@@@@$@@@@@$@$@$B@@@@WB$C\\\\. Q \\n 3FB$A@m@ y$@@@@$$$@@@@@@@@B$$$@$$@@@Z@@B$m; {yX{ \\n ^4H@0@@@KRy$@Ta@@@@@$@@@@@@$B@$@@Q$B@B@EB@@$$46z: ]EZ+ \\n \\\\\\\"w@E3R@$@E$$@@@@@@R$@@@$@@@@$@$$$$@@@0@@$KMB\\\"3L(^;^ \\n ~<%@E%W@B@R5@@$$$@$@@@@$@$$0@@@4R$B@W$@@0gB@b@@` \\\" \\n nM%4$$g$E@@@@$@@@$$@$$@@$$B$@E$@$E$$RMBZ$$N%$V \\n `=4EMT@Q@g@S2g@$@@$@@BE$@$0@@@$$$M@gW$@4Z9~/ \\n !_3w~P#KB$@@g@@R5@@R$$@@@@$@RR$a44%44v^ \\n 't\\\"Y#$XM@_\\\"55$$B@$@EgB$@$awR4MzG~| \\n !-`z%T4@>ME&b~E9B$rT>4_-$4Y' \\n ` `TWD13d~A2fK~Wv^= \\n ` ''` \\n\"\n },\n {\n \"index\": 5,\n \"distance_km\": 366333.9,\n \"libration_elat\": 0.278,\n \"libration_elon\": -3.312,\n \"ascii\": \" \\n ~' ^ _. . \\n __*^w<-xr=<w ` ' '?, \\n gf` ''\\\\KAy@-_w__ _)Mg, \\n \\\" u2$$$R$gn&w@sB_M~(_ \\n $@@$@B@@@@@$mg@gRk*>Y \\n __ _! r _ _4@@@$~ ~R^~gE,sgm$GI}\\\\ \\n ' ~ ,_y _k ,R@yW@@$@K`, $@&@@@a1&$K\\\". \\n , al~_$@@@gBBg@g@@$00{ . @ \\\"$$$5B$$sMy\\\\u, \\n .4@$4$@$$@@@@@@$@@@@@$y_VR }E@@@$W@s~wW7l. \\n s$@@B@@@@$$@@@@@@$@@@@$$$@Y* {4rT~BM$qB \\\", \\n N fd@E@@@@0@@@@@@@@@$@$@@$E_4_gF f=@M$ Rr \\n 7! 9@@@@@@@@@@$@@@@@@@$@$$m$y@g___ +F*Y&m ,X \\n VwL b@@$@$@@@@$@@@@@@@@@@@@@@b@$$R_1aB3^`4mWk{ \\n J$Wz_L ._yx fB@@@@@@@@@$@@@$@@@@@$@@@@$@@2gF_ '^\\\"n) \\n l4@$+E$$@@`E*y4@$@@$@@@@@@$@@@@@@@@M@$$@@$@@a. 7>o' \\n R@RK@$$F`' 2$@@@@@@@@$@@@@@$@@$$@$$@@@B@$0@$k ,.nyd> \\n lY$E@y4. ygR$@E#$@@@@@$$$$@$$@@$@@R$@$$$0a@@gM,%^> \\n #q8@g@$wy2g$~$$@@$$@@@@@@@@@@@@@$@@0@$$W$@K@6D@LL\\\" +/ \\n ^jJ0@@@g@@@gK$P@@@@$@@@@$@@$B$$$@$@Wg@g@@g$$g$E2B(<~ \\n VWM64k$@$2@$@@$$@@@@@@$@$$@$@@$$B$@@$$R%@$@$@E$*( \\n `=X@LZ$gB@$$@$g@$$@$@W@M@$@@$@W0B$@@$@$@$@$$@RV \\n ^KM?N9$@@$@W5BB@#B$$$$$$R$@@$@@@Dd@%BMAmkWx^ \\n 'H\\\"'%_RF2@$@Bg@@#GA$$5$R@@@@W$$BRkK1|`' \\n <V=H@Z#$__3$bgA$Fe$RYR@R2Wy=%V` ^ \\n `=L~YGT$6$49TEygg$gw1dse< '\\\" \\n ~'!\\\"T~A4_EtR00>V~-~ \\n ` ` \\n\"\n },\n {\n \"index\": 6,\n \"distance_km\": 366534.2,\n \"libration_elat\": 5.395,\n \"libration_elon\": -3.121,\n \"ascii\": \" \\n . : ' 7 __. \\n + : =c_ws_ . . \\\"\\\",> \\n |'` ~NEmszz$_E_a2wcju. \\n / ;$y$@%h$$0*R5j@#WwyYn \\n 4@5$gF^~@$JRg@`T@KV3p2|_ \\n , : _$$@$+ : a@$B4Em2y$g.- \\n .r ' :-|u 4D@g@@$$ , .2@@@@#B$@W@>_ \\n _+ G$$gy9@@$sz$5$@@` y@ . N9@@@$s$xFym>% \\n #gg|@@@@@@@@R@@@@@@@@$a@gL,.)4yk~Me@@WT '\\\"v_ \\n .d@$$$@@@@@@@@@@@@@@@@B@@$J`_a*< Y4@@v (v \\n , 4MM$$@@@$@@@$$0@$@@@@@@@@g$$WyG , xK*HRy_ v: \\n !: ?@@@@@@@@@@@@@@@@@@@@$$g$ME$@yF *$MF ~@C}\\\"| \\n uX . ty$$0@@@@@@@@@$@@@@@@@@@$$$@$@$@E ^{\\\\.L \\n Q4+ _ _ ;'@7@$@@@@@@@@@@@@@@@@@@@@@@@$@R$ !V! \\n #[%XI 4agMR4_-_@@$@@@@@@@@@$@@@$$@@@@@@$@$$@$z: w-Lvm. \\n ~%m@Ed@$@F~ /$$@@g$E@@@$@@@@@@$@@@$@@@@@@$$B@a$$NT]W($\\\\+ \\n lz@$$@@~ _$$@@@$$$@@@@@@@@@@$$0@$$@@$@$$W@A9@$$/ Uv \\n pXM@RgLj.1w@M@$@@@$$@@@$@@$@@@$@R@@@$$$$$$@@@@R@2$;/ \\n MNK5@$@@@@@aW$E@@$$@@$@@@@$@@@$B@$@$@$$@R$$@$@@2*U\\\" \\n \\\"=?6F$R$$BR@B@@$@@@@$@AR2@$$E$@B@@g@@@y@$$@0W$2%4 \\n \\\"%wKD^@@$@y$@B$@$g$$@$B$$$@$@B@@$@@5@2k@@ZaF\\\"`' \\n 'V@R$&$$BR$@M@0$R@B@$@@R@@@@$@@$@@@bBZ@JM^ \\n '*?bKJ\\\"%0$g@@$@E$$a$g$p5@g$eyB3RRZ$tF~ ~ \\n ~-g8k#@59g_y$@$F$$RTaE@Enf~5H|~)< ` \\n ''$'\\\"Pys/4dRHbD2kKZWa@RMXH + \\n ~^~YMa.5~$_yWTKBa4=r^` \\n `` \\n\"\n },\n {\n \"index\": 7,\n \"distance_km\": 368573.4,\n \"libration_elat\": 5.829,\n \"libration_elon\": 3.778,\n \"ascii\": \" \\n . T r \\n +_:X ={_r;_ , ~ - \\n _y^ `` ' `^X@ygRBy=. ]ZC; \\n u'^ _w%$@Rp$g*=E#7Vy,,\\\\ \\n ' ~@KR@$F~M$V*_2'4$%]/}. \\n _. , x ., . , ,g$m$@` $ewsP05k$M \\n w75,F ;_ _w_/j$4$@$S@} t$@@@R@G@y \\n 4gGJ<@@@@w@@@@@$0@@$s g $bdB@K6FGfs- \\n H@@_@$@@$@@@@A@@@@@@$@Wg$y. \\\"N/~~@@@@ `~? \\n i q@$@$@@$@@@@@@@@@$@@E2@$@k W S=@@) \\\\ \\n ,_ M$B@@@@@@$@@$@$9@$$@@@R@@@w}\\\" _ ` 4^?@x. w \\n $t ~?@$B@@@@@@@@@@@@@@@$@$@yyK X$4_. v'! ~*]^ \\n ^W`w . - $@@@@@@@@@@@$@@@$@@@@@@@$$g$@@Wg~ '.7+ \\n K$wG_ ._ _TM@@@@@@@@@$@@@@@@@@@$$$B@@$@0@Q* zl \\n ;bWagg2'W@@@@$V\\\"*g@@@@@@@@@@@@@@@@@@@@@$@@$$@@4R/ zv| \\n `vN4$$$$@@@FF~ 4$$$@W@@$@@@@@@$$@W$$$$@@$@$@B#4%@mP xJX \\n {W@W$$@$@F y$@@@@@@@@$@@@$@@@$@@$$$@@@@@$%@B~_wa Y \\n @Y@E$2@@@\\\"y ug@$@@@@@$$@@@$@@@@@W$$$@@W$#M$B@@@@B$?x \\n {mKW@$@$@$@$@@@$0@@@$$B@$@@$@$@@@$$@@$@@yMAEE$0H5X \\n [/aM@$R@B@@#$@$$@5$$@@$@@$$@@@@@#@@@$@E@@$@@@WX\\\\ \\n ^t&W@$%T0@$@@g$@m@$@$@@@$$@$W@@BB@@@$@gbNR5k5L` \\n [UZ$Z23@@@$B$@B5$@@@@$T@d5@@0@@$PM$$KRkW^^` \\n '\\\\@PBKtYKTP@@M@g@@$@$gR$g$BWB$Bh3~8X' ` \\n 'f?k>@ghg@MBT@8RE@fd$RnZs#?1w)[!: \\n '\\\"~$J~m#?Bd$M4@gE@Z$0a3GGV1' ~ \\n T^~^T`^j4Zlu*M4T ' ` \\n \\n\"\n },\n {\n \"index\": 8,\n \"distance_km\": 368792.8,\n \"libration_elat\": 1.882,\n \"libration_elon\": 4.299,\n \"ascii\": \" \\n .: . - \\n ,_*_q -/nvu`. ' ' x \\n jj+~ '` `'^hUyygZl _1r. \\n <^~ w@B$M$$$g./5BY, \\n .4@E@@a0@@#.1&$#$i{., \\n u_: s r..4$@@@~ ~\\\" '$_,R@WQ,; \\n -F'h~ _.y_4y1_Fd$gg@$@TL R$@MBE0M# \\n :@z=w9@@@@@@@$$$M@$$$ / n$@g$BR${, \\n '. 4@@$#@@@@B@@@@B@$@@@@gy_4+ `9e#@%g$\\\\\\\\~\\\\ \\n r_ . 9$@$@@@$@@$@@@@@@@@@@R@@RBK `/ #g@5 ^ \\n XQ? \\\"A@@@$@@@$$@@@@$@$@@@@@$@@ ? .\\\"^$&i \\n /VzL . ..\\\"M@@@@@@@@@@@$@@@@@@@@@@[\\\"_ __ _. `V^#\\\\, : \\n ^J,$y n@@@@@@@@@@@@@@@@@@@@@@$$y_WggwLjT` ~$w \\n )S@@@L______ywJ.5@@@@@@@$@@@@@@B@@@@@@@@@@@B@g0i 'Y \\n ^9650g@$2s@$$@F@*g#@$@@@@@@@@@@@@@@$$B$EBg@B$@Hf. ?| \\n #3@M@$@@$@F~~ a@$@@$@$$@@@$@@@@@@@@@@$@@@V$@EO?; ?s4 \\n Jjg@$$N$5Z., w$@@@@@@@@@@$@$@@@@0BW@$@RR$$$9@ZR$ x. \\n ^4N%7W@R@y$wB9W@$@$@@@$@@@B@B@@@$$@@@@A$@B$Bdg@_jW: \\n \\\\@$B$@@$g2@@@gE$W$@@@@B@@@$@@5@@$@E$@W$@@$gM@@@2k,` \\n \\\"Wfj@$s@gg@@2@$$@@$@B$@@$@@$@@@$@$R$@@2@E22@EA$@# \\n \\\"@BG0L$@B@@$@$@$$@R@$$@@E@$$@@@@g@R$$@@$$@MFt~ \\n `fT$$%@R@$@$$d2sg$$@@$@@@@g$@$@@HRRM@ETT7+\\\" \\n ?X@W~YT{WT#@B$$@@@$@$g0B@@W$#@@#$$dWn \\n !8Hg@mE$EBVT&0y%$@0#sNEWAmpV*4M ~ \\n ~n'__@2#Ga-BE@$sglEE(NNZJZ \\n ^ ^ {3'9i@V_zM+>-~~ \\n \\n\"\n },\n {\n \"index\": 9,\n \"distance_km\": 370979.8,\n \"libration_elat\": -5.57,\n \"libration_elon\": 4.616,\n \"ascii\": \" \\n . r F^. , ,. \\n 7 , _mvpaW..,_.^ -r> , \\n z$\\\"``~ `r ~-zR9_ ` ` +. \\n ' {Y~^ ~3Bwyak. .QU \\n . . )gg$@R9g@R/Rtmu. \\n , . _g@WyZ.xsv. , u7@E@AaK@@W\\\"H%)__^ \\n ; `T`$__ yw).f__.WRwya@$g@$` \\\"?^-~_/X#!: \\n < _ g@@*5g@@$$0@$@@$g@@53 4@@p@aRi< \\n Jjp , ~g$@@$@@$@@@@@@@@@0@@@l , T@@E5@KL \\n _4g@ R@$B@@@@@@@@@@$g$@$@@$$a_,\\\\ 2@$$$g8@\\\\ \\n T>@{; 4M@@@@@@@@$@@@@$@@@@@@$$EePh \\\"~~`~5$V/\\\". \\n _*@LZX . `$@@@R@@@@@@$@$$@@@$@@$K *R@; `: \\n |$P@W%_ w _ r.@@@@@@@@@@@@@@@@@@@@@@@~ -, .n:01 > \\n )XjE5B@@~aZ$gg$ya$$@@@@@@@@@@@$@@@@@$B@$gW _yN_ .X! 4M/` \\n JD$@B@@@R0@@@$M~Fx@g@@@@@@@@@@@@g@@@@@@@$@Ws@@B(^ `>' \\n 7$4$P@$$$@F\\\" R@$@@@@$@@@@W$@$@@$$@$$W$@$y@gL+ . \\n !2BR$@6@@WMg __m$$@@@@@@@@@@@$@@@@@@B$@@@@E$@$%\\\\ . > \\n 7*>M$@B@@0@Em$@@@@@@@@@@@@B@@@@$@@B$@@$$dRE@MRyy M \\n ^!@$yEgZQ@$$@$@@@s@@@@$@@@@@g@@@gR@@ZB@@@@0BW@~~_v \\n \\\"9BR$@T#$@@gE@@$@@@$$$@B@@#@@@@g$$@@$s$g@@#$g$GR! \\n 'M&@@@D@@R@@@@B@@$@R@@s@@@@$$@@@@BB@RR@WM0@@B\\\" \\n ~0B#@Bt@@@RCgy@E$@@@@$$$@@$E$@B@@@@$3@@<P \\n '2[@g_{iE@$Z@@0BKEE0$R$@$$#@5@$$$@@MT \\n ~<[F8g(EzaZM$#@yM$4yB$$@$d4MW4W~^ \\n 'R@/2Sy<MRg$W5D$^>OT'\\\" ~ \\n ~r!7/4%E@@5vr*?^\\\" \\n \\n\"\n },\n {\n \"index\": 10,\n \"distance_km\": 372936.5,\n \"libration_elat\": -5.822,\n \"libration_elon\": -5.197,\n \"ascii\": \" \\n ; -: . \\n _, >c +___' ,`i + ._ \\n ._Nw^~\\\"~T~ ;\\\\ 9M_., \\\"`4o_ \\n ^>~ . ^$@$2%2Wiu zRzq \\n ` Lg@@@$@@ge$d$gZ2~aL \\n _vW<> ;-' g$@$RZ&@B$4@K$$4R%_%M_ \\n ` | ,,.: . _,xgEyX@@g$$M` \\\"4Y?$$~-MB]*K_g \\n _zW*32@@g5y$@@R@$@@@@Kv '$$$W$m#mggJk \\n :2@$WgBg@@$@@@@$@@$@@h_./yG j@@$@$WBw4M-, \\n [ '4@@@$@@@@@@@@@@@$@@@$g2@$E,: ;@$$$@@@2#MIo( \\n < ^w5@@@@$@@@@@@@@@@@@@@$@$@k j\\\"@@VF@@@@KM~\\\"|> \\n rj $@$@@@@@@@@B@@$@@@@@@M~$y@Y ` R@$@% !| \\n 5\\\\E , _@@@@@@@@@@@@@@@@@@@@$EK@@@$_, .eX#b> j \\n \\\"KEN~;zyy$_, `0R$@$@@@@@@@@@@@@@$@R@@y@$$$~ -aA<^W1nV' \\n #E0R@@$B##~F_yg@g@@@@@@@@@@@@@@@@@@$@$$@$@Z=\\\"~ ,'MI`' \\n cMF$@B@' =#$@5@K$@@@@@@@@@@@$@$$$B@@$@@R$ .' \\n w\\\\a@@m_, yz$5$@M~$@@@@$@@@$$@@@@$@@@@$@$s@t LyA'; \\n i,kRR$@ma@@$gW@@@@@$$@@@@E@@$@$@@$$$@@@@$@@gwm ;%XP \\n }44$KB@@@@g@$$$@@$@@@@@$@$@$@@$B@@@$@@@R@B@R$yX^,/^ \\n YVAYT@@$Z@$@@@$@@@0@B$@@@@$$$@B@$$@@$$B@@W#ER4_~ \\n SK@2@B@$B@@@@Z$5$@5@R@@@B@$D5@@200@MM@$4@E~_ \\n ^I\\\"<Z24B@9y@g5$@@@@$g@@@$$@$@R@@$$R@@@Y?k` \\n ~^j._;4$Ta@s@@@5@ER$$2@$$@gBsyAH4@O- \\n `\\\"';tK/RyvR@Nq@@#$@$QE$@@E7$d\\\\J= + \\n ~ Yg+F=9fP$12$F*+$)@~j~?` \\n T~zE$45[~K=\\\"~ \\n \\n\"\n },\n {\n \"index\": 11,\n \"distance_km\": 376361.2,\n \"libration_elat\": 2.0,\n \"libration_elon\": -5.764,\n \"ascii\": \" \\n ; .. _ \\n .- yxw__ `'( ` n> \\n - ~\\\"F M@g_-m\\\\_,, _W<x, \\n l` . __$@$@@RK9>4$d$%,qn_ \\n mg@$@@D@@$2D#g@sgMyJ4} \\n .._ 4$@@@F~ ~F\\\\~k5~x$@@WMswt, \\n ^r . ywyE@@@$;, #R$$@S$g$H*m . \\n $ . @$y$UNg@LZ@@@@$ ~, \\\\ .g@@@$@$$$$dF;; \\n js@ug@$@@$@@@@@$@$$@ysx$E{ ZR$$@$@RQ@M%)N^ \\n . -@@@m$@@@@$@$@@$$@@R@@@@$#* [^M8F.$$@$@ ~MN \\n _: 4ZR5@@@@@@@@@B$$@@@@@$@@@@B$@j .\\\"^5g$_ >| \\n (. *y@R@@@@@@@@@@@@@@@@@$@@$@@$zy.r3<VH@z_ *j \\n '_ )Z@R@@@@@@@@@@@@@@@$@@@$@@@B$sy$$'M `AgWi^? \\n Wd, . j ~Ey2@@@@@@@@@@@@@@@@@@@$@$$@$#E . ~?]X: \\n X;0>)_g@RK7.ggA@@@@@@@@@@@@@@$@@@@@@$$g@@AB_ . _,j' \\n \\\\@ME@@$F~ .$@@$$T$$@@@@@@$$@@@@@@$@@@$@0@@ga1_$*@wK<_ \\n 7#%BB$ y#j$$Za$@@@@@$$@@@@@@B@@$@@@$gEg@@@ ~&>\\\\ \\n `,N4Rgy/jggR4W@@@$$@@@@@$$@@@$@B@@@@$@0@$@gg9$WW_j5r \\n V\\\\2W$$AgR$y@$@@@@@@$@$@@@@@@BB@$g@@@$$E$WB$@AK@7+ \\n YXnbM5@@d$@@@@a@$$@@$@@@@@$@0$@@@@@@B@$0$%@HK%2' \\n '42K^RB@B$$$$@$@@@@$@@$M@$@$R$@$@@@@@@BW@$#{\\\" \\n ^\\\"Z@0E@@BgM@$@@@$$E@@$@@B@$$B@@d$Zm@R#{~\\\" \\n `x`.U +$$@B@W@@@@gM$$@$#g$40A#gF[~$\\\"M \\n K@cm$M8wK@gG3g$R@g$s4@M7xH~4j^ ~ \\n \\\" -~~&CTp9=$$@9U$RE?kv7+ur \\n `~` `T\\\"-\\\"<M5PT \\n \\n\"\n },\n {\n \"index\": 12,\n \"distance_km\": 377700.5,\n \"libration_elat\": 5.801,\n \"libration_elon\": -5.923,\n \"ascii\": \" \\n - \\n .,_ .. ~ ~ '\\\" ^g:, \\n ; ^~ ' `$$WyzQLw: j8yG=- \\n \\\" Ly@$$&@RM72g<@%$LYR_. \\n +4$M@GB=R@kdM@M^?$@WxM\\\"|, \\n . _gW@$K ~' 2$x@MgM@WE)r1 \\n .- ^ >:, 4y@$@M0$ =@@@$B$@@QWz(? \\n - .$$jQygg$y$$$g$C,: a. j@R$@@@ZmBR#Kw{ \\n 5$us@@$$@@@$$$@@@@@gGgFLL.J?$W0~$@$@U~`~\\\\n& \\n ,a@@@$$@@@@@@@@@@@@@$$@@@~gy$r ' =~$@$\\\\ ^3| \\n . (5M$@@@@@@@@@@@@@@@$@@$$@@@@@L__ wRR~E@@ ,Xk \\n ~`{W$@@@@@@@@@@@@@@@@@@@@$$$@@&~wdM*M~#@gL~J \\n ; _$$$@@@@@@@@@@@@@@@$$$$@$@$@@$$~. '~~v[/ \\n w_ . _ '4^y0@@@@@@@@@@@@@@@@@@@@@@$@$@*> >w- \\n H &i +w@#M$ _$$$@@@@$@$$@@@@$$@@@@@@@$@@$NM>_,-_kgv9Y \\n ~<msX@BF~ 9@R$mR@MB@@$@@@R@@@$@$@@@@@@@@@@gg$BQW+%$_/ \\n \\\\FRW$$ _yH&4gy$@@@@@@@@@@@@$@$@@@@$@@@@@E0@$$]\\\"FM' \\n '?V]MgL+,_g%a$@@@@@@@@@@@@@$@@K@@$@@@2@$$$@@$%0M@2A^ \\n a@7@$g@g@y$@@B@$@R@@$B@@$@@@@@@@@@R@@MR@$$@By@#YF \\n ^3k522#@B@@@B@@@@@@@EE@@@@@$@@@@E$BR@$@$RgR$R+~ \\n ^(^4`@@WA$@B$$@$@$@@9R@@$@$$@@$@E2@@RRWgMw?/^ \\n 'Q7W2$0$W@$@$@$@@@@zRW@$@B0BK0W@@MBMM~\\\\J \\n \\\"V('x.~3@RRB@@$@RB@@@$$A$B@@jptW%~' \\\" \\n \\\\T$/RRZBgp$ZGPRMg$$$@$E$X/'~W) \\n ` =\\\"\\\"&*G]@wtB4E4$gg$4$4EP!^ \\n \\\"^ ``\\\"+M= -T~^'` \\n \\n\"\n },\n {\n \"index\": 13,\n \"distance_km\": 378113.4,\n \"libration_elat\": -2.581,\n \"libration_elon\": -5.835,\n \"ascii\": \" \\n . . .. \\n . `, ,_. -7`\\\". \\n /J^~T ~ \\\" z4$_ ._ `\\\":- \\n 4-' . . [@$@x@Wyy y@$iu. \\n jy$@@@$g@A@g$DARB}@w_ \\n _*_ . 790$$g$MA@@a@W@NRBRk^% \\n ' .~ +_ *$_yx@B@E= ^`~JBsm$$HWbyQ^, \\n Jy-\\\"@@g@_a@@@#@@$5gTn \\\"ZM@$$$g$@@w^. \\n _@@@$Gg@$@@@@@B$@E@$;$gys' _9@@@g0$Ra@j_~. \\n q@@@$@@@@@@@@@@@$$@@@@$g## _vQ@R@B@Ew#&~nr2 \\n .T `#2@@@$@@@@@@$@@@@G@@$@$@%_z:7F^ W@@B^ (*l \\n } =D@@@@@@@@@@@@$@@@@@@@N@#Wy ,`_5@#w \\\\. \\n #PL . 5g@M@@@@@@@@@@@@@@@@@@@$gR@$pu,_%7\\\"R$L KU' \\n \\\\ Pz\\\\_y-gb \\\"05L@@@@@$@$@@@@@@@@$@R@@g$@@$g>~ ~KAD'@ \\n 7|B$)g@@$@ Y=y$@g@$@@@@@@@@@@@$@$$@@@@@@@BR_ r' \\n 'YK$$N@\\\" PF@EgM@$@@@$$$$@@@@@@$g@@@@@R$@z. _)z7 \\n :kR@$0;_ g@W@$_yg@@@@g@@@@$@$B@$@@@@@$5R_$*.iH9R? \\n TQ@@$d1w$@9#$@@@@@@@@@@@@@@$@B@@@$$@@@g$BgB@@wMk:T \\n {%AP5@@0@@s@@$@@@@@@@$@@$B$@$B@$@M$@$RRg@dyw@#W};` \\n ^y5XA@$MRB$@@@$R$@@@B@$@@@@$@@B@@$@@@@RA@@B@YQ;~ \\n `6%RGBB@@@@$W$$@$$@$@E$@$@@$@$B$@$$$@@@$%5\\\"` \\n `\\\\X3~~2@ER$$B@@$$$E0RB$h$R$@$@a$aA@%R@%9 \\n >Un _{6$RA@$@RW$g@0$$@@ygWKMM$@@W^~ \\n ~n1M5&*#_a0@@@AR@$@$$$EXU7YMf^? \\n ` ~^~k[c5s%MAYqMFFM@\\\"VZ ' \\n ^-^*F^~?~`~` \\n \\n\"\n },\n {\n \"index\": 14,\n \"distance_km\": 379658.1,\n \"libration_elat\": 5.491,\n \"libration_elon\": 6.128,\n \"ascii\": \" \\n , - ,. \\n , __ _x` , , \\n ,+Y'=' .^?=PywwM__., _.- \\n -s- lE@@$@g@__L_$>. . \\n \\\" ` >$$@$$44@F<Ma YX_(:. \\n . _. 4@W$R \\\"\\\" ^wyy9$%BZ \\n ,#RoP ` k \\\\\\\\;_a@m@@@#ET ~@@#$%syV; \\n ~a_bX$@$$3@$$@W@9$g@L , W$@@RzFC}t \\n . ~@$@$$@@$@@@@@$$$$@@$N%y___ ~g?~5$Bw^\\\"| \\n ^ y$$@@$$@@@@@@@@@@@$@@Q@@RP^ ` \\\"R$@_ : \\n ..W ~@@@@@@@@@$@@@@$@$@@@@@$@$. u /m=Ey . \\n ^jR \\\"~?@@@$@@@@@@@@@@@@@@@@@$w_< `gy; j~) tyl \\n xV^> {+2@$@@@@@@@@@@@@@@@@@@$@B@_@R$$W~ \\\"?Y \\n '&W$z . y[_?@@@@@@@@@@@@@@B@@@@@@$$@@@@0@Ek !' \\n ^N26@9g_pdg$$$M$*@@@@@@@@@$@@@@@@@$@$@@@@@*@$Rb\\\\ :d/ \\n ^ARj@@$$$@@@~~.}9$@@$@@@$@@@@@$$@B$@$@@@$$g@@@PgKL *\\\" \\n 4M*$$$@@$$__ x$@@@@@@@@@$@$$@$$$$B@@$$@@W@R$E~_j!u \\n ^0MN@@@@$$wmys2@@@$@@@@@@$@@$$$$@0@@@@$$@s@@BR@@KK ' \\n \\\"\\\\3@@$R$@$$@$@@$@$@@$@@$@@@$@@$$@@@@@a@@B@E@E$0_\\\\ \\n ~WR#W@$s0@$@@K@@@@@@@$@@$f@@@M@@@@$g@K@$B$@0$P\\\"\\\" \\n ~^@QB@$~b$R@g$B@@@0$$@@@@@@gBB$$@@@B@@B@54M~ \\n )=W&@A4M@@$@@E@W@@2@B@gWK@gD@@@gEW${$#^ \\n /@TEEE`&A$#0y$@@Z$MM@$p$@0BtP5%@<l \\n '~XmT$E$W@MgyR$$aRs9gS4WW9/~ \\n ` f=L\\\"0EZW$@RPG%#$R{Rx{&''~ \\n `^`^ '`\\\"\\\\\\\"?~ ' \\n \\n\"\n },\n {\n \"index\": 15,\n \"distance_km\": 381331.9,\n \"libration_elat\": 0.836,\n \"libration_elon\": 6.123,\n \"ascii\": \" \\n . _, \\n __ . _ \\\" < \\n wz?^^\\\\^ `r={*_, _. ` ,, \\n .4fT '80@Ma<w% <,). \\n gg$$$$B@%K$YJi[ = \\n ___y, ^ji . . _ 'J$g$0F~~5\\\"*J:`6x\\\"i: \\n . #T5ZY ;`-,'_n-;)wyWB$@$\\\" aygg5B4W \\n ' g@9e@@@@Ea$$g@$@$R$$ j@0@@@KR \\n 2 +@@@y$$@$$@@@@@@@$@@RL_ * \\\\$@RRwgT^I \\n /jw 4$@@@$@@@@$@@@@@@$$@@@@E@$+ \\\"4\\\"'7Ak@^ w \\n .%g$ `@A@@@@@@$@@@@@RR@$@@@$@$E | TT@5 ' \\n ,&X<> `~?@@@$B@@@@@@@$@@@@@@$@@ _; ? MW { \\n 'MtJz. +^$@@@@@@@@@@@@@@@@@@@@$gG| _ay, *` ~GV \\n 5yjE@$yz(ny_y$ -@@@@@@@@@@@@@@$$$@@@@$$@ga@R$@T `\\\"- \\n IJEW#$@B4@@@@@KS1g@@@@@@@@@@@@@@@$@@@#@@@$B$R@7 '- \\n 2ZW@E$@&&$F~~. VB$@$@$@@@@$@@@$$@@$$E@$@@Z0$$$> y)' \\n ?%&$@$@$g@x{ _,m@M@@@@@@@@@$@$@$@@@$gB@R$$*$$Y@M 2 \\n ` %2@$BB@Rb$L@@@@@@@$$@@@@@@$@@@@@R@@$@$R$$$I2l_y> \\n `Wkg#@@R@$@@@@@@R@@@$$$$@$@$@$%@@@B$a$Rg@@@g@@Pp+' \\n 74&$R@WM@B@@$RR@@$W@$@@@@@g@@@@$gRbEB@@W@@E@@&; \\n +E#@$am@0@B$@@@@$$$@$$@@@gW$5@@$@@$d@@BgRR^^ \\n `\\\"@S@$MM$3RRE@$@@$$$MW@R$$BR#@$@@@%$%@< \\n ` J8MqG_3=AM$$a@@@W$@@@$@@$aR@R?Tx~' \\n \\\"|QT4RARm4$*ARQsGW@EaRP7$TTP~` \\n ~- zMeeE65tsF0g12$Lb9X^ \\n ` ' T~F~~ ~^`` \\n \\n\"\n },\n {\n \"index\": 16,\n \"distance_km\": 381859.3,\n \"libration_elat\": -2.705,\n \"libration_elon\": 5.978,\n \"ascii\": \" \\n . . \\n . ___ L._ ^; - ( \\n mze^^`\\\" '~~RX_ \\\" . \\n .tv? `B$@lglu- | . \\n . pggR@@$@EZ:dFR, \\n wax_. y_ R0ER$@f4$WyCW?w:v \\n !. ~TT%~_.\\\"u_Jw__j*E_x$@g@H ~\\\"'J_ jQtjj \\n [ $$bdB@@@@W$@0$E@@@Q$ . '@$@zNBcX \\n [| \\\";g$@@@$@@B@@@@@@$E$@@@ :. 4@B5@R%(` \\n jyMy t@$@@@@@@@@$@@@@@@@@@B@%y1_ . Zf$RK@CG# \\n vNt` Pg@@@@@@@$@@@@@@@@@@gB@$F'~ F WB@' \\n 8j@~w - ~f@@@$@@@@@@@@@@$@@@$@@L. ' `\\\"?_ \\n AM$@Zy . . .`w@@@@@@@@@@@@@@@@$@@B@$_i yL \\\" yN).P \\n )jy@0@h@~LsgyggaR@@@@@@@@@@$@@@@@@@@$@@@g_g$$v;^ 7N \\n !VH#$B$g$$$@@@$7k4$@@@@@@@@@$@@$@@@@@@@$@$@R@@a \\\". \\n '5SBBR$Bg$$F {f$@@S@@@@@$@@$B@@@B@@$g$@B$$$[, 4` \\n 1X@8@@2@@$hg __W@B@@@@@$@@@@@$@@@@$@$@@@@W@B$y_ M/ \\n JQRB$D@$$@2$g$$@@@@@@@$@@@@$@@@@@$$@$@@R@@WWkFV {\\\" \\n '@@fF$@0@@gR@@@@B$@@B@@$@@@$@$R@sM$@@@$$@$$@WwgW\\\" \\n `@V$4$ER$$E$$@@$@@g$0@@$@@@$@B@$$@$5@B5@@@NT3~; \\n {~$M@@E$@$@@@$@@$@@@$$@s$$9@$@@2$@4@@RK$T@@^ \\n ^ FqR#mZ3JH@Wgs$$EBW$@Z@0MWg@B@@$WM$B55? \\n ~^k/1ayDgW$$#$00B@$@$2Kg@$$Eg$$$\\\\$' ` \\n ^+K^YG#%gWa9Ra@@9MT$$EZ@@~wO=\\\"' \\n ~ `-%Hy~T@@M?a4%M$\\\"^k( ` \\n ~' `~P!+^^ ~` \\n \\n\"\n },\n {\n \"index\": 17,\n \"distance_km\": 383889.6,\n \"libration_elat\": -5.925,\n \"libration_elon\": 6.256,\n \"ascii\": \" \\n _ . \\n . ' _,._ ' .:_ \\n .nzF'~-^`Fnrj__ . \\n aF~ ~ `!Hyw_g_ w. \\n . ` xygg@@W#k,=|l. \\n _gwa; _wJ ($@9@@d@@\\\\W^@K_ . \\n _ t~\\\"$~_ ,_W_z+'_jz. y$@W@\\\" ~~kfX#~5i; \\n /\\\\ '.3@$@@$$@$$@ss@B$W@$MC 4m9p6b>{ \\n G5[ _. ,$@@@D$$@@$@@@@$@@0@0@~ 0@$$B$$ \\n .}2A> 9$@@@@$@@@@@@@@@@$@@@BaL ( \\\\$FgY$HX; \\n M@@Bq . H@@@$@@@@@@@@@@@@@@@@$W@s \\\"NV^?$g_\\\"M \\n jW@%y@ ~ . r ~@@@@$@@@@@@$$@$@$@@$@@ *#$m \\n &U*&WMW y _pG$@@@@@@@@@@@@$@@@$@$@@F \\\" ='$, ' \\n (T$Rg$@@E$w@g$@W$@@@@@@@@@@@@@@@@@$@E$@gy _y_ | `v</ \\n &&mV$RB@@R@@$##K$s@@@@@@@@@@@$@@$@@@@@@g@ya@$Em ? \\n `5VA$@$@g$RE`, @B@@@$@@@@@@@$$@@@@$$g@$B@y$$\\\" _ \\n v<Aqs@R@B@E9_yy@@@@@@@@@@@@@@$$@@@@B$@g@@E@@@$\\\\ ,> \\n $AR$Bg@@$$@sR$@@$@$@@@@B@@@@@B@@$@@$@$MG$0@GlWw ; \\n ~~qZ$BRgZ@@@@$$$@$@@E@@@@@$B@@$$@@@$@M@@$aRfM~,, \\n ^R*@@zZ$@$@h$$@$@g$B@E$$@@$$A@@@@$@$BWWE@@B@) \\n 79@@gW$@gg@@@R@$@$@R$D$@@@$@@@WB$$RXBBgM5[ \\n {JGKRHk~@@g$$R@$Ez@@$$$@$@0$@$@$EB@@RMX~ \\n &@R2$4yKBbAER@@R$$dW@@g@@@D$m@@XN`\\\" \\n ~^u\\\"?F4KPEz$$$Z$#@g0$&@@55M@v\\\"~ \\n `~-Xw7PPe=TA4jzFW<_t^' \\n \\\"^r-^^^ \\\" ` \\n \\n\"\n },\n {\n \"index\": 18,\n \"distance_km\": 389306.6,\n \"libration_elat\": -5.818,\n \"libration_elon\": -6.036,\n \"ascii\": \" \\n . _ \\n . ; ``( }. \\n w;MP|* =n>fsL ^ . \\n *|| `^RE@_}y_ 4ym, \\n . ,yAg@M$R2@L$RMw< \\n _w , . g@$$B@R@@m@y%B$@y,(k \\n ``~' x _yy.J$E@@BM~T@T@A$TM$gWg\\\"VL \\n .$x_gg$J0@a@@@@@@$@si aM$RB@AWMe/, \\n . . .g@F*g$@@@@@@@$@R@g@',_ z j$@$$@5$$W]`; \\n / j@$$@$@@@@@@@@@$@@$@@ygz@_ #@@@g@$@BEa<u \\n . . Jk4@@@$@@@@@@@$@@@@$@@$@$E ,7$2=@g$z&\\\"^KTL \\n /j A@@@@@@@@@g@@@$@@@$@BEgys\\\\ ' HB$@N ~P \\n h0L . >@$@$@@@@@@$@@@@@$@$@M@@6$_ .we{@0 .l \\n %>E$ -gsWw_^`RME@@@@@@@$@@@@@@B@@@$%#@$@~ y@# 4@*X|, \\n MRQ@K@@@hff $y$@$@@@@@@@@@@@@@@@@@@$$@@BE$\\\" \\\"4> j \\n L45B@MF . ~ZR@K@#B@@@@@@$@@@@@@$$@@@@0@R$ . x9r \\n {5S0g$_ , g$T9@y_@@@$@@@@$@@$$@$@@@$@$BWN\\\\ xkx ' \\n \\\"VM$g@$@R@TJ$$@@$@$@@@$@@$$@@R@@@@@$@0%@gg$$^;M<:X \\n \\\\ t@@g$$$@R$@@@@@@@@$$@@@B@$$$@@@@$$$E@@$M$yW`j+ \\n 'jj`R5@@@$@@$@$@$$@@$@$@$@@@$B$@@Wgg@$B@@W@>/` \\n \\\\^48R$@@$@$@$@@@@E@$K@@g@@@@@$@Z$$BW#sP#^| \\n '-:, {$MA@$@EZ5@@@@@$$@B$@@@$@g5$@Em9/^ \\n z~*gT6GfTA$H$@z5$Z$KREBa@3GW5#9\\\"^' \\n \\\" +?L$\\\"3f@@@1$E5$5F5$=Dj?$>?\\\"` \\n ~` ?tJjg#E@gH@~W$:` \\n '\\\"``\\\"' \\n \\n\"\n },\n {\n \"index\": 19,\n \"distance_km\": 390509.1,\n \"libration_elat\": 1.475,\n \"libration_elon\": -5.963,\n \"ascii\": \" \\n _ \\n - _ ` ... . \\n _r -- ~^<_)$w _,_ ` jy. \\n r 'g@$$$$x$yyMW_~:_ \\n .j$$@Bk@$@@W2gRZ@y\\\"<y \\n . NgM@R$~~4$RMgBM1%&E$jWy \\n w~ \\\" . y_y@@@@~ g@@B@m$#RKJ{ \\n ,, _s@@ngLg$5$@$@@'^ w _$$B@@$@W$Nrj: \\n g0Yw$g$@@@@$$E@$@@@yjy4_; 4@@@@@E@#Xb@X> \\n q@$Eg@@@@@@@$@$@@@@$$$s$a.-vI5MFT@@@a\\\\~ \\\\nW \\n _ d7@@@@@@$@@@@$@@@@$$$$@Jp@$@, . FR0@F j! \\n ' `+R$@@@@@@@@@@@$@@@@@$d@@@gLuy,r@@%Wk :f- \\n LF C@@@$@@@@@@$@@@@@@@B@@@@$@@@wcHPT \\\"%bs/1+ \\n NU_+ __ 7^y$$@@$@@@@@@$@@@$@@@@@$@gR$ . '#~w: \\n %_W<_ygBR (=yB5$@@@@@$@@@@@@@@R@E@$@@@@@gW !M' \\n (Rg&@@~ *B$$@FRR$@@@@@@@@@@@@$@@@@@@s@EgW,y*RGvW+ \\n K0@2@ w@#@$yX@B@$@@@@@@@@@@@$@@$@$g@@@@$_P%y~'' \\n ^`gM@@EyyWH_$$0$@$@@@@@@$$$$@@$@$R$B@$E0BG$aH@@+J/ \\n ^N4@$@M@E@$ER$@@@$@@$$@@@$$@@$@@@@@$$W@@@$@Rz#7 \\n ^,W$FH0$@@@@$$@@@@@@KR@$@@@@$g@B@B#@0Z@B4Y$0v \\n Yx*BK$$@@@$BZ@@@@B@@@@@0@R0@@@$@M@$B#0@K~ \\n '~~~}3?RA@$@$R$@BW@E$$gB$@$QM$#@@@kF}F\\\" \\n \\\"(4w~2#$n#M0@HW@$@9@@Z@AB)EKfBF'. ' \\n '\\\\D?^X0@$$g%4s7@RB4$9%Z_w~, ' \\n ~^^P&Y\\\"r*?59P44M%J~5~ ^ \\n `T~'\\\"`\\\" \\n \\n\"\n },\n {\n \"index\": 20,\n \"distance_km\": 391670.0,\n \"libration_elat\": 5.642,\n \"libration_elon\": -5.869,\n \"ascii\": \" \\n \\n x`! \\n | ;! ^\\\\+e%*_,<- ,_ _pK+ \\n ..F ggg$Z%92kyBWWyC /. \\n wg@$E$$@@K@Rg$7QRvx$t,_ \\n . a@@B$\\\" ~~\\\"WRux$$@g@@$}L \\n i ` jLyA$@@$ \\\"0@@@@s@KRM*W{, \\n _ gg-N<gyg^@@@R@> _ J X@#$@$@05&3x2=. \\n _@_7&$E$$@@@@y@@@@$ggg0= . 9@$P5$$gb#~ \\\\M$. \\n _ag$W@@@@0@@@@@@@@B$@@$@R'yy.^~ R@BK/ &) \\n . .F@@@@@$$@@@@@@@$@@@@$$$g@g@gw_ .w*y#@K_ }W \\n k ` ]y@@@@$@@$@@@@@@@@$@$@@$@@@gF/g@t='4@$$/O \\n t5$M$@@@@$@@$@@@@@@@@@$@$@$@ERF` ^~1.4/ \\n jy . `E_2R@@@$@@@@@@@@@@B@@@@@E@$$gQ ]<W L \\n 4;,-ag@$4.gg$R@$@@@@$@@$@@$@B@@@$@@@@@sBFy_ ua9mm7W \\n \\\"Y#@%$@^~ 0A@$$M4R$$@@@@@$$@@@@@@@@@@$@@W@$@r&MMMx# \\n ^@K$g@ a$*R$gg$@@@$$@@@$@@@@@$@@@R@$@@@E$$$0V$R \\n 0W$@ja\\\\_$@`$$B$@$$@@$$@@@$$$$$@$@$$B@$@@$@22@$@t\\\\ \\n <P4m$W@@@$@2@@@@g@@@@@$$@@$@@@@$@@B$2R@@@$@Eh(` \\n `TSsW@@R$$@@$$$$$@$@5$@@@$$$@$@$B@$@@@$gRRs5' \\n `^}&`$b$$@gH$@@$@@@$M@RM$g@@$@@%$N@R@5\\\\R\\\"^ \\n >j?\\\"T#M$0#@@@g@R@@Dg@$$@$$$@b0B@E@#^` \\n `? <L. k45k~F@E#@@0$T@BE@#5@$?6m-, \\n 4K?4Y($GE4zR@5g$$EEgBngK\\\"_>-~ \\n `~>?^4 MMKqZR@Ds!=`(' ` \\n `' ` ` \\n \\n\"\n },\n {\n \"index\": 21,\n \"distance_km\": 393407.6,\n \"libration_elat\": 5.513,\n \"libration_elon\": 5.636,\n \"ascii\": \" \\n \\n . ^ \\n LNV' `T~{$b_ -, \\\" . \\n _j@' <R@$mW$wxt!mn \\n ~ g@@@$@$@@'Yq\\\\as;' \\n g@@$6^ `P ~<\\\"_M@yMj \\n _g%n- z+ sEyg$@$@' ~M$g$M$sX \\n \\\" 'a(_ra@g@@$@$g2$$$@@ f4g$gA@4M \\n `$@@y$Z@$@@@@$$B@@@@g$_y, *@7M?$$N~'\\\". \\n ^ _H@@@@@@$@@@@@@@@@@@$$@@5~ ,. `B@N_ \\n ;yK `gR@@@@@@R@@@@@@@@@@@@@$$_ ` w=~@L . \\n <$\\\\ ~?@@$$@@@@@@@@$@@@@$@$@@yk `W@! ,I? YP( \\n -JMw - 3B@@@@@@@@@@$@$@@@@@$@@@Mz@B@#! \\\"^ \\n \\\\Xw$g _ . yJ_\\\"BB@@@@@@@@@@@@@@@@$@@@5@$@2BR[ ./ \\n FP@w@g$_n@$@@M@*y$@@@@@@@@$@@@@@@@B@@2$@M@@@e> .W' \\n y#@$@@@@$$~~ ~4$@@$@@@@@@@@@@$$$@@@@@$$@MBER$%< <^' \\n l6$d@@@B@L a@@@@@$@@@@@@@@$@@@@E@$$@$B@Rm@\\\"_/, \\n BM$g$@5gmezvB$$$@@@@$$@@@@R@@$$@@@$@#$@@@@R$$@(.` \\n ~12KMy@R@@$@$@R@$$@@@@@@$E@@@AB$A@@@AR@@@@KE@Gz \\n '@kRM@$@$@$gR8@@@@$B$@R@g@g@@$@@$@@$Ra$@@@$Z` \\n ^?WE@x@@@@@@@@$$b$@g@@@@@gB4@$R$BBMRMyTT' \\n \\\"4QB@@@M@$R$@$@@@$@RE@@@A5$R@BQM@M#P\\\\ \\n ~^@j@&_gm$@%4T$B@@@W$@@UK@#W7~7' \\n CtHP@$02WR@14@5Z2FA#3j\\\\J: \\n '\\\"r'F5$~(G@7_$TM$4>^ \\n ' \\n \\n\"\n },\n {\n \"index\": 22,\n \"distance_km\": 395633.7,\n \"libration_elat\": -2.548,\n \"libration_elon\": -5.238,\n \"ascii\": \" \\n \\n `` , ;/ >_, \\n ,_ +,P> * y _ ~ 'u_ \\n :{T` `~=$WWk_r, _#P+ \\n ~ _yD$@@g0Es&#ZB@'x. \\n _ , @@@@Ea8@@bEY$@@sGL2t \\n f^ Y '' . .w_ _$@@B@' `=3'25Zp$$>a#Iu \\n g_:.g$_RMzy$U$@@$#E7 . Rg$@$@HgaEK` \\n $@wR$@@@@$@$@$@$$@!y- g! .g@BB@$@$$M,3 \\n . -@@@@@@@@@@@$@@$$@@@$@s$L ?BB$$B$@RMXFW, \\n ` ~C$$$@@@@@@@@@@@@@@@$@@@?E_;]=^ 1@@WE {( \\n >M `RZ$$@@@@@@$@$@@@@@@@0RgB2r ~M@$_ 4' \\n (@+ . %@@@@@@@@@@@@@@@$@@@B$$$R@$w+ ~A_52v_xr \\n ~^MkFwa-wK `XF2@@@@@@@@@@@@@@@$@$$@@@$$sA^ ' ~@$}'^ \\n w$$$g$@$N`wty@@@$@@@@@@@$@@@@$@@@@@$@B$#_ `_' \\n M$@B$g^ AB$@$R$R@@@@@@$@@$@@@@@$$@@$@G( y,]\\\" \\n ~sf#R@,_ y$H@@$B@@@@@@@@@$@@@$@@$@$@$5R$yyw-^W4h; \\n I}V5@K@@ME+R@@@$@$@@@@@@@@$$$@@@$@@R$$BgF4@_'T#_ \\n m\\\"y*$@$#@@@@$@$@K@@@$@@@$@@@5$@5@@@B$B@@@RQ@_X` \\n ~\\\"$~@g$$R$@@$$@@@@@@$@$g$@$R$@B$g@E$Z@@@$sx. \\n ^FP$@$@@@@@@$@@@$a@@$$$@@$$g@@A@@g$@@@5VF \\n ^ ~/`~$@K@@$@@@@$AE$@0@@B@$B$@a4?P@P\\\" \\n uW&\\\\@m@ETRDH@Hg$sRgS@E&N@5@%6^X \\n ' u3@#pME@RS@PQ4RWKRMkz@ `. \\n r{^M=Fi@9#KEP(K7~/ \\n `~ \\n \\n\"\n },\n {\n \"index\": 23,\n \"distance_km\": 396804.0,\n \"libration_elat\": -5.205,\n \"libration_elon\": 5.066,\n \"ascii\": \" \\n \\n T - \\n .x*zZTn>-- _ . . \\n .. a_0F ~` n4M_;. ~u. \\n '~ ,^@g$$gw_;kw, \\n . ._w{ , __' r@$R$R#@$tfU~_x;. \\n . ?X?E$`_~G _: __+ _@E$@^~~?kic%\\\"$/$ \\n p @B%<#$$y@$W@$@@6@$@F y@_z@sl| \\n n__ _M@@$z#$$@@@@@@@@4$0@ `A$@@g$( \\n 4JK& , g@@@@@@@@@@@@$$@@@$@@$( # 9gKzgW&\\\\ \\n jD@z_ +#@@@@@@@@@@@@@@@@@@B@W@m hN~\\\"5#F^ \\n ?7#.@ 1 \\\\r ~$@@$$@@@@@@$$$@$@@@@@ < 'MRy V \\n N%P#Rg _ ~W@@@@@@@@@@@@@@@@@@@g$,' -. r~$, j \\n NGqQ@@$Ejy$gg$2s@@@@@@@@$@@@@@@@@@@5@@a,{Zg, ; ^ 0< \\n (3H4@@B@$@@$#=~t0@@@@@@@@@$@@@$@@@@$@@$@@$@$$ ' \\n `4Hg$B@@@$F`. \\\"4@@@@@@@@@@@@@@@@@@@@E$@$$e@W, j \\n KR$$bR$$@gZ_vzg$@@@@@@$@@@@BB@$@E@@gB@$-g@E$) \\\\` \\n Eeb@@$@$WgW@@Eg$$@@@@@R@$@$@$@@$@@@$B@$f@R)P@ . \\n ~75RR#$@$@@@B$@@$$@@@@@@@@@@@$W@M$$BB@$@E2B_jn^ \\n =W%B@_@@$B@@$$@@$@$@@B$@R@B@@$@@M$@D$$@RMBX \\n ~~#M@0@M@@@@@@$s@@$$$BE@#@@$@W$@$g@B@B@>~^ \\n ~#w7%,wRG$@M$$@@@$@$&$@$@@$@@M$gRR@^^ \\n Ry$aG0$#MM45$$ZZR@$a3@@0@$R@2pM` \\n `'=4Kh5M$K4AN*@tSd$sT&C^~} '` \\n \\\" ~TF_75@RgmF4`~ \\n ``~``` \\n \\n\"\n },\n {\n \"index\": 24,\n \"distance_km\": 396918.3,\n \"libration_elat\": 1.016,\n \"libration_elon\": 4.987,\n \"ascii\": \" \\n \\n ~ r .:c . \\n . ju ]>_^*Y=yL ' ` . \\n .W> m@wy+l_ M~ \\n ` ,ggm@Eg$WRwx_!_ \\n . L$Eg@K`4$_dW$ \\\\wY \\n _R4B$ ~).{. ,.sELgB@$E. ` yWw4aggy: \\n `7kp>_ggy#Tg@$M@$@Wg . `4@$@R$@y \\n ,$@$g$@@$$@@@@@B$@@$y_ - ?ER@22R]>, \\n >. ,. 1z@@@$@@@@@@@$@@@@@@@@$@gp `\\\"@~~2$$Y^~) \\n vZr BW@@@@@@@$@@@@@@@B@g@@gB 7 jY$l \\n 4v$y . ` ~@@@$@@@@$@@$@@@$@@@@@. - \\\\Y4w ) \\n }A_z, ' ;;@@@@@@@@@@@@@@@@@@@@g$sI W*_ ,{^ ^@L' \\n T@#R@yy).y__$W-y@@@@@@@@@$@@@@@@@@@@@@$g@@$$( \\\"I \\n .X@9a$@gy$@@@$$=$g@@@@@@@@$$@@@@@@$$$@0$@@$#f >J \\n 9D$$@$@R$R JB@$@@@@@@@$@$@@$@@@B@g@@G0@@D_ N \\n :s$E@a@$@my _ggB$$@@@@@$$@$B$@$B$@@@BE@E0MQmM / \\n 7X@@@R$@@@@ggR@@@@@@@@@@$@$@$@d@@M$@$$W@@g@Ly$M) \\n myX$$K$@@@@@B@$@g$@$@@$@@$$@@@$@$@$M$$@@@$@g/l \\n \\\"?-&@@Z5$@@g@$@@@Q$g@$@$$@@@@$$@@R$@@W@@@gMG^ \\n \\\"7#5@0E@@@@Z@B@$B@$@@@$@$B@@@@B@$5$$$@R$'\\\" \\n \\\"0M$M4FD@@$@$@$$@@RB@@$@$E$RN0$PW0~~ \\n ~5@<X@$0j@$#~$B@ZE@$gR%RA0EM7?\\\"~ \\n '*TT3m4aH@2@RW$3M$P=BzR)^: \\n ` A<?X%f_WmPg@EM-`\\\" \\n ` \\n \\n\"\n },\n {\n \"index\": 25,\n \"distance_km\": 402200.1,\n \"libration_elat\": 0.434,\n \"libration_elon\": -3.119,\n \"ascii\": \" \\n \\n \\\\ r \\n ___< *r z_ ? \\n . ~ `''P0wvzkyu _M:n. \\n v __$B$MRM#%e$XgZLn_ \\n ` 'd@$B@b4@$%%%@M@4drY- \\n +A 5 ~ .___a$@$$~ ^``R$w$$#@@G~, \\n v2x a@y*HkW$R$$$8yP 4$@bB$$@$@w: \\n g@_D@$@@@@@$@@2$$@_.Jy\\\\ BR$@@@$E6Rw& \\n ug@@$$@@@@@@$@@@@@@$@@@$:, &#MF2R$EW~'/W \\n x `E$B@@@$@@@@@$@$@@$@@@@%~(ye ` 44$#F 'r \\n !, 5y@@@@@@@@@@@$$@@@@@@y$$yw . ,*YMEG > \\n 4[$ j 32@$@@@@@@@@@@@@@@@@@@@@@$MM`_mMF =bb^\\\" \\n 45tgy: _ g_ .\\\"R$$@@@@@@@@@@@@@@@@@@$$@@@@$` . ''4* \\n (j@$aDB@@%X Ly$@@@@@@@$@@@@$@@@$@@$@@g@$a_ W, \\n (@0R@E@' `5@@@@$$$@@@$@$@@$@$B$@@@W@$M$PL_ yr/. \\n Jm4XR@9;_ _ggF0@@@$@$@@@@$@@$$$$@@@@@$$@KZM@';e!j^ \\n 3Y@M@$@wy$E_5$@@@@@$@@@@@$$$@$$@@@@@@@$@$WZ$$~i^ \\n t)753M$@#@@$@$@@@@@@R@@@@@$@E$@@$$B@$W@B@@$Gl' \\n V@G~@g$$0@@@B@$$@@@@@@$$B@@$@$$$@$WR$WW$W<( \\n ~%p2#B$@$@N05@W@@@$$$$$$@@@@$@g$@@@M@Wz \\n ^~`/`^PW@@@@$@B$$E@$@$@$BBg@@WERKC,\\\" \\n 'V?hg$q#E2A@M42@g@GRMg@*wK@l~)' \\n {7$k$n5HMDA@wBF$%bwmyI + ~ \\n 'Y~~ *bv@4$$K'?~ '\\\" \\n \\n \\n\"\n },\n {\n \"index\": 26,\n \"distance_km\": 402352.2,\n \"libration_elat\": 5.638,\n \"libration_elon\": -2.986,\n \"ascii\": \" \\n \\n . . \\n __| -;<pN__ _ ~ g.. \\n xP' @R$@SpJV.$U4+^ \\n r~ _@@@BBR@@Z@HeP$@yl^t. \\n j@s$0\\\"`~R\\\\F$E,g$$gmQJi \\n - . ,. (_j$@@@\\\" MW@$0mA@E&n_ \\n ``, ysg\\\\%ygP5@$@$F /_ 4@$$@@0R@a\\\\j. \\n 2L @W$@a@$$@@g@$@@a~u@ %TBFg@$Z}'^`X \\n y$@z$@@@@@@@@@@@@$$@$@@~'.u.^ <@gK@ \\\". \\n . -@$@g@@@@@@B@@$@@$$@@@@$W$M-_ _>aMgz, 3' \\n ' `'~2B$@@@@@@@@@@@@@@$@@@@Bg@$@^`aE*~^kmz~ \\n F .D$$R@@@@@@@$@@@@@$@@@$$$@@@gg' ^$)(; \\n ,p y 'sF@$@@@@@@@@@@$@$@@@$$@@D2@y> ?^}, \\n !{P@_;A$@T$=L$@@@@@@@$@@@@@@@$@@$$@@@@B#RN_,x7Aw7 \\n 't$$R@@F~ `TE$#@E@@@@@@@$@@@@@@@@$@@E@@$0$@@P2|ctx \\n j$B@$# +@Mg@gg@$@@@@@@@@$$@@@@@@$g$@g@g$$$9vy! \\n >rQ@0EgWw@@%M$R@@@@@@@@@@B@@@@@$$@@@R$$@E@@@MPF/ \\n \\\"9?a$@@@@B@@@@@$@$@$@@@@@B@@$WRg@$R@$B@$$@WM6F \\n N~(@v$$g@ZB@$@@@@B@$$@@E@@@@@@b@E@@n$@ME2Vl` \\n `\\\"W@y0@B@$@$$@@Q$$$@@@BEB@@@@M@g@$R$$PV' \\n ~2@@~^TK$@#@@#@@@g@@ME$@$E$4#E@$4< ~ \\n \\\") u*yv2$2V5RW@W$RBW$g@RA[f(*`: \\n /*_\\\"<sd9t($5$$g$7RbJR*&7 ~ \\n ~~ #<`+MLN%~DJM/^ ` \\n \\n \\n\"\n },\n {\n \"index\": 27,\n \"distance_km\": 402371.7,\n \"libration_elat\": -5.458,\n \"libration_elon\": -2.965,\n \"ascii\": \" \\n \\n ..~ . . y , \\n ._wIq;ws _._ !`P- , \\n ,p4 ~ ^r*$_w... `\\\"5s. \\n ^ ,X@@$gWWm_aEKv \\n __; , .$@$$B9@@@$<@g$Wf\\\"x \\n -^??K `; _.. @@B@E\\\"~fMQ$a@=$RS_l. \\n , z__g@gWasw0@y$E@@RA yWa|B$4&jF \\n .g@$j@$$@@@$@@$@@$g$'' t@g@6@@%e ; \\n m+ @@$@@@@@@@@$E@@@$@@$yWu#~ K$g$B@#RPW\\\\ \\n v$. P3@@@$@@@@@@@@@B@@@@@@g9- ^4@YM@@g@! /: \\n >,_ ! 5$@E@@@@@$@$@@$$@@$@B\\\"p_* . 0$W# ' \\n v$g , / @@@@@@@@@@@@@@@@@@@@$N$j.$_ ,*=X@_ y \\n /a&yE)awgBw_M4@$@@@@@@@@$@@@$@$@@@@NK$$_'veMr^Z$Q` \\n #$N$$N@@MP M3L9$@@$@@$@@@$@@@@@@@@@@@M@$0~ `\\\"^ \\n #Z@$@$$^ 4y@@@M@@@@@$B@@@@@$@$Rg@R$@@yM \\\\\\\\ \\n K~@RBs`w_,j$F@@$Eg$@@@R@@@$$@@@@B@@6@@$$(, .qWe \\n x#W$$@$@@@$i$@@@@$$@@@@g@$@@$@@@@@@$5@B@Z0@ K{. \\n \\\\eM$A@$$$@@@$$@@@R@@@@@R$@$$$@@@9A$$$gBy_aa\\\\ \\\" \\n o7k@0BREA@@@@$$@@@$@$@@$$R$$W$@@@@$$g@P@b} \\n '83yFBA@$$M@$@R@$$@#R$@$@@$$$@@R@$g#bQH' \\n ^!w_'V@$@@Bg$$F@dM5$$@@@R$Z$@$@@@E/!' \\n =>fmMWEPSZM5RB5@A@B0$Ba$0$T\\\\A+(~ \\n ^ ^#~fAIf@@@h$M5p@JEkX^F'' \\n `' `P^@degNB+M?P\\\" \\n \\n \\n\"\n },\n {\n \"index\": 28,\n \"distance_km\": 403437.1,\n \"libration_elat\": 5.803,\n \"libration_elon\": 2.179,\n \"ascii\": \" \\n \\n . ; . . \\n . , >; =_z/r_ `^r- \\n .:=~ ~d@ywgyg_Ll]-1 , \\n >^ yg$$@4@@JWTg$9Gx\\\"; \\n gm&@M~~~#?\\\"EW_k@yG' \\n . ,+;_ r x ,Lym@R@s' $@g$@Ay?#._ \\n ~`<_ +gzwsAsAgs@@$z$* i N$$6R@$@/_. \\n ysGyBE@@@@@$@@$@$@Byw_r MDRBB@@^^\\\"t, \\n u$@@y@@@@$@@@@@@@@@5@$$F~^.+'' ABg( `- \\n . #P$@@@@$@@@@@@@@$@@@$@$L,w\\\" ; _-fR1 > \\n Ae ~~@E@$@@@@@@@@@@@@@@@@$LmmyEZY uz&\\\\\\\"H*X~ \\n .N^ - JD@$@$@@@@@@$@$@@@@@@@$@$$M@WZ ^^X \\n tzg _J rT$@@@@@@@@@@@@@@@@@$@@@@$0$$R_ ^C \\n v%W4g~e$$@@[E=L$B@@@@@@$@$@$@@@$@$E$@@$$BRP_ ym/ \\n ^y@$$N@@@~~ 'fE$@@@$@@@@@$$$@@@B@$@B@@@@@@$@Wi G\\\"+ \\n Kf$$@$9$_! q$@@@@$@@@@@@@@$@@@@@@@@@@g@BXgy2${z \\n !t2@eQ0gggN@@@R$B@$$@@@@$$@@@@@@@$@$$$$gA$A$gEm| \\n `@k2W$@@@R$@Bs@@@$@$@@@@@@@R@@$@$@@@BgW@@@R2{\\\" \\n T3za@@0$$$$@$$@$E$@$@$@$0W@@@$@$$$R$ZR@B@Fs~ \\n `zRMy$@@0@@@$@@@E@@@@EhM@@@@@$2p@5gW$~~\\\" \\n `^?&$W@5Q0m@@@@$@$@@$$$3$k@@@$PGR$F~ \\n `]U_#x$2$@$Iy$@k0M5F@@kY@%mr~^~' \\n \\\"k?RK@F4@$&Gg$RMF4C@XV? \\n ` '^-~'~'7MA*Z%T~~ \\n \\n \\n\"\n },\n {\n \"index\": 29,\n \"distance_km\": 403723.3,\n \"libration_elat\": -1.613,\n \"libration_elon\": 1.645,\n \"ascii\": \" \\n \\n .. : ;-. \\n +y__ Jv/ , {! .. \\n _W~ ` ''YIg>*g,.,,{<. \\n J\\\" ug@@@@0@fvN2R_, \\n R@@$@R$@$5M#WhE. ; \\n x04s* ^l __ :_, 4$g@$' `P\\\\^fPjAbyK}. \\n 2_>iWayKQysg$@$@$#@ R$@ZAW05_ \\n $@KZ@@B@@@@@@@$@R$w / v@@$@@5@x^ \\n ._ g$@@@@@@@@@@W@@@$@@@gy4} <g9@MMMZXR^. \\n |$ ~B$@@@@@@@@@@@@@$@@D$@@@~\\\" : ~ #S@k \\\"! \\n jTg, ~4@@$@@@@@@@$@@@@@$@@g,z \\\" J~$w \\n ty%* ' 14@@$@@@@@@@@@@@@@@@$@KmYx*_u wm'%xuU \\n \\\\RA$x*Y_vygy-JF@@@@@@@@@@@@@@@@@$@@$by@WRmk^ 7N \\n ^@$@@@@@@B@TJ-$y@@@@@@@@@@@@@@@@@D@@@@B#@Y\\\\ : \\n 1W$#R$@@P . 7Hg@$@@@@B@@@$@@@$@$@B@$@K$@$*_ .GK \\n Y&2AMBgEi_._zgR$@@@$@@@$@$@@@$@$@@@@@@@@$@$g+ R~ \\n ?y2#MMW$@$$@BB$@@@@@$@@@@$@@@@$@B@$@$@gP$@~yy_': \\n =Wg@$@$@$$@B@B@@R@@@@@$$@$$$@@R$@$@$@@@$@R0@'< \\n ~%|A#Z$$@@2@@@@@$@@@@g@@0@@@$M@@@@R$@0@$@@U` \\n ~=Zy$$@@B$$$#@0B$$@$@R@$@@@@B@@R@@$ByZY~ \\n \\\"V~15P{24@0$@$@@R$Q@mBm0@@@g%8@B6M^~` \\n oFe$9Z52g$$$5EE#M$@@RKRVRmVY \\n ' \\\"Aw9@R4g$M$g$$$@9yjC~`~ \\n ' ^!`!~P%$%s-fr\\\"`~ \\n \\n \\n\"\n },\n {\n \"index\": 30,\n \"distance_km\": 404313.4,\n \"libration_elat\": -5.652,\n \"libration_elon\": 1.402,\n \"ascii\": \" \\n \\n +. - _ \\n ,-m1_yz_.l~ !]~J \\n _$#` \\\"` \\\"r|kz__L ` : \\n ^ ` .X@@$mWgy.ym?. \\n y_ , ug@@$H2g@R{MYW*r \\n +=hP# ft ._,. _ \\\"$$@$=~4@YByB?sHx \\n , .$K@VKyy$ssg@$a$$@@$T `` Zsi#R$64 \\n ^, -@@$2@$$@$@@@@g@@@$E . 7g@zag@/> \\n em\\\" .s@@@@@@@@@@$$B$$@E@@$y:u) /$@m$B@$X' \\n 3nM; t@@@@@@@$@@@@@@@@@@@@gQw {0~~$B#M\\\"'_ \\n dtyk ^$@@@@@@@@@$B@B@$@@@@E -/ ` M4E$ ~ \\n @mHA_ . r @@@@@@@@@@@@$@@@@$@@@>\\\" uX@ \\n K@3B@$y-$g$g.{A$@@@@@@@@@@@@@@@@@@@$@ D$E _ <~@e( \\n &Q$BBR#$@R== \\\\BW@@@@@@@@@@@@@$@@@$@$$$$$@$E # \\n z8M0M@@@E R@$$@@$@@@@$@@@@$@@@@$@@M4R5r -` \\n ?MBys$@$a_;wZ@@@@$$$@@@@@$$@$@$$@@$@R$@$$X< *# \\n tX)A@@$@$@$@W@@$@$$@$@@@$@$@@$$$$$@@$d$P6R@F r\\\" \\n ^AK@$A$$$gA@@R@@@@@$@@@D@$@@@@$@$QMZ@$@7e_am \\n ~b8kB$$BRB@@$$@@@B@@$g@@g$$@$$$$H$$$W$MMs( \\n `\\\"?4@@K4@g$@$@$@W$@$@@$g@$@$gB@@s@W$&@2l? \\n `0}3y_`M$@$$@$$BPd@50@@@@@@@$@@@TWT' \\n ^z\\\"4R$JBR_$5aR?@@2$@$@HBMA0#BF^ \\n `^ FTT\\\"$A#$RW$Z$y=Y%1@ ' ' \\n '~~A'FZ7I0~7?^^' \\n \\n \\n\"\n },\n {\n \"index\": 31,\n \"distance_km\": 404638.4,\n \"libration_elat\": 2.826,\n \"libration_elon\": 0.232,\n \"ascii\": \" \\n \\n . . >r - \\n ._:z m;-y., = . \\n n\\\\F` ^ `'3ggLtg$ p w5,r \\n ` jygM@Ea@GWyYMZ$_ i \\n M@E$$R`4@Z@dM^$RxI': \\n _qN$ \\\"_ . __pA@@$F `` a#92@@&8K? \\n `L- jyggSss_$B@@@D$ ^ @$$$$@$gC \\n ;@m_dR@@$@@@$@$$@@0yr R ;1@$@@@V3~?< \\n _0@@$@@@@@@@$@@@$$@@$g@$>+ Mt\\\" z@@0~ , \\n .j t@$@@@@@@@@@@@@$@$@@@$@m _4^. .~~@@_ ' \\n </ . ~@M$@@@@@@@@@@@@@@$@@$M$-xw,, '1J~#>,=| \\n +_' 1$@@$$@@@@@@@@@@@@@@$@@M$a@gu$Y ~TV\\\" \\n >Z@__, __y' r~@@@@@@@@@@@@@@@@@@@@@$$@$@HL ` \\n h4N@@JM$@$E^ ty@@@$@@@@@@@@@@@@@$@@@@@@@@R{ ,`( \\n \\\"R#B@$$$F` '@@$@@$@@@@@@@@@@@@@$@#@@$@B@W7gy {Y, \\n A$T@$$2- -gK$$$@@@@@@@@@@$@@$@@@@@@$@@IRF4yU~: \\n tdaN$@$@ym@&@@@@@@@$@$@@@0$@$$W@$@@@R@6$g@BD/+' \\n \\\" V8PMRB@@$@@@B@$@@@$@@$$@@@@$$@E@$R$Kb$A0s$W/ \\n ~wX@@MB$B@A@B@B@@M$Bg@$$@@@B@@@R@@@$B#B@MM\\\"' \\n 'Js$d@$$@$@@%$@$@@@$@$@$$@@$$R@9$MBMG#!' \\n ~4MR+e~Tb@@@@@@@$@@a@@R$@@9$m$Qm[Xn \\n `!~E6$5gM5W_RW@@@R$ER@b0bCs\\\"Q~ \\n `~-'UR?@9@-ER$@@5g2_wuhX - \\n 'FFF'\\\"Z\\\"@MGR^^'` \\n \\n \\n\"\n }\n ]\n}","import type { MoonState, RenderOptions, MoonAsciiDimensions } from \"../core/types\";\nimport moonData from \"./ascii.json\";\n\n/** \n * Fixed frame size in characters.\n * Width: 60 characters\n * Height: 29 characters\n * Characters have a 10:22 width:height aspect ratio, meaning each character\n * is roughly twice as tall as it is wide. This affects how we calculate\n * circular shapes like the moon's phase.\n */\nexport const FRAME_W = 60; // characters\nexport const FRAME_H = 29; // characters\n\n/**\n * Base angle offset for rotation.\n * This is a manual tweak to align the rotation with public well-known photos of the moon.\n */\nexport const BASE_ANGLE_OFFSET = 90;\n\n/**\n * Calculate dimensions and center point of ASCII moon art by finding non-space boundaries.\n * All measurements are in character units.\n * \n * This is used for phase calculations to:\n * 1. Find the actual moon size (excluding padding) which varies with distance\n * 2. Locate the exact center for phase angle calculations\n * 3. Determine the moon's radius in character units for phase masking\n */\nexport function asciiMoonDim(asciiArt: string): MoonAsciiDimensions {\n const lines = asciiArt.split('\\n');\n \n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n // Find boundaries of non-space characters\n lines.forEach((line, y) => {\n const firstNonSpace = line.search(/\\S/);\n if (firstNonSpace !== -1) {\n const lastNonSpace = line.search(/\\s+$/);\n minX = Math.min(minX, firstNonSpace);\n maxX = Math.max(maxX, lastNonSpace === -1 ? line.length - 1 : lastNonSpace - 1);\n if (minY === Infinity) minY = y;\n maxY = y;\n }\n });\n\n // If no non-space characters found, return frame dimensions\n if (minX === Infinity) {\n return {\n width: FRAME_W,\n height: FRAME_H,\n centerX: Math.floor(FRAME_W / 2),\n centerY: Math.floor(FRAME_H / 2)\n };\n }\n\n const width = maxX - minX + 1;\n const height = maxY - minY + 1;\n \n return {\n width: width,\n height: height,\n centerX: minX + Math.floor(width / 2),\n centerY: minY + Math.floor(height / 2)\n };\n}\n\n/** Clamp helper */\nexport function clamp(v: number, lo: number, hi: number) {\n return Math.min(hi, Math.max(lo, v));\n}\n\n/** Convert degrees to radians. */\nfunction rad(d: number): number {\n return (d * Math.PI) / 180;\n}\n\n/** \n * Calculate sun vector in camera plane based on phase angle, waxing/waning state, and libration.\n * @param phaseAngleDeg - Phase angle in degrees (0° = full, 180° = new)\n * @param isWaxing - If true, bright limb is on right; if false, on left\n * @param elatDeg - Libration in latitude (degrees). Positive tilts terminator up-right.\n * @returns Normalized sun vector {sx, sy, sz} in camera space\n */\nexport function phaseSunVector(phaseAngleDeg: number, isWaxing?: boolean, elatDeg: number = 0) {\n const a = rad(phaseAngleDeg);\n const elat = rad(elatDeg);\n \n // Base vector in xz-plane (α=0 full, α=180 new)\n const sign = isWaxing ? 1 : -1;\n const sx = sign * Math.sin(a);\n let sy = 0;\n let sz = Math.cos(a);\n \n // Rotate around x-axis by latitude libration\n // This tilts the terminator line by moving some of sz into sy\n const sy1 = -sz * Math.sin(elat);\n const sz1 = sz * Math.cos(elat);\n sy = sy1;\n sz = sz1;\n \n // Normalize the vector\n const mag = Math.sqrt(sx * sx + sy * sy + sz * sz);\n return { \n sx: sx / mag,\n sy: sy / mag,\n sz: sz / mag\n };\n}\n\n/** \n * Calculate Lambertian lighting intensity across a character's area using multi-sampling.\n * Each character is sampled at multiple points and the results are averaged.\n * This helps catch thin crescents that might only partially illuminate a character.\n * \n * IMPORTANT: No hard threshold here; we return the true average in [0,1].\n * Very thin crescents will produce small but positive intensities.\n *\n * @param xn - Normalized x coordinate of character center (-1 to 1)\n * @param yn - Normalized y coordinate of character center (-1 to 1)\n * @param sx - Sun vector x component\n * @param sy - Sun vector y component\n * @param sz - Sun vector z component\n * @returns Average intensity from 0 to 1\n */\nexport function litIntensity(xn: number, yn: number, sx: number, sy: number, sz: number) {\n // Size of a character in normalized coordinates\n const dx = 1.0 / FRAME_W;\n const dy = 1.0 / FRAME_H;\n\n // Denser 5x5 grid catches sub-character crescents better than 3x3\n const offsets = [-0.5, -0.25, 0, 0.25, 0.5];\n\n let total = 0;\n let samples = 0;\n\n for (const ox of offsets) {\n for (const oy of offsets) {\n const x = xn + ox * dx;\n const y = yn + oy * dy;\n const rsq = x * x + y * y;\n if (rsq > 1) continue; // outside the disc\n\n const nz = Math.sqrt(Math.max(0, 1 - rsq));\n const dot = x * sx + y * sy + nz * sz; // n·s\n total += Math.max(0, dot);\n samples++;\n }\n }\n\n if (samples === 0) return 0;\n return total / samples;\n}\n\n/** Find the nearest moon state from our pre-rendered set */\nfunction findNearestMoonState(state: MoonState) {\n // Weight distance more heavily since its range is much larger\n const DISTANCE_WEIGHT = 1.0;\n const LIBRATION_WEIGHT = 10000.0; // Scale up libration to make it more comparable to distance\n\n let bestIndex = 0;\n let bestDistance = Infinity;\n\n for (let i = 0; i < moonData.moons.length; i++) {\n const moon = moonData.moons[i];\n const distDiff = Math.abs(moon.distance_km - state.size.distanceKm) * DISTANCE_WEIGHT;\n const elatDiff = Math.abs(moon.libration_elat - state.libration.elat) * LIBRATION_WEIGHT;\n const elonDiff = Math.abs(moon.libration_elon - state.libration.elon) * LIBRATION_WEIGHT;\n \n const totalDiff = distDiff + elatDiff + elonDiff;\n if (totalDiff < bestDistance) {\n bestDistance = totalDiff;\n bestIndex = i;\n }\n }\n\n return moonData.moons[bestIndex];\n}\n\n/**\n * Characters have a 10:22 width:height aspect ratio.\n * This means a vertical step is ~2.2x larger than a horizontal step in pixel space.\n */\nconst CHAR_ASPECT = 22 / 10;\n\n/**\n * Rotates an ASCII image by a given angle in degrees (clockwise).\n * Uses reverse mapping (for each output pixel, find source) to avoid gaps.\n * Compensates for character aspect ratio (10:22) so rotation appears circular.\n * \n * @param ascii - The input ASCII string\n * @param angleDeg - Rotation angle in degrees (clockwise positive)\n * @param centerX - Optional X coordinate of rotation center (defaults to frame center)\n * @param centerY - Optional Y coordinate of rotation center (defaults to frame center)\n * @returns Rotated ASCII string\n */\nexport function rotateCharacters(ascii: string, angleDeg: number, centerX?: number, centerY?: number): string {\n // Normalize angle\n const angle = ((angleDeg % 360) + 360) % 360;\n if (Math.abs(angle) < 0.1) return ascii;\n\n const lines = ascii.split('\\n');\n const height = lines.length;\n const width = lines[0]?.length ?? 0;\n \n // Use provided center or default to frame center\n const cx = centerX ?? (width - 1) / 2;\n const cy = centerY ?? (height - 1) / 2;\n \n // Rotation in radians (clockwise in screen coords where +y is down)\n const rads = (angle * Math.PI) / 180;\n const cosA = Math.cos(rads);\n const sinA = Math.sin(rads);\n\n // Create output buffer\n const output: string[][] = Array.from({ length: height }, () => Array(width).fill(' '));\n \n // Reverse mapping: for each output pixel, find the source pixel\n for (let outY = 0; outY < height; outY++) {\n for (let outX = 0; outX < width; outX++) {\n // Convert output coordinates to centered space AND correct for aspect ratio\n // We treat X as the unit, so Y is scaled up\n const dx = outX - cx;\n const dy = (outY - cy) * CHAR_ASPECT;\n \n // Rotate backwards (inverse rotation) to find source position\n // Forward: x' = x*cos + y*sin, y' = -x*sin + y*cos\n // Inverse: x = x'*cos - y'*sin, y = x'*sin + y'*cos\n const srcDx = dx * cosA - dy * sinA;\n const srcDy = dx * sinA + dy * cosA;\n \n // Convert back to screen coordinates (un-correct aspect ratio)\n const srcX = Math.round(srcDx + cx);\n const srcY = Math.round((srcDy / CHAR_ASPECT) + cy);\n \n // Sample from source if in bounds\n if (srcX >= 0 && srcX < width && srcY >= 0 && srcY < height) {\n const char = lines[srcY]?.[srcX] ?? ' ';\n output[outY][outX] = char;\n }\n }\n }\n\n return output.map(row => row.join('')).join('\\n');\n}\n\n/**\n * Render a 60×29 moon using pre-rendered ASCII art.\n * - Uses nearest pre-rendered moon for distance and libration\n * - Applies phase masking via Lambertian lighting\n * - Fallback: if nothing lights up (ultra-thin crescent), select the top\n * illuminatedFraction of disc cells by raw incidence (n·s) to force a sliver.\n */\nexport function renderMoon(state: MoonState, _options: RenderOptions = {}): string {\n const options = _options ?? {};\n const showHorizon = options.showHorizon !== false;\n // Find the best matching pre-rendered moon\n const nearestMoon = findNearestMoonState(state);\n const asciiLines = nearestMoon.ascii.split(\"\\n\");\n\n // Calculate actual moon dimensions from the ASCII art\n const dim = asciiMoonDim(nearestMoon.ascii);\n \n // Sun vector for the given state\n const { sx, sy, sz } = phaseSunVector(\n state.phase.phaseAngleDeg,\n state.phase.isWaxing,\n state.libration.elat\n );\n\n // First pass: compute intensity map, raw incidence, and disc mask\n const intens: number[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(0));\n const rawInc: number[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(-1));\n const inDisc: boolean[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(false));\n\n let discCells = 0;\n let litCells = 0;\n\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n // Convert frame coordinates to moon-relative normalized coordinates\n const moonX = ix - dim.centerX;\n const moonY = iy - dim.centerY;\n const xn = moonX / (dim.width / 2);\n const yn = moonY / (dim.height / 2);\n\n const r2 = xn * xn + yn * yn;\n if (r2 > 1) {\n intens[iy][ix] = 0;\n rawInc[iy][ix] = -1;\n continue;\n }\n\n inDisc[iy][ix] = true;\n discCells++;\n\n // Lambertian intensity (averaged over cell)\n const I = litIntensity(xn, yn, sx, sy, sz);\n intens[iy][ix] = I;\n if (I > 0) litCells++;\n\n // Raw incidence at the cell center (useful for ranked fallback)\n const nz = Math.sqrt(Math.max(0, 1 - r2));\n rawInc[iy][ix] = xn * sx + yn * sy + nz * sz; // may be negative\n }\n }\n\n // Decide which cells are \"lit\"\n const litMask: boolean[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(false));\n\n if (litCells > 0) {\n // Normal case: any cell with positive average intensity counts as lit.\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n litMask[iy][ix] = intens[iy][ix] > 0;\n }\n }\n } else {\n // Fallback for ultra-thin crescents: rank by raw incidence.\n // Target number of lit cells proportional to illuminated fraction.\n const frac = clamp(state.phase.illuminatedFraction ?? 0, 0, 1);\n const target = Math.max(1, Math.round(frac * discCells));\n\n const candidates: Array<{ ix: number; iy: number; v: number }> = [];\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n if (!inDisc[iy][ix]) continue;\n candidates.push({ ix, iy, v: rawInc[iy][ix] });\n }\n }\n // Sort descending by raw incidence (closest to the subsolar point)\n candidates.sort((a, b) => b.v - a.v);\n\n for (let k = 0; k < Math.min(target, candidates.length); k++) {\n const { ix, iy } = candidates[k]!;\n litMask[iy][ix] = true;\n }\n }\n\n // Second pass: compose the ASCII frame (unrotated)\n const out: string[] = [];\n for (let iy = 0; iy < FRAME_H; iy++) {\n let row = \"\";\n const src = asciiLines[iy] ?? \"\";\n for (let ix = 0; ix < FRAME_W; ix++) {\n if (litMask[iy][ix]) {\n row += src[ix] ?? \" \";\n } else {\n row += \" \";\n }\n }\n out.push(row);\n }\n\n const composed = out.join(\"\\n\");\n\n // Apply rotation if parallactic angle is available\n let finalArt = composed;\n if (state.position?.parallacticAngle !== undefined) {\n // Use the full moon texture to determine the center of rotation,\n // so the moon doesn't \"wobble\" when it's a crescent.\n // We use nearestMoon.ascii which is the full texture.\n const rotationCenter = dim;\n finalArt = rotateCharacters(\n composed, \n state.position.parallacticAngle + BASE_ANGLE_OFFSET,\n rotationCenter.centerX,\n rotationCenter.centerY\n );\n }\n\n return showHorizon ? overlayHorizon(finalArt, state, dim) : finalArt;\n}\n\nfunction overlayHorizon(art: string, state: MoonState, moonDim: MoonAsciiDimensions): string {\n const pos = state.position;\n if (!pos) return art;\n if (state.size.angularDiameterDeg <= 0) return art;\n\n const altitude = pos.altitude ?? 0;\n const radiusDeg = state.size.angularDiameterDeg / 2;\n const topAlt = altitude + radiusDeg;\n const bottomAlt = altitude - radiusDeg;\n\n // Fully above horizon\n if (bottomAlt >= 0) {\n return art;\n }\n\n const lines = art.split(\"\\n\");\n const degreesPerChar = state.size.angularDiameterDeg / Math.max(1, moonDim.height);\n let horizonRow = moonDim.centerY + altitude / degreesPerChar;\n horizonRow = Math.round(clamp(horizonRow, 0, FRAME_H - 1));\n\n let label: string;\n if (topAlt <= 0) {\n const below = Math.abs(altitude).toFixed(1).replace(/\\.0$/, \"\");\n label = `${below}-deg-below-horizon`;\n } else {\n label = \"horizon\";\n }\n\n lines[horizonRow] = makeHorizonLine(label);\n return lines.join(\"\\n\");\n}\n\nfunction makeHorizonLine(label: string) {\n const normalized = label.trim().replace(/\\s+/g, '-');\n let content = `--${normalized}--`;\n if (content.length > FRAME_W) {\n content = content.slice(0, FRAME_W);\n }\n if (content.length === FRAME_W) return content;\n\n const remaining = FRAME_W - content.length;\n const left = Math.floor(remaining / 2);\n const right = remaining - left;\n return \"-\".repeat(left) + content + \"-\".repeat(right);\n}\n"]}
1
+ {"version":3,"sources":["../src/core/astronomy.ts","../src/render/ascii.json","../src/render/renderer.ts"],"names":["Astronomy","AstronomyNS","addDays","d","days","normalizeDegrees","angle","calculateBrightLimbAngle","date","sunVec","moonVec","sunEq","moonEq","dRA_rad","moonDecRad","sunDecRad","sinDRA","cosDRA","numerator","denominator","positionAngle","normalizeHourAngle","hours","h","isWaxingAt","today","calculateParallacticAngle","location","eq","siderealTimeHours","longitudeHours","hourAngleRad","latitudeRad","declinationRad","computeMoonPosition","observer","horizon","getMoonState","observerLocation","illum","lib","getMoonPhase","moonState","phaseAngleDeg","illuminatedFraction","waxing","a0","a","FULL_EPS","NEW_EPS","QUARTER_EPS","NEAR_FULL_FRAC","NEAR_NEW_FRAC","NEAR_HALF_FRAC","ascii_default","FRAME_W","FRAME_H","TEXTURE_ORIENTATION_OFFSET","asciiMoonDim","asciiArt","lines","minX","maxX","minY","maxY","line","y","firstNonSpace","lastNonSpace","width","height","clamp","v","lo","hi","rad","phaseSunVector","brightLimbAngleDeg","isWaxing","elatDeg","elat","sunAngle","sunDirX","sunDirY","sx","sy","sz","sy1","sz1","mag","litIntensity","xn","yn","dx","dy","offsets","total","samples","ox","oy","x","rsq","nz","dot","findNearestMoonState","state","bestIndex","bestDistance","i","moon","distDiff","elatDiff","elonDiff","totalDiff","CHAR_ASPECT","rotateCharacters","ascii","angleDeg","centerX","centerY","cx","cy","rads","cosA","sinA","output","outY","outX","srcDx","srcDy","srcX","srcY","char","row","renderMoon","_options","showHorizon","nearestMoon","asciiLines","dim","intens","rawInc","inDisc","discCells","litCells","iy","ix","moonX","moonY","r2","I","litMask","frac","target","candidates","b","k","out","src","composed","totalRotation","overlayHorizon","art","moonDim","pos","altitude","radiusDeg","topAlt","degreesPerChar","horizonRow","label","makeHorizonLine","content","remaining","left","right"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as AstronomyNS from \"astronomy-engine\";\nimport type { EquatorialCoordinates } from \"astronomy-engine\";\nimport type { MoonPosition, MoonState, ObserverLocation } from \"./types\";\n\n// Interop: in some loaders the API is on the default export, in others on the namespace.\nconst Astronomy = (AstronomyNS as { default?: typeof AstronomyNS }).default ?? AstronomyNS;\n\nfunction addDays(d: Date, days: number) {\n const n = new Date(d.getTime());\n n.setDate(n.getDate() + days);\n return n;\n}\n\nexport function normalizeDegrees(angle: number) {\n return (angle % 360 + 360) % 360;\n}\n\n/**\n * Calculate the position angle of the bright limb (direction from moon to sun).\n * This is the angle from celestial north to the sun's direction, measured eastward.\n * \n * @param date - The date/time of observation\n * @returns Position angle in degrees (0° = north, 90° = east, 180° = south, 270° = west)\n */\nexport function calculateBrightLimbAngle(date: Date): number {\n // Get geocentric equatorial coordinates of sun and moon using GeoVector\n const sunVec = Astronomy.GeoVector(Astronomy.Body.Sun, date, true);\n const moonVec = Astronomy.GeoVector(Astronomy.Body.Moon, date, true);\n \n // Convert to equatorial coordinates\n const sunEq = Astronomy.EquatorFromVector(sunVec);\n const moonEq = Astronomy.EquatorFromVector(moonVec);\n \n // Calculate position angle from moon to sun using spherical trigonometry\n // PA = atan2(sin(Δα), cos(δ_moon)·tan(δ_sun) - sin(δ_moon)·cos(Δα))\n // where Δα = α_sun - α_moon (in RA)\n const dRA_hours = sunEq.ra - moonEq.ra;\n const dRA_rad = dRA_hours * 15 * Astronomy.DEG2RAD; // convert hours to radians\n const moonDecRad = moonEq.dec * Astronomy.DEG2RAD;\n const sunDecRad = sunEq.dec * Astronomy.DEG2RAD;\n \n const sinDRA = Math.sin(dRA_rad);\n const cosDRA = Math.cos(dRA_rad);\n const numerator = sinDRA;\n const denominator = Math.cos(moonDecRad) * Math.tan(sunDecRad) - Math.sin(moonDecRad) * cosDRA;\n \n const positionAngle = Math.atan2(numerator, denominator) * Astronomy.RAD2DEG;\n return normalizeDegrees(positionAngle);\n}\n\nexport function normalizeHourAngle(hours: number) {\n let h = (hours % 24 + 24) % 24;\n if (h > 12) h -= 24;\n return h;\n}\n\nfunction isWaxingAt(date: Date): boolean {\n const today = (Astronomy.Illumination(Astronomy.Body.Moon, date) as { phase_fraction: number }).phase_fraction;\n const tomorrow = (Astronomy.Illumination(Astronomy.Body.Moon, addDays(date, 1)) as { phase_fraction: number }).phase_fraction;\n return tomorrow > today;\n}\n\nexport function calculateParallacticAngle(date: Date, location: ObserverLocation, eq: EquatorialCoordinates) {\n const siderealTimeHours = Astronomy.SiderealTime(date);\n const longitudeHours = location.longitude / 15;\n const hourAngleHours = normalizeHourAngle(longitudeHours + siderealTimeHours - eq.ra);\n const hourAngleRad = hourAngleHours * 15 * Astronomy.DEG2RAD;\n const latitudeRad = location.latitude * Astronomy.DEG2RAD;\n const declinationRad = eq.dec * Astronomy.DEG2RAD;\n const numerator = Math.sin(hourAngleRad);\n const denominator = Math.tan(latitudeRad) * Math.cos(declinationRad) - Math.sin(declinationRad) * Math.cos(hourAngleRad);\n return Math.atan2(numerator, denominator) * Astronomy.RAD2DEG;\n}\n\nfunction computeMoonPosition(date: Date, location: ObserverLocation): MoonPosition {\n const observer = new Astronomy.Observer(location.latitude, location.longitude, location.elevationMeters ?? 0);\n const eq = Astronomy.Equator(Astronomy.Body.Moon, date, observer, true, true);\n const horizon = Astronomy.Horizon(date, observer, eq.ra, eq.dec, \"normal\");\n return {\n azimuth: normalizeDegrees(horizon.azimuth),\n altitude: horizon.altitude,\n parallacticAngle: calculateParallacticAngle(date, location, eq)\n };\n}\n\nexport function getMoonState(date: Date, observerLocation?: ObserverLocation): MoonState {\n const illum = Astronomy.Illumination(Astronomy.Body.Moon, date) as { phase_angle: number; phase_fraction: number };\n const lib = Astronomy.Libration(date) as { dist_km: number; diam_deg: number; elon: number; elat: number };\n return {\n date,\n phase: {\n phaseAngleDeg: illum.phase_angle,\n illuminatedFraction: illum.phase_fraction,\n isWaxing: isWaxingAt(date),\n brightLimbAngle: calculateBrightLimbAngle(date)\n },\n size: {\n distanceKm: lib.dist_km,\n angularDiameterDeg: lib.diam_deg\n },\n libration: {\n elon: lib.elon,\n elat: lib.elat\n },\n position: observerLocation ? computeMoonPosition(date, observerLocation) : undefined\n };\n}\n\n/**\n * Returns the English name for the moon phase using phase angle (preferred) with small tolerances.\n * Conventions (Astronomy Engine):\n * - phaseAngleDeg = 0° → Full Moon\n * - phaseAngleDeg = 180° → New Moon\n * - phaseAngleDeg ≈ 90° → Quarter (half-illuminated)\n *\n * We fold angles > 180° into [0..180] symmetry and use `isWaxing` to disambiguate waxing vs waning,\n * and First vs Last Quarter. Illumination fraction is used only as a secondary fallback threshold.\n */\nexport function getMoonPhase(moonState: MoonState): string {\n const { phaseAngleDeg, illuminatedFraction } = moonState.phase;\n // Prefer provided waxing flag; if missing, make a best-effort guess from angle (ambiguous, but safer than undefined).\n const waxing = moonState.phase.isWaxing ?? (phaseAngleDeg > 90);\n\n // Normalize to [0, 360), then fold to [0, 180] for symmetry about Full/New.\n const a0 = ((phaseAngleDeg % 360) + 360) % 360;\n const a = a0 > 180 ? 360 - a0 : a0; // 0..180\n\n // Angular tolerances (degrees)\n const FULL_EPS = 10; // within ±10° of full\n const NEW_EPS = 10; // within ±10° of new\n const QUARTER_EPS = 8; // within ±8° of quarter\n\n // Secondary illumination fallbacks for robustness\n const NEAR_FULL_FRAC = 0.98; // ≥98% illuminated ⇒ Full\n const NEAR_NEW_FRAC = 0.02; // ≤2% illuminated ⇒ New\n const NEAR_HALF_FRAC = 0.02; // within ±2% of 0.5 ⇒ Quarter\n\n // Full / New via angle or strong illumination thresholds\n if (a <= FULL_EPS || illuminatedFraction >= NEAR_FULL_FRAC) return \"Full Moon\";\n if (a >= 180 - NEW_EPS || illuminatedFraction <= NEAR_NEW_FRAC) return \"New Moon\";\n\n // Quarters: angular ±eps around 90°, or illumination very near 0.5\n if (Math.abs(a - 90) <= QUARTER_EPS || Math.abs(illuminatedFraction - 0.5) <= NEAR_HALF_FRAC) {\n return waxing ? \"First Quarter\" : \"Last Quarter\";\n }\n\n // Remaining regions split into gibbous (near full, a < 90) vs crescent (near new, a > 90)\n if (a < 90) {\n return waxing ? \"Waxing Gibbous\" : \"Waning Gibbous\";\n }\n // a > 90\n return waxing ? \"Waxing Crescent\" : \"Waning Crescent\";\n}\n","{\n \"moons\": [\n {\n \"index\": 0,\n \"distance_km\": 405493.5,\n \"libration_elat\": -0.888,\n \"libration_elon\": -0.412,\n \"ascii\": \" \\n \\n ._ . - . \\n ,_++> a, +. `-. \\n zr' ^ ~\\\")ssy_ss_. e__ \\n ^' w3$B$#R$2tBW&`x. \\n M@$@@E@@$YAm5Q@s<T \\n _*4Fk ;_ . : _r 4$g$B` `T!~4Z HDb*y_ \\n 7w=:-yyXm#sg@$$@$#Z . R$@$@R$?@` \\n ,Z$Kj9@W@$@@@@@@BG@w., / e$$0@5@Bbl\\\" \\n } z$@@y@@@@@@@@@$$@@@B@w$L cyM%H$$WP=K* \\n /^ 9M@@@@@@@@@@@@@@@@@$@@$~ y, ?#$$; 'L \\n MF. ?E@$$@@@@$@@@@@@@@@@g *z'_. ,Z@@ + \\n >w% E@@@@@@@@@@@@@@$@@@$$$%>$k- `y*.~$xtv \\n ##y$_-_y_aL` ~@@@@@@@@@@$@$@@@@@$@$$yB@$$/~ ~^Q+ \\n kXB@@_g@@@A`wgy@@$@@@@@@@@@@@$@@@$B@@@$@$I ~_ \\n \\\"_K@$Rb$^ ~MW$@$B@@@@@@$@$@@$@B$$@@@@5%sW v$v+ \\n #U@W$9@W_ .yd@$@@$@@$@$@@@$$$@$$M$M@2B@&@zgM `\\\"+ \\n [F*$E$@g@d@RR$E@@@$$@R@@@@@Rg@B$@$@0$@2@@_ypJ~ \\n \\\\'MB@PR$@$@@$$$@g@@@@@@$$$$$@E0@G$@g@$$A$MgV( \\n ^>Y$W3$@05$@B$$$@@@@M@$@R@@@BR$0$a@$@$@$@K? \\n ~4&BWB@@@@@@@$@@@@$@@@@@B@$$@B$NEBgW$~^\\\" \\n `^^T&~v$R$B@@$@BB$$y@$$E@$$@A&N0M\\\"~~ \\n 'Nv?52EMJ!_@$5g@@$R@RA$@E@7nF\\\"^ \\n \\\"^ 74~0~#<ERggkA=s3p4yyL. ` \\n ` ``^^ ^@n8m+\\\"`^ \\n \\n \\n\"\n },\n {\n \"index\": 1,\n \"distance_km\": 361882.7,\n \"libration_elat\": 5.044,\n \"libration_elon\": 0.661,\n \"ascii\": \" \\n . -r.. \\n _1{ *~ ML1W>u, _ . ^.., \\n y/ ^w@@$@sEgg_9u_{_ \\n ` .yyB@$4@@@e#jmg\\\\Wk\\\"*+. \\n ` -@R4@sF~~$WJ'R/~Z$%bk~\\\\ \\n ,\\\"_ ^ . m _w@$@@\\\\ \\\\@Rw@$h@k@K7, \\n ~T'~. _y y-w(4$a$@$F@$ : 'Z@$@R@R$@L \\n _L_<A@@@gy$$$@@$g$@@g_ y -9@@@$@W#)y=k_ \\n a@@2g@@@@@@@@$@@$$@@$@$g$y. >3[~~QM$ZW\\\" ~_ \\n d$@@@@@@@@@@@@@@@@$@B@B@$%` ,M '=$$$ 1 \\n { #[$@@@@@@@@@@@@@@@@$@@@@@@x4# -w -r?M@w V\\\\ \\n ?% , 4$B@@@@@@@@@@@@@@@@@@$$$@@\\\"H[db^ sEM!^*aVc \\n y'_ jZ@@@@@@$@@@@@@@@$@@$@@@$$M@E@@$%~ . ~\\\"\\\\ \\n %vM_ _ _} \\\"0@@@@@@$@@@@@B@@@@$@@@@@@@@M@@Z* Pj \\n <5%BgP,vg@@$Yf`y4@@@@@@@@$@@$@@@$@@@@B$@@$@$@WzK yyu~ \\n @2E$gW@@5F~ 4@@@@@@$@@@@@@@$@@$@@@@$@0@$@@$g@n$sz`1H'i \\n +A@@$g$Z' _2$@@@@$$@@@$$$@@@B$@$@@@$B@@A$@4@#4yJj k \\n '&@K@@@HE__xamB@g@@@@@@@@$@@@@@$@@@@$@@@A@g04$Wg#HB7\\\"' \\n HeAERBg$$@$$A@@0@$$B@@@@@@R@@$$$@$@@$5@B@a@b@W@WEU. \\n (~4@@E@@@W@@g@$$@@$@@@0MRWB@@$$5$@@$0$$@g@$$$@eRr/ \\n \\\"gj4ZE4@@$M$@$@$g$@@$@@W$@@A@$@$B@B@EB@00BBWTlM \\n ^$F2@E$$$0@@@B@@0@@$@$@@$@gB@@$$EP$$$bRN#^~ \\n \\\"EZ8$ERAzBM@$B@@$$Z@ga@@2$@@g@0@9mwa4~`< \\n `!7RvsyJ_D$@~$0$$B@@@00%@$4AT2Ef7^< \\n T$('@KEWc54$2Z$M$R#@MUT@NK1 \\\" \\n `T^^+{$)$2a73I9;@%RcM`\\\" \\n ~'\\\"`'~ \\n\"\n },\n {\n \"index\": 2,\n \"distance_km\": 363474.7,\n \"libration_elat\": -4.493,\n \"libration_elon\": 2.394,\n \"ascii\": \" _ \\n . .- T - -, \\n -bZ?-aLrw*j_ : . \\n : _$Y^ ~ ^-XRyw|,, ~- \\n F`` _#@@dgsgs _2_! \\n _ : . y@@@@$zE$AD21ftW' \\n _yWBxm' *- : . __ \\\"N$@@UOF4@b\\\\%sB7WR.' \\n `s;wd__1 W_;Vn@yyag@$@5 `~ ,s,<%[gs/k \\n t$$2AW@@@$@@$$@$$@@E$# r . \\\"@@$D$Wjny \\n -:; . q@@@$$$$@$$$@@@@@@$@@@W _ K@5@$5E55Z \\n v2K ~0@@@@@@@@@@@@@@@@@@B@@$$ylD y$@@5d@~Ewx \\n _V$(. 7HB@$@@@@@@@@@@@@@$@@5$$@@F~ T d@gs | \\n /v a; ; ```@@@$@@@@@@@B@@@$@@@@@$@ ,, ' ^T0$ \\n L0@@$ v@$@@@@@@@@@@$@@@@@$@$@B;y: y,. +^ A$ , \\n \\\\b2Y$$E{x2gz@L=_D5@@@@@@@@@@@$@@@@@$@@@$y_tw$@_ u\\\"^ ^W%' \\n WLA$$@$%@@@@@B`Y=L@@$@@@@@@@@@$$@@@@@@$@$E@R@$@E \\\"{ \\n ]y@NB@@@$$F ^B@@@B$@@@@@@$@@@@@$$@@@@@$@s0$@Z . \\n {4X$@$@aR=e _R$@$@$$@@@@@@@$$$B@@@$@@@@E5@PYE\\\\ y) \\n @*AgMB$$R5aR@@R$g@@@@@@@@@@@@@$@$@@B$$#$@Qjm@TdW/ j\\\"/ \\n #aZW$MBMR@0@@@$@A@$@$@@@@$@$@@@W@$@E$@@$$WgHP%^~hu` \\n `%$0$F$@$0@@@@B$$@@@@@@$@B@@E$@@@%@$@@@@$@W$@$BZ~ \\n 4?9@dB$$R$@@$B$MB$@@@$$$$@$$@5@$@g@g@B$9b$@AZG \\n *E@R$MR$$@@AZ$$R$@@$R$5$@@@D@$$$$$@ZE3@@a`^ \\n AA-j_^AT$$E@E@$@$@$RB2@Wa@$@%R@@$5BT~v \\n ^@V%@5@Q5WXE@@@R2@@RWR$b@$4@$WXMW] \\n r'AF)[%st$@BEc$E@Bx?t5_@\\\"T`^ \\n ~^ !7iT5$Z@@R0HW~4! \\n ~ ~~ ` \\n\"\n },\n {\n \"index\": 3,\n \"distance_km\": 363808.5,\n \"libration_elat\": -0.275,\n \"libration_elon\": 0.915,\n \"ascii\": \" \\n \\\\ l.r \\n ._u:UK4 ^v w_ ~ ^\\\\ . \\n . . v> ` ` `^4@Rj_Qx__ MBm \\n .(~ 2g@$@@zgWi9%Qd|4 \\n {0@@$5@@@B~D#gmHgk\\\"M \\n _$g.y = _ _gDg$M\\\" `TYr~Z^ 1RvqF^ \\n \\\"~`K'.:,_L _w_s2@y$$$@@R` !@%g@R*Mz#{ \\n . &yg^YR@@s@$B$@@@@@W0Z ,@$0@$BRXU \\\\ \\n w@@$f$$$$@@@@A@@@$B$@@&_ G; @@@B@@Zj0k#x \\n M g@@@@@$@@@@@@@@@@@@@@@$@@@$+- -MM~~W@$# `!v \\n !Xe =#$@@@@@0$@@@@@@B@$@@@$@@. =r . 44$$ ' \\n M]| . \\\"@@@@@@@@@@$$@@@@@@@@@@$xfi m . wu=Az. $ \\n `[#< J@@@@@@@@@@@@@@@@@@@@$@@g@_42s_ y?% ^K}@! \\n <my$yy} ww,a_ .~$$@@@@@@@@@$@@@@@@@@R$$@B@@@$zs' ~`~ \\n XNv9$@p$$@$$E3L*y0@@@@@@@@$@@@@@@@@@@$@@$@W2@gM- -. \\n 'Vd@$Z@@@@\\\"` $$@@E@@@@@@@@@@@$@@@$$$@$@@$@$NKc . ,j1, \\n wkBQR@@%k,! ,z@R$@@@@@@@@@@@@@@@@M@@@@@@$$@Wg\\\\$g* %>V \\n `VJ$$s&0Bv_J$$0B0@$$$@$@@@@$@@$@$@$@$@@$$$@@@f@YF_L` ' \\n ??K#gZ@@$@@@$s2$$@@@$@@@$$@@@B$@$$$@@G@R@ERBB@g#Xfuf \\n twZRW2$@@@$$$@@@@$@@$$@$@B$@@$E@$0@@@E@M$@M5$@WyL \\n ~\\\"E@@yE@@$@@$@@$@$@B@$$$@$E@@@$@$@$@$@@@@ER@27>\\\" \\n ^!F5#g@@$@$$@EE$$@@@@$W@@M@@$$@0@@gKzBBK%9~ \\n `'^~~^T~7R@g@R$$@B$@MQ$a$BE@@$gE@$HJP5(~ \\n ` '}K$@g#R#0$15$@$Z@R@@BRz@$@V[Qe\\\\ \\n `f='^4ysMh$54T$W42@PE~FfW&9~~ \\n '~=\\\\ <?^F0%~>BR$?)^T\\\"` \\n ` ~ ~~ \\n\"\n },\n {\n \"index\": 4,\n \"distance_km\": 364350.7,\n \"libration_elat\": -5.105,\n \"libration_elon\": -1.866,\n \"ascii\": \" \\n . - ``` e . \\n , -zq{^o{.1n, = \\\":\\\"y . \\n . _Z0~ ` -ZAmLi,.. '_, \\n M\\\" X@yygyw-x_2/Gk. \\n . . . jg$@@$$g@@$1?V#WR}^_ \\n s*R W M/ ;.. 4$5W$$RF@$WgEZ99@2q'\\\\ \\n . 'w._w_y_7__-z@$ym@@@$2' T~~_$'/@2@*7j, \\n y@ghT@@@$@@@@$@@@@$$W<- 7$E#@B$g4N \\n ,} . y@@@W2B$@B@@@@@@@@$g@$ , / ug$$@B$@@8w; \\n /|r 5B@@@@@@@@@R@@g@@@$@@@@@_w@ 7A@$@K@C45)|! \\n hM: ^4$$@@@$$@@@@@@@$@@@B@@@@=^k _:4'~~@@$w'~`m; \\n ^\\\"Z' ` . ~ 4@@@@@@@@@@@@@@$@@$@@@$ j_f^ =@@@ '\\\\ \\n (g@@ _. 5@@@@@@@@@@@$@@@@@@$@@$4BW_yL _ 4YT@s .\\\\ \\n eRZ$9@,Wgs$g,-{V$@@@@@@@@@@$@@@@@@$@$@@@zy@@_.\\\\#FF RB@~^ \\n '|@@@sB@$$@B P=yg@@$@@@@@@@@@@@@@@@@$@@$$@$$@$F\\\" ^U . \\n \\\\wAb@B@@$` $@@@@@@@@@@@$@@@@@$@$@$B@@@@WB$C\\\\. Q \\n 3FB$A@m@ y$@@@@$$$@@@@@@@@B$$$@$$@@@Z@@B$m; {yX{ \\n ^4H@0@@@KRy$@Ta@@@@@$@@@@@@$B@$@@Q$B@B@EB@@$$46z: ]EZ+ \\n \\\\\\\"w@E3R@$@E$$@@@@@@R$@@@$@@@@$@$$$$@@@0@@$KMB\\\"3L(^;^ \\n ~<%@E%W@B@R5@@$$$@$@@@@$@$$0@@@4R$B@W$@@0gB@b@@` \\\" \\n nM%4$$g$E@@@@$@@@$$@$$@@$$B$@E$@$E$$RMBZ$$N%$V \\n `=4EMT@Q@g@S2g@$@@$@@BE$@$0@@@$$$M@gW$@4Z9~/ \\n !_3w~P#KB$@@g@@R5@@R$$@@@@$@RR$a44%44v^ \\n 't\\\"Y#$XM@_\\\"55$$B@$@EgB$@$awR4MzG~| \\n !-`z%T4@>ME&b~E9B$rT>4_-$4Y' \\n ` `TWD13d~A2fK~Wv^= \\n ` ''` \\n\"\n },\n {\n \"index\": 5,\n \"distance_km\": 366333.9,\n \"libration_elat\": 0.278,\n \"libration_elon\": -3.312,\n \"ascii\": \" \\n ~' ^ _. . \\n __*^w<-xr=<w ` ' '?, \\n gf` ''\\\\KAy@-_w__ _)Mg, \\n \\\" u2$$$R$gn&w@sB_M~(_ \\n $@@$@B@@@@@$mg@gRk*>Y \\n __ _! r _ _4@@@$~ ~R^~gE,sgm$GI}\\\\ \\n ' ~ ,_y _k ,R@yW@@$@K`, $@&@@@a1&$K\\\". \\n , al~_$@@@gBBg@g@@$00{ . @ \\\"$$$5B$$sMy\\\\u, \\n .4@$4$@$$@@@@@@$@@@@@$y_VR }E@@@$W@s~wW7l. \\n s$@@B@@@@$$@@@@@@$@@@@$$$@Y* {4rT~BM$qB \\\", \\n N fd@E@@@@0@@@@@@@@@$@$@@$E_4_gF f=@M$ Rr \\n 7! 9@@@@@@@@@@$@@@@@@@$@$$m$y@g___ +F*Y&m ,X \\n VwL b@@$@$@@@@$@@@@@@@@@@@@@@b@$$R_1aB3^`4mWk{ \\n J$Wz_L ._yx fB@@@@@@@@@$@@@$@@@@@$@@@@$@@2gF_ '^\\\"n) \\n l4@$+E$$@@`E*y4@$@@$@@@@@@$@@@@@@@@M@$$@@$@@a. 7>o' \\n R@RK@$$F`' 2$@@@@@@@@$@@@@@$@@$$@$$@@@B@$0@$k ,.nyd> \\n lY$E@y4. ygR$@E#$@@@@@$$$$@$$@@$@@R$@$$$0a@@gM,%^> \\n #q8@g@$wy2g$~$$@@$$@@@@@@@@@@@@@$@@0@$$W$@K@6D@LL\\\" +/ \\n ^jJ0@@@g@@@gK$P@@@@$@@@@$@@$B$$$@$@Wg@g@@g$$g$E2B(<~ \\n VWM64k$@$2@$@@$$@@@@@@$@$$@$@@$$B$@@$$R%@$@$@E$*( \\n `=X@LZ$gB@$$@$g@$$@$@W@M@$@@$@W0B$@@$@$@$@$$@RV \\n ^KM?N9$@@$@W5BB@#B$$$$$$R$@@$@@@Dd@%BMAmkWx^ \\n 'H\\\"'%_RF2@$@Bg@@#GA$$5$R@@@@W$$BRkK1|`' \\n <V=H@Z#$__3$bgA$Fe$RYR@R2Wy=%V` ^ \\n `=L~YGT$6$49TEygg$gw1dse< '\\\" \\n ~'!\\\"T~A4_EtR00>V~-~ \\n ` ` \\n\"\n },\n {\n \"index\": 6,\n \"distance_km\": 366534.2,\n \"libration_elat\": 5.395,\n \"libration_elon\": -3.121,\n \"ascii\": \" \\n . : ' 7 __. \\n + : =c_ws_ . . \\\"\\\",> \\n |'` ~NEmszz$_E_a2wcju. \\n / ;$y$@%h$$0*R5j@#WwyYn \\n 4@5$gF^~@$JRg@`T@KV3p2|_ \\n , : _$$@$+ : a@$B4Em2y$g.- \\n .r ' :-|u 4D@g@@$$ , .2@@@@#B$@W@>_ \\n _+ G$$gy9@@$sz$5$@@` y@ . N9@@@$s$xFym>% \\n #gg|@@@@@@@@R@@@@@@@@$a@gL,.)4yk~Me@@WT '\\\"v_ \\n .d@$$$@@@@@@@@@@@@@@@@B@@$J`_a*< Y4@@v (v \\n , 4MM$$@@@$@@@$$0@$@@@@@@@@g$$WyG , xK*HRy_ v: \\n !: ?@@@@@@@@@@@@@@@@@@@@$$g$ME$@yF *$MF ~@C}\\\"| \\n uX . ty$$0@@@@@@@@@$@@@@@@@@@$$$@$@$@E ^{\\\\.L \\n Q4+ _ _ ;'@7@$@@@@@@@@@@@@@@@@@@@@@@@$@R$ !V! \\n #[%XI 4agMR4_-_@@$@@@@@@@@@$@@@$$@@@@@@$@$$@$z: w-Lvm. \\n ~%m@Ed@$@F~ /$$@@g$E@@@$@@@@@@$@@@$@@@@@@$$B@a$$NT]W($\\\\+ \\n lz@$$@@~ _$$@@@$$$@@@@@@@@@@$$0@$$@@$@$$W@A9@$$/ Uv \\n pXM@RgLj.1w@M@$@@@$$@@@$@@$@@@$@R@@@$$$$$$@@@@R@2$;/ \\n MNK5@$@@@@@aW$E@@$$@@$@@@@$@@@$B@$@$@$$@R$$@$@@2*U\\\" \\n \\\"=?6F$R$$BR@B@@$@@@@$@AR2@$$E$@B@@g@@@y@$$@0W$2%4 \\n \\\"%wKD^@@$@y$@B$@$g$$@$B$$$@$@B@@$@@5@2k@@ZaF\\\"`' \\n 'V@R$&$$BR$@M@0$R@B@$@@R@@@@$@@$@@@bBZ@JM^ \\n '*?bKJ\\\"%0$g@@$@E$$a$g$p5@g$eyB3RRZ$tF~ ~ \\n ~-g8k#@59g_y$@$F$$RTaE@Enf~5H|~)< ` \\n ''$'\\\"Pys/4dRHbD2kKZWa@RMXH + \\n ~^~YMa.5~$_yWTKBa4=r^` \\n `` \\n\"\n },\n {\n \"index\": 7,\n \"distance_km\": 368573.4,\n \"libration_elat\": 5.829,\n \"libration_elon\": 3.778,\n \"ascii\": \" \\n . T r \\n +_:X ={_r;_ , ~ - \\n _y^ `` ' `^X@ygRBy=. ]ZC; \\n u'^ _w%$@Rp$g*=E#7Vy,,\\\\ \\n ' ~@KR@$F~M$V*_2'4$%]/}. \\n _. , x ., . , ,g$m$@` $ewsP05k$M \\n w75,F ;_ _w_/j$4$@$S@} t$@@@R@G@y \\n 4gGJ<@@@@w@@@@@$0@@$s g $bdB@K6FGfs- \\n H@@_@$@@$@@@@A@@@@@@$@Wg$y. \\\"N/~~@@@@ `~? \\n i q@$@$@@$@@@@@@@@@$@@E2@$@k W S=@@) \\\\ \\n ,_ M$B@@@@@@$@@$@$9@$$@@@R@@@w}\\\" _ ` 4^?@x. w \\n $t ~?@$B@@@@@@@@@@@@@@@$@$@yyK X$4_. v'! ~*]^ \\n ^W`w . - $@@@@@@@@@@@$@@@$@@@@@@@$$g$@@Wg~ '.7+ \\n K$wG_ ._ _TM@@@@@@@@@$@@@@@@@@@$$$B@@$@0@Q* zl \\n ;bWagg2'W@@@@$V\\\"*g@@@@@@@@@@@@@@@@@@@@@$@@$$@@4R/ zv| \\n `vN4$$$$@@@FF~ 4$$$@W@@$@@@@@@$$@W$$$$@@$@$@B#4%@mP xJX \\n {W@W$$@$@F y$@@@@@@@@$@@@$@@@$@@$$$@@@@@$%@B~_wa Y \\n @Y@E$2@@@\\\"y ug@$@@@@@$$@@@$@@@@@W$$$@@W$#M$B@@@@B$?x \\n {mKW@$@$@$@$@@@$0@@@$$B@$@@$@$@@@$$@@$@@yMAEE$0H5X \\n [/aM@$R@B@@#$@$$@5$$@@$@@$$@@@@@#@@@$@E@@$@@@WX\\\\ \\n ^t&W@$%T0@$@@g$@m@$@$@@@$$@$W@@BB@@@$@gbNR5k5L` \\n [UZ$Z23@@@$B$@B5$@@@@$T@d5@@0@@$PM$$KRkW^^` \\n '\\\\@PBKtYKTP@@M@g@@$@$gR$g$BWB$Bh3~8X' ` \\n 'f?k>@ghg@MBT@8RE@fd$RnZs#?1w)[!: \\n '\\\"~$J~m#?Bd$M4@gE@Z$0a3GGV1' ~ \\n T^~^T`^j4Zlu*M4T ' ` \\n \\n\"\n },\n {\n \"index\": 8,\n \"distance_km\": 368792.8,\n \"libration_elat\": 1.882,\n \"libration_elon\": 4.299,\n \"ascii\": \" \\n .: . - \\n ,_*_q -/nvu`. ' ' x \\n jj+~ '` `'^hUyygZl _1r. \\n <^~ w@B$M$$$g./5BY, \\n .4@E@@a0@@#.1&$#$i{., \\n u_: s r..4$@@@~ ~\\\" '$_,R@WQ,; \\n -F'h~ _.y_4y1_Fd$gg@$@TL R$@MBE0M# \\n :@z=w9@@@@@@@$$$M@$$$ / n$@g$BR${, \\n '. 4@@$#@@@@B@@@@B@$@@@@gy_4+ `9e#@%g$\\\\\\\\~\\\\ \\n r_ . 9$@$@@@$@@$@@@@@@@@@@R@@RBK `/ #g@5 ^ \\n XQ? \\\"A@@@$@@@$$@@@@$@$@@@@@$@@ ? .\\\"^$&i \\n /VzL . ..\\\"M@@@@@@@@@@@$@@@@@@@@@@[\\\"_ __ _. `V^#\\\\, : \\n ^J,$y n@@@@@@@@@@@@@@@@@@@@@@$$y_WggwLjT` ~$w \\n )S@@@L______ywJ.5@@@@@@@$@@@@@@B@@@@@@@@@@@B@g0i 'Y \\n ^9650g@$2s@$$@F@*g#@$@@@@@@@@@@@@@@$$B$EBg@B$@Hf. ?| \\n #3@M@$@@$@F~~ a@$@@$@$$@@@$@@@@@@@@@@$@@@V$@EO?; ?s4 \\n Jjg@$$N$5Z., w$@@@@@@@@@@$@$@@@@0BW@$@RR$$$9@ZR$ x. \\n ^4N%7W@R@y$wB9W@$@$@@@$@@@B@B@@@$$@@@@A$@B$Bdg@_jW: \\n \\\\@$B$@@$g2@@@gE$W$@@@@B@@@$@@5@@$@E$@W$@@$gM@@@2k,` \\n \\\"Wfj@$s@gg@@2@$$@@$@B$@@$@@$@@@$@$R$@@2@E22@EA$@# \\n \\\"@BG0L$@B@@$@$@$$@R@$$@@E@$$@@@@g@R$$@@$$@MFt~ \\n `fT$$%@R@$@$$d2sg$$@@$@@@@g$@$@@HRRM@ETT7+\\\" \\n ?X@W~YT{WT#@B$$@@@$@$g0B@@W$#@@#$$dWn \\n !8Hg@mE$EBVT&0y%$@0#sNEWAmpV*4M ~ \\n ~n'__@2#Ga-BE@$sglEE(NNZJZ \\n ^ ^ {3'9i@V_zM+>-~~ \\n \\n\"\n },\n {\n \"index\": 9,\n \"distance_km\": 370979.8,\n \"libration_elat\": -5.57,\n \"libration_elon\": 4.616,\n \"ascii\": \" \\n . r F^. , ,. \\n 7 , _mvpaW..,_.^ -r> , \\n z$\\\"``~ `r ~-zR9_ ` ` +. \\n ' {Y~^ ~3Bwyak. .QU \\n . . )gg$@R9g@R/Rtmu. \\n , . _g@WyZ.xsv. , u7@E@AaK@@W\\\"H%)__^ \\n ; `T`$__ yw).f__.WRwya@$g@$` \\\"?^-~_/X#!: \\n < _ g@@*5g@@$$0@$@@$g@@53 4@@p@aRi< \\n Jjp , ~g$@@$@@$@@@@@@@@@0@@@l , T@@E5@KL \\n _4g@ R@$B@@@@@@@@@@$g$@$@@$$a_,\\\\ 2@$$$g8@\\\\ \\n T>@{; 4M@@@@@@@@$@@@@$@@@@@@$$EePh \\\"~~`~5$V/\\\". \\n _*@LZX . `$@@@R@@@@@@$@$$@@@$@@$K *R@; `: \\n |$P@W%_ w _ r.@@@@@@@@@@@@@@@@@@@@@@@~ -, .n:01 > \\n )XjE5B@@~aZ$gg$ya$$@@@@@@@@@@@$@@@@@$B@$gW _yN_ .X! 4M/` \\n JD$@B@@@R0@@@$M~Fx@g@@@@@@@@@@@@g@@@@@@@$@Ws@@B(^ `>' \\n 7$4$P@$$$@F\\\" R@$@@@@$@@@@W$@$@@$$@$$W$@$y@gL+ . \\n !2BR$@6@@WMg __m$$@@@@@@@@@@@$@@@@@@B$@@@@E$@$%\\\\ . > \\n 7*>M$@B@@0@Em$@@@@@@@@@@@@B@@@@$@@B$@@$$dRE@MRyy M \\n ^!@$yEgZQ@$$@$@@@s@@@@$@@@@@g@@@gR@@ZB@@@@0BW@~~_v \\n \\\"9BR$@T#$@@gE@@$@@@$$$@B@@#@@@@g$$@@$s$g@@#$g$GR! \\n 'M&@@@D@@R@@@@B@@$@R@@s@@@@$$@@@@BB@RR@WM0@@B\\\" \\n ~0B#@Bt@@@RCgy@E$@@@@$$$@@$E$@B@@@@$3@@<P \\n '2[@g_{iE@$Z@@0BKEE0$R$@$$#@5@$$$@@MT \\n ~<[F8g(EzaZM$#@yM$4yB$$@$d4MW4W~^ \\n 'R@/2Sy<MRg$W5D$^>OT'\\\" ~ \\n ~r!7/4%E@@5vr*?^\\\" \\n \\n\"\n },\n {\n \"index\": 10,\n \"distance_km\": 372936.5,\n \"libration_elat\": -5.822,\n \"libration_elon\": -5.197,\n \"ascii\": \" \\n ; -: . \\n _, >c +___' ,`i + ._ \\n ._Nw^~\\\"~T~ ;\\\\ 9M_., \\\"`4o_ \\n ^>~ . ^$@$2%2Wiu zRzq \\n ` Lg@@@$@@ge$d$gZ2~aL \\n _vW<> ;-' g$@$RZ&@B$4@K$$4R%_%M_ \\n ` | ,,.: . _,xgEyX@@g$$M` \\\"4Y?$$~-MB]*K_g \\n _zW*32@@g5y$@@R@$@@@@Kv '$$$W$m#mggJk \\n :2@$WgBg@@$@@@@$@@$@@h_./yG j@@$@$WBw4M-, \\n [ '4@@@$@@@@@@@@@@@$@@@$g2@$E,: ;@$$$@@@2#MIo( \\n < ^w5@@@@$@@@@@@@@@@@@@@$@$@k j\\\"@@VF@@@@KM~\\\"|> \\n rj $@$@@@@@@@@B@@$@@@@@@M~$y@Y ` R@$@% !| \\n 5\\\\E , _@@@@@@@@@@@@@@@@@@@@$EK@@@$_, .eX#b> j \\n \\\"KEN~;zyy$_, `0R$@$@@@@@@@@@@@@@$@R@@y@$$$~ -aA<^W1nV' \\n #E0R@@$B##~F_yg@g@@@@@@@@@@@@@@@@@@$@$$@$@Z=\\\"~ ,'MI`' \\n cMF$@B@' =#$@5@K$@@@@@@@@@@@$@$$$B@@$@@R$ .' \\n w\\\\a@@m_, yz$5$@M~$@@@@$@@@$$@@@@$@@@@$@$s@t LyA'; \\n i,kRR$@ma@@$gW@@@@@$$@@@@E@@$@$@@$$$@@@@$@@gwm ;%XP \\n }44$KB@@@@g@$$$@@$@@@@@$@$@$@@$B@@@$@@@R@B@R$yX^,/^ \\n YVAYT@@$Z@$@@@$@@@0@B$@@@@$$$@B@$$@@$$B@@W#ER4_~ \\n SK@2@B@$B@@@@Z$5$@5@R@@@B@$D5@@200@MM@$4@E~_ \\n ^I\\\"<Z24B@9y@g5$@@@@$g@@@$$@$@R@@$$R@@@Y?k` \\n ~^j._;4$Ta@s@@@5@ER$$2@$$@gBsyAH4@O- \\n `\\\"';tK/RyvR@Nq@@#$@$QE$@@E7$d\\\\J= + \\n ~ Yg+F=9fP$12$F*+$)@~j~?` \\n T~zE$45[~K=\\\"~ \\n \\n\"\n },\n {\n \"index\": 11,\n \"distance_km\": 376361.2,\n \"libration_elat\": 2.0,\n \"libration_elon\": -5.764,\n \"ascii\": \" \\n ; .. _ \\n .- yxw__ `'( ` n> \\n - ~\\\"F M@g_-m\\\\_,, _W<x, \\n l` . __$@$@@RK9>4$d$%,qn_ \\n mg@$@@D@@$2D#g@sgMyJ4} \\n .._ 4$@@@F~ ~F\\\\~k5~x$@@WMswt, \\n ^r . ywyE@@@$;, #R$$@S$g$H*m . \\n $ . @$y$UNg@LZ@@@@$ ~, \\\\ .g@@@$@$$$$dF;; \\n js@ug@$@@$@@@@@$@$$@ysx$E{ ZR$$@$@RQ@M%)N^ \\n . -@@@m$@@@@$@$@@$$@@R@@@@$#* [^M8F.$$@$@ ~MN \\n _: 4ZR5@@@@@@@@@B$$@@@@@$@@@@B$@j .\\\"^5g$_ >| \\n (. *y@R@@@@@@@@@@@@@@@@@$@@$@@$zy.r3<VH@z_ *j \\n '_ )Z@R@@@@@@@@@@@@@@@$@@@$@@@B$sy$$'M `AgWi^? \\n Wd, . j ~Ey2@@@@@@@@@@@@@@@@@@@$@$$@$#E . ~?]X: \\n X;0>)_g@RK7.ggA@@@@@@@@@@@@@@$@@@@@@$$g@@AB_ . _,j' \\n \\\\@ME@@$F~ .$@@$$T$$@@@@@@$$@@@@@@$@@@$@0@@ga1_$*@wK<_ \\n 7#%BB$ y#j$$Za$@@@@@$$@@@@@@B@@$@@@$gEg@@@ ~&>\\\\ \\n `,N4Rgy/jggR4W@@@$$@@@@@$$@@@$@B@@@@$@0@$@gg9$WW_j5r \\n V\\\\2W$$AgR$y@$@@@@@@$@$@@@@@@BB@$g@@@$$E$WB$@AK@7+ \\n YXnbM5@@d$@@@@a@$$@@$@@@@@$@0$@@@@@@B@$0$%@HK%2' \\n '42K^RB@B$$$$@$@@@@$@@$M@$@$R$@$@@@@@@BW@$#{\\\" \\n ^\\\"Z@0E@@BgM@$@@@$$E@@$@@B@$$B@@d$Zm@R#{~\\\" \\n `x`.U +$$@B@W@@@@gM$$@$#g$40A#gF[~$\\\"M \\n K@cm$M8wK@gG3g$R@g$s4@M7xH~4j^ ~ \\n \\\" -~~&CTp9=$$@9U$RE?kv7+ur \\n `~` `T\\\"-\\\"<M5PT \\n \\n\"\n },\n {\n \"index\": 12,\n \"distance_km\": 377700.5,\n \"libration_elat\": 5.801,\n \"libration_elon\": -5.923,\n \"ascii\": \" \\n - \\n .,_ .. ~ ~ '\\\" ^g:, \\n ; ^~ ' `$$WyzQLw: j8yG=- \\n \\\" Ly@$$&@RM72g<@%$LYR_. \\n +4$M@GB=R@kdM@M^?$@WxM\\\"|, \\n . _gW@$K ~' 2$x@MgM@WE)r1 \\n .- ^ >:, 4y@$@M0$ =@@@$B$@@QWz(? \\n - .$$jQygg$y$$$g$C,: a. j@R$@@@ZmBR#Kw{ \\n 5$us@@$$@@@$$$@@@@@gGgFLL.J?$W0~$@$@U~`~\\\\n& \\n ,a@@@$$@@@@@@@@@@@@@$$@@@~gy$r ' =~$@$\\\\ ^3| \\n . (5M$@@@@@@@@@@@@@@@$@@$$@@@@@L__ wRR~E@@ ,Xk \\n ~`{W$@@@@@@@@@@@@@@@@@@@@$$$@@&~wdM*M~#@gL~J \\n ; _$$$@@@@@@@@@@@@@@@$$$$@$@$@@$$~. '~~v[/ \\n w_ . _ '4^y0@@@@@@@@@@@@@@@@@@@@@@$@$@*> >w- \\n H &i +w@#M$ _$$$@@@@$@$$@@@@$$@@@@@@@$@@$NM>_,-_kgv9Y \\n ~<msX@BF~ 9@R$mR@MB@@$@@@R@@@$@$@@@@@@@@@@gg$BQW+%$_/ \\n \\\\FRW$$ _yH&4gy$@@@@@@@@@@@@$@$@@@@$@@@@@E0@$$]\\\"FM' \\n '?V]MgL+,_g%a$@@@@@@@@@@@@@$@@K@@$@@@2@$$$@@$%0M@2A^ \\n a@7@$g@g@y$@@B@$@R@@$B@@$@@@@@@@@@R@@MR@$$@By@#YF \\n ^3k522#@B@@@B@@@@@@@EE@@@@@$@@@@E$BR@$@$RgR$R+~ \\n ^(^4`@@WA$@B$$@$@$@@9R@@$@$$@@$@E2@@RRWgMw?/^ \\n 'Q7W2$0$W@$@$@$@@@@zRW@$@B0BK0W@@MBMM~\\\\J \\n \\\"V('x.~3@RRB@@$@RB@@@$$A$B@@jptW%~' \\\" \\n \\\\T$/RRZBgp$ZGPRMg$$$@$E$X/'~W) \\n ` =\\\"\\\"&*G]@wtB4E4$gg$4$4EP!^ \\n \\\"^ ``\\\"+M= -T~^'` \\n \\n\"\n },\n {\n \"index\": 13,\n \"distance_km\": 378113.4,\n \"libration_elat\": -2.581,\n \"libration_elon\": -5.835,\n \"ascii\": \" \\n . . .. \\n . `, ,_. -7`\\\". \\n /J^~T ~ \\\" z4$_ ._ `\\\":- \\n 4-' . . [@$@x@Wyy y@$iu. \\n jy$@@@$g@A@g$DARB}@w_ \\n _*_ . 790$$g$MA@@a@W@NRBRk^% \\n ' .~ +_ *$_yx@B@E= ^`~JBsm$$HWbyQ^, \\n Jy-\\\"@@g@_a@@@#@@$5gTn \\\"ZM@$$$g$@@w^. \\n _@@@$Gg@$@@@@@B$@E@$;$gys' _9@@@g0$Ra@j_~. \\n q@@@$@@@@@@@@@@@$$@@@@$g## _vQ@R@B@Ew#&~nr2 \\n .T `#2@@@$@@@@@@$@@@@G@@$@$@%_z:7F^ W@@B^ (*l \\n } =D@@@@@@@@@@@@$@@@@@@@N@#Wy ,`_5@#w \\\\. \\n #PL . 5g@M@@@@@@@@@@@@@@@@@@@$gR@$pu,_%7\\\"R$L KU' \\n \\\\ Pz\\\\_y-gb \\\"05L@@@@@$@$@@@@@@@@$@R@@g$@@$g>~ ~KAD'@ \\n 7|B$)g@@$@ Y=y$@g@$@@@@@@@@@@@$@$$@@@@@@@BR_ r' \\n 'YK$$N@\\\" PF@EgM@$@@@$$$$@@@@@@$g@@@@@R$@z. _)z7 \\n :kR@$0;_ g@W@$_yg@@@@g@@@@$@$B@$@@@@@$5R_$*.iH9R? \\n TQ@@$d1w$@9#$@@@@@@@@@@@@@@$@B@@@$$@@@g$BgB@@wMk:T \\n {%AP5@@0@@s@@$@@@@@@@$@@$B$@$B@$@M$@$RRg@dyw@#W};` \\n ^y5XA@$MRB$@@@$R$@@@B@$@@@@$@@B@@$@@@@RA@@B@YQ;~ \\n `6%RGBB@@@@$W$$@$$@$@E$@$@@$@$B$@$$$@@@$%5\\\"` \\n `\\\\X3~~2@ER$$B@@$$$E0RB$h$R$@$@a$aA@%R@%9 \\n >Un _{6$RA@$@RW$g@0$$@@ygWKMM$@@W^~ \\n ~n1M5&*#_a0@@@AR@$@$$$EXU7YMf^? \\n ` ~^~k[c5s%MAYqMFFM@\\\"VZ ' \\n ^-^*F^~?~`~` \\n \\n\"\n },\n {\n \"index\": 14,\n \"distance_km\": 379658.1,\n \"libration_elat\": 5.491,\n \"libration_elon\": 6.128,\n \"ascii\": \" \\n , - ,. \\n , __ _x` , , \\n ,+Y'=' .^?=PywwM__., _.- \\n -s- lE@@$@g@__L_$>. . \\n \\\" ` >$$@$$44@F<Ma YX_(:. \\n . _. 4@W$R \\\"\\\" ^wyy9$%BZ \\n ,#RoP ` k \\\\\\\\;_a@m@@@#ET ~@@#$%syV; \\n ~a_bX$@$$3@$$@W@9$g@L , W$@@RzFC}t \\n . ~@$@$$@@$@@@@@$$$$@@$N%y___ ~g?~5$Bw^\\\"| \\n ^ y$$@@$$@@@@@@@@@@@$@@Q@@RP^ ` \\\"R$@_ : \\n ..W ~@@@@@@@@@$@@@@$@$@@@@@$@$. u /m=Ey . \\n ^jR \\\"~?@@@$@@@@@@@@@@@@@@@@@$w_< `gy; j~) tyl \\n xV^> {+2@$@@@@@@@@@@@@@@@@@@$@B@_@R$$W~ \\\"?Y \\n '&W$z . y[_?@@@@@@@@@@@@@@B@@@@@@$$@@@@0@Ek !' \\n ^N26@9g_pdg$$$M$*@@@@@@@@@$@@@@@@@$@$@@@@@*@$Rb\\\\ :d/ \\n ^ARj@@$$$@@@~~.}9$@@$@@@$@@@@@$$@B$@$@@@$$g@@@PgKL *\\\" \\n 4M*$$$@@$$__ x$@@@@@@@@@$@$$@$$$$B@@$$@@W@R$E~_j!u \\n ^0MN@@@@$$wmys2@@@$@@@@@@$@@$$$$@0@@@@$$@s@@BR@@KK ' \\n \\\"\\\\3@@$R$@$$@$@@$@$@@$@@$@@@$@@$$@@@@@a@@B@E@E$0_\\\\ \\n ~WR#W@$s0@$@@K@@@@@@@$@@$f@@@M@@@@$g@K@$B$@0$P\\\"\\\" \\n ~^@QB@$~b$R@g$B@@@0$$@@@@@@gBB$$@@@B@@B@54M~ \\n )=W&@A4M@@$@@E@W@@2@B@gWK@gD@@@gEW${$#^ \\n /@TEEE`&A$#0y$@@Z$MM@$p$@0BtP5%@<l \\n '~XmT$E$W@MgyR$$aRs9gS4WW9/~ \\n ` f=L\\\"0EZW$@RPG%#$R{Rx{&''~ \\n `^`^ '`\\\"\\\\\\\"?~ ' \\n \\n\"\n },\n {\n \"index\": 15,\n \"distance_km\": 381331.9,\n \"libration_elat\": 0.836,\n \"libration_elon\": 6.123,\n \"ascii\": \" \\n . _, \\n __ . _ \\\" < \\n wz?^^\\\\^ `r={*_, _. ` ,, \\n .4fT '80@Ma<w% <,). \\n gg$$$$B@%K$YJi[ = \\n ___y, ^ji . . _ 'J$g$0F~~5\\\"*J:`6x\\\"i: \\n . #T5ZY ;`-,'_n-;)wyWB$@$\\\" aygg5B4W \\n ' g@9e@@@@Ea$$g@$@$R$$ j@0@@@KR \\n 2 +@@@y$$@$$@@@@@@@$@@RL_ * \\\\$@RRwgT^I \\n /jw 4$@@@$@@@@$@@@@@@$$@@@@E@$+ \\\"4\\\"'7Ak@^ w \\n .%g$ `@A@@@@@@$@@@@@RR@$@@@$@$E | TT@5 ' \\n ,&X<> `~?@@@$B@@@@@@@$@@@@@@$@@ _; ? MW { \\n 'MtJz. +^$@@@@@@@@@@@@@@@@@@@@$gG| _ay, *` ~GV \\n 5yjE@$yz(ny_y$ -@@@@@@@@@@@@@@$$$@@@@$$@ga@R$@T `\\\"- \\n IJEW#$@B4@@@@@KS1g@@@@@@@@@@@@@@@$@@@#@@@$B$R@7 '- \\n 2ZW@E$@&&$F~~. VB$@$@$@@@@$@@@$$@@$$E@$@@Z0$$$> y)' \\n ?%&$@$@$g@x{ _,m@M@@@@@@@@@$@$@$@@@$gB@R$$*$$Y@M 2 \\n ` %2@$BB@Rb$L@@@@@@@$$@@@@@@$@@@@@R@@$@$R$$$I2l_y> \\n `Wkg#@@R@$@@@@@@R@@@$$$$@$@$@$%@@@B$a$Rg@@@g@@Pp+' \\n 74&$R@WM@B@@$RR@@$W@$@@@@@g@@@@$gRbEB@@W@@E@@&; \\n +E#@$am@0@B$@@@@$$$@$$@@@gW$5@@$@@$d@@BgRR^^ \\n `\\\"@S@$MM$3RRE@$@@$$$MW@R$$BR#@$@@@%$%@< \\n ` J8MqG_3=AM$$a@@@W$@@@$@@$aR@R?Tx~' \\n \\\"|QT4RARm4$*ARQsGW@EaRP7$TTP~` \\n ~- zMeeE65tsF0g12$Lb9X^ \\n ` ' T~F~~ ~^`` \\n \\n\"\n },\n {\n \"index\": 16,\n \"distance_km\": 381859.3,\n \"libration_elat\": -2.705,\n \"libration_elon\": 5.978,\n \"ascii\": \" \\n . . \\n . ___ L._ ^; - ( \\n mze^^`\\\" '~~RX_ \\\" . \\n .tv? `B$@lglu- | . \\n . pggR@@$@EZ:dFR, \\n wax_. y_ R0ER$@f4$WyCW?w:v \\n !. ~TT%~_.\\\"u_Jw__j*E_x$@g@H ~\\\"'J_ jQtjj \\n [ $$bdB@@@@W$@0$E@@@Q$ . '@$@zNBcX \\n [| \\\";g$@@@$@@B@@@@@@$E$@@@ :. 4@B5@R%(` \\n jyMy t@$@@@@@@@@$@@@@@@@@@B@%y1_ . Zf$RK@CG# \\n vNt` Pg@@@@@@@$@@@@@@@@@@gB@$F'~ F WB@' \\n 8j@~w - ~f@@@$@@@@@@@@@@$@@@$@@L. ' `\\\"?_ \\n AM$@Zy . . .`w@@@@@@@@@@@@@@@@$@@B@$_i yL \\\" yN).P \\n )jy@0@h@~LsgyggaR@@@@@@@@@@$@@@@@@@@$@@@g_g$$v;^ 7N \\n !VH#$B$g$$$@@@$7k4$@@@@@@@@@$@@$@@@@@@@$@$@R@@a \\\". \\n '5SBBR$Bg$$F {f$@@S@@@@@$@@$B@@@B@@$g$@B$$$[, 4` \\n 1X@8@@2@@$hg __W@B@@@@@$@@@@@$@@@@$@$@@@@W@B$y_ M/ \\n JQRB$D@$$@2$g$$@@@@@@@$@@@@$@@@@@$$@$@@R@@WWkFV {\\\" \\n '@@fF$@0@@gR@@@@B$@@B@@$@@@$@$R@sM$@@@$$@$$@WwgW\\\" \\n `@V$4$ER$$E$$@@$@@g$0@@$@@@$@B@$$@$5@B5@@@NT3~; \\n {~$M@@E$@$@@@$@@$@@@$$@s$$9@$@@2$@4@@RK$T@@^ \\n ^ FqR#mZ3JH@Wgs$$EBW$@Z@0MWg@B@@$WM$B55? \\n ~^k/1ayDgW$$#$00B@$@$2Kg@$$Eg$$$\\\\$' ` \\n ^+K^YG#%gWa9Ra@@9MT$$EZ@@~wO=\\\"' \\n ~ `-%Hy~T@@M?a4%M$\\\"^k( ` \\n ~' `~P!+^^ ~` \\n \\n\"\n },\n {\n \"index\": 17,\n \"distance_km\": 383889.6,\n \"libration_elat\": -5.925,\n \"libration_elon\": 6.256,\n \"ascii\": \" \\n _ . \\n . ' _,._ ' .:_ \\n .nzF'~-^`Fnrj__ . \\n aF~ ~ `!Hyw_g_ w. \\n . ` xygg@@W#k,=|l. \\n _gwa; _wJ ($@9@@d@@\\\\W^@K_ . \\n _ t~\\\"$~_ ,_W_z+'_jz. y$@W@\\\" ~~kfX#~5i; \\n /\\\\ '.3@$@@$$@$$@ss@B$W@$MC 4m9p6b>{ \\n G5[ _. ,$@@@D$$@@$@@@@$@@0@0@~ 0@$$B$$ \\n .}2A> 9$@@@@$@@@@@@@@@@$@@@BaL ( \\\\$FgY$HX; \\n M@@Bq . H@@@$@@@@@@@@@@@@@@@@$W@s \\\"NV^?$g_\\\"M \\n jW@%y@ ~ . r ~@@@@$@@@@@@$$@$@$@@$@@ *#$m \\n &U*&WMW y _pG$@@@@@@@@@@@@$@@@$@$@@F \\\" ='$, ' \\n (T$Rg$@@E$w@g$@W$@@@@@@@@@@@@@@@@@$@E$@gy _y_ | `v</ \\n &&mV$RB@@R@@$##K$s@@@@@@@@@@@$@@$@@@@@@g@ya@$Em ? \\n `5VA$@$@g$RE`, @B@@@$@@@@@@@$$@@@@$$g@$B@y$$\\\" _ \\n v<Aqs@R@B@E9_yy@@@@@@@@@@@@@@$$@@@@B$@g@@E@@@$\\\\ ,> \\n $AR$Bg@@$$@sR$@@$@$@@@@B@@@@@B@@$@@$@$MG$0@GlWw ; \\n ~~qZ$BRgZ@@@@$$$@$@@E@@@@@$B@@$$@@@$@M@@$aRfM~,, \\n ^R*@@zZ$@$@h$$@$@g$B@E$$@@$$A@@@@$@$BWWE@@B@) \\n 79@@gW$@gg@@@R@$@$@R$D$@@@$@@@WB$$RXBBgM5[ \\n {JGKRHk~@@g$$R@$Ez@@$$$@$@0$@$@$EB@@RMX~ \\n &@R2$4yKBbAER@@R$$dW@@g@@@D$m@@XN`\\\" \\n ~^u\\\"?F4KPEz$$$Z$#@g0$&@@55M@v\\\"~ \\n `~-Xw7PPe=TA4jzFW<_t^' \\n \\\"^r-^^^ \\\" ` \\n \\n\"\n },\n {\n \"index\": 18,\n \"distance_km\": 389306.6,\n \"libration_elat\": -5.818,\n \"libration_elon\": -6.036,\n \"ascii\": \" \\n . _ \\n . ; ``( }. \\n w;MP|* =n>fsL ^ . \\n *|| `^RE@_}y_ 4ym, \\n . ,yAg@M$R2@L$RMw< \\n _w , . g@$$B@R@@m@y%B$@y,(k \\n ``~' x _yy.J$E@@BM~T@T@A$TM$gWg\\\"VL \\n .$x_gg$J0@a@@@@@@$@si aM$RB@AWMe/, \\n . . .g@F*g$@@@@@@@$@R@g@',_ z j$@$$@5$$W]`; \\n / j@$$@$@@@@@@@@@$@@$@@ygz@_ #@@@g@$@BEa<u \\n . . Jk4@@@$@@@@@@@$@@@@$@@$@$E ,7$2=@g$z&\\\"^KTL \\n /j A@@@@@@@@@g@@@$@@@$@BEgys\\\\ ' HB$@N ~P \\n h0L . >@$@$@@@@@@$@@@@@$@$@M@@6$_ .we{@0 .l \\n %>E$ -gsWw_^`RME@@@@@@@$@@@@@@B@@@$%#@$@~ y@# 4@*X|, \\n MRQ@K@@@hff $y$@$@@@@@@@@@@@@@@@@@@$$@@BE$\\\" \\\"4> j \\n L45B@MF . ~ZR@K@#B@@@@@@$@@@@@@$$@@@@0@R$ . x9r \\n {5S0g$_ , g$T9@y_@@@$@@@@$@@$$@$@@@$@$BWN\\\\ xkx ' \\n \\\"VM$g@$@R@TJ$$@@$@$@@@$@@$$@@R@@@@@$@0%@gg$$^;M<:X \\n \\\\ t@@g$$$@R$@@@@@@@@$$@@@B@$$$@@@@$$$E@@$M$yW`j+ \\n 'jj`R5@@@$@@$@$@$$@@$@$@$@@@$B$@@Wgg@$B@@W@>/` \\n \\\\^48R$@@$@$@$@@@@E@$K@@g@@@@@$@Z$$BW#sP#^| \\n '-:, {$MA@$@EZ5@@@@@$$@B$@@@$@g5$@Em9/^ \\n z~*gT6GfTA$H$@z5$Z$KREBa@3GW5#9\\\"^' \\n \\\" +?L$\\\"3f@@@1$E5$5F5$=Dj?$>?\\\"` \\n ~` ?tJjg#E@gH@~W$:` \\n '\\\"``\\\"' \\n \\n\"\n },\n {\n \"index\": 19,\n \"distance_km\": 390509.1,\n \"libration_elat\": 1.475,\n \"libration_elon\": -5.963,\n \"ascii\": \" \\n _ \\n - _ ` ... . \\n _r -- ~^<_)$w _,_ ` jy. \\n r 'g@$$$$x$yyMW_~:_ \\n .j$$@Bk@$@@W2gRZ@y\\\"<y \\n . NgM@R$~~4$RMgBM1%&E$jWy \\n w~ \\\" . y_y@@@@~ g@@B@m$#RKJ{ \\n ,, _s@@ngLg$5$@$@@'^ w _$$B@@$@W$Nrj: \\n g0Yw$g$@@@@$$E@$@@@yjy4_; 4@@@@@E@#Xb@X> \\n q@$Eg@@@@@@@$@$@@@@$$$s$a.-vI5MFT@@@a\\\\~ \\\\nW \\n _ d7@@@@@@$@@@@$@@@@$$$$@Jp@$@, . FR0@F j! \\n ' `+R$@@@@@@@@@@@$@@@@@$d@@@gLuy,r@@%Wk :f- \\n LF C@@@$@@@@@@$@@@@@@@B@@@@$@@@wcHPT \\\"%bs/1+ \\n NU_+ __ 7^y$$@@$@@@@@@$@@@$@@@@@$@gR$ . '#~w: \\n %_W<_ygBR (=yB5$@@@@@$@@@@@@@@R@E@$@@@@@gW !M' \\n (Rg&@@~ *B$$@FRR$@@@@@@@@@@@@$@@@@@@s@EgW,y*RGvW+ \\n K0@2@ w@#@$yX@B@$@@@@@@@@@@@$@@$@$g@@@@$_P%y~'' \\n ^`gM@@EyyWH_$$0$@$@@@@@@$$$$@@$@$R$B@$E0BG$aH@@+J/ \\n ^N4@$@M@E@$ER$@@@$@@$$@@@$$@@$@@@@@$$W@@@$@Rz#7 \\n ^,W$FH0$@@@@$$@@@@@@KR@$@@@@$g@B@B#@0Z@B4Y$0v \\n Yx*BK$$@@@$BZ@@@@B@@@@@0@R0@@@$@M@$B#0@K~ \\n '~~~}3?RA@$@$R$@BW@E$$gB$@$QM$#@@@kF}F\\\" \\n \\\"(4w~2#$n#M0@HW@$@9@@Z@AB)EKfBF'. ' \\n '\\\\D?^X0@$$g%4s7@RB4$9%Z_w~, ' \\n ~^^P&Y\\\"r*?59P44M%J~5~ ^ \\n `T~'\\\"`\\\" \\n \\n\"\n },\n {\n \"index\": 20,\n \"distance_km\": 391670.0,\n \"libration_elat\": 5.642,\n \"libration_elon\": -5.869,\n \"ascii\": \" \\n \\n x`! \\n | ;! ^\\\\+e%*_,<- ,_ _pK+ \\n ..F ggg$Z%92kyBWWyC /. \\n wg@$E$$@@K@Rg$7QRvx$t,_ \\n . a@@B$\\\" ~~\\\"WRux$$@g@@$}L \\n i ` jLyA$@@$ \\\"0@@@@s@KRM*W{, \\n _ gg-N<gyg^@@@R@> _ J X@#$@$@05&3x2=. \\n _@_7&$E$$@@@@y@@@@$ggg0= . 9@$P5$$gb#~ \\\\M$. \\n _ag$W@@@@0@@@@@@@@B$@@$@R'yy.^~ R@BK/ &) \\n . .F@@@@@$$@@@@@@@$@@@@$$$g@g@gw_ .w*y#@K_ }W \\n k ` ]y@@@@$@@$@@@@@@@@$@$@@$@@@gF/g@t='4@$$/O \\n t5$M$@@@@$@@$@@@@@@@@@$@$@$@ERF` ^~1.4/ \\n jy . `E_2R@@@$@@@@@@@@@@B@@@@@E@$$gQ ]<W L \\n 4;,-ag@$4.gg$R@$@@@@$@@$@@$@B@@@$@@@@@sBFy_ ua9mm7W \\n \\\"Y#@%$@^~ 0A@$$M4R$$@@@@@$$@@@@@@@@@@$@@W@$@r&MMMx# \\n ^@K$g@ a$*R$gg$@@@$$@@@$@@@@@$@@@R@$@@@E$$$0V$R \\n 0W$@ja\\\\_$@`$$B$@$$@@$$@@@$$$$$@$@$$B@$@@$@22@$@t\\\\ \\n <P4m$W@@@$@2@@@@g@@@@@$$@@$@@@@$@@B$2R@@@$@Eh(` \\n `TSsW@@R$$@@$$$$$@$@5$@@@$$$@$@$B@$@@@$gRRs5' \\n `^}&`$b$$@gH$@@$@@@$M@RM$g@@$@@%$N@R@5\\\\R\\\"^ \\n >j?\\\"T#M$0#@@@g@R@@Dg@$$@$$$@b0B@E@#^` \\n `? <L. k45k~F@E#@@0$T@BE@#5@$?6m-, \\n 4K?4Y($GE4zR@5g$$EEgBngK\\\"_>-~ \\n `~>?^4 MMKqZR@Ds!=`(' ` \\n `' ` ` \\n \\n\"\n },\n {\n \"index\": 21,\n \"distance_km\": 393407.6,\n \"libration_elat\": 5.513,\n \"libration_elon\": 5.636,\n \"ascii\": \" \\n \\n . ^ \\n LNV' `T~{$b_ -, \\\" . \\n _j@' <R@$mW$wxt!mn \\n ~ g@@@$@$@@'Yq\\\\as;' \\n g@@$6^ `P ~<\\\"_M@yMj \\n _g%n- z+ sEyg$@$@' ~M$g$M$sX \\n \\\" 'a(_ra@g@@$@$g2$$$@@ f4g$gA@4M \\n `$@@y$Z@$@@@@$$B@@@@g$_y, *@7M?$$N~'\\\". \\n ^ _H@@@@@@$@@@@@@@@@@@$$@@5~ ,. `B@N_ \\n ;yK `gR@@@@@@R@@@@@@@@@@@@@$$_ ` w=~@L . \\n <$\\\\ ~?@@$$@@@@@@@@$@@@@$@$@@yk `W@! ,I? YP( \\n -JMw - 3B@@@@@@@@@@$@$@@@@@$@@@Mz@B@#! \\\"^ \\n \\\\Xw$g _ . yJ_\\\"BB@@@@@@@@@@@@@@@@$@@@5@$@2BR[ ./ \\n FP@w@g$_n@$@@M@*y$@@@@@@@@$@@@@@@@B@@2$@M@@@e> .W' \\n y#@$@@@@$$~~ ~4$@@$@@@@@@@@@@$$$@@@@@$$@MBER$%< <^' \\n l6$d@@@B@L a@@@@@$@@@@@@@@$@@@@E@$$@$B@Rm@\\\"_/, \\n BM$g$@5gmezvB$$$@@@@$$@@@@R@@$$@@@$@#$@@@@R$$@(.` \\n ~12KMy@R@@$@$@R@$$@@@@@@$E@@@AB$A@@@AR@@@@KE@Gz \\n '@kRM@$@$@$gR8@@@@$B$@R@g@g@@$@@$@@$Ra$@@@$Z` \\n ^?WE@x@@@@@@@@$$b$@g@@@@@gB4@$R$BBMRMyTT' \\n \\\"4QB@@@M@$R$@$@@@$@RE@@@A5$R@BQM@M#P\\\\ \\n ~^@j@&_gm$@%4T$B@@@W$@@UK@#W7~7' \\n CtHP@$02WR@14@5Z2FA#3j\\\\J: \\n '\\\"r'F5$~(G@7_$TM$4>^ \\n ' \\n \\n\"\n },\n {\n \"index\": 22,\n \"distance_km\": 395633.7,\n \"libration_elat\": -2.548,\n \"libration_elon\": -5.238,\n \"ascii\": \" \\n \\n `` , ;/ >_, \\n ,_ +,P> * y _ ~ 'u_ \\n :{T` `~=$WWk_r, _#P+ \\n ~ _yD$@@g0Es&#ZB@'x. \\n _ , @@@@Ea8@@bEY$@@sGL2t \\n f^ Y '' . .w_ _$@@B@' `=3'25Zp$$>a#Iu \\n g_:.g$_RMzy$U$@@$#E7 . Rg$@$@HgaEK` \\n $@wR$@@@@$@$@$@$$@!y- g! .g@BB@$@$$M,3 \\n . -@@@@@@@@@@@$@@$$@@@$@s$L ?BB$$B$@RMXFW, \\n ` ~C$$$@@@@@@@@@@@@@@@$@@@?E_;]=^ 1@@WE {( \\n >M `RZ$$@@@@@@$@$@@@@@@@0RgB2r ~M@$_ 4' \\n (@+ . %@@@@@@@@@@@@@@@$@@@B$$$R@$w+ ~A_52v_xr \\n ~^MkFwa-wK `XF2@@@@@@@@@@@@@@@$@$$@@@$$sA^ ' ~@$}'^ \\n w$$$g$@$N`wty@@@$@@@@@@@$@@@@$@@@@@$@B$#_ `_' \\n M$@B$g^ AB$@$R$R@@@@@@$@@$@@@@@$$@@$@G( y,]\\\" \\n ~sf#R@,_ y$H@@$B@@@@@@@@@$@@@$@@$@$@$5R$yyw-^W4h; \\n I}V5@K@@ME+R@@@$@$@@@@@@@@$$$@@@$@@R$$BgF4@_'T#_ \\n m\\\"y*$@$#@@@@$@$@K@@@$@@@$@@@5$@5@@@B$B@@@RQ@_X` \\n ~\\\"$~@g$$R$@@$$@@@@@@$@$g$@$R$@B$g@E$Z@@@$sx. \\n ^FP$@$@@@@@@$@@@$a@@$$$@@$$g@@A@@g$@@@5VF \\n ^ ~/`~$@K@@$@@@@$AE$@0@@B@$B$@a4?P@P\\\" \\n uW&\\\\@m@ETRDH@Hg$sRgS@E&N@5@%6^X \\n ' u3@#pME@RS@PQ4RWKRMkz@ `. \\n r{^M=Fi@9#KEP(K7~/ \\n `~ \\n \\n\"\n },\n {\n \"index\": 23,\n \"distance_km\": 396804.0,\n \"libration_elat\": -5.205,\n \"libration_elon\": 5.066,\n \"ascii\": \" \\n \\n T - \\n .x*zZTn>-- _ . . \\n .. a_0F ~` n4M_;. ~u. \\n '~ ,^@g$$gw_;kw, \\n . ._w{ , __' r@$R$R#@$tfU~_x;. \\n . ?X?E$`_~G _: __+ _@E$@^~~?kic%\\\"$/$ \\n p @B%<#$$y@$W@$@@6@$@F y@_z@sl| \\n n__ _M@@$z#$$@@@@@@@@4$0@ `A$@@g$( \\n 4JK& , g@@@@@@@@@@@@$$@@@$@@$( # 9gKzgW&\\\\ \\n jD@z_ +#@@@@@@@@@@@@@@@@@@B@W@m hN~\\\"5#F^ \\n ?7#.@ 1 \\\\r ~$@@$$@@@@@@$$$@$@@@@@ < 'MRy V \\n N%P#Rg _ ~W@@@@@@@@@@@@@@@@@@@g$,' -. r~$, j \\n NGqQ@@$Ejy$gg$2s@@@@@@@@$@@@@@@@@@@5@@a,{Zg, ; ^ 0< \\n (3H4@@B@$@@$#=~t0@@@@@@@@@$@@@$@@@@$@@$@@$@$$ ' \\n `4Hg$B@@@$F`. \\\"4@@@@@@@@@@@@@@@@@@@@E$@$$e@W, j \\n KR$$bR$$@gZ_vzg$@@@@@@$@@@@BB@$@E@@gB@$-g@E$) \\\\` \\n Eeb@@$@$WgW@@Eg$$@@@@@R@$@$@$@@$@@@$B@$f@R)P@ . \\n ~75RR#$@$@@@B$@@$$@@@@@@@@@@@$W@M$$BB@$@E2B_jn^ \\n =W%B@_@@$B@@$$@@$@$@@B$@R@B@@$@@M$@D$$@RMBX \\n ~~#M@0@M@@@@@@$s@@$$$BE@#@@$@W$@$g@B@B@>~^ \\n ~#w7%,wRG$@M$$@@@$@$&$@$@@$@@M$gRR@^^ \\n Ry$aG0$#MM45$$ZZR@$a3@@0@$R@2pM` \\n `'=4Kh5M$K4AN*@tSd$sT&C^~} '` \\n \\\" ~TF_75@RgmF4`~ \\n ``~``` \\n \\n\"\n },\n {\n \"index\": 24,\n \"distance_km\": 396918.3,\n \"libration_elat\": 1.016,\n \"libration_elon\": 4.987,\n \"ascii\": \" \\n \\n ~ r .:c . \\n . ju ]>_^*Y=yL ' ` . \\n .W> m@wy+l_ M~ \\n ` ,ggm@Eg$WRwx_!_ \\n . L$Eg@K`4$_dW$ \\\\wY \\n _R4B$ ~).{. ,.sELgB@$E. ` yWw4aggy: \\n `7kp>_ggy#Tg@$M@$@Wg . `4@$@R$@y \\n ,$@$g$@@$$@@@@@B$@@$y_ - ?ER@22R]>, \\n >. ,. 1z@@@$@@@@@@@$@@@@@@@@$@gp `\\\"@~~2$$Y^~) \\n vZr BW@@@@@@@$@@@@@@@B@g@@gB 7 jY$l \\n 4v$y . ` ~@@@$@@@@$@@$@@@$@@@@@. - \\\\Y4w ) \\n }A_z, ' ;;@@@@@@@@@@@@@@@@@@@@g$sI W*_ ,{^ ^@L' \\n T@#R@yy).y__$W-y@@@@@@@@@$@@@@@@@@@@@@$g@@$$( \\\"I \\n .X@9a$@gy$@@@$$=$g@@@@@@@@$$@@@@@@$$$@0$@@$#f >J \\n 9D$$@$@R$R JB@$@@@@@@@$@$@@$@@@B@g@@G0@@D_ N \\n :s$E@a@$@my _ggB$$@@@@@$$@$B$@$B$@@@BE@E0MQmM / \\n 7X@@@R$@@@@ggR@@@@@@@@@@$@$@$@d@@M$@$$W@@g@Ly$M) \\n myX$$K$@@@@@B@$@g$@$@@$@@$$@@@$@$@$M$$@@@$@g/l \\n \\\"?-&@@Z5$@@g@$@@@Q$g@$@$$@@@@$$@@R$@@W@@@gMG^ \\n \\\"7#5@0E@@@@Z@B@$B@$@@@$@$B@@@@B@$5$$$@R$'\\\" \\n \\\"0M$M4FD@@$@$@$$@@RB@@$@$E$RN0$PW0~~ \\n ~5@<X@$0j@$#~$B@ZE@$gR%RA0EM7?\\\"~ \\n '*TT3m4aH@2@RW$3M$P=BzR)^: \\n ` A<?X%f_WmPg@EM-`\\\" \\n ` \\n \\n\"\n },\n {\n \"index\": 25,\n \"distance_km\": 402200.1,\n \"libration_elat\": 0.434,\n \"libration_elon\": -3.119,\n \"ascii\": \" \\n \\n \\\\ r \\n ___< *r z_ ? \\n . ~ `''P0wvzkyu _M:n. \\n v __$B$MRM#%e$XgZLn_ \\n ` 'd@$B@b4@$%%%@M@4drY- \\n +A 5 ~ .___a$@$$~ ^``R$w$$#@@G~, \\n v2x a@y*HkW$R$$$8yP 4$@bB$$@$@w: \\n g@_D@$@@@@@$@@2$$@_.Jy\\\\ BR$@@@$E6Rw& \\n ug@@$$@@@@@@$@@@@@@$@@@$:, &#MF2R$EW~'/W \\n x `E$B@@@$@@@@@$@$@@$@@@@%~(ye ` 44$#F 'r \\n !, 5y@@@@@@@@@@@$$@@@@@@y$$yw . ,*YMEG > \\n 4[$ j 32@$@@@@@@@@@@@@@@@@@@@@@$MM`_mMF =bb^\\\" \\n 45tgy: _ g_ .\\\"R$$@@@@@@@@@@@@@@@@@@$$@@@@$` . ''4* \\n (j@$aDB@@%X Ly$@@@@@@@$@@@@$@@@$@@$@@g@$a_ W, \\n (@0R@E@' `5@@@@$$$@@@$@$@@$@$B$@@@W@$M$PL_ yr/. \\n Jm4XR@9;_ _ggF0@@@$@$@@@@$@@$$$$@@@@@$$@KZM@';e!j^ \\n 3Y@M@$@wy$E_5$@@@@@$@@@@@$$$@$$@@@@@@@$@$WZ$$~i^ \\n t)753M$@#@@$@$@@@@@@R@@@@@$@E$@@$$B@$W@B@@$Gl' \\n V@G~@g$$0@@@B@$$@@@@@@$$B@@$@$$$@$WR$WW$W<( \\n ~%p2#B$@$@N05@W@@@$$$$$$@@@@$@g$@@@M@Wz \\n ^~`/`^PW@@@@$@B$$E@$@$@$BBg@@WERKC,\\\" \\n 'V?hg$q#E2A@M42@g@GRMg@*wK@l~)' \\n {7$k$n5HMDA@wBF$%bwmyI + ~ \\n 'Y~~ *bv@4$$K'?~ '\\\" \\n \\n \\n\"\n },\n {\n \"index\": 26,\n \"distance_km\": 402352.2,\n \"libration_elat\": 5.638,\n \"libration_elon\": -2.986,\n \"ascii\": \" \\n \\n . . \\n __| -;<pN__ _ ~ g.. \\n xP' @R$@SpJV.$U4+^ \\n r~ _@@@BBR@@Z@HeP$@yl^t. \\n j@s$0\\\"`~R\\\\F$E,g$$gmQJi \\n - . ,. (_j$@@@\\\" MW@$0mA@E&n_ \\n ``, ysg\\\\%ygP5@$@$F /_ 4@$$@@0R@a\\\\j. \\n 2L @W$@a@$$@@g@$@@a~u@ %TBFg@$Z}'^`X \\n y$@z$@@@@@@@@@@@@$$@$@@~'.u.^ <@gK@ \\\". \\n . -@$@g@@@@@@B@@$@@$$@@@@$W$M-_ _>aMgz, 3' \\n ' `'~2B$@@@@@@@@@@@@@@$@@@@Bg@$@^`aE*~^kmz~ \\n F .D$$R@@@@@@@$@@@@@$@@@$$$@@@gg' ^$)(; \\n ,p y 'sF@$@@@@@@@@@@$@$@@@$$@@D2@y> ?^}, \\n !{P@_;A$@T$=L$@@@@@@@$@@@@@@@$@@$$@@@@B#RN_,x7Aw7 \\n 't$$R@@F~ `TE$#@E@@@@@@@$@@@@@@@@$@@E@@$0$@@P2|ctx \\n j$B@$# +@Mg@gg@$@@@@@@@@$$@@@@@@$g$@g@g$$$9vy! \\n >rQ@0EgWw@@%M$R@@@@@@@@@@B@@@@@$$@@@R$$@E@@@MPF/ \\n \\\"9?a$@@@@B@@@@@$@$@$@@@@@B@@$WRg@$R@$B@$$@WM6F \\n N~(@v$$g@ZB@$@@@@B@$$@@E@@@@@@b@E@@n$@ME2Vl` \\n `\\\"W@y0@B@$@$$@@Q$$$@@@BEB@@@@M@g@$R$$PV' \\n ~2@@~^TK$@#@@#@@@g@@ME$@$E$4#E@$4< ~ \\n \\\") u*yv2$2V5RW@W$RBW$g@RA[f(*`: \\n /*_\\\"<sd9t($5$$g$7RbJR*&7 ~ \\n ~~ #<`+MLN%~DJM/^ ` \\n \\n \\n\"\n },\n {\n \"index\": 27,\n \"distance_km\": 402371.7,\n \"libration_elat\": -5.458,\n \"libration_elon\": -2.965,\n \"ascii\": \" \\n \\n ..~ . . y , \\n ._wIq;ws _._ !`P- , \\n ,p4 ~ ^r*$_w... `\\\"5s. \\n ^ ,X@@$gWWm_aEKv \\n __; , .$@$$B9@@@$<@g$Wf\\\"x \\n -^??K `; _.. @@B@E\\\"~fMQ$a@=$RS_l. \\n , z__g@gWasw0@y$E@@RA yWa|B$4&jF \\n .g@$j@$$@@@$@@$@@$g$'' t@g@6@@%e ; \\n m+ @@$@@@@@@@@$E@@@$@@$yWu#~ K$g$B@#RPW\\\\ \\n v$. P3@@@$@@@@@@@@@B@@@@@@g9- ^4@YM@@g@! /: \\n >,_ ! 5$@E@@@@@$@$@@$$@@$@B\\\"p_* . 0$W# ' \\n v$g , / @@@@@@@@@@@@@@@@@@@@$N$j.$_ ,*=X@_ y \\n /a&yE)awgBw_M4@$@@@@@@@@$@@@$@$@@@@NK$$_'veMr^Z$Q` \\n #$N$$N@@MP M3L9$@@$@@$@@@$@@@@@@@@@@@M@$0~ `\\\"^ \\n #Z@$@$$^ 4y@@@M@@@@@$B@@@@@$@$Rg@R$@@yM \\\\\\\\ \\n K~@RBs`w_,j$F@@$Eg$@@@R@@@$$@@@@B@@6@@$$(, .qWe \\n x#W$$@$@@@$i$@@@@$$@@@@g@$@@$@@@@@@$5@B@Z0@ K{. \\n \\\\eM$A@$$$@@@$$@@@R@@@@@R$@$$$@@@9A$$$gBy_aa\\\\ \\\" \\n o7k@0BREA@@@@$$@@@$@$@@$$R$$W$@@@@$$g@P@b} \\n '83yFBA@$$M@$@R@$$@#R$@$@@$$$@@R@$g#bQH' \\n ^!w_'V@$@@Bg$$F@dM5$$@@@R$Z$@$@@@E/!' \\n =>fmMWEPSZM5RB5@A@B0$Ba$0$T\\\\A+(~ \\n ^ ^#~fAIf@@@h$M5p@JEkX^F'' \\n `' `P^@degNB+M?P\\\" \\n \\n \\n\"\n },\n {\n \"index\": 28,\n \"distance_km\": 403437.1,\n \"libration_elat\": 5.803,\n \"libration_elon\": 2.179,\n \"ascii\": \" \\n \\n . ; . . \\n . , >; =_z/r_ `^r- \\n .:=~ ~d@ywgyg_Ll]-1 , \\n >^ yg$$@4@@JWTg$9Gx\\\"; \\n gm&@M~~~#?\\\"EW_k@yG' \\n . ,+;_ r x ,Lym@R@s' $@g$@Ay?#._ \\n ~`<_ +gzwsAsAgs@@$z$* i N$$6R@$@/_. \\n ysGyBE@@@@@$@@$@$@Byw_r MDRBB@@^^\\\"t, \\n u$@@y@@@@$@@@@@@@@@5@$$F~^.+'' ABg( `- \\n . #P$@@@@$@@@@@@@@$@@@$@$L,w\\\" ; _-fR1 > \\n Ae ~~@E@$@@@@@@@@@@@@@@@@$LmmyEZY uz&\\\\\\\"H*X~ \\n .N^ - JD@$@$@@@@@@$@$@@@@@@@$@$$M@WZ ^^X \\n tzg _J rT$@@@@@@@@@@@@@@@@@$@@@@$0$$R_ ^C \\n v%W4g~e$$@@[E=L$B@@@@@@$@$@$@@@$@$E$@@$$BRP_ ym/ \\n ^y@$$N@@@~~ 'fE$@@@$@@@@@$$$@@@B@$@B@@@@@@$@Wi G\\\"+ \\n Kf$$@$9$_! q$@@@@$@@@@@@@@$@@@@@@@@@@g@BXgy2${z \\n !t2@eQ0gggN@@@R$B@$$@@@@$$@@@@@@@$@$$$$gA$A$gEm| \\n `@k2W$@@@R$@Bs@@@$@$@@@@@@@R@@$@$@@@BgW@@@R2{\\\" \\n T3za@@0$$$$@$$@$E$@$@$@$0W@@@$@$$$R$ZR@B@Fs~ \\n `zRMy$@@0@@@$@@@E@@@@EhM@@@@@$2p@5gW$~~\\\" \\n `^?&$W@5Q0m@@@@$@$@@$$$3$k@@@$PGR$F~ \\n `]U_#x$2$@$Iy$@k0M5F@@kY@%mr~^~' \\n \\\"k?RK@F4@$&Gg$RMF4C@XV? \\n ` '^-~'~'7MA*Z%T~~ \\n \\n \\n\"\n },\n {\n \"index\": 29,\n \"distance_km\": 403723.3,\n \"libration_elat\": -1.613,\n \"libration_elon\": 1.645,\n \"ascii\": \" \\n \\n .. : ;-. \\n +y__ Jv/ , {! .. \\n _W~ ` ''YIg>*g,.,,{<. \\n J\\\" ug@@@@0@fvN2R_, \\n R@@$@R$@$5M#WhE. ; \\n x04s* ^l __ :_, 4$g@$' `P\\\\^fPjAbyK}. \\n 2_>iWayKQysg$@$@$#@ R$@ZAW05_ \\n $@KZ@@B@@@@@@@$@R$w / v@@$@@5@x^ \\n ._ g$@@@@@@@@@@W@@@$@@@gy4} <g9@MMMZXR^. \\n |$ ~B$@@@@@@@@@@@@@$@@D$@@@~\\\" : ~ #S@k \\\"! \\n jTg, ~4@@$@@@@@@@$@@@@@$@@g,z \\\" J~$w \\n ty%* ' 14@@$@@@@@@@@@@@@@@@$@KmYx*_u wm'%xuU \\n \\\\RA$x*Y_vygy-JF@@@@@@@@@@@@@@@@@$@@$by@WRmk^ 7N \\n ^@$@@@@@@B@TJ-$y@@@@@@@@@@@@@@@@@D@@@@B#@Y\\\\ : \\n 1W$#R$@@P . 7Hg@$@@@@B@@@$@@@$@$@B@$@K$@$*_ .GK \\n Y&2AMBgEi_._zgR$@@@$@@@$@$@@@$@$@@@@@@@@$@$g+ R~ \\n ?y2#MMW$@$$@BB$@@@@@$@@@@$@@@@$@B@$@$@gP$@~yy_': \\n =Wg@$@$@$$@B@B@@R@@@@@$$@$$$@@R$@$@$@@@$@R0@'< \\n ~%|A#Z$$@@2@@@@@$@@@@g@@0@@@$M@@@@R$@0@$@@U` \\n ~=Zy$$@@B$$$#@0B$$@$@R@$@@@@B@@R@@$ByZY~ \\n \\\"V~15P{24@0$@$@@R$Q@mBm0@@@g%8@B6M^~` \\n oFe$9Z52g$$$5EE#M$@@RKRVRmVY \\n ' \\\"Aw9@R4g$M$g$$$@9yjC~`~ \\n ' ^!`!~P%$%s-fr\\\"`~ \\n \\n \\n\"\n },\n {\n \"index\": 30,\n \"distance_km\": 404313.4,\n \"libration_elat\": -5.652,\n \"libration_elon\": 1.402,\n \"ascii\": \" \\n \\n +. - _ \\n ,-m1_yz_.l~ !]~J \\n _$#` \\\"` \\\"r|kz__L ` : \\n ^ ` .X@@$mWgy.ym?. \\n y_ , ug@@$H2g@R{MYW*r \\n +=hP# ft ._,. _ \\\"$$@$=~4@YByB?sHx \\n , .$K@VKyy$ssg@$a$$@@$T `` Zsi#R$64 \\n ^, -@@$2@$$@$@@@@g@@@$E . 7g@zag@/> \\n em\\\" .s@@@@@@@@@@$$B$$@E@@$y:u) /$@m$B@$X' \\n 3nM; t@@@@@@@$@@@@@@@@@@@@gQw {0~~$B#M\\\"'_ \\n dtyk ^$@@@@@@@@@$B@B@$@@@@E -/ ` M4E$ ~ \\n @mHA_ . r @@@@@@@@@@@@$@@@@$@@@>\\\" uX@ \\n K@3B@$y-$g$g.{A$@@@@@@@@@@@@@@@@@@@$@ D$E _ <~@e( \\n &Q$BBR#$@R== \\\\BW@@@@@@@@@@@@@$@@@$@$$$$$@$E # \\n z8M0M@@@E R@$$@@$@@@@$@@@@$@@@@$@@M4R5r -` \\n ?MBys$@$a_;wZ@@@@$$$@@@@@$$@$@$$@@$@R$@$$X< *# \\n tX)A@@$@$@$@W@@$@$$@$@@@$@$@@$$$$$@@$d$P6R@F r\\\" \\n ^AK@$A$$$gA@@R@@@@@$@@@D@$@@@@$@$QMZ@$@7e_am \\n ~b8kB$$BRB@@$$@@@B@@$g@@g$$@$$$$H$$$W$MMs( \\n `\\\"?4@@K4@g$@$@$@W$@$@@$g@$@$gB@@s@W$&@2l? \\n `0}3y_`M$@$$@$$BPd@50@@@@@@@$@@@TWT' \\n ^z\\\"4R$JBR_$5aR?@@2$@$@HBMA0#BF^ \\n `^ FTT\\\"$A#$RW$Z$y=Y%1@ ' ' \\n '~~A'FZ7I0~7?^^' \\n \\n \\n\"\n },\n {\n \"index\": 31,\n \"distance_km\": 404638.4,\n \"libration_elat\": 2.826,\n \"libration_elon\": 0.232,\n \"ascii\": \" \\n \\n . . >r - \\n ._:z m;-y., = . \\n n\\\\F` ^ `'3ggLtg$ p w5,r \\n ` jygM@Ea@GWyYMZ$_ i \\n M@E$$R`4@Z@dM^$RxI': \\n _qN$ \\\"_ . __pA@@$F `` a#92@@&8K? \\n `L- jyggSss_$B@@@D$ ^ @$$$$@$gC \\n ;@m_dR@@$@@@$@$$@@0yr R ;1@$@@@V3~?< \\n _0@@$@@@@@@@$@@@$$@@$g@$>+ Mt\\\" z@@0~ , \\n .j t@$@@@@@@@@@@@@$@$@@@$@m _4^. .~~@@_ ' \\n </ . ~@M$@@@@@@@@@@@@@@$@@$M$-xw,, '1J~#>,=| \\n +_' 1$@@$$@@@@@@@@@@@@@@$@@M$a@gu$Y ~TV\\\" \\n >Z@__, __y' r~@@@@@@@@@@@@@@@@@@@@@$$@$@HL ` \\n h4N@@JM$@$E^ ty@@@$@@@@@@@@@@@@@$@@@@@@@@R{ ,`( \\n \\\"R#B@$$$F` '@@$@@$@@@@@@@@@@@@@$@#@@$@B@W7gy {Y, \\n A$T@$$2- -gK$$$@@@@@@@@@@$@@$@@@@@@$@@IRF4yU~: \\n tdaN$@$@ym@&@@@@@@@$@$@@@0$@$$W@$@@@R@6$g@BD/+' \\n \\\" V8PMRB@@$@@@B@$@@@$@@$$@@@@$$@E@$R$Kb$A0s$W/ \\n ~wX@@MB$B@A@B@B@@M$Bg@$$@@@B@@@R@@@$B#B@MM\\\"' \\n 'Js$d@$$@$@@%$@$@@@$@$@$$@@$$R@9$MBMG#!' \\n ~4MR+e~Tb@@@@@@@$@@a@@R$@@9$m$Qm[Xn \\n `!~E6$5gM5W_RW@@@R$ER@b0bCs\\\"Q~ \\n `~-'UR?@9@-ER$@@5g2_wuhX - \\n 'FFF'\\\"Z\\\"@MGR^^'` \\n \\n \\n\"\n }\n ]\n}","import type { MoonState, RenderOptions, MoonAsciiDimensions } from \"../core/types\";\nimport moonData from \"./ascii.json\";\n\n/** \n * Fixed frame size in characters.\n * Width: 60 characters\n * Height: 29 characters\n * Characters have a 10:22 width:height aspect ratio, meaning each character\n * is roughly twice as tall as it is wide. This affects how we calculate\n * circular shapes like the moon's phase.\n */\nexport const FRAME_W = 60; // characters\nexport const FRAME_H = 29; // characters\n\n/**\n * Texture orientation offset in degrees.\n * \n * This compensates for the baseline orientation of the pre-rendered moon textures.\n * The moon textures were generated with a specific orientation that may not align\n * with celestial north. This offset rotates the texture to align with the standard\n * astronomical orientation (celestial north up) before applying the parallactic\n * angle transformation.\n * \n * Value determined empirically by comparing rendered output with actual moon photos.\n */\nexport const TEXTURE_ORIENTATION_OFFSET = -45;\n\n/**\n * Calculate dimensions and center point of ASCII moon art by finding non-space boundaries.\n * All measurements are in character units.\n * \n * This is used for phase calculations to:\n * 1. Find the actual moon size (excluding padding) which varies with distance\n * 2. Locate the exact center for phase angle calculations\n * 3. Determine the moon's radius in character units for phase masking\n */\nexport function asciiMoonDim(asciiArt: string): MoonAsciiDimensions {\n const lines = asciiArt.split('\\n');\n \n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n // Find boundaries of non-space characters\n lines.forEach((line, y) => {\n const firstNonSpace = line.search(/\\S/);\n if (firstNonSpace !== -1) {\n const lastNonSpace = line.search(/\\s+$/);\n minX = Math.min(minX, firstNonSpace);\n maxX = Math.max(maxX, lastNonSpace === -1 ? line.length - 1 : lastNonSpace - 1);\n if (minY === Infinity) minY = y;\n maxY = y;\n }\n });\n\n // If no non-space characters found, return frame dimensions\n if (minX === Infinity) {\n return {\n width: FRAME_W,\n height: FRAME_H,\n centerX: Math.floor(FRAME_W / 2),\n centerY: Math.floor(FRAME_H / 2)\n };\n }\n\n const width = maxX - minX + 1;\n const height = maxY - minY + 1;\n \n return {\n width: width,\n height: height,\n centerX: minX + Math.floor(width / 2),\n centerY: minY + Math.floor(height / 2)\n };\n}\n\n/** Clamp helper */\nexport function clamp(v: number, lo: number, hi: number) {\n return Math.min(hi, Math.max(lo, v));\n}\n\n/** Convert degrees to radians. */\nfunction rad(d: number): number {\n return (d * Math.PI) / 180;\n}\n\n/** \n * Calculate sun vector in the standard celestial reference frame.\n * \n * Coordinate system (standard astronomical orientation):\n * - +X points to observer's RIGHT (celestial west when facing south in NH)\n * - +Y points DOWN (screen coordinates, toward celestial south)\n * - +Z points toward observer\n * \n * The sun direction determines which part of the moon is illuminated.\n * This is calculated in the celestial frame (north up, east left) and the\n * result is later rotated along with the texture to the observer's frame.\n * \n * @param phaseAngleDeg - Phase angle in degrees (0° = full, 180° = new)\n * @param brightLimbAngleDeg - Position angle of bright limb in degrees (0° = north, 90° = east, etc.)\n * If undefined, falls back to simplified waxing/waning assumption.\n * @param isWaxing - Fallback: if true, sun is west (270°); if false, east (90°). Used when brightLimbAngle unavailable.\n * @param elatDeg - Libration in latitude (degrees). Tilts the terminator.\n * @returns Normalized sun vector {sx, sy, sz} in celestial frame\n */\nexport function phaseSunVector(\n phaseAngleDeg: number,\n brightLimbAngleDeg?: number,\n isWaxing?: boolean,\n elatDeg: number = 0\n) {\n const a = rad(phaseAngleDeg);\n const elat = rad(elatDeg);\n \n // Determine the angle from which the sun illuminates the moon.\n // If brightLimbAngle is provided, use it directly. Otherwise, fall back to the\n // simplified assumption that waxing = west (270°), waning = east (90°).\n let sunAngle: number;\n if (brightLimbAngleDeg !== undefined) {\n sunAngle = rad(brightLimbAngleDeg);\n } else {\n // Legacy fallback: waxing = 270° (west), waning = 90° (east)\n sunAngle = isWaxing ? rad(270) : rad(90);\n }\n \n // Convert position angle to sun direction in screen coordinates.\n // Position angle convention: 0° = north (up/-Y), 90° = east (left/-X), \n // 180° = south (down/+Y), 270° = west (right/+X)\n // In screen coords: +X = right, +Y = down\n // Direction to sun: dx = -sin(PA), dy = -cos(PA)\n const sunDirX = -Math.sin(sunAngle); // -sin because east is -X\n const sunDirY = -Math.cos(sunAngle); // -cos because north is -Y\n \n // Scale by phase angle: at full (0°) sun is behind viewer (sz=1),\n // at new (180°) sun is in front (sz=-1), at quarter (90°) sun is to the side\n const sx = sunDirX * Math.sin(a);\n let sy = sunDirY * Math.sin(a);\n let sz = Math.cos(a);\n \n // Apply latitude libration (tilts the terminator slightly)\n // Rotates the sun vector around the x-axis\n const sy1 = sy * Math.cos(elat) - sz * Math.sin(elat);\n const sz1 = sy * Math.sin(elat) + sz * Math.cos(elat);\n sy = sy1;\n sz = sz1;\n \n // Normalize the vector\n const mag = Math.sqrt(sx * sx + sy * sy + sz * sz);\n return { \n sx: sx / mag,\n sy: sy / mag,\n sz: sz / mag\n };\n}\n\n/** \n * Calculate Lambertian lighting intensity across a character's area using multi-sampling.\n * Each character is sampled at multiple points and the results are averaged.\n * This helps catch thin crescents that might only partially illuminate a character.\n * \n * IMPORTANT: No hard threshold here; we return the true average in [0,1].\n * Very thin crescents will produce small but positive intensities.\n *\n * @param xn - Normalized x coordinate of character center (-1 to 1)\n * @param yn - Normalized y coordinate of character center (-1 to 1)\n * @param sx - Sun vector x component\n * @param sy - Sun vector y component\n * @param sz - Sun vector z component\n * @returns Average intensity from 0 to 1\n */\nexport function litIntensity(xn: number, yn: number, sx: number, sy: number, sz: number) {\n // Size of a character in normalized coordinates\n const dx = 1.0 / FRAME_W;\n const dy = 1.0 / FRAME_H;\n\n // Denser 5x5 grid catches sub-character crescents better than 3x3\n const offsets = [-0.5, -0.25, 0, 0.25, 0.5];\n\n let total = 0;\n let samples = 0;\n\n for (const ox of offsets) {\n for (const oy of offsets) {\n const x = xn + ox * dx;\n const y = yn + oy * dy;\n const rsq = x * x + y * y;\n if (rsq > 1) continue; // outside the disc\n\n const nz = Math.sqrt(Math.max(0, 1 - rsq));\n const dot = x * sx + y * sy + nz * sz; // n·s\n total += Math.max(0, dot);\n samples++;\n }\n }\n\n if (samples === 0) return 0;\n return total / samples;\n}\n\n/** Find the nearest moon state from our pre-rendered set */\nfunction findNearestMoonState(state: MoonState) {\n // Weight distance more heavily since its range is much larger\n const DISTANCE_WEIGHT = 1.0;\n const LIBRATION_WEIGHT = 10000.0; // Scale up libration to make it more comparable to distance\n\n let bestIndex = 0;\n let bestDistance = Infinity;\n\n for (let i = 0; i < moonData.moons.length; i++) {\n const moon = moonData.moons[i];\n const distDiff = Math.abs(moon.distance_km - state.size.distanceKm) * DISTANCE_WEIGHT;\n const elatDiff = Math.abs(moon.libration_elat - state.libration.elat) * LIBRATION_WEIGHT;\n const elonDiff = Math.abs(moon.libration_elon - state.libration.elon) * LIBRATION_WEIGHT;\n \n const totalDiff = distDiff + elatDiff + elonDiff;\n if (totalDiff < bestDistance) {\n bestDistance = totalDiff;\n bestIndex = i;\n }\n }\n\n return moonData.moons[bestIndex];\n}\n\n/**\n * Characters have a 10:22 width:height aspect ratio.\n * This means a vertical step is ~2.2x larger than a horizontal step in pixel space.\n */\nconst CHAR_ASPECT = 22 / 10;\n\n/**\n * Rotates an ASCII image by a given angle in degrees (clockwise).\n * Uses reverse mapping (for each output pixel, find source) to avoid gaps.\n * Compensates for character aspect ratio (10:22) so rotation appears circular.\n * \n * @param ascii - The input ASCII string\n * @param angleDeg - Rotation angle in degrees (clockwise positive)\n * @param centerX - Optional X coordinate of rotation center (defaults to frame center)\n * @param centerY - Optional Y coordinate of rotation center (defaults to frame center)\n * @returns Rotated ASCII string\n */\nexport function rotateCharacters(ascii: string, angleDeg: number, centerX?: number, centerY?: number): string {\n // Normalize angle\n const angle = ((angleDeg % 360) + 360) % 360;\n if (Math.abs(angle) < 0.1) return ascii;\n\n const lines = ascii.split('\\n');\n const height = lines.length;\n const width = lines[0]?.length ?? 0;\n \n // Use provided center or default to frame center\n const cx = centerX ?? (width - 1) / 2;\n const cy = centerY ?? (height - 1) / 2;\n \n // Rotation in radians (clockwise in screen coords where +y is down)\n const rads = (angle * Math.PI) / 180;\n const cosA = Math.cos(rads);\n const sinA = Math.sin(rads);\n\n // Create output buffer\n const output: string[][] = Array.from({ length: height }, () => Array(width).fill(' '));\n \n // Reverse mapping: for each output pixel, find the source pixel\n for (let outY = 0; outY < height; outY++) {\n for (let outX = 0; outX < width; outX++) {\n // Convert output coordinates to centered space AND correct for aspect ratio\n // We treat X as the unit, so Y is scaled up\n const dx = outX - cx;\n const dy = (outY - cy) * CHAR_ASPECT;\n \n // Rotate backwards (inverse rotation) to find source position\n // Forward: x' = x*cos + y*sin, y' = -x*sin + y*cos\n // Inverse: x = x'*cos - y'*sin, y = x'*sin + y'*cos\n const srcDx = dx * cosA - dy * sinA;\n const srcDy = dx * sinA + dy * cosA;\n \n // Convert back to screen coordinates (un-correct aspect ratio)\n const srcX = Math.round(srcDx + cx);\n const srcY = Math.round((srcDy / CHAR_ASPECT) + cy);\n \n // Sample from source if in bounds\n if (srcX >= 0 && srcX < width && srcY >= 0 && srcY < height) {\n const char = lines[srcY]?.[srcX] ?? ' ';\n output[outY][outX] = char;\n }\n }\n }\n\n return output.map(row => row.join('')).join('\\n');\n}\n\n/**\n * Render a 60×29 moon using pre-rendered ASCII art.\n * \n * Algorithm:\n * 1. Select the nearest pre-rendered moon texture (based on distance and libration)\n * 2. Calculate sun direction in CELESTIAL frame (standard north-up orientation)\n * 3. Apply Lambertian phase lighting to create illumination mask (in celestial frame)\n * 4. Combine texture with phase mask (both in celestial frame)\n * 5. Rotate the COMBINED result by parallactic angle to match observer's view\n * 6. Optionally overlay horizon line\n * \n * Key insight: The phase illumination is a property of the moon itself (which physical\n * areas are lit by the sun). When we rotate the moon's appearance for the observer,\n * the illuminated areas rotate WITH the texture because they're physically attached\n * to the lunar surface.\n */\nexport function renderMoon(state: MoonState, _options: RenderOptions = {}): string {\n const options = _options ?? {};\n const showHorizon = options.showHorizon !== false;\n \n // Find the best matching pre-rendered moon\n const nearestMoon = findNearestMoonState(state);\n const asciiLines = nearestMoon.ascii.split(\"\\n\");\n\n // Calculate actual moon dimensions from the ASCII art\n const dim = asciiMoonDim(nearestMoon.ascii);\n \n // Sun vector in CELESTIAL frame (north up, standard orientation)\n // This determines which part of the moon is illuminated.\n // The brightLimbAngle gives the exact direction from moon to sun,\n // producing accurate terminator orientation for any date.\n const { sx, sy, sz } = phaseSunVector(\n state.phase.phaseAngleDeg,\n state.phase.brightLimbAngle,\n state.phase.isWaxing,\n state.libration.elat\n );\n\n // First pass: compute intensity map, raw incidence, and disc mask\n const intens: number[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(0));\n const rawInc: number[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(-1));\n const inDisc: boolean[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(false));\n\n let discCells = 0;\n let litCells = 0;\n\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n // Convert frame coordinates to moon-relative normalized coordinates\n const moonX = ix - dim.centerX;\n const moonY = iy - dim.centerY;\n const xn = moonX / (dim.width / 2);\n const yn = moonY / (dim.height / 2);\n\n const r2 = xn * xn + yn * yn;\n if (r2 > 1) {\n intens[iy][ix] = 0;\n rawInc[iy][ix] = -1;\n continue;\n }\n\n inDisc[iy][ix] = true;\n discCells++;\n\n // Lambertian intensity (averaged over cell)\n const I = litIntensity(xn, yn, sx, sy, sz);\n intens[iy][ix] = I;\n if (I > 0) litCells++;\n\n // Raw incidence at the cell center (useful for ranked fallback)\n const nz = Math.sqrt(Math.max(0, 1 - r2));\n rawInc[iy][ix] = xn * sx + yn * sy + nz * sz; // may be negative\n }\n }\n\n // Decide which cells are \"lit\"\n const litMask: boolean[][] = Array.from({ length: FRAME_H }, () => Array(FRAME_W).fill(false));\n\n if (litCells > 0) {\n // Normal case: any cell with positive average intensity counts as lit.\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n litMask[iy][ix] = intens[iy][ix] > 0;\n }\n }\n } else {\n // Fallback for ultra-thin crescents: rank by raw incidence.\n // Target number of lit cells proportional to illuminated fraction.\n const frac = clamp(state.phase.illuminatedFraction ?? 0, 0, 1);\n const target = Math.max(1, Math.round(frac * discCells));\n\n const candidates: Array<{ ix: number; iy: number; v: number }> = [];\n for (let iy = 0; iy < FRAME_H; iy++) {\n for (let ix = 0; ix < FRAME_W; ix++) {\n if (!inDisc[iy][ix]) continue;\n candidates.push({ ix, iy, v: rawInc[iy][ix] });\n }\n }\n // Sort descending by raw incidence (closest to the subsolar point)\n candidates.sort((a, b) => b.v - a.v);\n\n for (let k = 0; k < Math.min(target, candidates.length); k++) {\n const { ix, iy } = candidates[k]!;\n litMask[iy][ix] = true;\n }\n }\n\n // Compose the ASCII frame in CELESTIAL orientation (texture + phase mask)\n const out: string[] = [];\n for (let iy = 0; iy < FRAME_H; iy++) {\n let row = \"\";\n const src = asciiLines[iy] ?? \"\";\n for (let ix = 0; ix < FRAME_W; ix++) {\n if (litMask[iy][ix]) {\n row += src[ix] ?? \" \";\n } else {\n row += \" \";\n }\n }\n out.push(row);\n }\n\n let composed = out.join(\"\\n\");\n\n // Apply parallactic angle rotation to match the observer's view.\n //\n // The composed image is in the celestial frame with north \"up\". The observer sees\n // the moon with zenith \"up\". The parallactic angle (q) measures the angular distance\n // from zenith to celestial north, going eastward:\n // - q > 0: celestial north is east of zenith\n // - q < 0: celestial north is west of zenith\n //\n // To transform from \"north up\" to \"zenith up\", we rotate counter-clockwise by q,\n // which is equivalent to rotating clockwise by -q. The rotateCharacters function\n // uses clockwise-positive convention, so we pass -q.\n if (state.position?.parallacticAngle !== undefined) {\n const totalRotation = -state.position.parallacticAngle + TEXTURE_ORIENTATION_OFFSET;\n if (Math.abs(totalRotation) > 0.1) {\n composed = rotateCharacters(\n composed,\n totalRotation,\n dim.centerX,\n dim.centerY\n );\n }\n }\n\n return showHorizon ? overlayHorizon(composed, state, dim) : composed;\n}\n\nfunction overlayHorizon(art: string, state: MoonState, moonDim: MoonAsciiDimensions): string {\n const pos = state.position;\n if (!pos) return art;\n if (state.size.angularDiameterDeg <= 0) return art;\n\n const altitude = pos.altitude ?? 0;\n const radiusDeg = state.size.angularDiameterDeg / 2;\n const topAlt = altitude + radiusDeg;\n const bottomAlt = altitude - radiusDeg;\n\n // Fully above horizon\n if (bottomAlt >= 0) {\n return art;\n }\n\n const lines = art.split(\"\\n\");\n const degreesPerChar = state.size.angularDiameterDeg / Math.max(1, moonDim.height);\n let horizonRow = moonDim.centerY + altitude / degreesPerChar;\n horizonRow = Math.round(clamp(horizonRow, 0, FRAME_H - 1));\n\n let label: string;\n if (topAlt <= 0) {\n const below = Math.abs(altitude).toFixed(1).replace(/\\.0$/, \"\");\n label = `${below}-deg-below-horizon`;\n } else {\n label = \"horizon\";\n }\n\n lines[horizonRow] = makeHorizonLine(label);\n return lines.join(\"\\n\");\n}\n\nfunction makeHorizonLine(label: string) {\n const normalized = label.trim().replace(/\\s+/g, '-');\n let content = `--${normalized}--`;\n if (content.length > FRAME_W) {\n content = content.slice(0, FRAME_W);\n }\n if (content.length === FRAME_W) return content;\n\n const remaining = FRAME_W - content.length;\n const left = Math.floor(remaining / 2);\n const right = remaining - left;\n return \"-\".repeat(left) + content + \"-\".repeat(right);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ascii-side-of-the-moon",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Tiny Moon phase/size/libration + Unicode terminal renderer. Zero runtime deps; dev-only almanac generated with astronomy-engine.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",