Ë
    }D™j‡  ã                  ó’  — d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZ ddlZddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 d#d„Z1dddddœZ2d$d„Z3	 	 	 	 d%d„Z4 G d„ d«      Z5 G d„ d«      Z6 G d„ d«      Z7 G d „ d!«      Z8g d"¢Z9y)&a�  Backward compatibility shims for legacy Kerykeion v4 public API.

This module provides wrapper classes and aliases that emulate the old
(v4 and earlier) interfaces while internally delegating to the new v5
factory/data oriented architecture.

Import pattern supported (legacy):
    from kerykeion import AstrologicalSubject, KerykeionChartSVG, SynastryAspects

New architecture summary:
    - AstrologicalSubjectFactory.from_birth_data(...) returns an AstrologicalSubjectModel
    - ChartDataFactory + ChartDrawer replace KerykeionChartSVG direct chart building
    - AspectsFactory provides both single and dual chart aspects

Classes provided here:
    AstrologicalSubject (wrapper around AstrologicalSubjectFactory)
    KerykeionChartSVG (wrapper producing SVGs via ChartDataFactory + ChartDrawer)
    SynastryAspects (wrapper over AspectsFactory.dual_chart_aspects)

Deprecation: Each class issues a DeprecationWarning guiding users to the
replacement APIs. They are intentionally minimal; only the most used
attributes / methods from the README master branch examples are reproduced.

Note: This file name is intentionally spelled 'backword.py' per user request.
é    )Úannotations)	ÚAnyÚIterableÚListÚMappingÚOptionalÚSequenceÚUnionÚLiteralÚcastN©Údatetime)Úcached_propertyé   )ÚAstrologicalSubjectFactory)ÚChartDataFactory)ÚChartDrawer)ÚAspectsFactory)ÚDEFAULT_ACTIVE_POINTSÚDEFAULT_ACTIVE_ASPECTS)Únormalize_zodiac_type)ÚAstrologicalSubjectModelÚCompositeSubjectModelÚActiveAspectÚSingleChartDataModelÚDualChartDataModel)ÚKerykeionChartLanguageÚKerykeionChartThemeÚ	ChartTypeÚAstrologicalPoint)Ú
ZodiacTypeÚSiderealModeÚHousesSystemIdentifierÚPerspectiveType)ÚPathc                óH   — t        j                  d| › d|› �t        d¬«       y )Nú'zR' is deprecated and will be removed in a future major release. Please migrate to: é   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarning)ÚoldÚnews     ú^/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/kerykeion/backword.pyÚ_deprecatedr1   >   s'   € Ü‡M�MØ
ˆCˆ5ÐbÐcfÐbgÐhÜØöó    ÚMean_North_Lunar_NodeÚTrue_North_Lunar_NodeÚMean_South_Lunar_NodeÚTrue_South_Lunar_Node)Ú	Mean_NodeÚ	True_NodeÚMean_South_NodeÚTrue_South_Nodec                óà   — | €yt        | «      }|j                  «       }|dv r4|dvr0t        |«      }t        j                  d|› d|› d�t
        d¬«       |S t        t        t        |«      «      S )	ak  Normalize legacy zodiac type values with deprecation warning.

    Wraps the utilities.normalize_zodiac_type function and adds a deprecation
    warning for legacy formats like "tropic" or case-insensitive variants.

    Args:
        zodiac_type: Input zodiac type (may be legacy format)

    Returns:
        Normalized ZodiacType or None if input was None
    N)ÚtropicÚtropicalÚsidereal)ÚTropicalÚSiderealzZodiac type 'ú&' is deprecated in Kerykeion v5. Use 'ú
' instead.é   r)   )ÚstrÚlowerr   r+   r,   r-   r   r!   )Úzodiac_typeÚ
zodiac_strÚzodiac_lowerÚ
normalizeds       r0   Ú#_normalize_zodiac_type_with_warningrJ   O   s‡   € ð ÐØä�[Ó!€Jð ×#Ñ#Ó%€LØÐ9Ñ9¸jÐPhÑ>hä*¨:Ó6ˆ
ô 	�‰Ø˜J˜<Ð'MÈjÈ\ÐYcÐdÜØõ	
ð
 Ðô ”
Ô1°*Ó=Ó>Ð>r2   c                óJ  ‡— | €yg }t         }| D ]�  Št        ‰t        «      re‰t        v r3t	        j
                  d‰› dt        ‰   › d�t        d¬«       t        ‰   Št        ˆfd„|D «       d«      }|sŒf|j                  |«       Œx‰|v sŒ}|j                  ‰«       Œ� |xs dS )a„  Best-effort normalization of legacy string active points list.

    - Accepts None -> None
    - Accepts iterable of strings / AstrologicalPoint literals
    - Filters only those present in DEFAULT_ACTIVE_POINTS to avoid invalid entries
    - Returns None if result would be empty (to let downstream use defaults)
    - Maps old lunar node names to new names with deprecation warning
    NzActive point 'rA   rB   é   r)   c              3  óf   •K  — | ](  }|j                  «       ‰j                  «       k(  sŒ%|–— Œ* y ­w©N)rE   )Ú.0ÚvpÚps     €r0   ú	<genexpr>z+_normalize_active_points.<locals>.<genexpr>�   s$   øè ø€ ÒH °·±³
