Files
mmd/__pycache__/db.cpython-314.pyc

299 lines
20 KiB
Plaintext
Raw Normal View History

2026-05-26 22:21:27 +02:00
+
<00><>jr<<00><00><><00>Rt^RIt^RIt^RIHt^RIHt]!4]P!RR4t]!] 4PR, t ]'dRMRt !R R
4t R%R R lltR RltRRltRtRtRtRt]R8XEd<>^RIt]!]P04^8<>d]P0^,MRt]R8Xd
]!4R#]R8Xd]!R4]!4]!4R#]R8XEdC]!4t] R8Xd<>]P8P;4t]P?R4]PA4Uu.uF q^,NK upt!]"!]!4F;t#]P?R]# 24]!R]# R]PI4^, R24K= ]PK4Mn]P?R4PA4t!]!FIt#]P?R ]#R!, 24PI4R",t&]!R]#R!, R]& R24KK ]PK4]!R#] 24R#]!R$4R#R#uupi)&u<>
db.py — Database abstraction layer for MoneyMaker.
Supports both PostgreSQL (production, int.i80.dk) and SQLite (local dev).
Usage:
from db import get_conn, DB_TYPE
conn = get_conn()
rows = conn.execute("SELECT * FROM articles").fetchall()
conn.commit()
conn.close()
Set DATABASE_URL in .env to use PostgreSQL:
DATABASE_URL=postgresql://moneymaker:pass@int.i80.dk:5432/moneymaker
Without DATABASE_URL, falls back to SQLite (ground_news.db).
N)<01>Path)<01> load_dotenv<6E> DATABASE_URL<52>zground_news.db<64>postgres<65>sqlitec<00><>a<00>]tRt^!toRtV3RlRltV3RlRltRV3RlRlltV3R lR
ltV3R lR lt R t
Rt Rt Rt RtRtVtR#)<14>DBConnu
Unified connection wrapper for SQLite and PostgreSQL.
- execute(sql, params): normalises ? → %s for Postgres; returns dict-row cursor
- upsert(table, pk, cols, vals): cross-DB INSERT OR REPLACE / ON CONFLICT DO UPDATE
- commit() / rollback() / close()
c<00> <<01>V^8<>dQhRS[/#)<02><00>db_type<70><01>str)<02>format<61> __classdict__s"<22><>%/home/hjess/Projects/MoneyMaker/db.py<70> __annotate__<5F>DBConn.__annotate__*s<00><><00><1F><1F>c<EFBFBD><1F>c<08><00>WnW nR#<00>N<><02>_connr )<03>self<6C>connr s&&&r<00>__init__<5F>DBConn.__init__*s <00><00><1B>
<EFBFBD><1E> rc<00>&<<01>V^8<>dQhRS[RS[/#)r <00>sql<71>returnr )rrs"<22>rrr.s<00><><00><13><13><03><13><03>rc <0C>L<00>VPR8XdVPRR4#V#)z,Translate ? placeholders to %s for Postgres.r<00>?<3F>%s)r <00>replace)rrs&&r<00>_sql<71> DBConn._sql.s$<00><00> <0F><<3C><<3C>:<3A> %<25><16>;<3B>;<3B>s<EFBFBD>D<EFBFBD>)<29> )<29><12>
rNc<00> <<01>V^8<>dQhRS[/#<00>r rr )rrs"<22>rrr4s<00><><00>3<>3<>3<EFBFBD>3rc<08>
<00>VPV4pVPR8XdH^RIpVPP VP
P R7pVPW4V#VPPW4#)rN)<01>cursor_factory)r$r <00>psycopg2.extrasr<00>cursor<6F>extras<61>RealDictCursor<6F>execute)rr<00>params<6D>psycopg2<67>curs&&& rr.<00>DBConn.execute4se<00><00><12>i<EFBFBD>i<EFBFBD><03>n<EFBFBD><03> <0F><<3C><<3C>:<3A> %<25> "<22><16>*<2A>*<2A>#<23>#<23>8<EFBFBD>?<3F>?<3F>3Q<33>3Q<33>#<23>R<>C<EFBFBD> <0F>K<EFBFBD>K<EFBFBD><03> $<24><16>J<EFBFBD><17>:<3A>:<3A>%<25>%<25>c<EFBFBD>2<> 2rc<00> <<01>V^8<>dQhRS[/#r'r )rrs"<22>rrr>s<00><><00>-<2D>-<2D>s<EFBFBD>-rc<08><><00>VPV4pVPR8Xd.VPP4pVP W4R#VPP W4R#)rN)r$r rr+<00> executemany)rr<00>seqr1s&&& rr5<00>DBConn.executemany>sK<00><00><12>i<EFBFBD>i<EFBFBD><03>n<EFBFBD><03> <0F><<3C><<3C>:<3A> %<25><16>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>O<EFBFBD>O<EFBFBD>C<EFBFBD> %<25> <10>J<EFBFBD>J<EFBFBD> "<22> "<22>3<EFBFBD> ,rc<00>,<<01>V^8<>dQhRS[RS[RS[/#)r <00>table<6C>cols<6C>vals)r<00>list<73>tuple)rrs"<22>rrrFs"<00><><00>"<0E>"<0E>C<EFBFBD>"<0E>4<EFBFBD>"<0E>u<EFBFBD>"rc
 <0C><><00>\V\4'dV.pVPR8Xd<>RPV4pRPR.\ V4,4pVUu.uF qwV9gK VNK ppRPV4p V'd+RPRV44p
RV RV RV RV R V
2
p MRV RV RV RV R
2 p VP
P 4p V PW<>4R#RPV4pRPR .\ V4,4pVP
PR V RV RV R 2V4R#uupi)z<>
Cross-DB upsert.
pk: single column name (str) or list of column names for composite PK.
SQLite: INSERT OR REPLACE INTO table (cols) VALUES (?,...)
Postgres: INSERT INTO table (cols) VALUES (%s,...) ON CONFLICT (pk) DO UPDATE SET ...
r<00>, r"c3<00>."<00>TF q RV 2x<00>K R#5i)z
=EXCLUDED.N<>)<02>.0<EFBFBD>cs& r<00> <genexpr><3E> DBConn.upsert.<locals>.<genexpr>Vs<00><00><00>"G<><06>1<EFBFBD>S<EFBFBD>
<EFBFBD>1<EFBFBD>#<23>#6<><06>s<00><01> INSERT INTO <20> (<28>
) VALUES (z) ON CONFLICT (z) DO UPDATE SET z ) DO NOTHINGr!zINSERT OR REPLACE INTO <20>)N)<08>
isinstancerr <00>join<69>lenrr+r.) rr9<00>pkr:r;<00>col_sql<71>val_sqlrC<00>non_pk<70>pk_sql<71>updaterr1s &&&&& r<00>upsert<72> DBConn.upsertFs\<00><00> <16>b<EFBFBD>#<23> <1E> <1E><14><14>B<EFBFBD> <0F><<3C><<3C>:<3A> %<25><1A>i<EFBFBD>i<EFBFBD><04>o<EFBFBD>G<EFBFBD><1A>i<EFBFBD>i<EFBFBD><14><06><13>T<EFBFBD><19> 2<>3<>G<EFBFBD>"&<26>6<>$<24>Q<EFBFBD>2<EFBFBD>+<2B>q<EFBFBD>q<EFBFBD>$<24>F<EFBFBD>6<><1A>i<EFBFBD>i<EFBFBD><02>m<EFBFBD>F<EFBFBD><15><1D><19><19>"G<><06>"G<>G<><06>"<22>5<EFBFBD>'<27><12>G<EFBFBD>9<EFBFBD>J<EFBFBD>w<EFBFBD>i<EFBFBD>H$<24>$*<2A>8<EFBFBD>+;<3B>F<EFBFBD>8<EFBFBD>E<01><14> #<23>5<EFBFBD>'<27><12>G<EFBFBD>9<EFBFBD>J<EFBFBD>w<EFBFBD>i<EFBFBD>H$<24>$*<2A>8<EFBFBD><<3C>9<><14><17>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>K<EFBFBD>K<EFBFBD><03> "<22><1A>i<EFBFBD>i<EFBFBD><04>o<EFBFBD>G<EFBFBD><1A>i<EFBFBD>i<EFBFBD><13><05><03>D<EFBFBD> <09> 1<>2<>G<EFBFBD> <10>J<EFBFBD>J<EFBFBD> <1E> <1E>)<29>%<25><17><02>7<EFBFBD>)<29>:<3A>g<EFBFBD>Y<EFBFBD>a<EFBFBD>P<><14> <0E><>%7s <00>"E<04>/Ec<08>:<00>VPP4R#r)r<00>commit<69>rs&rrV<00> DBConn.commitjs<00><00> <0C>
<EFBFBD>
<EFBFBD><19><19>rc<08>:<00>VPP4R#r)r<00>rollbackrWs&rrZ<00>DBConn.rollbackms<00><00> <0C>
<EFBFBD>
<EFBFBD><1B><1B>rc<08>:<00>VPP4R#r)r<00>closerWs&rr]<00> DBConn.closeps<00><00> <0C>
<EFBFBD>
<EFBFBD><18><18>rc<08><00>V#rrArWs&r<00> __enter__<5F>DBConn.__enter__ss<00><00><13> rc<08>x<00>V'dVP4MVP4VP4R#r)rZrVr])r<00>exc_type<70>_s&&*r<00>__exit__<5F>DBConn.__exit__vs <00><00> <13> <10>M<EFBFBD>M<EFBFBD>O<EFBFBD> <10>K<EFBFBD>K<EFBFBD>M<EFBFBD> <0C>
<EFBFBD>
<EFBFBD> rrr)<11>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>__doc__rr$r.r5rSrVrZr]r`re<00>__static_attributes__<5F>__classdictcell__)rs@rr r !s[<00><><00><00><08><1F><1F><13><13> 3<>3<>-<2D>-<2D>"<0E>"<0E>H<1C><1E><1B><14><15>rr c<00>0<00>V^8<>dQhR\R\/#<00>r <00>nr<00><02>intr)rs"rrr<00>s<00><00>2<>2<>#<23>2<>c<EFBFBD>2rc<04> <00>\R8XdR#R#)z8Return query placeholder: %s for postgres, ? for sqlite.rr"r!)<01>DB_TYPE)rps&r<00>phru<00>s<00><00><1A>j<EFBFBD>(<28>4<EFBFBD>1<>c<EFBFBD>1rc<00>0<00>V^8<>dQhR\R\/#rorq)rs"rrr<00>s<00><00><1E><1E>C<EFBFBD><1E>C<EFBFBD>rc<04>H<00>\4pRPV.V,4#)z1Return comma-separated placeholders for n values.r?)rurK)rp<00>ps& r<00> placeholdersry<00>s<00><00>
<EFBFBD><04>A<EFBFBD> <0F>9<EFBFBD>9<EFBFBD>a<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD> <1D>rc<00>$<00>V^8<>dQhR\/#)r r)r )rs"rrr<00>s<00><00>
&<26>
&<26>&<26>
&rc<04><><00>\R8Xd-^RIpVP\4pRVn\ VR4#\ P!\\44p\ PVn
\ VR4#)z-Return a DBConn wrapper (Postgres or SQLite).rNFr) rtr0<00>connectr<00>
autocommitr <00>sqlite3r<00> SQLITE_PATH<54>Row<6F> row_factory)r0rs r<00>get_connr<6E><00>s]<00><00><0E>*<2A><1C><17><17><1F><1F> <0C>-<2D><04><1F><04><0F><15>d<EFBFBD>J<EFBFBD>'<27>'<27><16><EFBFBD><EFBFBD>s<EFBFBD>;<3B>/<2F>0<><04>"<22>;<3B>;<3B><04><18><15>d<EFBFBD>H<EFBFBD>%<25>%ra<>
CREATE TABLE IF NOT EXISTS page_cache (
url TEXT PRIMARY KEY,
page_type TEXT NOT NULL,
fetched_at INTEGER NOT NULL,
content TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS rss_feed_cache (
feed_id TEXT PRIMARY KEY,
fetched_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS articles (
slug TEXT PRIMARY KEY,
story_id TEXT,
title TEXT NOT NULL,
description TEXT,
start_date TEXT,
source_count INTEGER,
bias_src_count INTEGER,
left_pct REAL,
ctr_pct REAL,
right_pct REAL,
left_src_count INTEGER,
ctr_src_count INTEGER,
right_src_count INTEGER,
overall_bias REAL,
blindspot TEXT,
factuality_json TEXT,
interests_json TEXT,
categories TEXT,
first_seen INTEGER,
last_seen INTEGER
);
CREATE TABLE IF NOT EXISTS article_signals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_slug TEXT NOT NULL,
ticker TEXT NOT NULL,
company_name TEXT NOT NULL,
sector TEXT,
sentiment TEXT,
sentiment_score REAL,
entity_score REAL,
mention_count INTEGER,
full_text_used INTEGER,
analyzed_at INTEGER NOT NULL,
coverage_spread REAL,
claude_tickers TEXT,
claude_magnitude INTEGER,
claude_timeframe TEXT,
claude_reasoning TEXT,
momentum_dir TEXT,
momentum_pct_5d REAL,
signal_score REAL,
alert INTEGER
);
CREATE TABLE IF NOT EXISTS positions (
ticker TEXT PRIMARY KEY,
shares REAL NOT NULL,
entry_price REAL NOT NULL,
entry_date TEXT NOT NULL,
stop_loss REAL NOT NULL,
take_profit REAL NOT NULL,
note TEXT
);
CREATE TABLE IF NOT EXISTS position_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
action TEXT NOT NULL,
shares REAL NOT NULL,
price REAL NOT NULL,
total_dkk REAL NOT NULL,
fee_dkk REAL,
pnl_dkk REAL,
signal_correct INTEGER,
event_date TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS saxo_orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT NOT NULL,
direction TEXT NOT NULL,
shares REAL NOT NULL,
price_dkk REAL,
total_dkk REAL,
fee_dkk REAL,
saxo_order_id TEXT,
status TEXT NOT NULL,
signal_score REAL,
analyst_rec TEXT,
placed_at TEXT NOT NULL,
filled_at TEXT,
note TEXT
);
a<EFBFBD>
CREATE TABLE IF NOT EXISTS page_cache (
url TEXT PRIMARY KEY,
page_type TEXT NOT NULL,
fetched_at BIGINT NOT NULL,
content TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS rss_feed_cache (
feed_id TEXT PRIMARY KEY,
fetched_at BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS articles (
slug TEXT PRIMARY KEY,
story_id TEXT,
title TEXT NOT NULL,
description TEXT,
start_date TEXT,
source_count INTEGER,
bias_src_count INTEGER,
left_pct REAL,
ctr_pct REAL,
right_pct REAL,
left_src_count INTEGER,
ctr_src_count INTEGER,
right_src_count INTEGER,
overall_bias REAL,
blindspot TEXT,
factuality_json TEXT,
interests_json TEXT,
categories TEXT,
first_seen BIGINT,
last_seen BIGINT
);
CREATE TABLE IF NOT EXISTS article_signals (
id SERIAL PRIMARY KEY,
article_slug TEXT NOT NULL,
ticker TEXT NOT NULL,
company_name TEXT NOT NULL,
sector TEXT,
sentiment TEXT,
sentiment_score REAL,
entity_score REAL,
mention_count INTEGER,
full_text_used INTEGER,
analyzed_at BIGINT NOT NULL,
coverage_spread REAL,
claude_tickers TEXT,
claude_magnitude INTEGER,
claude_timeframe TEXT,
claude_reasoning TEXT,
momentum_dir TEXT,
momentum_pct_5d REAL,
signal_score REAL,
alert INTEGER,
UNIQUE(article_slug, ticker)
);
CREATE TABLE IF NOT EXISTS positions (
ticker TEXT PRIMARY KEY,
shares REAL NOT NULL,
entry_price REAL NOT NULL,
entry_date TEXT NOT NULL,
stop_loss REAL NOT NULL,
take_profit REAL NOT NULL,
note TEXT
);
CREATE TABLE IF NOT EXISTS position_events (
id SERIAL PRIMARY KEY,
ticker TEXT NOT NULL,
action TEXT NOT NULL,
shares REAL NOT NULL,
price REAL NOT NULL,
total_dkk REAL NOT NULL,
fee_dkk REAL,
pnl_dkk REAL,
signal_correct SMALLINT,
event_date TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS saxo_orders (
id SERIAL PRIMARY KEY,
ticker TEXT NOT NULL,
direction TEXT NOT NULL,
shares REAL NOT NULL,
price_dkk REAL,
total_dkk REAL,
fee_dkk REAL,
saxo_order_id TEXT,
status TEXT NOT NULL,
signal_score REAL,
analyst_rec TEXT,
placed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
filled_at TIMESTAMPTZ,
note TEXT
);
c<04><><00>\R8Xd<>^RIpVP\4pVP 4p\
P R4F.pVP4pV'gKVPV4K0 VPR4VP4'gVPR4VP4VP4VP4MX\P!\\44pVP\ 4VP4VP4\#R\ R24R#)zBCreate all tables if they don't exist. Safe to run multiple times.rN<>;z<>
SELECT 1 FROM pg_constraint
WHERE conname = 'uq_article_ticker'
AND conrelid = 'article_signals'::regclass
zZALTER TABLE article_signals ADD CONSTRAINT uq_article_ticker UNIQUE (article_slug, ticker)z Schema initialiseret (rI)rtr0r|rr+<00>SCHEMA_POSTGRES<45>split<69>stripr.<00>fetchonerVr]r~rr<00> executescript<70> SCHEMA_SQLITE<54>print)r0rr1<00>stmts r<00> init_schemar<61>fs<><00><00><0E>*<2A><1C><17><17><1F><1F> <0C>-<2D><04><13>{<7B>{<7B>}<7D><03>#<23>)<29>)<29>#<23>.<2E>D<EFBFBD><17>:<3A>:<3A><<3C>D<EFBFBD><13>t<EFBFBD><13> <0B> <0B>D<EFBFBD>!<21>/<2F>
<0C> <0B> <0B> <0C> <0A>
<13>|<7C>|<7C>~<7E>~<7E> <0F>K<EFBFBD>K<EFBFBD>Q<01> <0E> <0A> <0B> <0B> <0A> <0B> <09> <09> <0B> <0C>
<EFBFBD>
<EFBFBD> <0C><16><EFBFBD><EFBFBD>s<EFBFBD>;<3B>/<2F>0<><04> <0C><1A><1A>=<3D>)<29> <0C> <0B> <0B> <0A> <0C>
<EFBFBD>
<EFBFBD> <0C> <09> $<24>W<EFBFBD>I<EFBFBD>Q<EFBFBD>
/<2F>0rc <04>P<00>\R8wd\R4R#^RIp\P!\ \ 44p\PVn\4pVP4p.ROpVEF<>pVPRV 24P4pV'g\RV R24K?\V^,P44pRPV4pRPR.\!V4,4p R V9dVU
u.uF q<>R 8wgK V
NK up
MTp RPR.\!V 4,4p RPV 4p ^p^pVF<>p.pV FWp
VV
,p\#V\$\&34'd^RIpVP+R
V4^,pVP/V4KY \1V4pVPR V R V R V R2V4VP2^8<>d V^, pK<>V^, pK<> VP54\RV RV RV R24EK<> VP74VP74\R4R#uup
i \,dRpL<>i;i \,dpT^, pRp?EK=Rp?ii;i)z<>
One-time migration: copy all data from local SQLite to Postgres.
Safe to run multiple times (uses INSERT OR IGNORE / ON CONFLICT DO NOTHING).
ru/DATABASE_URL ikke sat — kører ikke migrationNzSELECT * FROM <20> u: 0 rækker — skipr?r"<00>id<69>drFrGrHz) ON CONFLICT DO NOTHING<4E>: z indsat, z sprunget overu Migration færdig!)<06>
page_cache<EFBFBD>rss_feed_cache<68>articles<65>article_signals<6C> positions<6E>position_events)rtr<>r0r~r|rrr<>r<>r<>r+r.<00>fetchallr<<00>keysrKrLrJ<00>bytes<65> bytearray<61>struct<63>unpack<63> Exception<6F>appendr=<00>rowcountrVr])r0<00> sqlite_conn<6E>pg_conn<6E>pg_cur<75>tablesr9<00>rowsr:<00>cols_sql<71>vals_sqlrC<00> insert_cols<6C> insert_vals<6C>insert_cols_sql<71>inserted<65>skipped<65>row<6F>values<65>vr<76><00>es r<00>migrate_sqlite_to_postgresr<73><00>sf<00><00>
<0F>*<2A><1C> <0A>?<3F>@<40><0E><13><19>/<2F>/<2F>#<23>k<EFBFBD>"2<>3<>K<EFBFBD>%<25>k<EFBFBD>k<EFBFBD>K<EFBFBD><1B><1A>*<2A>G<EFBFBD><19>.<2E>.<2E>"<22>F<EFBFBD><06>F<EFBFBD>
<18><05><1A>"<22>"<22>^<5E>E<EFBFBD>7<EFBFBD>#;<3B><<3C>E<>E<>G<><04><13> <11>B<EFBFBD>u<EFBFBD>g<EFBFBD>1<>2<> 3<> <14><13>D<EFBFBD><11>G<EFBFBD>L<EFBFBD>L<EFBFBD>N<EFBFBD>#<23><04><17>9<EFBFBD>9<EFBFBD>T<EFBFBD>?<3F><08><17>9<EFBFBD>9<EFBFBD>d<EFBFBD>V<EFBFBD>c<EFBFBD>$<24>i<EFBFBD>/<2F>0<><08>9=<3D><04> <0C>$<24>4<>$<24>Q<EFBFBD>t<EFBFBD>)<29>q<EFBFBD>q<EFBFBD>$<24>4<>$<24> <0B><1A>i<EFBFBD>i<EFBFBD><14><06><13>[<5B>)9<> 9<>:<3A> <0B><1E>)<29>)<29>K<EFBFBD>0<><0F><14><08><14><07><17>C<EFBFBD><17>F<EFBFBD> <20><01><17><01>F<EFBFBD><01><1D>a<EFBFBD>%<25><19>!3<>4<>4<>!<21>%<25>"<22>M<EFBFBD>M<EFBFBD>#<23>q<EFBFBD>1<>!<21>4<><01><17> <0A> <0A>a<EFBFBD> <20>!<21><1B>6<EFBFBD>]<5D>F<EFBFBD> <1D><16><0E><0E>"<22>5<EFBFBD>'<27><12>O<EFBFBD>+<<3C>J<EFBFBD>{<7B>m<EFBFBD>T-<2D>.<2E><1A><12>
<1A>?<3F>?<3F>Q<EFBFBD>&<26><1C><01>M<EFBFBD>H<EFBFBD><1B>q<EFBFBD>L<EFBFBD>G<EFBFBD>-<18>4 <10><0E><0E><18> <0A><02>5<EFBFBD>'<27><12>H<EFBFBD>:<3A>Y<EFBFBD>w<EFBFBD>i<EFBFBD>~<7E>F<>G<>Y<18>\<10><15><15><17> <0B>M<EFBFBD>M<EFBFBD>O<EFBFBD> <09>
<20>!<21><>K5<><35>%<25>!<21> <20><01>!<21><><1D> <1D><17>1<EFBFBD> <0C><07><> <1D>s<<00>I-<06>I-<06>I2<06>6J<04> J<04>2 J <09>J <09> J%<07> J <07> J%<07>__main__<5F>status<75>init<69>migrateu"Migrerer SQLite → PostgreSQL ...z9SELECT tablename FROM pg_tables WHERE schemaname='public'zSELECT COUNT(*) FROM r<>r<>u rækkerz1SELECT name FROM sqlite_master WHERE type='table'zSELECT COUNT(*) AS cnt FROM <20>name<6D>cntz
DB type: z(Brug: python db.py [init|migrate|status])<01>)'rk<00>osr~<00>pathlibr<00>dotenvr<00>getenvr<00>__file__<5F>parentrrtr ruryr<>r<>r<>r<>r<>rg<00>sysrL<00>argv<67>cmdr<64>rrr+<00>rawr.r<>r<><00>sorted<65>tr<74>r]rp)<01>rs0r<00><module>r<>s<00><01><04>$
<EFBFBD><0E><18><1E> <0B> <0A><11>y<EFBFBD>y<EFBFBD><1E><12>,<2C> <0C><13>H<EFBFBD>~<7E>$<24>$<24>'7<>7<> <0B>)<29>z<EFBFBD>x<EFBFBD><07>
Z<15>Z<15>~2<>
<1E>
&<26>b<04> <0A>Hc<04><0F>L1<>DD"<22>N <0C>z<EFBFBD><19><0E><1C>S<EFBFBD>X<EFBFBD>X<EFBFBD><1D><11>*<2A>#<23>(<28>(<28>1<EFBFBD>+<2B><08>C<EFBFBD>
<EFBFBD>f<EFBFBD>}<7D><13> <0A> <0C> <09> <19> <0A>2<>4<><13> <0A>"<22>$<24> <0C><08><1F><17>z<EFBFBD><04> <12>j<EFBFBD> <20><16>*<2A>*<2A>#<23>#<23>%<25>C<EFBFBD> <0F>K<EFBFBD>K<EFBFBD>S<> T<>$'<27>L<EFBFBD>L<EFBFBD>N<EFBFBD>3<>N<EFBFBD>q<EFBFBD><01>d<EFBFBD>d<EFBFBD>N<EFBFBD>3<>F<EFBFBD><1B>F<EFBFBD>^<5E><01><13> <0B> <0B>3<>A<EFBFBD>3<EFBFBD>7<>8<><15><02>1<EFBFBD>#<23>R<EFBFBD><03> <0C> <0C><0E>q<EFBFBD> 1<>2<>(<28>;<3B><<3C>$<24> <10>I<EFBFBD>I<EFBFBD>K<EFBFBD><19>\<5C>\<5C>"U<>V<>_<>_<>a<>F<EFBFBD><1B><01><18>L<EFBFBD>L<EFBFBD>#?<3F><01>&<26> <09>{<7B>!K<>L<>U<>U<>W<>X]<5D>^<5E><01><15><02>1<EFBFBD>V<EFBFBD>9<EFBFBD>+<2B>R<EFBFBD><01>s<EFBFBD>(<28>3<>4<><1C> <0A>
<EFBFBD>
<EFBFBD> <0C> <0A> <0A>g<EFBFBD>Y<EFBFBD>'<27>(<28> <0A>8<>9<>9<1A><>4s<00>8H;