
    2jC                        d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
  ee      j                         j                  j                  j                  j                  ZdZdZdZ G d	 d
e	      Z e       Zdee   fdZy)u   앱 설정 — Pydantic v2 BaseSettings.

W2-F16: class-based Config → model_config ConfigDict 전환.
W2-F17: ENVIRONMENT=prod에서 insecure default 거부 (fail-fast).
    )Path)Literal)Fieldfield_validator)BaseSettingsSettingsConfigDict) dev-secret-key)r	   admin123
creator123<postgresql://theroad:theroad_dev_2026@localhost:5432/theroadc                      e Zd ZU  edd      ZdZeed<   dZe	d   ed<   d	Z
eed
<   dZeed<    eedz        Zeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d Zeed!<   d"Zeed#<   dZeed$<   d%Zeed&<   d'Zeed(<   d'Zeed)<   d*Zeed+<   d,Zeed-<   dZ eed.<   d/Z!eed0<   d1Z"eed2<   d3Z#e$ed4<   d5Z%e$ed6<   dZ&eed7<   d8Z'eed9<   d:Z(eed;<   d5Z)e$ed<<   dZ*eed=<   dZ+eed><   d5Z,e$ed?<   d5Z-e$ed@<   d5Z.e$edA<   d5Z/e$edB<   d3Z0e$edC<   d5Z1e$edD<   d5Z2e$edE<   d5Z3e$edF<   dGZ4e	dH   edI<   dZ5eedJ<   dKZ6e7edL<   dGZ8e	dM   edN<   dZ9eedO<   dZ:eedP<   dQZ;eedR<   dSZ<eedT<   dUZ=eedV<   dWZ>eedX<   dUZ?eedY<   dZZ@eed[<   d\ZAeed]<   d\ZBeed^<   d_ZCeed`<   daZDeedb<   dcZEeedd<   d5ZFe$ede<   dfZGeedg<   dhZHeedi<   djZIeedk<   dlZJeedm<   dnZKeedo<   dpZLeedq<   d5ZMe$edr<   d3ZNe$eds<   d5ZOe$edt<   d3ZPe$edu<   dvZQe	dw   edx<   dyZRe	dz   ed{<   d|ZSe	d}   ed~<   d3ZTe$ed<   d5ZUe$ed<   d5ZVe$ed<   d5ZWe$ed<   d5ZXe$ed<   d_ZYeed<   d5ZZe$ed<   d5Z[e$ed<   d5Z\e$ed<   d5Z]e$ed<   dZ^eed<   d3Z_e$ed<   d5Z`e$ed<   d5Zae$ed<   d5Zbe$ed<   d5Zce$ed<   d5Zde$ed<   dZeeed<   dZfeed<   d5Zge$ed<   dZheed<   d,Zieed<   d_Zjeed<   d5Zke$ed<   d5Zle$ed<   d5Zme$ed<   dZneed<   dZoeed<   d,Zpeed<   d5Zqe$ed<   dZreed<   d_Zseed<   d5Zte$ed<   dZueed<   d5Zve$ed<   d,Zweed<   dZxeed<   d5Zye$ed<   d5Zze$ed<   d5Z{e$ed<   d5Z|e$ed<   d5Z}e$ed<   d,Z~eed<   d%Zeed<   dZeed<   d5Ze$ed<   d5Ze$ed<   dZeed<   d5Ze$ed<   dZeed<   d5Ze$ed<   d5Ze$ed<   d,Zeed<   d%Zeed<   d%Zeed<   d5Ze$ed<   d5Ze$ed<   d3Ze$ed<   dZe	d   ed<   d3Ze$ed<   dZeed<   dZeed<   d_Zeed<   d5Ze$ed<   dZe	d   ed<   d3Ze$ed<   dZeed<   d3Ze$ed<   d5Ze$ed<   d5Ze$ed<   dZeed<   dZeed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d3Ze$ed<   d3Ze$ed<   d3Ze$ed<   d5Ze$ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d5Ze$ed<   dZeed<   d5Ze$ed<   dZeed<   dZeed<   d5Ze$ed<   dZeed<   dZeed<   d_Zeed<   d5Ze$ed<   d_Zeed<   dZeed<   dZeed<   dZeed<   d"Zeed<   dZeed<   dZeed<   dZeed<   d5Ze$ed<   d5Ze$ed <   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d3Ze$ed	<   d3Ze$ed
<   d3Ze$ed<   d3Ze$ed<   d5Ze$ed<   d5Ze$ed<   dZeed<   d5Ze$ed<   d5Ze$ed<   d3Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d3Ze$ed<   d3Ze$ed<   dZeed<   d|Zeed<   dGZeed<   dGZeed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed<   d5Ze$ed <   d5Ze$ed!<   d5Ze$ed"<   d_Zeed#<   dZeed$<   dZeed%<   d,Zeed&<   d3Ze$ed'<   dZeed(<   d)Zeed*<   d+Zeed,<   dZeed-<   d.Zeed/<    ed
      ed0ed1efd2              Z edd      ed0ed1efd3              Z ed      ed0ed1efd4              Z edm      ed0ed1efd5              Z edodq      ed0ed1efd6              Z edL      ed0e7d1e7fd7              Z ed      ed0ed1efd8              Z ed      ed0ed1efd9              Z edǫ      ed0ed1efd:              Z edJ      ed0ed1efd;              Zy<(=  Settingsz.envignore)env_fileextrazTheRoad Scene Labapp_namedev)r   testprodenvironmentr
   