¸a¿g¹g»iÓ0Gœ"ÑHùs   ƒ&1ª1)	r   Ú
isinstancerD   ÚLEGACY_NODE_NAMES_MAPr+   r,   r-   ÚnextÚappend)ÚpointsrI   ÚvalidÚmatchrQ   s       @r0   Ú_normalize_active_pointsrZ   r   sº   ø€ ð €~ØØ*,€JÜ)>€EØò %ˆÜ�aœÔàÔ)Ñ)Ü—‘Ø$ Q CÐ'MÔNcÐdeÑNfÐMgÐgqÐrÜ&Ø õô
 *¨!Ñ,�ô ÓH uÔHÈ$ÓOˆEÚØ×!Ñ! %Õ(à�EŠzØ×!Ñ! !Õ$ð#%ð$ Ò˜Ðr2   c                  óZ  — e Zd ZdZddlmZ ej                  «       Zdej                  ej                  ej                  ej                  ej                  dddddddddddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zed	„ «       Zed
„ «       Zed„ «       Zed„ «       Zdd„Zdd„Z	 	 	 d	 	 	 	 	 	 	 dd„Zedd„«       Zdd„Zdd„Zdd d„Zdd„Zed!d„«       Zed!d„«       Ze	 	 	 	 	 	 	 	 	 	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„«       Z y)$ÚAstrologicalSubjectzJBackward compatible wrapper implementing the requested __init__ signature.r   r   ÚNowNTFc                ó   — ddl m}m}m}m} t        dd«       |�t        j                  dt        d¬«       |rt        j                  dt        d¬«       t        |«      }|€|n|}|€|n|}|€|n|}|€|n|}t        j                  di d	|“d
|“d|“d|“d|“d|“dd“d|“d|“d|	�t        |	«      nd “d|
�t        |
«      nd “d|“d|“d|“d|“d|“d|“d|“d|“d|“Ž| _        t        j                   «       | _        y )Nr   )ÚDEFAULT_ZODIAC_TYPEÚ DEFAULT_HOUSES_SYSTEM_IDENTIFIERÚDEFAULT_PERSPECTIVE_TYPEÚ(DEFAULT_GEONAMES_CACHE_EXPIRE_AFTER_DAYSr\   z*AstrologicalSubjectFactory.from_birth_datau)   'disable_chiron' Ã¨ deprecato e ignorato.r(   r)   uc   'disable_chiron_and_lilith' non Ã¨ supportato da from_birth_data in questa versione ed Ã¨ ignorato.ÚnameÚyearÚmonthÚdayÚhourÚminuteÚsecondsr   ÚcityÚnationÚlngÚlatÚtz_strÚgeonames_usernameÚonlinerF   Úsidereal_modeÚhouses_system_identifierÚperspective_typeÚcache_expire_after_daysÚis_dst© )Úastrological_subject_factoryr_   r`   ra   rb   r1   r+   r,   r-   ÚUserWarningrJ   r   Úfrom_birth_dataÚfloatÚ_modelr%   ÚhomeÚjson_dir)Úselfrc   rd   re   rf   rg   rh   rj   rk   rl   rm   rn   ro   rF   rp   Údisable_chironrq   rr   rs   rt   ru   Údisable_chiron_and_lilithr_   r`   ra   rb   s                             r0   Ú__init__zAstrologicalSubject.__init__    s˜  € ÷0	
ó 	
ô 	Ð)Ð+WÔXàÐ%Ü�M‰MÐEÔGYÐfgÕhÙ$Ü�M‰MØuÜØõô :¸+ÓFˆØ-8Ð-@Ñ)Àkˆð 1IÐ0PÑ,ÐVnð 	!ð 8HÐ7OÑ3ÐUeÐà8OÐ8WÑ4Ð]tð 	 ô 1×@Ñ@ò 
Ùð
áð
ñ ð
ñ ð	
ñ
 ð
ñ ð
ñ ð
ñ ð
ñ ð
ð "˜o”�c”
°4øð
ð "˜o”�c”
°4øð
ñ ð
ñ 0ð
ñ ð
ñ $ð
ñ  (ð!
ñ" &>ð#
ñ$ .ð%
ñ& %<ð'
ñ( ð)
ˆŒô0 Ÿ	™	›ˆ�r2   c                óf   — t        j                  dt        d¬«       | j                  j                  S )z.Deprecated: Use mean_north_lunar_node instead.zO'mean_node' is deprecated in Kerykeion v5. Use 'mean_north_lunar_node' instead.r(   r)   )r+   r,   r-   r{   Úmean_north_lunar_node©r~   s    r0   Ú	mean_nodezAstrologicalSubject.mean_nodeñ   ó+   € ô 	�‰Ø]ÜØõ	
ð
 �{‰{×0Ñ0Ð0r2   c                óf   — t        j                  dt        d¬«       | j                  j                  S )z.Deprecated: Use true_north_lunar_node instead.zO'true_node' is deprecated in Kerykeion v5. Use 'true_north_lunar_node' instead.r(   r)   )r+   r,   r-   r{   Útrue_north_lunar_noder„   s    r0   Ú	true_nodezAstrologicalSubject.true_nodeû   r†   r2   c                óf   — t        j                  dt        d¬«       | j                  j                  S )z.Deprecated: Use mean_south_lunar_node instead.zU'mean_south_node' is deprecated in Kerykeion v5. Use 'mean_south_lunar_node' instead.r(   r)   )r+   r,   r-   r{   Úmean_south_lunar_noder„   s    r0   Úmean_south_nodez#AstrologicalSubject.mean_south_node  ó+   € ô 	�‰ØcÜØõ	
ð
 �{‰{×0Ñ0Ð0r2   c                óf   — t        j                  dt        d¬«       | j                  j                  S )z.Deprecated: Use true_south_lunar_node instead.zU'true_south_node' is deprecated in Kerykeion v5. Use 'true_south_lunar_node' instead.r(   r)   )r+   r,   r-   r{   Útrue_south_lunar_noder„   s    r0   Útrue_south_nodez#AstrologicalSubject.true_south_node  r�   r2   c                ój   — 	 t        | j                  |«      S # t        $ r t        d|› d�«      d ‚w xY w)Nz&AstrologicalSubject has no attribute 'r'   )Úgetattrr{   ÚAttributeError©r~   Úitems     r0   Ú__getattr__zAstrologicalSubject.__getattr__  sB   € ð	]Ü˜4Ÿ;™;¨Ó-Ð-øÜò 	]Ü Ð#IÈ$ÈÈqÐ!QÓRÐX\Ð\ð	]ús   ‚ ˜2c                ó"   — | j                  «       S rN   )Ú__str__r„   s    r0   Ú__repr__zAstrologicalSubject.__repr__   s   € Ø�|‰|‹~Ðr2   c                óp  — | j                   j                  d|¬«      }|s|S |�t        |«      }n| j                  }|j	                  dd¬«       || j                   j
                  › d�z  }t        |dd¬«      5 }|j                  |«       t        j                  d	|«       ddd«       |S # 1 sw Y   |S xY w)
