diff --git a/core/resources-src/pix/icon/icon-016-4bit.png b/core/resources-src/pix/icon/icon-016-4bit.png deleted file mode 100644 index 52db21e2f..000000000 Binary files a/core/resources-src/pix/icon/icon-016-4bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-016-8bit.png b/core/resources-src/pix/icon/icon-016-8bit.png deleted file mode 100644 index eb1d02083..000000000 Binary files a/core/resources-src/pix/icon/icon-016-8bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-016.png b/core/resources-src/pix/icon/icon-016.png index c2074c7e3..c81cfd9ad 100644 Binary files a/core/resources-src/pix/icon/icon-016.png and b/core/resources-src/pix/icon/icon-016.png differ diff --git a/core/resources-src/pix/icon/icon-016.xcf.gz b/core/resources-src/pix/icon/icon-016.xcf.gz deleted file mode 100644 index 2534b4006..000000000 Binary files a/core/resources-src/pix/icon/icon-016.xcf.gz and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-032-4bit.png b/core/resources-src/pix/icon/icon-032-4bit.png deleted file mode 100644 index 3df2842ac..000000000 Binary files a/core/resources-src/pix/icon/icon-032-4bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-032-8bit.png b/core/resources-src/pix/icon/icon-032-8bit.png deleted file mode 100644 index ba46c28eb..000000000 Binary files a/core/resources-src/pix/icon/icon-032-8bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-032.png b/core/resources-src/pix/icon/icon-032.png index a2be11332..893830b05 100644 Binary files a/core/resources-src/pix/icon/icon-032.png and b/core/resources-src/pix/icon/icon-032.png differ diff --git a/core/resources-src/pix/icon/icon-032.xcf.gz b/core/resources-src/pix/icon/icon-032.xcf.gz deleted file mode 100644 index 017c2c478..000000000 Binary files a/core/resources-src/pix/icon/icon-032.xcf.gz and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-048-4bit.png b/core/resources-src/pix/icon/icon-048-4bit.png deleted file mode 100644 index 1dec546a4..000000000 Binary files a/core/resources-src/pix/icon/icon-048-4bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-048-8bit.png b/core/resources-src/pix/icon/icon-048-8bit.png deleted file mode 100644 index 2a1111cab..000000000 Binary files a/core/resources-src/pix/icon/icon-048-8bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-048.png b/core/resources-src/pix/icon/icon-048.png index 85a2e8392..b59b75f27 100644 Binary files a/core/resources-src/pix/icon/icon-048.png and b/core/resources-src/pix/icon/icon-048.png differ diff --git a/core/resources-src/pix/icon/icon-048.xcf.gz b/core/resources-src/pix/icon/icon-048.xcf.gz deleted file mode 100644 index 439d927b3..000000000 Binary files a/core/resources-src/pix/icon/icon-048.xcf.gz and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-064-4bit.png b/core/resources-src/pix/icon/icon-064-4bit.png deleted file mode 100644 index a4679ac16..000000000 Binary files a/core/resources-src/pix/icon/icon-064-4bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-064-8bit.png b/core/resources-src/pix/icon/icon-064-8bit.png deleted file mode 100644 index bc54a6b30..000000000 Binary files a/core/resources-src/pix/icon/icon-064-8bit.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-064.png b/core/resources-src/pix/icon/icon-064.png index cc00eb2bf..b32b6752c 100644 Binary files a/core/resources-src/pix/icon/icon-064.png and b/core/resources-src/pix/icon/icon-064.png differ diff --git a/core/resources-src/pix/icon/icon-064.xcf.gz b/core/resources-src/pix/icon/icon-064.xcf.gz deleted file mode 100644 index 34ac64144..000000000 Binary files a/core/resources-src/pix/icon/icon-064.xcf.gz and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-128.png b/core/resources-src/pix/icon/icon-128.png new file mode 100644 index 000000000..9410a9945 Binary files /dev/null and b/core/resources-src/pix/icon/icon-128.png differ diff --git a/core/resources-src/pix/icon/icon-256-1.png b/core/resources-src/pix/icon/icon-256-1.png deleted file mode 100644 index 7b1817e71..000000000 Binary files a/core/resources-src/pix/icon/icon-256-1.png and /dev/null differ diff --git a/core/resources-src/pix/icon/icon-256.png b/core/resources-src/pix/icon/icon-256.png index c2170d358..4a9b49960 100644 Binary files a/core/resources-src/pix/icon/icon-256.png and b/core/resources-src/pix/icon/icon-256.png differ diff --git a/core/resources-src/pix/icon/icon-256.xcf b/core/resources-src/pix/icon/icon-256.xcf new file mode 100644 index 000000000..7c4af7a59 Binary files /dev/null and b/core/resources-src/pix/icon/icon-256.xcf differ diff --git a/core/resources-src/pix/icon/icon-design.ai b/core/resources-src/pix/icon/icon-design.ai new file mode 100644 index 000000000..7a810e79c --- /dev/null +++ b/core/resources-src/pix/icon/icon-design.ai @@ -0,0 +1,363 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[19 0 R 20 0 R 21 0 R 22 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:0c5d40f3-4c1f-4a89-b3b0-d75ef1e133b9 + uuid:8860d152-566f-db4d-a842-532582442190 + xmp.did:6cddd160-d5ac-4bea-9174-43a369de6f55 + proof:pdf + + uuid:09e6f6b8-6d8a-5644-8f38-6177f7bba706 + xmp.did:267567e7-72d2-4df0-9e4a-35a79a06ad9f + xmp.did:6cddd160-d5ac-4bea-9174-43a369de6f55 + proof:pdf + + + + + saved + xmp.iid:6cddd160-d5ac-4bea-9174-43a369de6f55 + 2022-10-04T22:07:02+02:00 + Adobe Illustrator 25.2 (Macintosh) + / + + + saved + xmp.iid:0c5d40f3-4c1f-4a89-b3b0-d75ef1e133b9 + 2022-12-24T00:39:59+01:00 + Adobe Illustrator 25.2 (Macintosh) + / + + + + application/pdf + + + icon-design + + + Adobe Illustrator 25.2 (Macintosh) + 2023-01-05T20:57:22+01:00 + 2023-01-05T20:57:22+01:00 + 2023-01-05T20:57:22+01:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A8qYq7FXYq7FXYq7FXYq7 FXYq7FUw0rQNW1WO9lsbdpYdOt3ur2XokcSCpLMe56AdTjaRElL8UOxV2KuxV+gX/OMH/ki/LH+r ef8AUdPirf8Azk7/AOSM8z/6tp/1HQYq/PzFXYq7FXYq7FXYq7FXYq7FXYq7FXYqmfl3yzr3mTVI 9L0Oylv76XcRRCtF6FnY0VFFd2YgYpAtM/PvkmbyZq0Oi3t5FdassCTahFb1Mdu8u6Q8zTm/CjN8 NNxSuAFMo0xnCxdirsVdirsVdirsVdirsVdiqb+VfK+seaNdtdE0iH1by6agJqERBu8khFaIg3J/ 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 + + + + AIRobin + Document + Adobe PDF library 15.00 + 1 + False + False + + 612.000000 + 558.701341 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/Properties<>/Shading<>>>/TrimBox[0.0 0.0 612.0 558.701]/Type/Page>> endobj 18 0 obj <>/Resources<>/Properties<>/Shading<>>>/TrimBox[0.0 0.0 612.0 558.701]/Type/Page>> endobj 24 0 obj <>/Resources<>/Properties<>/Shading<>>>/TrimBox[0.0 0.0 612.0 558.701]/Type/Page>> endobj 33 0 obj <>stream +Hn7 )%R۸AWAf6Yh ;I^^ o>χmxmT?-{Կt 0CV1tD&yX0ǔYeH&324bU^kŒ=nN{4FxU*ˢJF&~ij8-c."!>b3}llzbT%%) Hp`#7 ppS>6Үu5O6I2 +/(&cS Ϗ[2e12 YY)ݰoٜA݃=@AA5lUUtpac8Kn`[`wفO-3墐ktltY%v݌'>;.ҘBܞzrα^F՘IHMHayel6Jdhe\Y?=& 5҉Xq'%#b$3;jDmҺ{^Β륐)PJ7 +0}bJ~w*D DS){rG*aOR1PTv.*ښY4H/dmvw|Aqw+>=Îݎaϡ-~w t!@֙m xKRU*Et=F8Q̵@UjϰԮY VKb5f5e;o2>6sY\$Nra`]U.w,w~6kD|bi +w^KcTL-,&R2cMOJPRm9”yla"P1LxȚfmݟw`,W#8hIy`J FQ@KL1:؀Ijippf7SK'U{ԓ{ :tª)ms)tlct[}`Ikx`}j*ks}Zivf am,.A#B|rb&[^ǏZwoZWͷ؀H&Ǡຬ'^~o* l4nb);֡af(Fh s+Lv~>"u0V|> endobj 32 0 obj <> endobj 28 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 35 0 obj <> endobj 39 0 obj <> endobj 34 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 46 0 obj [/View/Design] endobj 47 0 obj <>>> endobj 44 0 obj [/View/Design] endobj 45 0 obj <>>> endobj 42 0 obj [/View/Design] endobj 43 0 obj <>>> endobj 26 0 obj <> endobj 7 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.2.3 %%For: (Sibo Van Gool) () %%Title: (icon-design.ai) %%CreationDate: 05/01/2023 20:57 %%Canvassize: 16383 %%BoundingBox: -1 -403 1292 793 %%HiResBoundingBox: -0.5 -402.934324450407 1291.33352486711 792.500000000001 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 259 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -402.434324450407 612 156.267016394291 %AI3_TemplateBox: 305.5 396.5 305.5 396.5 %AI3_TileBox: -97 -402.583654028058 686 156.416345971942 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 4 %AI9_OpenToView: -1710.40002246701 1607.1786819888 0.323444444411965 1716 1053 18 0 0 6 58 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7777 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 16 0 obj <>stream +%AI24_ZStandard_Data(/X +#Ý,{K3^}׊pYMSff£"  F +=g8y 8A H87Ǽ=a#셦Xv=c[hXd)~g3q{^n]ļxusl<{p/o=Yß}g!3Ǿhc#PIYo޽8e}ýA b &{s C̏X(ba"ͰB/&~~^}cؗb1yDz)1Kld&CK|93B+=l z?C#X#3,qir$C#;1S$Eы\b<"V >]~$˱˰˯J̗.uK\$9" Nrr$&ͱq=1x4RHQC?E.j1X,C2C1 /p:ġ `z`ͯO0mz7zza/y]<%!Z!e7r8Xw5p9x>y=aqbƍfX(j R1$Br{5A,y061aw"91Wv>/?q]{;oys8Aǁ;w?xs8zߛs8^{9bI@X{k=r=?߳7@o}{{9sYs=15=v93Ͻ=ȿ;3qc_ 0:!{C/ľ P ǐ .z?CQGKp 1r$1IMjrɑ$KL,2{wGz !H$I$\r^{Xba#޼cH&Facw7'E0c8Xoӓ~=͎}$Aq{7s3olオI1ԟ0<^glMK\X{u]sͷZce.~7~7b(8HXhLfy'cY=}ocov#._׽{}u=q7Ky3+= =<*R?{/g{0gp}?yYƞZc9%5A&n֫tuLgjmXG0<=7%j1砷 vI 5v}1~%)9s) >ck9&.=[>EUD|4 U~WL˄MtC 5 :zuP)K:gœg]͟fgB cTXUd9`&nWi%5 ˸s=q\u_T( .  ";e@`fJ'’Z:+t^ +Y-bE,%o*+c + ȳ.`߄@9[lgpgU6S6r΄*Ag{~ e~ЀR})j'POabXW ْkG6Q˜:!cJOjFsV{rگS4a^>_ꊺ)z=ۯ~Vakmg{A5ӪQP `%Wup4]==Mk{ +U*S4$B_2(u'UEۓIN `UY+sԚ}Pj&sluz MY:LLl}3jZkA3=U*}Q5Sϔ^ﺡ3IzfMeꙩT4f_YWo3_%8DV{rZh ,{ "Wx&mX2IOΙd3a{Lңs&VɖT*`]) +RAhjfL0C_5LOY4A Y: OJ~t=*ڶ,hKfLh꓎u^.5ղ){T~k:U_\=T>q.N9\sr.˱NnU+gMO+}s=}bW_tr9Vfԗ:(: {4x@ s3W8r-Jn{5_uڞ~jX-*>cT/ֈNs i諞N){r<=Xq*Cb4šӫ~]9TOgjzZ[\8ab֋\δFp-ˮ+eSQk Ų_˲(.}]r~}BesezWuzO()5cZ Ug,LM,r?ot=ԳLkD9^ܼkPծ鲁y}dEj5@9Me[_=u[TES=AiHZ*ڲ+m&lk=e,5M ,st +(繧=}u@u=봢=?_>O#hjMLcNQ?{p6tdc?9 wEvd_uTYu53!kP08|A'ZGuQR|TNM gus*\woZۆJ~/(M_f&d9P*7*O4=3UϬ矢NJ!7M\lku'0 +]1sL&LfjV &dQ(l/˛kU+|W*ӳ'zt&/J(d{~}Y&tNo{ޕu9Eyhzz}Ӫ~j{fꊾgjn~d30 +mUـۓuճ}30OsMUY5]Ogݻ _4EM+'d?@z3ax6dvȧP)Z4(տ|0ʑβױ?4e)Kg|tv=e:GP= L {|z) 6KSMLqϑA/ÝZOGP6t4,Ay 8SEI}Qw8}ք^]=3jno?'@]Wߴ]M:|0 =rs~W*}B@ͨ~P{~uUQuZ=zTrUIm$ߗ mTJi}?触m|O;}L [Q*UM[JEeQkgu_P({JF @"H$.z4,}zd2v*mhOuE:ɺIԲ5ׯnDv`F&ߟZdOv6aQ}FPv`8YY"2d002es`:p~]sAǹ̠9ur{g00v2S:,鲇Û'$SXUM?6Yv`&ԒZ~T{_u''iwރzcr8Z{ߵgAc,,xsCSyo]S5F.S$NFcqLRX$wGq)j\ ›"0KbI +KbI8F +*ZE'Q3Y m L*;0hGAMU}Y d A@@ 44٠edl W$P6Ky1Qa 4"/(6iS.ˮ|(L!\;~c\X.hTGw9Ώ˄iv,&3l2 W dl45bRL۠c4AQq:!6F#U>D0яb4d9L K_P +X.nin󄐘ʇr +RC%$4%Pj +xHM 1-!CHNpZúȫeh3TX|hoapq)8ᚇ@cb42TUo{8SZX\6@rx|< ī yHEX@`0lc,V!_ ɗ*$/HN3L((IED!hH,^V&8I$X0&*SA"q`셀cA H/ /Z`Mj/<XxɃhxpևarq+4ŝsKE0݂ClΑ hר t +u4Ȣl I DID)|H"h ٜF\r.(shu`q-Wyܐk[ e?r-$,eD2n*M5<" 8A"}5ł1JCw  /@4@@ 慉!8/aK=`!p^da#W޶!PD% Q0'8W"cI\b!oۗ5p9SHpkP.g+ \o,8{H([;ζP;!2hڱ"VKl6fkCTVNhX@1RB3t?4ㄱ7Tc#iQ(t>ɅS)IN)Rs;N +BZ'[[ –QrD_$qygְ]B =i!m)rT䦄޶rTZ='@PP:#a"VǝEF'IIBGԑȝy$<0N,y +'t t: )̹MtXR@2aaaaEVmiY :jagaRā$$0#y٥F(`aUMy,I +ht B  cش.Wi[ #5B ik.*8/N.U^VW) %îM&˅l  [O8Amqd/ +_N,ddnʦ?,KvxKǑZ K?*iZ4}?(Ŝ2d؅.KF=aLK' rba0FUӰ Тsbz `#MJ_&m;ˁ|SLm9&, 5LauHZ#A*A8FIT(5ıh"\Ш-;"VN'j(mc@B9iXW2;\BJ! l+jYn>J@!@ JW V O> !T ,M'`R$híaZ\ +hq e~ +:x>Hr:ELjAjl!>YZ5 X 栆2\Y!(/Ph2#b !4,Q% mqR$ @u.0:e"-E.t#eK'IDD#1:pXR$atKhű%:N2tK>"bUe#6"Ku ،ƘְlJ0TAtXQRYqB ྡྷ1u7JhAԨ1bDe4q9lGpA`p`) &{Gh!x9ãd:$, XIms5Rm0NY@`#l(;mU#PyDeKhgNp,t'(D(bILWM ι,iᒿq8 58QD(- 0OLO)Mm$CleჇ:!)5PB`utN%EBh 胆xSnTZͷJ:e[zV`lXS蔭H-Q8yR@pNt<NٰP(T} ], hyhQY$(ѐBT\*~,ְN$\Ќ ʶC'NپL;NrEN2aNٸMeBm*)dW009}CqUa&GtqH 9mHְ|jDr&q/-Bn)ѥٙ;2D)0683v׻)x;ܒ:%`.P6Mʭ +5Ml,7<֖.QlDŽ #QzmQ(=hb@vj0@FS4=ˉHWa7Ѹ,k|ӹJUƠNHznHln`mp.,Bl 綞uqمN^mF`u[->R"yE.Ԉ&7)DB@-#alc۠d^QyL&"Q\ݒJ蠁oRҔ45F] +"Z$d RkHr !$jB-% JmKsylBtT 1١1*aK\tِ3ӠRSNj8nbJ0Ɨ蓬# c\yC|5Je dvj`- +(pXR%MlY`fc()rX|R[(6;XƦ fGD9r3@"і!sΚz~fszF7t9Hq7QԬKї} P^ Z^?f2,WW jiM +Qv>JH:EiKK+!HN +ݳ7N̖:oN3h*O?Ql6F0h@wv~XV$Ďbv?ݳj]y]Wyc hխ7Ӓ%F(:#z\B(WzY{ ͯe(,*=%[)zcKl`Q~(is,Š>_qƟOUds_\84$5׬+g^_6J)c=1==1Dxŀ;Uf|~z$wٞgT?qh5:ZͤN|}j)UF)Y)#n=JEєᢐYV^>ToyݾJBasE5biӚ:脳 Z~}m;T->t084P2͉?0yk^o bH~:T[ycf+=!(yQܫ(ۧm#ꈱEg͋b+~/{?K7]K= +3H49 3Oo~gi5I 6BiE%.MR'k@<4^%mURVJSqh- +uM}&ӯ.ԥ(MZ^\U1c@EúyuRAuc}gw0}p30i6WczڈQlؠyX^=+ H+N.hiSLif!䔰{\W*Z gbvA +J66zΘ?y 6Kw52ͤ6O)Y@#~WlyȝAa4cg{A~8]aU5Rz'8lb6HB˴}BBcֹ 1zi A*ط+`ފf $30 vMS AYV6#Oz ms?~&)L``"ƬE"$"5"^ZR_&mN~t:g_8ƴV>1Jr2\l؂e ٧IJXpҏ$ժus|cG]WdT]˚kcŜHY'j#ס[2JX TQE05WxX_]O5IfhY&JV[|rbɀCe^áP<;35>97|=㜛dj$p|bv좀m1TH:_u,7U^*e٦V9|gpsV%8/EkW73éw:GBXc'g\g~L+FfZt^oPБ45z}RiS7W}y%S}jNfT?Frm(!b"qE E`6Z23z ݔ{Je4Ye)ܤy?ێ2Lΐ9P2o1o%OVEpWYT(;k,._0r$tbFtF1|a$ÀQ=ڹHZ0>Uw+\X&>ikF,͙4fAƺL&:GN~^;\ML.uɾ,B[()" j>$Z!ҟ(Exx.mMXR'%6F + +4Nbd@k ('TɘQC +VTQԖ]mv +%ƙOW^r,~#Ċ9-r¤v~' ~Ǹsu `,YIc@|Cq<81^ؑۓXOW`KŗQkVq}%ί)$[m0 h`a Uj#8I4VN ñZ6033|ak`ߖ<7/o~ QaWR-O+%t;f%VŮ>UUP_\'N.dtks5ω +1y5YL+Bs'npXQc;NV  E"#t 'W @۴Eb([:7=^kjEZ- ԭWYpc/L]o6ԋY4j!YĔ s'zUOJ'bf(h/nQGo-sEgѭF-(:)/%mES8IUE.uJ!:&lŽ&Y-EX+B-c(GW%;j¬ǦeLZ7zڝPh1\;fuKN2"I'X:FNI\\Wj9!?8\QECT\NIR;-wF֋3MR,Wj: NIO,f g}iQnݮ4ИB]b}A0KexGz& KQW-Tz.1|վ-b ;Pԛ7p} +Ln_C'A(g)sD~)Y|l}=}O-\| GpMD &šupV hE)03X7Kk%H*@WFޖ(0E@iiI gJ([Rh , `ʫYXL1ij== %_ېn}eQccdv!e +fhKrU !}n"TyV*$qXbʐ>%?WNYVu3@umyLYVTId\7b?~WSq-[+S`ʵ.H`e1 S:gn( F AK5 u/Jx-Aޓ*WJ ]w4 +ueuXDV>yg9+ɝ iR ٥, x6YC[o,Qͮr$ \&.efCe g5[q]@"R+ꥦ>`f˲KńT$f!߃o75w!ߨi*Vp!tgIjpLߤџ;UF{E (Qf4uN s@M~|'q'#AenR=gdrdrŹ3dY|=X*d842%mM^qOy?6>LT~}M_3)78 9S`Y:~V#{7-vz$҅_NP_ 6hR`y'~M4|E.2ԨANdC_-G`^BdM`S*0u^v.349 q~໫}қsBVxp*Řd'e}vdYa_s㤶m|- +1r Owk`> +(9ds :ӕsbVh+Ǘha}29-v1LJyaL38JyA1 Mw*TctE(N#{Soſ|:wVB0_`u]:)CbDۅe^nS pw nڷܘdXfx ^4ZM1FW2u].[65/*vju0]ظ*Ȃ @氃sdX]bKĜeAh.pMt 53 %4io&wI +l'cmN:vsBj8XZV +œ̅%rkf{r9N5vM+Y]_p eʉP "q!K_vKۧķ}[~x1ϔR,]G7~ȓh>-bRzMx)sĩIú-t ET_g}%k"IL21 ZCّ +HKiI-謑A[BJ2 s PV66: lg2p2ZWQtTZYTnS7qŇ@).8h\˥m_?}1T;W_ A$'ţ{ `ѱ7|= w~5[OV)C]A²{aL%lVrɷQKr~ME^ni1Q=Fs{&z3h2ZZLG J92wWxUX`{'<*)U*0뺽…>W \ o0nL4X]ܴ `0N2`̄U)Y3SxXOL uZ]7@\x:‹L@Hf +A]m唬=jh2`+ͫ>?ET;rtboXV,4̲b+6Amy]H*û/ *k_~u1c'sR(+52w(+9cRoܼ X+v-3Jo/BHp sK.HDVd_KȇpnzvT┑9q]E$__0vc^U-e=p 6_(2K)FF*$Z~ 'ay47Ν 71c,+ZyΩ$2C׽&IEΆQ#j-g!Gvj&;'^;GGvZLQӤNCg9~ڔJF3ڃfΰ7L›n֙hd1&hA2 J9I{ۜNV[P`$peVjǹfֽvZYIRfHwJ2K׈ ۀaɬ_A ri1r3Sǡ<%F;9{|ꉮx6!X ep{]pJ/Ǫ{>u@/.AGDnX=\tzcgs,PELWާcP%D(%f2. +EF?lLnV:}GM[t?퓣dr~#S)^iw|ؾA +͚f<;RG8;ktBb bkcOkMQ1=I9m~kO])Y+"(<r 9Ӹ%p/*E Dj_D9M(IȯḸja]u6ǽ.0`N+.蠠ń` BUm#]>Bv a}]k:~,p X2DmP7JZsn?q%+矯)J)pzݠJ[7hwi$~S0GBGoRkeRWb&*x iIքT y *#~6_I<#9fŹ. !}$^bFr0c"&JMᱸ,y'.&DX%XdsgB Z۫ئ1ѳZ7 ߴqι얤qY yMҖR>܃U4\W 3o?- +3 P>3İY6犑Y.T>"b1m9{3 iiK0CS??s$eB~$;dtB-_RX;l;xYKSt eoA)n$=9aMR7xLrE ~x߼Fĺ$+i"dQ~`;Xߧ5&SxB'6ikzԥP҅"n'aFWk|N-߶' H.pu@pD"Hs6:Rxx]uꖶ${EKt$JH>9v(/ݦ%N'*<ѶN> xެҚav +(YyiSl ˘),z#%)2_,n+D#7ZNW j%bQ^)(H!zHE,)k<P ]i>i Od%6l{Ck.mE .D_ kq±j˝r wjUC s#5ƻ/d!9!dոcv(~d\Y˙cbiCG`q4O6}5yM,y<b9Rt/="q ?|͟*VyD9*j0D_3E,=ɤ,ay$bimOA'qqm +lUQt[ñ8%lIdn Dg2Ym˱eA @~p0KuS(Y +qx.Ump-gԁeX8(QtjAOLFʌq)&: >a +(<\$ʲ&;C}:ͦs!zm\H?MiD1r]By뤠pzB +mIr$3&,# *'!&$:d`b+A[ #N9XjtzTr|WpH4߬Uv#dXHǝ J [52w)ü[L\& þOmjJ7E{Yhp?eqYxM^vYR8E+ +I@ԭAeAm3(ZP* ^L ?G%[tJ%0 Ckl-~<.8O@_f aЭ_UƽdhɌ.M/[AG d1UoO{\*ByC +@ww>XS}8*_9`nM +бZܖ7Il$EWoTo;)ͷvjpfF@K63UgEO0VL +CI:M+Έ\J~@ՅXĵ/kdY>^SDm*%La z+"9U˕%Os\> u+AU47b:؆;*R gKP4tHLR&_Bl\S!_Us_Wu0.Ư*'Sh"~DM_qaA'J?QN8?a+PLw^+.G1Al|aeQl XaЌEZԻP$v}TY{Y.e^sZzyͩ?Q^d/BOu,&sOqǰ5ǯIxMJʵ8; LB%:k·y|6R&G.ho\0\J.M:.Ņp \P~V-aS(#<ׂ,G9-yf3KC~@~qn.o6t&nQ-8Uc =A ֕UՓ:Yy]1|˺_O`SqMFQ*:J +@r `"0!\jnO-M툜M񤦲N ꃿtx[EqGR{4tj_V׹k7'^@5DZ qx9GNg-sK9RyF@оQB7* +ĝ6>IJAʥup@Iy.P&qoI{: C758R \ +&xd~k= cbqAo%Yo0aċ)<94M nlV%:|z"_nRl9)=:}&q21NnT0"+{"x[ *:Y\qiFJ:aEudkr;mW0wQrw뚷ǡz)Gz[?kѲpu:ի7VY]_M೛khiE QF{۱H8͉_׈AۘmekSn֤A䉳~1з%kӐA$P<eWRxw'M~X=qֵ\TzzQΗ;ƸpeDjww BPECR`AJU ӊ?WH6lUr +}^Ly 3pU퐰8`Ej MrZ +N,7[r&vc/C$/\QtЅ< a-K;&ɧq)e54 +r&| ;k|[VEO`H8,LDVJ+5V,VD]eFR+ ֬rål +4@f; *e;*F'_EyON/346Xf1`0 4'39tVy/Y-:%E\V;<%*nz0 K!q0YQ3 kL6 7P߸0zѓCo6$C; O»[?SxY^0N6#V4YlY &-tsprEp_AK{G2&a\tz8u @s5}ٌ*r5\Pw8QhwY6ǁ'b~8͇UdWw{=k99l*I\)N\⥂ǡ3H hK翯9ptׁ"}gV\#őߨ5)H-:^-np+_(ONX{ $8-VS$+dQa./wqDůW};' +ȡ$C'Hȉ0TBY:Xv-/ Q="Y#X2%j+%`Uof}(.[b}GJbLs^R3OFMS콘UlhE|v3r{ǬS4yYpoi(1y9,Ft-+Q9´YGB8k+)ʏ3Q~]ݜkQ/w֗ڹ'%/ Qw2)ʫO$擢{iԫ+XbYul:)SHEU[6L _J,iVE:|fI2qhR-Ss^Vy~,+>/K;33?UlɗtsSQY'ʢn>klZVZIz!_Iեj׭9hNWnI肋YOׯʭEz:z)x&#֘.V㪂d|Ui2KTŅR(_rhJR6/oMޗs&ךwWD+%"wnXNnm6U[hUq(6R!I1*ԟrȑLsKV2qg+QR1vﱠ/)W^J=i>*6_dߊQҦu>ș4T\ŚӤ.}{6vIOKw۪] G-TmkhLԗ{e"=9bkMs|EYSʙΌSi )߶<*kXEt(fқs˭ Wu4s3ARj%ͷLvuP%剷{v)'M_>i֒GqQ?EEZ,Mڧ2)T5W Q\g!roylV$ReU7)O[9)eߨwH>Un渔]'jN +l0+'Nsb{p .JMW%)riY'|C.>"E&P +L  I(A(HE>PLʔw (:,QQ"]%)B/P,Rt*T0H1A 16D„LtT`Epbb +@"UG`D><6=J$t_]U*|TTz!UiqXDŅbAV^6f)(P(2#,.R`,HhBq"!GȇGBWH.A#Z0QAE Pa# th "gPZ A@p< +n#cCh'@耀^`(jp#ŀ` lHA H pA,8I .EAF "L$!+ # +T ' NhF$(v">IaBF($T`!4 @t%$ AP \|A,X`0 !tb.D\h + +(ldldЀ34PH62h@a#CBP` ЂB`!q h,pVL`@1!+("@Tй!<0" ,pP,< X84>l30Lpa + 8l@LE` pa  VÄ F[DF Ҁ%0|pq0h .XA.\hBI"ă D y#Xa  0胅2 g ^1a&Lp E<$P4id s@ ᑁ>Zhā 0`2 ,'ր` J4耂pIcPBDPB%hlC0"Ȱ48 "Ȱqh p&h +'Zn#cF0A .L0 +@LD 47TB40D4h3H,txd  `0Fit ,$i ">qa0`@$4,a*ȐX( Έ!1"xd VpdXQ,0Prh@@ o0 1u4#2)B +b)#QpYE` :A1d:8 NheUJgSIIu~q*)xU>CRm$_*:=EC_G{hr]t]Bw9꽤ܪCu aGI3+BDi*)fYJʝʿ,%%FsgZZym{=̮H֮IM# ,izGJn=tsr̫ے걜3҄fã_ڟCWpN4Hv}!|(WWkXo~.]1B"L,;6oVYjӪRoinQ":n!.9HuGP,wӨ +]}5T9Z1)!jh^/W=qso,Mc>j֫Xk_\*h?GˬB|ZxDreRzJ2cN;{ocrg2MŤSo阯joӆ*Gq;E2+gWMVҥꍥ /t.!GCYY㽋9.WDtebRl-mPRJU{Λ#ҡtez9 \h5Qy>)ZǛ*OR"1#RlvFxWf-JYMíߖ&eDEyֱV9C2$,+{J*23?Oe=3\jU1h\ftYڱpwjWoUsdbdhWw+MDzG-K_¬}&o@ټVUU$T$YͺJifT:I QV/qCTpw*XSM5kͥ=YfJ&"I[SUkfFoqE%b[얫Lbzj{Κ_iOSwRν"ގITݳyO*VUZvzU)ލO#! ttͬ"ڴFBxX-T^d֢E8domTS:b*]Ip"mj(P$Jm_hxݳU#nfKUިm;2Jo1'q#(qmOX)7wdRiFkW*ayp7﫟#+goV턖GY:1aLԳRMܿzF;5!'LJԲnTژU6[Hxi4[?Wq=j77OhX 'JHje|{ڳ7R~_kj(eޔ.ՑWAs’U'*$X|Kjk7sc5is8WIݟ5"ťi##]㩌(<̽,+Zcx\xLטe$uNMUE1rq \xKISlϴ3_ )ȇRF݅j*ArVgUz5QJf6xZ#+U_ۼիR.ngfFBZue QUuZ-,YlKFc[!Mv9)& 7DB8ڣ}jN^RVЩgV:$aYYD&9< &K3)[M=#JW͹d-' jBoZo*r7*jEN},ke.Mʟh +iU:{ux$٥ Q.oJ1ḅYlJG<֗sR7¤2 #h,˘Zwk4)=cyʻD/KW҆[y]ufCUMNՆXj"h#b*ƒ.Z`A1 &\(&@E&P +0lWV0)MaY:ĨeWbR\e%* +=ywGKWxZ%zV!E|ROd)U'HW+''[ 1LD)f4RiN5[%Q_,nUoВ"+RO0){>iW?]Kd˻LJ%"JgvWpq~I!&^Trlu*!׎l6_jG"%2"H:'tYtJDURju&b"վ:d />&n#>Lcą.`FhB_\INmw{ұvp\*ҭ]smWNΒyjILw{<oUz*ԻgRb~Povkը jjߜ&_44/Ч,;z/̦by+_^Y=kWRjiLK ыK:i^t&Q_6}e4dz{zOXӋiG8v/RUSyVv&Rm.y6ç0=Et+O?ܨgxHeܯ-eܵqj]Iu,We^1J\=着/FXUyx6ƤbyIkz-1ɜ>#*γ<1t]UgSȇGy{RF]u(:32+*RjftRҥJLo\6D]W=)ed:;/n4D2MOeRLtib)ڔ*^R_%K*;{_X,3;/lʴW,rdM]_I!{ sAQp)Q@4*M^ͯ¥'eL)MOdMa:MUU,%,5Z2)0)f{3T^J^jUk U)/,<:ҡxy4ZO&։^_EC r5)J9'ҺݤjlZTX"Y|弹#!UףbMiԮ=On=z}]RkXVڻ碄ūZ1hkI9чдQKٳ\^ՙю[VEK>eq\" O9$M=IU%JVv!*9qTa`mNbI,U}|"p\%_IGA,[rY6JWGVD&ٕ(/OZbZ^ZFLJ*fh>ng^k?a]Jٸ^&xHJ?];dj*-ю8.X{Ei&%T]4y ͈ivCsp#!FCLm̴ݨ:l 苮Yiҕe>\uY5y5'nKw5IqK_Ymg3)wd/)Mn R+G_FDRArvKY^izD]sŦ*:Qtc꒏ZzfViJ]FIjdd67q|cX]jiN +o>G,#4HrEK8kzjGj:^(lMTuMmLF;9j޽ڲN!6jX;yg;+VKGmb"tYD5{F\ͯsR~US,)I[jDs:SרrN5Uw uk)yooiyN[s,&P?N +HiM5NJzMzĵkTU;$Bmֿo6u,Ľ1uymH3whw|#&bbAkVT̻=vk^Um,J+:M +bix]մJN}4zIVxLOucWL'E{] VNDAzR()%ɯ]n~Jvijוllav~WyL!ʯF|RV_% #^YMѾmI뵏4{pK;+VEBk1zR.g.HΜs[%UVmڃҝT*,Rotf9K$ cc0E(˒ c j Dbl00GBQ( +a ` a L)XM%n#lTĽ?(kT^eamNd֕hVdQұ/R6ѱ;mp!VH +6݊ +RO-K sfM2iRlFzȪDKef'8du,6ԾRH տFd/I`jC4qyGz@5otMt`5"8@J;Pf:af~?>XB9 +'5 +.D#(t3纓D$ɋvS^ȮW#_.z)+ 4!q}>wF܃| ,iiÎXg>'gelyn졑>7n&GEG{O@2N$>,☌q~w!I`'8 Jx>Ѵ31B\Ӿ astc@+tcgHgmO\%M ~^C0aD7“eʠ'~)WO?yH6=#ajf߆mjEk|#G)֭(BiYuބAS9Ǖ[-(O (Կmg *cfخMEA'W%Y6H[ gwqiCs:>K5|)JGt# +)R6x"1FPфL m^=+E.h׃7h78^ eNYm/VWNW$A5-(;kbJkx]0%pu2:(cY.KI@$M"4wsy+t9e3aKťemBo +ƱaZW~iLD9qm !E]A}T7JޟMhഡIqn0o){95z).NrD@ثSۂʋlὈ2&B9AxTрCrM R$y$S\w';Zb\Eby%7%]S\NYd;:ݦg+u}ndE.-f/xU]CigEϙ3Y>6?d~xtrTl4ǙXK8e"SsrT>-QE&k{D /dƅY%U%8"K,jKhY+}:U0wa;ص)cEJeQ8kNW@DZ7eÁ%Pqc"ze!.=\åkk?DžO!hKMjBw@򜭛'6m%FML,ӣ;Eٱ F;>br62F]fpnD➇)*[|r,b7Yބ;j!2=e0!v2ek{~TʥU$lEl @:ʖ(x%F }ݐ*;հ*~ZkAD^~DFWt贊q>$Ω)>)nP憯TZN@ œ_𙝈V"MZ9PMmhv6H_}')PM|!^7pscSW<5|ٱ=RPF/Q*S׌!ne*֝S&VZ|c׃P70 +e®h_8o>g; +"GUe͔qPɞDMM1MdٱU T#Vܴy7`4~ 5tF9OL]DD"ܨ]nB͆ m4w HIݡsRXuÖ9!l'[J.24AੋVZRDt`o @j&n>)oPd%d?[BP45 Z.#̒AB5eE4|iVKWzs~ZLxu$meeŲw= TjD`tܾU"Ū+bEЪ? + ]-en 0$)9tOQ$*#?hKt 'KS1;JQ%^|@y1}WAꆢ.Pl"e 2I \t3ֺ6fah3$"KjCD%yP`,cda3Qiⶸ"NbFĊ_/5Jb_G3e+x8"pj]v7uqR&SBjÕ(3 @1@erFFHQP&]ta܂?J2tɂP>hKA/'!і3tpRL㕢1i 6U,&FCpg>?P0{ټ 8ЬR0t핳C 2]aQ>JV؞UOX.칻̠N\Ԇ(.pqAsēGF?VoR6?|| ō28_έQGÊc5C6 *-+3 Iu^frr +cV7m)V7 CHJ*_@@6Ej BW =Y:K̐RUH*ؗjMIpN P;t$װT$a5SpfT'q,xt i{8zCe:)z -ipӀoLTv=.js`0(>ş4.FǃYڠU4^{o<2;G A0\+-՟;NVeH40w]|Z߹>tB?ױ\g1cp~#`^YeAӀUTwD|NM#<[~< G5ee2#/e&5T_rdZ.{Jpz{qw[YٹQ}k92_+)M ֊Ȓ@%*Ïxda~wpI C)--8wcD!rIfC [8x1!)AT@3Xb[n>}0#CՊR8QO҃\W )f8.M x PgpO,e-%%.a/V'F6<گ2C`1VtS+ԾZk@GuL0`cՆ^dڽ,_W*dnsc;2r) c1T$p17Q66嘻 +(&c1j卐PE9~k̥`ᦸp^"{7é\FHe@o;y E+ +h +[%;Z)(NIʫ +2=yjH%xY~jcD:íP +,q0jCX[u$iG/mו'?\1}A8uT {BPv/QTxtV/A权K^D(2[bET7\%iO!n~O}F 8TXuLd^cgQIlAyUo.l['guo%CjGNAϬ0>}H̃<ư#|a^_ƣ餓\eq]ȵSE/09#0d{Y}L^5/v]7S:pE;w8H% DCjhڗh iƒE&mY]7 R%D?-^|Hd1DK{K9VHc9>:LqV+v[ѽJk-5>i`MC] r7J;9|J<2ZOQQ\*>Bg*K!6lj_QIؖq^eD!,T+ sc4}8MN8gH[ swqSDA$)$ot/Q1C_|O_#KկPڤ̣b2.I$618)0 +'3gNpF)MP鲮JN,=_;w.jx" + Sf{akrōQB__\s?@Rq`^=&*r9Z |==Ĥ1|H{>$ڹDPHY<+>5B.)<)*yU/ d*_M|5|Ýԇ| ~;CXo Pmlp&a{;wmc)BG@-GDr +CEnnLVFKG}L\m^ςԥ_|By۲Oí|FmG(=q`peGDX/RUkR44<5ZPWm{.{;tegH~Z`\Xp0ḱZr@"rPSC!-9|Nމmkj6sj;@fwP{~qC3>c,H͆@a.Rx:H0#iVFRe.'m"2@e@31n3wwc77Aov,$cpMQ"돭K9LuOV4C@/VѲo?bw_'Z#/Qfv(eXjK%.M7XQq6S FW[v-+-@N%DW 3ڻq_QZ<01>0 rh䜆"# )ْ{>$&F@D_fW3FtqB3s$ wQb@ZsـxLi]Wb~2ސޱ$_DZ!L0 pyEnvA6Lq)xy#p8sr\pa HŠYxj:W[,  +\X~@RFՋ2"hd>#[9A\01_i$m/ IP/2jIɻ];!Ƀ2FLJ .%;\'k (STA g= [!6>,k4Uk>} @A@L5Qj8pKjDX1fnIp,e&R &¡p[Q C4ZĞ>[Ds"*+Q7!M8jKw}ud/w.>Uѩk +j3cWi83s_rC5cÅf8y% 0Z"od +_?+]MgGצ@_B;4-hG2Ds-\9oS3UZ<[#R ތguTں5?A 5+0WDŽc28r}J"rE(r0?&' ?lR3epj +^~pJ&8I!+sOlH+HU~Hmtt+f5daKVbT=$FRg&,wn;AZ ͦW1KDƟeX_!qʂ"Nez/w]O endstream endobj 31 0 obj <>stream +Hn7 z+~qp4 QgE+Qrex»_.Ö_o)~ÜHcRzlX*N__aS8gz/#=gs +䜂IϦ+bk7=Z-AKUed9YxV4/*H:$lAԔy&%lRb\dpC4֎bbz9> >sR2jXh:ڷXva qoC4wEۻO.owp5a#҃RQQN`^2F"l1W .xMs/#eF̸yGsr߀1X vo4Vo +b3kp$U]ŶZQ+k ʞR)H"Q]т %?vZZ1 Ke_?8wk,s[ƥsX ɮdcWCB) %-K,/2IuQtjx18`jN::~^EFWFAܷ?('̀g^jSK%")(C ՄRq%[-4d$+|Xn$7gcI)P/59w +"A\8 +f;LA3R Um'Q2-mR-P1k("Q։p? pzs.TH&oE!bA1UT[moEc_$S8A +Ur 7WxFB-4iDɁ"_UU8!FSn]!(buB%wǻ5Z\Gmw +E44q *uaJ :tϯ鬆|#E-yY-$ .XY:z ^( )n)ɘt@g!ќ/fK 2G40sZz~Vg;ZYӽ"mxrWx>ira#4*Eq[GnT]2ϖת{x@3sڥy78?Tb!/0[t3ĔZ[R7nTyf=A>stream +Hn7|C~Z12Nj^GLnJgE"@,Ocp~xt[}>\:|?`e_v(1"FKl?|/G)QԜ8o筄Km.Kt-Gjn?Fuv|1Ғ/)K,J5aSkρ]J==o~q4Nsqs" +' cX艂HM)eW}. +WRfkǫŗZcY#Wł.]ug-Tc 'Nth3:dtFm\w!Jr~Rx9ԲK egB!MjLj,y32G_o~" B&mRG*_DXL$qV5)gu+92RHxrfYr#cKŗ3=eV$ *DrZdDsBR!=oR+REfY}'!ayWzl)p()V_bo[rbɣ5ޔ=ڸ(esEu3'BNa XfkaOj8PEsG5}L:E&'ptrXt|C XkʹhqwsrAD@M_ú ނ10 oTB] A{쏃K2^ɅZC N{2U2jhGnytrRş"s]cFO=bNBͲaaR0+@+Q_ٻʙZԮh>B(_%E ƙs5N7N-g5dpFKęvj*ADcYNjSey}STJ྅=; ,_ų0IjPal:e·33h}Gg=<9Y5l } 7D>hȎGmÍum:08pXɜc"%vև=7=LUT+H禼ŸF! [&0@غREp:1`rj0G-g7}AI,R!%;e M-)GFdV4TsΪЎyzHH GAv8cP]&͹{u\znR ȪL%% jh Q: j)3EtK*S )M>RV&8ZgFpW,hyZٯ,J֤{Z$ЖǦ٤(LT}V!f$N3O-#BJw\SRחL)NvE[W%TL}p/\Ηi-p7-ٖqf5D[24 {~$*'*@7 j#lpXTKUG@ si}C>MeMܭ)N -Cf#íiP㢧{ٌVuheO6UjqL xiDqתgP|i5(2eTH/7oX£8B*T>>MAJ` Ӽ\FٯGγ1 +h8 +#ckؽwܿ:\uL^X +X6LZO#]KQ׺gy@{٨'9bטVAm?0ٽw4i>JKhнν9{ ECkDht9 ,tzCH_uKa$x6 +\酑gY6V)*I5!W8B]cY9'q.ŸwL83㺽v&-%@NU䨯?0u7f P] &3O"I@LMU ]τAhYMt쭚'" QU53go-+4i +>4 +0 ix8+r.\Tri]@:jq}bCLz+Hcn{=|xLPGV>>n +0W endstream endobj 27 0 obj <> endobj 30 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 50 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 23 0 obj [22 0 R 21 0 R 20 0 R 19 0 R] endobj 56 0 obj <> endobj xref +0 57 +0000000004 65535 f +0000000016 00000 n +0000000189 00000 n +0000022051 00000 n +0000000000 00000 f +0000022116 00000 n +0000000000 00000 f +0000027329 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000027402 00000 n +0000027543 00000 n +0000028772 00000 n +0000000000 00000 f +0000022555 00000 n +0000026464 00000 n +0000026530 00000 n +0000026604 00000 n +0000026678 00000 n +0000075282 00000 n +0000022984 00000 n +0000072087 00000 n +0000027216 00000 n +0000074270 00000 n +0000025397 00000 n +0000025105 00000 n +0000074416 00000 n +0000070731 00000 n +0000025251 00000 n +0000023413 00000 n +0000026115 00000 n +0000025903 00000 n +0000025543 00000 n +0000025661 00000 n +0000025780 00000 n +0000025998 00000 n +0000026233 00000 n +0000026343 00000 n +0000027100 00000 n +0000027131 00000 n +0000026984 00000 n +0000027015 00000 n +0000026868 00000 n +0000026899 00000 n +0000026752 00000 n +0000026783 00000 n +0000074911 00000 n +0000074570 00000 n +0000074688 00000 n +0000074794 00000 n +0000075053 00000 n +0000075162 00000 n +0000075328 00000 n +trailer <]>> startxref 75519 %%EOF \ No newline at end of file diff --git a/core/resources-src/pix/icon/logo_rocket.ork b/core/resources-src/pix/icon/logo_rocket.ork new file mode 100644 index 000000000..87bc4de03 Binary files /dev/null and b/core/resources-src/pix/icon/logo_rocket.ork differ diff --git a/core/resources-src/pix/splashscreen-2.1.png b/core/resources-src/pix/splashscreen-2.1.png new file mode 100644 index 000000000..e6924c692 Binary files /dev/null and b/core/resources-src/pix/splashscreen-2.1.png differ diff --git a/core/resources-src/pix/splashscreen-2.1.xcf b/core/resources-src/pix/splashscreen-2.1.xcf new file mode 100644 index 000000000..e3403d52e Binary files /dev/null and b/core/resources-src/pix/splashscreen-2.1.xcf differ diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index d86f1e1b0..3e3be7610 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1880,6 +1880,7 @@ PlotConfiguration.Groundtrack = Ground track Warning.LargeAOA.str1 = Large angle of attack encountered. Warning.LargeAOA.str2 = Large angle of attack encountered ( Warning.DISCONTINUITY = Discontinuity in rocket body diameter +Warning.OPEN_AIRFRAME_FORWARD = Forward end of airframe is open (radius is > 0) Warning.THICK_FIN = Thick fins may not simulate accurately. Warning.JAGGED_EDGED_FIN = Jagged-edged fin predictions may be inaccurate. Warning.LISTENERS_AFFECTED = Listeners modified the flight simulation diff --git a/core/resources/pix/icon/icon-016.png b/core/resources/pix/icon/icon-016.png index c2074c7e3..c81cfd9ad 100644 Binary files a/core/resources/pix/icon/icon-016.png and b/core/resources/pix/icon/icon-016.png differ diff --git a/core/resources/pix/icon/icon-032.png b/core/resources/pix/icon/icon-032.png index a2be11332..893830b05 100644 Binary files a/core/resources/pix/icon/icon-032.png and b/core/resources/pix/icon/icon-032.png differ diff --git a/core/resources/pix/icon/icon-048.png b/core/resources/pix/icon/icon-048.png index 85a2e8392..b59b75f27 100644 Binary files a/core/resources/pix/icon/icon-048.png and b/core/resources/pix/icon/icon-048.png differ diff --git a/core/resources/pix/icon/icon-064.png b/core/resources/pix/icon/icon-064.png index cc00eb2bf..b32b6752c 100644 Binary files a/core/resources/pix/icon/icon-064.png and b/core/resources/pix/icon/icon-064.png differ diff --git a/core/resources/pix/icon/icon-128.png b/core/resources/pix/icon/icon-128.png new file mode 100644 index 000000000..9410a9945 Binary files /dev/null and b/core/resources/pix/icon/icon-128.png differ diff --git a/core/resources/pix/icon/icon-256.png b/core/resources/pix/icon/icon-256.png index c2170d358..4a9b49960 100644 Binary files a/core/resources/pix/icon/icon-256.png and b/core/resources/pix/icon/icon-256.png differ diff --git a/core/resources/pix/icon/icon-about.png b/core/resources/pix/icon/icon-about.png deleted file mode 100644 index 0ce17f774..000000000 Binary files a/core/resources/pix/icon/icon-about.png and /dev/null differ diff --git a/core/resources/pix/splashscreen.png b/core/resources/pix/splashscreen.png index d6b4793e3..e6924c692 100644 Binary files a/core/resources/pix/splashscreen.png and b/core/resources/pix/splashscreen.png differ diff --git a/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java b/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java index 9889a4987..76429c276 100644 --- a/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java @@ -69,7 +69,7 @@ public interface AerodynamicCalculator extends Monitorable { public AerodynamicCalculator newInstance(); /** - * Test component assembly for continuity (esp. diameter), and post any needed warnings + * Check component assembly for geometric problems and post any needed warnings */ - public void testIsContinuous(FlightConfiguration configuration, final RocketComponent component, WarningSet warnings); + public void checkGeometry(FlightConfiguration configuration, final RocketComponent component, WarningSet warnings); } diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index ac75e95a4..264c1298b 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -21,6 +21,7 @@ import net.sf.openrocket.rocketcomponent.InstanceMap; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.PolyInterpolator; @@ -44,7 +45,6 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { private double cacheDiameter = -1; private double cacheLength = -1; - public BarrowmanCalculator() { } @@ -252,7 +252,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { if (calcMap == null) buildCalcMap(configuration); - testIsContinuous(configuration, configuration.getRocket(), warnings); + checkGeometry(configuration, configuration.getRocket(), warnings); final InstanceMap imap = configuration.getActiveInstances(); @@ -276,7 +276,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { } @Override - public void testIsContinuous(FlightConfiguration configuration, final RocketComponent treeRoot, WarningSet warnings ){ + public void checkGeometry(FlightConfiguration configuration, final RocketComponent treeRoot, WarningSet warnings ){ Queue queue = new LinkedList<>(); for (RocketComponent child : treeRoot.getChildren()) { // Ignore inactive stages @@ -299,14 +299,20 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { } SymmetricComponent sym = (SymmetricComponent) comp; + prevComp = sym.getPreviousSymmetricComponent(); if( null == prevComp){ - prevComp = sym; - continue; - } - - // Check for radius discontinuity - if ( !MathUtil.equals(sym.getForeRadius(), prevComp.getAftRadius())) { - warnings.add( Warning.DIAMETER_DISCONTINUITY, sym + ", " + prevComp); + if (sym.getForeRadius() - sym.getThickness() > MathUtil.EPSILON) { + warnings.add(Warning.OPEN_AIRFRAME_FORWARD, sym.toString()); + } + } else { + // Check for radius discontinuity + // We're going to say it's discontinuous if it is presented to the user as having two different + // string representations. Hopefully there are enough digits in the string that it will + // present as different if the discontinuity is big enough to matter. + if (!UnitGroup.UNITS_LENGTH.getDefaultUnit().toStringUnit(2.0*sym.getForeRadius()).equals(UnitGroup.UNITS_LENGTH.getDefaultUnit().toStringUnit(2.0*prevComp.getAftRadius()))) { + // if ( !MathUtil.equals(sym.getForeRadius(), prevComp.getAftRadius())) { + warnings.add( Warning.DIAMETER_DISCONTINUITY, sym + ", " + prevComp); + } } // double x = component.toAbsolute(Coordinate.NUL)[0].x; @@ -318,9 +324,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { //} //componentX = component.toAbsolute(new Coordinate(component.getLengthAerodynamic()))[0].x; - prevComp = sym; }else if( comp instanceof ComponentAssembly ){ - testIsContinuous(configuration, comp, warnings); + checkGeometry(configuration, comp, warnings); } } diff --git a/core/src/net/sf/openrocket/aerodynamics/Warning.java b/core/src/net/sf/openrocket/aerodynamics/Warning.java index c746650ea..b3c31fecc 100644 --- a/core/src/net/sf/openrocket/aerodynamics/Warning.java +++ b/core/src/net/sf/openrocket/aerodynamics/Warning.java @@ -358,6 +358,9 @@ public abstract class Warning { /** A Warning that the body diameter is discontinuous. */ ////Discontinuity in rocket body diameter. public static final Warning DIAMETER_DISCONTINUITY = new Other(trans.get("Warning.DISCONTINUITY")); + + /** A Warning that a ComponentAssembly has an open forward end */ + public static final Warning OPEN_AIRFRAME_FORWARD = new Other(trans.get("Warning.OPEN_AIRFRAME_FORWARD")); /** A Warning that the fins are thick compared to the rocket body. */ ////Thick fins may not be modeled accurately. diff --git a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index bb76e77ce..f3152ef96 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -10,7 +10,7 @@ import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.util.BoundingBox; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; - +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; /** * Class for an axially symmetric rocket component generated by rotating @@ -621,7 +621,11 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou while (0 <= searchSiblingIndex) { final RocketComponent searchSibling = searchParent.getChild(searchSiblingIndex); if (searchSibling instanceof SymmetricComponent) { - return (SymmetricComponent) searchSibling; + SymmetricComponent candidate = (SymmetricComponent) searchSibling; + if (inline(candidate)) { + return candidate; + } + return null; } --searchSiblingIndex; } @@ -658,9 +662,12 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou if(searchParent instanceof ComponentAssembly){ while (searchSiblingIndex < searchParent.getChildCount()) { final RocketComponent searchSibling = searchParent.getChild(searchSiblingIndex); - if (searchSibling instanceof SymmetricComponent) { - return (SymmetricComponent) searchSibling; + SymmetricComponent candidate = (SymmetricComponent) searchSibling; + if (inline(candidate)) { + return candidate; + } + return null; } ++searchSiblingIndex; } @@ -671,6 +678,29 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou return null; } + /*** + * Determine whether a candidate symmetric component is in line with us + * + */ + private boolean inline(final SymmetricComponent candidate) { + // if we share a parent, we are in line + if (this.parent == candidate.parent) + return true; + + // if both of our parents are either not ring instanceable, or + // have a radial offset of 0 from their centerline, we are in line. + + if ((this.parent instanceof RingInstanceable) && + (!MathUtil.equals(this.parent.getRadiusMethod().getRadius(this.parent.parent, this, this.parent.getRadiusOffset()), 0))) + return false; + + if ((candidate.parent instanceof RingInstanceable) && + (!MathUtil.equals(candidate.parent.getRadiusMethod().getRadius(candidate.parent.parent, candidate, candidate.parent.getRadiusOffset()), 0))) + return false; + + return true; + } + /** * Checks whether the component uses the previous symmetric component for its auto diameter. */ diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index e31fa4a98..33b39174a 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -396,7 +396,13 @@ public class BasicEventSimulationEngine implements SimulationEngine { case IGNITION: { MotorClusterState motorState = (MotorClusterState) event.getData(); - + + // If there are multiple ignition events (as is the case if the preceding stage has several burnout events, for instance) + // We get multiple ignition events for the upper stage motor. Ignore are all after the first. + if (motorState.getIgnitionTime() < currentStatus.getSimulationTime()) { + log.info("Ignoring motor " +motorState.toDescription()+" ignition event @"+currentStatus.getSimulationTime()); + continue; + } log.info(" Igniting motor: "+motorState.toDescription()+" @"+currentStatus.getSimulationTime()); motorState.ignite( event.getTime()); diff --git a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java index 51fa56c4f..de7db0bab 100644 --- a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java +++ b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java @@ -1,6 +1,7 @@ package net.sf.openrocket.simulation; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; +import net.sf.openrocket.rocketcomponent.InstanceMap; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.util.Coordinate; @@ -35,8 +36,10 @@ public class BasicLandingStepper extends AbstractSimulationStepper { // Get total CD double mach = airSpeed.length() / atmosphere.getMachSpeed(); + + final InstanceMap imap = status.getConfiguration().getActiveInstances(); for (RecoveryDevice c : status.getDeployedRecoveryDevices()) { - totalCD += c.getCD(mach) * c.getArea() / refArea; + totalCD += imap.count(c) * c.getCD(mach) * c.getArea() / refArea; } // Compute drag force diff --git a/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java b/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java index 65c37d4d7..cd8750e23 100644 --- a/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java +++ b/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java @@ -69,6 +69,27 @@ public class BasicTumbleStepper extends AbstractSimulationStepper { double timeStep = MathUtil.min(0.5 / linearAcceleration.length(), RECOVERY_TIME_STEP); // Perform Euler integration + Coordinate newPosition = status.getRocketPosition().add(status.getRocketVelocity().multiply(timeStep)). + add(linearAcceleration.multiply(MathUtil.pow2(timeStep) / 2)); + + // If I've hit the ground, recalculate time step and position + if (newPosition.z < 0) { + + final double a = linearAcceleration.z; + final double v = status.getRocketVelocity().z; + final double z0 = status.getRocketPosition().z; + + // The new timestep is the solution of + // 1/2 at^2 + vt + z0 = 0 + timeStep = (-v - Math.sqrt(v*v - 2*a*z0))/a; + + newPosition = status.getRocketPosition().add(status.getRocketVelocity().multiply(timeStep)). + add(linearAcceleration.multiply(MathUtil.pow2(timeStep) / 2)); + + // avoid rounding error in new altitude + newPosition = newPosition.setZ(0); + } + status.setRocketPosition(status.getRocketPosition().add(status.getRocketVelocity().multiply(timeStep)). add(linearAcceleration.multiply(MathUtil.pow2(timeStep) / 2))); status.setRocketVelocity(status.getRocketVelocity().add(linearAcceleration.multiply(timeStep))); diff --git a/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java index d113cf003..2acd0f49c 100644 --- a/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java +++ b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java @@ -290,7 +290,7 @@ public class BarrowmanCalculatorTest { FlightConfiguration configuration = rocket.getSelectedConfiguration(); WarningSet warnings = new WarningSet(); - calc.testIsContinuous(configuration, rocket, warnings); + calc.checkGeometry(configuration, rocket, warnings); assertTrue("Estes Alpha III should be continuous: ", warnings.isEmpty()); } @@ -301,7 +301,7 @@ public class BarrowmanCalculatorTest { FlightConfiguration configuration = rocket.getSelectedConfiguration(); WarningSet warnings = new WarningSet(); - calc.testIsContinuous(configuration, rocket, warnings); + calc.checkGeometry(configuration, rocket, warnings); assertTrue("F9H should be continuous: ", warnings.isEmpty()); } @@ -319,7 +319,7 @@ public class BarrowmanCalculatorTest { body.setOuterRadius( 0.012 ); body.setName( body.getName()+" << discontinuous"); - calc.testIsContinuous(configuration, rocket, warnings); + calc.checkGeometry(configuration, rocket, warnings); assertFalse(" Estes Alpha III has an undetected discontinuity:", warnings.isEmpty()); } @@ -340,7 +340,7 @@ public class BarrowmanCalculatorTest { body.setOuterRadius( 0.012 ); body.setName( body.getName()+" << discontinuous"); - calc.testIsContinuous(configuration, rocket, warnings); + calc.checkGeometry(configuration, rocket, warnings); assertFalse(" Missed discontinuity in Falcon 9 Heavy:" , warnings.isEmpty()); } diff --git a/swing/resources/datafiles/examples/Pods--powered with recovery deployment.ork b/swing/resources/datafiles/examples/Pods--powered with recovery deployment.ork index 35b61c011..1656e5144 100644 Binary files a/swing/resources/datafiles/examples/Pods--powered with recovery deployment.ork and b/swing/resources/datafiles/examples/Pods--powered with recovery deployment.ork differ diff --git a/swing/src/net/sf/openrocket/gui/SpinnerEditor.java b/swing/src/net/sf/openrocket/gui/SpinnerEditor.java index d02997e3d..fe6956b71 100644 --- a/swing/src/net/sf/openrocket/gui/SpinnerEditor.java +++ b/swing/src/net/sf/openrocket/gui/SpinnerEditor.java @@ -1,5 +1,7 @@ package net.sf.openrocket.gui; +import net.sf.openrocket.gui.adaptors.TextComponentSelectionKeyListener; + import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SwingUtilities; @@ -7,8 +9,8 @@ import javax.swing.text.DefaultFormatter; import javax.swing.text.DefaultFormatterFactory; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; /** * Editable editor for a JSpinner. Simply uses JSpinner.DefaultEditor, which has been made @@ -29,58 +31,7 @@ public class SpinnerEditor extends JSpinner.DefaultEditor { DefaultFormatter formatter = (DefaultFormatter) dff.getDefaultFormatter(); formatter.setOverwriteMode(false); - - // Add listeners to select all the text when the field is focussed - { - getTextField().addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - selectAllText(); - } - - @Override - public void focusLost(FocusEvent e) { - } - }); - - getTextField().addMouseListener(new MouseListener() { - private boolean isFocussed = false; // Checks whether the text field was focussed when it was clicked upon - - @Override - public void mouseClicked(MouseEvent e) { - // If the text field was focussed when it was clicked upon instead of e.g. tab-switching to gain focus, - // then the select all action from the focus listener is ignored (it is replaced by a cursor-click event). - // So if we detect such a focus change, then redo the select all action. - if (!isFocussed) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - JTextField tf = (JTextField) e.getSource(); - tf.selectAll(); - } - }); - } - } - - @Override - public void mousePressed(MouseEvent e) { - JTextField tf = (JTextField) e.getSource(); - isFocussed = tf.hasFocus(); - } - - @Override - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mouseEntered(MouseEvent e) { - } - - @Override - public void mouseExited(MouseEvent e) { - } - }); - } + addListeners(); } /** @@ -93,14 +44,54 @@ public class SpinnerEditor extends JSpinner.DefaultEditor { getTextField().setColumns(cols); } + private void addListeners() { + // Select all the text when the field is focussed + getTextField().addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + selectAllText(getTextField()); + } + + @Override + public void focusLost(FocusEvent e) { + } + }); + + // Select all the text when the field is first clicked upon + getTextField().addMouseListener(new MouseAdapter() { + private boolean isFocussed = false; // Checks whether the text field was focussed when it was clicked upon + + @Override + public void mouseClicked(MouseEvent e) { + /* + If the text field was focussed when it was clicked upon instead of e.g. tab-switching to gain focus, + then the select all action from the focus listener is ignored (it is replaced by a cursor-click event). + So if we detect such a focus change, then redo the select all action. + */ + if (!isFocussed) { + selectAllText((JTextField) e.getSource()); + } + } + + @Override + public void mousePressed(MouseEvent e) { + JTextField tf = (JTextField) e.getSource(); + isFocussed = tf.hasFocus(); + } + }); + + // Fix key behavior on text selection + getTextField().addKeyListener(new TextComponentSelectionKeyListener(getTextField())); + } + /** * Highlights all the text in the text field. */ - private void selectAllText() { + private void selectAllText(JTextField tf) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - getTextField().selectAll(); + tf.selectAll(); } }); } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/TextComponentSelectionKeyListener.java b/swing/src/net/sf/openrocket/gui/adaptors/TextComponentSelectionKeyListener.java new file mode 100644 index 000000000..3d0addbf2 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/adaptors/TextComponentSelectionKeyListener.java @@ -0,0 +1,43 @@ +package net.sf.openrocket.gui.adaptors; + +import javax.swing.text.JTextComponent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +/** + * This key listener fixes a default behavior by Java Swing text components, where if you select a text, pressing the + * left or right arrow key would not bring the text cursor to the beginning or the end of the selection + * (@Java, please fix...). + *

+ * This listener's behavior: + * If some text of the editor is selected, set the caret position to: + * - the end of the selection if the user presses the right arrow key + * - the beginning of the selection if the user presses the left arrow key + */ +public class TextComponentSelectionKeyListener extends KeyAdapter { + private final JTextComponent textField; + + public TextComponentSelectionKeyListener(JTextComponent textField) { + this.textField = textField; + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.isShiftDown()) { + return; + } + if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_KP_LEFT) { + int start = textField.getSelectionStart(); + int end = textField.getSelectionEnd(); + if (end > start) { + textField.setCaretPosition(start + 1); + } + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_KP_RIGHT) { + int start = textField.getSelectionStart(); + int end = textField.getSelectionEnd(); + if (end > start) { + textField.setCaretPosition(end - 1); + } + } + } +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 4ebc60b96..f0bce09eb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -5,7 +5,10 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Font; -import java.awt.event.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -35,6 +38,7 @@ import net.sf.openrocket.gui.adaptors.BooleanModel; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.IntegerModel; import net.sf.openrocket.gui.adaptors.PresetModel; +import net.sf.openrocket.gui.adaptors.TextComponentSelectionKeyListener; import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.DescriptionArea; import net.sf.openrocket.gui.components.StyledLabel; @@ -120,6 +124,7 @@ public class RocketComponentConfig extends JPanel { textFieldListener = new TextFieldListener(); componentNameField.addActionListener(textFieldListener); componentNameField.addFocusListener(textFieldListener); + componentNameField.addKeyListener(new TextComponentSelectionKeyListener(componentNameField)); //// The component name. componentNameField.setToolTipText(trans.get("RocketCompCfg.lbl.Componentname.ttip")); this.add(componentNameField, "growx"); @@ -672,6 +677,7 @@ public class RocketComponentConfig extends JPanel { commentTextArea.setEditable(true); GUIUtil.setTabToFocusing(commentTextArea); commentTextArea.addFocusListener(textFieldListener); + commentTextArea.addKeyListener(new TextComponentSelectionKeyListener(commentTextArea)); panel.add(new JScrollPane(commentTextArea), "grow"); order.add(commentTextArea); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java index a6683e2c4..e7d713080 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java @@ -94,7 +94,7 @@ public class AboutDialog extends JDialog { // OpenRocket logo - panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")), "top"); + panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-128.png", "OpenRocket")), "top"); // OpenRocket version info + copyright diff --git a/swing/src/net/sf/openrocket/gui/dialogs/LicenseDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/LicenseDialog.java index 31fc47290..831ab6d42 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/LicenseDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/LicenseDialog.java @@ -30,7 +30,7 @@ public class LicenseDialog extends JDialog { JPanel panel = new JPanel(new MigLayout("fill")); // OpenRocket logo - panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")), "top"); + panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-128.png", "OpenRocket")), "top"); panel.add(new StyledLabel("Software Licenses", 10), "ax 50%, pushx, wrap para"); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java index 50b0ee066..d6eda56df 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java @@ -58,7 +58,7 @@ public class UpdateInfoDialog extends JDialog { JPanel panel = new JPanel(new MigLayout("insets n n 8px n, fill")); // OpenRocket logo on the left - panel.add(new JLabel(Icons.getScaledIcon(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket"), 0.6)), + panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-128.png", "OpenRocket")), "spany, top, gapright 20px, cell 0 0"); // OpenRocket version available! diff --git a/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java index db19183c1..4e4119188 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/WelcomeDialog.java @@ -43,7 +43,7 @@ public class WelcomeDialog extends JDialog { JPanel panel = new JPanel(new MigLayout("insets n n 8px n, fill")); // OpenRocket logo on the left - panel.add(new JLabel(Icons.getScaledIcon(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket"), 0.6)), + panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-128.png", "OpenRocket")), "spany, top, gapright 20px, cell 0 0"); // Thank you for downloading!