secret_keyr   database_urlprojectsprojects_dir   session_ttl_hoursadmindefault_admin_usernamer   default_admin_passwordcreatordefault_creator_usernamer   default_creator_passwordr	   openai_api_keyopenai_api_key_secondaryzgpt-6-astraopenai_modelmediumopenai_reasoning_effortlowopenai_reasoning_effort_auxhighopenai_reasoning_effort_judgegemini_api_keyzgemini-3.1-pro-previewgemini_text_modelzgemini-3.8-flashgemini_flash_modelgemini_lite_modelzgemini-3.1-flash-imagegemini_image_modelzgpt-image-2.5-sunburstopenai_image_modelanthropic_api_keyzclaude-opus-5anthropic_judge_modelzclaude-fable-5anthropic_fable_modelT#multiroll_dual_select_judge_enabledFmultiroll_gq_judge_enableddashscope_api_keyz6https://dashscope-intl.aliyuncs.com/compatible-mode/v1dashscope_base_urlzqwen3.8-maxqwen_vlm_modelstill_confined_fp_enabledprompt_assembly_reorder_stepsfal_keyfal_ai_enabledbackground_chain_enabledshot_essence_enabledchain_bg_guide_enabledchain_bg_camera_meta_enabled%background_render_star_anchor_enabled1background_render_record_prior_bg_lineage_enabled allow_lvm_validation_unavailableoff)fulltargetedsamplerF   ref_onlyscene_lvm_validation_modescene_lvm_targeted_shot_ids        scene_lvm_sample_rate)rF   onfloor_plan_anchored
chain_onlybackground_modeopik_api_keyopik_url_overridedefaultopik_workspaceztheroad-scene-labopik_project_namei  max_episode_summary_length   max_scene_summary_lengthmax_project_summary_length   max_concurrent_image_gen
   max_concurrent_variationmax_concurrent_entity_detail   scene_variation_count   shot_variation_countr   episode_max_shotsshot_selection_enabledgptscene_detail_llmd   scene_segment_context_charsi  llm_max_output_tokensi  step_running_timeout_secondsZ   step_lock_lease_seconds   step_lock_heartbeat_seconds!step_lock_heartbeat_steal_enabledstep_lock_startup_reclaimprompt_version_pack_strictllm_local_schema_validate5)ru   67891011floor_plan_prompt_versionrv   )rv   rw   rx   ry   rz   r{   1214background_prompt_versionlegacy)r   w18j_overlapshot_aware_plan background_render_reference_mode:background_render_missing_shot_aware_plan_fallback_enabledbase_location_dossier_enabled$floor_plan_geometry_readback_enabled-floor_plan_vlm_readback_real_provider_enabled$floor_plan_vlm_readback_dual_enabled(floor_plan_geometry_readback_max_retries$floor_plan_semantic_readback_enabled2floor_plan_semantic_readback_real_provider_enabledshot_projection_card_enabled*shot_projection_card_real_provider_enabled1#shot_projection_card_prompt_version!card_spatial_rules_scoped_enabled!shot_aware_bg_render_plan_enabled/shot_aware_bg_render_plan_real_provider_enabledbg_render_substrate_enabledbg_space_partition_enabled(bg_space_partition_real_provider_enabled(   "bg_space_partition_edge_cap_per_fpx   bg_space_partition_llm_call_cap floor_plan_light_sidecar_enabledzopenai/gpt-6-astra%floor_plan_light_sidecar_select_model%floor_plan_light_sidecar_render_model"floor_plan_light_sidecar_best_of_n.floor_plan_light_sidecar_real_provider_enableddwelling_zone_map_enabled'dwelling_zone_map_real_provider_enableddwelling_zone_map_text_modelzgemini/gemini-3.1-pro-previewdwelling_zone_map_vision_modeldwelling_zone_map_render_model visual_continuity_anchor_enabled   "visual_continuity_anchor_group_cap)visual_continuity_anchor_d_reserved_slots&immobilized_subject_continuity_enabled   "immobilized_subject_continuity_cap)immobilized_registered_pose_guide_enabled'immobilized_registered_pose_guide_modeloriginal*immobilized_registered_pose_guide_underlay$immobilized_prev_frame_chain_enabled#outdoor_prev_frame_required_enabled#scene_single_frame_readback_enabled indoor_shared_pose_guide_enabled&indoor_shared_pose_guide_judge_enabledindoor_shared_pose_guide_model$indoor_shared_pose_guide_judge_model!indoor_shared_pose_guide_qc_model$indoor_single_shot_pose_lane_enabledzoom_continuity_anchor_enabled zoom_continuity_anchor_group_capoutdoor_site_layout_enabledoutdoor_site_layout_group_capoutdoor_direct_compose_enabled!outdoor_composition_guide_enabledoutdoor_composition_guide_modeloutdoor_composition_brief_modeloutdoor_composition_judge_model.outdoor_composition_guide_shared_model_enabled%outdoor_single_shot_seed_lane_enabled(outdoor_shared_model_guide_judge_enabledv1)rF   r   still_recipe_modet2i_review_skip_scene_on_v1scene_image_target_scenesbgfirst_no_conti_exempt_tagsstill_recipe_roll_countstill_recipe_critique_enabled
regenerate)editr   still_repair_methodstill_jit_verify_enabled@   still_jit_regen_limitimage_protect_manual_primarystill_winner_gate_enabledstill_gate_reroll_enabledstill_gate_reroll_run_limitstep_config_drift_ackplate_multiroll_enabledstill_plate_select_enabledstill_conti_ab_enabledstill_variants_enabled!still_recipe_camera_frame_enabledstill_recipe_lighting_enabledstill_recipe_conduct_enabledmultiroll_qk_judge_enabledxai_api_keyopenrouter_api_keyzhttps://openrouter.ai/api/v1openrouter_base_urlzqwen/qwen3.8-maxqk_judge_main_modelzmoonshotai/kimi-k3qk_judge_assist_modelmultiroll_gg46_judge_enabledzx-ai/grok-4.6grok_judge_modelstill_identity_ref_role_enablednb2still_image_backendzx-ai/grok-imagine-image-qualitygrok_image_modelstill_cine_transform_enabledmarker_map_image_modelmarker_map_fallback_models#still_cine_moderation_give_up_afterstill_cine_verify_enabledstill_cine_verify_roundsgrokstill_cine_providerzgrok,mai,seedream(still_cine_moderation_fallback_providerszgrok-imagine-imagexai_image_modelxai_image_qualityzmicrosoft/mai-image-2.6mai_image_modelzbytedance-seed/seedream-5-0-proseedream_image_modelzreve/2.1/editreve_image_model"still_cine_stage_direction_enabledstill_safety_fallback_enabledstill_fix_ref_gate_enabledopik_trace_v2_enabledera_research_enabledsignage_author_enabled still_cast_wardrobe_lock_enabledbackground_scale_anchor_enabledbackground_no_people_enabled!background_no_people_gate_enabledstill_bgfirst_enabledstill_bgfirst_full_enabledstill_lane_prev_bgfirst_enabledmultiroll_fix_rejudge_enabled!multiroll_gpt_composition_enabledplate_structure_facts_enabled4 outdoor_lane_plan_prompt_version$outdoor_seed_plate_reference_enabledoutdoor_seed_all_groups_enabledbackground_share_plan_enabledstructure_seed_variants_enabledoutdoor_frame_mode_enabledoutdoor_map_conti_enabledoutdoor_lane_plan_enabledoutdoor_lane_pipe_enabledgrounding_acquire_workersstructure_seed_recipeplace_mark_modeseed_critique_modeoutdoor_building_fp_ref_enabled#outdoor_building_anchor_ref_enabledsame_place_render_chain_enabled outdoor_aerial_reference_enabled!outdoor_plate_stage_chain_enabledspace_set_bg_enabledspace_set_bg_min_scenesspace_set_bg_text_modelspace_set_bg_vision_modelspace_set_bg_render_model episode_status_strict_projectionallow_text_only_without_refsiX  llm_timeout_texti  llm_timeout_image_genllm_timeout_validation   llm_max_retriesvreturnc                 n    |j                   j                  dd      }|dk(  r|t        v rt        d      |S )Nr   r   r   zlSECRET_KEY must be set explicitly in production (ENVIRONMENT=prod). Default 'dev-secret-key' is not allowed.)dataget_INSECURE_SECRET_KEYS
ValueErrorclsr&  infoenvs       E/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/config.py_secret_key_prod_requiredz"Settings._secret_key_prod_required  sA     iimmM51&=Q"77O      c                 n    |j                   j                  dd      }|dk(  r|t        v rt        d      |S )Nr   r   r   ziDefault passwords must not be used in production (ENVIRONMENT=prod). Override DEFAULT_*_PASSWORD via env.)r)  r*  _INSECURE_PASSWORDSr,  r-  s       r1  _passwords_prod_requiredz!Settings._passwords_prod_required  sA     iimmM51&=Q"55K  r3  c                     |j                   j                  dd      }|dk7  r|S |r	|t        k(  rt        d      d|v sd|v rt        d      |S )uD   Codex W2 High 3: prod에서 빈 값/localhost/dev 기본 DSN 거부.r   r   r   zeDATABASE_URL must be set explicitly in production (ENVIRONMENT=prod). Default dev DSN is not allowed.z
@localhostz
@127.0.0.1ua   DATABASE_URL points to localhost in production — 확실하다면 외부 URL을 사용하세요.)r)  r*  _DEV_DEFAULT_DSNr,  r-  s       r1  _database_url_prod_requiredz$Settings._database_url_prod_required  sm     iimmM51&=HA))F  1 1A  r3  c                 .    |dk  rt        d| d      |S )uY  Block B B4 follow-up: timeout 임계값은 strictly positive 만 허용.

        v <= 0 이면 모든 running row 가 즉시 stale 분류 — Block C atomic claim
        도입 후 multi-worker race / lock 사고 trigger. ENV 오설정을 startup 시
        fail-fast 차단 (silent late-fail 금지 — feedback_no_silent_fallback).
        r   z3STEP_RUNNING_TIMEOUT_SECONDS must be positive (got )r,  r.  r&  s     r1  _step_running_timeout_positivez'Settings._step_running_timeout_positive  s+     6EaSJ  r3  c                 .    |dk  rt        d| d      |S )u   lease·간격은 strictly positive.

        0 이하면 모든 하트비트가 즉시 만료로 읽혀 살아있는 락을 빼앗는다.
        ENV 오설정을 startup 에서 fail-fast 로 막는다.
        r   z)step lock interval must be positive (got r;  r<  r=  s     r1  _step_lock_intervals_positivez&Settings._step_lock_intervals_positive  s%     6H1MNNr3  c                 8    |dk  s|dkD  rt        d| d      |S )u	  Phase 4 iter 7 follow-up I2: invalid sample_rate 가 T2I 생성 후에야
        ValueError 로 fail 되면 한 번의 잘못된 설정으로 모든 shot 이 이미지
        생성/재시도까지 갔다 죽는다 (비용 낭비). startup 시 fail-fast.
        rM   g      ?z$SCENE_LVM_SAMPLE_RATE out of range: z (must be 0.0~1.0)r<  r=  s     r1  _scene_lvm_sample_rate_rangez%Settings._scene_lvm_sample_rate_range
  s2     s7a#g6qc9KL  r3  c                 ,    |dvrt        d|d      |S )u   오타가 이미지 생성 시점에야 드러나면 비용 낭비 — startup
        fail-fast (roll_count 검증과 같은 이유).)r   grok2gpt25zSTILL_IMAGE_BACKEND unknown: z (must be nb2|grok2|gpt25)r<  r=  s     r1  _still_image_backend_knownz#Settings._still_image_backend_known  s2    
 --/u 5, -. . r3  c                 ,    |dvrt        d|d      |S )u  오타가 변환 시점에야 드러나면 그 샷의 걷기가 죽는다 — startup
        fail-fast (still_image_backend 선례 동형).

        ★모르는 값을 조용히 grok 으로 되돌리지 않는다: 운영자는 reve 로
        돌고 있다고 믿는데 지문·기록은 grok 으로 남아, 나중에 「같은 조건」
        으로 읽히는 산출이 사실은 다른 제공자 것이 된다.
        )r   revemaixaizSTILL_CINE_PROVIDER unknown: z (must be grok|reve|mai|xai)r<  r=  s     r1  _still_cine_provider_knownz#Settings._still_cine_provider_known"  s2     22/u 5. /0 0 r3  c                 ,    |dk7  rt        d|       |S )u  롤 수 오설정이 이미지 생성 시점에야 실패하면 비용 낭비 —
        startup fail-fast. 2026-08-13 사용자 확정(#102)+Codex R1 BLOCK-2:
        a/b 2롤이 계약이다 — 낡은 env(3)가 남으면 롤당 과금이 1.5배 되고
        b·c 가 같은 변주 절을 받아 "전 롤 구도 상이" 원칙도 깨진다.
        내부 경로의 rc=1/2/4 명시 override 는 이 검증과 무관(호출별 인자).
        ra   zISTILL_RECIPE_ROLL_COUNT must be 2 (a/b 2-roll contract, 2026-08-13): got r<  r=  s     r1  _still_recipe_roll_count_rangez'Settings._still_recipe_roll_count_range2  s.     6::;>  r3  c           	         |s|S g }|j                  d      D ]  }|j                         }|s|j                  d      }t        |      dk7  rt        d|d      	 t	        |d         }t	        |d         }|dk  s|dk  rt        d|d| d|       |j                  | d|         dj                  |      S # t        $ r}t        d|d	|       |d
}~ww xY w)u  Phase 4 iter 7 follow-up M2: zero-padding 정규화. env 의 "05_02"
        같은 padding 된 형식이 trace_meta 의 (5, 2) 와 매칭 못해 silent skip
        되는 것을 방지. parse 시 int()-cast 후 재조립 → "5_2" 로 normalize.
        invalid token (정수 변환 실패) 은 fail-fast.

        iter 2 review M1: scene_index / shot_index 는 production DB 기준
        1-based (MIN=1). "0_0" 또는 "-1_2" 같은 non-positive token 은 운영자
        오입력일 가능성 — 통과시키면 targeted_not_in_list 로 silent skip 되어
        late-discovery. parse 시 fail-fast 로 startup 에서 차단.
        ,_ra   z*SCENE_LVM_TARGETED_SHOT_IDS invalid token u7    — expected '<scene_index>_<shot_index>' (e.g. '5_2')r   rc   z.SCENE_LVM_TARGETED_SHOT_IDS non-integer token z: Nz/SCENE_LVM_TARGETED_SHOT_IDS non-positive token u>    — scene_index/shot_index are 1-based (DB MIN=1). got scene=z shot=)splitstriplenr,  intappendjoin)	r.  r&  