zYReplicate legacy json() behaviour returning a JSON string and optionally dumping to disk.T)Úexclude_noneÚindentN)ÚparentsÚexist_okz_kerykeion.jsonÚwzutf-8)ÚencodingzJSON file dumped in %s.)
r{   Úmodel_dump_jsonr%   r}   Úmkdirrc   ÚopenÚwriteÚloggingÚinfo)r~   ÚdumpÚdestination_folderrœ   Újson_stringÚ
target_dirÚ	json_pathÚfiles           r0   ÚjsonzAstrologicalSubject.json$  s¸   € ð —k‘k×1Ñ1¸tÈFÐ1ÓSˆáØÐàÐ)ÜÐ0Ó1‰JàŸ™ˆJà×Ñ °ÐÔ5Ø D§K¡K×$4Ñ$4Ð#5°_Ð!EÑEˆ	ä�)˜S¨7Ô3ð 	?°tØ�J‰J�{Ô#Ü�L‰LÐ2°IÔ>÷	?ð Ð÷		?ð Ðús   Á9(B+Â+B5c                ó^   — | j                  d«      r| d d dz   } t        j                  | «      S )NÚZéÿÿÿÿz+00:00)Úendswithr   Úfromisoformat)Úvalues    r0   Ú_parse_iso_datetimez'AstrologicalSubject._parse_iso_datetime@  s/   € à�>‰>˜#ÔØ˜#˜2�J Ñ)ˆEÜ×%Ñ% eÓ,Ð,r2   c                ó   — | j                   S )z<Return the underlying Pydantic model (legacy compatibility).)r{   r„   s    r0   ÚmodelzAstrologicalSubject.modelF  s   € ð �{‰{Ðr2   c                ó   — t        | |«      S rN   ©r’   r”   s     r0   Ú__getitem__zAstrologicalSubject.__getitem__K  s   € Ü�t˜TÓ"Ð"r2   c                ó   — t        | ||«      S rN   r¸   )r~   r•   Údefaults      r0   ÚgetzAstrologicalSubject.getN  s   € Ü�t˜T 7Ó+Ð+r2   c           
     óì   — d| j                   j                  › d| j                   j                  › d| j                   j                  › d| j                   j                  › d| j                   j
                  › �
