PKGJVӐFF ntfy/icon.pngPNG  IHDR+sBIT|d pHYsNN@ztEXtSoftwarewww.inkscape.org< IDATxuPDB\4IM].--PҒ,,TJrKmSS0@ Ep) RsPAf+)=p*jZzȀ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ M9?h"FQDb"EEDhN:X"bQDFĂx)6?j1/"EwpigZzi։(v/b(6*:EQEQTVjkZڟj-;ntny,D?x()T[=RjmkڌZ;np_M5@:=!EQ (Jeԛ^j@VQŜO7&t1-7J:TVOut>5j0{' hiZD_T*_TJ::R̙1{r'$:KEQ9RnGU:::FΙ1at9V~{ m:~XTZT*2::wtWcfOxY=9V~{нVRTnTu,hoeQG̞~ɒ{r t~{zVy4({Z}٥EQ6{%/Nozj1R~(j=]YVkho( _(FTI=zQ̫65EQ65[T*ZZ|=Fu:d\[V7N::3c}4 }bhsclڴs~uRۗ]VT*_=sWVPK/Q̯65(M̓(淴B9ev/Rmz @:ڗP6}SǴRFrhiyQΪTkk3cM-CQ6U*5+{ZZ|# C"j*զSo }ٯ"O̞~[@x ZZlQTfj[ZG8 :cjӝ]OQTli[:M\6,9XQ͕j̖!SouQզK@WEtIK됣Rohirfj_v֜NM=P6 JѾ/^\W6 HѾlzGWz(Q6 hi=`T]-CN65})!'d!Vz}Yasf?7-CV(Roje3cSR6PtsQ[|Z}ه[R2YR>^jK:3gRoYٲR ?EQ^T*ޑBvuȘJ;HRuȘ;V:զ扩w^}?)%:xJ驢tKj=gƄ |(y𚢨t+j6EhiraZ8JqK SX+-67!(Ro+>8 S/L R(:9R;J!Ǧљ+-CVT/?ފ о֜_N34'[WIwt@K됏TzӾm93JErE S).FR}gSR}gKoQo *ʈ(F|[6ThirpQIr+*>-CN*ʩ70u~@K^&Y7XuȀJA4JAKwCC(N(o΢VްBZZSm;h\˖sΌ sSX ht{>J"#]S#=KZWT@cT}ZzNJ(u892Q7h@Z-P7hi@KEQzy(JSX^ EQf o2Ro /e~2QQHJ7Jcy2DQ|92U7i)@QRo Oe}4Tޗzy*뛴t`7/*UR OEozUP!72M>zy+۴t b\ ߦ EQzy+۴T`]E6xlSx;J."J Sި QJ="toԲSO(To Q7j@QzDZ-(T H="toz^ު noJV-Q(ޙzUKbߔZPDz^ު Qd4o"H=Eު M)[LXNd@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @Ȁ d@ 2 @JzF+}qvSJI4w)']뤞P*M~\31~pԓ<쀏GĞpT*(&J=??nR{8Ljz묕z@7h(;}pv[U/I= K NssS|ScY#(ROHNaѻWǧ~;|&$%6qÏb$!]%.<ѽ{sV*tu ۇ?ldi>'ۤo9N k=qGǷ|;R4+">1j=[ssIu'߭ҽ[3]9u%y}<8ؤԅ֛7~z1CG^BxEQ'>S>{D khj\x zJ ;3u9ooû];C|-n^9oa8E_ *JݺK>{D]Z 躼X`\Gz8ã6 _7N~XtWcI=_4fmLm\2xeԓ|:CS1`RW H˫:Q{N;&rs l㏈G Y+ C~V>m|p-cc%' Xɚb}FDG?EQd@D+S[os'@bn8{GkF9@u~1DR]HnqQg D.h>د#O:*6ۤo9@ |Ӎ✓oӻW9@ Ee5rD tktknN= (!JbUAy||dRJFy}<8ؤ%!@Im{㧧ks.N+">N11pݣzE zJ ;qߍlz @_w޷wRP~\b=RTZ[w#7cרVuy@[g8qã6$"P ޑzFmqo%_osL8{H=vl*?;qj=VM=XIJɧitS)j5>n1zQEI@'([xw|[Ę˧īKSj36(~vڱt"Rjk[Î:9~ssJoO8"N8rXΚ@^R_;;ysJo ~t||qޱ*SH!#0~|ᥱ兩ZssSOk9"ﺣ!0jZL-ol ӻWաq)ߊ-6(` 4ǹct6N6x8ģⸯkF9rhX8xօGw:!ݻwK=xޭ+֩1)ҭ[s 1c; mҶp8XO8kY'm7-Ȋf9'G:4z&l`Ew1FM'o@ [תt/;.K=7{laǝw:kG?<ظ'=qܩ6[l?;8bؠxG@7OQ1`cESzdK779Vj|yg}7vl*Ȓoy/i?e|ij' \Q믻vĩ 7X7ȊoH|moǹ/V#Ȃo?yrLlV+=v#7>.Q:↷i+_:X/_{S%rzl#/>?/puljJک@iJ=?q_ {S{n'ڎ-[Em7n+ 'Ibѧ8XMjn1zQEIPz/w6ѫg1lPcc-6M=JMNl`}mw GG뮳f9PJtg;l⠽cU"@'{lO;}0knniQ#GD]v <Գq)?q6NG:49bR.O/}JXdi9&}~P@%@r694/.<'[s _IģOSsK ?,,|%[{5ⸯgxTl@ @Q⺙7ǗyR\3lbSGuh+HJ.f+翼";z("c9"ߧ5RO$^;xQt/;.ۦ+]ͷ_>wTg`u֌?<ظJ#@ ,mkK&^l`mŦӎ# wzt:J*"s9">nTFkuZU㐡NزU9)(gl։8u릞u%@ɽl]>zNCӇǡ {H=BSƱ8N9*lV+cVs @/Zh07~g ;zYg8-[?Xn4ן o%_wsm=9ӇZn|ygǪoxlOG_l`45Uc=wgOSEzWd#0+>vл/vLl{S7%@f^^(~vqq?p6N6A1o\O9O%=qGv..88hcUB1S+ҥm^5rDeG@!ti[\<vI޽C9'oQ9 4 |IgaMȓcv`էw9dL?p>zQgCdt֜z7l`u-:!vݩ_9dF}kg~l S <_☓ -߷qsʷ⨯kz Ng(hbY#b}GssSI4(x^6pH=!jO/~ymS r8q?v6N[g8a㏈6\?{g_^(햛N;&6(ѫg94~c Jv9FhVSO^^(~:rgh!lwbL=N񏳁猎/O=!:q1_Sn9tY#}r\t9<xJ4]\pqUwK=L/̋s~1>SFOJ֔z)">NqwzNø1GH=L-߷Iv=0^R09nevjsH@a|:>SSҥmqŵ3kgƒ%KS !H){On&LvVv6q?뮳f) Ǟ\>h)t!Ć~a`lROi_Z]vmp}T={C[wj%zhk[N/I=.JV^kug?\|u<;S9W=L7vbuCPi-Xc.n-:::RD IDAT57Ǿ{_-kok6.x}hq9N6g;Mgz %&u_=sqI1SO c~{^?_,|eQbjL9+}_uttu3oW\//\z F6go=N'~6e3=Shp_9W'M&-kO= r֯jZLsٔxi˩xC}7X/}{831ySȐ gϋ /*fSȘD~aK3bu7ҶsȜ8WgZ-fκ=.pM{iA9dY1GH=zߠ}Z~u¼bq-L=ސq֯.m˯W\;3,YzGdšm_tpx%@s֯|8ĸGSOL_{iA\t51GVK=V$=h`lYzhk[:.zF,~uI9\h k_>ӱ~usw\}1X!4g'N{( JYۂ1)qo=%_}-kokL,Zzԝ%sSg禞Fp֯|8Ę}SON'@ 8W_//\_95̜J!@_}wu3oqW^//\zTtA珛O>\)];l ls>4g{>.7)~7O@Rt+IbbY{{9\G|~ǝZsۂ@!@"=獝>L)~Ko3Xů.K:ږ]+~Ub ļ @'s֯{8o̕O"@'q֯q~?9~sS3gkɒqŵ3)%K%@8Wuv?9q~)Pzԁ~#Oyc'}>z 4 VkÆ_{iA\4ᚘ9j@C`9tkn{~uֶ,&Mu\zXs! 69W_7~g\xSO&[w_=p`lf4Gx&;1S ,1O}J$PE }8s{:Wcbiʢũ@vx[o:W'`ܤxSOl :kF ;ӱ|8Ę}SO  Ÿ+f!~uSfΊ//\z:r֯f8xROހ@v^;wDߊzٹ񋋯S)?WZ9ʢqɤiqʹbY{{9!7ozظ^V}k|JmsH9W_wP7vb<3o@Cr֯b\pUqw,'/~u%qcmY9 hOV=F_zMiA9@^z3agN}2JYzqqӭSO:@)9W?K,+_;3.mK=$_}xc¼RO:@)8W_>D;fbc+@)/g7qфkbۣVDd`i[[LƸlXshp~g\xU神$$@z䉧1N=h0/-x9\6%x @X=?iZ,Zj9@#@ݜ?&3=z E PbOXޞzPrt11◗M//L=ht!wP7vb<3 F.ٹ/_S%@B/K'OISoe LjZpˮ/-H=Ȁ+ٽ<獹2zS}a~utۜS ɖ,Y_;3vf,]ږz):IVo'L潔z9:<玹2㩧DuE^ju-&Nu\6yFdi9VЬ:S##?獝p)oK ^_^:%6JChٲŢůn=񋋯<|)E7S&MCj3`p> pvf@KU"U 7P0صoP5WphZU I <^,- |L\k;j[ pM~h`ZQ U+hmGm+ }z5lwv4o0=-.`zZM }ߍ=ŵ#P\is` 0 n)-՝LC;i@ZI ` 4v jy6*q7e6h Iu~py-M2 m@;Oucq-M$Vmv@`p{6pk*7[/9з_c8,COd" I֫˱G`bkN&t$0 tO&d}oj;@^fq0LL*$Ӻ?qLq\VꆡOν\H+5܌N9[ =*},LP߭{URx~jy9+COcri ܷq< {pխng;Mh-촮WˬnO+e1=h*l.w],#΀k}`d}ey^~/>z壮[gy?n/-M6~aQg4[6YIv_//|${.ӭ=5z{nڔ VY.6zuO\C]7&eVT;Z^d/qod'ݵV%#clƽ۸lv4'c]tٓӳw'18/1ﲼ<]g4֛_WW$z5&VC8mtZo = YIߏ:$}CxD{ڬb>H{ //-b. ׿j:l%z'\K^mw`vϫ=;$'y؃$Uten!ﻬ黃ng{6+y1 }-`y!벼xtsaOoMk>l.#Dnŝ,/cp0ٗlvM",Lֱx2w-gmonwM"l6]V<$Saz#Y]Oefל)-'gƞ~ߺ[[o'9{ҭ֫Cb>ؕ)<nw:QnmcUfu=.M $99={g=u֭ߺ[st0 }eGڅ?[g/{]d`tǷ`40Ǘ&2+sVstt)3 }w=ĮM $$/IٗK<ƀǢ@W %GG9#W@A/C2 z:0|j~TdSN$Hӳ$)?^70k+f/]r&*ɫƞfjKNd@,y7=Mr&^cD6M>,泏ĭI>:,Gx T6M |IDAT$b>$/Mس7$yv,tH|`$˱g`Iζ_i@,泿J$س3CWlw|ٜ)oHGaI~7gJI~b1qA9,ے|سp_MCcrh'prz$KǞ{I{1؃"I}]Hc$߹; !Ob${>Mpyg6 `1O'yM6I0u6;˷;OIޚ+Ǟ%|cWܧscY zGX+z= ĭb>ͱipM'gߐ䷓|سL'yb>{؃-״|aOgk}ءӳ/KkI~2jH$[N6p%O/{q lP䧒<48-x(ypNI~)ɳG|0kb>[=̔ 78%$_?8c$$yb>%$#pLI޾,7Hs"ɏ$yǒ%كcSp|W61{<}܉2ɟ$yc?wsrz%ٜcIܳuLl.;9={foKI^$ѨC|ʐd]I:-泇'"4YI=$_=D@A$>6<#a'gH$_s8жO&`l=.;c urzI*3w~A2Iz8-6!{#@cPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP?c'.XIENDB`PK'Hh f f ntfy/cli.pyimport argparse import json from os.path import expanduser from getpass import getuser from importlib import import_module from socket import gethostname from subprocess import call from sys import stderr, exit from time import time from requests import HTTPError def load_config(args): try: config = json.load(open(expanduser(args.config))) except IOError: stderr.write( "Warning: Couldn't open config file '{.config}'.\n".format(args)) config = {'backends': ['default']} if 'backend' in config: if 'backends' in config: stderr.write("Warning: both 'backend' and 'backends' in config, " "ignoring 'backend'.\n") else: config['backends'] = [config['backend']] if args.backend: config['backends'] = args.backend return config def run_cmd(args): start_time = time() retcode = call(args.command) return '"{}" {} in {:d}:{:02d} minutes'.format( ' '.join(args.command), 'succeeded' if retcode == 0 else 'failed', *map(int, divmod(time() - start_time, 60)) ) def send_notification(message, args, config): ret = 0 for backend in config['backends']: module = import_module('ntfy.backends.{}'.format(backend)) try: module.notify(title=args.title, message=message, config=config.get(backend, {}), **dict(args.option)) except HTTPError as e: stderr.write( 'Error: status={resp.status_code} body={resp.content}\n'.format( resp=e.response)) ret = 1 return ret def main(): parser = argparse.ArgumentParser( description='Send push notification when command finishes') parser.add_argument('-c', '--config', default='~/.ntfy.json', help='config file to use (default: ~/.ntfy.json)') parser.add_argument('-b', '--backend', action='append', help='override backend specified in config') parser.add_argument('-o', '--option', nargs=2, action='append', metavar=('key', 'value'), default=[], help='backend specific options') default_title = '{}@{}'.format(getuser(), gethostname()) parser.add_argument('-t', '--title', default=default_title, help='a title for the notification (default: {})' .format(default_title)) parser.add_argument('-d', '--device', help='device to notify') subparsers = parser.add_subparsers() send_parser = subparsers.add_parser('send', help='send a notification') send_parser.add_argument('message', help='notification message') send_parser.set_defaults(func=lambda args: args.message) done_parser = subparsers.add_parser( 'done', help='run a command and send a notification when done') done_parser.add_argument('command', nargs=argparse.REMAINDER, help='command to run') done_parser.set_defaults(func=run_cmd) args = parser.parse_args() config = load_config(args) if hasattr(args, 'func'): return send_notification(args.func(args), args, config) else: parser.print_help() if __name__ == '__main__': exit(main()) PKdGntfy/__init__.pyPKGA>B>B ntfy/icon.ico@@ (B(@ @NNP>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,'P>,qP>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,qP>,'P>,P>,P>,P>,P>,_P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,P>,_P>,P>,P>,P>,P>,RP>,P>,P>,Q?-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?-Q?-P>,P>,P>,P>,RP>,P>,P>,P>,P>,Q>,UB/ZF2\G3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\H3\G3ZF2UB/Q>,P>,P>,P>,P>,P>,=Q?-YE1^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4YE1Q?-P>,=P>,P>,P>,WWC0^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4WC0P>,WP>,VC0UB/[\H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4\H3UB/[VC0]H3[G2[^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4[G2[]H3^I4^I4]^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4]^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4\F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4aL8^I4]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I3dP<}nvuuuuuuuuuuuq^K]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4\G2xho]J\G2]H3^I4^I4^I4^I4^I4^I4^I4]H3p]Ju[F1^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4[F1w}fS>\G1^I4^I4^I4^I4^I4^I4]H3p]Ju[F1^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4\F1rúxhaL7\G2^I4^I4^I4^I4^I3dP<}nvuuuuuuuuuuuq^K]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4]H3iUByhV]H3]H3^I4^I4^I4^I4\F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1[F1]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4]H3]H3yhVn[G\G2]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4\G2aL8zjŽyeQ=\G1^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4\G1hT@ueaM8^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4]H3[E0vdR`K6^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4]H3]H3yhVr_L^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^H3\G2lYF|kY^I4]H2^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4\G2dP;vǾ|lbM9\G2^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4`K6p_ühTA\G1^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4\G1vfr_M\G2]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4[F1v~n\^I5]G2^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4\F1spcN:\G2^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4]H3kXDjWC\G1^I3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4]H3]H3^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4^^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^^I4^I4^I4Y^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4Y^I4^I4^I4?^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4?^I4]I4]H4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4]H4]I4\H3^I4^I4U^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4U^I4\H3]H4]H3^I4b^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4b]H3]H4]H3\G3^I4)^I4s^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4^I4s^I4)\G3]H3Q>-ZF2WD0YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1YE1WD0ZF2Q>-PK3Gʹrntfy/backends/http.pyimport requests def notify(config, message='', subject='', device=''): """ Required config keys: * 'url' Useful config keys: * 'mappings': should be a dictionary of dictoinaries. The keys in dictoinary are the keyword argument to the requests functoin. the dictionary that is it's value is used to populate a dictionary to be passed as that argument. the key is the key to be populated and the value is a py3k style format string that gets passed message, subject, device and **config as arguments. example: { 'data': {'body': '{message}', 'title': '{subject}'}, 'headers': {'Access-Token': '{access_token}'}, } * 'user_key' """ kwargs = {} for arg, mapping in config.get('mappings', {}).items(): kwargs[arg] = {key: value.format(message=message, subject=subject, device=device, **config) for key, value in mapping} # drop keys with falsey values kwargs[arg] = {k: v for k,v in kwargs[arg].items() if v} resp = requests.post(config['url'], **kwargs) resp.raise_for_status() PKJ'Hitttntfy/backends/darwin.pyimport Foundation import objc import AppKit NSUserNotification = objc.lookUpClass('NSUserNotification') NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter') def notify(title, message, config, **kwargs): """ adapted from https://gist.github.com/baliw/4020619 """ notification = NSUserNotification.alloc().init() notification.setTitle_(title) if message is not None: notification.setInformativeText_(message) notification.setDeliveryDate_(Foundation.NSDate.date()) NSUserNotificationCenter.defaultUserNotificationCenter()\ .scheduleNotification_(notification) PKV'H8ntfy/backends/pushover.pyimport requests def notify(title, message, config, device=None, **kwargs): """ Required config keys: * 'api_token' * 'user_key' """ data = { 'message': message, 'token': config['api_token'], 'user': config['user_key'], 'title': title, } if device: data['device'] = device resp = requests.post('https://api.pushover.net/1/messages.json', data=data) resp.raise_for_status() PKdGntfy/backends/__init__.pyPKL'HoXXntfy/backends/default.pyfrom sys import platform from importlib import import_module def notify(title, message, config, **kwargs): for os in ['linux', 'win32', 'darwin']: if platform.startswith(os): module = import_module('ntfy.backends.{}'.format(os)) module.notify(title=title, message=message, config=config) break PK'Hҹrsntfy/backends/pushbullet.pyimport requests def notify(title, message, config, device_iden=None, **kwargs): """ Required config keys: * 'access_token' """ data = { 'type': 'note', 'title': title, 'body': message, } if device_iden is not None: data['device_iden'] = device_iden headers = {'Access-Token': config['access_token']} resp = requests.post('https://api.pushbullet.com/v2/pushes', data=data, headers=headers) resp.raise_for_status() PKG'HUg!ntfy/backends/win32.py# -- coding: utf-8 -- from win32api import * from win32gui import * import win32con import os import struct import time def notify(title, message, config, **kwargs): class WindowsBalloonTip: def __init__(self, title, msg): message_map = { win32con.WM_DESTROY: self.OnDestroy, } # Register the Window class. wc = WNDCLASS() hinst = wc.hInstance = GetModuleHandle(None) wc.lpszClassName = "PythonTaskbar" wc.lpfnWndProc = message_map # could also specify a wndproc. classAtom = RegisterClass(wc) # Create the Window. style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = CreateWindow( classAtom, "Taskbar", style, \ 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \ 0, 0, hinst, None) UpdateWindow(self.hwnd) iconPathName = os.path.abspath(os.path.join(os.path.split( os.path.split(__file__)[0])[0], 'icon.ico')) icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE try: hicon = LoadImage(hinst, iconPathName, \ win32con.IMAGE_ICON, 0, 0, icon_flags) except: hicon = LoadIcon(0, win32con.IDI_APPLICATION) flags = NIF_ICON | NIF_MESSAGE | NIF_TIP nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "tooltip") Shell_NotifyIcon(NIM_ADD, nid) Shell_NotifyIcon(NIM_MODIFY, \ (self.hwnd, 0, NIF_INFO, win32con.WM_USER+20,\ hicon, "Balloon tooltip",title,200,msg)) DestroyWindow(self.hwnd) def OnDestroy(self, hwnd, msg, wparam, lparam): nid = (self.hwnd, 0) Shell_NotifyIcon(NIM_DELETE, nid) PostQuitMessage(0) # Terminate the app. WindowsBalloonTip(message, title) PK<'Hn/ntfy/backends/linux.pyimport dbus from os import path ICON = path.abspath(path.join(path.split(path.split(__file__)[0])[0], 'icon.png')) def notify(title, message, config, **kwargs): bus = dbus.SessionBus() dbus_obj = bus.get_object( 'org.freedesktop.Notifications', '/org/freedesktop/Notifications') dbus_iface = dbus.Interface( dbus_obj, dbus_interface='org.freedesktop.Notifications') dbus_iface.Notify('ntfy', 0, ICON, title, message, [], {}, -1) PK'H^- $ntfy-0.3.0.dist-info/DESCRIPTION.rstUNKNOWN PK'HвZ\((%ntfy-0.3.0.dist-info/entry_points.txt[console_scripts] ntfy = ntfy.cli:main PK'H5"ntfy-0.3.0.dist-info/metadata.json{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5"], "extensions": {"python.commands": {"wrap_console": {"ntfy": "ntfy.cli:main"}}, "python.details": {"contacts": [{"email": "dschep@gmail.com", "name": "Daniel Schep", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/dschep/ntfy"}}, "python.exports": {"console_scripts": {"ntfy": "ntfy.cli:main"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "keywords": ["push", "notification"], "license": "MIT", "metadata_version": "2.0", "name": "ntfy", "run_requires": [{"requires": ["requests"]}], "summary": "A utility for sending push notifications", "version": "0.3.0"}PK'HɕV"ntfy-0.3.0.dist-info/top_level.txtntfy PK'Hndnnntfy-0.3.0.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any PK'HvdDntfy-0.3.0.dist-info/METADATAMetadata-Version: 2.0 Name: ntfy Version: 0.3.0 Summary: A utility for sending push notifications Home-page: https://github.com/dschep/ntfy Author: Daniel Schep Author-email: dschep@gmail.com License: MIT Keywords: push notification Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3) Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Requires-Dist: requests UNKNOWN PK'H=ntfy-0.3.0.dist-info/RECORDntfy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 ntfy/cli.py,sha256=HAH4kFhr7YG0bBuqVjS77xX9xo6WeI6uJumANatifKE,3430 ntfy/icon.ico,sha256=_rzQbe8WaMqkS_OJrcDZ9QmS54wU1Qcg_ealHs6lL5g,16958 ntfy/icon.png,sha256=yWLL05SFy2k1PnG9M_cc5OVAjJCyxTEnV9UBQB4VuiE,18064 ntfy/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 ntfy/backends/darwin.py,sha256=0ZV7Hst9EAenBvKXl0M7mA7Phg71-nbgruUXFs_7VEw,628 ntfy/backends/default.py,sha256=ACjYeiAaVIhJvHJ1r1GGbmI-U4pTMUaPyKAewvs1COQ,344 ntfy/backends/http.py,sha256=WLDoEzuT0dMpkxm2Q338qswembKSmmZrm4UU6P98wFE,1219 ntfy/backends/linux.py,sha256=aiBJUUaeicZFcZhmXfNJ6iNERFZwBFyRWks4DbPA4_8,494 ntfy/backends/pushbullet.py,sha256=eQRQ3lu2Vk_FRzW0Z9y7vRZmfHOn0J5mCttkFg-m2_o,520 ntfy/backends/pushover.py,sha256=GA579vieE6wIhBrj3SYRbKCy1SpInvoIaOZsWydISA0,490 ntfy/backends/win32.py,sha256=i97RIkhRoQGBPF2k3ItyHrmi3ZmSQmgGBnzNPWHGXgg,1996 ntfy-0.3.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 ntfy-0.3.0.dist-info/METADATA,sha256=umj4IjBPJHvbyC8l2elfz5qemVIxJeNmyCsTPnkMNi4,738 ntfy-0.3.0.dist-info/RECORD,, ntfy-0.3.0.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 ntfy-0.3.0.dist-info/entry_points.txt,sha256=gXTVhh93T2xFxWhQgIcRMVk5f9Ah5li7zJ39D8y6pLA,40 ntfy-0.3.0.dist-info/metadata.json,sha256=9BNQBBAIEZPtKzVmYUz_93CyuEHDEfnnZA1RgBnJV_4,1026 ntfy-0.3.0.dist-info/top_level.txt,sha256=2UdTTsFWhBZc4CcM4_GJ_XbeWJokrL_Qawq1QKnFS84,5 PKGJVӐFF ntfy/icon.pngPK'Hh f f Fntfy/cli.pyPKdGJTntfy/__init__.pyPKGA>B>B xTntfy/icon.icoPK3Gʹrntfy/backends/http.pyPKJ'Hitttכntfy/backends/darwin.pyPKV'H8ntfy/backends/pushover.pyPKdGntfy/backends/__init__.pyPKL'HoXXؠntfy/backends/default.pyPK'Hҹrsfntfy/backends/pushbullet.pyPKG'HUg!ntfy/backends/win32.pyPK<'Hn/ntfy/backends/linux.pyPK'H^- $ɮntfy-0.3.0.dist-info/DESCRIPTION.rstPK'HвZ\((%ntfy-0.3.0.dist-info/entry_points.txtPK'H5"ntfy-0.3.0.dist-info/metadata.jsonPK'HɕV"³ntfy-0.3.0.dist-info/top_level.txtPK'Hndnnntfy-0.3.0.dist-info/WHEELPK'HvdDntfy-0.3.0.dist-info/METADATAPK'H=ʷntfy-0.3.0.dist-info/RECORDPK;ڽ