normalizedrawtokenpartss_idxt_idxexcs	            r1  &_scene_lvm_targeted_shot_ids_normalizez/Settings._scene_lvm_targeted_shot_ids_normalizeB  s%    H "
773<CIIKEKK$E5zQ @	 JM N E!HE!H
 zUaZ EeY O!!&veW6 
 q01/  0 xx
##   DUIRPSuUs   C  	C 	CC N)__name__
__module____qualname__r   model_configr   str__annotations__r   r   r   r   PROJECT_ROOTr   r   rT  r   r    r"   r#   r$   r%   r&   r(   r*   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   boolr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rK   rL   rN   floatrR   rS   rT   rV   rW   rX   rZ   r[   r]   r_   r`   rb   rd   re   rf   rh   rj   rk   rl   rn   rp   rq   rr   rs   rt   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r%  r   classmethodr2  r6  r9  r>  r@  rB  rF  rK  rM  r^   r3  r1  r   r      s   %vXFL'Hc'27K./7&J&VL#VL:56L#6s")C)",C,$-c-$0c0NC %'c& &L#%#+S+',, *0!3/NC 6s5 10/s/ 76 76  s!030
 "231 15'4 (-,  s@  B'NC' ',t+ *,!3+GS ND %*d*!&$&#(D()- $- 38)47 ?D5tC .3$d2 [`w'VW_'))#&5&QVOWMNV L#  s#NC#0s0 '*)$'c'&))$&c&$&c&(* #*!"3" !"#!s#(D(!c!'** "(3' )- #, $&S%')) /4%t3 '+t* (-,&*t*6 ORw'JKQT 	 w2  H 	 %g3' 0 HL>K" +0!4/& 27($6 ;@14? 27($6" 56,c5  27($6 @E6D  */ $. 8=.< 03'2& /3%t2$ /4%t3& =B3TA ).- (-, 6;,d: /1&0+.#S. .3$d2" 2F)3E1I)3I./&/ <A2D@ ',t+ 5:+T9(< #<*I"CI*B"CB .3$d2./&/ 67-s6 49*D8./&/ 7<-t;3K+SK 7A.@ 27($6 16'5 16'5 .3$d238*D8*B"CB 1I(#H-L%sL 27($6
 ,1"D0,-$c- ).-)*!3* ,1"D0 /4%t3 ,D#SC+C#SC ,D#SC <A2D@ 38)47 6:,d9 /3w{+2
 )-, &(s' )+ #* $%S$" +0!4/0 :F!56E
 &*d)
 "$3#
 *. $-& ',t+ ',t+ (*)
 "$3# %*T) (-,
 $)D( $)D( /3%t2 +/!4. *. $- (-, K  ==  21!535 */ $.+c+ -2#T1  %$ >c= */ $. #(C' ')( 01'0 ',t+ %&c%  &%$ 5H,cG 0OS/#s# 5OS4 !B#A ,c+" 05&4 +0!4/( (-,
 #(4' "'$&
 $)D( .3$d2
 -2#T1
 */ $. /4%t3 #'4& (,+ -1#T0 +/!4.
 /4%t3 +0!4/ -0$c/
 27($6 -2#T1 +/!4. -2#T1 (-, ',t+
 '+t* '+t* &'s&
 "*3) OS ## -2#T1 16'5 -2#T1& .3$d2. /4%t3 "'$& $%S$#7S7%DsD%=s= .2$d1 )+ #*  c!$3$"%C%OS \"#    # -/IJ s   K ^$C #   %" 34s s   5 .0MNc c   O ,-	U 	u 	  .	 *+3 3   , *+3 3   , ./s s   0 23&$s &$s &$  4&$r3  r   r'  c                      g } t         j                  t        v r| j                  d       t         j                  t
        v r| j                  d       t         j                  t
        v r| j                  d       | S )uR   현재 설정에서 기본값이 남아 있는 항목 리스트. 경고 출력용.zSECRET_KEY (JWT)DEFAULT_ADMIN_PASSWORDDEFAULT_CREATOR_PASSWORD)settingsr   r+  rU  r    r5  r#   )issuess    r1  has_insecure_defaultsro  p  s`    F33()&&*==./((,??01Mr3  N)__doc__pathlibr   typingr   pydanticr   r   pydantic_settingsr   r   __file__resolveparentre  r+  r5  r8  r   rm  listrc  ro  ri  r3  r1  <module>ry     s   
   + > H~%%'..55<<CC / 4 Q S$| S$l2 :	tCy 	r3  