S )NzAstrological data for: z, z UTC
Birth location: z, Lat z, Lon )r{   rc   Úiso_formatted_utc_datetimerj   rm   rl   r„   s    r0   r˜   zAstrologicalSubject.__str__Q  sd   € à% d§k¡k×&6Ñ&6Ð%7°r¸$¿+¹+×:`Ñ:`Ð9að bØ#Ÿ{™{×/Ñ/Ð0°°t·{±{·±Ð6GÀvÈdÏkÉkÏoÉoÐM^ð`ð	
r2   c                óÄ   — | j                  | j                  j                  «      }|j                  |j                  dz  z   |j
                  dz  z   |j                  dz  z   S )z*Backwards-compatible float UTC time value.é<   é  ì    $'- )r´   r{   r¾   rg   rh   ÚsecondÚmicrosecond©r~   Údts     r0   Úutc_timezAstrologicalSubject.utc_timeW  sQ   € ð ×%Ñ% d§k¡k×&LÑ&LÓMˆØ�w‰w˜Ÿ™ R™Ñ'¨"¯)©)°dÑ*:Ñ:¸R¿^¹^ÈmÑ=[Ñ[Ð[r2   c                óÄ   — | j                  | j                  j                  «      }|j                  |j                  dz  z   |j
                  dz  z   |j                  dz  z   S )z,Backwards-compatible float local time value.rÀ   rÁ   rÂ   )r´   r{   Úiso_formatted_local_datetimerg   rh   rÃ   rÄ   rÅ   s     r0   Ú
local_timezAstrologicalSubject.local_time^  sQ   € ð ×%Ñ% d§k¡k×&NÑ&NÓOˆØ�w‰w˜Ÿ™ R™Ñ'¨"¯)©)°dÑ*:Ñ:¸R¿^¹^ÈmÑ=[Ñ[Ð[r2   c                óÂ  — ddl m}m}m}m}m} t        dd«       |rt        j                  dt        d¬«       |	xs |}|r!||k(  rt        j                  |t        d¬«       t        |
«      }t        j                  d	||||||t        |«      t        |«      ||xs |||xs ||xs |dœ|¤Ž}| j                  | «      }||_        t!        j"                  «       |_        |S )
Nr   )r_   r`   ra   ÚDEFAULT_GEONAMES_USERNAMEÚ!GEONAMES_DEFAULT_USERNAME_WARNINGz)AstrologicalSubject.get_from_iso_utc_timez,AstrologicalSubjectFactory.from_iso_utc_timezC'disable_chiron_and_lilith' is ignored by the new factory pipeline.r(   r)   )rc   Úiso_utc_timerj   rk   rn   rp   rl   rm   ro   rF   rq   rr   rs   rv   )rw   r_   r`   ra   rÌ   rÍ   r1   r+   r,   rx   rJ   r   Úfrom_iso_utc_timerz   Ú__new__r{   r%   r|   r}   )Úclsrc   rÎ   rj   rk   rn   rp   rl   rm   ro   rF   r€   rq   rr   rs   Úkwargsr_   r`   ra   rÌ   rÍ   Úresolved_geonamesÚnormalized_zodiac_typer¶   Úobjs                            r0   Úget_from_iso_utc_timez)AstrologicalSubject.get_from_iso_utc_timef  sõ   € ÷&	
õ 	
ô 	Ð?ÐAoÔpá$Ü�M‰MØUÜØõð .ÒJÐ1JÐÙÐ'Ð+DÒDÜ�M‰MÐ;¼[ÐUVÕWô "EÀ[Ó!QÐä*×<Ñ<ð 
ØØ%ØØØØÜ�c“
Ü�c“
Ø/Ø/ÒFÐ3FØ'Ø&>Ò&bÐBbØ.ÒJÐ2Jñ
ð ñ
ˆð" �k‰k˜#ÓˆØˆŒ
Ü—y‘y“{ˆŒØˆ
r2   ),rc   rD   rd   Úintre   r×   rf   r×   rg   r×   rh   r×   rj   úUnion[str, None]rk   rØ   rl   úUnion[int, float, None]rm   rÙ   rn   rØ   ro   rØ   rF   zUnion[ZodiacType, None]rp   Úboolr   úUnion[None, bool]rq   zUnion[SiderealMode, None]rr   z#Union[HousesSystemIdentifier, None]rs   zUnion[PerspectiveType, None]rt   zUnion[int, None]ru   rÛ   r€   rÚ   ÚreturnÚNone)r•   rD   rÜ   r   )rÜ   rD   )FNN)r§   rÚ   r¨   zOptional[Union[str, Path]]rœ   zOptional[int]rÜ   rD   )r³   rD   rÜ   r   )rÜ   r   rN   )r•   rD   r»   r   rÜ   r   )rÜ   rz   )Ú	GreenwichÚGBzEtc/GMTFg        gÅþ²{òÀI@NNFNNN) rc   rD   rÎ   rD   rj   rD   rk   rD   rn   rD   rp   rÚ   rl   úUnion[int, float]rm   rà   ro   zOptional[str]rF   úOptional[ZodiacType]r€   rÚ   rq   zOptional[SiderealMode]rr   z Optional[HousesSystemIdentifier]rs   zOptional[PerspectiveType]rÒ   r   rÜ   z'AstrologicalSubject')!Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú_dtÚutcnowÚNOWrd   re   rf   rg   rh   r�   Úpropertyr…   r‰   rŒ   r�   r–   r™   r­   Ústaticmethodr´   r¶   r¹   r¼   r˜   r   rÇ   rÊ   ÚclassmethodrÖ   rv   r2   r0   r\   r\   ™   s  „ ÙTå(à
�*‰*‹,€Cð Ø—H‘HØ—Y‘YØ—7‘7Ø—H‘HØ—j‘jØ!%Ø#'Ø'+Ø'+Ø#'Ø.2Ø/3ØØ,0Ø37ØHLØ9=Ø48Ø$(Ø*/ð-N$àðN$ð ðN$ð ð	N$ð
 ðN$ð ðN$ð ðN$ð ðN$ð !ðN$ð %ðN$ð %ðN$ð !ðN$ð ,ðN$ð -ðN$ð ðN$ð  *ð!N$ð" 1ð#N$ð$ #Fð%N$ð& 7ð'N$ð( "2ð)N$ð* "ð+N$ð, $(ð-N$ð. 
ó/N$ðb ñ1ó ð1ð ñ1ó ð1ð ñ1ó ð1ð ñ1ó ð1ó]óð Ø9=Ø $ð	àðð 7ðð ð	ð
 
óð8 ò-ó ð-ó
ó
#ô,ó
ð ò\ó ð\ð ò\ó ð\ð ð
  ØØØØ!$Ø!(Ø+/Ø,0Ø*/Ø04ØEIØ6:ð>àð>ð ð>ð ð	>ð
 ð>ð ð>ð ð>ð ð>ð ð>ð )ð>ð *ð>ð $(ð>ð .ð>ð #Cð>ð 4ð>ð  ð!>ð" 
ò#>ó ñ>r2   r\   c            	      ó´   — e Zd ZdZdddddddedf	ddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd	„Zddd
„Zddd„Zddd„Z	ddd„Z
ddd„Zddd„ZeZe
ZeZeZy)ÚKerykeionChartSVGa  Wrapper emulating the v4 chart generation interface.

    Old usage:
        chart = KerykeionChartSVG(subject, chart_type="ExternalNatal", second_subject)
        chart.makeSVG(minify_svg=True, remove_css_variables=True)

    Replaced by ChartDataFactory + ChartDrawer.
    ÚNatalNÚclassicÚlistÚEN)Úlanguage_packc               ó¦  — t        dd«       |�t        j                  dt        d¬«       t	        |t
        «      r|j                  «       }n|}t	        |t
        «      r|j                  «       }n|}|
€t        t        «      }
nt        |
«      }
|| _	        || _
        || _        || _        || _        || _        || _        || _        || _        || _        || _        |	�t        |	«      nt        t(        «      | _        t-        | j*                  «      | _        |
| _        |
| _        |rt5        |«      nt5        j6                  «       | _        | j8                  | _        d| _        g | _        g | _         d | _!        g | _"        i | _#        g | _$        g | _%        i | _&        d | _'        d | _(        d | _)        d | _*        d | _+        d | _,        d | _-        d| _.        y )Nrí   zChartDataFactory + ChartDrawerúY'new_settings_file' is deprecated and ignored in Kerykeion v5. Use language_pack instead.r(   r)   Ú F)/r1   r+   r,   r-   rS   r\   r¶   rð   r   Ú
chart_typerò   ÚthemeÚdouble_chart_aspect_grid_typeÚchart_languageÚ_subject_modelÚ_second_modelÚuserÚ	first_objÚt_userÚ
second_objr   Úactive_pointsrZ   Ú_active_pointsÚactive_aspectsÚ_active_aspectsr%   r|   Úoutput_directoryÚ_output_directoryÚtemplateÚaspects_listÚavailable_planets_settingÚ&t_available_kerykeion_celestial_pointsÚ$available_kerykeion_celestial_pointsÚchart_colors_settingsÚplanets_settingsÚaspects_settingsÚlanguage_settingsÚheightÚwidthÚlocationÚgeolatÚgeolonÚ_chart_drawerÚ_chart_dataÚ_external_view)r~   rý   rö   rÿ   Únew_output_directoryÚnew_settings_filer÷   rø   rù   r   r  rò   Úsubject_modelÚsecond_models                 r0   r�   zKerykeionChartSVG.__init__µ  sÀ  € ô 	Ð'Ð)IÔJàÐ(Ü�M‰MØkÜ"Øõô �iÔ!4Ô5ØT]×TcÑTcÓTe‰Mà%ˆMä�jÔ"5Ô6Ø]g×]mÑ]mÓ]o‰Là%ˆLàÐ!Ü!Ô"8Ó9‰Nä! .Ó1ˆNà$ˆŒØ*ˆÔØˆŒ
Ø-JˆÔ*Ø,ˆÔà+ˆÔØ)ˆÔØ!ˆŒ	Ø&ˆŒØ"ˆŒØ&ˆŒà4AÐ4MœT -Ô0ÔSWÔXmÓSnˆÔÜ6°t×7IÑ7IÓJˆÔØ,ˆÔØ-ˆÔá>R¤Ð%9Ô :ÔX\×XaÑXaÓXcˆÔØ!%×!6Ñ!6ˆÔàˆŒØ24ˆÔØ?AˆÔ&Ø6:ˆÔ3ØJLˆÔ1Ø57ˆÔ"Ø68ˆÔØ68ˆÔØ13ˆÔØˆŒØˆŒ
ØˆŒØˆŒØˆŒà48ˆÔØVZˆÔØ#ˆÕr2   c           	     óP  — | j                   �y | j                  €t        d«      ‚t        | j                  «      j                  «       }| j                  }| j                  }d}|dv r+t        j                  | j                  ||¬«      }|dv �rµd}�n±|dk(  r¡| j                  €t        d«      ‚t        | j                  t        «      rt        | j                  t        «      st        d	«      ‚t        j                  t        t        | j                  «      t        t        | j                  «      ||¬«      }�n|d
k(  r | j                  €t        d«      ‚t        | j                  t        «      rt        | j                  t        «      st        d«      ‚t        j                  t        t        | j                  «      t        t        | j                  «      ||¬«      }nf|dk(  rHt        | j                  t         «      st        d«      ‚t        j"                  | j                  ||¬«      }nt        d| j                  › d�«      ‚|| _        || _        || _        t+        |t        t,        t.           | j0                  «      t        t2        d   | j4                  «      t        t6        | j8                  «      | j:                  |¬«      | _         | j                   }t=        |dg «      | _        t=        |dg «      | _         t=        |dg «      | _!        tE        |d«      rt=        |d«      | _#        t=        |di «      | _$        t=        |dg «      | _%        t=        |dg «      | _&        t=        |di «      | _'        t=        |d| jP                  «      | _(        t=        |d| jR                  «      | _)        t=        |d| jT                  «      | _*        t=        |d| jV                  «      | _+        t=        |d| jX                  «      | _,        d D ]&  }tE        ||«      sŒt[        | |t=        ||«      «       Œ( y )!Nz)First object is required to build charts.F)ÚnatalÚbirthÚexternalnatalÚexternal_natal)r   r  )r  r  TÚsynastryz.Second object is required for Synastry charts.z:Synastry charts require two AstrologicalSubject instances.Útransitz-Second object is required for Transit charts.zGTransit charts require natal and transit AstrologicalSubject instances.Ú	compositezKFirst object must be a CompositeSubjectModel instance for composite charts.z1Unsupported or improperly configured chart_type 'r'   )rð   Útable)Ú
chart_datar÷   rø   rù   rò   Úexternal_viewr  r
  r  r	  r  r  r  r  r  r  r  r  r  )Úmain_radiusÚfirst_circle_radiusÚsecond_circle_radiusÚthird_circle_radius).r  rú   Ú
ValueErrorrD   rö   rE   r  r  r   Úcreate_natal_chart_datarû   rS   r   Úcreate_synastry_chart_datar   Úcreate_transit_chart_datar   Úcreate_composite_chart_datar  r  r$  r   r   r   r÷   r   rø   r   rù   rò   r’   r  r
  r  Úhasattrr	  r  r  r  r  r  r  r  r  r  Úsetattr)r~   Úchart_type_normalizedr   r  r%  ÚdataÚdrawerÚattrs           r0   Ú_ensure_chartzKerykeionChartSVG._ensure_chart  s¶  € Ø×ÑÐ)Øà×ÑÐ&ÜÐHÓIÐIä # D§O¡OÓ 4× :Ñ :Ó <ÐØ×+Ñ+ˆØ×-Ñ-ˆØˆà Ð$YÑYÜ#×;Ñ;Ø×#Ñ#°=ÐQ_ôˆDð %Ð(KÒKØ $’Ø" jÒ0Ø×!Ñ!Ð)Ü Ð!QÓRÐRÜ˜d×1Ñ1Ô3KÔLÔT^Ø×"Ñ"Ô$<ôUô !Ð!]Ó^Ð^Ü#×>Ñ>ÜÔ-¨t×/BÑ/BÓCÜÔ-¨t×/AÑ/AÓBØ+Ø-ô	ŠDð # iÒ/Ø×!Ñ!Ð)Ü Ð!PÓQÐQÜ˜d×1Ñ1Ô3KÔLÔT^Ø×"Ñ"Ô$<ôUô !Ð!jÓkÐkÜ#×=Ñ=ÜÔ-¨t×/BÑ/BÓCÜÔ-¨t×/AÑ/AÓBØ+Ø-ô	‰Dð # kÒ1Ü˜d×1Ñ1Ô3HÔIÜ Ð!nÓoÐoÜ#×?Ñ?Ø×#Ñ#°=ÐQ_ô‰Dô ÐPÐQU×Q`ÑQ`ÐPaÐabÐcÓdÐdà+ˆÔØˆÔØˆŒÜ(ØÜ”xÔ 3Ñ4°d·j±jÓAÜ*.¬w°Ñ/GÈ×IkÑIkÓ*lÜÔ 6¸×8KÑ8KÓLØ×,Ñ,Ø'ô
ˆÔð ×#Ñ#ˆÜ)0°Ð9TÐVXÓ)YˆÔ&Ü4;¸FÐDjÐlnÓ4oˆÔ1Ü# F¨N¸BÓ?ˆÔÜ�6ÐCÔDÜ:AÀ&ÐJrÓ:sˆDÔ7Ü%,¨VÐ5LÈbÓ%QˆÔ"Ü '¨Ð0BÀBÓ GˆÔÜ '¨Ð0BÀBÓ GˆÔÜ!(¨Ð1DÀbÓ!IˆÔÜ˜f h°·±Ó<ˆŒÜ˜V W¨d¯j©jÓ9ˆŒ
Ü ¨
°D·M±MÓBˆŒÜ˜f h°·±Ó<ˆŒÜ˜f h°·±Ó<ˆŒØiò 	;ˆDÜ�v˜tÕ$Ü˜˜d¤G¨F°DÓ$9Õ:ñ	;r2   c                óŠ   — | j                  «        | j                  €J ‚| j                  j                  ||¬«      }|| _        |S ©N)ÚminifyÚremove_css_variables)r5  r  Úgenerate_svg_stringr  ©r~   r8  r9  r  s       r0   ÚmakeTemplatezKerykeionChartSVG.makeTemplateZ  sH   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×%Ñ%×9Ñ9ÀÐ^rÐ9ÓsˆØ ˆŒØˆr2   c                óÜ   — | j                  «        | j                  €J ‚| j                  j                  | j                  ||¬«       t	        | j                  d| j
                  «      | _        y ©N)Úoutput_pathr8  r9  r  )r5  r  Úsave_svgr  r’   r  ©r~   r8  r9  s      r0   ÚmakeSVGzKerykeionChartSVG.makeSVGa  sd   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×Ñ×#Ñ#Ø×-Ñ-ØØ!5ð 	$ô 	
ô
   × 2Ñ 2°JÀÇÁÓNˆ�r2   c                óŠ   — | j                  «        | j                  €J ‚| j                  j                  ||¬«      }|| _        |S r7  )r5  r  Úgenerate_wheel_only_svg_stringr  r;  s       r0   ÚmakeWheelOnlyTemplatez'KerykeionChartSVG.makeWheelOnlyTemplatek  sP   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×%Ñ%×DÑDØØ!5ð Eó 
ˆð !ˆŒØˆr2   c                óÜ   — | j                  «        | j                  €J ‚| j                  j                  | j                  ||¬«       t	        | j                  d| j
                  «      | _        y r>  )r5  r  Úsave_wheel_only_svg_filer  r’   r  rA  s      r0   ÚmakeWheelOnlySVGz"KerykeionChartSVG.makeWheelOnlySVGu  sd   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×Ñ×3Ñ3Ø×-Ñ-ØØ!5ð 	4ô 	
ô
   × 2Ñ 2°JÀÇÁÓNˆ�r2   c                óŠ   — | j                  «        | j                  €J ‚| j                  j                  ||¬«      }|| _        |S r7  )r5  r  Ú$generate_aspect_grid_only_svg_stringr  r;  s       r0   ÚmakeAspectGridOnlyTemplatez,KerykeionChartSVG.makeAspectGridOnlyTemplate  sP   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×%Ñ%×JÑJØØ!5ð Kó 
ˆð !ˆŒØˆr2   c                óÜ   — | j                  «        | j                  €J ‚| j                  j                  | j                  ||¬«       t	        | j                  d| j
                  «      | _        y r>  )r5  r  Úsave_aspect_grid_only_svg_filer  r’   r  rA  s      r0   ÚmakeAspectGridOnlySVGz'KerykeionChartSVG.makeAspectGridOnlySVG‰  sd   € Ø×ÑÔØ×!Ñ!Ð-Ð-Ð-Ø×Ñ×9Ñ9Ø×-Ñ-ØØ!5ð 	:ô 	
ô
   × 2Ñ 2°JÀÇÁÓNˆ�r2   )rý   úKUnion[AstrologicalSubject, AstrologicalSubjectModel, CompositeSubjectModel]rö   r   rÿ   z:Union[AstrologicalSubject, AstrologicalSubjectModel, None]r  rØ   r  úUnion[Path, None, dict]r÷   z Union[KerykeionChartTheme, None]rø   zLiteral['list', 'table']rù   r   r   zList[AstrologicalPoint]r  úOptional[List[ActiveAspect]]rò   úOptional[Mapping[str, Any]]rÜ   rÝ   )rÜ   rÝ   )FF)r8  rÚ   r9  rÚ   rÜ   rD   )r8  rÚ   r9  rÚ   rÜ   rÝ   )râ   rã   rä   rå   r   r�   r5  r<  rB  rE  rH  rK  rN  r@  rG  rM  ÚmakeGridOnlySVGrv   r2   r0   rí   rí   «  sú   „ ñð !(ØQUØ15Ø59Ø2;ØBHØ15Ø1FØ7;ðM$ð 6:ñM$à^ðM$ð ðM$ð Oð	M$ð
 /ðM$ð 3ðM$ð 0ðM$ð (@ðM$ð /ðM$ð /ðM$ð 5ðM$ð 3ðM$ð 
óM$ó^S;ôlôOôôOôôOð €HØ/ÐØ%:Ð"Ø+�Or2   rí   c                  óh   — e Zd ZdZdedfdddœ	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd„ Zed„ «       Zed„ «       Z	y)	ÚNatalAspectszƒWrapper replicating the master branch NatalAspects interface.

    Replacement: AspectsFactory.single_subject_aspects(subject)
    N©rò   Úaxis_orb_limitc               ó²  — t        dd«       |�t        j                  dt        d¬«       t	        |t
        «      r|j                  «       n|| _        || _        || _	        g | _
        g | _        || _        t        |«      | _        t        | j                  «      | _        |€t        t"        «      }nt        |«      }|| _        d | _        d | _        d | _        y )NrU  z#AspectsFactory.single_chart_aspectsrô   r(   r)   )r1   r+   r,   r-   rS   r\   r¶   rü   r  rò   Úcelestial_pointsr  Úaxes_orbit_settingsrð   r   rZ   r  r   r  Ú_aspects_modelÚ_all_aspects_cacheÚ_relevant_aspects_cache)r~   rü   r  r   r  rò   rW  s          r0   r�   zNatalAspects.__init__£  sÈ   € ô 	�NÐ$IÔJàÐ(Ü�M‰MØkÜ"Øõô %/¨tÔ5HÔ$I�D—J‘J”LÈtˆŒ	Ø!2ˆÔà*ˆÔØ+-ˆÔØ+-ˆÔØ#1ˆÔ ä! -Ó0ˆÔÜ6°t×7IÑ7IÓJˆÔØÐ!Ü!Ô"8Ó9‰Nä! .Ó1ˆNØ,ˆÔà"ˆÔØ"&ˆÔØ'+ˆÕ$r2   c                ó¾   — | j                   €Ft        j                  | j                  | j                  | j
                  | j                  ¬«      | _         | j                   S )N)r   r  rW  )r[  r   Úsingle_chart_aspectsrü   r  r  rZ  r„   s    r0   Ú_build_aspects_modelz!NatalAspects._build_aspects_modelÊ  sQ   € Ø×ÑÐ&Ü"0×"EÑ"EØ—	‘	Ø"×1Ñ1Ø#×2Ñ2Ø#×7Ñ7ô	#ˆDÔð ×"Ñ"Ð"r2   c                ó‚   — | j                   €(t        | j                  «       j                  «      | _         | j                   S ©zJLegacy property - returns the same as aspects for backwards compatibility.)r\  rð   r`  Úaspectsr„   s    r0   Úall_aspectszNatalAspects.all_aspectsÔ  s8   € ð ×"Ñ"Ð*Ü&*¨4×+DÑ+DÓ+F×+NÑ+NÓ&OˆDÔ#Ø×&Ñ&Ð&r2   c                ó‚   — | j                   €(t        | j                  «       j                  «      | _         | j                   S rb  )r]  rð   r`  rc  r„   s    r0   Úrelevant_aspectszNatalAspects.relevant_aspectsÛ  s8   € ð ×'Ñ'Ð/Ü+/°×0IÑ0IÓ0K×0SÑ0SÓ+TˆDÔ(Ø×+Ñ+Ð+r2   )rü   rO  r  rP  r   ú'Iterable[Union[str, AstrologicalPoint]]r  rQ  rò   rR  rW  úOptional[float]rÜ   rÝ   )
râ   rã   rä   rå   r   r�   r`  r   rd  rf  rv   r2   r0   rU  rU  �  s–   „ ñð 6:ØAVØ7;ð%,ð 6:Ø*.ñ%,àYð%,ð 3ð%,ð ?ð	%,ð
 5ð%,ð 3ð%,ð (ð%,ð 
ó%,òN#ð ñ'ó ð'ð ñ,ó ñ,r2   rU  c                  ór   — e Zd ZdZdedfdddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	d„Zd„ Zed„ «       Zed„ «       Z	d„ Z
y)
ÚSynastryAspectszAWrapper replicating the master branch synastry aspects interface.NrV  c               ó  — t        dd«       |�t        j                  dt        d¬«       t	        |t
        «      r|j                  «       n|| _        t	        |t
        «      r|j                  «       n|| _        || _	        || _
        g | _        g | _        || _        t        |«      | _        t!        | j                  «      | _        |€t        t$        «      }nt        |«      }|| _        d | _        d | _        d | _        d | _        d | _        y )Nrj  z!AspectsFactory.dual_chart_aspectsrô   r(   r)   )r1   r+   r,   r-   rS   r\   r¶   Ú
first_userÚsecond_userr  rò   rY  r  rZ  rð   r   rZ   r  r   r  Ú_dual_modelr\  r]  Ú_all_aspectsÚ_relevant_aspects)r~   Úkr_object_oneÚkr_object_twor  r   r  rò   rW  s           r0   r�   zSynastryAspects.__init__é  sû   € ô 	Ð%Ð'JÔKàÐ(Ü�M‰MØkÜ"Øõô 4>¸mÔM`Ô3a˜-×-Ñ-Ô/ÐgtˆŒÜ4>¸}ÔNaÔ4b˜=×.Ñ.Ô0ÐhuˆÔØ!2ˆÔà*ˆÔØ+-ˆÔØ+-ˆÔØ#1ˆÔ ä! -Ó0ˆÔÜ6°t×7IÑ7IÓJˆÔØÐ!Ü!Ô"8Ó9‰Nä! .Ó1ˆNØ,ˆÔàˆÔØ"&ˆÔØ'+ˆÔ$Ø/3ˆÔØ48ˆÕr2   c           	     óØ   — | j                   €St        j                  | j                  | j                  | j
                  | j                  | j                  dd¬«      | _         | j                   S )NT)r   r  rW  Úfirst_subject_is_fixedÚsecond_subject_is_fixed)rn  r   Údual_chart_aspectsrl  rm  r  r  rZ  r„   s    r0   Ú_build_dual_modelz!SynastryAspects._build_dual_model  s`   € Ø×ÑÐ#Ü-×@Ñ@Ø—‘Ø× Ñ Ø"×1Ñ1Ø#×2Ñ2Ø#×7Ñ7Ø'+Ø(,ô ˆDÔð ×ÑÐr2   c                ó‚   — | j                   €(t        | j                  «       j                  «      | _         | j                   S rb  )r\  rð   rw  rc  r„   s    r0   rd  zSynastryAspects.all_aspects!  s8   € ð ×"Ñ"Ð*Ü&*¨4×+AÑ+AÓ+C×+KÑ+KÓ&LˆDÔ#Ø×&Ñ&Ð&r2   c                ó‚   — | j                   €(t        | j                  «       j                  «      | _         | j                   S rb  )r]  rð   rw  rc  r„   s    r0   rf  z SynastryAspects.relevant_aspects(  s8   € ð ×'Ñ'Ð/Ü+/°×0FÑ0FÓ0H×0PÑ0PÓ+QˆDÔ(Ø×+Ñ+Ð+r2   c                ó   — | j                   S )z3Legacy method for compatibility with master branch.)rf  r„   s    r0   Úget_relevant_aspectsz$SynastryAspects.get_relevant_aspects/  s   € à×$Ñ$Ð$r2   )rq  ú4Union[AstrologicalSubject, AstrologicalSubjectModel]rr  r|  r  rP  r   rg  r  rQ  rò   rR  rW  rh  rÜ   rÝ   )râ   rã   rä   rå   r   r�   rw  r   rd  rf  r{  rv   r2   r0   rj  rj  æ  s¤   „ ÙKð 6:ØAVØ7;ð)9ð 6:Ø*.ñ)9àKð)9ð Lð)9ð 3ð	)9ð
 ?ð)9ð 5ð)9ð 3ð)9ð (ð)9ð 
ó)9òV ð ñ'ó ð'ð ñ,ó ð,ó%r2   rj  )r\   rí   rU  rj  )r.   rD   r/   rD   rÜ   rÝ   )rF   z Optional[Union[str, ZodiacType]]rÜ   rá   )rW   z1Optional[Iterable[Union[str, AstrologicalPoint]]]rÜ   z!Optional[List[AstrologicalPoint]]):rå   Ú
__future__r   Útypingr   r   r   r   r   r	   r
   r   r   r¥   r+   r   Ú	functoolsr   rw   r   Úchart_data_factoryr   Úcharts.chart_drawerr   rc  r   Úsettings.config_constantsr   r   Ú	utilitiesr   Úschemas.kr_modelsr   r   r   r   r   Úschemas.kr_literalsr   r   r   r    Úschemasr!   r"   r#   r$   Úpathlibr%   r1   rT   rJ   rZ   r\   rí   rU  rj  Ú__all__rv   r2   r0   ú<module>r‰     sÈ   ðñõ4 #ç Y× YÕ YÛ Û Ý Ý %å DÝ 0Ý ,Ý #ß TÝ ,÷õ ÷ó ÷ WÓ VÝ óð )Ø(Ø.Ø.ñ	Ð ó ?ðF!Ø=ð!à&ó!÷NLñ L÷dl,ñ l,÷dC,ñ C,÷RK%ñ K%òb�r2   