🍲dfcv🏰dd⋉(● ∸ ●)⋊@% PNG %k25u25%fgd5n! PNG %k25u25%fgd5n!simple-qrcode/tests/DataTypes/EmailTest.php000064400000003002152427536730014761 0ustar00email = new Email(); } public function test_it_generates_the_proper_format_when_only_an_email_address_is_supplied() { $this->email->create(['foo@bar.com']); $properFormat = 'mailto:foo@bar.com'; $this->assertEquals($properFormat, strval($this->email)); } public function test_it_generates_the_proper_format_when_an_email_subject_and_body_are_supplied() { $this->email->create(['foo@bar.com', 'foo', 'bar']); $properFormat = 'mailto:foo@bar.com?subject=foo&body=bar'; $this->assertEquals($properFormat, strval($this->email)); } public function test_it_generates_the_proper_format_when_an_email_and_subject_are_supplied() { $this->email->create(['foo@bar.com', 'foo']); $properFormat = 'mailto:foo@bar.com?subject=foo'; $this->assertEquals($properFormat, strval($this->email)); } public function test_it_generates_the_proper_format_when_only_a_subject_is_provided() { $this->email->create([null, 'foo']); $properFormat = 'mailto:?subject=foo'; $this->assertEquals($properFormat, strval($this->email)); } public function test_it_throws_an_exception_when_an_invalid_email_is_given() { $this->expectException(InvalidArgumentException::class); $this->email->create(['foo']); } } simple-qrcode/tests/DataTypes/WiFiTest.php000064400000003321152427536730014574 0ustar00wifi = new Wifi(); } public function test_it_generates_a_proper_format_with_just_the_ssid() { $this->wifi->create([ 0 => [ 'ssid' => 'foo', ], ]); $properFormat = 'WIFI:S:foo;'; $this->assertEquals($properFormat, strval($this->wifi)); } public function test_it_generates_a_proper_format_for_a_ssid_that_is_hidden() { $this->wifi->create([ 0 => [ 'ssid' => 'foo', 'hidden' => 'true', ], ]); $properFormat = 'WIFI:S:foo;H:true;'; $this->assertEquals($properFormat, strval($this->wifi)); } public function test_it_generates_a_proper_format_for_a_ssid_encryption_and_password() { $this->wifi->create([ 0 => [ 'ssid' => 'foo', 'encryption' => 'WPA', 'password' => 'bar', ], ]); $properFormat = 'WIFI:T:WPA;S:foo;P:bar;'; $this->assertEquals($properFormat, strval($this->wifi)); } public function test_it_generates_a_proper_format_for_a_ssid_encryption_password_and_is_hidden() { $this->wifi->create([ 0 => [ 'ssid' => 'foo', 'encryption' => 'WPA', 'password' => 'bar', 'hidden' => 'true', ], ]); $properFormat = 'WIFI:T:WPA;S:foo;P:bar;H:true;'; $this->assertEquals($properFormat, strval($this->wifi)); } } simple-qrcode/tests/DataTypes/GeoTest.php000064400000000576152427536730014461 0ustar00create([10.254, -30.254]); $properFormat = 'geo:10.254,-30.254'; $this->assertEquals($properFormat, strval($geo)); } } simple-qrcode/tests/DataTypes/BTCTest.php000064400000002560152427536730014352 0ustar00btc = new BTC(); } public function test_it_generates_a_valid_btc_qrcode_with_an_address_and_amount() { $this->btc->create(['btcaddress', 0.0034]); $properFormat = 'bitcoin:btcaddress?amount=0.0034'; $this->assertEquals($properFormat, strval($this->btc)); } public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_and_label() { $this->btc->create(['btcaddress', 0.0034, ['label' => 'label']]); $properFormat = 'bitcoin:btcaddress?amount=0.0034&label=label'; $this->assertEquals($properFormat, strval($this->btc)); } public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_label_message_and_return_address() { $this->btc->create([ 'btcaddress', 0.0034, [ 'label' => 'label', 'message' => 'message', 'returnAddress' => 'https://www.returnaddress.com', ], ]); $properFormat = 'bitcoin:btcaddress?amount=0.0034&label=label&message=message&r='.urlencode('https://www.returnaddress.com'); $this->assertEquals($properFormat, strval($this->btc)); } } simple-qrcode/tests/DataTypes/PhoneNumberTest.php000064400000000661152427536730016164 0ustar00create(['555-555-5555']); $properFormat = 'tel:555-555-5555'; $this->assertEquals($properFormat, strval($phoneNumber)); } } simple-qrcode/tests/DataTypes/SMSTest.php000064400000001663152427536730014407 0ustar00sms = new SMS(); } public function test_it_generates_a_proper_format_with_a_phone_number() { $this->sms->create(['555-555-5555']); $properFormat = 'sms:555-555-5555'; $this->assertEquals($properFormat, strval($this->sms)); } public function test_it_generate_a_proper_format_with_a_message() { $this->sms->create([null, 'foo']); $properFormat = 'sms:&body=foo'; $this->assertEquals($properFormat, strval($this->sms)); } public function test_it_generates_a_proper_format_with_a_phone_number_and_message() { $this->sms->create(['555-555-5555', 'foo']); $properFormat = 'sms:555-555-5555&body=foo'; $this->assertEquals($properFormat, strval($this->sms)); } } simple-qrcode/tests/Images/200x300.png000064400000720326152427536730013331 0ustar00PNG  IHDRb;6} pHYsS:tEXtTitlePDF CreatorA^(tEXtAuthorPDF Tools AGw0-zTXtDescription())///+HI-)Kn,IDATxڤW$[ ZT-ztH3꽦;ĒksdUMBgFzx<]-8EQr˲į0v~Z,fX5/?|w]:ia>.5xcZ]]]*^M=f[|=YxC׶WrYS]vvחGXϞ=<_6MS6ggg jO ?쳗/?],gnO1<Gx4{x<į,;777=}|;e{oO<Ÿ?#h/B?]o"3lf:L,b|~b+tCxw~˗/1* }|_=[p=-+<1cpğf<f(VE|;}p|;óhlX/| 36hw't8A|IYx|hr C·_| $-v;?>]/^MQ껴+ y*ϹvHUk P< 1t!~ْO!&" h>qMnGw0Nr#}@Gcj x:}fu9Fnx+[njaA5iXs2K_]Ji`&ǐtqM>c9J Ç<)޸x`./0f8Zn oj-X/,5ԤpxN{)F#_Ct~R͒OKb|‚bcik>[𝘓Axb[u~xq/m UZPfk) áb8U $yhkㅟD?koe; Z\a5+n˯9`xg3X]3+!I.ss!j3 oU]ySCairx(x<^RUZ:E9s!6c OΏd>ãs~?%͏/Ut\rGKHa$#-U+1I|1~ >XHWS=# M7N89F ח%KPU){Iv\J^K>jZt׷+.Jz;HRdM]Ykl7J!޼֚a56SpfC$ e̓֐,Um ޽{k$:z҄Σ;]!믓X5ҺuH5]uhxÿuoѯ:oq; @wPkt+YZ:M6bYjƖ*&cxVZ-50Eݳlcs鑡ltC=Uv|5\jzF@/OI?N@_ҊINZ!Ob\#3PΓ ;1I`g2trb=).\fӯx:)E&df1 -4%cQ F7czr3&VOm{Jaa"زr:cq}]DDd7v4[ٚ1-vz{cquDxchf5\m}ḷBmҟ+?oY(Hcci-4WhTW ptuwl/z񖊲aI06q@*Y#T10a!.Y=2f:0ݴ#-jƘqR~$}(8R!$7PjB[}Q#:xIiuVY.fտN ^@Sa;"oFq0ߟ.zre寶/,} O^z# JCiJǻ a5t)Kl;49VKrV/F/=K$hV3O?y~yu|Oo7{D2Hx ;3ņ #"WpkǨ\ riw^c)ՋE!J=|rҊS<}v9? xc!@n5uxb TKYW7>l7("Dt'm'ޞQJSjuӾ^ On>`VL?*R90c:Ў!Faڤ8*ů#~yu'cAB:B%dZKHHROEజҗ1[Ț{fk3cPr;?+fpP1.=fa'X# *asqyFv"i򖦬$4[G&wIbn|>OJ(S wcR`60/͆ )ۗVNik ߯÷ܱê`ƨ_) 8df؎VA~vc0dW8Z@ǩijGhUAkǭc>&!z2U> ,EZB"a'vGl&$՘1 ZF"|mh,,-ݴ1B !;"[+c ^S'U)h 18ykLR`E\I=KT)D"[uc$oBI Iv) OqhYνtni/ųZ>W=B.T ,qN) /b*xFrtbkN3`Rdv+H%fZD 2GJsQW*hjb b-e!mtv]5z &{ S6hVזp~ނ؃dȉ\SqC=%hLUF|BC+mU|z5Km+37.l W*+a&bDžD`l #>o0,l1.F#5M+]t*q٤$և G0mmN *ps2';I.~no MS=Զ!80%B8PG11<![䖴O)GfӉed?*(J,| Jzoż@ɥE6hRRk5SC6&nrx2BAj"&$~^N..&/'Jdlئc"< k)µw2C_T7"lfө")e~q*ŪfqzWz) !;d MTͿb%QMłp& / 9$1җʖ7HNV޿8KD\9BD#J->"\V:H.$fN2)<6YQ++n ڟJ J k=7io0LN{7$oaݽr0P =vZJd$vlYP`#mXpZ[Ί6F5E@l6#h!Qvwͨ\X,r"|;ńvcJ8/ YB)FsMN ,Ŝ>+h(sLFj wIrR&V-pX)!JpIB2DLI< ^Oԫ+:f3PhFCJmؾ\i!M ţmr9]`آ_۹qPoUt u.u9weJ?\{h:$H Hz4 K&]ؤvBrp{iH?*br0S`O(qHΤ@e:T qþ't @.#@8gw{c#}=YVK%Ku53 saJ]1pa@/} U"%h0+zP%QXyh?J:K$mBMW'@+:ӝ1?|zTB4jH7J q&Xz*EwSm{,J c (焻՝VhXt['YH+СH!yM 3 GbMQ'$[ أ FaO+s3u6lq,X Qo z|۷o]nlnHxBHIK8DQ?H[Ȇ6C,%"ư{-'`Fh H 0?[(oǾ?\i=힄8n8W B}.. a*RjIpѓ 2QH,UڱW9Nʆ>B=s;sfQDEHf\: ܁2!/m]HQGW'*f+yIr#_]o8U5*/}P%ÞKUU )E@|8" +GscBeL~xǮГG5I -+c+r+"m3,%uU.qǾ \ڹ· ~ sK kMF`ͳ/P:vOuKUЊr/c4xY&,Aý)"47C#B"nRoNBZы*h1 ͰHpU&y` %mgY*ɸa7<#$N ~6Dڄr3.S  W;>Ay< "+`Lp &XM`p+O5ʂ\SKma +$c'L b@c'.Ͳ0rL4z}n* ޘ0շw_ 7UFP9"bhݏV%#:U'/,dq9$xq.>:~Nɡz8aտa"٘SAT+x7P=ž*IL_V49d=9szDRNT@2^<i Ω5 ֏6yD 0M rB`&!Oˏd'FϽ#i8"@*lFhV !{:Ԕ9Ǜ2 ձؚlR#SD Ԁ lpĕQ.SH6ɫWU:Ikڈ\Z,{Q&VM]4Wam΢\PgrݟŊG~V>Ʃ0f'`5dhF-y$-qH '٨!D/M/ey]{3uzQT#JE2$ r2ƾMz4);ͱ!!m~g\=JSb=8 3.2UN`  6O.1XQŌ}]IJŰF=seQ:azj>Q Ίa\>0vcx[g dIgɳsVa\$RrQ$BT⬆NXfSU<78"6~I~@^S2UYzœi#Hb U5ޜ^m"v iIp٠M`@y+ϫr1?~8GH#EFPD3ty@>џ2P)Cl, @ΈlWɉ: :('b`T#{y QUl<8&y:QH#YZ<1X*I{Wbu2{j&2,o-ΆOɶ .T?#-Hɔ [|G &H{\!jPt<1*B:U ;KS1ge|,@x) )W<_<PA\32lU9 }%lSs3"g8 IbC"1A0LUjQ hew*?J#y%†9dz'9qunGۙ3'#W"`wcKj~'!b3k#\/i>}t+j@uv3aP(gE@Q*{t:4a[ݬ"C̲t,#ш (Ò$dFp~ d#@U)]3T=$XI3-Qx3ύ|<-#>wRAQ1 8%cM2 3!5[ !%8.G+Ā[ ı gHã𰯛@cE-PU-ՏjJzhQB:pFm@H@tzo|CX`)Qz}݉@p3.*`7L^?#7iʡ/X%)Vۇ!-8 re>bWHN]J%IF`Z!ɶ@{ tyrN0ʉ fM9Yĸe%4TI%)I?dzSO➪Hb:agg9I>\7<] _+ #kn\O ql|$| A$Ͳ.bBABU_t\E#+߭`OWQ:;j#Z$Sə)fuf0Iľ:C/o@֮%\G` 4Ϋ` ^]שH= 13 o"rŠdYcu(ǚPGRghEAn|-=zv,v8虑#PZ8!J0{a%_CBmz>Ǭ`ˋT8(=GUu %5ee)rPf:2jH(aE|Ok@rh͗ۘK5*b g"hy umakφryvX%> "x aX=RT̢ގ@Iu r)Y^ r!wr( f\|`V)SKHH"b-*({ O=P,C‰֩~>eA"L>#SK|Jl HmW.R.Vڕƒ| u:dT JLp߯ : JUp>{B[$dݨ$Z*r?6BF J%0 ~wmξJ hJ/sM9 x<`v!0@mNA{gD]<3쓁ǨF%*' 4JN@;Q #0b>hUr;lp+e6/gŧ4KIz@kJڭcާdQ1N5cŐ}T 4`7P|whSQd~d0#uTsޮ#$p= ڔ )8/Ϯ `$jۻ:h|t_fKjO,#Nsܵa@Edv'a>}V&f*yAͳLf HSKܑ0i 3,K13CRp1ŀ9`DM,X&&u i!3--R5grې)8$&S8<+r/o{0)u  uU& bG6t|վw6}37->PUL]m;:ySX0 HРX2gC?S(c%GynՅΚC͙yg7;)|E?HiMGlǰC$gv)9͟!gy\-nd扉x显=9T=zV>hн;͛&Fbe eтzb,wA<q"%Q%븝bAhҪ4Rf$hToH ; QCo> {X[/`{2e6@,`t3.ޖ+3p- ᕎ[Pҿ ]x )xl]-$%-`p0(Cթ3^&|ꡭ5/dQ]f4\B?Y1o:zU1a* F12WX`gpqP6R 7[ u)L Y1y&he S - #4*0N1jJ@;Kenfʅh,W:LQ"R'|30A|)qTL"" c(9DF91CEOh3hth\bʑRF 7uSo8]Q2LR떋IŁDa"\|'.pH^m dݦ3n>R%[OH%G:sʋfS]bNisU! BLf]-]NZ!ɿ6Bʎ;=AG0)h,(n]-hLqczavۄka)[{9E}MF.HR< '}}~j b=?t'vNZdEP6hh36OH:[2 BˋGZ$W y<}YuN[/uw}jP'\>DS+[$t)bTQ fGKt@?b'υ3Hvl5Q!_B66bLIX"=BSA*{@U@ʻUFa]dȜDjuXbSβ(r>+oV IカsCsÜ&oÑ Fʵ.SHn6"8&)3GM~8ed(\L7X#Ud: DMlńS9gecUDe4Umjq$@a h?\?Dy [ mv`OPb,q0C'JzAd >~Ը7@m*!39!Jr 8'm ԮΌ13ys!ͬkPvX״;];H|\4AtCUv<\"Zj_΃T ;|ˏ. :Jc5QVfrP{L-e8L: : Ls^͗!tq8ZpvR|Hjh([6^މ{d3E@S39B`\mD*M߂/na' 5|cV]b$O1&1:_W|2csQ:\"KIMf~m ElHH6eDDlȠ֑9 rhsN3lQ4!,rZ12Xx('O;ҤY:r;v$JS YПqZGd\i2E~ߙLB <$m}٤!'E ~0KեKֽ]1sݘҤqsL ;4MV"^D~ԓ;6&,Vi1n1:E'>C񢇕"1cըMjc:nօo!hS |>zzc 9,:D9 9jĆޢ9.SmpCU8]12^K2TpJa/gEGP +$Tz~֐1 Dkd c܊= ̺IA'H=JQk{mv5#ze 'y }\F?)[mk]<Z+ ;ٽw. zuцlX?_8ͣt#ȫ.-}ʉoSBGaxDT>1( 0rwwVy޼^?VK*DţKdΠEA`7\?dN(+6ܠϦOa Q Z5[%TTd jW<1UYY|]pǢTtOlkk fh6upg"S77D!,2b0aNi ieDd OgrD4W!bX< 9&.)Ҹ9g֙WltfKur;ԢՌ Sa8~ ;{脁 +b$z > T[ilH6vgMj 11=}-C s2%]\no6|Pnto8]UynV[]_2M $­Kahzrx'*/IW7t>vޟ^],-| kKkfLڢ>fKVx)wULH'ýei?8!͕rjh@$iJu$U`&rD88Qc*=Fł.0W 2PVH C\,"9c!Eo"ԩ6Ao^?Ӧ?&8 AK J]EI&Sao2OD~6 ]i HHN1έE&_r܂ύ[LFy`Ӽ*w]F\b! Z*oPecP]ԎHb !dl'N=/YN& plD[Q(߼}BI@(]*Akk๢tNo_-trlg, w9HH.Z]Hl/Cwo볋+dAlII"R /3;ʘ YQ"*<ԄuE#O\01Z ܐxGX80_`EP 7woonB"#A2q>@cQwۛTh-$ͳO=ncrkyҞ#vV?퐘*̎>S) }q@Hׯ_l]24. ˩qؑ++קNW <+fnnxΤ 9*brəКVhY>'Eۣ"p9JsqO>J]84Y&AA_#$^iwuhٍF!5B?6Mbpت(WR^$aL&$Ǽᛢ;{;ݒW#J1c|^(/7zK&\VУp8A(j@qq@%?Tp*еB=$bwo}A0Zw$Fo&:mJֈPSzvs^񨥣I׌^ej|uz \@c f }z?##Th$VQ3d]N~RE1J)(GVtcai޿ț$(#Z5o7=q]>aD0 yJǛ[CysÏo߼y{}{T X$̨l @#.Tb9I (4mj$" 膄\Rds&u=,Hmͅc>ҸTXWN'PBխ-璕mi:Cg}ڙ\^b{#K-dI~.~kjz49lj])r"GmYhȓtfQFu0>#Y0aK%x /p u&mS.>) t ħ60SR:su0Ғ8;Y'LRm~NHuݧ2X %1 SJdDgavʂ(=@:̌ov\3떰3wx4P6?"y,zIjdO0F6 QŠ:* TIW$"~Q^HJG6S#SVBO 9&SI5Ƨzk㢨tHѽ™ChT\"QQތ(DE3$q!p;> £J {!Bd3r}NG}[F*̛aہk )}A?߿pU=CW`ƻQMS>RlNm8biꆥ{"B*7E@&{ZpZRQƈ2@M=Ga,,)9R|h}7?_<_Wh<_czϰZJNXS^=jun*fZ=q *]0L!. @QD##G(Iȣn޼y8&p1?"XSüXLgc*BçO/_vg!+m ϫ.~54:v#bq ٌn(E\Y'jwknpCSܸ7 =<+H536#JM:SL!H7V14MUsߪ<ᾜ^aB؈έx_SFǐ60D}Ln.ր=n(Ku5 %i.$s M'2Jwn}jՖzac6|̘Go1(İ Ww{HEu}K%!("! =E,5~ ̻@j|(;8KJkݬ7#X%_^N]1}-yLէHtVa ʋ?{g/O^>{z^G!u$nԧD!1=/FaC3d~sm"%Is ki#DT^2 FSL]E78a0!!"O/>ѓP!(uW*{`q#:_0m,t\)rIވMGMR'p*`/(h@l2Tנ0Of*<T2wDԄo-VlMP~D9} xrb^#$̴q&ѤkChd:\N(/vM-9BX9 jCEBbxI=E$S!RDih ^u_'uI N{b$a[#>(=JjSFY>Ժ5ȬHKX0b@J,. ADܿyՏ}=6;0Hpp &&vɑlR,PF3"rhfZV5 ]8 ؇ܡ{FN!u̐j"SMWWzX%n1%WQ3OO9B}Qt|Tum(?&JnUn:5! W(iuyD8-"O6:[*G1]b XN /Z{ǴTI羅RR ~]F:/g5bMMe]b1\ݒT9Q Ty i}߾;#o$\~'0x/.@ kn+Ͳ}$xB\I._1 x#׏q"$GfSDhS'ErL1B~ %Qvě-0(9PxgX`K@ϟ>簼?3)ghGG"sBKĸuKy\Ιfo#/vi8AtH-:2n#]LCqo~<ۀ-+!cb~L*@^<:~/apl䀢*3)$t$^qNЯ(<<A݀#5/q(."cT cX@}v^rIsѧJHUZv#p(a@X^Dݛ ѐ6 Sz*or͓s({'iU3䬊B S\C _$[S'jJsi'nvG0gmIGHKڃ7TR)zsjbCfR11?m4MKEtSDݗ3rN"XScM,eJ٘XDVVeYlbpYQIŵHWVHR?eDn!u,{JˈTn{%ݓ;@S@{8:&r%R&˃:_!X(K_PQpbߣjah~o\]C[R.!'ʭ3 *qWA 5"WW8EKYqb Ƭo7y^W" p4JC~u>N~~< q?^pW/8]9JUY%B't]y:_c|7Jð0 ~A" 249YU灟q+& Sb DWjrĿ4I)e;jnc9 6=ԬP6@trUv8>=; j}`V+S)B[a1QU]6a0 : n7s}"1F;Q<#aً1W^Day xan0.7GʡcRu}$HLȂ xPH!&|qQ.@g7Q]|R)(l AZ>6t2pl4!T鍗S\(Y[JuJ/"T `;gǠ,@΁7ȯ8z߿^}߿vg`%:$Kf!aycswLme=R<5Ѹذȧ3"zor%֦f|UA, p29lv.!O-u.e% Kuj@#@5kJ䦑$RX]ͫw`(kXпFA, XG㠁dIy 6YĄ@j(?Dh#@x= ;O JbXOjJȓ!o_ztЦ`xV0z'&Dfi^\}v/_EHy{_ID nՄe'qr$,:C%,SSoOɐmJJ+6C }nf..0߻$+ oA~ ڛSUŚ+*@f߾QAuʀBǍDG|PJpR'vpTNTY@Ȕq9 =Q.̺x#h2L$lf o c9+ThFdcuG;H˓ 7D;G&,DGƞ=wj,9*^ .𖳗L탰W VSL|c^#l3QJF٠xO]@viƌ+0*ρz݅Ers^hՉd^<aJ)F_=DzBmEy KZDIv\-iQ(Ơ4/o އ+6^[2 e_D`k#]bpAh zVu=PX?y_ۿ|| 2)$&ßQe/{+ #ST?^"EЙ.H~9G?J("c$0p}{ݛw'SRANDĬhf.rB WC̞7%ES`fU23BS_/@R̰.W럿oA/@yNԆWItGˈǺ$9EʂED+!*?ooKP?%2Bh#n~|C s ė{jNgmDm!yHCGƯ\A ?32-ղ;(NDGAi{ 4c2q/*Z&30Z!\*O&B\gaH@[RfV, Xw& @^|fJ)xX:{6_ht43+ ژ9"Ǎ( o3"g磊UüNDIIJDi?۟ײ͙oj]d'#)G”RѴ|a}jz p,wslA3ob6Ӌ_WK"%̦e#nSFm uC, [z4XRዴ[Z:=X??}ݏގJ!0P5AYLD2R *QOLEEgQ7'aX>jK'b̕/o~_Zԅ;Q.Cnҟ"tO9*n ~7߿//_xkR1tFn7>i?12%0(bM&=h ƙU'9•OK8EI Q.!EQ&$)Br!w" AYQT.HtQ__mJ/w\OH+;H\APULk}iѰFkE_K ?޾(b hH J ^○%qwZ-I syfH$ͭXOlU*+:Uޭ_ͻ$,E|Z'j*5 eU7Ɔ@U."rRa%c*F42֫hABU8lq(7߭jKRݮ՛o_:oE%>D(UD7 ^d;C!O%4;qJXyۅu}g#l]/E&ܣ.j b?EyϨ˃ɿ}؃8Q@\bzЏ19DQ?!Nˏ˒ ܈78 n/OԄN*N`"_X3 LSXE7M7ENJ$o K//`#駅C<зi^̣a"cwQ'B?L…Vq:2[HpbrcPsHDlر7٠ېV6`~X{*Z#!ӿcZ@e XDP^sC'TAy D.U*rh8OՅs$9'l8be蜬Ȍq0 ylyNPZ Exzɳ|U tҤ127j QTur6=_|d25SUc3H)T y!ͨc{_QfQX?9"h%Lh+|퍋  Z<i" KҨh[Yw@lqP="/sw{w.yP"ocGϸƞ`kѧ6bl!Y;okC[=%]*G:zMr"G$ğMݎsԙ>n$oV |ܒ^ׇp>? v"څ6Z8zbQBe+R1X"_G1t5˯o~fob UtXCy`F%|]"Y4AVFHVp5s&ڜnXuam *ˠ`w>XQH(1Z ԌNКer>T Ō s $RDE)",z#C uS32+eAuCx`Ԏ3Ϻ׈u] h^_'0}KPa>0&U950g_1 )R3%:~.d(C2O\,".Z8<F24 ba5-t꬗j9EeH\4.DbЙKעtq5֚ORא;oGghP2"@UFGs)}WDCm:O}nc{$&ro?ܾ7~ʑ`zr,!8g(r*EDc+TB69(6qE2u(@#\9qhǏ9kh)\Pkvv@9sDL3?])fuAG]BHwdrknUԐ.8&((g-' D977=G^h=g>(C׍ԖJuW (af$ɒbo)o(ab\vSD>r[ݵ?WӛwOI=ZƬȫ9]NhD@eQ(90I? g= s_w|[{i/JyGz~uE@z?"t'xcR0{0zٯ vPZ)y--aJ1 ua*("Tx=-T׳gO0CխdbtK&?0 ..H[,B:xb@B)%d" 'DįeB ǟ?q"Ȑ|"]D6İ`upՁJ\ iK$L08llrѺ[͉I\$@σW{̛;)ƚ)|6 \N)7IiU=}d{*8 <$jFk _)gC0#Y5*vg!:l5Dkx$TAOkgsXpSUN82uO (B QHMs[:GyF KW靼S Mr t7g篾E07!:v&ʔ*OO^ 2R+Lg'[z!}/__1%ICM<z~΂DY"6 Ј: B")6ls,z7_|7g>]: jHJHiqt&,F¶#]́P6 B+׷T"YEQz4ZrL,ܒAD݃Xmկ5z~$USv (Zx}5t)ќeKZax ⻸`' 2Jb'yq_tq6⧙lu:$B8ÁzMS8Vgic$9#9i|c1\! /OA}l:-Ccav֒81)VXԒQk^-7Ÿpu<1FXisK \ui;}ҥv<82%ǜk W N [Ƌ<l"e6Е' $4eiq6uO(2|Ł!vyܤnjf`e=Ƒ'tnW+a!5P7䇱lB܈F˶F޳DhIJஒ .556wݲ3=ܒ>NK?5+T*Ŵ!%cx8^~Ó/>O]\c]%=Mz;;Śl6J $<4ex=4;R V e"?uvKڒ|RyDȫXhQP3DTa;Lyjv\ȉZ[0ėd&C9ROb%w8L:Loϧ5d&v19|yIh ZU LMׄ}@n W%XŅHKޥ'>Tdp䍚wcj,+O)*A͕D$UDA,,bW`5fE@ӔJ1G994@ _d EPT?o>~I"[ VwR5@]ʞXC9UƂ^f,`؜%,Th= ӍmIECݜm4rAmEW-x|Ip_H|!tȨÉ9!0\>]rQI&"븶˩j0Sv#0<(S0Ho)+6\'  D%hlCa~I cOjV#\˲JśkMD?Bmh D4 ֐EWWs(lJ7)N 1z5MHl8ffjGgt  ExB :t/( f2L )g"ݿX$ .kaCCgNf;E|o2QLI ?ƶ0h*6 yH3JM"NQ2rPsg}qHKP|; c:߷t\\bB~n"& 3*6rxYqyvU[j-<]w8{_Cݶɕ9Xx;gb0HJ(+MGrFRw=% "k29y}͂/Lg-יH@\?azԌ `{&xpbxI1eaUj`uhF y P|ԥu7Bpг["3Qq<14q$MDJWSuY3'm|=s9ҖI\Pኳ9X9|ꖂT{4H` T0|)]8GUa5Y1pviM'5U| scb<foPqPt# hJHA{DD4Ri!zH>>2AWݰ.19SCg-NʽӅ Ў/<_l(wɯu#y`A3$+w6NkNP ҚɦTv$c^I2F%n>.cT1YH^lmVٮLv ;:­1߇yۛdӃ]ˆ&uQ'j, ;çgw?,7^`Z\&ad.#O"!»-^9rvml>yޯjqv~֮&UAcyYbAvzPbLI#8*?8G^x:13! ":Xm[pO?|DW(cZ Ȫ?|hϹQV9䅪v[ԴgWӟ¡}r pQGAc ͬC]>+ Tz\_7MAVA12Xư1G5ۼTM*tzYq~ؔ7$%ͳZlb #oGFbeUrvX!D#Bf~tqcGYkɏ*\߭ eo^dw /"b8ȼۆ2]Rx QLDPgl5E@yanXCW f+U8MQ}.4G2Drd|>#\%J #+]-SAγ,Z"DcMN{b"j_o[FMo&7&Ev]n O5C{K2F0ӉI]sr5dlڻӐ ڸN jrǶ&*C :Fj4AU#SJ_VZg[rtd3W[$aNjْ7]3r2%8_ D_%9ٕF7! 6E,bdõ1! t[7Q@^[["4EzܵzwҼHD\ bGckt]&K~%X3fWgojn[K8bO6|N~5@6A7'ޮ~^w3Aӓ-[Xws6Q3eIFYzR:<$.a1U0y G(/)6?L  Yo~m#,^D0jEh0˷YHvF1bpSd]գG$ bMMŊ12嫋K= ,<0lLrgs \H'4/|h6x?"ie!{ZY aAImH 0Ė_Z{_R"Y kC{k0$OBiP8S4'ց(~{N_PC$=>CXFr$;D_YODFg6(GhMXfUAe6ΰ&Fc 5n\vz"(dq;$ ֭u*JWS%+_f$[#?|#.9HE3/ Y1b'"pO %(.s y0G̀O<ʑƆYu)BG|lV`Sg&=ڞ 1݋Kz rBd(v[˞fz7ck=6 ݾ qit|t`XXg( Aµ-B:۰t~ɉ ' 9`/ܾa[3$ js3c' EB0LAsиՠRݰ 4UM2'I^nyU/jV*oF*;6Ra(K0f>(]_}:V~H|W6܃7 ejE2!>$ifzJjk.up؉$Jt&êq.< mb:o"[ꁱxխZܾIqF?כ| ^zۆw)sn=Wm0z[G][PxQI^ %PPv2Tz55e1O _x AdpvvtGK?4 rrVRW4FVԷa`ȵI wњ Lƶ)6219e6#Esr\pI6-t10D8 Җ cI(! >*}$.L9몭|&<_,;Y;IzS׺.@x@.^~ﶫHE/TM1:7I՚-ULhrYM ȉ` !\CSf~b>qi1]TFV7Cjd4^M`l`i0bR" ItIE4iלyȹ ?jp%a njթCOx *]dnUIZad[aC6:ivA`" /Z-'=+FuJzVi ~x*9? w L:* &kIV^e]?;ZFzȱtJV{?w^"^ޮ́~a^f`meL " ]vA @Q}ѿ|mDP e,ֻO.8&7kv,C"a)ۮړcgX֛Nu*?dHhlY6M0&G#IƨIQ<@ZD<~ӏ ygHˆKPFp _fA#|hPtգVg 4 ܥDzX7oH}oԅs'bB'9y!Kg6xmtoZj3KCl`+ľȫE@4)M`|ym]-[q*@ڜO{DX^jyջ:qSDv,|ҋtu'8rksV! {?}|Ґl[U\yp" HbgnCBtkz]{U/ Fveޝbv☨Kh>+, 6i^ /ԝ(H&VI>t^:ܑW{غ"] A"aͱNj0[. j]]"P[R}GlQ$AulT4EJl/X]d G(CX$[ZkVUnPs"q'rBd]`l:O)s|rQ_-.Ym& _XdXv}6дelHp#!s3>"xdM65$L91#iRUΦM8+e^Gqf#ylQ( AI[׿& q 3Y$$N.ſ $T@0aAYf=}`ϻDq2#@󌡇FEŧHFԸ:91{09 9QH j_D0rjUsߊDHdtH_KY$+5=r*(#̿񳯾sk<6RQ!*y9zv "Dv{c$$$pQ]i;b{H eE'8 MuQƎiM)QzCV?`+/W; Xq̵݉x(Ac=$JݵRY&թ~vٰjjRo H?ܹs%sxj^xn0`>#lpDdϞ͎ Ħ`f3ƫd`{ǹ-˫Pt6Ffp3 Xkjx2?C82.J9 `]~b7-kX{zlM#[,;SyhĐRV:OcnM_X#o5"FV$ug<]'2WpvjNOw!ףZVogYזQ+A@ĒWN";Y 0Zl7/|~F ؘ/1bьfjwzհ^VԻQ U)1bd4C$G׫onlµ!2Dl^!Q4=L]m&J:t)7t0^6Z9vNn1;Ыf@@W*0l>}*/޼՝6>yz'pa拫eOa1=98ye삨le $GZ:ٞԨpFŦܰѥ$wj~pPRm:Vo!^ƨMN2.ʐ%HVDg aHݵK?Ι֪sVTsP1`K W> 1\2IDوJъӭgёQ(骼Ide2v4Ҁ55  ζ bB_T`T5 )뵧vRs٤,kn^v}sͶ6?Cי x) .eB(8e`dt|zzZ=.x{J՛\'zc7ڧp'HX,&s1TH A'xDDrjb9hQ\/7:mMxba/`51 FZB"b9junSGk YY7wOqO^=G:~|  Ҋ^ࣟ&ǩcI\ѷk, t@2fi`G כfx"t2ɉ FtU"ypF/xc hC:?J*'؃'6Mzd|h+z+֩Wb3ZC+Kaw;*P[.^ԻsҼ1(:WGIUq-'X$?XP kfK5E7V|45CT/^<ɯK˛2G7~ 8+Gz2L*ЩEA] cȰ0ohs)dI`{_L0m} ,NҬüJ$\e.Ȝw JBt"(KNIybC ɖŦ5Fj0(Xԥ Ys [BͱIAIXˈŨH-u/IvsD6_1ͷ|FNXOʶߦ%/ͨ1޻g>2rUtG&]DUE<b@6 'l--tW-u.%]&Xv,O}r\PGmEKdQ(U>i>LZ`x=bFv@=[ `9,'V bS&5+ [Eˬj5>YsDD5,{8 IhZ3sU |v!S/jp˳?f ۴t$,+\\#;MD3kn臕HMY)ǥhc*g[} t7wr5ʱeЉ%$[;!#r+Me:!}bC$=$2w/F8^6LN'tAgSֱGꛞYMYp$,,h 1/o mwˉǛMʁ#Z^$tS  4E@;(ZAe3:5DxbAbgD +E \LʇX=4)f*`15Ry6+C.Y>"z|m>@ Z=dBb#bm$?igq͜X+ƤP)6PwH ockO st龕I60Z"손o,ʶ)6T dM ķBcbȡl~~wQl<3VzxJZ>90(=ݘ<[Fc8 hCZOqt3pF~&duU'TM$&oEjawG/^nGHn Kg5w2#.FfǸ |] !'=oarg0gB?ۼ׮9^CN_)i3$EۅDCn :]t!AtdiDv Nű.gNWHNʡ.3-[O3pQc= 'AF,kd{ONOiȪ:аH?`H3Lh G$\ T\UQWej';?ӏ?t[S?Q?j^b 0=.tYR%FYb >v߼bl KbO&O%y8SWnG Htm# u&.foБ4{tGn,*D^:ɜc'":z-g`7rImG$}}F-%χ zNΥA$'xDP#6з + MєSvgޭ2tDKGlLZy6rV2nAnM9/,+L?>沺s H`߂a)3'V)BվܱG؛{hv> =X'xNu-%;=$ 2ynٴ8\ fb0{qyMgT!但 @;"F6Nή.ݽ}oW̻!8]߼~ O?},f[9JmK *PW\Lr ;s8~hn̕! _{qw{9Ye튓5$V# E|<,P)0U&m"/8\ 'ze]d"kjV+V͵_u nV6]ZXFZtxiվ}z;I)y>ds7޿pv N1;MԴ1jHSՊBgg`s ݋Q{fdFLIa7ãT5[z=VSi8cHuVP96 JXONOa] ۓRЇd~` )ߊ$*!zAŶ.1wO)N ?I,3S;k6p2.PͳUΒٌO-_{]'YȊ5~7& W5XsS$qz>cMS$;3G,2 Ä40iӲkBk^r=8 ,x~ \3;t])Wmi<#deѺ( /믾}l1MZwwDez3;W~|6gE2{!c"(}/H,E:+ k ^2X=(P_bH?8A'XfL&q[z &PMu:%!4Kvd$qD6ͽ9_oF &'bndb`N:&TCPreDkIh|vk7U{$IZψ1| ڇ?wGQ;lQw\FY8IT)>!ҩz0$%8R}ab04É1+ee%O,ɀF= 5B0Sim@ts-֕H/4m7n(ذ:4W֪JHzV$`H(V0K ̢Xukҧ7('mrFQ5'MMS%inn؇5uxz1/\0<9>irg% z[f#6SD&y1(.kJp5A—3TԆHO~.KMayO+75a)nM^q8k݃w)IIOl{<_=9[&#q z_];v;wmSd"k%cihRP.`[1A8ZTݲ MFdA,W.WL6aM z҃ c{% $ eq׭ /tp|J=#|0灎{V$ubHIܺCk Wȧ t}+WXκ:ckw|4*cMV_-Jy(n{QVtx3K*DV`9y.cj)6ڲ!t;%,2!FOG1s䅌5u6Py{q]~`irNw5'A ݼ9^zV"`h!gQ7Ґi~I qzB`WPdH+\ړ錖͖R%m8f-,eMm~/;põ񤵮>@sZ 6kdc92z"w-@Z?v8Օmrоk&44bsx<9""ׅp4~z˶p>3xx-Y:Eo6·TZ#%_qy7㠲J*޼!(L^uDAhQE^Kչ~//|ŷe7~,r˘(5p7֯z4VdĽ=D3 wG^ЋXv ܦT֪WHPܟU^B!YKsA]Yŋ(`ū@p27  Z&6}t9G3ӸEfkҘ G^˫/(h`*zv) K2s0A,l\M*hdGVKe>FZIgaY଻V:^\LJG` ._=y[6>~t?x=U]hB pvvTV͆#庁ܳ^WM2){Cӱx?oymZBT!ldw#5zM.ʲ (Dp(F- [-[{ŌA|zk =ѱ_{u+T6~nt[5A 9J*:hVt^H8 AT%x@kP.#36q5v+Rz*pB3osuoT<:|n֥#E|j'JyB=FZ|wt8hR0<ӗ߿y}B+cZMԠ)J5vѣymbw 6it"O/i1qwDVŞaex=ٻb̔"oZm+(5]?,Hp-0 pDB*/KێM+ =ڣ#C 0c6W"#خdدG{2=2vP-X-Ͱ8 6,vNЧ$A9YY*6lz8oDڱx:t|y簭F[- ϯ~wmxM8jYPvJGgۨ>\2,+#ZN 0 %>ɹ,i6:Ќ/(gKF\X \?X[̏SO8'f{!,<'GwN&O4gQ 7&H>TA28HrS )(M,qȯ.@9-3yx% &'buz)':X%mb^'կ,"$Ǹ;2<1B\:byo؋þ 1qӕ l_|3p@a?`_TZeQ=B7;^~h|f8|kCRA@D4$FvzEBRCs=Poٱ3GFnvM+@˄;ҋrL{ =c>([ӈ,|zێ& `tkF<1-+>ތD h#[OMQ~HINj:]V`&4;s bh^2Rʵq[I 5IM^ fo˺y`󡨂w{򮧌.c4v,4l˟D'8 U-=M嗾|3[ $0皂* b[B^%&&H* >fZ玕Ralck^GKB% >""XSч_~>AbkY12qT9:1khQ.)p-G jTI[KUHdyQA&@}FYqb(Aa G ~:69"Sf"+^ai¼ťiD6QNO0C4G+87i*Ըz/$";Ɵ(e zg 2 |o 믿&%;kQ(5. T^papicN *"+;gCa)"Tb者jZ/jPђEJ ~JUV2Fl~JP:i jWޯe|;IV1[i 57(bڰ ,IdS?E`G`<8:d=i^` ~Qx5_>w=vJ^~!Be@|ߐV DLz9*}aO3pޔfL[Mh%>w(ۇ(A`HO)B*zxtY6ɗlZ(XJM )dj2b"L1R D=9:}x09/RTS+B*HhZ|'XqȻ#Xpl!Y8ŠKN㱠\zQG0knq+UdNjo}'@P1T穇-V::ks\S-܃1#mμm~m,l~SO f vЕS= 9>LёP;ew*$^BYjVQ%MGc9jEXEx@rsިM0"M<~O-3R'mRIIZc6Mq;PX{q6*4N`;CPP:W,k$HGqDlwޯj .–|dZŇr{ 9 T4}ث2\⣏> Z׉ރXK_k^Xt H}pnx*>'b߰qJ0p*77^k)*(0~wKlpup~.\~7x[$Xh M1G_CHdݰ(3/ɜcBĀڻЇ"mp$B?ǥ3}Щl.GőAb~n%Z6&-vQ]ԯ% Ka&j7R 4Zĵ؝d ᵉҽ AG%:ʾni|D4Q7Gկr8> Dbzֹ>ڏ?ݓ\8E:X-6NjXƘ{Gzm^'bc#.u\bޝy͗TkeG¨f{RY9c ZBQK7Or^ F/)Z86aI` C0lba %/" G;%+Q3MZdȟ/(nahΓ.NYwl_Yxmc՞ޯ3L.+ՌQ{%''K:LЁDV 8ZKýP3_>%~󷧿&u:*G6 \Xyjc+΍7q@!51 IC3ƇZ~@-pU&i(= cf(}1L9\vʆZfDUZ+9 :ϖA6-duةf*W5 ^02(^~%*ݗmU*6HȻrVKюpyά̒[;\T~,Dk(ڥY")QyDGgv" coww²~z,m>՛?=՛Se.xhQ4ĕFS4?%RT{jj\,CY#/ګ U}1qDWtSr.{=:pDct<=}5+ȒX 0Z @rK W8fH݈߲bƺ=v8 {#⻽۞L@p_|"3딍"LCT%,7KHTQ͐`Gm + `҃qK`QaO픹A# FϞf>~ zasaN>;BeqiBI%\Rt{&vY MH7L2$M ÔH=H養]1 D(gF7ֲsqDpHgއH e(ɸv8חWxR.Yls"g mv`$_8m<#FCo hx# D{lW-ǺRb 2+#5ETprxj$y3Erߪ aU=E
Zۄtm*ɟYvjyfL?`< +&Ïz lҶXLgj]DF5hn {K+0ڊݧכHdWΈBeS +%G 꽦ɤήU 8yݠC49-kH`D5.*!ADb?H2 kxyPwv O͒Z˵jг)9`np~8X ?3)Qq{JzZnWko}#5fJpHf`[9\ &g,6'nJ#7;]թۆRV͊5/U1f재,,+fuR݌J6?>;9 A+A%T(sP.4TsT,NA8 NO =fh`jߜi`*  !< ̨XfG%Gn,!ރ)8.#ҫXl>SPXt@#keGb:62Ѹ[XZYoG'BBTmMabv~L_?'4:^h\Pp ,0$6 :m H L<덚1̒$Mt-8TuBcd=<Mŷ_kWKM$:-h)"}bpiɱ)b~ͫsg2v`,lRZ?iav JӌCS&!yc9e1~l48Yxx2WaVeowhqhKѓ٬{aX֡uzx w+65<~%J9F_Ss3Kx 3 ֋w6em?$~xW~~v9[7lY{IѦp6wo?)dV5{V)xҜ99m/`ơfGnu;pE0f<+?Y}h~}1>6M$>]a v9n ` 6|x?Vȉ%WW"9I n23'rnGe3T eWf-8:WFWcYF׮>Xhs*-νby2ͶeTpv)X `Öj4̚<6 W73"^+w, ~]y8+ 7"WJA`0iȉDzoC-VF%j6AYncEQlʚg#r2Ӥ.Fʇޓw!P`-3 :bΣR4ڔus,>DmxC@#q'U&mZ#e .B~K_z=~Iқ+1EV()FlB~ 9K]1P\xLMSzᘥE j%؇??x>d~vl w70rqrf"Ė2d^UgŒqF STr`TpW# Q<4kP13>P;Jy >!m U'uNLEEZ cLd::4fqh@B+ c+7'(\AiWa+[Gf}ͪ^͖>i~NsG3EJ$z./`lcN39Y\*ٛH1 D>NT_xI3Z(>EՁ+Jt%ԛʚDf<71qNgo?נŪ(qVynYgށڋ _g%0T;W.6N#I=]l>,ZDkM?qr8gu>wC6[Yq3 ʋ-n*]qlXɸL9hdqN7y2NjCbS4 -Z9ů/r#ٴYxcE&)I#i²%U_e칉*DO5 \&YmLݗP+Lnm˰o[hBMmմɼmPVA[Ә:YZ,7~⋯>ׯ-  a c7^$ sNvzY+J2=BBo*0 AJԚb6 m$I e;bIN-mAAJ|׿l ؑidzKzjj| 4ɧ} n[kdz6tWʥ7xPfY [G#e&|T{e$1SH>nfE[tww>U⠻ڤ|hU"L~`ޮUCNB$b.(ZĶJD7VV}vV3h'%S^뛗ǣRsLe!ƞxڂEw!/zTFt$ˀHmw\PE۟"Lb GD&|^-N{w* T9[Hmh[L$"QEV萵Ļ#s,f 05Z*I [m:Ùk3)u3i G@w)D háYij|#R8كQ/M$z#ΚݖIܦftK/QREC"VH]^L{>"'cS(L "Jz!JӵE v`CT7 5+-=`Aa ߣNn.~~\~TTz|GtV(6+e^y[kwcRb#[8N;_^'$  #߈k]ݙ- "Ğ6{xTb/k #GLٰ}=J֡"kAT-v[2cC.N{h+}wYUN VCL?k@RyxBx#/~)꯳o{*S#f])m R&"tqºSE#$ '+4M+A >@)b6'l!y[QaPXCИ'7;Ö xZjb)4(^1wB|FM8tSG}3R{Dx _W|7׈G#fA6 ߑĺU_-5(NwՓ.0,1q ZQ{UϰRd=(E$5ia8jJ ROdV5.0}i*~w>vb4t?⦠ l&0bY=~=H>AMϤja"нc*^PDWLg#)㕞^Nx91- KzT)9ZCk7Hf:ӄ?=յJ:fEH"֬te#Nv( ),n-NĀF] XHk@*'j'$J+t|b2c~~4HYaS!st HeFE3yuz>J<'RX"qM ͸ W6>T5# ]2+W?ZWBo?&Q8iyJpH3ZYųN7cNyKJn1q椚u 7}_ۿ~si!C m]j;, .SYN\O-NDŽ-F֬AojWK*pbZtq$ΠĎHlG WLv\u[g@"2O8:(S*z:WΎHFM: R<@9mao! 2Pongw󱵍{vۡe6;<~ƓtV0C.(asW?gnzWpaʣMS~_`3ѝĺN}|;Gbqc ΀X;҅XǏIB`^[iq> #8p%7ҎH@'o P###Y1֏gu{{ luP2xϿ:r0Pd\ZKh /EQ$aHO`d#٪Jtت^'9mxE-x܍Dhh\ ܴ1I㧐 aԾ(Af=/cm򽂸աwA G z|Ʋ xO~ta1 ע;^XZ,ǷٴSjHKGsZ "|]jÅ`R'76ρtZUx?Zx z{!'l~4Z^Pvdui" `[Jb\8+h%=m\T=;EУ RT$߶W괘wXȚg-j[go/~xl~u,f@wjSsp41_r0d %FZZ,:6egWnm"E0&rA R\8<ޕh@x":01F]s 9D =ISqz M.;pƈ،+u Hi^HuۨѭKZ" /"fJ]IA;x0:┕#F7-ԛ*yZF@[3^9/L ͖;C9],?sl  ̮QĵI;cRw={5HzfUi5B2ŭ~8GAy"ش0"NR$'o P䈬 ZGv[j1Ǜ~f3sH &Up2pWVSᑻh1"9^Ԙ,Dx,%Ee%0]@mLz?4캿0Ğ,~:i:eǫ3]K U!B eqH.d`;| q^d gF4NZ>cRyrh85Sө*g߅J*p5 ,r~V{K{z~]ﲫ$*D۸zƷYt$1Qd@]b>olΪ'4Bt ~yE8dDk =a=]mcX6׳t1uqvu5S\9}5Qfᅇ(N#saq:$7\4=/M"J2:'?ninHer 7Cֹ?+J+5&Y`D`=p*9F\u0Q;nK5G#ޟ%9&CWlħp3H 4XyQkLFXcݳ,t42fEO64nư/bT sj6@SmM-Ë&sp80ΰU۴{7 mB˨i;'E!N(Q b̫Dru$bM؈ʂ̬Tx\!QGT]Op 8g?? !ٰr5Gfi_¡/J}~O RϸpLzSgZC@<*l/g݌³eY~Hr Qx*~E(m/Œb93#p4%g׳Yu ~3sr f"Tgl{g>v^Y F?`-GM$^_u VěNzQ^ vKIqh@Cqv⌵wd'q RpĿI̚+4hǏ-u%Ͽ)Ȓb@úR01뙎ë;ˁY pynr9?yΦ[nvU)E" Mߔը}ff;<~>V!'NWwƲ /8V<tr0`6@1 |t .E5뼘 5DB-UKfqeBH "Ռaܞtv,;0=bmfBdo\o]^UGWfَ9 $,G۾JO_vnz@T[JWsBCGR6SZpX ^ۘtuˏO^!k:^ t~Q-_W3ĤDV\܅%EwC"*Ws"R#t=5ŞlgCt Ƕ7h^ԐVV ,UxnmD:!ɾq̅DRwJ{_կ\ǂl 5"A R{ɩoE$T<Ezm d{8~y'{F9mFb0wme[yE.8΍ myY .6WE<o}DfxttN&ڛ5r_!9߰`ݽ *`<{a@\{wѶ Cfjv] {k]\F{`r< ?%An].÷lU]u.5I7:.u05 ȬW2Q.B{bd uq[ySjEtjM鵂173ȈDC1I?*J/!;Tx9s-⪶ZsVKC 3HH[WBL(`\I'CܐbhKw&{xΛ]9:z w1`,Yf鐇jr=SM= 3b)uh /^<{?x睷sŽ$}~QPXgǣ%<lF7= v# Mv}/URv/}]eEOVϒ#P/cWXqq\@yb=GG/| pVޮEϪa7}^j˜ rєukwm0vCZmM#~2,Gϟ.Ǔ@k; 11=^UcDS9hNˋ; "2Zt$FdɌrU.uS;A$躎;[m%<˨ >HC/,3]2\!ys Oi䒲_H2w[EPG턓p'4h}PKN詧A Lڝ*y2؟ڱuSkM )v cBl<"׾e]ùu0&tj%`Xu٠MjIxqIHz^YnFwFtI«{)^fCXy P$N} )\S`iw!ciwPLr"X2AFXKu2Si<0S]hADz/1=L(! ;rmŚO == V_#Ǭ ͘ʣM*2u[WO:W[Z06GuZ-j\kwBu4[428C-tSG`-m4Hq31!x)(7.R-52`[ nEGesW~U O@;yomBm)`@b:,;B9˛FEkU'gi3D rϻJ@ Esz "#k/عVSuZUUӵ7C]L}5`n Y ;upK'&CsԃN`l}ܺm^05@\ ↔eq9.yA#Tͧb9}6\8F3ԍU)[H$D%dA(&SS$P,@l\a]) I,_G736iWٸ"#4&gʠ:]f{ I [v4-HzG"\trzQ >tc%Uci:hVo9np ]C:bq>RpڭqC1wɄгֲ` !t`Fa l1*̀x6sIH:|_ն) р8Vr$t脙A SN.-/Ѯ?җ<2j W.C}rTzEܽi !n`[lJ*THʤ<Դ7$nŘܺ_ltTwƪI^m9ŵvP03*xz.[G6wό3bMS%Etؕgal\ԷjM~S+9A6慔H1*լf҉a ĵ5DY}:|FjZcAuxxxGHQ&?T酼G"o߫ܦں.”H_{ĪԠӜk $CyA|bTv8{'}hœ0n.:œ6ABLjwªΦ】 H| hY&1ăwJ`7IaKsJ׮քDN-Fjnb<EOwvz+l'xC1֦ءPr5G <3* RWNnX i:6ϲzYϠ_6Q009  $zV*b[sWn']vd~Ft5^KOP_k;;pі_#. ˵W6еЖ|RvD*ZSfsȦ\[AtR\X,zmakTޠtGI"E:n.HP_ :_Kt}.A]B_]IS\ CZ"UcqG",MCIQ6ik-%+S ~*>ƝwGXZU[Ÿ#j<4$dDI av AJqu%9XubXOr  ح|l׊MnN|g/@hf%"ϙf]w\TݦΈ\E@"7eDK,WlxcL PNi]Hd}okcZ& L]y/92"{%SLugzS0Z"m3"yC7˚\kb|CVpl^ Դ28&LSbPuo$(>y%.zQH(KgHDW(X:U\u}7&ohRcP/Kf%-Wp,D$;sF辦k3 Μ[ 7/]H/;:%-6x$|+ɢٸCʹxV\T5-k0\(Irf\BLøvzLsGK~8(b G륭* D47Zl< ƃ8paAc6V什)6>>v&5thXg8KVA0;ĺ;r%5W?]T$qL1 # wC3al^ޭUF$SCڔAu%Qby8aFNL6R=aC똥۝։lo]{%sݞu'Í|ax8MxDŽ4I n5L?L},G<9A v:y .k_O>iE\(>`(At:&.fToh r~ gWF h=i!qgo-8!zu?El,)/ TR6iٚ|tsy/OWhQ@yգ1^olH8J!ۂ#8f/p}_C&Ab_Lrd^ ޯk_/YkyʄOd^,b5I'-ܠ]d;Q4&0/H}T:GX)Y;׸dB[NcZyݷudbAgף j6h/EW[̉wV~5KVdClzߤu w8bJmS7zғ8i|6'ݻ,`vkO;l)-dqkUn 3XENjI; |n0rdO%שwJʌܐGrE)pvxA#RuSdL~x>K$m0+$RIg sUN'b,ڂ<-]hbAc̹M{5$HhiVhR> @[/ A)a$b0h+;!GG>rER%էӌOsucrt=g-$ײ%Fmaj;Di驳m\ZiKZL;`Vp^JnȚNPgEѮLN(CAFB9zZUp!(UKHs+V\YFbNĪi<%y0PC9mi܌ fҗ6t "g%KHWܥ [nKYwBoPROżWGrmVC3G_^0gZ\k`Ym F2D5Y6OD'3)x08\;{WيdX$۴@jNM;>ܐh-NoKj ŷR9I+Vśd[[Cܑ)爅[ITi ʏ7jiHf Ӗ 3<;6k"wđL2Bi GCR#'ˎ2.P Jr=y @ᕜ5# u=1eGZ㔚 եp+0KsS7?ubUKD n:noU{OܭDLntp:z*ܱ_CaGEz Zcǀcp+妴 $+kkP;;SǬ`ܙyni$^B?헜&ϓ w }3q|5fzB#H$^'x ]e~Ta\(I= и{3/kj' pV#ejTJ6xqɚQj(5/f5ۏ-i FXڍ O*@ڽ\/ ꢭYK Yb=G|T>'і!K0^A7k6 nZ<[S2&j*o>WXjf`D}\b?dP?2^Z q<ҧ:s~S}: v) Ň H@9[u:½! Q'[/qDlTg’!/\mT THV\Z:OM&~A|]^˿K'KJ9QtWz2IkXT>}4IXWՀaxea<[<i%e[Zo:. rԍ|-+*s$;"V +tq^ϋu(Y :: 4})!fw7WQx(VWhrYIb[j388< 9!0ZY6QR|r:z|;#eJ"|>lx#("ke/}+fʓ`gUs *Fvge<әHN7MwOZA8j7.Qs$r1,p(u<~ ]D5__;eެ/;uJZtW-,UZ5נi| O -wRd Q푤NdeI4?7K=,a~^ qR%|_j?"T-Etu)*8r3I~oVsIb&S͐;$y2iIQx4pz~ %'2TɋfzMs,p(;{?Q صp0Qc Os<g9 r+S^ljd:KuE^1YM 3ht ÝVtBk\-\J%-u2h9Fp8SGN0Mp!URP5A: !f@ Xץpw$/AxlqDyP!7@#;(P.o~S5E:|"рg}8hݓrU(~Q/|tʞUGu"n2Sʢh3_H7xL}o 4n6hDzmk$fdY>P2=28Nݨ;{T6JDN4d]p-R.f$ڬhugٷ95q+`#QVe e>cdlt#n)P4A.yՍM3oeWIŒ&3s< ح29t;x˖ޣ5wU@Q=մ#-A12ܷLeEu;GM $92-6$}qiQ_$kΝTHt7Ѝ7,J eF_6/g/b%rR4}\fwv\uܝYroiu~3{?zͻmAz r(^Su$şzr2߽'ABJYt+3 *aDGVʂZZTk2[խt2&!:).r/Us,wE̙;/Z'3xQ+W반l Y|܋Ne蒒2=Xv ԋO|h ).zXSRWLf )S_F:-Hܺl_ͮd(fٟknmGx~w3Tur)N]y 4[NR]d`@`+ցwj,3>(LӋiOBOJe֊{aGˉbAժ=$#9M/@cM\Qe#}'H0ΪrN($;vZ]C%p&n+hq_7vS\Q)wUW4F4* u|C3E 3 bų*DMe7eMϣ%18ۃ]-haO[B3T F#hY k \VD ;a(n\+|yܭ*Əf& nx ݫeV5gxlaTQ]T靺 07ӃDyQawg_~d^4Q#P0ܷ(U1!N : f֩GAIP1?y,J'iuQ>VEbp;vS۔ghc؇ Y(Feb  tb6A0"NJcʞL5uA;34NMD h7 m_h6oni)^#,][G 5ЀI`X0AQ6L _Ϟ=٥pO9m( Crj~٬ PXNC#s1GN tvBgR9H駟1Hà%등qKML;wI Яʯ{?N[,cd|.D4ρ'L\Yt =tbЇ'4ﲞi`ׄƋ ќ lUurH:xλo?zKT\u(facF&ALjKIk}޶#ߔ6cM#6VnvjX^)nkgYTHy hO Hq$˦ , '9d^9D"UKfq#ZyJ=fs+Jj0špnWF؄J6e(4)##!6tZ1 uKՆxm\:95PmAnl,7αOhrY j5Jaqklʱ g$.bS0uQK^چuq./4[]U mcn8[LC l hֲS_]xkn/oVf F@Ջ ]3G;MS/2a+9^S*Kѹl& %$ 7Y)L4/| kw/МdFxE?^@Pp9b(MZ2< T3rTH*})-:z'uW/ޜq@81`A_P[/g[ Th 1K?qKֈjK6}66iuC"C䂤<^@4rŪխ_Q95y'vYPR#_=3 l/a743'&(cyg1 n2TK_%@he0J ډeRE6U滙QW7;r)NT^aL6q~VM `PQ ەIBe27ZM6:\Xbpe7׆Bfn\ͪik-nŵXy{qjx2 K{RO rE2dE+i<$Ƥ"*tC GéNF81:,*,Qh"N7r;.llz6ӔZMcgQ[Sdd[`z *U{T/e5[ueC:]$,gtq$OHLl7*Pj7FTғFq7🟆W<6IOo3?ṾtUJ1y즀a'k}Hؼ3Ma@e墸[I":TPF;㰹E"i?(^ԻF]餈ypz|XD4B6F#@<|@wVoE?ZA-HtI,o-DE0] ֘4U{9DCV5O zpףb">,a& ô~#UpMU>p8}1i(jbh|))d@M#QAAd[5{11yb5U%-W-uY3m*j%eVlɋHQ|?RF!ɂޚ򞅮xRC1hhw׳e^/bÅ3I#'0EݐYA=ZOFÉ5鋮b0^vlS[1e %Slmv@g31$A ̥0e|"e{VZiEuYPz5>_e27ծ>.@5_19ZcDF?<£j /hidZGwU!qg8A<6hoTolӢYۑ UZ똻Y0w q$u}kg6۷6[u-\ub(1QO;s"3܁&^_WrpL5ɍþs4Ɖ<=V dU_!,FTmJ&_\?zq pt8ZWKΐW!|OЅYffr7?y{{ c4v >s{]AZGI-D 6'kP/^ӫIj!Nhl+Z{WuG^{o$!:ݤ}IJWNՔ}&:Q؉ѨP\*)W1FX߫/ݸ4#Ґ h&Wp(DH&0Xt郛#~1d##)gWK:V$Vid&[pZ7[]4EJ4q N $8"PUsQC&uY~*RoFk2]ƣD[aߨΖo~R  =O7 Gu~MwQN++UT$c4yFb'w u,kT&d+::k^$b!0$j ,1ҨU-.F:#V&|# m![\5;aIe ** iD=Eo8\b!sP@d. +cK;aTO~*}bB["a II!]ɓ'I[Ό'+_/v,^|3ؖĞ lZ;K>{Ƞ~{%#S&r~b.6fI<?''zt51M8k֜UԭxiOArEfq (KYFU tLfkV+Aխňvͨ˽&kT n7NQKCj֘.o) @I%5Z:^ԧF6Y/<5 1!^xzPeFBw@XDL"_QaM7ۨ=}CGDu94W)NFIa쟵{oZBy\T@sX{/QLC]IAĽ,gǧý]]kF\ ˳٪/x1{Imu7gPg:^*Yz;{qcAfD2 , :^;ꆠdkOƪg.cp؞0IWwt+_ƗϾ#2%}M޾L^OOEG6L{XGÆ4,L sX>5Yx4R_@&{uCi(m<|'gjXTm,b6k4# Y˔0ϐ6Gzʻ@H#A9MU"Ѻw mԧjRy"z%7v<u j,=q.$j7z]nf5ھ~ww<ڝ%FQmt]g/=5D"Z_ .5dm(46ˠ[)]'L>jd~O1ͣTQTEf҉B eZ{qDgo_T7D҄e+!$ꔥa9YzU=լFgJ- b8<]̃;zB&2 `H'cNԾBbRӊ٦pCi"P&^wd/|Q'Ss>OO8 )9U[-v#vbلd Qak}Z1:fnץ𚅷@[Z-7]jc8Y=1n"uօ6r1(l{ 4WH%KģR} f^83ؔަdĻI;a ]̬|ϩ䒥f_IT4&Iv0A[ sW'lۚ10V^fӋG˲8.Rb@I&0jc %,_F3Š0]wm e:#\QlZR]`*J5gs=Og]X^CXLMOfe;g6ҩjLnaE6M=U4a8ķSa$̪wmd~HeA$Ӹ$(!xZ7|e7yA軒nai&=o0溓tӵd |KW KՙWxxB/zW|jVХu(sN61>Ae&nt;Fߴ*8,P*|2җ"fyse51&EI0s[…>ӄ\-u,\Vd~B$G!cRl-K4%9װ(u"E֛*euV'q\PŸ~c>^9:kudd3Zzj*XX܇EP&2bDJTV('Gyt-JhyWTm=ch j֊*.(i dg3LքɆn=7(܄ 6KOjד_8Y_8L-媷dDOH\|kO&k@/L'q! s5*:0|8/L5z/ҊEw;젿b)q9%NqCE2 IZI, i ]W0K13>k2-q?GWA}{r$QmU~\ʑ܀wO7ޫ jJX0ˍq;QKi}/|&2bJL3m0:z'F0 | \xYƏ<撲LP55LG,>'1Ϻc>-)}os$VܡܦQl۔ Abzr?V!,Sb@Pwp0$W2d܈M-EK6@fwza܂f-v*0.(umXaK7Xj@3=b:֙{Ѷn$kMEM\J"v5,u*mm9'}vVl]U \/^Ģ3bKA_yVjU.'LW.]Yk+L_nЈ#FHdM- ~k<#)}q~Wϧivk4ȩlJÀ8?soM>4B cX) ƫrV-l~XI"1r ".!%- )8"sSc dNIa/Խ4DcEϪ?T:X!?]XY-ؚ,;cv  Yem{Szec'jDM\;HfSS\lp-ࡵBI4섏aƭ2, ;<;HY|TҨjgw+'h`r(qgfW@De8 ;I#0o&aHѸm^g?se .{c[Qxm+sݵ ~d5M 0Fuߦʺ(r߸w_Qt?k.a<>@jJ=PHN (֗\R,\^=9=?Q1}g6/ts$Tooʡd5~zYMޮہI 1O!a> GL@bevƶx&E%܊\8:t'rIߣBޛF[%G<9gjw2鳘=Sq1D٨nh CxQزƽ +(ڒ^g`Qzm( Jaw)ٲD&̤ FD j rDeAwռ] H]K 2KFv1oܕ``lly{Оb Vb"N ^Mn uUɐ 8 84yv3Cx 2RwC3Kyv(I!k/n>;E_4d$7ԋMqH̀FWhQ+A z$/^e`J;+3d,I9qd @h Nv S4+3}a醽ã$ZSQvLU[WЮ׍k8qvRkfgOzrLlĽRbɴr =Z ^\/Rthֈ#'ڨ}j(=*WK/z檽ܤmoѣ7A2%fF4ۏUs`AQЁKw93 P6^:9$w{d+︙;+`_XF]0' S4}"YnjҊ5 t\g2j akusqLD0b{@FRcd,*\&= YҢ\$}p^m^`LTM^m#uu䮳/Ũ,j0P]F691sn+oCVuV4>d m:eK nP[66uϑ|Aϑ1 1ʢbi:o{5UE_Ƥ게ؑ\-l_ 5݈/Wp+ØZNUZ5!i5߾'׵X sfC1t{,Sm+f+2|ִԌ[xruWtng$k*L0n μy42 loyN"4Q~#d+#ܤ8qωǁ:K(NB%S"uQ8Ly>f j"BUt'S=oÓ Ev{{ZP9a(dTR_G½e[_;HVX?ф5hN(YLRoI{MSsÆfZ.+RE]7cٱBsQj"|iXs@3~sf@G"C:nxgs_Ҍ2:u ~xFms)'{0 [\Ýs 8'ojBA872n0K44qmwg!FͪF@-/;]נ84NN&.C/G6w=U`uZNfJ"}w5"XY.Nl[:XO).{@lAز~8+VV9\lյI]a[+f1e:- k.BA;0@錍/K) aȞCelZx p6ͼdDJ yDbx3[a sԞ6u<.k\YTr*e>8PLoТ:d_k,WZR]MjHv:=%%Oy9R|ņ9 bɓ?w~k<ّ0J_}O{@Μ?0qFs8eӪZ]Mx{;1eG<V T8˼!"U>Ӵ?O~5X8dna5!r\ E18 9O:b q˻6ƉVQAA;KP]gk5;dX?Dwq08H{xп !y|ak4-g^)Bj6LE{`{IPx`gwA쮵H]$Uh5=ܻs*س9*Qwm ږxӳ-'wi{dȞf'I4K44*F\r& d+RV[m0-Οwc6pEz_OYa N}{zࡧ:7LwcnQ-x5cfNj6ҫUZzݦÄm~GlZ[o+6ґ3m&!3P01)1:&Z/>_*<{:gV6!!PwD%j;Z^q2=i^z-U>Ѿ?/_7_~U?_}wO^FfʚoGO 姶_ A; Si:U"{(JmCtD[[Zj2V\wL$zQ &R6Qgچ/,pƫM __)ܙhW_Jju`^R.aIZ(I? V'"k\ gp2r\-I(A\}ZKFlš(Gn[]B@T9ִAws%1BFpuo9ZRMb/uZ^]h`0o9iAc2GlA{SYfi+ .6J3fAbghA[gbq9brSb/)m묞|9}_hE/CEw_ S'1i2ܚf sg\QPԾVBMX~;*gO>D͒?~-BE!|/M,^n/RQpk5Hך%W${7B'_,Kۙ-ϛ15/h 5dK0YUxuɁ`Iy٨WIW!Q-ۯ$j?E"@:cShf5RڊVK#)vK}8'bnyJHtl(Hk4#zvrTEGPROzaRM@6kkǭ\L/t!nx(d~fD89'kFap9y I&j4}@hV1~ר_vB4lmև?>[{cs8P_V+ /+6+uySK[+7KaWI.kKppH.kÏ; bgy05BZW3 ; ,裎*YV!/kHBH5yp5v6^G^-]RdlekSB}/ϡVA>],{ソ???GVqǼZ@6OUKKO!~1EB#¯vkd?{~W~~򛧟?lё{:S/?rk{rXN?(T' &Bj^)en}nH'u봞(x>(ܚLU+ɰS+;EQl׺4bI "+5ű xt`5a$̜Pjks]G&RzXY,UC6H;/ +J1kB(P&$+%:9ql:#й4YSb&5sxR;ÉO[ҾK(B5Vkz5_/1 X98 ??~1 J;&&vY[:аa>Hto$![7;k^/VrGjgQuTތþ|7H+mjh%ɿngzKLcp*s4f YÝo6fƨ+?bhgՋ2d ;Y纶${fފ y:2]y֖:.rÅ+b.}|ϚkeS̥:œ3M'(>f5525BkC^# ò,gWtBݝYte$]%c0жsV27;y/hJقҁA"ũ^!^W$ԓ`㌉_X~]?)Kgϟ-=!qW+h] 2\nUU=|x o]06W[ ߽$ҢҳA~w,֣o}_(B`\u=wf1Xؗ*znȦiҔ,y$YK3o^ σk,0(@ГiFe d"Y)b읽VUsEVWR(fgfD\쁛঺qdWzwDP׺p |ϳHeA!tϯLDNtP5ųbaNQ3 ʁ%NOMϺQ"W?@ǟ8=;}_{_W0d#G _{ K/N5XjZBp 66ˆv^g榕ZY h'uC[ԤE k2x qVH.Q )dg7 k+q3_bLY\j3+9("h[.T gi>wgQ\a\gUn< oBkKF1 Ki+WCz,K8H.hنX!Br . ?|mc4RMDZ^")5&+FC(HA8k)?Vj5zI2[zFTf+q;b^ 6tSݾŠwz6KgJ  ^^5';.ecU]ףeTcky 'RZh46#ytkȜIP(4ZeI5r#Qg:WXd#׬yՈ(77a"˶jm>;i4?/>>t팶.'"YdcC5AnJLeFjvxK.U!KNB&[?pb!'>o|x+ )zr.# nx j8J??+?m,b2V*{B6?8*F}vu;68d 0KXub7N.&FKzJvied%rMZ$`Oړ\=hn0ߔ)fCjQsm=V!ȥ&pV\Ą4ld}=;-FvV,TE_ ^iWIw)ņ91HV.8jc}vfEaC^N>2w@v+~) "Wfȳql mf5-20,ZN]3Xs8L5l[#y!IT~mPuY1Pv0W8v¬:M"_x`\q|21̻r`ّ͎2zVׯ<-|/)q i֒çIWl% ,fLJ7tuk -ݎxlhVk6o|׊49~A}cv_}W__jeyӟG?4'>g>F:^^֋o|_/gZyqxS?ws~<뗾#՝nǧ@z(”HHтi ?zZvY%u J"W `C9B| "x`(W?X/ݗdyI\xC,g`m!BރB%/.u8H}JA%۪3dKnSE)?gr d众 29u NΎbp= . M&YQ:1FbǧVm+eU84f(Br/fFVYrK8%r. Hixk[-U- Ժ*׷\5,p AXtPҜQ[B+k-3DK3D׌T?Hq l,p.NN[ 9VZBə_dY(`IPұ$5cU SBꏱ"IK>NWU׉$o~@8ȝ1 `W.jhW9Gj$~-H,1|85's\']YR-Xϔ9֦-ZE[S5w1HMN'>Op*آ]ʠ,~И^N[ъ;ewg$[ VgHbg8zR7(KrIWe(C 6I!D1!+_3'DadA[fD 'n/˘eݑS V[,f=1$XI:hKILJXL(gp?$ܼ(LSfdRPĹ;8&Yk)fNf-25Xk#P/VaXL,7XHo>8薟x7xmk۰Lcj?/ۿ۸Øvfs ?>|+ M,"Ms+FmĖXSoڱ ̛$.5dkkutFp5s?◾~W~60@^/xcAD&3unDbS2 ;aвᐂ3lGi<#UL5- R4ֈT鸍/hߡs שثAӲH5\BIK42 ɬa1K,(*ka=88ԓ' MUci0H6εnL{pӣ'SP`ĵj'**G.RmHE{Ы:"|5 tӨѝ(fH?GU6[Q4bTfWL&[7IQ4/wkX1ViC#Kr|32CG!KB}6u/Ɣ>vin^Ip]觞z w!_˧i{$S Tʻo~[DNHG P8o(BH[IySK7k_gz-__Fy\?Xw})8ߟC%Y}zs ICDF[0 ZT:5Ȃ*IZy.3u1+PshL%cE+a|``(BBQjTUصБ W{ s"$ȨHe|5iܓX0 w֝V!ȅHfP( |LsWYkCvb8Ƌ&n“Z&h}$"4]?נV)gԥCuͼ][04poO~B;"0{ 8W*e# /;ۻ{Aʨ@5T-+][] aSXxANJEMc+:/-"s`[/9bXBuMz7dB… ,*ǃ cb"PsR|UA7ɞ[{Jw$IZi'TO}>V驣C`.tUbv+Y*yRO02.@G>}(p$Z8O?!z?O1t,^( K}46@ ?:8>;a8b٧s+6:cw؜7wF a1`Q $n&Wbm/ aQnEUŇbx3W N^I?/&y&9JcL6Vz"3Fc=Q)!MĠ"#Fk;7SO%VJ Bàc]VEhk6G}}fjsNsbP$ls*;1wY8öF+#l? x$SlX #rz_&ٽ䷋`fB`nltTtVCr+Ť̖|ix =߷V# sS>gzF}=qi* 6:*pZ`@j Rd k,l;!b+[s垰ZRbųfp2TY~lI74R q1./tq+O~QV,I,vvI2u tkҶѸ^ףҰi%4HK˞nRƌ)Hu9?}<5n}qRLn(/%koXyp5CrD%X~e.}#(^q+^|eT>XOby~&?S?tȽwFUcK>0L9kSS\#rSQƴDت{Mgkƶ꾼A"{"oWJaM]ͧčyÇ86cv s^Vl[/]ݔP)T3V1IZs\OD=K[P>xhH *%R"QBh1dXFww`lI'yɹ[ԿҀdL0dvǡrq3ؽ8!H(TL,dlXe^_vuO0OIudTqUmi2P8 VA ?# x*p +9DPWdB%cX~1iǝ(d+1tyΦv7\LѢ)MDȟ2Mё[|R<_'<:&kĔYmWC|Vd3vZ?2djgk @0j?\i1SA$>׶o&ņ''Lf<]y)PGux ( Wh RQQjE0G'g0V*B<$oѰ 17b,W a:&Fz<${!B^OcvqgHk6G+äV zěAtߜcUG&kYZ\!)Ni H2HiIh%@Ӧl#J%i6@Cy gC3ϱ^F,V0A16S3qc ߺqiFȫlNŞY`d|S1L:n|5Ɇt5 ɧ&Q̚,!Ro\NJ .GwwRdZx*8enb{rqnYs*˖_U0bN~W|ɚh#.gmvS+oF_#GWng{|ױm\>qqCN>'b'_x>E~]ɱ\w]Ǚv/NE JJПۀ ϏBjº?N+}QˊNDcyEV*f~_Wyex{a# (O(0[.O+eeIv 4BuEY*1TKE<."Nゴг )^&8 3:ٚ ᾺjjWkIS%DhH?3*7:[UA-rOouaPi%=>eSdou@9]N7%G|g'j r#mjͻavqKPȷ%+ y ˔.k$e$,sJ2UdnbFb:PlbdkzNMP"ܺ|\GaJY%&jwAsbנQUX"rjVrA)z$}n Z,ɆV#DfPj"'fLqMwZ)+[*ODoFR6?W ?R>.Uspس7_+ 56d | w_/__C?ςϿg/~xw߽=VPO?3fS^|%aϞyIpq#O"DW G"uB,zF(ve (+S jiY U3WUg3Wrzzk5F H ъLI*FQFL p]..wSjWj۪3|=焮 aXyhӫ˺QR@y%N=//dm.: Lj8Xc Z, ǒ򹍫:*lؤ [r&}]20o$HM\ѽ;9dכ·MN9٣UnGo@OZg ssQ__?O ղ8'Zgʑ`*NA"5ʎF[5CYU- <5z Arc4_mu||?A9>=,ؙ6A`KPG!Zbm"lzF{X;RDIJwyfeCQ]K-h7XՈ8/AXu G(V* 0sÃ0oEZ|{G Q̤Wht ~>CvPR+N2t]C¾É r,* ŜIXh%{u@]a|6b͍;vŶ Qq, o/._ +|L2hSE9shT ]zŭnF创<Ν#pòŲo""@U6Dv@ى^>Oe]}9'hM[DGF=$zO}&WʒL]vԣ&R.?עIGViInnպ'X2\-ܛ|̕^/ p/+8< }vˎI{pq|vcAT>`yFJ?j0.aŤFH!(%1`=/X Đ"lH6iX;͵AswF%vdZ8[9ƑHŤ!V$%B݋ ~|֠-[``$C74 OOEZ+|r 6s@ɾn̓% G{2}v5CN!i(d%8㬃%J+:&M`kJ{px=]bQy( c? /z`SRt:Y!EA "b%;i4$; .zxTbwb;̱rE3ϯiN-! 3-*̾wYM ݾtLi._"R)[T }m[o}\+q]9 Pr#e'AϽX7mH=ђbe2zlW^Nn hhl+S?"ۨoK??p[Z8|W_EzK9~޹;-0WW_a;T<%"IǠ*n#͓ҚûI, rU& s 4j7jU]&f 9WDav2UZ2$VwN #=F -GC$8'5&Q֋a~P 1K5]1 ;(F ~CE}:m<7p/fЇEXIed"KPv ٱ @\ah!עϪR'I(mEvm3,=uO/`\oNv*?6{yv^k7oF_o5W{;0atp'L~F=ɲQ^p] Y^$5"Q[B$3,ɢq:^\LWE|6w6?*n%Ș @!ڨZVbX,)vZsxO@F2 )n}4HyrQ×7@|Y!j 55E;=)G<%~JMҞUg6qUBO*WwnH.7*1acOe%,0.RW!pGfG\ +N6F2m!L.]a7qrɪت E\gPr~.9ND [5̅Ӎݬ2$KX Y!ClZy"KW`!0$\ӫ\eͨXnO E_z%8p'n=~9|r "PMgc/|{)ڿ0Ԯc a{Z,!σO PFJS;"Sf@kZ˥R-6hZ[.n ݟpo HNvY͐- 5bhu,~ONdځ~~iĢrO1Ԗ;RH6ƪU4~/>3俫"+uGoݹ{x}R8K픊k\>ۯoj C $:YUϑ˩RrKa4y;碌kә)֜2ҜTvltka>ATH,Lqw$b [Sņ$g{ ]@eeV?2aj 5IE2RQZzw%ݦ8)8O"*S98cLx@!Om22Au$jsoLJQ댒SDzdwoTRz7_grٚ4Bv9l㒐ncvFGC>E]Q3RхZl|WN vxO*m{ZJInD7tv2ƙ /J DsZ4'v !htSFoF"u@*wy B({^EZDܦ~h"HTҦ!3 GO ( QvtOSr&W$5 "riyyJl 0R6_ g8^ Tؗ 5:kÊ] E$WI~d#wB!0³%Y8Z MME*ʡ$(}ERjxYu-Qzx>We5n#PN#gB]nힱ-W؟X-",cmAg K7xÛo+X|l(≅/y#OIE3=z`bW_yɃS :zz 6eFr4erL9m@I#b{V>Lu@Bnw]<ʻ|&N+/ţfX*20YzkGXKu|IWG z(x”ϗE*vwA%)/lT WP*5Q'Ī$+ C7{(EUla8%p$Fb&cYW&&@vP&I5kNP[ ,NXZ`j/4.C&L2Av>Ძ(yU}LomjnUclإ} T=dH S.fdنr-9!~\m;ꁴ S]An[GO"BR;@);ڹ,q`GSY_E%}9h3h4Z`AVP቞+avvRYsZ<^[սĒAk4lA%62˖@49}*;H'i-Ne`z,C~H֟UQ fal[_?w { &w+@%+Bw%~JW l/숐3Ԣu,fDwE 1X7KP#D- [TkNʯrKKe<btAPq w+t DXތuIvZWӎQZ,׸,ב,\D6mYd>CTr.`N:<~iװTc%DZphwF>Ch &"_t8*oXak)UW**r <[HцzBi\8g]ȵkh`"jZJ>!R а1Rr/K_)+\7O9\e.QQN3 {;`/N:8N/@HK4o=r)=ŸyA~T5Ӂ{8 Hc)f 4shȵ|C}-6K*„S0Szqv;Gy+u@{9K)1dQmQMdƵZ6z5qz_%vyswu)w7,(ӂ1"[N29´V#\,V?= T ?2nã`;TY(&O >!DR5ek|S`8K+Ȉat %oI-\{!6 pdykRÑW&.+MOpI']e\`!^@֋/t '&3(hVV` .yTW`(}IwrfeB5999W6UCup/2fח_S +l%Wlj>$ =3FQW^Dyk$qIISe};Ek_?..F8LΙ:+@#TXESӲ ʨ;E|k3:/R:1+ɆҍC` d[oflOJ>_~f4O'FȪU,H`Nȣ7a<e͢6!l;f@ުIDxIqb) XD'eCap7Li f+ho!7ۑ nr Ie OS Y NGR#RsB`XPS2GH[_0fw=>T[p$ d<6 :`}?dr9գKJPi!1PCrE]PCyלdF [B½LOXg@wh`_X0T+vtl,(&t>02~ A$7F@'p  gZBs{2sXEW*y/77`Kf\>ݲɄ! v[H:JV/O5ٺ0އQ6RK%& ,mu9TrH5jb9i$*+^BOJ>$9٢"1xxq9)(usl/()X}i,B3bVoxäĴ0$ rZr2Y@4T`t8-|#FiZ'Tka$y_y_*8 3rt:Iv*LT&"3K6iN(?)2Gb.Y 2DBcZeBm"$@u08RcDXArŶØsC.VQ蜷g ɔJw. җp*粮Q /%W`"1bB,b_rЈ%st4DwD'+!gs ̖3HPLelo^U/"r lp{r>P@l J~Z$=><$/Ako礖Ÿl׈W]v=nQ8)i(ԄFP%Hk;þً{p{g\Jq2/1EHIQy((ߣ %b-3X4QV+Nch;1cD +('`j1)HzB[.V5<ܬi*眵ެ.Wʀ(Q p-=\b%=T5Mṕ(b r@W`(Q-{ oz9liT:"־@OT{!aD(gS6ϱBY"zE0:Q1r\n2O/qQĆm$'bs#(j xF|e .U{D_kp55:Њ Au*9T%" pvC'*,KX.9-fjc$_k{cO"h'LSr :HnY-$6E.ÀqW'4|1AKEF`nv}fH?mp>cl$RZ7 zNI HŖCI9Ocf=* *En#QBsw) ɭ.8hPǥEgӇ GYAWQ7 Vb_] U;S5y!> #@:lqȠ’w VTt%nu@ZU;?9NH<wѱR%45GДBv 27>LAҖģ(D5Q@j،%4uʝ5RɝH~"j[ɋ/R&A)ҙ@WǥXH3>HO28 kAH";Pa9iKy,/y`ۂ9.0zy4@FX,fIGt9SV[+Lsk*\K1wo֭Q~P.{2O'UT: Ug{u ~HkE @7{aYy&(gK"-u.k@)$".jmͲ%_a{R3hOcb*0xWG6F@wr5{h4zv{;{-"ElG~ଢw\̔YVN0d#`m84g9%jM2HL{X !yBe۽0Id?9ς{p 4T( T|FI6VUNBA+Fb5Gg>Y ;Ľ 6)(P# gk +r6%pA[+jcla`wlx#W\7< M a6"9E9 ݰ ABh 8.#IulTb=O!9\ͅ)\_x3ie(ZDGA!vƬ7s#m 9ql*7r]Yژ%̹++(aӒz*.ʉ WS/K\Q_1!$݁٨_=<۸|'D2f#PUǗܱ kJrzN/VfRi# 7ϩpG/n"ͪs64!koNZ:(g,2=!]#@cgpf&& {K^X>82(-+gdwzzt$j>uq-ƄL\ޘle8XN4TBy* }p$+(7bȽK13E9vx 2 EqB<) [$Bz/4a؁R׮%svx,N^l~9gݏ?64Q]h%¬Έ{pɓk{Μ(z<W-Yy̔'g'tp|~F*uqx-* L*zbcLĴ%h.N`ee,ɝ'g%T֜c G:h^VJ5%jG1hP`fVo* 4=#qM$9kǦ\^IA$F,9BqˆFX"ԂQ7 ^{o߼~#ʵdEye$r&V]NE s/ϖʃF0WP5v!9Zφ{ omRIrl^v+$t ja kAt|qptOn78b2fzdǜ8Wn ^Wg .K!:; Y-[eg>;cDн4Au6VBL6ګI-&^!Yh2A ҭw'wSV)(`T{/w *o} 4:8)=ġ(g簀'FESD$c Fi6hjq6W[|=H{qKQCNt'u˖H{ %`Ur=S,)/8u A&)d؀EP,bخ"u}k_kI0a:(ʥ~6S]R솽.EL)֦*-"XS~HE*nIxZdC *kcV\%}ȫYW'] { CHL$| wO/g>)a CRF)(Q:E0]Ms =Α^g>/m%|J)śBJ$L3]\%y h _U#EֹAasʕ0z_ t++#_$*oe0}< V)5~ׂlWw^$ `I6VIMv4WA]LtМfy9H/'!\ͥx]XUdAaXH 5',`дKp8($bmᩈ':ƾm33*l1qȧ:YS,F*,fxTǠYST/DC' 5_՟Ñ uޘ,[%f{|n1d\M.秭Ҽj0 g#@#TqĐ Ba2 OMpQD,B4ꊤ]Ѐl؁Xv:X >h/rZp@ǫV/_ʲxMFy_u#Il_ Ő).NxN'2*{MNzpK0Z"U46M{!60f=Lb`ayi@u>o9zt<=Z5=eiͬ\gUFn{)M>۔(\8Hq`H^][$8fd"0IeR]1YO!rݵO *LiR`lpg'qOURc$x A>N`qȅ\f!෯G>8yq1Bp%p^B:vq$9˟cECgonz?,5pI ~sfYY)`ݦv40£amĵȉ@}ɘ%׈>@kexE 0cSXX.9&1oEx/1ͮQ**&5Ю痳"NvlR\AJ @ '{wOM׮APf0 W+J$jHp"J˄k=9]Tqmdk8f"@ 0}PΝITOŭpUH׵F1i|Ŋf"ohSN2Ex¯ASZOusM)X4=rCgpQ%zmg"mliu"Ь17@?$<1v|Vs^[ʋY-; #~HeT??SCŝ TU=/ 7%5ag}L aVDf7Nch݈,agU?=G_^NdͧAGTH*HSc[;"EaB1M2*m8 B9K}xܗUlrl מyARDxUm"s1(A*э_lͱb%j :[<@Ipб{ ._`ъ%&;Ƹh3BeZ(B#J`ip̄f9FrtJ Gط^pbD9d,$ HR'ڙ.?DPZ$(ǔfP{AQ&Z5(%";=iM9"+'aV%M4\DS/dUR ~3x6"ĀDu2QvO e,=0. TT`߀Y 8 -v8%ԇVv%+LQ&5w%򊊦 u 'uqCe$_}ˮfQ*J3PE#Rw XI2XnH+.R \.GږB0K b*w [>.ZSy,|ޗNw~*^ DywKѸ /nRS %"bKi~l W}*} (._8nC['xg*$9>^@5a'){9+!FIYgcz;y*eP4`祈׏4PH@_P=^K; XF OqR<>Uv6eǦޅ^. 0-:N]k%l8e\3UVpqm-4U[5ۚ6B}sz+f N 8^@/"XQb?T _a97sL/mN"Oa riwҸ [i&թA6!U"ZU5l0hÊH8IDӋ2Epo?c'''ٸ?܋H>66܂S+MlH:_\ϙ%&(S#]\iQ@wA,gR`е6"XeX{G&Qޮ %XOUKbљ7h pӤZ¾f?B29SzG: {¯Gnހqħa%tِ68nG/ݼIHDc)]9 l;_m-qjǕY~xTM)T aEx@EnEZ(/Ӽ"࢐]q`XhXov0bFH@{&s .{y1Rk-j7oVF AŪ1 XqX`+7}@9, 7&b|K]H<9?ZF95ae "83$Y.p k丱j.)ځs-e+'3,f\eI{(Rr_DX\ĀOY{@ :T 'v*z0Mep^*ow.B-LX=IשaI0(JfU:US[К̟ѨJxb,ۯ=L"-l]>1o(y#دNrGgra;0@ ŜTy9ž1Ԙ֐vK8I:^Wi 0'.5EƱ\鎴-I=ba_s) X$CM8趣߮b鷈`yo=Y#>i<1:pzK*G15+~/MH^;[7`|ݺlđ0μ|e՜5%UW$itއa t"Z/X/ЛDj*y!2WD1ƵVxίJs8FsW-Ii*G7]V5ի15 5&!lEU$)v?pTW\&E=5Iv[h[D5YV<>di9I|LMn4ܺf{1B:a^OgLLdEpL^DD*/KaZ:3"Ϧ(ԉHTacZ8 R6fMdIx+ )z|XDa7I8Q67$t~r(+)ݷg*TM]XLAZs ˕GtTqK ?>M|=0KC- N, yYU= 1Ek[Fيph.X430yR3dN3z5^w3ARJJ"idjY(D3e/CAᔥHLRE@ZMM& t*  |P@F9z_CV uՉ#OR74 Zy\Hav^ϐU pX hk6b}n^K)OCܜ77HXx 4\O=qɅ,Wor㸎vNȽ,uL*og7YQ_>\8K}!%T^%zs""BKBZ1mEKmƆRCՐ< }uMx7K_tUa7*OAr7R$Wpcb";Uh|̍ .B.(/Ґ2,{;`8v 8Ђaߐ]; ' []R)WDZuWu]<[onБbcVi,0 mLk7{} #_(کhI]s 'uvz8Pçmq!SψjvXyŢQ&6HDUQA:tM4"l @% d =*Iꐆv]N.{To@ίT_D46v ϸDtw{o q`VNOC&f xXXCFӨ1İ TY"0AZ,]-at6%1L?95qSB%ku\ ɫv# _6 :'utN,p &ز}̀o59fVk\}uñUL9ɛt\?ZNbCodTs'*i 7ki|x3Sgb;>5/p~/3(3Y*Uk&PXNE8K9 r~a]=M墇BW44kcOMBoh!?A 85Gz̒) yjZ䐯ޓ N TJzM~kp !l p*K✶bcv3W= )wC'L[0P Y_qIZ ̱T%&ؒuv,"м81vʯGo%qUy"97;:8נT=PGkk .:)7o:s>ϩ46:rѺWZ&vw]bKi0 ́~r9}a/8ۨQV5R.]|`a5JL%k7u=*xRޫ^-mt `hIqv -/wxY+d#96@([_Ixa*T`%[f.O2R.tq#)rx.:?EG|˒ Byx峦+4gqgtu#`B ۦzíLU"E9mL9W*Z#x&Kp4sqe\'ʖLh\*Py_S9QA1RVTbhM$0%sUj wpaEeVvBnô] Rv֭?F*$M'g'Kyhs@.ZmSyD  ݍ> g/=BP#k+Wfs #;typ3#zpv{Zz|R'5A?Xnɔ Fp= h) lՒ2YjFI47srD14HRüHݪ=L 2 UiM$<+[6lJ\S9{ABv.HJX;+-j0B7-Ʊ'Sם=2jZʴ?ĦXɰN@H Yg+6KT{ZɵiB\i|ѾD첛ъN7w9rἺ%SsƬ*lb"%ntiIC:0WX&δ$l49 p^IѬI wSehRx׾?2Br.3j[ xaiTUخ[хg&.bX{5bW堓) 3Q-2hŰ7]g<Q"53%tXy1eh7XJ/jDB8,WAeǀr)i\PvԤF!9' (myM#j$F8Eҡ'}d$rN:c619׫,Tcu4wsΌU\pV]\(U.)S@yl UQW+߁P 0ʳAi3WБ@j+ ?9z-X@:=ND#'cו$+p珞mBj. ?1o[hHLR VBF*dmh!v5fm[ 8툥O"[jr\ ŵIQVqi*{_;󁫣EJnX,Ԧ2nrb?;s9CѶn+\j%:Nw:оŰjKxUZ-4?5vI18M:[i$Xoh?4XfO_RŊ} 3 /蜼Z\ W3lɈ57wܾGtl]wo0.U觩XƼЃ^qJHYb xJ 00E}a18 |gOut&(4[PV+\1\"dV{Ӫ8΢ Fx60ǟOv&lRE>B9%"#^XX:aYLSa#`yb]:JvKxw{![!݁M {6[yt:')8ۑv6Zh*!&@ IrWd(@ pq'U;= VԟƵRԮ5vNXz $G拹{Gv ֨z - rګ۫ߡ0f Z-;#gE(۶u 0n]^`^C8V+W}?KEHuױwM ZkRg~<=y(CYߖ _;G^‡=9aP!Si/u!Kŏ+^6>cp=],OPz7޳Td8" ,XM& {H(v91{'$J>in߿2 -nnC:#}PsXP7e:yaSWQsB"8߫*An:,E Tlh# ŀȗ\u3YNqq >>U qzgލy/4: ;Et;z]jTkYQ:Z= pMѢ?GEFS~Pem8D\n Vml^j-Jum/',dգM@UǼ` )X~E5*ZAЬڻ `/ QeUR#Q9Z+s5 ֭/IӤk1\b}JE!Z HJ(aChm4טt3*78L}o*٣QJ*$ PȪ;tMˢrI|NGX;pS뚲c r)+ٞ.Ka†·tU'"b{ڇ+uLlb?s?;n5@T6uw]5Ӂ0:Wx8БK [$ 6`;Pd#j@HGզG~ġns7BE3b %]ƖկB\JmQIuTPֽm#zWHj_bgtÓA71fiݱtQN+npmS{y3=RW-w'dzp[Gqc%m'  ›4l_7_=t.E\ 07AΌ~0Mkmj;l6gvHzOE0!}!]†$!9`;+ h"Q@'Ӄo(UtO˼Tf{ 7 XTrWG]Ύ`aiZ% ` gk;SaUC˰U;pfe]>\{) b(uvES>W7~FhFbz{%E^6H1m `0ȌiURA9'FAl1N`LmxfUF3y'`hr2;#l}$嗫-윷5?ؖp~fpc55;Ug&6w>e,L,3>t@ks$aѡmΘ AevqTj?y&&j%8|jL2V mI$hq5J>$P'OOu+!-4Ĕ(Zq 1KÉ5cr{si)r֘{ wqN ԔMB"ONCa@Ҧ*bVJ'rcJ_$UVX$:WFi36N&||2@bEe15* 8RO 3cTt'7s9n2IPUʹ|QM-ֵ8cԴl(66Ki )M3J=9|.GpJQhUl3ﱩ"&U \P-ȨTHWΥGt L.?mOViV͑ă>2F\Aqrzd$Cb QUJQ-{اGBZ5p8j5~b7V,^dXs#9#>sRT-_xu}NYdF趯+S1k#'/,9G7~2E6{Ә07PVp:¿xw:Ghpw:Ye<23+Y1R l5hݷ c[X.{3#-LfEI n3|~UF7i_3ؗ&ODD]Y1{ EևL/2Hd>vWt.ȡձ.V^ޒsPBf"aLy.ƛ u.W.d}?bcL$e_S*8ʡjkmJ'RuGKFvIik]M}Pp蝷IY? BjXGϓ*%6N=:[}hƓU?`9PJK "qa5q x}NR?/c,ggٓ)I \11f8]nY/ zEk9C&X\B% c   (0l!ՙ j!GMo>*oޞo =AT{#ǥ즓v916Ȏ1w &dZٚMgjzcJZєlwfk"\XkLt1Ha-7sLXeI+©PG#tq MaA(U4Ў:λʮtmq"Q D}-/PhF]@e~^Z`-1q!( hvhk_%4 ‹XY%.x &pT:њoOax/зF|*}1*P/=y|tFL'˲y#1%`g!oJ'ky:Я' TP =!דw0W,#I}:6fɎLOB7KB[з::}j}zZM|@GgosÖڗ*Z`\ d| >/QW FLSXfx df*6x]G>G"\/UO\D%=6 ΋~00ŀxʹ}%6_N ]Mt7ۑ/i(9zCκ, ƿ")cnQsT4ְR+^ G𢡊YPi'@"W$E CȞ*:JM> DFCB;[@PĝX=YZݥO¹ GC R P]Fmsfx lUp)5p8ǴU$,)]S7+u1 1RI9Ai&ئ6|kbi ý INfj ϪU`ښfGIA$_pm_7 960rEMMذB"NQx=ܤjHe0.}IWХ6FVĨkLj;Y4nKJTBlT ?T7߽F7a+3*Q7p?~N-WP ?0`RBxT vUr`MŸ{)uݽe}ETљqAGGǔt2NB zj" 9Q[lulW [i}lP8<rv#a 34*(!tza|Ɔ(%4s0neU`n?ІDY@a~G~\tũ-cʄgEm"{jr b)x=,r35tUt4~Fo<,$G )`eanA9^wiQl`eܧ FAC+`y!Vh}( PhÓBcl'/ 9vïMխO~A8!Kj14w!*?~6@UK?V14,ypB^Ç) ᛠ1==|W/7>=2D<Ip|on0\ Oaa)nW1=ycKH:1EXU8mZLmXU >vMUg}1G32$:W19Dra I7T$ To=|$kg2~*G׃ԠWyLrPaVfmJL5Cr?#]I +DgG H /bB,*ETp,uRk%j}&;5k8EcB)qк0"')@fgc̠.IemV<V-11ZK,xCgeTdGXw߾n0ك:Jiu=&/YOS|DɆ VQL7ƆGvČ}pݵb{;H|BǀBN]` mؘv tmBV}0/Z{n VԧGͺE 6z!ŚgGtљ񲆧uQt}'r}Hpp晼ضWH߫%[ ~8 ߽E #Ekzn-Q+ 3 t {J9ԝv%+aѬxm|b XdJ\|z]k=~ꏪq19J<w7 `R8$6ݛ5["ET?kznwWTh^Q`R#wHPl3>ƄE-*Xr 43#&k"`R -K<2iV#sTgu]$Ӷd-+/ !7H)jpހ[*fbV),΍>lHM|p_H2%$b"yކVo+HdO?藿z=; M)X;6U>yz&R`L(Ƙ U٧c7$3(^]c1Jw,ŌLwjBĽ:']{ QD\嵕.SDx\ ,ՂZ#0٭} MK\ru\}D{#T^Ա5%S1TdJ4iD&nWr`j X h6+5Zlֽ `@䮁w١;vQ 5&Q,jHHd MG:rT&;qo,+ Bi[#19R^>OǪ{߂<,sUjH }dқ^7ϳC+F>Gpg^2N:j5|Q!?8N.Ibdd1AgA xjCnAn4iJ1UȵzjApE'TGn|C|znitr bX&k6OQ8{2ӃlRJ *ȕ B1}h>Wh8 JT]pb ٬KƛjGKX7@ρyjiWnW0!`ZB\2W%uTj7*wj؄geCQT! yfj,l]afV[)L*cp2yv-LOp eRz{gDelC/t V 84b92(ZBӜRP<@-չZ$ys)A*٠.m A˕1e|qmA &l8ٴp(ϲ5\-?O&̭VdVi!x?ZLԻeB%ۭw1bWUz;nɲwxK0'N9&n;FC;r7#njK !TR_ Q:-.VaӛT $#/6͈Y^Ż,wPv$O?rgad>H&㷜Ϙ= #y׽nȾɽ Rq؏s;ˑ#[ɱeNAJЩ;₌' x½JqDLjE0up YH76&/_۝H4;iB%S$8eIbH'H:^֋ L޿<2n>=ҮuЄSt8(Ce $Y>}R4vxot~auHCӱDYN\@M:fNnK?p躛bJLٳ&Ƕ'W@M D@/㏝Iktfn`P_q [,\1I$k3w,vf[2XOK7BƖ>IOH i"mW(m +q> U-!6tK_{$uK^,qa6gIWDaIC dD*ћT"'&@:*oo&/37v>*4GC/&a-M=-AhW{?4}֊ؑb. ` Cy.Cؑ@r~{ }>桴BM`ݘ7.2s( : ndEU}핃RR,%B05il5~NNIc4p4PphGe+t dG|*(R {ה# ̓jd)oS)tI]놠3AkLkF#|_hud$T*6L->??Ӛ79d)DDȉ仭sTV@H)j`)T$b81ދtZ{]?t7蘴I nEedo&U=8PT<Dr#{Q|X:h-/FTu0E\Ίe8 Pprl,~I{S:oj$_BD;m # \ۑ^Z%wYW>|pɃLHXuĞ`‚Gbwp:sIi1CCPď&K71}Uo󥁓:jsx9^kSGClÓxCq2I #N#&h`qLA]O0TQC )N 5ds]jA{GνlGjk"a4J,& MyCNNhԠ𥈝Gz[Uo+]lt{މ#)Q1*/&v~"Yyñ7lc $hŘ~,ss[[ɮ#M2@Yw/GEQ~x% \@Tb~ @j9VTc) Κ0"TyI&uGCoRaK۪-}eLC#sc*}{Ryf]whg4o::Mu|xFݸO!ݞ`?BBJ+ ? ngFIV)J_:r-i0/W[XNV:z@gV(kڬ9|^c,/A* TRXA?I5 P-+p \dkA&҇^0hhq)Iڂ ?zyXDx"j)#G :ƭB#\9PO~؋㉼`j[Č Hx4z4}5}V(H7w2I`B&;S5NfY҉\ma.au')oN;~'T \=PPk^SxT(UT50:86a?uj"G-KMiުV3  UoM0]8pzCp>+ːӣ _Y=H5IJR6U}śc\(l7MUHo,Jl I9$*tUVP_Ekq- FŁ#UܑMD s"QʸFuDW `5$+w`2ON"hiѰ#77o5@~N\Fh-CMi4{915/[Q h4Ff,WYL] KxX q4ʧ |MAcBAP57NC Mf``ĔрUkqwWt;}\Cvjtf^VQy ,meq2ݮ<,!#0l? 8| f¹ 9_ehXBG Uu* N-1`[VJb|pFݓ4mxN7e^|R  !kvv_5FBZD@o(*^owOm*xks0Z^y@'BяtICG8mcbS24XL>q Q },d$h7cSlb('N8jZtMLD\~`Tݛ*.t#.ls1<7ZxƦРT(=D[RXA*tDok+3v󅈼Ro^J;1x>Ϡyl iWo˳ !°yg^I&Dw|ꢊDu Bֲ /y6蜷x=_NFƐ04kqzcyh s)y}X 4+|5U2Y* SNYhQuG(ຜށv$!|C Av(109>3t_+ c|;j(|脃|E7t<\`XӼAR{$^;̦t@]PA|Lo.b<Z5X&畊GR4\(CKZ\Va]']h)UX'MBZL-bCl ?M k/LhyC;>'⇛`FR/SE8M[/˒C{'cHehv/.OL21J1E0*qv!=jl?9WbUF`D26cMjXV<'ű|yPFda=Yx_gnliٔ5G_L kjĆ-GoVY-Do-X:%/ZABw1L\HJ9[IHbw=Po[ (!抖|TLQ)guƸb:K5ŎSQd_-(T"S;}2< D^7?ϑHcQpg|ًk| ®Ib 1bx͉4q/7/>$|6њ5"O{Α)F2-g.*t}SX:Z+ = cRjiW{{Z"-C pru\]L:P>2?~W)qaxH[;橙۟'0Ԉ]a#dUXeò AGb^YHjmrb4C!ˁςA\[*~6[%dm]c Hxl1&>oMPWNNǀ5www=Vh_-0ׂܢ㕤6a{ >xr6"#fb$+[ڀ Z2A =sQ/IH{}@2jfհG&:гʗ+T7m@H2b6d>ӭ e&a\hC\gDTWG~o6KF>X`ֻat`IʳXʁmx >k~4:C)6Bf*S'*#Ƃ$}50[ȫqu/+_ZdBSx޾}æBhfśP.PKv $ ۑ|t\Wɡ\8VB\3\CI feTLqJڟ}ɖ|ecnv,l .>~E _嗯_ᵟ~) J^2P_ki79զI,V!~*ZIA02vW 8JjOv}Kיk!ѓ/=A_Y(`G*2 FTc8b0(;"k(, 桎ؤ*,f=ݵ=G<3f'=( 5ƒJ/`XH(V+PZJ"1:kVU)8!*xs4 h O{|Z/x Q[eЏ+TƦSn{֍-!g:8CBeKc\$;6ƕMaz6]w}QW=;kB ablu \R7 !Dvdp w{(|59mMG jP-qT@ Y-’'Q J'*p=ZKXbO򜛬lES;L;a!{VefSUv~D + {\)GK8 (&>l%ENVbPTi/3~=VRh:n0}J0R00œ!VݒH˾j| t1_"0h*(991y9upj֫%QZ mHUmEt 2~ Qx]YmH(8lX%s K\I{%zJqBPbC,Dxof͔ptYM{SWމѝy.7.B B'4O HF'IDdY?:\_6&!yX,n;0 |KO5.OXG3*3 #Kՙ $7Ɨ7=t|TRgɈQz:IJVU;=%KI]\(J&]FyD!GwR  9H[\AW7Abr@9fi$i\+ Sc嚇.䋝fHAsrvָ̢kiK/pP-x 1\O~G}կ~ Hphѣ,^ ttzTQ6)БDs|2 dKYj]4N?G|.Ubw7~f^w(N5q(Y 5Æ!oZyVXEZ/868FHBvfX퀐1-nCPj+#aELp$چXH<肤 ?7sUSeBI=1 JG;MERƏ\/<r)rrgl4$*Az $=p̃BkTH[$aSxjKG=*TCظX^Lb# TMPT3B;nbqwEdO&ʚOP@;۬vp/ ˖,k,Be"|㻂᫭.9εc\Ɉ߸lK"/z_l{V[a*mP~dzEcܴ^0Ąlr|O^%)=4*`Nkٰ\/É`(],;|V!hfW [+#SF7pzH HGȧPw6Z4@xA'T_n2 */>c0; ?M,EMn!v4f#յ"s( YOƱF%f*5'jD@C1f0rZv4wGi{ok4Ťg!>˒V;[@V ? IR=]_aDѽaq0fFwV70Z=o޸0jb,A^f>Ύ(LrYb19=9F֌;) /ۿ[YZ Xg~~? ;WB׌_] ?ŰDfnӤj^pdMx,4oXv7 bn];2.Iuvi۬͑:mww7WŧF(: 3dʰ9Fbl%y\TO- ;i- n6}E 4YU?ОoS`եu)E .F^9~XYEhUE2yU߻P"=:2x$c lZ~?:;A:~>~ñ y 6>cY_B#Š’1D'9{k=¦[OU N7b[ܾc{j9oF޳OP2‚a1_b+(>Pﮮ/@o7t 9 '~Q,!b>QwUL\%_ MtZ.59VO㜜O|ls$Ԃo؃A}(qLdMAde](m"|>0_+H FQ v Sxo*'3x4c Sp(ON Gc,p;(8I'"Q́&8Pꆁ Z9jIvK(\T}Wjs}w۫W^)D)p89:;>#`=]_׫b~~G鄌3[%I aRU[5&56X5j@GH\^B|Ј~~w{}#|h_v< ?{\El;7FIrjb-N(AlCsy,,e)a3tdbWVXUԎx-\vތs F~hb 9'P.[=`& ƣ2~nM3&۴QjH$6 *v 9=:z|~$=& mZhu|ֵA00g=|ޗFac>b$b`PomA lnoo=:]4E _^eyzzd<~(R"Z1o Tvmmt fBf ._~\_^<}?:?91^{)PwHs87w߽NC̓ơWͷo^5_'/޾wwo_7}Wb0ήo/xt~>Mk9lp;( vJ"Ֆ(wX>D$Rdd_e1=9>?^6(q*_\_\\^^5G| ryQq~]wz= #Z?>kʹ;{!qq.(GIfvJۣ#mpa9I}rs dg! j*td%vG Ѥz8mw4EO$zuu3'z8?2##.snreK\ E1sTDa{B$*vL%֯=4֫n{y]FO\ӬnƵzƭ= 8{ qЪ^>>\]\'O De.M8Ϗcv e}#"y5@ 6Ӫri70weg+|< POq/^<˶=qu.gu+U*$1AܦjR(Є0ώϟ<֦Ņ F:ND+XreFRxK$Sv ??;V&Խ-ա2ɴLbc#r,&͠UazG_H(Ae#ajYT*gO=!HX3hIQԤ%"@Uz׹ f˳ZYT:&<\ K@5*Z+vםeRv@udjl6l8ʖzEV\, .lf9kCi"{*[G{-5F+m& 7c̉ Jg'+a0d$ -  _CIgҫMgG3#uRAFBuUлӔ^ˆh ! E 2qzk aTM$+EUe\h5@pW}y\Ȑ` +Z/|䪓b*[RGV$S s\6>}W"I@2=2]E^yk#랦u/K8kk"jQ6ZnCL iKĊgM(w-!X-( VI&\OIs* ~m!jhOck~Jo~(O}OXHI"GŠǸ"GN._HEϳX"W}ˏ??AӟTq k1:h"dGI={٥; g$ֆ Ku:)Eh:H37" #q`ZmzD,imY)UD|\pVNeq5Z7X$\\- ~PÅ3,Xm0HL* eYjzea Hp4B7VUGM}6Kf̬gP*0Pmz'mx9!~G6stB gїKdm/A;bsN b ,< PdK|kvl@0ZF &ƹWh?L:HPy|z7eb ]T\!#`ɳce8,$I4tଂ;q(!mpu֝ MγM-^x\C3]~|kKAZI,2)+zٔD;/@_!C!`$SicujBZ@1pHYSi1 }Rtl`f; UX MH/CoK|y٢{mW ˿AN/`p(xh`u95ktu15%f  =q`iry RhP7eplE1_'qfU1n?g?*Q'"E>u:RI%h|[.5G>\JXe)971N3@=Dd`K,TrMV$eXB䌴wf[H0n r>#6!k{rf>*1`vkz6"n>,j;U\1T)^4I6NdΨ1VVgdU0$\ "CŮsRdA r2A>Lb$/y&L]Ũ ר 9=™Z'k͹V_b&C۰lM XsE  WJDɎ"Fpx4QGTH hv";sF]T 3vryj[rnHX |]?>T&L]JܙijR0ZC@ M۹P`<'^]`O?U߽~חWsU;F*c+Ѩc9eTqxqԱ[u5iv ~iR;)lfq_]l!֗,_iU|8)u 1EHw/cuS)C}4Y=L ͉ )OϐD jy+a 5'>K|NAݖ _o<ʺc`V(FcyL+u Å+# Ҩ=a_PIY[BS]&3&_: o Iv9jSaαGGǏL3iqי )ZI$0ԛbO$$|^\iʞX N;cVzHUHU='! D▇Zճv;A]FV\j{TF66,:0*aXer{C8-,->`˥{ZqBy+HU&P0ؔWQ&M0E;idTQq੃_Fs͜k!õZ!%%MB`" >e=4a#,=z`,~WނC ?^~{ǟ|GA)WWj W7̑(R*܈MhkMExn@̂vкIM6C/ vJ(ĉ[K '.n3s?UmWݝtQgdX-%VAkg+&Q%]~S+C%|6XeN2;nh֫VcPrpa < 6=ZPÉ;[Pg,5( W:[aPQ;#R 8Sv6叏=Ĩc8Qש1: em׭ݻ>x^*Raq4 SSVO݂׏rl'E< ZA{i0(i Y.4w?fTjq9Ҹ4 ATX9ic\H:]G] WdHY hɍ<ðtIPF4N[f" |4j^dsi舟!e61H9pl"4ʒ Ĭf8E%~LyV/Cr#~M*T/6Usޠf }a7'!flbW.pȲQ [ӻ( ܻ&D6%R@N켥ֶC5)8)lաz"Px=q{Wc|~-Tԓp ӥXDt]b D;3G M`$#PNF }~}r؂3ao1&e5% o]4^lYCS6b[,]H᎕*V>%-~>eD` ʼ(rWv)eFoa|c #Y? Lbl[tuÞiҖs7Bx8 wN]굦+% $;۽qs] jsr\.0q rujƙp/MVA ijcB duidO˩w7^mǙ]3n$F [oMV7M1_7CG2j8]ZXX%9em ٍ,t\Pw/!K;YƟT57jTG%?#R5 whݑ k \-Z6  x1R公f IThGU L-q}ڼ^*膞@+R,z-R0#ɇiK G%\6LH4^^~#eB^k!#EMQ۬ 4x|s$r1a<sz75M6؂HftLܵ=RZi<0yS;׿R?@ix?)y1.fGTZc f:cJLtnpz&ȥ?&6`UD*ʡȦ^@6#ɭ5-8wk Z ,?C4R.sǃGۊB7o^KJ^gx~[G'g 6KP$Ι%uImrN~o)v/\ W+.3KJ7 2{)$2pgmllOp 2Dl0C Cj46>: Ea4=Í.nI< =J x1X p0軈=HD=J'|@[+<$2x$dTo(r Ng爲 7*k.nP[ t82 @V8M`X;Gޜ`.-[t,1U\8’YqTC@IIc+a8#\s ˈmڟۧ/6KlaBs2WQu!5uvVG\y.b%~GE꟫*ⳁ6|O^S ܖy_!(Tz.,͵dA_&ʖ4ӽI}obvY'ncQ6ݜc ݒ58 Glpavl_qON@iX2zh&"{vz 5K0*I32dT ?ۂ% [H"iG ɩ7yuޯ&Z<&af|?gEEYt19ibj|£xDS+T4%5=6M(@ à zeO9D60([69.p ZLKkDB-ߣurr[|ٟ֟&8?jSb3DE-ȏ"֖/*392ya^U&6 e5L$.Kmf$3>IF3Zz[U8NO`aQ*7P;p:#^\]aHZĵ[o#r$eҀgpj&)D![ŠV-@N$7SE_͕{ 2~9C..ΘiJ\") f #w8E_eٙ>Q-8?5iN#RH}l{(Wsvq%&* o$#_<NY*ӄ7b=x`5"1F݄3461AÃ˂ ~eu1k:Mu" p8DL>M)@1YAN@%w0X+m^KVq= 5TYWVF?u /DV3x슎hu/#d厦4*C)diϟ?% mq ȱE O!\m<{~믿-K CfyFCk2o }QBX,ȠC޼>8T! RcVK@EYyGhmT6d'p.S4_GU߬L^p֓{P,K,H0؝0 fՕE228q}1ٔHkLMM 쟟̏K;Vt|'&mNB)D l쨨F0H':N4- %)EcjN|8}yuYFA|u9(.'A%4ۡ"IJUSS/+]. Q]DN-|Q H0+O/5\?qx[V:yyB.^"_8ҕM NwԽ]Rq-IaQyh6K$ 1*X?T`S`{\R=eSv+ O?Q5iS!t:eb5mY{# %̿N^vImo>F8SGh.z(f0/ʩ?պьwA \T dF"swYR&`A$`ƈ4WT%Nhb͐ zM3f5üo!MP{S o~~B]]hݷDo19)4gR\}n59K+Ri{%78<.>Kndj& kr8o* 0"B pf* XQH/CV}uWro?,g(?؍3{wwz"ۭŇJ}cI/.8i<7lQZо>oBDJnE"ETp đ|sV.`NXOyAlv \@E`Cɜ[rH/K-W!JvNC?=x 1̊tċ&6>}a.ș+:JP4^~{{z%?9"I+Bi!VG9TGeb8&3͕!U%H3rgb?ϡho!3iVKXOj$ XzBJ2lsa4"1KX ƫMfXczf grhۨ3͍}XpZT')F0ngQGvϔ;f #ےᄱ{F#)Qbǫlz,:*g_ULr"vJ5=fͷ%`QG ) z4FzڻJ8xLYו@0 9m)eu9UC 59aɾ{qwW.D0eދ䎧Ff$:-RGE_Ya3Wq{R7+}-BD.LH\Q2S(b|m~JR4:d,Ʌ6: &Gt_|%o[$nrr}us-~@5x#*H=Tr^6<ðҹ%Y/rvb+9pJ,}"X>yf-b F.ל $.% Zb_P{W9itW4c}#;e^m+*{sĨ`3}wWM"kaPiu"걯!VKȥ[8TW矸g`0Y4F8K9xz4MbSNȣf5-HS73uj,ܾ[mdzj]!LjQF>ts)wݼ_}ʈL)x$vh1:kYcdtR`H X"M{/ǻ"'ats2[Ϊ>qpsdžup:fRE4:[.M:ezK"8Ee6 \ew?w&2JLYI+m Tq@Ƀ3/~_H?1ǯ\Dݸ]uP|sYHZO|e@'l[j<μ,ТziG^r7gj%zI^q4*t4_'Ft~"6SPRoG.B1tOT vb̥#徠WvCea4KrAfYd{.vרnm'S)j|9ރ^8x R9Vuڛ@1\ ̢4oNnEb!1{sz -:Wn N5>k댑vl`CvgC9M!Õ;|-miRNܓ&#ϷTefިBXW-]$٭o};^p|ކwwFLuP,%خ)$q j$ZMsaX.Eap=DvD <?+$xyb)G/ϥOhtžِy0\^_F5 OW1ի\X|34Z揺~^E|G (IjW}|0QdjK O3he%;O <]RYURb/r b1SD$m}0̪~zo]WC*M_9q+qC; Kw_{j2*?HUMҷ\W!իrO怡MVOVF5\Gi]E5 Vӛjy$9սXitȭdܹ˲u DVU끼} $5%XcpK] u tDo9 ^̿-7q XҲ-`@>q+nLB*M\n+ڳ)(:], G(:Lv8N~ @cFEF@3N?N֑s^<t۫9^%"[(9У`4/HW% _Nf: _>{W7߼>jo++2<75}xoڵvB5[WwL ܳ,.E;>d`-2ys*6\K>(*3(jo< A4RWJ$0濙z,R9C(CV//QZMO$uݔŶoG=Yosz8&Y޼,e7XdN(HI ݕ!mf.ݷ@46!~ᯅ Ⳃe×ӧEd #{lG/؎zq.8tpWoP= sz1~rgƼ!'CV;{t2juoL8zԠSDKJ,?!jbkKcu&2QDUQPF=e‘z-ċ@O+7ߡ-~|iӲ;Z["~)f h@([YV3,9ƃGcNupRH}s$-rJpX'+ҖG zW7 d<ҼV:T!urn=۝=/5d 1$9Үðx?t]=w7AF݆0??k2ҋnn+*Dߢef5ZlmC↶ٱf1o9s{l2~"3i'(ΘfӢ|@oHO$_}+,n2%` (lSVIǻ$ygER=b솿Ιtx1f:`09OX&Yœ~&vU{t+ܑ^RCDvYCCf"aT?XZ^+LLF(,̭ѵ9Ы0 [Fi4㷂QXM CCOF0ҟ\a\I$!M0KxCi'W;5J ,p?_ s \yYۭ\*-vOd}0L7]fHS\3m {7^1xޞtCDGTǹ? ~GU ,}*^Uim%K3%ܙ#mUj ags;5f\׽dG6ZKM,T#r$7yrE_pf$fۜ7HPMM}ə.}Z<68 n4 fg:"NJ6pwiRV6E>f=و]|t|j [J3 (T)&1kYT%g}rgSyKa;0~EF~ɤxݳ< I4&lTUĊۧ%Qri@Є y)T+ )U--# #a>&y^9`*-ȕ/Îd~w3b`M)j]|.~L!ɑ"[Pйl\>c?4:iS SݠQv0ȹdCmlueXz+& }V==( T(IboEF `Ұnydɪ)'C bbOJ }ElYkeLJYIJW]1LL|)n͝2L6]ׅ&m}9cªFDwogX˘{fPfQvԻYP vD;\ xj6g(Cmy^{mOh"fiAcFNX)b58[~Y|4R:0Snp*>D/h:vt렎LrwwD] @ugϨaHN>:J xf7 j?(=_ c5+=*}9i @d<7׷!?< aP3#۳G -P_$ ހ|q{bD/]~nqgْN~B.+~hAoeB2)@vHZN^RYjl;KvqrӳgaPyǣԁ@7 YF1ƣ*羋w0R6#ǝ缐7RPOVoSp+qP)Fi"ի([25=֌Oj(N͟F}f>S3-,|K³&6_Zv"ؕbJ>y#jE“ƭIXtշb?1vqVhmdk 3(ʎF!;Hi2%|׎!{4Ãz\>EҊ,cA MGT%u ;7zA38b' cAhCb׳~W,[P"clBsd/F) GP4Ruޓ4.>R/Yǘ}MI 5fEe9j1cEHM]6JE6B5%=KhF~aEԎΠAD;Z5iNZM"!m/*j{څwK xzC0Ä},cG Ef9٠ǩ1W$"HF=HpBU/(ҲA">)έ̶-[9Pidj&8':!I@c zF]jM{JPKcbhPeSY'ք bY/mu_A ;AQxHT 7Eg5w喚@"pK_|ȝi. ,EOQu@@nSz,@vܽYh/ï[A/a#nv٩3+%+k?ˮ&^0$xeޛO==lw$ ō>*쒥|'CH~1t} @4c7ey$V k!4fb{K+\e4Uξ KzpgA($$~ܕXUI۔4h{Ϸ7+qߨw`;u54Gn5)RwɬCsƏ,Ɨ9')b~$Ivq}a^? GN_KΤw ٗ? dOd ?[9ɼA tHi ycYۗiJ!TSam r(O{LJр˃ӟi 0)4 kyBIOT:r)'DE¿:ӡƕs^fHb =͵r{vp'Pi }H@rcK6Y' <,C7Ne+n\o j8m_(Z[Jwl@:\f(Y9EO4ᡒq{,tetmF] ˤ#H4wo>҃5< ŜÐ˃@RBr*q XRMW0q@j=i&]g.[Sѯ w6cI +Nqo 6p͉S{~\ Z!X"p3}DceY0IRP(+;O-\J]G'$ךﰨ\iv.>\id!N陱DaKؚ̯=3w}))R5--ǟc\vדbI@Mx̡ 5Tzk(,qtMvd)}TXI1}N_JqaH1þE)\^1Ԍ}#})bdټ/rh[(ՑEP _'L!$cl9n>x)0t 2^YJK(}Pl >h}YCZ>qi!qLw7[ETNsv]=M{ܼN*GɧYISw]r|G3YU!աZ%!H_rٍC(,),NwւMEDE/xq29\)xtB1iYSF?fw_\^rH\\K ",w>t3ol6%Цv*w&Ӱo؃ *%=a  cϙ-R:;M^DIjǓ6`g Br(f?!:)%* 6+aҢ k{^$VPK,)5aquA NbYQwN^Kb4 BJ]A9'h$rNqPCىneA턤Iш* qo?y}t8ax4X67ݻKTl{"ԤN7mؽ'd g72883 =C>p(x)Q'z@#2w\EcJ,mG/̛20 ~0ݙi6R|ItއUQȨ$rRdrH4r"*Gfd^"Bq=1\Frq܆ě`CJ/x2^]X{ȚV!cB̀h͞ﯯ.w6ˋ88{vD^v%fZH*@ZٙRt-R8 88Av2na!#G*.q?y?O?Qfy!G)tZ\O['ffE]qNsH*wN#\-ӝX 矙|dCص7jZ[6kqs}@tZXk:lʟ0!tFfB![ ihlr&n' !bY3?780'M: g€%X(OXNQ184 ٠VTffmjw4H`@?jcyc/ SP=EН~rA+ LBS'Q7y2 pe=sJ !gXΌچ6N|PÕCMQfRW[:`MH_zbĨyiRE q _'je6( )_vjӚ%),[7TQ1Qh13aڑ 䓷O?{tʬQi柱gxmD~2xqYPs{dwbр֬]'qL3mmCWA٭rgWdX 8l@7eƹsm$m> Ɔׂ5S~:ǿ-s ǏO9޺}maM-/rUI7IX>eȆ6QhƻsMի}vdhUyq&N"-6uqyxq1nChCy )@(v L56ͅ YG46|Xd]z'1a (Sfq g; ‚J1dU3F] վ@R3=b}ukx`kVg*rQ4춓HWp͹E]ȖuIezƠ/N@bK_{PA)9Q)absY6ͨ_<1<nB5ɢzGɞ}u 'mX^T"C;ݲn@VZJ Vړ$ʪNg֩qw\tЁ78L%$ԫʽG{rL}/x]. ߉t,Vc,\rX:V -i{ƹ8nDI鸭K&O7}ol?+D, a1B! ־ fp5̕xýl%֤pKKQ?r dU\]^.SE7%bYZΈ8ݶEK gGOΔyOXP85vEkV F֨%%ݨJE۸]V,,ʲFĦ򂋷h( {n u%3nf . rHS U^FTp|P%gEWh]PʾS-씑JREg~bGR5~i";ˠKJ{kU)%䢭8 їs2UQ ͡_xWF-j5'0fKůclW'FHb'ɈTL]iy׫I>,EؕE, p_!//;>;ȭ7cDNR,hPr|๾$df#+)5\aJ|Z2p}hZ^M'1NFGjwfhh?H:ƻ&RI gZ[xp鿛A%J2 m-!O03$Rf1ݯ} S1g ĻpcZҴɣ]$6n (Z鉃5\P?r>RltÛwgv[Vɇ /?/Eeǒ}ZO!N@M`Xp2u$=Vgǡ=,M7hʔZp4 uz>qUL[:_ͺ(r,QT2ЕIGC^uϕ4]b:>%XD.\xAHgryD_=UC\^OP!K=9<8>Cҿri.ۣ@℩m%|S6O\PSzW! bfѠ5w>ܚ \]${i~Ä[&\^"-+9]} ^38k)dm]c9 UG5CySo~ KF _5:͂w'n?> ֌ϞNRd=J;S|@]Rdu/4h\9pte2ZFG_VLHuqxB[O@JdZ:JqB*a;c1yW,(!0f#mɇQΟh+'b@A >%jR3S&*8DmeCU6c T]N[q]FHfjD~$/tz_mir3FS6ðEpssJ^̶&5mb{",FdOV*c0G;UK*>c%tݦ4Fa'ɴjG5 F29S4E;v916'/}/Qr1딐i%ADlti鳖ejFS6?CLLZw8_q8UPr S~)^)у䣗ov27Ö-LՎkפwB6f0TWbLrXv>S&4&A3*.A#4;r&`X4ʅ#&i—/utL+)zՈk;5}O `~AwKt&sZshIxQW5IzkZ)'^?_m {*iV!?yqOH*ZEx",bUɴZ!Ʊ*?|jpby]Q0B̾==LcZPd׻K+Gm a*i漞羅 co5gºcWG~k[ޛromN^9 G!c -Br0ad3cxTVsmK- ) @$6܄Ak- =pTOw}<W;2mdRn5u{T2"dwU".5+OF'k׸?TFb~u\YiC%9BehLNCzl;Xo•{BT=r=wu|h<,gR%gy훗9kN|F$ OLPKinz.#>̾CZP^3(X ({ e_{W/_~ͩ5snS7*[Lc==7QŖA-fjӧSI[pwǐ=2Bo%U}JSkMYתZND Z+ihXg/_Q~(`hf,a)?p"6ލK!hsTۍ 0@(6Ht)zcXig"8,/_=?MaʱFAk9X9ꚈtAOtgy$JpAc0j2%/6 Agxҹ]xm&ogyEQ;Ys>IIts׋)ehu> ɭf,m:2*4jBsWcgLLr-EZ-~H\uKɛȗ] >&W\g\}EY W>VEg\nŒ[^>_ȸnh' c+=Hm)Mn]${ez+l:74Ǘ^1!8GJEgO?Rygiů+{h 1#O {&,_~|MvG.3޹c!Bu<BJ\?>2զe8?^85f7'g):萰:_|yRv5?S|A<:ު)FD!$ρ0+,ubt"T[u}#[U ]ѕ͛Woi]zwf?>Mcbj3|yffÖQ-Ҫm>lXb@̗ w 3u3Uຽ@kǜ%/Nf?FHe[,`wÎ9#xVߓe6,l-C}b~Zxe4|uމtL#gkDu VårK 2eI;LN~]]!8웻iy^>eWKEH2vMQ$reG} eF 0 d7Fʩ,V_%*D( bfvvvXMryhƺU`6}"> ԁɩO%h1oSQ ]XM_hh=sn>i|oOSh=vo8R%tsLͩ&^I)\F9^[K4eH寝"hP;czO߾~qz <`GPGi6" AZ defڈe]/^\lA!YKe P+F{ۓ;6Iql #H+6N} N?;mdb8d JhnVӺ GR ^n,|1 ]iRpQ!)E-S;W7cDj_T^~ҕif4y+WrvF>-W0vڀ]A{@rx]AjJ9_&hT!$;yqzvv2$bu*a˛h]Ao3Y2xZndXulcns\7ncI>n4a5q >a=hҸ5_^=z3?xy{yr͸] נu Mk!79V*E p1%ǟ@tHvKr|¥XǬ {*]riR#C GK!ʨ)AM܌2RF"AAxU#qaD3>SH&atу7s>8HUzˆ쉔UT|So-9gq^ʩ-D0{|rb8w 6^u~z'Oљh{^o7vlRљ#įx:[ (nMŸ*:SWەޛe+4bͮh,p@S"cSP}`X3B;olkvWW $l8proż\ܠ*]$/klTŃ cJ;pX 4Dsl9n_<&0R1!)3|[D'rHؙՂ#Qyӗ \<@ c(3B{>Ǖ2i6\ *T` jNOMTW[Juh@VŸuXd7V[9hŷmHK=էP40JruWV/F=:ZcINX9vkצ]w-g⦕X;+"v] G'вm5QS~ե$+ݔ͇2s}sDNnjBLHDދ3csq< ?,7VC'KDx"sƱo!)TUk Z^@ad +Ox~)SN:OLځM-j⎣GC{fqoQlq#c0Y>}V9rxG2C+Kh5Ֆ/r'dAesp{N 8j;ҩj#K_2޼zmUA4{zB08n@ғ]HoCcI%e@{ +-M6r gQ/̓X8lzہ5q,ܷ{ZUnˑ_]ۅ`S,FipFdDO^@[Mn4J^*TE߲C碼ܢӰJET(hIRhy'C$*;d^aroM&:1m`6`$ cWﶋ<X| (8A-r |bIJďBwTɉ-CYw#L;lIa,>דqv}qm+)^e/=$F]ۋҭi ̸贘DfQo")?=Dc'ǛUSS>  H Xg]8@oϦ!/#s"vJc#AN nһM)43zZ u}\t)y9Z iu:C~x>a/Hgw=5ӈØ+)͞c~AkBT8W0h9li\WM鸙j w<'kFl 8M7G肑p̵aZgizw&4ö+&eJ&/8R1ܟg|OaqmK۲nfXBKx9L ws(5K^zzO//"XNҐO#/hcD%/Vj9{7fC-z82p&錛GlgIRrtɡd٪׵ 9]qGUωGʑzL5?Ԓ|WtE|4¼L5>xU1=I'yo  ɑ׳PqvTW5!΄UCrk-R~Zk艜C }׆*siIoO9Pu2R)$3uw;KVw)cg޷)^$.)Kj9G͑ ;'vQ+On=h/RhEʗls{V9s;"LN|}7^}ɛ7Z7]S Op. +~F+ƃ=fL_E:ɵȂW~1 Q:g 9>fPQ>BK3B۱N-[D{AeO:,Vmlʊ@[-E悻tM=oTZ[i[6{)z 0T˜ n)ז:2JiߞcyYtHIԢ#u ShUUm z=hG4\v`?r'@_ZՅ~%+?EMZgM̸47V7 vEN3,h&J5FS;O}+;{6A,Jԗn/y3mfX6exw;:<[ HTW.snoٕTؘ!ڳbqX#We}P;W]֋ubjgTCFA8=Nm_iOyG1{9wʉnx[Qe+m6/jRӇAe+f*rnCσ 4 qcg&0y48ڹ*(je̞/hؖy`n#;\D#Yr u,OZ)C /6aB Bȼ{5\u7ˣڤ<735ɔOduN,SW)蛓S o limto[mo?:'8^J ͪIUQ?ɏ:ç4QY-l_ƭ[uz|^0O \|rg`k.(4?Nlqi_oQgҶTaҼx.oYz2L ONLP nJ0[1gH}_}m~3 ү_+n'RLZ|~٤mg'zVtzuwK,%t W7yڽp>0^e{"6?f,\-fS塲[n&d! Q Psr^_6PjFTb'鰴Xӡ$fa]WQ?TuUJgdVx4vƋ4~XN}ij6FS\ܣ^AHjyϸFE端t#}kCF DrˀJ=C@?&3nW: f^!>}wy׷ѧr*wSeD'#IYC: t05 bɖOMʥ؄4U0$Uz0` XK "ꔰD$5ʭ,6|FaǧA.ךdsu.0;=l^VyX&SPz';Ap,, u..-2Ÿ32w{r_6;n)@msxƤi뗯Cu7uqO&9 `loOS;"V`C4?{ڀ'DN ˰N\Ssy>>nмjcv.!M gngB?qngPl[ .SLtLlj9j`5ahJjo{0x{x2rYԋ; 3ݖ >)8=SMikf{sUyz`:ލ]I%~k(\)uu-(vK܏&8zP##(/6Qİ_$j3 QpMR.#(H$.,"\ҷyr ov0^IX^'dVpN?$,eo#rRzPn-~B ]?r>OetwC¸S]n1.)ȩȔjqu᩺f.4zpb澽?cL1ܧiei=>@cr *("$$.%C {bq4MF?TJ~ &vu_g>*m򋑂ڼ~OD:HC!U}+!v3F ٘dmbΣ np_(56F|08CWw?$4`$ Ay\KD sEkc~N hx;H\Wd]^1*vIq-OO;sZN30#Ʃ/PIyuߛ\oe٪+|mGy(~OK=Y7T98e'Vø/br0AX,ߓmz|xEKs O 5uFKowۿ[]1Bz /b)yL/&Gx@$ 11 Bv2} mfzʈ!W᢬jdևY:)i"1A8/}_ۘ;ir 9GS,\B>C߸ 3[׋ݥc&|4c?.|vҫ7*g%3a%@U2FPyI egNjL[uvA?z>ck#өNÃSo(2``iiZQy8v{,[7 =@c{4*D KҦ HW+K+jIL̝Dx >:@XB`;>r#r8H(LpVɋs?53(, סaQK''OJvl\DM8މUs $p Fz&聮ێLH{,؝&k4t| _STڃR%Z7wᄎʹBZ&>l: X$r ̐I#@OԿN@`}Bdl^ϰo0;\G{^VC._yW8Iq^zw21(4>q.FѡhoݮDp(/ͩ31ʻh$'AS(ePDkG?-K nUekڑu"搧4)-,T()XxxJC, {:f5t0wj`1pdW[ C"O/ %!mbB[ f 6hhQБb yt;*][EO/mAϣvR8KSy[jLMs!FDBz_hQM>6(n꘱A[v M2p;p'a+WIʵMc $N)_&5Mtb/ [{4m4ʏT7MǸ>oWeθX̠ͮs#-ۇ_FrIioE "E( |yu&c#7Mӟ4_jT -4]윲rQ6Xr=y]̜kg8/<YȳuVXvBhHn> f.[`E^٤4nye1c_[kRZIEDLƬV#\x+{ލ/%D=e4> ڟg=?.M3K>yjmpx~~c:_tb;3 "ܗ[db)Dg2VePX}eK 4nUWSf$M)o( 4,TĐHhDJ1[VѸ=-r${~ezuD"k+qW7N8_! u>GbɒdNoOO8~vIJ i,Fd Mfh>>!x86S{C7]d &XmŃX f0 Iq%H}ųOR9;nsZCb֋2<9 5y;ngQ`-KN} XG4Ewq56쵥6 Fo8L?mvSCjw698L Ru FKqjgOVkv#'fI1ɑӎ)T"7f~~H9RB*ϭ=YͅG`M3 h l~2Yuh//0V*,e% Z|rda;ZMy:Jv94=Vw:b]>}7ձzJ"6E'3Rٍ9M持f-g~ϔf?z|42(+KIbW8d#) v8k 6&+e'a.rCysB238/46- jHdP8]ѥ/y쐖5T@ޛQn$3=]S&L?\]R  dcB^?&Mb7Gͽ>T97(<{],:F|*~qǮ;P#`0*O3wHXj:e!W> 4h*:l?ad-R:VٔMuN'6mAnί7w0%džn]mSݣf)NG 7w˫q?y\P#\HFcQbCX=cz@.YVhrE?qFk•KOrl0}u: )"vM#XMZ/Uȑu?3i-.}ZëjࡳK)jơɪ#TriJg1ŝngK9xyS&5eݏ qV\wĪ%R Xh/GK(@ٹInSU~B,sW"{EC/(印|O}};Q99&v#ʒ@ Oܤ$Q@x1GQb˫UYyK=rifͬtQY%kGXfaٽ/T9kolkXt+M` nMEp.&7iee[⳿%5 qY`FJg.x2S+j[X[ep\^q:֋ս 5rREJ;fE'|X!wULڒ : p({;URԣi=(@}&2wyu~-XBw)ro6ʴ=]EpL$q]ϲX O8?-YN?f? Wϒ’L!27H!և%9E<^+^4)*jxuH%c֨_l*̧kfwZ:S$8?. 1F٪qUBq%#KWjC2N|/U;3(qjrV+ . _A!En#|6d7UEmtw(ʬU~t5QZsnS^mYk;mj?sgJx&ǁo} O9ݧNVjF;X=BP8{1U]pDjH.UIH깜uǣwxJTS*3׹BwR'uқ7T@?Q T2nV],/´#gV ?r+9p]VM8YуC!&Y@D 4Fk>sp:C r#_{4:0AWLn(ID9SRGKjnN^yROk˴0½&HPK43dMdU1gd}gr>cٱQl]S_9Oz{OcGF:lс,>h'07ۇ87Ovؽ[:.n=my5mTNm!QO>c?_|N- 9kߔe6]U5.TmO{'q?{sB:hƜ=ڬN_ߢ4u@4gbth%^䠻iL 5,gM߾93x;>y;+ gq^跿˖,M}TP1HrR MIJHoj܊jwP:҄^yGOubꢍuj>KĴƾp5EOM']119pǘLObEqiL Hмeӵ>y/6&rK1%[w*E.b=A˦:BF } ȄJ[(zJļڛ0GW/@"B5c6l~XɬZHJ{"[{ěERFQ0*"^wu)%S~h*4qoΥ']]1zVƺ܆H8 Ev2vPAKqmC5Tx)L 2esX YSoG[$φ"|'2mZĉf<4:"}C{?Tl:W+#7o02 /r&Si]kERѧ#w1A]6ELH1@YM:|5 ee'!K<֖˵ pboA!>ÊL2S}LF*^U9f }cB5eGۖYb%&3[vn8+e3D:&2@vFxm]^8i 7J<݁';ĔA\< qzȅjҥǽ6ChHdW▫}NUsŝdYƺYJ[oK,~'/@r ٳO ty5p[=xg.-â=|W"S ]{cSn,(ı4u$^H 1\N2;oҰo5[G+r\߫)_ r*+!$Ҋ.kk|j%99Yr|؈^0|xyʉKB$cw}9}pg79#Nޕ6$}fe%f$'}^IrRt]IlZ; %j =`9V=?7e LhdroXFHʹ ȶ)օ9mw/đ# r.RD@_Q A1,Ϟ:Dm5i6͝dJ$^mjrp+^`s $ IIȁܩ߽ ?7hkO1ѨzDmKv*d1(Cuf jɅYТ[6cX(DOs^,|ćPr'}Ьrʠa}ݯ=J"=՞/r/ ]N V\DHs (: :_5SA$sʝ˺۬ԜX J] aX0MsюCjyC ˗OZ  CK~m:quvm%}nq^ۍcUѨ@쪮e@*qpWi1K.k秃F y9{d՛bi mˌwߌN$yϽ+_1 V)OX6bnNoH AF)=I%gx4<{'^TP)g-Z66EQe -~=%Ŕaȯ jWzfɶ߰@H]bd;bixbM;kJ]>Q_},Ίi[$G3wpᴝ7ϼ eMOҟ"pOtI.VscQ?R%8gl,+əDC! Aڲx8ƻyxn Sh=,s5<0jf Ls.C^.2vi]gmLvi9(=yvNcINэmX{k崝t2v|ysjo~?q2~mp/arZ'HBpfEӋP^AHu b _Oo~EmZe\Y$X۷ DďFď7oҵ4upPfn#LjEm!;2ʛńDT,H\N$f 6WhO_0$9)݅_x\.s3'[8;d{!k1_6-FCrDq` !˻p_;%k9c2ϱ :Rr|Sr}6TBg`gm."W^ECjJ'[GY۴!&_=;;=&`lpS峐5>{FZBwȥScY3.dֻbEj -lILJ=bIX(_plXS&՗Z$ku3rP'bzj[&t!Ս3gnH!nPpbgO/?>̧* z1e{^49naBgD H"FBw9۪,5:;Y~k}OR& S'ZCY} n7DYwٵ԰cYU6V`໱fڀm26@GU0 X#u KUcpu[ #0vK#RYml6߫\1L^ӽv{m=ѩNgGg% mh;>V̵Bk7V^7ݷ,r~`]-aU.ꚯǚ_;soBЧ U8'݆kMQKPnxɛ2uCnE"v;/.ΡN U*@C'KNb,!6 ^<~b~V&[:]8TPW9}|ǭ(h6iu)rT!3n7˕>Nwۼ8٥F̢QT}VI-M$Gl(DW7@C?4D2~ Hɬq$K:z0o4?I?C}1ݙcXGĢMٌ99n'ŎU Ws4GBNQD{2Ӂ@ӄO3 %-'1;Mo'X(ȇcgO>#0Ӧ2LDjwS9*dX\['Lì`E>2mr7%̿͠r:9mŝ;gGN p\4 Z{=F~9IY$1Sgr{ϭe|{5HREIZ7EG3u EUdLm;ghX >;#ϧ邊Z~L eX0<^gt-֪JR$S?{+wCȜ `$)ܭ fbVH̥hmVXk[e?~jreuaXd#Z5 #ø h fu*^db䨻X:zuj5ܐ+3ᖵu!C*sM+4.(e>>s,h |GE-Y Y,ʌ\ifo\/A_?[-+1,)ts __ťllz#ΐ5#ma1̬ߙ.?}ߔ-a5m_w%WĶv g2a5>{~zv~rgF|!9_1HxC=ǃj9ۆ!iefG]ā~'}ܵ-a)&:`4?>ռx\w߱=x4oX;+hdC6ig%6Ns^\>6VԽ pAZF;E2ρLU5(N ?L<>I@ՌT9&9&;8;j9iJgk):p1ݪH-c -UٜlEHQ5}oX}7d$]ǟRuΪ^E1jvs^ouXC;l*igmi|z|;S|JycH] 6xс۟F/dPus@MiXtGvG 8ͅtmn%:RKa*W^5wiP+Fsv;/RK,dJnX4Fqyw7ުd::qv vi56~WI.t>?Aj7c\䨖A7|9 L>Ǔ[V 9‡%F&ͽxj-7o=^PձZ7LMOX];QU V6c*Ƹ\F~gN@Rd i-ddg(XD~ {-g&)x6UW屮:o߾ITfh'PDP@^,wKZ kÜjT]PL?&;;A{$b})_o(a(~IW :Y1dZ` vɍس], +/)Q)@uIQPaF_LrD^΅P={2vwbDVȭ+1rQ2=QNIʱ܊o>Ųn{W,5 jt>DV .la U'6a*mbQ (՗Z*,\I^)"7 F\7qt{|e )JG*?%?XjW?:c]CݗB@beю>(J(d ۭO،T^4?mӗ+XJ_HW:R[A' 4:E#:yC3j:lk%1[+¹O C:Ug;g?W$0&؅MF_!b[`0yvrX@l^iƃNExl8bbod"/6:Z:c걑8Sȸ.~qh?mA,%:"w#%cD }tw/ ='=ap<{xrסlW8-/h kUvdkǴHpU$?ߣ }in(ϕ_;ԨHdEѲu":{r!{HaIU7:j7z+vyuAt,Z>. vkmۗ\xYٓ[)f:$nE3𭥍C7]*oVp3i;NQT9_.zc8&5TH@ȀcLz-7͐Ž8g^aҕO(-WfQ{h6aGOUl)le@1mW;߰<6f+g܊dwЖb=51n:XV{:+]ڤ8+z۝KR,:O\`j~ߵ5]FӱUOҒYS3jj\#Fkŋg\X΄Pnv9n WV:֫Tq+g_ܡ3<;x ;NFw7 "ēs>)SRS~4𠔮ᣓ$'yYS'JªrOIj,X̛֛<3u뻧$)*|M/foլFEP#a2مm7ɼk *z43i?BwRn?fjFz`ɹqXJpI :@^fh82!qN ᵡ5S"x9Y' 1*n-V^:h)RGD8FCYVYu g9o?^HH9֭͂%붋Qf,Dos@8;_WtP3E{vS@X-Ja@EKfȍ[2-j*r  b{OGz-ώOh/?}L =-pv'VD[kT,tʴyRn@t; v$3>=:_?7IT5=Thߎe{ŸlC.SEuKJ֬L4;tZaz9l=nKO=?|+MA'}v 9DmWs %.Jt%PZ<tMݱTu:=5 + o'5R!W˒ @m s}xx`.R,gqt`]8+)1K{*ٻ fEQ~\+$gBhwe%mLL7zMuLwǭ[}#RMa*E:>>:Uw"2(\pzj K:64I\ɇ >SRtM Tlv W/Rƺ~7b Z6=S FdN nˮŎ8-;q má/ـi/~ +P#z-j)$ɥ20>a^ D',"ѩ ݀O^3)"}º}PHV'pЛ:CwGPwZɹ@q6Ÿd.Q>eHLy+_.cŜ-,NІmD!%'Q hB"1Lי .[e͔h,fdH!fU-nZ,WGӽ_@1pv9 O*9 螏.bAng}#/?96BpY0?VTBHg=t Ѡ 5s1!05N5=~sO8vHvvyJov2O ar0^}_2\:)NՉ j[{-]7_`h\. 9j^"Qͺj8GT by5AګڴY݌BސZWs ~ٓ`_~&U%摋0jpœ-I4ivPzlEO_};lGZ!8#Fo&z`PZmIv($znFGaZenep0]9>y DQ8xð@3-ʹG= l0{\iflyY /s.U !)1Sn9r Վٳzin_&a""eY ;EXW[Vٳ`9KɶaH9OFPt&$%p o6#Vɍy\UrH1Z2 gP%wi/jGrJpIՖt+e ^8=Cv{iCq3wqV Қggru 4Ǜnf R (v-؊CϹ/U6,XN{ɘAu>,7"A/7ibF":1vT&F?\c}Čำ`z2oQfa۷iR1 D`z{)ϛ~zR٫?LȖy_;ͣ3-@x0g;>8:(4͠'1-G"17;EJkr{by_s#1 w-7lOevJd=ísM [8.Yu|7P2(.^s/&[Cp#bvtDD^'e wP[Q8y=RɟeRIf-:OETq@y+qKEZ j<ד)rPE£8tWx"Egw<$!.-N@} :+ɠi[ r:j ɕH.//r~_qA-h~2ݞy*ԠV35?/8sg=t\ %n}S,><+sG~2$m HXX~w\5]0"3$Z>9p|z"'w Rq$AnH^ 躹Ԯ,jeTojJouة}aėĽNjpZ:1R$?x!v>Xi"-զmyVg);"EӶS_CNn/Cllyb"b [)7˘񭠂MƇwN[l%s#:$DtoñM?ٓv99G85ȟ3:޶UCM mn[tn(AAĆ-}>~i_^S$2n7j?2DtLT2ӦXkx֔fɄ D<7%X_ F %*ڝI9m0Z9#@o dc ~rR$}GxړSc\T[׈)D^5F'L\sJol _sųRՖ0|k ._t*r&ny@ǿ`l{V׫ 9m<&8f&d 5[Ƞxl KoPS2j*VZD sn8tcZoHܔDu9?2|t!rD7? 8Gndz#خ}[TƿRbļYѷbD֌ wDx[j;yU>C>f \tmCW$~LfI I[-sert"@^i^9j-T['8K|عM*k%ȌW$fRiݥF@d>V&_mTEq!_PӃn hzRu5c6,=i{>[!D8ZO9 J5/%~.6h\.gB6d-7\__Ɨ"pw{.F&(hT1y-G$6֫"\68(|{. v#A%bjP?^~Y}O~왁{o&[5>$*KVng'#K3#b/[ԊhDMWI@7AfO}{ žĮ  %:wr~e7u.# C<'tw*MI0ֽ fܢY1Q`TzgF-g\t?т4֊^~5geG2[ucu@{'dϼg}};};'u^ N+s|*@5SЪ9JeS{gh!SJ 䍴 ( Gt3IGNZpHݔ걟՟j4vMRC‹ٚ`(Ф2 !w{ofpj>~`l'0,ݾ a^gayf2#9VO!k6UCgnz;W1؉]6"lۃ<8FTkZbvCam7~F!ubHתPhK ['HH ;c AZo{СБ/ϼzAq]0(-LlqiKB]ԉ \3b'Ԕep#dw=I=d:OXѣ]k{`O+Ml8#)6=5r 7*fZج%; #CC#"|UnuMo*)ja::n5|y*ȁHf-S8Xk^X #9[P1+Em}r "/A:$bM52/>s&I b]nce=?ܔq}k0\Lf-VkMü2dicF[T>]d*ggh2 q0b5CȜt4(Flxh$.gi7$(# Ss9r!*$ HBu- B?%8 JTwb@QlngTR0#Xkbes >.J$=f?ƹ,XH $է'GsMфcxFhsU 䣄uɃF=LQ% r2WP!_.NhΣ@.xO_?x9 GIVr_ k:Tuiuk79!W'Q!K[7o߉pXs`ͽa[߸8֥){xq\P_A"o=j!ZSb>aIF$ՇZ+o&+A<ybi0v{I*-w+R'OΏ%,F`A"f+VH"3^Wb#)9l=#~V?300ǷoZ!yN y=5+fBi 6cT2 }kKn+@s!zp8sµ[޷yR[lX,=ww6 |W WH _ΟwhO:med q36e ┱QD7e shFFhs]ufG'peH^,MAʀPcq‒,3y_OSPQ* :6*kӰ~> dL>K1 MЧF^DU$88UHƣgǧ]BYIUb:Ɉ,n0N grj )tdQU& j(PB|p=[zEwJ.X3f q(x_uC\{|u>j[f?յVooo| KҊXhqŭ*XU11N?jtt1HŃZ i37\'0Ṣ J:d0AĿ"&ح 8iŦj\xG׶hWƵZ裑A˻q3-Vs[/gwwnqY“,}I=ϨuLb׍K :\%LIӺN)rHEq5Hըwb‡)Au}H|ݸ)1ZG,]2$<+Q@l /,Q*@zەnT>믤ɺ.Qܒ섧+@P9wwhS1"!rPQ5/k%|^JXnL9m3li/ed#g*]m,㶇 ~}:ugzk-Cϑ!UT`%BNWzT5oO^l%ӴݦRNώ"2)h;oWU~^;D(7R/aDJoԎW\(C?@A? 鑪b\Wn)F쁡 P2ĸ{ @O-:%baw!rE')(iQl{ͰŨ`NE"N:E,볢Z&a^muVHFq[#J[8LK},0@ UnŘT!R(YD{++3ڽt1]{ј ׀OBnBVh1ȟpV~Ž>BI"|I0:cVfiw)mT ,ťr5B&X^5NX+v~}(:\VcX #.dP3w4p$R7z3aGz҂J3ӂ;.Si~LvExEW_0q%{Bq̄]v;Љ]vbB10<Nh]@c`a-ZXaj7/'|;@['˅N_HHV?`@ex4N~݈.«eZÿ|jKr9xaد&ѽpⰔ$5.}.pA !)2GOΏ,@ ˼Rgp@ғœf"n/xPr\@lsoeJ:TnkiV.{t/@Dc*x2cYN.^1UpuCm1lh5i|/c<^vrXtZoގ_|Z!"BnB@YPc dBziӔđ=g{`>ɜ p?/ J^3D \BЃSr^:A'ڭ\0(7 HF#s8ҴtB߂f4ZMfTdW_7t :q7,S([) Wڔ-y3;:eԁ;ўA9I=fçj _lL:q4U!7`:7e\#L<׾6BYNZ ;jsNgwɼ%@+vŔu,7ve=AM@n'>C q,xi}<4 LVm\:$:"VY3:}bPSsHHmDaaJq=a^Z˯o^xrև79vU!sp|vJg%ȋ\X,*e d/Yd9˗D.dl R#&5\Fͯآ<`ZT#鸦12y?ZO zʴ$^֊)~p~YN44gUKO8R!5 NXswŁV y&%/ AMHt> EaFytzϺ3iHEaKBsJ+0a;̡ED:T:,n6Uœ3Se&- \Q [9DxߋW/_|9'-#DՓc#E3=}Ӛ YԈ1EINIQ)$nC'2p0-K5̧s]l|H[^*\XreB=JޓHtueaKAp~+zc+GIf ś!T*xf{DS@U͌VUXpq;W 6z ,B\K2Ꝟt|PJU4x,l DpiN2A^SW#bBnlY{ n3` _)x16 xQb \=픹2mƽ)Cc8: n:ZJS*2!AA4]9@1wZP: Ԃ_>=?:]\oO]<9G?X4c `F-k.$ 0f]qIN7H:R NFȪNږ0JUvz'RGO% fᴯ66-ZGˇYJnTY1 n%cd0:fK=l$ ۡj1ޤ@Vם('eU[$4bVRЖ5<[4ܮ2qakPXTc=3V_.b:gُ=_/PfHau3C)Aߝ!R{`E:N!? )4e6H~ gH'hc3A5"ŅН'>Hz:"QgZ=gЄ 8_>l8G JҜw߽ƅOC:$Rٓ5V[I,o e5 1OX;"-mC?=E <Q2[e 8˹%i{XkHO3D0ϔ4lߪTch|/=_:>[̭)HTl<"fN~倠 AD"GA2H:G2!-Ն4-M 6{ܱϟ|߈"q5 /q=hwO}m4Tj JbwC#ŰA[ЦtS}?5OC (ԋEgp ٶ }0$BhD3!8?ԑ'se?yv&譞r |R#f;hA9>) :(yQp`!d\>-msMw d#=hnSVyP}7z-֣|mlSXÝ b jz` >4;ߪfgml0T nKI̕^t6N΅+vF܊Ҳ!ūۯ6ܜ$W{Wf}4M0rdb^!G.^c]}<ݸU ϘN,I;oPS%q5[봶&s'N"A^b%gUEq$3AV)#}@`Y"lF~$3i!ׯ%t$"ḭFЩ>ݔ p9e7BXbÜ*w.*S"7NdhLb$̈́9>P;RF٤-I*Ҵ 'c-n` 堮)@H.2ƹ@STqH2»PC7%y{`,/f̈́f;D~LRᦅT:@.76'U>#__BGR}\9OWwNY'K</:abgгtQm/o:1\ 5*%0Zep$MHpa4&U.DM7H50R\W5*ʔmW9k{ 3L D#]f&^:ΙDv_{;gKkw,E!SD&E1e4>0_i2y9W>$Qaqw~cf01rP4ͻ?#H؝m΃đ?؃E#A'G(Pn^Wgȫ-֤LWmF8c@jm2\(Oȭ҉ u$tx )|S]IWPU\R)4FdLƕGjnFh]{*>$-isz$_5]/2<;HX۹ҹ|7f79'FZȋ`!If36!H\i槎&3FD{tSXKRXnW]94Gh^0]k&NMh/4B+qVb>4|IaI-}&\(=JCk9ߗ@QEilC .Z^qCNl*Q‹zVZ\K{35!`k JC+ Tk-z'HF?s8Q>:XI%_#YϺ1681wA".jIݭ4_TRP)hP!,-/]MDosŗ5y'?r81a.ʝ2I⎺)dI0ҋySzZ 0ZX]y' ,F ȽA Ɓ5=k ZkT{\gKrkReKjdG٬xIvZ+m&MC=f6b¹|H]?N^|bЍLA _>~bRp4  r-Z)+wfn-n8ΣY@sx#;X΋#Vaw%Oa#JCàAmҲ"lȺrU2}:ʝ֤2/ dz-ᵨB/نI(m7ΰ(>Bcƈv VʚN^ӘnV:pRTjoۡۓD#k녏xw̜U[*߱-6z.;z"Co}(J;3ZWaM%*a.6m4ȭ&G~DAlB `CDFhFEĵ֛6*lOL촕.dv"Mj9>_mpTbD*PVi C5gk =5 mOb8hNeXՊ/c% NdY~#niQă#."o^[kw5+$0mëNA&ĴܮJ5Rz&+??xNcZW4=t 5BϊuIt?_>[2 uI&uGLETu/uat[Tl%zAgvCE nMZ+qTO:;?ZF[1};9ֽ Isx;X#.T8qc*6NKSUthIJTK֐s|v wUzw;6û%_5>.\}e'_^Oɗ;\*,\*(m BxX78Kaac0z Xu Nq}MkV2K@́NHux= 2/Ԙ;'* Bjޅ-^ܿ+d 7;_cp~.YWeiK_P4ZH:9}]Uz!Lhnw= rkJ,F^Om;QdHl>1 |ߓ$ˬOLM}6W ; F~Xe%spA/.o+˹8Q#x/= B>}t_GQں e&ذ[3`SUuOQՀ"K ڽ+N'iKq5pJ~Тn.?]qs|![8P[1Jܞܔ&@㽎2'oog( mi³|Qܔѕ:l)oplܩ |3DÅE={O *ϠB~r??gz/_0=~ l!՜ rY>k2|ڨH:c4ƘびP@u@'b9n#wR$ [ܟ:Atb֤ zɜΗQH&$%RckHS}͆=b?%K S_ye1L5> :@|Moex8r_^;GbXٕr'{Y)2dc' T肑s  7ũI߹gBB[]WCGq >Ӄ9P RDZ]'oh`$fw0dpJje:MD^wGj6%/U0dudٟa=mmCģ(+PJ:]oE&sEʧ'T-L>4hWn ~a~W8_ػ.Hk-w ؀{qqhȕ@AK: IIUK`C950,%xtk1eE?w'//^)'0Ba!mmM!H?4E6jnbi)9<'gw@,Ё!RՍ*!<](ǚz +E[v}?)hk97&4]xϤ?uJk^2˅m糆UԶ͟N|+Aa]gF|dKnUH-w7<=}6E:_OL}{KMx[f<Pg=Wh>'`vt:Roۈwg:#?ܯb1Zlȯ east-`ƶZeTXK"=E{I`$b}mHPezC"[Co|؎9Mm SQ'TPFFˮc2뢌 &' SiGT-GqEtMdrTa 4*!b:IE(/0-FPX?}(5E\4QK .yߑv=Br<6v+axFQ?zH@S2qS0NaΫ٢R2>Qz\ȧ~I5Nb\ոXim80pe:`t@@:Y:Ń}6 d5_FK30>ޢ/gM2BC%ɀ|ųgW PȆOYI.J-vA$Hv_vKpC.|媚df&$ *p7 !z9JcfG9-^, >)(rDg l1XkKg걝}[ZrMJ><1 {UxHn~6̢& |QTd_ej'(Ȏ? '"B{Ϛ}a[ct{qܮB" D栽ak; Z+US/#/2"VEX.f8~Y݊$2E:[-bc_mIn2l Gm}>JGu 7Kșzޓw "jSUi tp-a'Ӵ AϑPEXW^p ЧR}A-!q~Rާ B7Ǯ4{=EV`e|@Ns+3^9>)BޛA7%3>TS uN) LY:8(7G=c-^' 1C&Gsǣ> wjk!O%Ucn9#c^VEs6 ^C)6G)#[dꦶP? vY|-F좖FnP?6H0JQI Ǣ$ (V(M"=/]} J- Hǚ+q2gMT/ %HΈΨRQP#oǢeZF1_q+wVay_yݚ&3 Ŋ; lⓤ 4lm:s[3=ZT,'farnsp`j$:@jb:>qv"r{SN|EizS_V{ɨ Gp_k rUCŢ"2>B/߃ͪs{߉ʦ#6Q=V #1@Qnd)KIG#΂;|UrήjbT ٩œtp@X+?a <) Tc)UVk0BW !9V@+=Wfɍ< ZE Uş_DYl:Kf8d&=M"=v  Sz,A4!m!kcP6 !fXӰWW2 ۢv^BJ#*%ÕxպD;y]zt^(nwCm; ˟V sy\s;Ȕtp+qo`NR?D,畺&;zd:[a܇=0.ɟ ;g{ru"irrux(ceļĤ^뚛݉%]O?ƪ݅"anaG% v"zݬU{>`\0sIQ9fXѤ;bN5YŲ.M+w=.#tYT"+y2Ht3v_7鄚o˸RDE_6բ1bb+b`+w%5A1vED=-rؒ(_y67i3$aqR؍:fuy}&SiP:><.rn E:%EӊqґKW͇㽬zHϨc ]kp"9%sH5͠<)F9UſXQ(Y[rO_JD6RmŷnEU֡ӋiY%?u}Qjk0Jȑ鋧H01xW'ch s{.طb7b+*pDpDd$e̸<(D )Bzw78[y.TbXϩb_r1${AڴѠp%S3_OVI-muh70|3ҳOz{&`mA[JAZCW @0+.ySs[ď뮔-ts{cI9 9k]LAX񡮰/ru3S 48=>X^A6vVH j}w>Ev~ړgCh54hSܮ]k3Z>dWUUKx;dsįkTj=CJHΑ̑5A1ÒVK=$d?&Ky~5АGGx|edT@Ɂ&82iTi*NJتlyA@w3ww1v%tq2zuX4c FNHG ӈud'.t܄1h'rGz3*j62*=![Rl+ZA`8cC8bjW7rMB <̚e f5ei@5W*u !|_\??L`I޷/A={Jwm~tvgrA &v]T0\^ތ,jBl{3t%_I} DR{BmS ^FD I]sm("zW85v| C~Ғv4]|އn|$ RHn⥌\VGWx[פa3^\o m Z]%3 RW&갟SKx#|e L2RW`W_NQh{4~vqûRH ]wju=-ֵ%QOy#;G@1&cY2_ta+k(u,[LKWd,ً6e3 o,>?Ԁqhw;[W(2-d&e GckyV ~v&rD2q42Op S r{Ұ߃g߅^5t4De6= |[G1m1~_9==Y xZ7C7@ eX6xOPę=RC,dIphJRT 竬6\ŲYZ30ȱت3= 6IzFؾּ^6j/ym'i5kt(<'7b}dF@޽&Y8LpIU0= ]2ˉCT'PJ7u-3mEhSoo"QPGV1Ü8l<(4WFf4}l{fRGD¦Sެ-GD^Cgvk?7db5*C4mɇ']Sv1q:(Zo'!2* C"qyƑLm3r  gͬ3F' pq6@w Ca28 .ceN5l8^a=\' cչzd.pО,C'ZU n%jc'vԱGS&f+GXA0C!,x6ߏ5ys[ɽTq8~/mFYBUl5Jpvy"tQ吶EΧu j ^nxېǝ3^9lmDX~|`–qQ| WL4jdiv /J_NėnRm&4}nNvqK/k^HF[qso}Y8C Yp<8-'9uG,C-jr} e41E?>6f @shҺT(}Dika[/%mZ .$V"FUW.i4u EL(`b05h [=iTGS ^"ZҊe:bhh"x$FoG{6",,4uv6q\?3*!hgDbwe]i#aw8Q^<;]?ܯ}HH|i?dKn2rr8 i!D'0' 4.aҀO,!/?˶1. !fGĎ.yBBû7AgKA e׌gjL_lQܰ& rZyٮ?yf*@"K_BCϳǞ,3gSŽL)JM'@DxoBT[ybPP]`9 Ѥ6>8o*ch,fi%JW$^쐟f9 Wǎ$c̥$aURd{R]X8:eZ!z:Sch5!>YQS(Ѽ:I2 Zp!V|[).5+GMM)È?GIbwwp$~p ӏ}!DX-KO. &B)ͺTiŲ%ms/O4YT:NФ1rrrSp*Wwp۳py4i}cS ub^9_+gU%^bE6Ҋso^o0T=%!K& tNCᄮ.pA8Wl@GΥFr̈́|:taOZYwj6OPZa0˛4Mj_9>PSMy ha3GRR|i<$`iR'>w %{$3`(%>qm4i-B?!&򊁦6zF(OI#5n&WolHxEsLwƹbgC Ɂa:%bh9|E,Z B 4vN)}6T[ctt >H&__c3zcgt哠zo`}կ?c[c3q6Ѓ=vdY'ʬKvbޟ ENC}}I@Y^~yU0cH5i'jO @[R4ztMJۆfEqw1lb.8+j ]u;fx[L,cF^َZ`ѾM dLFetDf FAY$G3QG-%|%u5vDPظbϾ EBonۛ=ϭ0/qEH?܋t6 w"!y`mbFCXh,6+9ˆy3 f|p-fOL2'^0fcp&E,ܔe)f8>84cWB aX?whsuHy2w>l7hpca jJj=wn/o|(wvC#q<* wݏѻA7ǂt.r&{}k8;,{ZIF%xKzP9v5Q / sXX\CN3&>&8}WMȲPD0yx06\d+Ζ1jƙB7w;gxlz' X6GԠ᭽g&b|S‘%y*>vlLֺ+|j,I}T\;cp RdտP ci2N1kAko/НeNԴhӷug6R]9=,8+48kwҌ^]?'eGX͋se6t>_.@d?<oϿE#gE |dgL6Y:ˍ|>ZV4_1D` 3.mBlY̖c|ϸ{ck/  l&cdA$Vt1WƼ,IP$[h4#-w:WZ[ߙ{)s}#.HZC<@jQ,TZ]VR(tN}>Rخ´Cgmۉ4:FӴl kyeE8F\T=B.<݄Tc?E搂)-iDk:ʴ,cg#0Y0.CWp:tECn G mu>+r52L;c@6~4Yf{| <#<+Rp{9TYݔ[̫ѐ(&QFVK[9qq#*0dٯ1q_ּ_bCml?4JE~3RxLJ`6p> ~s&=D1)lƣbci[h 2(cSqc#PhdnHaf`(H ht2dBE4\Bo^#Zlq a=tx ,pfAE^k\ 4cW#e RIH48N?, H}U2/GxBh{ǶZ/ãlv~2K*HD^KjeԖnGdYBيW^ #^ `ӊ\GarGǞmn5scfe4[FJ10AEP8^(bSaxNgmTZSsc˙I" _LzAan~Ú'!^9(h\ڐtz n X4a_^Hpq*w~u O뭵${Wy,3`]DLءt紝5T7ywg- Ja,;.01@gAnCs'SBry$ :G:r^#1#P3$|O21л*1㝱bۡVlSN_"EZps^`&k" `t\XG>{{m@լ;-j`8u"~:_Ҫ9܇:pBr;⸍Ѯy'6D\r0vkܜ9,sw"w3v]f>*Zg>eg\USr)UM%ɎWr<\uVH'x%1CL(R!h[c00Ha<r2?:/ɲ_ 󄀅%Y% 굦 hA*S/2*d<1Rq9dUb oX?Ł4_X1048 o: jv#`M`ݝM!CwuB <ʱon/ flVHpU?Dz8R ʝWU}͏?}O>Wg痨bmm n V*FZLPI誴I 1AWG=e\v.8lYF]| C~rpc>+ Ae^&<ŠO7.i/AljǍ"w0`M,Tnmm}_y8ܱC6ACC\C퉉t\!a;e'!tؐf D)'6Tv]agP-Wx^N b@a!xWm+H1 0:9 fGQyr}:SNk1>b%`\R'YFXC\1 5L6'͑ #ɨ V*x4%:jo9 3YG: tCQy}dʈAt;wkr :K_C xsQ&2~8*" m4 YRWSvxdկйX@8 Yp~2`Hi#E3 7 B_@qHgz-sch=Pdҩ}Sۄo2tag" ϖq(û_uq~#@nViXFgNѿ[?laS<=&;EHꑲt #/q̢XN`sL]Aʊ,abŖUF)R>e9 WK#L[?:`;UI'ͫeQeɎpjBx~j}  D#iѧQ8xN`⒦')^PȮ^%wd$/x]>8, y<`2w꾳?Y>OTQǴ &]]i 4/͗Aq(`rϷeQ9S=g&hrjU|K6ebh XSf2 h@.4.z"VbMw7@\^gϼofZn8U;Icn}L-dFsW26&l|k t +3czoaѴ[?5&@϶&DZPx|DyLF6o|qFcb4'KiFRyMPK6g]0:"rhY;bҺxQⶵ:IX{!\<  z`s)s|2D+`7U px"!&Hd%}?8a}Vzh"%:T"=)hđF5A6Ƥ0W6䜩$K IXapM̚V9Ϭ@;Yx~%‘Y'1^6gAcCɤug%1*??1bdh`:_*Is f<64,*.'oo%jhp*Iզ#^wfo mlho/aŴWZF|!Azg*Jif\vB" ~.>qhҺ&i)HTX5[ A9jR渙ׂP" p"6fdOBN{žrB% D;TTbc8#ll`u՛Ls,6dr<(wF.¦\bqTBPv"Gc-:sQhP>Q'lIp7.ei s*8 4}?B+͠'1D9~;J>>>/h@J@Ɣ!)e M ȠhOv5{Qb>10(!nP3E$1ۜɃ1i\'8YZ-BɠjREҌx)XpMčN8pA ܋FR8nSqDƒ.֖MImO%͸5M 2K 0Y1 !35 yP)Ph@Zk'F<~#8ٸo,'Q=vLlT.@I|\i\3n )MAkP`oe26 ,\(o:/mX*MT@)Ww*pSuf'&G*"Xz-b$@w~vկY׮]v,j -a%P-oz\M:-Os.)a0a B$¾k 24"!Vfi/}{9Ц ,!> v,O*cGY]ꁘu1 ԿV)0a}i`9Ȉdroώl`Ϻ!>#DܙKYfJ66SHj5:Rv@0 4 ޭ'PUsA#|E$I4G[4-GԑX#i ^E-$1( ᣩGSH7c5ѝlh@q{| n`ܕ'c~O]ڔz m CBģi!,ez9vvyӈ` ΃wfиxxQ\pve N\T<:.PְGʏm鶃#c1 (5  iJO4uC%m`hN`%3~5}sp:BbWZʷʣޫd\,6JHBrIJoQ2h͚cŤrwW5l1\GPrCR=W-l+SO{2^R=( ZrS1nuJpaANkpyF騘'l#/g(yq#8b'Y7 ^ ikDޞֈF{su 9p昮/6 Q!k(cLL268Z(ѡŽ: '2(&qyyɑK%Yh~5G\W1m^NVEv`,Xcō$9:080%5 dLL.DR(K'D_ZSe&cA nAl_~ґvJUPdzZ,̝|Pin\y3j$xL/&`svYP仺:_-Bn#0?7(x0}m3:j _Zw|^ă€r`nLE ,lnNB )DZ 32%0K< 1+) ,2QاnxF-R}\\u<"2 D aKZfh4GcR sW'}fP4Ҫ#7< +8o)֍Xa޵!Z. pXR)e P|+!x\dsusH5ih6؅K`8Zتنr"DͬB+S\G5xv d\^DPM2n*\Cq beHk#v0\&D%|_xp7KgC S[man&HJ> C6^` )ätzdP`1xT@f6cc7eF30`aa`D"$?5ivvvB,a7|0ӣˮVF߱ȐtCIQ52) ,uP]$acr37;)fNvǭ}1c6MI"1MwrZvaKӣU g~d+N$7"yd. /^|˛/,o iRU|69 9 D@O"m.Γ J*> :(VF~T : Ubh>00Ӗ!<-ic$>zUBH/1Ci1o:Fc5Ѱ81kp2Dsfam1' FMMy? ^c%dY~`l擫Cd1CE{쪿&mC' ~(}aԈ>.tv< \MZw{9cIW6Xwh:@HboV9Uєa>j)_)<{>•6Yjgtֺx-PB) H v"N7CoJ* }$+ @oBE '&0r6Wu1rB?8'Ԝ#Q$ 4`2NtXV $!# *gc%O\4ƞ8heb 8Vꂜb9 _"-'C~z@28 q}~7_I7/^13sl@N-~J8G2"d|^HŇ'djܕMBĎDA7+ث7WD~OL\&xDҀ~iĥo%"=7:f+$z*VrE>i1ȑQkI iHYaOv,XUPg.ģ`[edh}ZA A'SR(xXyi8E{1xճ0[vmEV;X5G\@=8.Ԁh2X_k> m*/FJiy~xY`ݔv!wxwƸMagaAٽkk$R32ihd!Y"FY>gXM r0gŕOgw~PY:޴jjS&ܢ~EiפG٦u Hyਛ!x*L2F\Dö<ό$՜ . ͎HQ+շC! / E֤< YgX<|1ͧB8o_|t68H-\ ѩo!s(7C Et)^B˳٦/(5̈́Apom'*;B %>.v]vM8w{rFnoKTwi'enߑރj_,ܭ#GP7V!?4Al}+ Uэy#eΪYSӇ0`H?*^U㾦84jq[[*1ivfQ Q`v0Vo 婙Z H ~_=qT>F  _1(RXNYT> O4 j0SAm&+ d()kMnBYQ9a|H*IhKc*A$xj8n㩽(PGDuHRwtuu8z0_NY&dOI#Vf`d}7ZX퉻Y: o,+*w&qoPҩ4ÔY m3+6$iUR'}b:^31i^zQo'&jռ}v hu="B^~NȢ9C2Qʅ7 & ;\s }ue\r$8 16DrJg+Q9ʾJ}xOTڃNhY8C63ˌU`.:T,jYP'E]Oaet|ZZI4I\}Qb4|XnC x+:K{~n\i–Ƴl[CQx UH&iݟdtЋXq$_m<3:3!`T":C-.6oz2,wOwGEsT;@ -Qk/NI{ ZN4(2%C]ɹc!Q`$)C~)9Xp&*\ jwi(FhZq4M^jTZPj*ū:U;tqXܡ$g/<~aQѯy~vWsuBcfq\٣^ӓ,F aAhiectUEt)GI+4AC,`W#?ᑵSYطTSBk}kk'kpF>iӂܺ8w`kx~һt_6IGGs~7xۏ/)nfB GUW[NOȆ`ܴ Ñ1+}d'뗞-i[ip , L(MZoA)=Ja8Mi2뙅[[n¥Yѣ욜./TP6 J~+(wIg( |h.C>q?mڮ6}|{nQ_̏{ &_m&i2 CQǡmWt 9^Bx~~7{8¦ 7rṇj>3m?V #!^=C/ʟ%'hcoOeq=A˭εh`h#^l3ئw<>}4r#.x)JΪ SNB/wd,L0G >,F+;í?agas_/= =?sgeЬ#[Cg˙03'S!%ȽK&c"7Sfm9=cΊ~m`o;x=XciPhKK<` 3.evIO~" P ;֭%G綸iYn* "`SGѽ^# o"E 0jҊ+p.+%b[fp!~֞c 'ϙ"'xg)γSG%L+ QE.o|KA}8տx槵 vjDʟsjUO'lAox臾98G??i@\n'4},'H|õ MGS7r=583ji b `لIdL c)lRi^O `$!qN&Dz ՘9,{]9qNH74>8yŶ^`>#ɖ K4/j!K,[gou #Cዝp0;=שUÆ-z+5c "_!3K()TH#+SBxoJC-i!tv;D~A6XqbsdI ]jyB7$5يl/+཰zS vMgF͓Σc?"0:C.翾~+QxJ\d\Ɋ:b~=4MJϿQO tӁ  :LX$2ΘENlt4P26h+hK,곲1PT1:`iBP':<0+I]N0gkI-IT_~Sobc6 EMx4B糖O)Y/6$`_3=GV:ʜ^: o-'BJ;Dde;@c#&aԎvMKxyԫ;l&s6nYE~ EAR ??TxnmU0ƽFoY 6"ۛ_'6/8|쳗_ƒZ9)&+kn'E8Iö/QT= fuǥ͸Aˋ .V!塸#?&(0O`q+=`AIDH'JE|*|LWFMx^VBreJ.V N.-vQOfOJđ|jTx Hf=<oA4`!c=mgYGC,[Eō?Zz}DUDҳLb45ujqq IlX ѡ[F`<6 'N9`._,bHUP%'rǟ zs 7 h. ہJꄲL)0jj’8@XB RR|uמǙZsؾErck.N6Zc#LJ;T" GODF3F"H`8܀7§#$W]@P_p#YFnF(60P 7gWOϷ1z;3+wG+UmŽދ3ƙ^և Hƫ1I򗥌z3C\-'~??|w7 Vp3@9 %}i³0a=T&A.>gc @m@MGE v@LQ;!;Tra.]li^I6!3[x<{@, B@?0,co-\I\r:Mt"$zg#f\JqL9óDCӿ~ЄN pR5uyLŭ~_vƯh1a QT44È95clrw='+ʲ+FO.. Oj\v.qQ渘O֙))iajbdFgV(!UQ X\?ORHym'?=M>FdfPJ/WijH1~;I٤8Ӈ-Ӂu>q-P4U1jh5ewbVxo?{v`ZŊRWa\[*_MOva0b`㙵a3< A/K9uztrf̈cYz1PK'$ cxk6"h7;FiMڴq c.虓 BX1if1XEֻl=3Bp15|_,f/i55?v_Zk&`5 ՖMp#7W.A?ܚN9h]μ((\_#iqa}K:F,gKʤOُ|.4<1q{*{o/ZtK|4^8$@9Vl%>j@Lʐ$d pVymxGظkqRR=CtS&&X5=D٥H&dVB2|/iD &A W#+G|9\|XG/aI6[Lʂ1sC $hOGfQМ9'<To޾EcU?>l~|?ǟ}3 cm?Cl6)o2d)cݛX3 X|zDeC8uth1Ŷt$ѺXzQ+(F[N:7]dRyP}> Ͽ2cpJhAO>jwy?I#i8<7;`Уb*LG(!5)n{Wcl9ռҁ TP%,'Srs$v#'T^1a%EiyG:jW:^fB[e%bCz[O&hI>L4~Y$lih,f:VjMkc=H&ָ)lWׁSmiCѧ}S1#:ཹy+t5q16"Ũ[diԀZݯoEQpMfמ?iC7|}CI%uip8;;lࢼPx#jEtQ0__X## ȕ}g+tGC A ܰwp,)j*{}a`cE// W1 h "gllY TqgCN I'Ddz9ny(tEqkVmFax};r&p+&b>Fb0nIyva5iy:yv+prA'EsDjauҝ+IV:lU@{#ؠQNH¬>NlJM&wzG:IHD}mi Ti5Ǐ Rˀrұ'!bˢ/50'?U R-|o'\^')<ƤF9 x*7?-JH7vȅҺ=4r5\F1Aprt2S Szr\ ~fdG:iXww4.:A@>JaMLTkvmwcVYHyX?4ɉ*溺7T+5ƥw߰->$r\g2 veoK͠ɓCt bljɈL($;0h*``;eR']L\& $,va,~:1HK,+q$;{Ž˫//JDCc,cӯWzc5j{%R.|2"2"/fk\GZ Ul|>47WXb9C],>x LzAl23RS`vilvp ?v-#`cGUݙA7CcҦBٕm9Tc/CˁwrvI_]|k5izfG&vgCĝTi0kEDU?ʝA2< uq=P]MvӋCe'(n%0.r.~P;InAgh໠'^c }`G< ْXwRi L qs=y&@̹ Yetz6>? bT̀r -zV!$>~Ux| BS-RwKpK|O߿]A拯׆_x=WѨ5_C#%V3M\{`Ԅ3BLF?J".L,*+㢔 d.B*:vb⡕W;fxUʳe 0j5<5>]-,I7O8JJ!OND HrK b+XdgU9B\p8{%k&$RXE&!UT!õaajCD8ሩFդn6$Wꇩ=!|E̼ѪU97mwO ',kZ04^[밙 ;Am-ܽc1Щܣ/^{X%npC̼B"]P3py ڳW2|BRgOw{t$V|إ"1˩58 U>! ¦Q:G)7߾ȉ ww8{aރٮ0zwd4CΉc}So^N5dӱ!7擲+{ A|Arnío2}?﷫;B,hpyvԻ]_tj' x E D|$FH>]c É㒘E=Ȥ&J`ކ"WAYjZpM\GXզ+~_HdNt>eWAw>Ɏ &lKE>sETZc* Dr+jwEݱ\LRYGK}9ߛ7ol3v(xY+& 7XYF`,vDh19oځ|тgK&jQ3"S#e`Ak0䔣=S07MUlj X~H%(^5i F)PcC + 6#P!~ýtXBccs#gʮ?a**2=3scۣA!Շ{2O 莳7\o]n-QbΑlf!|$D$Bث3q`xc@F>#4y3Z r9f+& UUSLŁB:bCyZ s:j21V7TGM 襞fN_tys&N4Pl7oaeXby~eHۃaQGZɳ<4Sْ6?=Q _\Yw 6([5rwNchvf^[I60U{}#1"TVa G[ .y $lnm:r0}y=D=#o Т@9]a~?(YId TX]e< _bH\/W'g8Aۯi}4ȝ@{CÃ]ꜜ1zµq̅&[X4WQ&6D@]>P*c>A|ֵ!`!.[nj!~Ie|ĵAF[yqaf\Y5UzT|Uo].GE@Er;$38>;bT.E٦6ߥd(]`ki,r"3 V:>yy^…A}S8ףH$:hJU ^zS$8F>Xb n, 6j6tDK>8lRe 4MF4#wcjcy4u8g;t*x ;gM|gg-EŌ@CxB; YL N:ln woGZҤDs? [[{rU8rBCoe޿m]pgm>ۇ8FCf5λ}k4k2[8lyH+9Ynw/AXn.Ȃgl͗ǫeK wy7)>ܬQm#:vbƽtޢvE e/fY8uꝋ9!۴jOZg/^]hrYwMqxn#f<&\~%aOxE* d= #mMe<(`F~&"{.l 1l1i0~lk )yLulor$3:f >T_x8Gazʤ놫rE1f/R@:x><#Pפ1=,2v$N8,{~Tag^% O,41\nmeq8qͭxO(7,7u6q^U=Flysmi9fl5nCeӌr\wU\3MXO*8z@G |Y.֜=0._ehfS̙g4If]'O0pZ+c-P9~t⿈$1ԃN!AM#5MY1s 5@NoOՅkې68en 78I`Gas 9XL=o>.&ˋ `6{ʼnXqq.%ϲvr;>K5koXƟZ"\+LyڛbAmibN%?w2y`QžjwG` ct ϳW!6bBM_6xk[`'4&Xh TOJk#@iSh`a[&|~*Ԏ8jc~|%8t&=AK0_H>}ÈicJ* s3ґ=BD ~!z8K(*f9"g<0qbca/s`% mQgDgm߮aI"J:!%*+zFzqq:sTR{hhLzXz=?-t4ڔOIRe.._a5̻V|'t4+E *PU|F a%A\XZ8bz\\7_`FbZt $f#C ! ␅N5RS>Q89a0&$VjJ ŽSDb8ct%&fv&lU^ dc}tW" Qܜ SǶlԳYueo.!iF@ ¢jBm*ũ ZҊ BhׅϙedэX W] >R}7ԬX@,];IĚxt|+ҁWJ؍IENDB`simple-qrcode/tests/Images/simplesoftware-icon-grey-blue.png000064400000045044152427536730020275 0ustar00PNG  IHDRxtEXtSoftwareAdobe ImageReadyqe<IIDATx UOh06*]1FݒSpwK*Zq&Y7I%UIEFdv<Ċ5: :F\5P~tC=}^ns:{]31)>.ŬQ6V^מ,O44+FɪXMOB, 6$GH<_X@le_`OǺX 2A[B >~BT VV ?F?5!z-bß\P+Q5wV< 'q@+/@bL#!Mׅ*uE(oFF;je1>r@I,;ڧ?D~->ʥNJ_X̺>-`} *Ϩ^#ik#_18K[,5 Ȇ4"5xj뻛Ul:+58Px#0v,f 0ZPUXbC݋PFLFΊ-5Q bf[GyzP|fDLk @e ^g(*E<~X.E'ytVln4 P8 4$*a]"ix\p)œe&J|0R s* k `5t&Ul@/v;ЮMGVVQmRuI֜j*'p7(@VYXk'dG%%)FM#xTLj#Ep;Fg V/3Y?'YC2pmJhNǯqߞF獳_>79Ds0r`Pi_?sflklԧG'c.~2:Þ7 M'Eގć^ aȖ"+Y/gPi'ч!@K%*@di)e_Ɵ|y;hݱ)平s A6gNN"r壢q[6Ăe\睝]>vz2턨8tb-o߁؂%ɡh@K|0c,E~`pP>2G;?EnQZy!qP@hKD<5`rp?/&'bn0@iK#2KH ,~}dRA@F~~0͑6ȃ# / tdȦS'w݆35wHk4Hh?N(&f={kWJ0Z,"^?X"Q5uL0)@4 3\AJ 03!>O& `ڲU$Z]s[~FVNO.eK0߷?xZVu]@ Bҽ|b?@(h?=)HTC5@P :!PyTok[ӱSa_r! :VAF^it4_:q؀m&o:سax!pfh‹?a1A@Wр'vyoX_>ЫDQ*@u||Yuu ! : @fÐo4U!πHj_D' žQ  /ϟ rí;6k R100N>{D2-QO[^(tlQq=!N{o.6ƿ@eC4.>x)g#N>)ypQϳhD`1@ 0~T Vv1hk \Fx 1C{/.-Qө,H#{u׫%^@ gc nF;_(p4xǏEH#!JG?m=O'~ ^ܛS]0"zj/ |#8t真! CKf|0>OD6=m>L|_0iNjnt.Ԗ( %q Cѕр]NR:.F_'I4cT!>Lͨ/v?15 4A}֥)Ź8xm>W|R=<~syuݧZ-XAޘG&!wwq!(NL:^\J5 h=4>5Tq \LIvCˇ W(Z]S@E@?KxP74x ^CU2A-;"^#"Z1]3 ΉB!EB 4GƟ`T0GH@clD@"" P -}ڂB@!za 0 ұea R%;(,C)?͙9ٶc7 u ldK=<%?()퓢1ok/Ƶ;@c[ zQ%V3Ac) gwah2s^^6M*)Ы߷+EK,t7f8B}{o>=<\~qGt//ړ|}hEӈ Qgc2o?O>}~ϾrԽykE pQK(RвeRlpxox2^u޾k("Bqgq(6nsQM"\ A$O[׊O=k!{ý7~ˆX l@ xBdC>su;0uvFO8VWۯ*Կ3˒p=P{?>ٵ=:~D['x`͚;&((}濼ɿ62ϣO/[y^wɹQɓ~\NFaK;幣ѹ51T_}޵2G/ y/ZD|xm~wwSN,fN\ yHH  B-F>*y _n[ PZhe M85#IqH@@A&&O13\\рD{m/j.,oPJ p`KO~wݾ"EʮPZud$) kf]Cj7U΍đ/k:_wy/xQ7Q3eо;<7ԎKxOE@([ WNt̍/sv{\!\{qj ⢼cΪwk,;.@DϦo_'" W|+‹?dZˉ~r[zɞԽy34ccg!g/usv"y*j:C՞ַ 睶+G6=e%!^mw:u; @wX{̻?y>OsT'dPؑOsmhMW_0+nΌ?"`lOM៓l'd}L*A%~EB@.݌>W֦?fM6[ϣNuSNo~g8Z߷+<w社uK ꪇLlB1e$kG{(H~ԎQ9hy.X31ʨ ȣ[7_+n}rkJ47 U"!{By~?l[`^U"9J8H4{G5B_Qӗ|B7ߴ+#p oCo^HTPtUqaj lk 3 q| x4hc#Z>_O<,HNBܸ͡JΝ5# (s-(ۖ?\*ZPkRELxǪ^) $ 7@ + 2zfc#k wp4{)4e(1-r_^42g"[4XΥ}*,b(Sֱ;69[ >&p·\od*"Ar7\[̈fK[ )Jb@T;G϶ ?Z< ?"@QQLB1zY|?`/-LF p4iw7E@f|51w_-L(@VoyvY"3_.*S/( Em֧<`s#o_C~l׾h2lel`.@O[`gCO#W/2?>Fy?&7Y:vF珡 h__ɩ (a@] }@ ]  i1|n4ց}"@X`Q'  PTQ@Q(cCUXsaLB8 @S]ׇ(@e\hgcWX)<<eDɲiO7dخG ˻%?rDqd9)%uHpxFwRS^uM'{g2! B@h@ PIe=(*bB3}Mth⟩70V/Ge g͸MČ `j{8~G\<d xFL _q}ӓ) FԅV<f7*g?9} JIJ󾷜~3 EB^4$rJdv8kA i`b6Cg hB459QS E5}ΠC^`;2yx4`Ԏv~ʹ(sEq-o0 КS@I' 0226DxZ_ypFSs/(~ DG@780;40W1^3B]BT5BPX_Inw'.2[]1~ RPA꼊>}OAB O͙{V*@a<)2:d\%4^1 cY#C #fh Ӑ]ˠ0nh-O 38NGc/Cg22i_[ D;R_?^26 z՗u҆RQ<& 3abk¼3o_ Mru0mEp^`*gGxѽ&B!0ov©荙|gHL{ 0No(jߛ!>#dqQ5T$f›΅x)O~'is߇G)Lͣtޒ@=O6%`Gx:y&UHc'?v k'4s[4)M ȳѫNw8E8787^{I \mHvFWa[иa:EK@`8f,Q []޶6幨oUK кcS|V@EBbC˻E ύיlj֡M{Mt@ O>jt[QtTkKY"':&B اQV=ۣSՏ"/}oَN{Krhqs.v 02Щ.$ۧ'}n 4ס1s[|(o@R&vLdUOevBǧ4IѤ"V,3%+ ]PJֿ1f[^/BǦfQZK@E8>Eij/khV^ _B=z mBہ RB/ZSoms~P|sM{6!o:!F? *Be>Pic|w^z2 @Q4ydoa PtRIQ.ET&  "S'HQQɎ"@](0q {O#1 ߉vdt2>Οcw57.5E;ʪ,+5?}R=^?$@gQ`ke)s#h׾|Q kg<>^[V7LJ@=21hB 8v+9IOqQ뎗}|$4_dY|{`zom|ڄ"(LΨCOC5sS^khℶBr]}E*![@QHȻ^li_zԊ`zˣӭ<#(ͷ+ʠ).!wR"UB?P;-S'< .+{akF# R7( //lCлȟp(7yw~c91ԨJ1,0|W:|NՏ_a7ʟUuË)'%F޲M(b3  Fh*`|5I뛍fjfs%'|$)9P32! }~pBFCQE, \8`I  F߷]XN [PJl\->sE؏'v@9z|<`72(1 F:zvME[ i@@ 4@_`QT|0Ԇ %I0ቨד͐BBgv@9߇TJKPhb졋: &Bfpiw'N΅gj" #p૨yɸFў q5wM OP(]Ĺ{M5hc}':HeB ENNM(t넨)mW9,DnPWO*ߋ g' )+z 7}@:|gdyaweZRBX5y{=E &lAUӲ(E E^ ZX@[yye]sW*ȔR>N !XgF2G"d]4!L`[HC,#)cyg(4oCHCmG==0"`vX!FW~,L鄾EBD/,S3"5<'؂|~Wz]:g7u = 8>rdy &S΅>D@X&06&h} hmm(y z{Hhbi3`& mjLN\=R0I1şUC= ư=֖$7k n@G:Xo_$Ju7:k떾eN\4!җt1_CZ@shޜIN]ӸfhN ^#TE?W]>pk@WvF]O7|ѳyk"^z'x?<081כuJ^u"kJZn$0t|z/=GNt\j6^Z B Mze qstH䟋@M i" eLoĘփw,5UB1;Q_%>D|0I /\Smί-2E_!q즥Υ `nzP. n \fopf~DPj&q,,(b5P!ak _#GA:ehj;j99jZcڄh& 5@Ν0bpeiOuZ8?Ǯ3ˢYkX` l#9j}md}ﳕ~L=!!EN ~t]W,[ۖQP酆Q.*VN]F 癿k oΡz[o}hێ݅w|{oRNŇ맗@ }ߐS\y6{pMvhA|~K =@ rߍ<[s}h-}PE}2yxyHDG 2C6@@  Z[ hD,[B Frʩڊ"np@}ؘɗg ?W8k>?k MÆFe Y(3 s/l?/xꙍGo:.̀@938;*:Wj<ۀXi$J2 2 ٲpxÌ@xC#]2BFs^ Lo;6&j'|BIW+zYr ؂d,(h"O.|.N37wm"Ly:M&p}o2U7zV]:y[x>s|F~)'y38C: )J0 Z/#S=nth%b0# #NVc( }hzyGMc p13qN:? ג-C-k5 iSHD!z@5AvYid2yyGJhT+) 058MzKq|`ޑ)cqS| IL"q1 0Z{F~[CY %[wk@!@uq=/|bǽp1FS޿:0^(E/T;6ه-7}Лy<&FV>h-{o'HՂ~gLzJ>"X?& 6=1 1=`S:KhwL/(zP(K!^bU A?&Cܼ{@@ ef}xXd=^C=O=_UaHt/JdmaNSDdHLUJkYekm0 Ygc_}e5it@( Gp8c>uA=k-yED|E_Fİ lފ%Ƭ'xm6I(Ue}%}g0]Mh7hpE0PE4E 5@F*d]|xϺooyz윀H?? ̩[nZ٘pmwQD Pd{Z]d\{W t\$jyS0"ɲ(zxx;y,/Sh;{}5<3v\Rhwl޵ѩ11uMF>g]nP54=ߢi4f;/a0&e*4uFCZ PY= +Vĉ^]p_Gܨ/66!*FqcohOeK6F2eWI$z]- dSޟ|=~k²nЀz~l21k<:kaDQk#2f^ _-{Z&jFxҺy+/QhyD5*8Xox18_ /*F4Wv-\l~RtwthygQDz-:~^#2Sw_XۍSl~{1 #ɓ'V<158gSacvylo̓u U&^*>wDtoޚ ٥I}&+B15Vs6 #{I~mz%?3]gB^UlaC% @ZV+QD{hSU#Tn?Cݷ`:v˂Ƿ^D@241{}?3(`r+Z]=ǁQ?jV})>g6r1.9E+0< ٠VX>g@4%R!-V!mf -QS/- >+Bmڳ9yLչi3#G\FDǥQ,ZD̀ 2xãSld? |țE@5}}z2`TT[{&a!=h ~57=o1%(JP8*]2=ۓc(6jG)! T<-LX8\(Z5tq/\"sUY6a7_^+&޹l۱j/FD3~9sw,@~6AAT T"DE!lwohz4U~u|GC(/|9Ŀ/;rȈ=HZ"?!O v`ƖXShn lHX6`ڡfH@?!_6 j ܶ~@@QH_? `HzdA_cB:0$2^{ME@H[$i,KQ]Fc^L^0>N xlz[E@h\PI+4/CP^L"eumI)Q[7vk뮾6AUqYS' DžS<ylô#?C.v p<qO&?FӅΰ Z}/ET֮[l\*U@JC2:PZ`lanó*UߵjEtN*"`2',^VAn[gPጐB?@Z5'0( 禔®vC6OX1@"! .Բչpc0j[V߷MBCzkB-}7-}][\WD! g_xAR?U]O@"Ж9*ZO@wݿ笺O\aZ<>z-Q$@"G1B_͞SV0K}zeCtԉszTE[򿩇/C Pi@G92视̢Α֭BUC6X_ٯ{0 so16oԂH>ɖ(l g4t8yl3 D*(6AD ~0 *, )!^‚&5 ~uG.ĹfjF-??^b ԄTr +hh`xH@ͤuM >Ґ/bHܹjOCwBy6Mpj,gUQ`%Z2~[bؔBC{VB^6ѵ8XZ@#( (~7x䊶VU4@ .y{jc?|"kysWE7ߴNhrv`M\liԹp>ui~=>ڶc7/`0~)zF$`[nZpU`X~@Wڸ݃"PbNB+}`@IY( =W?.yHnQ[@!)P+O@\M(QJ@ 1`Tc(>B[6"CԀgVacEx>>fm"޶cM"kdK`ϧ_Toڀ(%yz'y+@8D|vk4/ O :o7k.." UF>stgHPp&"㟊g"0Ec?/ EtH)Ȁ -02kX}X7/oQѠ@gE`ھswv| !@E Ќ PxR:{kMtX9 Ũ d `u@%uJ@r9ȅMXWxz"f_G52"P4*683 NCt˪vэlmk6)*>wӛ=|&Frڠ)wt쮙Kw|Lj@TyCaU^_UFȓ{b&8:wc03 a+y&S!A аs1ր:58짔@% EHgotOiJhY&e,*'p}ĞMB"U#pN_HܨΪrB]mU/4P 0ƿ)H@Zgcƿhe%?&2=Ow=&:#*"@{^-\1 &}dˊ\8kfŁ'hJ*cUll\ gw-_T pÿζ7dU(%dc4r~ 㗯 oƆ~d +Y(% ,FUz *!"frE&WX~o@EBhJT k `MI4iT*BɁuijł2?#!k` $*5xk| /ΊXG{tM!1 ! 2}b@Ń+1>׫o|3 W^{եѼEhv@b`REsB8P1ׯW 0Z/<+IENDB`simple-qrcode/tests/ImageTest.php000064400000004002152427536730013057 0ustar00imagePath = file_get_contents(dirname(__FILE__).'/Images/simplesoftware-icon-grey-blue.png'); $this->image = new Image($this->imagePath); $this->testImageSaveLocation = dirname(__FILE__).'/testImage.png'; $this->compareTestSaveLocation = dirname(__FILE__).'/compareImage.png'; } public function tearDown(): void { @unlink($this->testImageSaveLocation); @unlink($this->compareTestSaveLocation); } /** * Must test that the outputted PNG is the same because you can not compare resources. */ public function test_it_loads_an_image_string_into_a_resource() { imagepng(imagecreatefromstring($this->imagePath), $this->compareTestSaveLocation); imagepng($this->image->getImageResource(), $this->testImageSaveLocation); $correctImage = file_get_contents($this->compareTestSaveLocation); $testImage = file_get_contents($this->testImageSaveLocation); $this->assertEquals($correctImage, $testImage); } public function test_it_gets_the_correct_height() { $correctHeight = 512; $testHeight = $this->image->getHeight(); $this->assertEquals($correctHeight, $testHeight); } public function test_it_gets_the_correct_width() { $correctWidth = 512; $testWidth = $this->image->getWidth(); $this->assertEquals($correctWidth, $testWidth); } } simple-qrcode/tests/GeneratorTest.php000064400000033012152427536730013766 0ustar00assertInstanceOf(Generator::class, (new Generator)->size(100)); $this->assertInstanceOf(Generator::class, (new Generator)->format('eps')); $this->assertInstanceOf(Generator::class, (new Generator)->color(255, 255, 255)); $this->assertInstanceOf(Generator::class, (new Generator)->backgroundColor(255, 255, 255)); $this->assertInstanceOf(Generator::class, (new Generator)->eyeColor(0, 255, 255, 255, 0, 0, 0)); $this->assertInstanceOf(Generator::class, (new Generator)->gradient(255, 255, 255, 0, 0, 0, 'vertical')); $this->assertInstanceOf(Generator::class, (new Generator)->eye('circle')); $this->assertInstanceOf(Generator::class, (new Generator)->style('round')); $this->assertInstanceOf(Generator::class, (new Generator)->encoding('UTF-8')); $this->assertInstanceOf(Generator::class, (new Generator)->errorCorrection('H')); $this->assertInstanceOf(Generator::class, (new Generator)->margin(2)); } public function test_size_is_passed_to_the_renderer() { $generator = (new Generator)->size(100); $this->assertEquals(100, $generator->getRendererStyle()->getSize()); } public function test_format_sets_the_image_format() { // Disabled until GitHub actions config can be updated to pull in imagick // $generator = (new Generator)->format('png'); // $this->assertInstanceOf(ImagickImageBackEnd::class, $generator->getFormatter()); $generator = (new Generator)->format('svg'); $this->assertInstanceOf(SvgImageBackEnd::class, $generator->getFormatter()); $generator = (new Generator)->format('eps'); $this->assertInstanceOf(EpsImageBackEnd::class, $generator->getFormatter()); } public function test_an_exception_is_thrown_if_an_unsupported_format_is_used() { $this->expectException(InvalidArgumentException::class); (new Generator)->format('foo'); } public function test_color_is_set() { $generator = (new Generator)->color(50, 75, 100); $this->assertEquals(50, $generator->getFill()->getForegroundColor()->toRgb()->getRed()); $this->assertEquals(75, $generator->getFill()->getForegroundColor()->toRgb()->getGreen()); $this->assertEquals(100, $generator->getFill()->getForegroundColor()->toRgb()->getBlue()); $generator = (new Generator)->color(50, 75, 100, 25); $this->assertEquals(25, $generator->getFill()->getForegroundColor()->getAlpha()); $this->assertEquals(50, $generator->getFill()->getForegroundColor()->toRgb()->getRed()); $this->assertEquals(75, $generator->getFill()->getForegroundColor()->toRgb()->getGreen()); $this->assertEquals(100, $generator->getFill()->getForegroundColor()->toRgb()->getBlue()); $generator = (new Generator)->color(50, 75, 100, 0); $this->assertEquals(0, $generator->getFill()->getForegroundColor()->getAlpha()); $this->assertEquals(50, $generator->getFill()->getForegroundColor()->toRgb()->getRed()); $this->assertEquals(75, $generator->getFill()->getForegroundColor()->toRgb()->getGreen()); $this->assertEquals(100, $generator->getFill()->getForegroundColor()->toRgb()->getBlue()); } public function test_background_color_is_set() { $generator = (new Generator)->backgroundColor(50, 75, 100); $this->assertEquals(50, $generator->getFill()->getBackgroundColor()->toRgb()->getRed()); $this->assertEquals(75, $generator->getFill()->getBackgroundColor()->toRgb()->getGreen()); $this->assertEquals(100, $generator->getFill()->getBackgroundColor()->toRgb()->getBlue()); $generator = (new Generator)->backgroundColor(50, 75, 100, 25); $this->assertEquals(25, $generator->getFill()->getBackgroundColor()->getAlpha()); $this->assertEquals(50, $generator->getFill()->getBackgroundColor()->toRgb()->getRed()); $this->assertEquals(75, $generator->getFill()->getBackgroundColor()->toRgb()->getGreen()); $this->assertEquals(100, $generator->getFill()->getBackgroundColor()->toRgb()->getBlue()); } public function test_eye_color_is_set() { $generator = (new Generator)->eyeColor(0, 0, 0, 0, 255, 255, 255); $generator = $generator->eyeColor(1, 0, 0, 0, 255, 255, 255); $generator = $generator->eyeColor(2, 0, 0, 0, 255, 255, 255); $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getRed()); $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getGreen()); $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getBlue()); $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getRed()); $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getGreen()); $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getBlue()); $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getRed()); $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getGreen()); $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getBlue()); $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getRed()); $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getGreen()); $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getBlue()); $generator = (new Generator)->eyeColor(2, 0, 0, 0, 255, 255, 255); $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getRed()); $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getGreen()); $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getBlue()); $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getRed()); $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getGreen()); $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getBlue()); } public function test_eye_color_throws_exception_with_number_greater_than_2() { $this->expectException(InvalidArgumentException::class); (new Generator)->eyeColor(3, 0, 0, 0, 255, 255, 255); } public function test_eye_color_throws_exception_with_negative_number() { $this->expectException(InvalidArgumentException::class); (new Generator)->eyeColor(-1, 0, 0, 0, 255, 255, 255); } public function test_grandient_is_set() { $generator = (new Generator)->gradient(0, 0, 0, 255, 255, 255, 'vertical'); $this->assertInstanceOf(Gradient::class, $generator->getFill()->getForegroundGradient()); } public function test_eye_style_is_set() { $generator = (new Generator)->eye('circle'); $this->assertInstanceOf(SimpleCircleEye::class, $generator->getEye()); $generator = (new Generator)->eye('square'); $this->assertInstanceOf(SquareEye::class, $generator->getEye()); } public function test_invalid_eye_throws_an_exception() { $this->expectException(InvalidArgumentException::class); (new Generator)->eye('foo'); } public function test_style_is_set() { $generator = (new Generator)->style('square'); $this->assertInstanceOf(SquareModule::class, $generator->getModule()); $generator = (new Generator)->style('dot', .1); $this->assertInstanceOf(DotsModule::class, $generator->getModule()); $generator = (new Generator)->style('round', .3); $this->assertInstanceOf(RoundnessModule::class, $generator->getModule()); } public function test_an_exception_is_thrown_for_an_invalid_style() { $this->expectException(InvalidArgumentException::class); (new Generator)->style('foo'); } public function test_an_exception_is_thrown_for_a_number_over_1() { $this->expectException(InvalidArgumentException::class); (new Generator)->style('round', 1.1); } public function test_an_exception_is_thrown_for_a_number_under_0() { $this->expectException(InvalidArgumentException::class); (new Generator)->style('round', -.1); } public function test_an_exception_is_thrown_for_1() { $this->expectException(InvalidArgumentException::class); (new Generator)->style('round', 1); } public function test_get_renderer_returns_renderer() { $this->assertInstanceOf(RendererStyle::class, (new Generator)->getRendererStyle()); } public function test_it_calls_a_valid_dynamic_method_and_generates_a_qrcode() { $result = (new Generator)->btc('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'); $this->assertEquals("\n\n", $result); } public function test_it_throws_an_exception_if_datatype_is_not_found() { $this->expectException(BadMethodCallException::class); (new Generator)->notReal('fooBar'); } public function test_generator_can_return_illuminate_support_htmlstring() { $this->getMockBuilder(\Illuminate\Support\HtmlString::class)->getMock(); $this->assertInstanceOf(\Illuminate\Support\HtmlString::class, (new Generator)->generate('fooBar')); } } simple-qrcode/tests/ImageMergeTest.php000064400000005033152427536730014044 0ustar00testImagePath = file_get_contents(dirname(__FILE__).'/Images/simplesoftware-icon-grey-blue.png'); $this->mergeImagePath = file_get_contents(dirname(__FILE__).'/Images/200x300.png'); $this->testImage = new ImageMerge( new Image($this->testImagePath), new Image($this->mergeImagePath) ); $this->testImageSaveLocation = dirname(__FILE__).'/testImage.png'; $this->compareTestSaveLocation = dirname(__FILE__).'/compareImage.png'; } public function tearDown(): void { @unlink($this->testImageSaveLocation); @unlink($this->compareTestSaveLocation); } public function test_it_merges_two_images_together_and_centers_it() { //We know the source image is 512x512 and the merge image is 200x300 $source = imagecreatefromstring($this->testImagePath); $merge = imagecreatefromstring($this->mergeImagePath); //Create a PNG and place the image in the middle using 20% of the area. imagecopyresampled( $source, $merge, 205, 222, 0, 0, 102, 67, 536, 354 ); imagepng($source, $this->compareTestSaveLocation); $testImage = $this->testImage->merge(.2); file_put_contents($this->testImageSaveLocation, $testImage); $this->assertEquals(file_get_contents($this->compareTestSaveLocation), file_get_contents($this->testImageSaveLocation)); } public function test_it_throws_an_exception_when_percentage_is_greater_than_1() { $this->expectException(InvalidArgumentException::class); $this->testImage->merge(1.1); } } simple-qrcode/docs/it/README.md000064400000032154152427536730012156 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [Introduzione](#docs-introduction) - [Traduzioni](#docs-translations) - [Configurazione](#docs-configuration) - [Semplici Utilizzi](#docs-ideas) - [Utilizzo](#docs-usage) - [Helpers](#docs-helpers) - [Uso generico dei QrCode](#docs-common-usage) - [Uso al di fuori di Laravel](#docs-outside-laravel) ## Introduzione Simple QrCode è un semplice wrapper per il popolare framework Laravel basato sul bellissimo lavoro [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Abbiamo creato un'interfaccia familiare e semplice da installare per gli utenti Laravel. ## Traduzioni Siamo alla ricerca di utenti che ci aiutino a tradurre la documentazione in Arabo, Spagnolo, Francese, Coreano o Giapponese. Se pensate di potercela fare non esitate a fare una pull request! ## Configurazione #### Composer Per prima cosa, aggiungete il pacchetto di Simple QrCode al file `require` in `composer.json`: "require": { "simplesoftwareio/simple-qrcode": "~2" } Ora lanciate il comando `composer update`. #### Service Provider ###### Laravel <= 5.4 Registrate `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` nel vostro `config/app.php` all'interno dell'array `providers`. #### Alias ###### Laravel <= 5.4 Infine, registrate `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` nel vostro file di configurazione `config/app.php` all'interno dell'array `aliases`. ## Semplici Utilizzi #### Print View Uno degli usi principali di questo pacchetto è la possibilità di avere codici Qr in tutte le nostre print views. Questo permette all'utente di tornare alla pagina originale semplicemente facendo lo scan del codice. Tutto ciò è possibile aggiungendo le seguenti linee nel nostro footer.blade.php.
{!! QrCode::size(100)->generate(Request::url()); !!}

Scansionami per tornare alla pagina principale.

#### Incorporare un QrCode Potreste incorporare un codice Qr in una e-mail per permettere agli utenti uno scan immediato. Il seguente è un esempio di come potresti fare tutto ciò con Laravel. //Inside of a blade template. ## Utilizzo #### Utilizzo Base Usare il generatori di codici Qr è molto semplice. La sintassi più semplice è: QrCode::generate('Trasformami in un QrCode!'); Questo comando produrrà un codice Qr che dice "Trasformami in un QrCode!" #### Generate `Generate` è usato per creare codici Qr: QrCode::generate('Trasformami in un QrCode!'); >Attenzione! Questo metodo deve essere chiamato per ultimo se lo si usa all'interno di una catena (chain). `Generate` restituirà, di default, una stringa di immagini SVG. Puoi stamparla direttamente in un browser recente dal sistema Blade di Laravel con il seguente codice: {!! QrCode::generate('Make me into a QrCode!'); !!} Il metodo `generate` accetta un secondo parametro che indica la directory nella quale verrà salvato il codice Qr. QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### Variazione del formato >QrCode Generator è impostato di default per generare immagini SVG. >Attenzione! Il metodo `format` deve essere chiamato prima di qualunque altra opzione di formato come `size`, `color`, `backgroundColor`, o `margin`. Momentaneamente, sono supportati tre formati: PNG, EPS e SVG. Per cambiare il formato usare uno dei seguenti comandi: QrCode::format('png'); //Genererà un'immagine PNG QrCode::format('eps'); //Genererà un'immagine EPS QrCode::format('svg'); //Genererà un'immagine SVG #### Variazione della grandezza >QrCode Generator restituirà, di default, la più piccola grandezza possibile per creare il QrCode. Puoi cambiare la grandezza del codice Qr usando il metodo `size`. Basta specificare la grandezza desiderata, in pixel, usando la seguente sintassi: QrCode::size(100); #### Variazione del colore >Fai attenzione quando cambi il colore di un QrCode! Alcuni lettori potrebbero avere dei problemi a leggere dei codici Qr colorati diversamente. Tutti i colori dovranno essere espressi in RGB (Rosso Verde Blu). Puoi cambiare il colore di un QrCode usando questa sintassi: QrCode::color(255,0,255); Puoi anche cambiare il colore di sfondo con la seguente istruzione: QrCode::backgroundColor(255,255,0); #### Variazione del margine E' anche possibile variare il margine attorno al codice Qr. Basta infatti specificare la grandezza del margine nella seguente sintassi: QrCode::margin(100); #### Correzione dell'errore Cambiare il livello di correzione dell'errore è facile. Per farlo, usare questa sintassi: QrCode::errorCorrection('H'); Seguono le opzioni supportate dal metodo `errorCorrection`. | Error Correction | Assurance Provided | | --- | --- | | L | 7% of codewords can be restored. | | M | 15% of codewords can be restored. | | Q | 25% of codewords can be restored. | | H | 30% of codewords can be restored. | >Più error correction viene usata, più sarà grande il QrCode e meno dati sarà in grando di contenere. Leggi di più a riguardo [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### Encoding Puoi cambiare l'encoding dei caratteri utilizzato per creare il codice Qr. Di default è selezionato `ISO-8859-1`. Leggi di più a riguardo [character encoding](http://en.wikipedia.org/wiki/Character_encoding) Puoi cambiare l'encoding utilizzando: QrCode::encoding('UTF-8')->generate('Trasformami in un QrCode con simboli speciali ??!!'); | Encoder dei caratteri | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >L'errore `Could not encode content to ISO-8859-1` significa che si sta usando l'encoding erraro. E' raccomandato usare `UTF-8` se non si è sicuri. #### Merge Il metodo `merge` unisce un immagine con un QrCode. Il merge è molto usato per inserire loghi in un codice Qr. QrCode::merge($filename, $percentage, $absolute); //Genera un QrCode con una immagine al centro. QrCode::format('png')->merge('path-to-image.png')->generate(); //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >Il metodo `merge` supporta solamente il formato PNG. >Il percorso specificato è relativo alla base path se `$absolute` è impostata su `false`. Cambiare questa variabile in `true` per utilizzare percorsi assoluti. >Dovresti usare un alto livello di error correction quando usi il metodo `merge` per assicurarti che il Qr sia ancora leggibile. Raccomandiamo di usare `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String Il metodo `mergeString` può essere usato per ottenere quasi lo stesso risultato di `merge`, con la differenza che permette di inserire una rappresentazione testuale del file al posto del percorso. Questo è utile quando si lavora con la facade `Storage`. La sua interfaccia è molto simile a quella di `merge`. QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); //Genera un QrCode con una immagine al centro. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >Come la chiamata a `merge`, anche questa volta è supportato solamente il formato PNG. Lo stesso vale per gli error correction, H è il valore raccomandato. #### Utilizzo Avanzato Tutti i metodi supportano il chaining. Il metodo `generate` deve essere chiamato per ultimo e tutti gli eventuali metodi `format` devono essere chiamati per primi. Per esempio sono validi i seguenti: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Trasformami in un QrCode!'); Puoi mostrare un'immagine PNG senza salvare il file relativo impostando una stringa e scegliendo l'encoding `base64_encode`. ## Helpers #### Cosa sono gli helpers? Gli Helpers sono un metodo molto semplice per creare codici Qr che permettono al lettore di eseguire una certa azione quando scansionati. #### E-Mail Questo helper genera un QrCode in grado di riempire i campi di una e-mail quali indirizzo, oggetto e corpo. QrCode::email($to, $subject, $body); //Fills in the to address QrCode::email('foo@bar.com'); //Fills in the to address, subject, and body of an e-mail. QrCode::email('foo@bar.com', 'Questo è l'oggetto.', 'Questo è il corpo del messaggio.'); //Fills in just the subject and body of an e-mail. QrCode::email(null, 'Questo è l'oggetto.', 'Questo è il corpo del messaggio.'); #### Geo Questo helper genera una latitudine e una longitudine che un telefono può leggere ed aprire con Google Maps o applicazioni simili. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Numeri di Telefono Questo helper genera un QrCode che, una volta scansionato, digita un numero di telefono. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Messaggi) Questo helper crea messaggi SMS che possono essere precompilati con il destinatario e il corpo del messaggio. QrCode::SMS($phoneNumber, $message); //Creates a text message with the number filled in. QrCode::SMS('555-555-5555'); //Creates a text message with the number and message filled in. QrCode::SMS('555-555-5555', 'Corpo del messaggio.'); #### WiFi Questo helper crea codici Qr scansionabili che permettono la connessione del telefono ad una determinata rete WiFi. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID della rete', 'password' => 'Password della rete', 'hidden' => 'Whether the network is a hidden SSID or not.' ]); //Connects to an open WiFi network. QrCode::wiFi([ 'ssid' => 'Nome Rete', ]); //Connects to an open, hidden WiFi network. QrCode::wiFi([ 'ssid' => 'Nome Rete', 'hidden' => 'true' ]); //Connects to an secured, WiFi network. QrCode::wiFi([ 'ssid' => 'Nome Rete', 'encryption' => 'WPA', 'password' => 'miaPassword' ]); >La scansione WiFi non è al momento supportata sui dispositivi Apple. ##Uso generico dei QrCode Puoi utilizzare un prefisso della tabella sottostante per generare dei codici Qr in grado di contenere maggiori informazioni: QrCode::generate('http://www.simplesoftware.io'); | Usage | Prefix | Example | | --- | --- | --- | | Website URL | http:// | http://www.simplesoftware.io | | Secured URL | https:// | https://www.simplesoftware.io | | E-mail Address | mailto: | mailto:support@simplesoftware.io | | Phone Number | tel: | tel:555-555-5555 | | Text (SMS) | sms: | sms:555-555-5555 | | Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Geo Address | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ##Uso al di fuori di Laravel Puoi usare questo package al di fuori di Laravel istanziando una nuova classe `BaconQrCodeGenerator`. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Crea un QrCode senza Laravel!'); simple-qrcode/docs/zh-cn/README.md000064400000036440152427536730012563 0ustar00[![构建状态](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![最新稳定版本](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![最新版本](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![许可](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![下载量](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [介绍](#docs-introduction) - [升级指南](#docs-upgrade) - [配置](#docs-configuration) - [简例](#docs-ideas) - [使用说明](#docs-usage) - [助手模板](#docs-helpers) - [QrCode 常规用法](#docs-common-usage) - [在Laravel外的调用方式](#docs-outside-laravel) ## 介绍 Simple QrCode 是基于[Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode) 开发,适用于Laravel框架的软件包. 我们的目的是让二维码能更加便捷的使用在Laravel框架的项目里. ![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) ## 升级指南 从v2版本升到v3需要将 `composer.json` 文件中版本改为 `~3` 如果你需要使用 `png` 文件格式,那么你**必须**安装 `imagick` PHP扩展. ## 配置 #### Composer安装 使用 `composer require simplesoftwareio/simple-qrcode "~3"` 安装软件包, Laravel将会自动完成安装工作. #### 添加 Service Provider ###### Laravel <= 5.4 注册 `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` 至 `config/app.php` 的 `providers` 数组里. #### 添加 Aliases ###### Laravel <= 5.4 最后,注册 `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` 至 `config/app.php` 的 `aliases` 数组里. ## 简例 #### 显示视图 一个重要的应用是在页面中添加来源二维码.这样我们的用户就可以通过扫码返回初始页.我们只需要在 footer.blade.php 文件里添加如下代码即可!
{!! QrCode::size(100)->generate(Request::url()); !!}

扫我返回初始页

#### 嵌入二维码 你也可以嵌入二维码在你的邮件中,让收信的用户可以快速扫描.以下是在Laravel中实现的例子: //Inside of a blade template. ## 使用说明 #### 基本使用 使用QrCode的Generator非常方便. 多数情况下只要这样: QrCode::generate('Make me into a QrCode!'); 这就能创建一个内容是:"Make me into a QrCode!" 的二维码了. #### 生成 `generate(string $data, string $filename = null)` `Generate` 是用来创建二维码的方法. QrCode::generate('Make me into a QrCode!'); >注意:要创建二维码必须使用此方法 `Generate` 默认返回一个 SVG 格式的图片文本. 你可以直接在Laravel 的 Blade页面 中使用,使用方式如下: {!! QrCode::generate('Make me into a QrCode!'); !!} `generate` 方法的第二个参数是指定要存储图片数据的文件地址及命名. QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### 格式 `format(string $format)` 现支持 PNG,EPS,SVG 三种格式,设置方式如下: QrCode::format('png'); //放回PNG图片 QrCode::format('eps'); //放回EPS图片 QrCode::format('svg'); //放回SVG图片 > 必须 `imagick` PHP扩展才能生成 `png` 图片. #### 尺寸 `size(int $size)` >QrCode 的 Generator 默认返回可能最小像素单位的二维码. 你可以使用 `size` 方法来设置二维码尺寸.下方是设置像素尺寸的方法: QrCode::size(100); ![200 像素](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 像素](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) #### 颜色 `color(int $red, int $green, int $blue, int $alpha = null)` >注意改变颜色后,可能会导致某些设备难以识别. 颜色设置的格式必须是RGBA格式. 设置方式如下: QrCode::color(255, 0, 0); // 红色二维码 QrCode::color(255, 0, 0, 25); //红色二维码+25%透明度 ![红色二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![红色透明二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) #### 背景颜色 `backgroundColor(int $red, int $green, int $blue, int $alpha = null)` 你可以使用`backgroundColor` 方法来设置背景颜色. QrCode::backgroundColor(255, 0, 0); // 红色背景二维码 QrCode::backgroundColor(255, 0, 0, 25); // 红色25%透明背景二维码 ![红色背景二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![红色透明背景二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) #### 渐变 `gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` 你可以使用 `gradient` 方法设置渐变. 支持以下渐变类型: | 类型 | 范例 | | --- | --- | | `vertical`垂直 | ![垂直](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | | `horizontal`水平 | ![水平](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | | `diagonal`对角 | ![对角](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | | `inverse_diagonal`反对角 | ![反对角](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | | `radial`迳向 | ![迳向](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | #### 定位颜色 `eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` 你可以使用 `eyeColor` 方法设置定位眼颜色. | 数量 | 范例 | | --- | --- | | `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | | `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| | `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | #### 风格 `style(string $style, float $size = 0.5)` 二维码风格可以轻易的使用 `square`, `dot` 或 `round`来调换. 这将改变二维码中的信息块风格. 第二个参数是设置dot'点'的大小和round的圆度. | 风格 | 范例 | | --- | --- | | `sqaure`方 | ![方](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `dot`点 | ![点](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| | `round`圆 | ![圆](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | #### 定位眼风格 `eyeStyle(string $style)` 二维码定位眼支持2个格式, `sqaure`方 和 `circle`圆. | 风格 | 范例 | | --- | --- | | `sqaure`方 | ![方](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `circle`圆 | ![圆](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| #### 边距 `margin(int $margin)` 也支持设置边距. 设置方式如下: QrCode::margin(100); #### 容错级别 改变二维码的容错级别也很方便. 只要这么设置: QrCode::errorCorrection('H'); 下方是 `errorCorrection` 方法支持的容错级别设置. | 容错级别 | 说明 | | --- | --- | | L | 7% 的字节码恢复率. | | M | 15% 的字节码恢复率. | | Q | 25% 的字节码恢复率. | | H | 30% 的字节码恢复率. | >容错级别越高,二维码越大且能存储的数据越少. 详情见: [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### 编码 QrCode 创建二维码时可以使用不同的编码. 默认使用 `ISO-8859-1`. 详情见 [character encoding](http://en.wikipedia.org/wiki/Character_encoding) 你可以使用以下的任一种编码: QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); | 编码 | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | > 若抛出 `Could not encode content to ISO-8859-1` 意味着使用了错误的编码. 我们建议你使用 `UTF-8`. #### 合并 `(string $filepath, float $percentage = .2, bool $absolute = false)` `merge` 方法可以让QrCode为生成结果加上图片. 常见的用法是在二维码上加Logo. //生成中间有图片的二维码 QrCode::format('png')->merge('path-to-image.png')->generate(); //生成中间有图片的二维码,且图片占整个二维码图片的30%. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //生成中间有图片的二维码,且图片占整个二维码图片的30%. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); > `merge` 方法当前只支持PNG格式的图片 > 默认使用相对于应用程序的根路径,把第三个参数设置为 `true` 就能切换到使用绝对路径 > 为了让二维码保持高可识别度,建议在使用 `merge` 方法时把二维码的容错级别提高. 我们推荐使用: `errorCorrection('H')`. ![合并Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### 二进制合并 `(string $content, float $percentage = .2)` `mergeString` 方法与 `merge` 方法类似, 不同的是它允许你使用一个二进制的String代替图片文件. 这在使用 `Storage` 存储时,会显得很方便. 它的参数与 `merge` 类似. //生成中间有图片的二维码 QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //生成中间有图片的二维码,且图片占整个二维码图片的30%. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); > 和 `merge` 方法一样,当前只支持PNG格式. 同样建议将二维码的容错级别提高. #### 高级用法 所有的方法都支持链式调用. `generate` 方法必须在最后. 例如: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); 你还能不存储图片,而使用 `base64_encode` 来将二进制数据直接显示成二维码图片. ## 助手模板 #### 什么是助手模板? 助手模板生成一些简易二维码, 扫描二维码时会进行某些操作. #### BitCoin比特币 这个模板生成可扫描二维码的来接受比特币支付. [详情](https://bitco.in/en/developer-guide#plain-text) QrCode::BTC($address, $amount); //发送0.334BTC到该地址 QrCode::BTC('bitcoin address', 0.334); //发送0.334BTC到该地址和一些可选设置 QrCode::size(500)->BTC('address', 0.0034, [ 'label' => 'my label', 'message' => 'my message', 'returnAddress' => 'https://www.returnaddress.com' ]); #### E-Mail 这个模板可以生成一个直接发E-mail的二维码.包含了发邮件的地址,标题,和内容 QrCode::email($to, $subject, $body); //加入一个邮件地址 QrCode::email('foo@bar.com'); //加一个邮件地址、标题、内容至二维码. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //只加标题和内容. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### 位置 这个模板能创建一个包含一个经纬度的位置二维码, 并在谷歌地图或类似应用中打开. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### 手机号 这个模板能创建一个包含手机号的二维码, 并拨号. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### 短信 这个模板能创建能创建一个包含发送短信目标手机号和内容的二维码. QrCode::SMS($phoneNumber, $message); //创建一个只有手机号的短信二维码. QrCode::SMS('555-555-5555'); //创建一个包含手机号和文字内容的短信二维码. QrCode::SMS('555-555-5555', 'Body of the message'); #### WiFi 这个模板能创建扫一下能连接WIFI的二维码. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => '网络的SSID', 'password' => '网络的密码', 'hidden' => '是否是一个隐藏SSID的网络' ]); //连接一个开放的网络 QrCode::wiFi([ 'ssid' => '网络名称', ]); //连接一个开放并隐藏的网络. QrCode::wiFi([ 'ssid' => '网络名称', 'hidden' => 'true' ]); //连接一个加密的WIFI网络. QrCode::wiFi([ 'ssid' => '网络名称', 'encryption' => 'WPA', 'password' => '密码' ]); > WIFI扫描目前苹果产品不支持. ##QrCode 常规用法 你还能通过下面表中的前缀信息创建适合更多场合的二维码 QrCode::generate('http://www.simplesoftware.io'); | 使用场景 | 前缀 | 例子 | | --- | --- | --- | | 网址 | http:// | http://www.simplesoftware.io | | 加密网址 | https:// | https://www.simplesoftware.io | | E-mail 地址 | mailto: | mailto:support@simplesoftware.io | | 电话号码 | tel: | tel:555-555-5555 | | 文字短信 | sms: | sms:555-555-5555 | | 文字短信内容 | sms: | sms::I am a pretyped message | | 文字短信同时附带手机号和短信内容 | sms: | sms:555-555-5555:I am a pretyped message | | 坐标 | geo: | geo:-78.400364,-85.916993 | | MeCard名片 | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard名片 | BEGIN:VCARD | [更多范例](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ##在Laravel外的调用方式 你还可以在Laravel框架之外调用,只需要实例化 `BaconQrCodeGenerator` 类. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Make a qrcode without Laravel!'); simple-qrcode/docs/ja/README.md000064400000034706152427536730012141 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) #### [Español](https://www.simplesoftware.io/simple-qrcode/es) | [Français](https://www.simplesoftware.io/simple-qrcode/fr) | [Italiano](https://www.simplesoftware.io/simple-qrcode/it) | [Português](https://www.simplesoftware.io/simple-qrcode/pt-br) | [Русский](https://www.simplesoftware.io/simple-qrcode/ru) | [हिंदी](https://www.simplesoftware.io/simple-qrcode/hi) | [汉语](https://www.simplesoftware.io/simple-qrcode/zh) - [Introduction](#docs-introduction) - [Translations](#docs-translations) - [Configuration](#docs-configuration) - [Simple Ideas](#docs-ideas) - [Usage](#docs-usage) - [Helpers](#docs-helpers) - [Common QrCode Usage](#docs-common-usage) - [Usage Outside of Laravel](#docs-outside-laravel) ## イントロダクション Simple QrCode は [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode)を元に作られた 人気のあるLaravelフレームワークで簡単に使う事のできるラッパーです。 Simple QrCode is an easy to use wrapper for the popular Laravel framework based on the great work provided by [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). We created an interface that is familiar and easy to install for Laravel users. ## 翻訳 この文書の翻訳を手伝ってくれるアラビア語、スペイン語、フランス語、韓国語、日本語を話すユーザーを探しています。 翻訳が可能な場合はプルリクエストを作成してください。 We are looking for users who speak Arabic, Spanish, French, Korean or Japanese to help translate this document. Please create a pull request if you are able to make a translation! ## 設定 #### Composer 最初にあなたの `composer.json` に Simple QrCode パッケージを追加する必要があります。 "require": { "simplesoftwareio/simple-qrcode": "~2" } 追加したら `composer update` コマンドを実行します。 #### サービスプロバイダー ###### Laravel <= 5.4 (あなたが Simple QrCode を入れる laravelの) `config/app.php` の `providers`配列 に `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` を登録します。 #### Aliases ###### Laravel <= 5.4 最後に `config/app.php` の `aliases`配列に `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` を登録します。 ## かんたんに使う #### 画面に表示する このパッケージの主なアイテムは 画面に表示する機能です。 カスタマーはコードをスキャンするだけで 画面に戻ることが出来ます。以下の内容をfooter.blade.php に追加しました。
{!! QrCode::size(100)->generate(Request::url()); !!}

Scan me to return to the original page.

#### QrCodeを埋め込む ユーザーがすばやくスキャンできるように、電子メールの中にqrcodeを埋め込むことができます。 以下はLaravelでこれを行う方法の例です。 //Inside of a blade template. ## Usage #### 基本的な使い方 QrCode Generatorを使うのはとても簡単です。 最も基本的な構文は次のとおりです。 QrCode::generate('Make me into a QrCode!'); これで「Make me into a QrCode!」というQrCodeが作成されます。 #### 生成する `Generate`はQrCodeを作るのに使われます。 QrCode::generate('Make me into a QrCode!'); >要注意: チェーン内で使用する場合は、このメソッドを最後に呼び出す必要があります。 `Generate`はデフォルトで SVG イメージ文字列を返します。 Laravel Bladeに以下の様に書くことで モダンなブラウザに表示することができます。 {!! QrCode::generate('Make me into a QrCode!'); !!} `generate`メソッドの第二引数はQrCodeを保存するパスとファイルネームです。 QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### フォーマットを変える >QrCode Generator のデフォルトフォーマットはSVGイメージです。 >要注意: `format`メソッドは` size`、 `color`、` backgroundColor`、 `margin`のような他のフォーマットオプションの前に呼ばれなければなりません。 現在PNG、EPS、およびSVGの 3つのフォーマットがサポートされています。 フォーマットを変更するには、次のコードを使用します。 QrCode::format('png'); //Will return a PNG image QrCode::format('eps'); //Will return a EPS image QrCode::format('svg'); //Will return a SVG image #### サイズの変更 >QrCode GeneratorはデフォルトでQrCodeを作成するためにピクセルで可能な最小サイズを返します。 `size`メソッドを使うことでQrCodeのサイズを変えることができます。 次の構文を使用して、必要なサイズをピクセル単位で指定します。 QrCode::size(100); #### 色の変更 >要注意 色を変えるときには注意してください。QrCodeの読み込みが難しくなる 色が有ります。 すべての色はRGB (Red Green Blue)で表現する必要があります。 次のようにしてQrCodeの色を変更できます: QrCode::color(255,0,255); 背景色の変更もサポートされており、同じ方法で表現できます。 QrCode::backgroundColor(255,255,0); #### マージンの変更 QrCode周辺のマージンを変更する機能もサポートされています。 次の構文を使用してマージンを指定します: QrCode::margin(100); #### Error Correction Changing the level of error correction is easy. Just use the following syntax: QrCode::errorCorrection('H'); The following are supported options for the `errorCorrection` method. | Error Correction | Assurance Provided | | --- | --- | | L | 7% of codewords can be restored. | | M | 15% of codewords can be restored. | | Q | 25% of codewords can be restored. | | H | 30% of codewords can be restored. | >The more error correction used; the bigger the QrCode becomes and the less data it can store. Read more about [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### Encoding Change the character encoding that is used to build a QrCode. By default `ISO-8859-1` is selected as the encoder. Read more about [character encoding](http://en.wikipedia.org/wiki/Character_encoding) You can change this to any of the following: QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); | Character Encoder | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >An error of `Could not encode content to ISO-8859-1` means that the wrong character encoding type is being used. We recommend `UTF-8` if you are unsure. #### Merge The `merge` method merges an image over a QrCode. This is commonly used to placed logos within a QrCode. QrCode::merge($filename, $percentage, $absolute); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->merge('path-to-image.png')->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >The `merge` method only supports PNG at this time. >The filepath is relative to app base path if `$absolute` is set to `false`. Change this variable to `true` to use absolute paths. >You should use a high level of error correction when using the `merge` method to ensure that the QrCode is still readable. We recommend using `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String The `mergeString` method can be used to achieve the same as the `merge` call, except it allows you to provide a string representation of the file instead of the filepath. This is usefull when working with the `Storage` facade. It's interface is quite similar to the `merge` call. QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >As with the normal `merge` call, only PNG is supported at this time. The same applies for error correction, high levels are recommened. #### Advance Usage All methods support chaining. The `generate` method must be called last and any `format` change must be called first. For example you could run any of the following: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); You can display a PNG image without saving the file by providing a raw string and encoding with `base64_encode`. ## Helpers #### What are helpers? Helpers are an easy way to create QrCodes that cause a reader to perform a certain action when scanned. #### BitCoin This helpers generates a scannable bitcoin to send payments. [More information](https://bitco.in/en/developer-guide#plain-text) QrCode::BTC($address, $amount); //Sends a 0.334BTC payment to the address QrCode::BTC('bitcoin address', 0.334); //Sends a 0.334BTC payment to the address with some optional arguments QrCode::size(500)->BTC('address', 0.0034, [ 'label' => 'my label', 'message' => 'my message', 'returnAddress' => 'https://www.returnaddress.com' ]); #### E-Mail This helper generates an e-mail qrcode that is able to fill in the e-mail address, subject, and body. QrCode::email($to, $subject, $body); //Fills in the to address QrCode::email('foo@bar.com'); //Fills in the to address, subject, and body of an e-mail. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //Fills in just the subject and body of an e-mail. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### Geo This helper generates a latitude and longitude that a phone can read and open the location up in Google Maps or similar app. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Phone Number This helper generates a QrCode that can be scanned and then dials a number. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Text Messages) This helper makes SMS messages that can be prefilled with the send to address and body of the message. QrCode::SMS($phoneNumber, $message); //Creates a text message with the number filled in. QrCode::SMS('555-555-5555'); //Creates a text message with the number and message filled in. QrCode::SMS('555-555-5555', 'Body of the message'); #### WiFi This helpers makes scannable QrCodes that can connect a phone to a WiFI network. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID of the network', 'password' => 'Password of the network', 'hidden' => 'Whether the network is a hidden SSID or not.' ]); //Connects to an open WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', ]); //Connects to an open, hidden WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'hidden' => 'true' ]); //Connects to an secured, WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'encryption' => 'WPA', 'password' => 'myPassword' ]); >WiFi scanning is not currently supported on Apple Products. ## Common QrCode Usage You can use a prefix found in the table below inside the `generate` section to create a QrCode to store more advanced information: QrCode::generate('http://www.simplesoftware.io'); | Usage | Prefix | Example | | --- | --- | --- | | Website URL | http:// | http://www.simplesoftware.io | | Secured URL | https:// | https://www.simplesoftware.io | | E-mail Address | mailto: | mailto:support@simplesoftware.io | | Phone Number | tel: | tel:555-555-5555 | | Text (SMS) | sms: | sms:555-555-5555 | | Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Geo Address | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ## Usage Outside of Laravel You may use this package outside of Laravel by instantiating a new `BaconQrCodeGenerator` class. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Make a qrcode without Laravel!'); simple-qrcode/docs/ru/README.md000064400000044657152427536730012203 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [Введение](#docs-introduction) - [Переводы](#docs-translations) - [Конфигурация](#docs-configuration) - [Простые Идеи](#docs-ideas) - [Использование](#docs-usage) - [Хелперы](#docs-helpers) - [Префиксы](#docs-common-usage) - [Использование без Laravel](#docs-outside-laravel) ## Введение Simple QrCode - простая в использовании обёртка для популярного фреймворка Laravel на основе превосходного проекта [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Мы создали интерфейс, который привычен и прост в установке для пользователей Laravel. ## Переводы Мы ищем пользователей, говорящих на китайском, корейском или японском языках, которые могут помочь перевести этот документ. Пожалуйста, создайте пул реквест, если вы можете сделать перевод! ## Конфигурация ### Composer Находясь в директории вашего проекта laravel, выполните команду: ```bash composer require simplesoftwareio/simple-qrcode ``` Либо добавьте пакет `simplesoftwareio/simple-qrcode` в раздел `require` файла `composer.json`: ```json "require": { "simplesoftwareio/simple-qrcode": "~2" } ``` Затем запустите команду `composer update`. ### Поставщик услуг (Laravel <= 5.4) Добавьте строчку ``` SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class ``` в конец массива `providers` в файле `config/app.php`. ### Алиас (Laravel <= 5.4) Добавьте строчку ``` 'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class ``` в конец массива `aliases` в файле `config/app.php`. ## Простые Идеи ### Печать страниц Мы используем QR-коды на страница для печати. Это позволяет нашим клиентам открыть исходную страницу на устройстве после печати, просто отсканировав этот код. Для этого в файл `footer.blade.php` мы добавили следующий код: ```blade
{!! QrCode::size(100)->generate(Request::url()); !!}

Отсканируйте QR-код, чтобы открыть исходную страницу

``` ### Вставка QR-кода в email Вы можете вставить QR-код в email, чтобы позволить пользователям быстро его отсканировать. Ниже приведен пример того, как сделать это с помощью Laravel: ```blade // внутри шаблона blade ``` ## Использование ### Общий случай использования Использовать генератор для QR-код очень легко. Достаточно вызвать один метод: ```php QrCode::generate('Lorem ipsum!'); ``` Этот код создаст QR-код с текстом "Lorem ipsum!". ### Генерация изображений Используйте метод `generate()`, чтобы создать изображение QR-кода: ```php QrCode::generate('Lorem ipsum!'); ``` > Внимание! При вызове в цепочке методов этот метод должен вызываться в конце. Метод `generate()` по умолчанию возвращает строку, содержащую SVG-представление изображения. Поэтому её можно вывести как есть прямо в браузер внутри Blade-шаблона: ```blade {!! QrCode::generate('Lorem ipsum!'); !!} ``` Чтобы сохранить изображение QR-кода в файл, передайте методу `generate()` путь к файлу вторым аргументом: ```blade QrCode::generate('Lorem ipsum!', '../public/qrcodes/qrcode.svg'); ``` ### Изменение формата > По умолчанию QR-код создаётся в формате SVG. > **Обратите внимание!** Метод `format()` должен вызываться **перед** всеми остальными методами форматирования, такими как `size()`, `color()`, `backgroundColor()` и `margin()`. На данный момент поддерживаются три формата: PNG, EPS и SVG. Для изменения формата используйте следующий код: ```php QrCode::format('png'); QrCode::format('eps'); QrCode::format('svg'); ``` ### Изменение размера > По умолчанию QR-код создаётся наименьшего размера. Вы можете изменить размер QR-код с помощью метода `size()`. Просто укажите размер желаемого в пикселях, используя следующий синтаксис: ```php QrCode::size(100); ``` ### Изменение цветов > Будьте осторожны при изменении цветов QR-кода. > Это может затруднить его сканирование. Вы можете изменить цвет клеток на изображении. Для этого следует использовать метод `color()`. Три аргумента этого метода - значения RGB-палитры соответственно. Например, так можно сделать клетки розовыми: ```php QrCode::color(255, 0, 255); ``` Также поддерживается изменение цвета фона методом `backgroundColor()`. Например, следующий код сделает фон не белым, а жёлтым: ```php QrCode::backgroundColor(255, 255, 0); ``` ### Поля Вы можете изменить внутренние поля изображения. Это поможет повысить вероятность успешного сканирования. Просто укажите количество пикселей между краем изображения и матрицей: ```php QrCode::margin(100); ``` ### Уровень коррекции ошибок Для изменения уровня коррекции ошибок используйте следующий метод: ```php QrCode::errorCorrection('H'); ``` Метод `errorCorrection()` поддерживает следующие уровни: | Уровень | Допуск ошибок | | ------- | ------------- | | L | 7% | | M | 15% | | Q | 25% | | H | 30% | > Чем выше уровень коррекции, тем больше становится QR-код и тем меньше данных он может хранить. > [Подробнее](https://ru.wikipedia.org/wiki/QR-%D0%BA%D0%BE%D0%B4#.D0.9E.D0.B1.D1.89.D0.B0.D1.8F_.D1.82.D0.B5.D1.85.D0.BD.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B0.D1.8F_.D0.B8.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D1.8F). ### Кодировка символов По умолчанию используется кодировка `ISO-8859-1`. [Подробнее о кодировках символов](https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2). Вы можете кодировку, используя метод `encoding()`: ```php QrCode::encoding('UTF-8')->generate('‘Lorem ipsum со специальными символами ♠♥!!'); ``` Полный список поддерживаемых кодировок: | Кодировка | | ------------ | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | > Ошибка `Could not encode content to ISO-8859-1` означает, что вы передали в метод `generate()` строку, символы которой невозможно перевести в ISO-8859-1. > Если вы не уверены какую кодировку использовать в вашем случае, то перед вызовом `generate()` установите кодировку `UTF-8`. ### Наложение изображений на QR-код (из файла) Метод `merge()` накладывает указанное изображение на QR-код. Это обычно используется для логотипов, размащаемых в пределах QR-кода. ```php QrCode::merge($filename, $percentage, $absolute); // Создает QR-код с изображением в центре QrCode::format('png')->merge('path-to-image.png')->generate(); // Создает QR-код с изображением в центре // Вставленное изображение занимает 30% QR-кода QrCode::format('png')->merge('path-to-image.png', .3)->generate(); QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); ``` > На данный момент метод `merge()` поддерживает только PNG. > По умолчанию путь к файлу считается относительно `base_path()` вашего проекта. > Если вы указываете абсолютный путь к файлу, то передайте `true` третьим аргументом. > Вы должны использовать высокий уровень коррекции ошибок при использовании метода `merge()` чтобы QR-код остался читаемым. > Рекомендуется использовать `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) ### Наложение изображений на QR-код (из двоичной строки) Метод `mergeString()` может быть использован для решения той же задачи, что и `merge()`. Отличие в том, что `mergeString()` принимает строковое представление файла вместо пути к файлу. Это полезно при работе с фасадом `Storage`. Этот интерфейс очень похож на вызов `merge()`. > Как и в случае с `merge()`, здесь поддерживается только PNG-формат. > То же самое относится к коррекции ошибок - рекомендуется использовать высокие уровни. ### Дополнительный функционал Все методы поддерживают последовательный вызов. Вызывайте метод `generate()` в последнюю очередь, после применения форматирования. Примеры последовательных вызовов: ```php QrCode::size(250) ->color(150, 90, 10) ->backgroundColor(10, 14, 244) ->generate('Lorem ipsum!'); QrCode::format('png') ->size(399) ->color(40, 40, 40) ->generate('Lorem ipsum!'); ``` Вы можете отобразить в браузере PNG-изображение без его сохранения в файл, выводя закодированную при помощи `base64_encode()` необработанную строку: ```blade ``` ## Хелперы ### Что такое хелперы? Хелперы предоставляют простой способ создания QR-кода, который заставляет сканер пользователя выполнить определенное действие. ### Электронная Почта Этот хелпер генерирует QR-код для создания email. Можно указать email адресата, тему и текст письма. ```php QrCode::email($to, $subject, $body); // Заполняет адресата QrCode::email('foo@bar.com'); // Заполняет адресата, тему и текст сообщения электронной почты. QrCode::email('foo@bar.com', 'Это тема', 'Это текст'); // Заполняет только тему и текст сообщения электронной почты. QrCode::email(null, 'Это тема', 'Это текст'); ``` ### Geo Этот хелпер генерирует QR-код с координатами точки на карте. Для этого нужно указать её широту и долготу. Смартфон пользователя может открыть указанное местоположение в Google Maps или другом приложении карт. ```php QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); ``` ### Номер телефона Этот хелпер генерирует QR-код, при помощи которого можно быстро совершить звонок: ```php QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); ``` ### СМС Этот хелпер создаёт СМС-сообщение, в котором уже может быть указан номер телефона адресата и текст сообщения: ```php QrCode::SMS($phoneNumber, $message); // Создает СМС, где номер телефона уже заполнен. QrCode::SMS('555-555-5555'); // Создает СМС, где номер и текст уже заполнены. QrCode::SMS('555-555-5555', 'текст сообщения.'); ``` ### WiFi Эти хелперы создают QR-коды, которые помогут подключить смартфон к Wi-Fi: ```php QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'идентификатор сети (SSID)', 'password' => 'пароль сети', 'hidden' => 'является ли сеть скрытой (true/false)' ]); // Подключается к открытой сети WiFi. QrCode::wiFi([ 'ssid' => 'Имя сети', ]); // Подключается к открытой или скрытой сети WiFi. QrCode::wiFi([ 'ssid' => 'Имя сети', 'hidden' => 'true' ]); // Подключается к защищенной сети. QrCode::wiFi([ 'ssid' => 'Имя сети', 'encryption' => 'WPA', 'password' => 'Мой пароль' ]); ``` > Сканирование WiFi в настоящее время не поддерживается устройствами Apple. ## Префиксы Вы можете использовать префиксы вместо хелперов. Составьте строку по образцу, как в таблице ниже, и передайте её в метод `generate()`, чтобы добиться того же эффекта, как при использовании хелперов: ```php QrCode::generate('http://www.simplesoftware.io'); ``` | Применение | Префикс | Пример | | --- | --- | --- | | Ссылка на сайт | http:// | http://www.simplesoftware.io | | Безопасная ссылка | https:// | https://www.simplesoftware.io | | Email | mailto: | mailto:support@simplesoftware.io | | Телефон для звонка | tel: | tel:555-555-5555 | | СМС | sms: | sms:555-555-5555 | | СМС с текстом сообщения | sms: | sms::Какое-то сообщение | | СМС с текстом сообщения и номером адресата | sms: | sms:555-555-5555:Какое-то сообщение | | Местоположение на карте | geo: | geo:-78.400364,-85.916993 | | Визитка (MeCard) | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | Контакт (VCard) | BEGIN:VCARD | [Примеры](https://ru.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ## Использование без Laravel Вы можете использовать этот пакет за пределами Laravel, просто создав новый объект класса `BaconQrCodeGenerator`. ```php use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Создайте QR-код без Laravel!'); ``` simple-qrcode/docs/hi/README.md000064400000047205152427536730012145 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [परिचय](#docs-introduction) - [अनुवाद](#docs-translations) - [विन्यास](#docs-configuration) - [साधारण विचार](#docs-ideas) - [उपयोग](#docs-usage) - [सहायक](#docs-helpers) - [साधारण QrCode उपयोग](#docs-common-usage) - [लरावेल(Laravel) के बाहर उपयोग](#docs-outside-laravel) ## परिचय सरल क्यूआरकोड [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode) द्वारा प्र्दान किए गये महान कार्य पर आधारित लोकप्रिय Laravel ढ़ाचा के लिए आसानी से प्रयोग करने योग्य आवरण है। हमने लरावेल उपयोगकर्ताओं के लिए परिचित व आसानी से स्थापित करने योग्य एक अंतरफलक बनाया है। ## अनुवाद हमे उनकी खोज है जो इस दस्तावेज़ का अरबी, स्पेनिश, फ्रेंच, कोरियाई या जापानी मे अनुवाद करने मे मदद कर सकते हैं। यदि आप एक अनुवाद करने में सक्षम हैं तो कृपया एक पुल अनुरोध बनाए! ## विन्यास #### Composer सर्वप्रथं composer.json मे qrcode पॅकेज को अपने require से जोड़ें: "require": { "simplesoftwareio/simple-qrcode": "~2" } फिर composer update कमॅंड चलाएँ। #### Service Provider ###### Laravel <= 5.4 config/app.php में providers array में SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class को रजिस्टर करें। #### Aliases (उपनाम) ###### Laravel <= 5.4 आखिर में 'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class को config/app.php विन्यास फ़ाइल में aliases array में रजिस्टर करें। ## साधारण विचार #### Print View (प्रिंट देखें) इस पैकेज का मुख्य रूप से उपयोग हम सभी print views मे QrCode डालने के लिए करते हैं। यह हमारे ग्राहकों को स्कैन करके के बाद मूल पृष्ठ पर लौटने के लिए अनुमित करता है। हमने अपने footer.blade.php फ़ाइल में निम्न जोड़कर इसे हासिल किया है।
{!! QrCode::size(100)->generate(Request::url()); !!}

Scan me to return to the original page.

#### Embed A QrCode अपने उपयोगकर्ताओं को जल्दी से स्कैन करने के लिए आप एक ई-मेल के अंदर एक qrcode एम्बेड कर सकते हैं। निम्नलिखित लरावेल के साथ ऐसा करने का एक उदाहरण है। //Inside of a blade template. ## उपयोग #### Basic Usage (साधारण उपयोग) QrCode Generator का उपयोग बेहद आसान है: QrCode::generate('Make me into a QrCode!'); इससे qrcode कहेगा है कि "मुझे एक qrcode में बनाओ!" #### Generate Generate QrCode बनाने के काम आता है। QrCode::generate('Make me into a QrCode!'); >सचेत! यह विधि श्रृंखला में अंतिम में पुकारी जानी चाहिए। `जेनरेट` डिफ़ॉल्ट रूप से SVG छवि की स्ट्रिंग लौटता है। आप इसे सीधे ही Laravel's Blade system से निम्न प्रकार से किसी भी आधुनिक ब्राउज़र मे प्रिंट ले सकते हैं: {!! QrCode::generate('Make me into a QrCode!'); !!} उत्पन्न विधि का एक दूसरे पैरामीटर है जो एक फ़ाइल का नाम और पथ QrCode को बचाने के लिए स्वीकार करता है। QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### Format Change(प्रारूप बदलें) >QrCode Generator डिफ़ॉल्ट रूप से SVG चित्र लौटाता है. >ध्यान रहे! `format` की विधि को किसी भी अन्य स्वरूपण विकल्प जैसे कि `size`, `color`, `backgroundColor`, व `margin` से पहले ही कॉल करें. निम्न तीन स्वरूप वर्तमान मे समर्थित हैं; PNG, EPS, और SVG. निम्न कोड का उपयोग करें: QrCode::format('png'); //Will return a PNG image QrCode::format('eps'); //Will return a EPS image QrCode::format('svg'); //Will return a SVG image #### Size Change (आकार बदल) >QrCode Generator डिफ़ॉल्ट रूप से सबसे छोटी संभव आकार से QrCode बनाएग। आप `आकार` विधि का उपयोग कर एक QRCode का आकार बदल सकते हैं। बस निम्न वाक्य-विन्यास का उपयोग करके पिक्सल मे वांछित आकर निर्दिष्ट करें: QrCode::size(100); #### Color Change (रंग का बदलना) >QrCode का रंग बदलते समय सतर्क रहें। कई उपयोगकर्ताओं को भिन्न रंगों मे QrCode पढ़ने मे कठिनाई होती है। सभी रंगों को RGB(लाल हरा नीला) मे व्यक्त करना आवश्यक है। आप निम्न का उपयोग करने QrCode का रंग बदल सकते हैं: QrCode::color(255,0,255); पृष्ठभूमि रंग परिवर्तन भी इस ही तरीके से व्यक्त किया जा सकता है। QrCode::backgroundColor(255,255,0); #### Size Change (हाशिया परिवर्तन) एक QrCode के आसपास हाशिया बदलने की क्षमता भी प्रदान की गयी है। इच्छित हाशिया निम्न वाक्य-विन्यास के अनुसार व्यक्त करें: QrCode::margin(100); #### Error Correction (त्रुटि सुधार) त्रुटि सुधार के स्तर को बदलना भी आसान है। निम्न वाक्य - विन्यास के अनुसार चलें: QrCode::errorCorrection('H'); `errorCorrection` की विधि के लिए निम्न विकल्प समर्थित हैं: | गलतीयों का सुधार | प्रस्तावित आश्वासन | | --- | --- | | L | 7% codewords में से बहाल किए जा सकते हैं। | | M | 15% codewords में से बहाल किए जा सकते हैं। | | Q | 25% codewords में से बहाल किए जा सकते हैं। | | H | 30% codewords में से बहाल किए जा सकते हैं। | >अधिक त्रुटि सुधार के उपयोग से QrCode बड़ा हो जाता है और कम सूचना जमा कर सकता है। [त्रुटि सुधार](http://en.wikipedia.org/wiki/QR_code#Error_correction) के बारे मे अधिक पढ़ें। #### Encoding(एन्कोडिंग) वर्ण एन्कोडिंग को बदलें जिसका प्रयोग QrCode का निर्माण करने के लिए किया जाता है। डिफ़ॉल्ट रूप से `ISO-8859-1` एनकोडर के रूप में चयनित है।[वर्ण एनकोडिंग](http://en.wikipedia.org/wiki/Character_encoding) के बारे में अधिक पढ़ें। आप निम्न में से किसी के लिए इसे बदल सकते हैं: QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); | वर्ण एनकोडर | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >`Could not encode content to ISO-8859-1` त्रुटि का अर्थ है कि ग़लत वर्ण एनकोड का प्रकार उपयोग किया गया है। यदि आप अनिश्चित हैं तो हमारा सुझाव है कि `UTF-8` का उपयोग करें। #### Merge(विलय) `मर्ज` विधि एक QrCode पर एक छवि विलीन करता है। यह आमतौर पर एक QrCode के भीतर लोगो रखने के लिए प्रयोग किया जाता है। QrCode::merge($filename, $percentage, $absolute); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->merge('path-to-image.png')->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >`मर्`ज विधि में अभी केवल PNG ही समर्थित है। >filepath app, base path से सापेक्षित है यदि `$absolute` सेट है `false` पर। इसे `true` से बदलें absolute paths पाने के लिए। >आपको `merge` विधि का इस्तेमाल करते समय उच्च स्तर के त्रुटि सुधार का उपयोग करना चाहिए। सुझाव है कि `errorCorrection('H')` का उपयोग करें। ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String(द्विआधारी स्ट्रिंग का विलय) `mergeString` विधि `मर्ज कॉल` वाले ही परिणाम पाने के लिए प्रयोग किया जा सकता है, सिवाय इसके कि इसमे आपको फ़ाइल पथ की बजाय फाइल की एक प्रतिनिधित्व स्ट्रिंग प्रदान करनी होती है। यह तब उपयोगी है जब `स्टोरेज` मुखौटे के साथ काम किया जाता है। इसका इंटरफेस मर्ज कॉल की तरह ही है। QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >As with the normal `merge` call, only PNG is supported at this time. The same applies for error correction, high levels are recommened. #### Advance Usage(अग्रिम उपयोग) सभी तरीके श्रृंखलन का समर्थन करते हैं। `generate` तरीका अंत मे कॉल करना तथा तरीका कोई `format` का बदलाव सबसे पहले कॉल करना आवश्यक है। जैसे की आप निम्न मे से कोई भी रन कर सकते हैं: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); आप बिना फ़ाइल सुरक्षित करे, कच्चे स्ट्रिंग व `base64_encode` की एन्कोडेंग देकर भी PNG प्रदर्शित कर सकते हैं। ## सहायक #### सहायक क्या है ? सहायक QrCode का निर्माण करने का साधारण तरीका है जो स्कैन करने पर पाठक से निश्चित कार्रवाई करवाते हैं। #### E-Mail (ई-मेल) यह सहायक ई-मेल qrcode का निर्माण करता है जो ई-मेल का पता, विषय तथा शरीर भरने मे सक्षम होता है। QrCode::email($to, $subject, $body); //Fills in the to address QrCode::email('foo@bar.com'); //Fills in the to address, subject, and body of an e-mail. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //Fills in just the subject and body of an e-mail. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### Geo (जियो) यह सहायक अक्षांश व देशान्तर का निर्माण करता है जिसे फोन पढ़ व Google Maps (गूगल मांचित्र) या अन्य app मे खोल सकता है। QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Phone Number (फ़ोन नंबर) इस सहायक द्वारा उत्तपन्‍न qrCode स्कैन करने पर नंबर डायल किया जा सकता है। QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (पाठ संदेश) इस सहायक द्वारा उत्तपन्‍न QrCode स्कैन करने पर SMS संदेश का भेजने का पता तथा संदेश का शरीर पहले से भरा जा सकता है। QrCode::SMS($phoneNumber, $message); //Creates a text message with the number filled in. QrCode::SMS('555-555-5555'); //Creates a text message with the number and message filled in. QrCode::SMS('555-555-5555', 'Body of the message'); #### Wi-Fi (वाई-फाई) इस सहायक द्वारा उत्तपन्‍न qrCode स्कैन करने पर वाईफाई नेटवर्क से जुड़ा जा सकता है। QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID of the network', 'password' => 'Password of the network', 'hidden' => 'Whether the network is a hidden SSID or not.' ]); //Connects to an open WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', ]); //Connects to an open, hidden WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'hidden' => 'true' ]); //Connects to an secured, WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'encryption' => 'WPA', 'password' => 'myPassword' ]); >वाई-फाई स्कैनिंग Apple उत्पादों में अभी समर्थित नही है। ## साधारण QrCode उपयोग आप निम्न तालिका मे से `generate` अनुभाग मे पाए गये उपसर्ग का उपयोग करके और अधिक उन्नत जानकारी स्टोर करने के लिए QrCode का निर्माण कर सकते हैं: QrCode::generate('http://www.simplesoftware.io'); | प्रयोग | उपसर्ग | उदाहरण | | --- | --- | --- | | Website URL | http:// | http://www.simplesoftware.io | | Secured URL | https:// | https://www.simplesoftware.io | | E-mail Address | mailto: | mailto:support@simplesoftware.io | | Phone Number | tel: | tel:555-555-5555 | | Text (SMS) | sms: | sms:555-555-5555 | | Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Geo Address | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ## लरावेल(Laravel) के बाहर उपयोग आप `BaconQrCodeGenerator` नमक नयी कक्षा स्थापित करके इस पैकेज का लरावेल के बाहर भी उपयोग कर सकते हैं। use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Make a qrcode without Laravel!'); simple-qrcode/docs/es/README.md000064400000031300152427536730012141 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [Introducción](#docs-introduction) - [Traducciones](#docs-translations) - [Configuración](#docs-configuration) - [Ideas Simples](#docs-ideas) - [Uso](#docs-usage) - [Helpers](#docs-helpers) - [Uso Común de QrCode](#docs-common-usage) - [Uso fuera de Laravel](#docs-outside-laravel) ## Introducción Simple QrCode es un empaquetador de fácil uso para el popular framework Laravel basado en el gran trabajo proporcionado por [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Hemos creado una interfaz que es familiar y fácil de usar para los usuarios de Laravel. ## Traducciones Estamos buscando usuarios que hablen Árabe, Francés, Coreano o Japonés para traducir este documento. Porfavor cread una pull request si podeis ayudar con una traducción! ## Configuración #### Composer Primero, añadir el paquete Simple QrCode en su `require` en su archivo `composer.json`: "require": { "simplesoftwareio/simple-qrcode": "~2" } Luego, ejecutar el comando `composer update`. #### Service Provider ###### Laravel <= 5.4 Registrar `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` en su `config/app.php` dentro del array `providers`. #### Aliases ###### Laravel <= 5.4 Finalmente, registrar `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` en su archivo de configuración `config/app.php` dentro del array `aliases`. ## Ideas Simples #### Print View Uno de los principales usos de este paquete es la posibilidad de disponer QrCodes en todas nuestras print views. Esto permite a nuestros usuarios volver a la página original después de imprimir simplemente escaneando el código. Todo esto es posible añadiendo lo siguiente en nuestro archivo `footer.blade.php´.
{!! QrCode::size(100)->generate(Request::url()); !!}

Escanéame para volver a la página principal.

#### Incorporar un QrCode Puedes incorporar un código Qr en un e-mail para permitir a los usuarios un ágil escaneo. El ejemplo siguiente muestra como hacer esto con Laravel. //Inside of a blade template. ## Uso #### Uso Básico Usar el QrCode Generator es muy simple. La sintaxis más básica es: QrCode::generate('Transfórmame en un QrCode!'); Esto creara un código que diga "Transfórmame en un QrCode!" #### Generate `Generate` se usa para crear el QrCode. QrCode::generate('Transfórmame en un QrCode!'); >Atención! Este método debe de ser usado el último si se usa dentro de una cadena de comandos (chain). `Generate` por defecto devolverá un string de una imagen SVG. Puedes imprimirla directamente en un navegador moderno con el sistema Blade de Laravel con el siguiente código: {!! QrCode::generate('Transfórmame en un QrCode!'); !!} El método `generate` tiene un segundo parámetro que aceptará un nombre de archivo y un directorio para guardar el QrCode. QrCode::generate('Transfórmame en un QrCode!', '../public/qrcodes/qrcode.svg'); #### Cambio de Formato >QrCode Generator por defecto devolverá una imagen SVG. >Atención! El método `format` tiene que ser usado antes que cualquier opción de formato como `size`, `color`, `backgroundColor`, o `margin`. Actualmente hay 3 formatos compatibles; PNG, EPS, and SVG. Para cambiar el formato usa el siguiente código: QrCode::format('png'); //Devolvera una imagen PNG QrCode::format('eps'); //Devolvera una imagen EPS QrCode::format('svg'); //Devolvera una imagen SVG #### Cambio de Tamaño >QrCode Generator devolverá por defecto el tamaño de píxels mínimo para crear el QrCode. Puedes cambiar el tamaño de un QrCode usando el método `size`. Simplemente especifica el tamaño deseado en píxels usando el siguiente código: QrCode::size(100); #### Cambio de Color >Presta atención al cambiar el color de un QrCode. Algunos lectores tienen dificultades al leer QrCodes en color. Todos los colores deben ser expresados en RGB (Red Green Blue). Puedes cambiar el color del QrCode usando el siguiente código: QrCode::color(255,0,255); Para cambiar el color del fondo usamos: QrCode::backgroundColor(255,255,0); #### Cambio de Márgenes Es posible cambiar el márgen alrededor del QrCode. Simplemente especificamos el márgen deseado usando el siguiente código: QrCode::margin(100); #### Corrección de Errores Cambiar el nivel de corrección de errores es fácil. Unicamente usa el siguiente código: QrCode::errorCorrection('H'); Las siguientes opciónes son compatibles con el método de `errorCorrection`. | Error Correction | Assurance Provided | | --- | --- | | L | 7% of codewords can be restored. | | M | 15% of codewords can be restored. | | Q | 25% of codewords can be restored. | | H | 30% of codewords can be restored. | >Cuanto más corrección de error se usa; el QrCode aumenta y puede almacenar menos datos. Para saber más sobre [corrección de error](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### Encoding Para cambiar la codificación de carácteres que se usa para crear un QrCode. Por defecto `ISO-8859-1` está seleccionado. Para saber más sobre [codificación de carácteres](http://en.wikipedia.org/wiki/Character_encoding) You can change this to any of the following: QrCode::encoding('UTF-8')->generate('Transfórmame en un QrCode con símbolos especiales ♠♥!!'); | Codificador de carácteres | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >Un error de `Could not encode content to ISO-8859-1` significa que se esta usando una codificación de carácteres incorrecta. Recomendamos `UTF-8` si no está seguro. #### Merge El método `merge` une una imagen con un QrCode. Normalmente se usa para añadir logos en un QrCode. QrCode::merge($filename, $percentage, $absolute); //Genera un QrCode con una imagen en el centro. QrCode::format('png')->merge('path-to-image.png')->generate(); //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >El método `merge` sólo es compatible con PNG de momento. >El path del archivo es relativo al path de la app si `$absolute` equivale a `false`. Cambia esta variable a `true` para usar paths absolutos. >Se debería usar un nivel alto de corrección de error al usar `merge` para asegurarse que el QrCode se sigue podiendo leer. Recomendamos usar `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String El método `mergeString` se puede usar para conseguir el mismo resultado que con `merge`, con la diferencia que permite proveer una representación en string del archivo en vez de el filepath. Ésto es útil al trabajar con el `Storage` facade. Su interfaz es muy similar a la de `merge`. QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); //Genera un QrCode con una imagen en el centro. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >Igual que con `merge`, sólo PNG de momento. Lo mismo que con el nivel de corrección de error, alto nivel está recomendado. #### Uso Avanzado Todos los métodos soportan chaining. El método `generate` tiene que ser el último y cualquier cambio de `format` tiene que ser llamado primero. Por ejemplo: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Transfórmame en un QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Transfórmame en un QrCode!'); Puedes mostrar una imagen PNG sin guardar el archivo usando una string y eligiendo la codificación `base64_encode`. ## Helpers #### Qué son los helpers? Los helpers son una manera fácil de crear QrCodes que causan que causan una acción en el lector al escanear. #### E-Mail Este helper genera un QrCode de e-mail que es capaz de rellenar dirección e-mail, asunto, y el cuerpo del e-mail. QrCode::email($to, $subject, $body); //Rellena la dirección QrCode::email('foo@bar.com'); //Rellena la dirección, el asunto y el cuerpo. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //Solo rellena el asunto y el cuerpo del e-mail. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### Geo Este helper genera una latitude y una longitude que un teléfono puede leer y abrir la localización en Google Maps o alguna app similar. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Phone Number Este helper genera un QrCode que puede ser escaneado y llama a un número de teléfono. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Mensajes de texto) Este helper crea SMS que pueden ser previamente rellenados con la dirección y el mensaje. QrCode::SMS($phoneNumber, $message); //Crea un mensaje de texto con el número rellenado. QrCode::SMS('555-555-5555'); //Crea un mensaje de texto con el número y el mensaje rellenados. QrCode::SMS('555-555-5555', 'Mensaje'); #### WiFi Este helpers crea QrCodes que conectan un teléfono a una red WiFI. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID de la red', 'password' => 'Password de la red', 'hidden' => 'Si la red tiene SSID oculta o no.' ]); //Conecta a una red abierta. QrCode::wiFi([ 'ssid' => 'Network Name', ]); //Conecta a una red abierta y oculta. QrCode::wiFi([ 'ssid' => 'Network Name', 'hidden' => 'true' ]); //Conecta a una red segura. QrCode::wiFi([ 'ssid' => 'Network Name', 'encryption' => 'WPA', 'password' => 'myPassword' ]); >WiFi scanning no es compatible con productos Apple. ##Uso común de QrCode Puedes usar un prefijo de la tabla dentro de la sección `generate` para crear un QrCode que almacene informacion avanzada: QrCode::generate('http://www.simplesoftware.io'); | Usage | Prefix | Example | | --- | --- | --- | | Website URL | http:// | http://www.simplesoftware.io | | Secured URL | https:// | https://www.simplesoftware.io | | E-mail Address | mailto: | mailto:support@simplesoftware.io | | Phone Number | tel: | tel:555-555-5555 | | Text (SMS) | sms: | sms:555-555-5555 | | Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Geo Address | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ##Uso fuera de Laravel Puedes usar este paquete fuera de Laravel instanciando una nueva clase `BaconQrCodeGenerator`. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Crea un QrCode sin Laravel!'); simple-qrcode/docs/en/README.md000064400000044503152427536730012145 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) #### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) ## Try our dead simple, free file transfer service [keep.sh](https://keep.sh) [![keep.sh](https://user-images.githubusercontent.com/624784/95805291-1121e980-0cd3-11eb-9048-0264bd9f2fd7.gif)](https://keep.sh) Upload files with a single curl command from your terminal! `curl --upload-file file.txt https://keep.sh` ## Use Cases

Platform to sell tickets online

## Introduction Simple QrCode is an easy to use wrapper for the popular Laravel framework based on the great work provided by [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). We created an interface that is familiar and easy to install for Laravel users. ![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) ## Upgrade Guide Upgrade from v2 or v3 by changing your `composer.json` file to `~4` You **must** install the `imagick` PHP extension if you plan on using the `png` image format. #### v4 > There was a mistake when creating 4.1.0 and allowing a backwards breaking change into the master branch. The `generate` method will now return an instance of `Illuminate\Support\HtmlString` if you are running Laravel. See https://github.com/SimpleSoftwareIO/simple-qrcode/issues/205 for more information. There was a Laravel facade issue within v3 that causes some loading issues. The only way to fix this was to create a backwards breaking change so v4 has been released. If you are coming from v2 there is no need to change any code. The below change only effects users on v3. All references to the `QrCode` facade need to be changed to: ``` use SimpleSoftwareIO\QrCode\Facades\QrCode; ``` ## Configuration #### Composer Run `composer require simplesoftwareio/simple-qrcode "~4"` to add the package. Laravel will automatically pick up and install the package. ## Simple Ideas #### Print View One of the main items that we use this package for is to have QrCodes in all of our print views. This allows our customers to return to the original page after it is printed by simply scanning the code. We achieved this by adding the following into our footer.blade.php file:
{!! QrCode::size(100)->generate(Request::url()); !!}

Scan me to return to the original page.

#### Embed A QrCode You may embed a qrcode inside of an e-mail to allow your users to quickly scan. The following is an example of how to do this with Laravel: //Inside of a blade template. ## Usage #### Basic Usage ``` // All examples below assume you are pulling in the QrCode facade with the following line of code. The Facade is auto-loaded for Laravel users. use SimpleSoftwareIO\QrCode\Facades\QrCode; ``` Using the QrCode Generator is very easy. The most basic syntax is: use SimpleSoftwareIO\QrCode\Facades\QrCode; QrCode::generate('Make me into a QrCode!'); This will make a QrCode that says "Make me into a QrCode!" ![Example QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/make-me-into-a-qrcode.png?raw=true) #### Generate `(string $data, string $filename = null)` `Generate` is used to make the QrCode. QrCode::generate('Make me into a QrCode!'); `Generate` by default will return a SVG image string. You can print this directly into a modern browser within Laravel's Blade system with the following: {!! QrCode::generate('Make me into a QrCode!'); !!} The `generate` method has a second parameter that will accept a filename and path to save the QrCode. QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### Format `(string $format)` Three formats are currently supported; `png,` `eps,` and `svg`. To change the format use the following code: QrCode::format('png'); //Will return a png image QrCode::format('eps'); //Will return a eps image QrCode::format('svg'); //Will return a svg image > `imagick` is required in order to generate a `png` image. #### Size `(int $size)` You can change the size of a QrCode by using the `size` method. Simply specify the size desired in pixels using the following syntax: QrCode::size(100); ![200 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) #### Color `(int $red, int $green, int $blue, int $alpha = null)` >Be careful when changing the color of a QrCode, as some readers have a very difficult time reading QrCodes in color. All colors must be expressed in RGBA (Red Green Blue Alpha). You can change the color of a QrCode by using the following: QrCode::color(255, 0, 0); // Red QrCode QrCode::color(255, 0, 0, 25); //Red QrCode with 25% transparency ![Red QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![Red Transparent QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) #### Background Color `(int $red, int $green, int $blue, int $alpha = null)` You can change the background color of a QrCode by calling the `backgroundColor` method. QrCode::backgroundColor(255, 0, 0); // Red background QrCode QrCode::backgroundColor(255, 0, 0, 25); //Red background QrCode with 25% transparency ![Red Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![Red Transparent Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) #### Gradient `$startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` You can apply a gradient to the QrCode by calling the `gradient` method. The following gradient types are supported: | Type | Example | | --- | --- | | `vertical` | ![Veritcal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | | `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | | `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | | `inverse_diagonal` | ![Invrse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | | `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | #### EyeColor `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` You may change the eye colors by using the `eyeColor` method. QrCode::eyeColor(0, 255, 255, 255, 0, 0, 0); // Changes the eye color of eye `0` | Eye Number | Example | | --- | --- | | `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | | `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| | `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | #### Style `(string $style, float $size = 0.5)` The style can be easily swapped out with `square`, `dot,` or `round`. This will change the blocks within the QrCode. The second parameter will affect the size of the dots or roundness. QrCode::style('dot'); // Uses the `dot` style. | Style | Example | | --- | --- | | `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| | `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | #### Eye Style `(string $style)` The eye within the QrCode supports two different styles, `square` and `circle`. QrCode::eye('circle'); // Uses the `circle` style eye. | Style | Example | | --- | --- | | `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| #### Margin `(int $margin)` The ability to change the margin around a QrCode is also supported. Simply specify the desired margin using the following syntax: QrCode::margin(100); #### Error Correction `(string $errorCorrection)` Changing the level of error correction is easy. Just use the following syntax: QrCode::errorCorrection('H'); The following are supported options for the `errorCorrection` method: | Error Correction | Assurance Provided | | --- | --- | | L | 7% of codewords can be restored. | | M | 15% of codewords can be restored. | | Q | 25% of codewords can be restored. | | H | 30% of codewords can be restored. | >The more error correction used; the bigger the QrCode becomes and the less data it can store. Read more about [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### Encoding `(string $encoding)` Change the character encoding that is used to build a QrCode. By default `ISO-8859-1` is selected as the encoder. Read more about [character encoding](http://en.wikipedia.org/wiki/Character_encoding). You can change this to any of the following: QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); | Character Encoder | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | #### Merge `(string $filepath, float $percentage = .2, bool $absolute = false)` The `merge` method merges an image over a QrCode. This is commonly used to placed logos within a QrCode. //Generates a QrCode with an image centered in the middle. QrCode::format('png')->merge('path-to-image.png')->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >The `merge` method only supports PNG at this time. >The filepath is relative to app base path if `$absolute` is set to `false`. Change this variable to `true` to use absolute paths. >You should use a high level of error correction when using the `merge` method to ensure that the QrCode is still readable. We recommend using `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String `(string $content, float $percentage = .2)` The `mergeString` method can be used to achieve the same as the `merge` call, except it allows you to provide a string representation of the file instead of the filepath. This is usefull when working with the `Storage` facade. It's interface is quite similar to the `merge` call. //Generates a QrCode with an image centered in the middle. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >As with the normal `merge` call, only PNG is supported at this time. The same applies for error correction, high levels are recommened. #### Advance Usage All methods support chaining. The `generate` method must be called last. For example you could run any of the following: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); You can display a PNG image without saving the file by providing a raw string and encoding with `base64_encode`. ## Helpers #### What are helpers? Helpers are an easy way to create QrCodes that cause a reader to perform a certain action when scanned. #### BitCoin This helper generates a scannable bitcoin to send payments. [More information](https://bitco.in/en/developer-guide#plain-text) QrCode::BTC($address, $amount); //Sends a 0.334BTC payment to the address QrCode::BTC('bitcoin address', 0.334); //Sends a 0.334BTC payment to the address with some optional arguments QrCode::size(500)->BTC('address', 0.0034, [ 'label' => 'my label', 'message' => 'my message', 'returnAddress' => 'https://www.returnaddress.com' ]); #### E-Mail This helper generates an e-mail qrcode that is able to fill in the e-mail address, subject, and body: QrCode::email($to, $subject, $body); //Fills in the to address QrCode::email('foo@bar.com'); //Fills in the to address, subject, and body of an e-mail. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //Fills in just the subject and body of an e-mail. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### Geo This helper generates a latitude and longitude that a phone can read and opens the location in Google Maps or similar app. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Phone Number This helper generates a QrCode that can be scanned and then dials a number. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Text Messages) This helper makes SMS messages that can be prefilled with the send to address and body of the message: QrCode::SMS($phoneNumber, $message); //Creates a text message with the number filled in. QrCode::SMS('555-555-5555'); //Creates a text message with the number and message filled in. QrCode::SMS('555-555-5555', 'Body of the message'); #### WiFi This helpers makes scannable QrCodes that can connect a phone to a WiFi network: QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID of the network', 'password' => 'Password of the network', 'hidden' => 'Whether the network is a hidden SSID or not.' ]); //Connects to an open WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', ]); //Connects to an open, hidden WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'hidden' => 'true' ]); //Connects to a secured WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'encryption' => 'WPA', 'password' => 'myPassword' ]); >WiFi scanning is not currently supported on Apple Products. ## Common QrCode Usage You can use a prefix found in the table below inside the `generate` section to create a QrCode to store more advanced information: QrCode::generate('http://www.simplesoftware.io'); | Usage | Prefix | Example | | --- | --- | --- | | Website URL | http:// | http://www.simplesoftware.io | | Secured URL | https:// | https://www.simplesoftware.io | | E-mail Address | mailto: | mailto:support@simplesoftware.io | | Phone Number | tel: | tel:555-555-5555 | | Text (SMS) | sms: | sms:555-555-5555 | | Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Geo Address | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ## Usage Outside of Laravel You may use this package outside of Laravel by instantiating a new `Generator` class. use SimpleSoftwareIO\QrCode\Generator; $qrcode = new Generator; $qrcode->size(500)->generate('Make a qrcode without Laravel!'); simple-qrcode/docs/pt-br/README.md000064400000032236152427536730012567 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [Introdução](#docs-introduction) - [Traduções](#docs-translations) - [Configuração](#docs-configuration) - [Simples ideias](#docs-ideas) - [Uso](#docs-usage) - [Ajuda](#docs-ajudantes) - [Uso comum do QrCode](#docs-common-usage) - [Uso sem Laravel](#docs-outside-laravel) ## Introdução Simple QrCode é um pacote de fácil uso do Framework Laravel, baseado no grande trabalho do [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Criamos uma interface que é fácil e familiar de instalar para usuários Laravel. ## Traduções Estamos procurando por usuários que falem Árabe, Espanhol, Francês, Coreano ou Japonês, para nos ajudar a traduzir este documento. Por favor, crie um pull request se você é capar de fazer uma tradução! ## Configuração #### Composer Primeiramente, adicione o pacote Simple QrCode ao seu `require` no arquivo `composer.json`: "require": { "simplesoftwareio/simple-qrcode": "~2" } Em seguida, execute o comando `composer update`. #### Provedor de Serviço ###### Laravel <= 5.4 Registre a `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` em seu `config/app.php` dentro do array `providers`. #### Aliases ###### Laravel <= 5.4 Finalmente, adicione `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` em seu arquivo de configuração `config/app.php` dentro do array `aliases`. ## Ideias simples #### Print View Um dos principais pontos pelo qual nós utilizamos este pacote para é ter QRCodes em todos os nossos pontos de vista de impressão. Isto permite que nossos clientes possam retornar para a página original depois da impressão, basta digitalizar o código. Conseguimos isso adicionando o seguinte em nosso arquivo footer.blade.php.
{!! QrCode::size(100)->generate(Request::url()); !!}

Me escaneie para retornar à página principal

#### Embarcando um QrCode Você pode incorporar um qrcode dentro de um e-mail, que permita que seus usuários escaneiem rapidamente. Abaixo, um exemplo de como fazer isso utilizando o Laravel. //Inside of a blade template. ## Uso #### Uso Básico É muito fácil utilizar o gerador de Qrcode. A sintaxe mais básica é: QrCode::generate('Me transforme em um QrCode!'); Isso criará um Qr que diz "Me transforme em um QrCode!" #### Generate `Generate` é usado para criar o QrCode. QrCode::generate('Me transforme em um QrCode!'); >Atenção! Esse método deve ser chamado por último dentro da cadeia. `Generate` por padrão irá retornar uma string de imagem SVG. Você pode exibir diretamente em seu browser, utilizando o Laravel's Blade com o código abaixo: {!! QrCode::generate('Me transforme em um QrCode!'); !!} O método `generate` tem um segundo parametro que aceita um arquivo e um path para salvar o Qrcode. QrCode::generate('Me transforme em um QrCode!', '../public/qrcodes/qrcode.svg'); #### Alteração de Formato >Por padrão o gerador de QrCode está configurado para retornar uma imagem SVG. >Cuidao! O método `format` deve ser chamado antes de qualquer outra opção de formatação como `size`, `color`, `backgroundColor` e `margin`. Atualmente são suportados três tipos de formatos; PNG, EPS, and SVG. Para alterar o formato, use o seguinte código: QrCode::format('png'); // Retornará uma imagem no formato PNG QrCode::format('eps'); // Retornará uma imagem no formato EPS QrCode::format('svg'); // Retornará uma imagem no formato SVG #### Alteração de Tamanho >Por padrão, o gerador QrCode retornará o menos tamanho possível em pixels para criar o QrCode. Você pode alterar o tamanho do QrCode usando o método `size`. Simplesmente especifique o tamanho desejado em pixels usando a seguinte sintaze: QrCode::size(100); #### Alteração de cor >Cuidado quando estiver alterando a cor de um QRCode. Alguns leitores tem uma grande dificuldade em ler QrCodes coloridos. Todas as cores devem ser definidas em RGB(Red Green Blue). Você pode alterar a cor de um qrCode usando o código abaixo: QrCode::color(255,0,255); Alterações do plano de fundo também são suportadas e definidas da mesma maneira. QrCode::backgroundColor(255,255,0); #### Alteração de Margem A capacidade de alterar a margem ao redor do QrCode também é suportada. Simplesmente especifique o tamanho desejado da margem, utilizando a sintaxe abaixo: QrCode::margin(100); #### Correção de erros Alterar o nível de correção de erros é simples. Utilize a seguinte sintaxe: QrCode::errorCorrection('H'); As seguintes opções são suportadas para o método `errorCorrection`. | Correção de erros | Garantia fornecida | | --- | --- | | L | 7% das palavras-código podem ser restauradas. | | M | 15% das palavras-código podem ser restauradas. | | Q | 25% das palavras-código podem ser restauradas. | | H | 30% das palavras-código podem ser restauradas. | >Quanto maior a correção de erros utilizada, maior o QrCode fica e menos informação ele pode armazenar. Leia mais sobre [correção de erros](http://en.wikipedia.org/wiki/QR_code#Error_correction). #### Codificação Alterar a codificação que é usada para criar um QrCode. Por padrão, a encodificação padrão é a `ISO-8859-1`. Leia mais sobre [codificação de caracteres](https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_caracteres). Você pode alterar a codificação usando o seguinte código: QrCode::encoding('UTF-8')->generate('Faça-me um QrCode com símbolos especiais ♠♥!!'); | Codificador de caracteres | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >Um erro de `Could not encode content to ISO-8859-1` significa que foi inserido algum caractere inválido. Recomendamos o `UTF-8` se você não tiver certeza. #### Mesclar O método `merge` mescla uma imagem sobre um Qrcode. É comumente usado para se colocar logos dentro de um QrCode. QrCode::merge($filename, $percentage, $absolute); // Gera um QrCode com uma imagem centralizada. QrCode::format('png')->merge('diretório/da/imagem.png')->generate(); // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. QrCode::format('png')->merge('diretório/da/imagem.png', .3)->generate(); // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. QrCode::format('png')->merge('http://www.google.com/algumaImagem.png', .3, true)->generate(); >O método `merge` suporta somente arquivos do tipo PNG. >O diretório da imagem é relativo ao caminho base da aplicação, se o `$absolute` estiver setada para `false`. Altere essa variável para `true` para usar caminhos absolutos. >Você deve usar um alto nível de correção de erros quando usado o método `merge`, para garantir que o QrCode será legível. Recomendamos usar `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Funda string binária O método `mergeString` pode ser usado para alcançar a mesma chamada do método `merge`, exceto que ele permite que você represente uma string de um arquivo ao invés do diretório. Isso é útil quando é utilizado o padrão `Storage`. A chamada a essa interface é bastante similar ao método `merge`. QrCode::mergeString(Storage::get('diretório/da/imagem.png'), $percentage); // Gera um QrCode com uma imagem centralizada. QrCode::format('png')->mergeString(Storage::get('diretório/da/imagem.png'))->generate(); // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. QrCode::format('png')->mergeString(Storage::get('diretório/da/imagem.png'), .3)->generate(); >Assim como o método `merge`, somente arquivos do tipo PNG são suportados. O mesmo aplica-se para correção de erros, altos níveis são recomendados. #### Uso Avançado Todos os métodos suportam encadeamento. O método `generate` deve ser chamado por último e o método `format` deve ser chamado primeiro. Por exemplo, vocẽ pode executar o código seguinte: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Faça-me um QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Faça-me um QrCode!'); Você pode exibir uma imagem PNG, sem salvar o arquivo e prover uma string encodificada pelo método `base64_encode`. ## Ajudantes #### O que são ajudantes? Ajudantes são uma maneira fácil de criar QrCodes que executam uma ação quando escaneados. #### E-Mail Esse ajudante, gera um qrcode de e-mail que é capaz de ser preenchido no endereço de e-mail, assunto e corpo. QrCode::email($to, $subject, $body); // Preenche o endereço de email QrCode::email('foo@bar.com'); // Preenche o endereço, título e corpo de um email QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); // Preenche apenas o título e corpo de um email QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### Geo Esse ajudante gera uma latitude e longitude que pode ser lido por um aparelho celular e abrir a localização no Google maps ou outro aplicativo similar. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Phone Number Esse ajudante, gera uma QrCode que pode ser escaneado e exibir um número de telefone. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Mensagens de Texto) Esse ajudante, cria uma mensagem SMS que pode ser preenchida com o número de telefone e o corpo da mensagem. QrCode::SMS($phoneNumber, $message); // Cria uma mensagem de texto com o telefone preenchido. QrCode::SMS('555-555-5555'); // Cria uma mensagem de texto com o número telefônico e a mensagem preenchida. QrCode::SMS('555-555-5555', 'Body of the message'); #### WiFi Esse ajudante, faz com que QrCodes escaneáveis permitam o aparelho celular se conectar a uma rede WI-FI. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID da rede', 'password' => 'Senha da rede', 'hidden' => 'Se a rede é um SSID oculto ou não.' ]); // Conectar a uma rede wifi QrCode::wiFi([ 'ssid' => 'Nome da rede', ]); // Conectar a uma refe wifi oculta QrCode::wiFi([ 'ssid' => 'Nome da rede', 'hidden' => 'true' ]); // Conectar a uma rede wifi segura QrCode::wiFi([ 'ssid' => 'Nome da rede', 'encryption' => 'WPA', 'password' => 'minhaSenha' ]); >Escaneamento WIFI atualmente não são suportados nos produtos Apple. ##Uso Comum do QRCode Você pode usar um prefixo listado na tabela abaixo dentro da seção `generate` para criar um QrCode para armazenar informações mais avançadas: QrCode::generate('http://www.simplesoftware.io'); | Uso | Prefixo | Exemplo | | --- | --- | --- | | URL do site | http:// | http://www.simplesoftware.io | | URL segura | https:// | https://www.simplesoftware.io | | Endereço de e-mail | mailto: | mailto:support@simplesoftware.io | | Número de telefone | tel: | tel:555-555-5555 | | Texto (SMS) | sms: | sms:555-555-5555 | | Texto (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | | Texto (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | | Coordenadas | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [Veja Exemplos](https://en.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ##Uso fora do Laravel Você pode usar o pacote fora do Laravel instanciando a classe `BaconQrCodeGenerator`. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Crie um QrCode sem Laravel!'); simple-qrcode/docs/imgs/vertical.png000064400000010775152427536730013546 0ustar00PNG  IHDRXgAMA a cHRMz&u0`:pQ<bKGDvIDATx]{pTnv] 1$k+a2QIk0&)QQ[`%XP# F1##BM)E S|H6dvV=~{ιϽw;wwyp8 p "@! @ DB A"@ 7?80k׮|4jٲePRRy]]^>hѢK.u @@A Vme(V^{ #|.-i!9nؐ$ 1鰽A!D L6 uT;#Ga7cz+a-}> vAF%B8$|222vK'OD%,S#KS"04Rc!fVR;;tK& BX2ׇ5q/՗B!:PE!@V.X(y:*ĺg̘ VZ(+[Ɖ~xWe +LGG45}KGs@qq;^Ĵm^`Y(탨Adq wra뻎lm(1q)e/e7yU G_&At b(D2C,0@dȔ!MYdICT(g,tȃhNG6X9t"N^K/ r?JAT\oj0(,ޫ.Ν{`ݺWʒ:L!/$"\jW.GIIݻ'[QXYD ȴ,y'Wi^~ 'Rb4Ui--5zVA' ".u 8eԃ6Ag""Dby)Ċ0jX|!M~ƏPN]FB,G44| ;MIII_4}gȐSر,_ /~yQ bu(R4iV v,6{!(qrw mCRC<ivhvA ͖ADE bq>4dhHAiWW78pDz`߾Zdi^v-Ēe:1$5ʈt@I*fyFhmdrM}crLKM04LȤ5hZ#;]m B" 6a-' SK00]硤Wt|OɩSg…v:9 Abv1;*+-pᠶQ@AȈ =;xB,GCկ%AąXsA~ ZSX d5 DǩVMĉS ;!.AzJq/^iYYiNj%iXQRԚ5## 22ҨYIt@NG `W*XAȃbOMމ:9¶m1Ӹ)522a$yy:R3s`Q]gqp p cǾ3[(-=mO*srN9sܾ5ty[[0cC,A|ӹӐjJ1G?"lnw&i3ET%!d(Syds`7 ŢU!B4u\8b*Pp8fZ|ߓupxݺ_„ ?| ifMs|sy$uu+M\xU1cm-_4%(xtdeCB?:[1MFe2N$ =*}[LW}H{ұΫR,*v?A"tJ:M9A`-=0!NQ C,G SK˂xq$.0A~gWz0zwsϚ^57+P[;gBjj;>2wY&O>Xff7q.|٪AM_ !/o"4p*'AsABYɬ>ORCԺW\rrjY8mJP̶iJ#At+CAp:I|j-@kr$A+<ߩؖ4#*ݓz'W1`Rt,Bwj7uFR`m^,/_/$i$%ţ^GȠe"niEJcȀ%><dذd?#,\n֗떖6D!H@~$%Ń.!&'F J֙"5AxɋLu'ɃyYԺۑBu& b&Ðl@?Xh vĦrp,2el۶5@C1$S粲ߢ}8jx91 gδo0{_@JJB mm](Ya1TT gD|gϟaӦ(u^">|>i?>}Džuz7.K$Tuż']8+屛d ҈LvĪ}\Ds DD@knjhgP,' gbLWXDpB~gyk 'g2]?)iwgIN Gi;{455¾} lĹ ȽNw?4,jM^df h?7y4%Hb@USt 4VY䩳 u$s&7e$@5 )9Obcú} SphG꫇ȑ)1M>={[>= RS&Ț5; ?~ 8$7w47+wA{{7WY[-ڵw3VG43?eDi^HA?~ 6C"qoՈ 60HG']ί*[YKŊ)TG-K:XV~="ʢ-t Jj6WI(!AD"& yאك[Lg۶yũGxX`0jQΟfzߓnpEcA"B"\:ӆ)rWk@AWI`5n8Tǡʎ6 # A3 bY1Z!9۠B+יU0ݶ@XQž=ǹK2d1oن _RXѳpYw|r&37CU~!ݰ}" bx/IY; w2ח4GrI!)A dVw#jJF=B[jBH;h a4GHT5 zXš'a濒 v.4J_PT4+^XfBZZBՇ᫯i{봴tG2}'== V9 ~e k) Q F\qJ_1 %WAYjH.i2>Anqm8Ah˭LW$5hDDz;-Nyh,V ;1r!n/IJr :XVl(AY<&y뭿C}$&zWMPM^{P솱9.ŴKB靭ؖU SO=uVΝcE)]Y4Ob[a!Zkݳjb@GO߉GTQi5)֎B<~~VDĶ`i{ ҹjSR2,|gbŊuf:II~u@p(" @ DB ȏ'EIENDB`simple-qrcode/docs/imgs/200-pixels.png000064400000002764152427536730013537 0ustar00PNG  IHDR3BgAMA a cHRMz&u0`:pQ<bKGD̿qIDATxMhGǥ4rBhejhsq}KBr4 cЃA!!%Pp=شE!>դ># v{pb),Fe3,.3yٝ}ٙQ 9@@C3Ʉ-?|j~#U5d(3A)3^5 iCluu C[9lf]S~wWk MH[ :?@:!Yt9{7HqIL 3ϪQ'JӞftv~$/b\u\"}4# G9]A[$ YqGN } bse37 dQOׯQinAX6$n+M *7WxY+G 2.F2>N y GWw$b3@ɞ=4o)e6%9Cog7D mG׍/6D{IkP Cu>u=i[V6iI-egqۺs#@Rw>k޹/@MbY!:ȬQ8S@b6 mG)+R) ']ȣ{Ƒ FMm8X 49 {j(Qޭw} !_7(@WxCnt-,6ݶ+8#mK)(" #@K` x)cgDsb?·iܩ)(89>R i_)%cjWg^?@qI%VP qbBe$9c׭vpb8 !N@#;>fNl˱h|Ke5cf `4N O)rd V~%1Y[{xKmWSo72%(TE@=4B\L^GOAFsw$#TYy*CT+1wH#/zSR&yMټ``T~W';pAF1=޳yKV55lsCs@+抏9Ƃ~֬P߹[}e$(^(a˜Ag@ҘV}BlJ@z:H+#aeX@FP/FGg@ҹq9 y^f= EnX[IUyc'%gy{ً+' K?1)]1K4,m?7NJFExF MV,dIENDB`simple-qrcode/docs/imgs/dot.png000064400000012523152427536730012514 0ustar00PNG  IHDR3BgAMA a cHRMz&u0`:pQ<bKGD̿IDATx{pU$ jJgBQWJfYJgejw\q+t@y0y%y7${{ttHb"u9k?tIH'!t*i06@uKδ}Ú:JkVĶE:̍KEB~zjLPH㥯; kpTpTk`a{5\pma'ḱ^ZօM :G0ۥFBү$dBGz0-Ռp;ZȲ(0pgSr~HxWKk=v:mDگ _Hn->R xsxr&*t l߄ ܼ&GvBRO} II:LR񓙟da Y(0i}I,D~s&LY(jA.dY۴)-ǣvf.s=MHa)8 M*iM`9[uYH05|zm/IHXVI~p.Ӹc,Za@@vdiw~ˁ)}ڲlXާίrܵ|,E#$nnѬɶ?;Ҝ^n9ʄh3cxnr8]o|w[M1mf5TrFY#ky8.7& X܌gr q5\mm} !-[3aI,n.}[ qt s*댆*7lְJk.ڧm.tch#aU\y]ʝ5%4_woȱG~cV3I^ X%.8IQͳŜjZ;g #uЍ3!7}M3yiޭ[kR{F<3@tS{h}͈vXri< [UZqNzÇ8hX{wyiȌw΂9c:ff! ( DHkp;#М5#9 s,XbiYƾK{"d\20RZR&$ÚI0L ,8񗀐P,Çluvz = ɻ/ ?,r[mj}Iq)'5v)"0B`;;+u&pDD!^D/{FD3,82G0t.X=$25*E7q `X'"պ.[@M(ty hJ1\SQF+]\PΤ=ά(`9˗HS}kZ9rV$بA"nB|@`鉩샍I5.UW< jBa[-{?kF0JKػzȿv# !wdt#x|kGu_H}$飺QFѨn&WMYTjhQ]TWr$8Po1 '<.l@cps7s{RLgUpqw1>S#i 9qcf'=tUU'!*۵ 2kwf.&tol4O90- V|Pr] i ͵K[`9!#n ќF&0 cb-YOYVl0%("Lr[x6me<KcXE3Lv:5[d%2>i_;HAYswP 5ŮRd8R}”VH rtyvf&Mt,%fMCBfTZWzNW;:&?h.Jq29kEe-GPOeNzȭZ!Z+"J+Ƞ)}j!  1}CCɣ=ߋO7:}M꺩Nsm'`UjWǷkBWp>Gj}}BjKF7w \82íW\C\gC@0]ð 7]~>fBԖc:\j#pZ'?zv`WOVО%bL7B%KsVܣu{nP~쯪)SdH~8"#nU|31 ɲ{ y0#fc)(@I PբODd?(Q-x(T~ Xʊ%FTș[eT3U9V`E1rWP ǎ =[4>+vZֵL պcpi<& *tSWއ-e6Ϗq T?mqD–g%OFkm**OLDmڎ4ڡic[EgB5~vP(.{~5P JA`EmjzYWIn0lH#5HLԚl vU=xjN~w d!.J&cwU;DD.>%""cXD64HdtDD<^Jm!OPFBBo{T(Q,;2פoo\1͟,~d@D܈~S`N%Ty,,6ٰBx5'i7D$ `*G"2ƈ^r  ucQyXw6{]-gQy@O~}oJKtSLG"LjUA!JE(qXrǽg`q e㦦5-V4=>VQFMLlm_[הXr$۞)u&P78~nMrb}M}ߌc3~%wÇXL\#`F*aưTyJX:ja`j.~S\piFh C~A`Rr%(%U}mZ2F9^V7J)?1tQ -i),hj6\󩗓4Z.G[\MW%kɍRcnVnW/qaG&sxJ.uI|NOwygq&_SB0=2 riIqŹ5l"2lqfr} Y%)=i]+*RU0&9!Lp}%m`Cl>/=ѱ_sjX' N$XQ L+``bn`5z=RXQ+OaŌ/lWEVB0eZѣQ~:'yL&4 Gju;bAZF@La%,X WˏѮR_XW[/œ;)Tk##6s&;UsV![9xd|>7QX @)+@즼"KIGYW;:JLOFI|"oIظ&uTWeаQ>T22&\O't&cGa%+X1aH4ϩq.HʉFND4o墰jx ŠŠŠKXq9g5b +K0qk`U/'xCk%+XQ\MX>Z_-۞0bHgDdGO RLmZ=+'@*xֱlpGhjHfRbǼn`aխQ`K# _ !@ ^=y<~V%q벵.DU [Q0 >O )QkXp#U#=faXC!\VVXqdž`ڱpob)yՇ*0;RXYu3ac;!Ct[kPZKՇ¶j?Sq !hZ^])1q(&|h^^q [j꿻걫ޡ+q_^)&E_N,dX,z߷E `ǀ ZTqהE"S)(X]+Ղ9*|<0F_wo/=g"&>b ko9+'WL#F῿9?؉}܏pbyقmUÕ+o44͘s?T]~d4*íţkpV U}2~o +xᡨ #mm%ҳ-hLFfvAJX[ׅ7pjT `ͷ9K_xX}T֜qՂ7_ARXԦR`-YA\8CLa4}U[?@F9ݦC5;?Z5јa76?C=+CXqP+{;[= ܬd$`+]ڗp\n0޽_Z&>W0scX  }X >F~MĿO_ϊZE ׃ms3faqXF\}c 3ΰMe>F^ԩaL`5 Uuo\}]Ê벵sfORM jųuU|}:E?c9P7X #L p `e~aX8 2#妻 _}2D}܏UN*(`K{0%2vT,݆Hj]{>̳7 ˩`kXGqj,~8f[X4%:?y"q;^4/F:IPJ ㋫nlj?B`Vd'2tXs&M9p| v.aeӟŅn/ae/DUPI@ae/ixBz\yV}Q(| Ko }+x=vaMiսV, Z a5֥ yV[5ʱ׭G} mVc16 :/[XTv@k#:*٩Q`[#uq~` wyYX3v|˧q7]u`Oc-~\8Ցfܾrn(*/g. U`h _O'1+!EcB t4 jHʁ&\3X9a VX V]maŌ3ĺj'XgO`c)^|)'X?EV-,_5;xcK"[XyiKEVĻ? V{݆b;c{겂j&`uY17Ša5\HC#wOKe+h(9N~jX>E n,Ir>v?}dBpqN2I& v3u`0 X\*1;q-) z'E 'g.&yeFe+Y1cFVyͤ‡!CV\);y%;SF'`ҥIYY V v:7pxVc5;1hT OŤhByO0eBܙ? 5 !]1".j,f\tn Q` VV%P$a{VV[" D~tO󌗅 FFŹ'`aiVt?kXyoߔ0`gA<>gKYC2<<+*b D(|ϊpꒇCXٴ67OX3d V6LΞa?@G;Cy7 Vp_^0.pSX"`JLXpp=+ÊVQP !(Xі¢9zA܅E}`yu񁕀<+>_׍zD )4l€]C{F@Z܈Mw2 tVCE"|vw<+n 0؏>8 +0.,[x?xiР/ӺѠkXE׎V ObjX+rb&`5XŠ; 0"|t-{V^ϗxf(},5!9tFpQCXqɯ@7aVvVÍ/2 {z`g&Oae;MEX7faP]$-4_.tꢇ%<.Z:՘ct{:q]?u6 &#k&O`IŪINʋŽVڲ6 .ˏa5Rq!xt.> ?47 ;qjf&8.c(5q!v`EEaşb2lș۳Xo+*AYOJDAx,Q*u VC@DYX~ ل@)"Z8Jg6ᵲ#P@͜;qȁ :~5U#3,7f`Mo7-V+6UakS4&#dRHYOa?Dy׬V+t  Bo &V$2G/FozڙvܰAPjW+wԨp;k‚5.a曍hU+*F1~Pþ?va Ap=Xw`{)p1pP#{X ҢR`c)AUC{f]s55m*sSXIpV{ =9JϪ=o+SEz!"h&T +Šva`^BN"V`eul_ 2kZ39pHd++ +>. )|cma҉IX8A>wn|1l"$r3i5h'V3qJ8zh5ٻxUYait>7{c{ +nMX#O͡7Xq'&8o/y(7L*ĉ[BOUnD \uY}bK/I uYy7 &H}Ǣ[ pZ@a@YuV+0CVjhE8\gf.V~]SX+KHaůg˘~dhVxO*՝/xYFXcoKyf># J^o1عgŐ`2 zVZV [uNj{nIƃ^VCVNssVV.O8ʃxV+!`qOzeą?^V~_L=+Ÿdx gz: FatPg6dWNtaFl%񾌢Vч.fEaJDa51V̥V|݆G;}.U=qȍ%+# |a܆ʃi `+|Ϫ9 yP쭌3~'ݲ-<+_Wbɳbo"VE'0#z?9<ЙMϫ5Ѩ<9{XaF āXG'9sq#@tra5.sjT*&+W^~G 0`5agLlX]ƽ:E"DD=+3?ijDcckMZ.ѾaQƳb( +v`Qj|\EX֐i9yEj6C8޼ĺ{t)Qj|aeqt{V>`gV05&-Ys3BCY xv ^KPX ɳĆ0{3X]sV8gF]5"d>8)hhU@rHB%gZЫd 6XSJxՍIs7Sj̰\%@A O=_*T1>/!.8 iQeY]] 9+WGh҅V(:+!nI ' RBY]jX736$%Ek]}6nej6VwNF܋.@X v2"ܑ;XIJޒSLdEi#ݐSs :S2"s;jvB .CL'ኛX qg/iD `Vl2*3qmFmP-nvjN{洩8ہ.ScPV:لm8ӎ1I9g:QہE#Q^:eSsL(nCB*** ,**** ,**** ,**,9jukxl782⦼"~2x:~H +pEZC?|r"3r3=͡C$7d͊xXG'9+?<Z݌X1@un OA@mjfd[`N崬aWC-6|yC;\0-]V׈Sqcsݳ'Cc] \}#m5XIK1YXXp V@Mex~,Y&M:ՄGnujץŋ\jﳆ5>nH kլ8.(z$|8zȣ8Un;_67Ywg^Cbƒ}̽h9`6 >(Cyw'FVCWjV +x.j5iXath1 >9V[v~BN +kVFVET^ V61]w:VXG995kTbwW=1{e.~Kbϲv✕m8ҐJc[gz:Ya5\5k.e=pG3+@o6Cc2WР{`u46\*v֣N2hFNQk6BOeh1FBdp9-`E"ېu >  s!ȶ5!xHflL@xKۏD@V DxF>|9mDG frYm1Vbd!DX@Qy"7..LC/' $c:x_5'!ɑ1DHpV4Q\yĴפL($TTIQ&IZIպI "X;k=6{!&E7~!pJX8,y㉐˯bmYsK?bS纽-JV`-1]x`2gkY2gXͿVL.EV(GyJ BbXRoV)^ qM>9rVoٳ8)V:~Tǜ4]\)iLg2ᕓ @Ý3.toW5quN:Sbt4qWfLEզVsmcfǧ)%.CpM J}nAjTĖ*Mݓ#7<IZޮ9m5(IƏ3 Q4j:لNcwG=db V&fB;:ߖ h by|&6dMCD3*zX]]H㚤X9j:ՊOZ+KbqgTp/͊Ad QE6WdDvd4XۭUcs9A uH3Tٌ(NV6xQ F4X G x(:$FFF[ni\ApQ=ϛ3PH [?1k⫶*^w rFjw,*U}#NVZE{%4`5#CVh*Ug>jlDZp$#!_v_fh5;}x}vI$wwH{3nC9+cvb*/e-XQqʛ]euRʯ7:]9q}V:DZVd1r]db:AUmdrݓᑂ9 xlSbH :ߎOnuZ5HIk}P=ᡬRynp374oufKg 9hH cZVU'XUų +0domwu nv3Fe VPׅ7*%!XT16}P }xbs@rakѡQ9p1ﳽ MAK89PЌ`eӾFznth0X-qo/\04wu`_31ϯ:{-n:MLWfo4 ePcШg` :yEoVΎpiY`9"_fhשjtFQzjujln2=:"\}6`+GX]5/P9V0->]2<}Ԥh""߿:=yY(VVxe_);,+@6!2f$+yY#]F] {`eDaEBŁDXH2f 1Q(# C؁$O0SQyŮ͞Dx6[OL Es&3/ O ;8O ^ )n VX1qdj V%p^ˆKa[Fwŋx3kJe5V!V*#WjVXҊYa]HL/AiD+șqiYCAlRɲ0̈IMӐkZV$fCo1LpYo2MD$%RoHlܝ1ե=o;///MSW '.aNS* ;%W!CᲬWd`5n>EXx 1ZjŠ^@:ll"IX! |XFljC9V  Tl4=TFNojd@DZ¤GX=LHEb-fXV{譚FŁeFtk%'j鴘PVڠ^ f3#tbFr*r#&gԘhR _EvXuTnMA-fdF ,ڵJT+" C,h}-ՃDHz0¼E@9QH s]h^z"$AHq3XdZЬUMB, Pa-†Rr"-SpW>MO.SJ\aʴ<;gϖF+ w¹ǎZNyq&?E4f#9w_̎APoϹ9]/Vv(EK<>vٝR]Zߘ+_ \8jZJq|R_.^i,Vび[;uzIt̞JxXTVu`D8Վ0iJ9*{aN50:atfmG# O)Yy7#aRG gu}Ʃ݌8&^3 +0Ϛ㎌b=Mx>ǒ DrZ]~飻NvՕor/ 9sPPx ܹ2ek==@e65Ἤ-ZlVТU%QtpKW vpX{XaeӀ^8>i$CbaDwk?j`q_{#k9zekk5+S&y+Vp87!DG-uSC?5~t +0dpU֒,:r~]d"xdrp`FlV#EDX1_<عC8”JDŌqA!v: ޶4RԅB0+aDX@kmdq_^"I{Kf]AL7=.BDS&aǝSYxp!qud"xJ"ițOQ=)aȕ`ʽM"Y@,8vX1ڸ͙;bC zO ܑ? BJ'#>9c1'  WފomZ_M_$g ߋqJpKv:), VBhcS`鈷zAb|8zHE bRhvlQ.z#_ cRhR҆vr*_C+ʩGtG'A0aEFϊ+a-fdyrq֠2h-uXB|FՏ`& :,u?rB"=[eР^uX:tuX4Z߈n͡,V+tZ(z-f8G;{LV 0[-~anBh-Sx^<9s1n+uюܵu&+r̜eZ,Z "'fm/Mo\;zKz!)u8J(vaoYpSRn+^v <>eBaeL,x|BՐ^,?eN|nϙG + $س.AUk%8T֙QIxyAcN!b?N),CB_SbSqlKn%mpr.'uk.me@k6ị\ +8׆n[a|R)|^VX9~,Qr&J/T:%{t}[:C:;%k\F]WP`RQADX }ξ]&tsEc6D}+I&32! "s ,ޕ.$ .`H" br4,I#D41 q邂@|P )r"?d [y#kyo卐I5Ru;#ޓ_1 b ޘ5+ޘw˸+^Ȟ8tf\o"!H8e\V/}#3_=Z5mžz,Iĕq#bֆJhoBJh'gRXqa[k ӱ291n L k$X.(XKc2ZӂX,@,\e5h}w=`~T d"j ((((&Dkϡ^яi,q&ae]~4Tb]dܓ_ɑ14cT̰Hܘ]5鹣XTUMUИXK! *v38Ղ5i7oy\ɭ7VI|VspKv[;kѠld 9aШ5'!6u V&feaGGf#g't i.ljvL]Sy]K^ct7B&`y\&'muJىO;/ലK2p[b( bYl*{BؾN[%^Xx%VO"kW+wJq9|~ ^q /4`ٍ(N&#Fdd_e'V!!ݡUa.Oğ-wimZ}ܳNU߮;kO:3eźlIJ;`96Ϻᲇƶx FVЫSV#/$Z8C½-w}EEXa.h^Es55m*cSj}[ p9UЦQút:ѭN|ǺBzn&+CtVXc_bq]'5^`q֡&.\lbH˨ 0r5  wMU/ӕwgNyBruJKXU^lho+1펎:VXWUt :;k}^+_;/k`UjzY~N8ҘLf"ϮkQ:V6Ya%tJ3Vж.5\И ĴN?" NǩwhWPr6g1V,}_ޘw`KL'J*!#̰Ht2qq*sG/O&jNB3BEQqDX@l0aI0BKigǦ4 弐7 \ gX:40+:vi|<(uroI%15aђ`kUFXLL$ÓY;ד3<>UYai7S嗲 dD|ֲ<$<eú~; lL an\p/myײjrX %zwV (;`M]Qh8+vu#lGQA㥺c!0|V!({|A<{i?ՖXT2Y-P Th iOVB@!Ԥ|^KL{ZIa699Nh" uz[42SbyI1]9)mTT`EEEXVVTTaQX Vh1MDN-\l[AN7Ϩ5P¤I~XoԡYp&[h)oxd=F : j9nsb Yj#3{CaD܄Uڡ"6uGǍgVét~h,V`{X62X"gGk0#n=? gN`(Vp, K1#"h0_f,J#.QB>P`DXG(2ɬ4ysXVr8~M\&4:iBkFd"˚vNsyɋ.` &r_jp~5שMOORKxy{b< V̘Ԡ0bixlH,v*llw_RXسV~Wn /<YhWza1 Պ3.Qt"+$aq^z5*T=1jPB݃ ub$2D#>н08ATj`3V$0~מiqm M5Ea=ƿrM ީ?7kN + ty˳I3+\ O2Ό347EarYZ}KQsVXA`7n<5>^Qaφ#,XY ߢbRXVB:\Pط}K^׬_zڔ؀*c6HG{Xa EԺ䍴f#1&GhŠXY1g]q:n9-5kr\m8FXsbNԨo7r+cpݾ MAޜ,Oa寎ldiə]qx%bM.􅉥|֍9T* iWe99ߡ]u.ڸ<5i~?MeԠ0]9H|2:q_R LPmcLz ׍mY[Np(ІIӽ1|{^>bBa#L,%HR Đ<[ثaZ (jl\Q$]+P  EZ "0CtiaC<+`h͸Ź/?O F0y9BŁYy +`DK=̀AX1 X$ŏ)W_XƕycB3ƄTTVcVnd5lVXM ,**_zXΥ6o}+jXkq߳ȢXc geU3\[TTcװs]}| c%XhTB"!MA-:dD\G5Rh*`X. GLV UȖE Avzj5H EjP:4DH^ҠТSbФCFp8b$µl@A Ղ@9"ۣՠBQLi8% xžh@gKp`qS9^<ݳEKɜ\ۭVӏn%ix2{3ZkRF,ev^͎/sWD^uGqy/Dpثh9Jp]TtA<=tVp"q&Eb9,a5zb k lsV#/=MNߜ݅jyFAuღsBPF+G1BLqWkK]R X τ}F@O@v!Q>麀{e:݀8j'j`-x9,Ʒ! v}-H<@>65L#5GyA#!;)▮ pf#"+0e1]p7𕖓'eB4=nmjM;mp+Ղ.:K64Sh:.t-Vg]!tv.=GcxX[Ya5<gIQ4sIC XniT,`I0 dΊCN=8T̈BD~1DXmߛ7ZEh@48^O1$&YݠHGG1GeqNx˨ aDzt+Q(q''EJճ9[XD|bӭ"ꑜق%hdzf6^¤{Hkcs*vvY^gՃeѓtbY,a5l,V &q¥ " +8"Oɇg&/rÙ31/2N* {WA*r{8:,R,Js0H$;#"1dN}dGEINv\7 YAm\niJ/eZ`PJZ{ǫh W{ B;Z~+5FtiVdaxF)Цf~$KH {K!E07ZLh+1h##(\x^Ƣ¨8 cxxV ǥ FT[ A<0rČtᐔ A4t j`#@G{etiҥXfba}J sc6؇i+*&a!$7x.p+x+,**2| +V&gm;P{X}y>VTT<SXM LLX +ՊΫm#*F/[G+I+|Ek1wHby_Jm6zeoed xʦ;sK~M 1Ê v +oA8?|9 3ma#!>Fـ5žW9^ UǪ2u~Ѱg.ѤRyZYonO9>Ʉ9X,Oaט,vtXatϊXq2^?+g1p#X&p3G)LzxaXC;> G9MWU`O'onZJsKh\4Y-KX㵻pZX~e n#փ`uQuwsX>MHT` V룧xGp4Idx4Oɋ };X1سn55'dž_-yy邫m>Zp&=ְr^Ȋ{vhkzo,DMV v4@+V:<ЊZL( OĒtӬS`oΫz1'" ˢ2\u7ЄĘ!O$y48hEAD\vodZGь$`vh"/WAVT0S%TF,aW`*mcitF~[`ڽkʟEEŧD3"l4NJl" **2 +{Eϥ+d@F.ltǞ՘ŠG`y q\!@E#7,zSɀ:e?^<#=-yV ~]ip^. +**o'")Tx2g-z|\UʳsKQ} +*1a5R1R6LYSq^TzӢQlyƦ CBa%~&0/6b/gZ`X"ZX[x {!K<.u4XeZiml4ܖTN);iVvbiTnK,5rXAW9@ >&-{h·h+(<9Ab6lƳb^ՀA{6y+8l4f#d`96ϺaB@beEA?rjcYvƩ_y!ܯ7XXwS_Cu.LAlq*뇓BDvY-䞿auJ|Z1! !m^3!TztTQ ~׸R"OM}^M쮟UXZUjz]378/־:bԅ݃Mt'GFGK^%;Vc\pl8._ҰDf^Nr|md+\uaX|Yמaev3# QNj҈m4,x[X@4ǧ*3&˺0֒TVX@ZLԊ܂PX V6:w>wӭ=æ`w%G A&ɳS=\%!X Oa3 ɈpGYarH:>`X`ӽߜ RrcHk/ q(94&n+] Eu:-4Y2.{,Ϧ/tjj/e/-./gbuDC3xL^%Ny,$fXaВ9kDF=z "$AnoA*q!rZL4% v{ F-Č NIIm1ӨF$!" V u0 NOSjbyV#%aDH f) B$҉0<  <%ƦY.M h1?aD35[ F0`EwPQ%#F6IENDB`simple-qrcode/docs/imgs/eye-0.png000064400000002632152427536730012645 0ustar00PNG  IHDR^gAMA a cHRMz&u0`:pQ<PLTE2ݾtttaT***yyy;;;2󐐐cccʺܠQQQ>>>///uuuSSSߚiiiubKGDHIIDATxV@@XҀ`9TT{^8{Xk6dH 3ϛ9& l#|-LA-tS75Qx}vCSpxaj> @yFI oa{M ՜䂸wYA:' ɹu\䁜Mbg7HǻP@v>1 `hCKUhC@@B.G& tN\Q Qbq  H!gr"Fbz/b{A DcEa}$މC5 !  ސ}" GqQA>yw#@) Ro,r-qyۆڝ#'k[0vtx ֝$=\2d5!.k. ȋ֚ R7C5u@<3mJ鐙)3H2d.sǀ L!SʚѭO|)K2+:INY-R DtY0}򻂸5L=.9 <dHY&q+z%=;ܙ{{~U8~NkwıVm@݀|ؒ u_%T-ҶzvEf06g=|C@@AjL>.$Brz2?b* HĞ_Av rx[0 Dg@$+^~05 i_+g>S]O ٓzdɰ+m@^,'T) 4YA= LT}Mk{!na3@CnnrAXcۏ;@!D%aiqή8m@Bn@~)%N4Cv&B,k.m 5b6@ҏ9 d,w(\?Ki񎵍s@~zmo,f;fhH Og.Y* 5 5OSYybK&qhg@ zZ*$bmȖ?_ T!ٌPIENDB`simple-qrcode/docs/imgs/example-1.png000064400000020115152427536730013513 0ustar00PNG  IHDR,,y}ugAMA a cHRMz&u0`:pQ<bKGDIDATx}ŵGYdVVQ\F% ȧFEGXss cP5F]5IbUdq`Pe#8!Ȳ`Yaw+tv~յ:uNW)Sr iyR Lr: (#QW=^w*+pVaLgWVjeM"4ȤFRi X"QKG] N0+j,e4{t^U9 %!!0`B!B"V84Q`|8d#QO,](ΦW-U}$%!%*{ccD^%G$w`jjqB%ɀF.ezII ůqcaB$$]OZ3.UOvl ,6Z;s l/\IXCJh}*ݻH1m6zD"I܎SUeq8ˌhOnL&^6֕;ZS.tfNᦦ6UqZ/C0t{Y9$'w&`azV%&G^\r:_|F &JOa-`q˳Қ- Қq˳1tز{gDž+{؅\|5n_RЀՔj0dSJ1ރ!ӞVՠ)ìg.7.^9%Tp̿`O .`Ƅb'VV* cO}))?^\>^_듆9{+;x=44:KE#\[{9ZkfՈ|̿x!~_5i4}Yx?/֖{0yt=/Wr r9\32/؜y՜f8s~& յZlݽ]g/~$sl*j{urW>tfonڌn2x8Uh?LFw47ګ~U/UO/Wi3dz4bPJ\T>vtSqtf_#KΒO%kNBWֈ޽Up|ݻѫr_m>eG?rU$}wOv[8G[pqt0(M~xk'w%)rOlޕg칄_JjN</Y R2HU;=QʹuvHnYcE7P?OŀU`u^J\T/3jLC2+*حY\Dώ1z_(cZjM{u20`̼o]B=;c/A@ Yؿ_C(w9xN{$C"K~#x]p|Xp9Q,ӹ=//[nԱD(P<` SO3^ǻ [3h=s'9'(Òoұv?AbIysdcRRIbH0Ѿ2.G؞`m]=mHQFD>ڍ8buƣ}1)6Bd.WHa6GwѻwV?<1r1z96lRotpvmx$~i˼#3TF-{ SW M(ì`ZO8G7\ڷ㋊8 J09.| _jkf`e  EEi`4l0_`,/ }hsQt$1Z<@BǢ0:9!㋯!Ea",Bo1--!%{L_aW2z=BKBB4pQ40h$sSGL#M-ëmqptt[j7!UTޙۑu)Qg\>IsJ.ӈaX.Vfsuߐݏ+P^~1 2K-Qq"~6s<8{)CVk57˨8|6s,8{;!Ĝ%!% 0`BÄX?'aB<8oXs,ΰ%!<i*RYtoGO€R}]I.;qOrHMuoGO蒐ncf&Y.$qVfn`Lɩx(~1΀~ V vK'~qK[Z˛nnX vxȥC+/nZS\?XE`et^~>t'}Xd%E=ݴ3,B10`B!i)Y)t~Q3[/;uٱg4z06Z[9pCO]7+(ipݛLٺdqkϝ):W*RGU-r;27P۹E/]}_)`54FW>k ʹE*Kdtɩq톞K JsnV_ڊʅ\QgXO+ݠD+ip;LwK57jEj/Il)gϕϪK Zb/ [óQB10`B![B͏|N==^_ֺ %-Dڹ~_D}˞dDÔ䢂w^C$54;stcTfe =;2aZmf֐:otI/<09zSPUz,N] ̕3_ V剷 _H0OV͒MU;%֜.4/+$Y?/r!! X€E-̂^eC;!C!E(ݠZxJ{~ڱGZ'Ɔ(ݠZx6d,ʒ-BڱGZF#R+Z܄vYtL>^7TJ?]#QQCEi#aTI/Gͥ*KVF.us^*[n^z=#^ P_5ݟڣ}[NJv(Y{0=B銹lWE/Dž}X,\*Z)+PGwyi~3K$?2^FHu@UvW2^"6rQ/aBb !nkmdaB!WKB.J(d̰.ex$7dD$i'13?&Kr J$ho$64fW~Ry[Pm<_\.S,ݢF#-ȭť35?1A97PVlM0z2`$Z0n#M)-+x:(Tq~+z$)z m Oo\Mj.د3wL&{zJ;JX}XcP;w%e?^3,B!0`B|s ,iJ3LoGOSSe5->^xŗl\A`U\o 2~Z\שC_`gf/N$E[c#v+T(V?wǼ50^\VM#JNFY|m<Z&2MXބyk%Mbk_S  CY|8GH_; 5]zrݫse~Y쯐^z_ōc`"0`B!ķ'_+xbdo^?#a\nU2d2[Z5oƎ7_uĿ㗩Ux⦸e[Q㗙-)e>Q-5Uґ(//eXZ6'G$ܶROޙه6zX-%l<'a0J`%M_j=+!N[6) =ԯSI ʹN>,B10`B![U7}(~FC!!%F.v\=UTy/vJ]SlPE7=7tstAnןxC}5r}u? &DOεKeEʞS_+X??/G"7q *37k?m kgf!T {AL3n{^.Jpaz3qVYOW{ggKUOc`"0`BkEw2X?Ӝ ){L B/. !, / bRsx7No} ;zfPr{J.['~,:\gRoz,4E{طlj_w?,/r١eϋ_\.c}W$VS.(9 C[<='=˕s}ܘ_ZRѓ 3D`y"ᶘ>+t*z2`7sTuoȭJ>|%Α"CY0#Ͱ19>aޘ=omڃYy˥қJoƬxhD6_X(vi_J{9RWy[ki5l`uuR鏐JWJN,`^AҡǢ/緩5Z˻3K8׿+??!ME-J,Jo3׍?? Y! X€Ea"%lodse0FOVQ77j4f?<̍6rI#j[1{$tKUQs.\>vcXނ 'c`nӽ#FЮR!;Gx1Rk,o ]^ $/㍱9+Htu[9O9՛˯qܐ\kbզz,Noᦦ6ĘxZWQe/@>vת q%*CKN`%F/ vŵ_Ã/k6[ Vp lƃ/k{fᶘ|9Z)p*d.U.ÜU1a\ؽU];vńis1gFr9l49׬C[#%7͎>^3=o؇\-2;mn lCFk1-DfXތkx:–]\z3{ͬGf}eBrwRWx̥>"0`|2e5bˮ Oז]̭жnч12%۽Dskp]ѽc{.m2~;osI8M {4lih7}DZ3&W>az{] Xk?.κ{Qc_Gں他r֯G,_,>M"[^/̮LϦ"Mxv;s{. s:Gs Q>ٮ=U_*IAUz+ps+>كx,.ޮnXފW ZKAg}Ixa|a17P7_45â:TwN/Xi3wQOP_|Pѝ,$mGuO=X\N^֙?ֆݢf!DPX/! XҦ\2b.DAĽ?1ϰ^$83{wh$Xc)}Ņ&\6hrSJiXڄ oXߵ2*6f2J[D?W 6EOQ.RkU4ųF0ў!<?G=Ǩxy%ˮ*u/D| :h_J\nt4*_3NZmd]: h|KZ_OЍ<|pXs?BtZ*m7Қ7S;㶱8!w 'w@ ! @ & EpjO)w}T"$B$>d\tĥb:|buy"WQ3$!ڄpR8S9'& u ;ԧ7 `um|qNww ]:ȱ:D+jǨN?&.erB4*NaAVoś>| NqA;'zsN!w g>Ir2-IqQ[\=M -G9>A>UmW8kf.UmBs>*HQ[D4̢$nR@2:(!B! X"k惏^#&`!˟Ip,C=KB"iɿ2!XCvۯ$TҲWfe|٣FEO~9z@k~<m$nPކ6!my%11> ﹍Ӓa VqO3KB*ϧ߆;,\bJ| cג6\{pl++$X_m b X,Ba"0`Bt0_=WKk4Mׇ|?WKk4MGT곂zSIENDB`simple-qrcode/docs/imgs/diagonal.png000064400000014567152427536730013516 0ustar00PNG  IHDRXgAMA a cHRMz&u0`:pQ<bKGDIDATx{pEOKBHHT@Ԏ:308 8Z%`Ɖ8+@+[RE J R3ꊔ ZZN.C$$w`]"_w}Nn#믻}}4 $$B  $$H$HH  A A@   $H$H9I}`a 6?aW .[VGG5ȑS}0eʸ2v#^<~0ٷ^j_guYܾ-[CIIhj(r"__n)rY}E[! \뀃i31憵@Y#8x^84i*58L J^Bd搛jk}p(/h;p?ϟl A2ɔyrv"cjtS?{-ZHb+Ѷ KKK o@]S7**3qYY)8Ǐ&14pP:&\}~LMt5-80G8~8Cp0s!}uUnLF/ Ѿ k6ԡg=i8h}`JcIGܹ C1 i16NRHs .Y6o!0{d$hesEX`t?? :ʕ󴛦Ip444%pp"-|6yO~SGODҟÆ g_|qRyee/#i+p.iD=_ݦn@ 3G\܃pIYC52(hw RٝaQ,U{NYEeN!S? etjۭát‘ijx_&Z y(}z: S 58#.XmX7ޞ":ڌqb 47_Do@e h89Lڦ=zt nxRg[o׮`͚B7~͜`УG1:)CcW=c,>ux޽顇&CuBdPDU2 Ut]&nlZ0 $is T_ QY?'s3` 3@ Q] .ʨQsɼMU.P6AxpV1TmA:_x3z`6|Om^XW_]1L~I3pAa&ž=/ַ+<}ܙ+=Æ g'{`56 ߦtu8tAP&OYY(+A¸cJ] sJslqϤ1p;m{K2iX0x8yFpz%]¶4m& &LNjrGÜ9zN-bk?p(jW>v2fo:)QV8g5qGs,*1 39hO;kd:o- $ N=*[MKҎq&=rþ}a̒J%aΥ"vLiceȏ)sd}U3S$%PϘAq;pșqϷ*8;vn~I7R䀘ۄf|E=E>{QY8 bj 4-8\%WpfC*o(B v6ch YMНdnvnH؅7nv֕ jt;搇9'}gh:GGp.vr\2@-9qrth̙F?c`*ҷo/}{6??ѣC ?hPKCb ! G$b e?$ !,>G'ü>!iw_r/\h qʾqFB~ښG1w9Ĕ|Q8p-m1o`>uٵ8}k!C* ;cv{] 7---u.a#G^t^|Rsرn{͛ ??Y2.G7=ITVv7A +fP),̗((Xthyi83or /D)8mR7]p p0p0]XhH8C34j3 8|pĝu$B(pqyfTW'GMM18jjHS`M${p] ]Pc ƏW]՗Ә%%]c+_}U nt,@nn[3v޽*1m f='={s7͟o?E} 8Xf3 \:PE@ `sQϴch X={{n_ƴa'\?"slO]ܠK_"yÆߛJ%IXn.TE9֮Ȣݻ+<ɕw( ={@65}M@II!tےy6ѳg_[!00`PZZn x;A7dA8Gp0'3JzAdL0`pഓ6hp0pd*d޼j_$?3fZz}Mãlذx}tAuwyWezvΜ<`2Xpu8NgѥX1rb+9tp@ZWw]&N!vu , YG} o~7l>ȘZAAuL/csƫ&W_L&"]p|{C5aCsR: ;Dppvb8a'}[(鲄0p3C>ZǮ<섇ZZZ34z @Æ u&8Tuj׮]P\\?w*q Pnͱy~س38{±L&dɐ]"7;͚5Vi% ݾ47TTèQP5IB9PUzvY]33hC\g>о h7j}ߊw]#Xt% Kh)['->ûE<Cq8Oyiڷ]|ݷo/(//Eu~8qJ\ w~ݡGp0;TWE^!?[U5]nҥ/C]]j6=v+Xb W-{ѢpQnVUN~8,j׉b8UZZD}[Q-2bss cvbFsGdžj&nv fUA9`(ҁrnzrpX 쐛ô55ldU99aPv>@6,ht1QpELu×q2̛>2yd GƎ._T0 }j ,-B3?clX ee‡d$qjҪipMߋ,5-̾8er`;w Le!_GXo*$f7\y"]mb7oץm.ODe5^RrmkFTp&f1ꤷjAoĂq=$q BA3k͢`D 7;Cu,aNhn2T9eamʕaƿ%ck*' #P-X l_ܹs3pxe^oJs;mڿXsϡC+ᡇ.M>կ ݸ6K y`å/g=fI8T@AC\F*T ЀJtG4jZ + fQa~ϑ\)m,7[ <#;QSX/=ࠛ\>?N v)0छQYw ERPnjkP 8c?Ȏ ޅ\H YuB4C^E!9 p- d^xSvPYK0f8Ðp߼mxPT6nh#`L&|~~Jؿ1#R\9 <)--5s@x m9s0Mz·' ]&Ae1$ї7jG?V8X}\aCB"kGCYy  pCΫ>0=18n!͝sNb?sm3YM.ˉgv EEIA /lw>]_ )Ӏd{~K0ۖ+O}yΚ5ƍՉ3f\iA<Wȴח߇+$sύ4,^#F6AʵW;ƨQe|Y-P$u3Na$c齏<îGiwҳ`$u=EA㬻{8K4sINHtAna4yHGܝ.BGp3) pP&_s43i4*I@p0G`2FHmm#,ecBN׀=547ߕu8[ܹft% ;E% )*}O]a]:w@HM$H$HH  A A@q^^ #1IENDB`simple-qrcode/docs/imgs/red-25-transparent.png000064400000002302152427536730015255 0ustar00PNG  IHDR^gAMA a cHRMz&u0`:pQ<fPLTEYJbKGDHIDATxks0qE˪UY{sܙnvrxtN&BH椈v?mJIufymy֙@#Cʕ _E!HUͶ dm 3- mR'~ii_"!w@[Q 67I ID !Wb Ⲩ^25o#EQ\kǃM^)k[[~g~"vdH@dW|0 IEg'WblF&o @ )99^*w>49Y @:IQk_jfZC4֦&ΒlWOو%ѿlCn 6$DBN]t+!ǞdHu4w &4 )e]+ v!xԻ9 @:GZAP6ns)ٯ"z[!o-!unM@}ĒX$nY"_M $0g9D? @F !zHAĞhrnq~ֹI@V=/ȣ !Ѧ Mդ;D@$ vQVKH<6uPo77Cs0j^CD@ڼͩF+ Aڼ_վۅ- PeTJ$K`1ZAZŘ( Ĩ>`%1!BMJ !A0M"iiw|s=ssv̞33gw̹̍(x4 d&,L/\ QTZ5"!:QN0Wa@)T!='*ӉQƈ ;ݟd .: N!WoY9œG&!:8QEW(3 9hlyDGXJFڃ?dIX=v1e.fVbżmoƍOg[Ǒ@׳3=|F1DB]@EyHt465 DLSQ/-"@LvR ` N.OGNmi[]TFRZTŸbcXe ?5\0Gf˹&*-:ǯKpj'ğ"d"@f!ewN*rB'8qxn3PRzb, 7쪆@4/FH,b$8~.VM $Mk1^#Ru=@{j--DY0[:rU1[[D[6yXu=ݙ`.QEY-=CV}iԯW>!~:(]ƈ d] a5eߵe1NioMcfi0ښ5lMV0'ԜG&Θ;VO y] v"@V*͙F ߎEFֳ, Tj]T1S<,q2>=O|K)eԐO i#mqmd` dB_ FR^e Qw`N`jJ#"|4dYVjo齸s{ qokq3n| qGΜrܔYS9S^¾n]~ +=꤮RT*zj!ER|g:!R::f**g'-#5ɖ9c6e27Ɩ:}9fp%:mk>H²VKef.ZG~ +$S' KS ER!p?mְW~K뛭~QN*ܤƓ:|.zn|f^j/Aޑ !h5Ee ^rwRrc5u"k}[O^~k+Ih烶vpk^t[_ԍO l=mg%JߚuΕ?Zn6 ױ +ܖ.@H_ SJQ)@CKE䬓a/zc:. ZZŲ?gJNû>D_ڏ(1i[[{kiF"@dɍ~Kt]W;z'#;*]J)3|(d4Ǿ牨K UbDZga,9xُo ѮZ- $[SF̒!4_BTlw\J(熶(AD<2Խ'@srWc-[!\ />;\0'd2E.߼] a~`y=؋IOF̵KJ֩U \.o$ v"@d Ccr=kIYji~VpI{[lezQa#dO *#D<_j\U WnX|&XTS:@*܏݊/]X.n nR9gM#>_}p`N#hw=N'?ۖ6~>l.@#iS~"zWͮ}޺C Wod++?-Y 9_ N.[h}{Z.n3{\ƈ m }wY^Ktwk|M{N{תq%-"@L"m`IENDB`simple-qrcode/docs/imgs/red-25-transparent-background.png000064400000003015152427536730017374 0ustar00PNG  IHDR^gAMA a cHRMz&u0`:pQ<PLTEY@,dL />#}fuKpY-G6&M.[BtRNS@QFIL}@u]VCEF@ADIgtkZWd\@FanMTQFVQB|]QJ[XUDANOHS'EbKGDCg beIDATxr0`v-CBʒiKP)]_[lǤo&Sɲ  䑺O՚T}ZTY:m]cjT}zT #)Uȁg t2R}f'Xx@< )9Qb&DnrXe={@cJ )'Ts;D m@@ʄ<_Pʇjj!.yWxT&J@qpS's >gQdi(N,( xCӄ 4>9U!aȩȍbd@ʂz"gsSpa> =5tP쩐} M\g7Ț啕0yf?&3Q/b?k-@ ɦBQwD@E@͐ޔ!EP͕PVW( +*Xd@,7%'bfkK+/| .چ̸Ć/)S;-S.W[SOB욅u9I~  x T #eAn'g0}f5 򳌝;k͇ @ k}Ol >o6 &\.tbfrf;mWF&+{f7b˶DPMH@JC>ڧ&RAz!״U)2; >4~Yǜ@ |6>ĜBs>j|fvxḂMl>;  i!9=3}܄N&rYDq^Ym9@o!Y)B]qb >ߜ9oZd^>= @$wN&qH3c+A tOmI~$b@2MLѐЊeMmW*ԴHb ǜ@R@w(+P~x# =5.f;w@7vP_;uEٷ#LEMh">;  U>of"!%)w AB:{WIENDB`simple-qrcode/docs/imgs/250-pixels.png000064400000003271152427536730013536 0ustar00PNG  IHDRgAMA a cHRMz&u0`:pQ<bKGD̿6IDATxOL\EwP&R6Bj@l xMLI(K$렃:蠃zIIɮ}Y譫ZDbleYۥD> :蠃:蠃H=:lؗ<0X`P9m6^9AtA?876e+6lzH?:<蠃:蠃;@%d6&nT1WSb zZ]W^zuyiau#J<6V/e)qMUdVa(n}tAtALbR`p@M6S߸(ityOw:2-{u\J+[h-K,)͛^t۔]6´6e\aHEI:#ۂCp3U'V&?xw:\fŀsRl M0~[Nr~g9w#;E_tAtk/zf;xKιӒ%8G&ږ%`ø'r^D$i6S8A_tAr|E|$Fz=4Gݓ~ lYGꊧ|YoOcOfzd)9slfі9,?ک[#tG<m:蠃:B ُ޺`ˆJU=y{ZzC9AtA?B6=7yN_vCFl6׬v<蠃:蠃.I}zlTQ'נUkcfxXoxV -bNIxʩa̔˾R3~@tAkjZ:PpD՜+M١_:;QtٖN)ח:}tAtAG!-&]i7bss;2"zx_ɻcT>AtA![ #\1WM]RL|iKA3^R <@_tAt?K EÛ{ADL{u0O'm8+蕭(pֈiAtAL@(ݵi{*Ӵ,؀z\IL5] ?Rh@ŬlKT[O:CY:蠃:ekW=<&'Ƥ6T~tAtA/~{NPIENDB`simple-qrcode/docs/imgs/eye-2.png000064400000002632152427536730012647 0ustar00PNG  IHDR^gAMA a cHRMz&u0`:pQ<PLTEttt;;;***yyy󐐐cccʺܠQQQ>>>///uuuSSSݾ쯖2T2aiiiWbKGDHIIDATx[[JD0iDDKmzyfJĠw79a  6RI(>n OԄ^o=4ٚ)h>mSzs @gTՇAEB$ϛ7A_5\)+HOf@g 9@!Gd 0/avHn ~ @JLvr<40 R*C4sO@@BNF& d'FxlrjjN`>Qbq  H!PLC_Ń UZ@vSG*:*Y&3x'lL?Q@Ml*(6}r&!!șכbnT2 eAmal'}r@.bhw싐5#{X؂8giiI>L!qwuٷV  hHLa 2D~iMu=D9l.C1  !pȔfdtkS'o| eBTsBll씩Ւ)MDHO~Wf"e5]]@qLy) r>8$ngȾdydKSseЯ 'ߢ߸{Vm@݀ؒ r* #{C5%w9D@$9jsBbic*d(wn|:(,NYǜ@ \Ğ_AsܤB Q!Elv@,}gj MMw>ե&R ؅yWW-@y{9Y wV05)G<s _Ӛgqː  lr>v :=~+fq$ $,RV( "5/  ZMOf'ܴ 蛦ݢ! cN  ;Q Ĥxggqblf }6@&K4]Pg΢S _2e5;<=Es@C[\4jn꩐kjzڂ R?RIENDB`simple-qrcode/docs/imgs/merged-qrcode.png000064400000026306152427536730014450 0ustar00PNG  IHDRDH IDATxyy}EhZB */8&I|{rrorsoر;68c B$! $Fh6h^===F|?NjꚚOo+˲`>@`  Dw0"@;p`  Dw0"@;p`  Dw0"@;p`  Dw0"@;p`  Dw0"@;p`  Dw0"@;p`  Dw0"@;p`  Dw0PląBf ˲:(FL`  Dw0"@;p`  Dw0"@TҝcQ&˺:92YcL Dw0"@;p`  Dw0"@Seq)EAdJsp u292I)7e"@;p`  Dw0"@;p` (dJ\kLV7p`  Dw0"@;p`  Dw0K[kw\GJJGԓU3=={;&O[ێh-Z;Qti-3)%[jxun~3eJaI=ѲCW^ڥhT{>U׮F9 L }RO#8eu _Zk)ٗJ)N_ԢVh7DiJҢ'Ţ<˖LlƢ.7*ѶARNRREJ,E)eC;r(:`*"˲?=."g ZMnҫ9FB#(wy"y-"e^STJRFK챢,h?)@0w߹/巶c=T"pֺxi._-Mdj2ӵ25VFB=CuO<=_L!4T'4Sn_#Gۮ!"^UBCU+H7/H7秚xIJdR@-q(m/|h+򥋟}GXt(q*>.xMjxQ0nFͅc+\a`%K$*tBw-j+yz'2It[}I}Ϯ29J !eɭc2S;o4wN_*΍4i N]vw߅$n\t~rw=Www"ir_j-{!}Y(+TjE+mo/\B/k$sOl'㤬 ,vˣUHD+ ș[]+w"(%b};`i/E;Vv#}X980˿˜/{/K^{0zr7ϰܷ`I.8,`Bܥl|)߬o(TJ^S:0KDe_]Ցez4*ώAySc` >T+}k\;GG)p̈e${]yT2ɒ,7;f PC5u,[0sKm:c=bY g3Sdg8dwJP22vZP*Pj;29 䬥=W|ߜoKcGw'}-~0סv79E2,ޘ&*لO^u7Wp{xMjx1k:!uP݉KK(tcKM_ѱb-SDHo>k[p1aoGR-GzHƧEik*S+xv9Wbx*Nc uedxOx":o$Sugg:!EC?xMI)8.*sn4 ?$n>2{IW&\Q)/$_W9(/#Je VJGbݛ4eoS{O6=ժ+񣻧=⇶dpnˡ@wL}e+ nLO_8lKNj!{r#+q)Tt{N ?$ @wE م+ev]Kjֲu;s[k]CA{gTZ'bāy@S\LM5@#( U/|kfK%bRtYk+Qs=B"⬣nCorg:bLGGk{SVHŽf/*"x{ΐ7렎X+E뭪=T}VljXǧ57T%e9цD;ս|BQԬK/&V}@Mekɑ3sl}o<݊לt,1dh>Cv_2s]vD#9싿yRn;zk+V=/*+Spe7{+Q|?O!G.kT;{޵EVźW,W&_sW~[dhw࡟;.t(-r{Ϲ.ZGO[ាN_#Qz?,r"o_yeYψ0 u_+c+R-3}?s7tA=^k{U2hā#?JR3v]GVu}@sGPJor DzaSRG>/\SS?ӼuD$tvC 5U{5_T+wh+q?Qg3YՍ=W|Lʿ _ w(D΂R#z#Z,9d_xYVPJ=ufIJ_}~sҖhŢ+-Λ3;ϻ~;xk%Ol{2BM,8'ղ|hޚoUi_(5eggv3)@cRW%g͝k*Cçr(Wu%j;Tutv׿OlҖJ_3/bY>P(߾Ziq{=tfSdS=PrD[$9{yq0%X^Mwy#R۹5 7\sr}ꟾq߻qotDP""i+ӟ=cOyM ׮nmUՋHu_PѓHe%A)mC59{E}e`=liM2wxdgq>޼{l}8UU/ZDK=R>&"V* A) UNZ*"#MI >.?pvUk}=h3T?EΞ9n5bsP#qZiVf"`;Y^Ζ|RGVMHSREHg6h @߲mgvkv}._ࡶ Sј̥#+xrbe~/D@w U+QTonC5s,ꕑHx&%V"Zϩ-kN HQ*9kU7+jEI.8+wD U*~Poch$b*cY=|[E9t";R^)H?H5E[wH:?* sGP6=RԑGSA9*Z2֡P({[͋i8>g2Dtۑi3Ms>m J7 {9 ֵ[9{ Pա9SR(o7%.tښjygzܿ54^~5WԾhp*7U^rn/UNjKKRYB/f?i{w%MZسlB~T6TN;v$*lx5۟NXiHw[^ 9, _L`LpّjvReRŏil񇩻Sn~kǭ7^cUn=|J+QUUMnu}ltG** 0L g@-С3T{; p7]{榆?O775xp,3) J gݠ/?ڋ֭>oYӛeE"D<=&{n908j**u[|]W&:5Oeمb8U^%*uPZ.ԥta<)WHUeJ Em ֜u\GOvߞMQńK}2Mpg(풿bĞ:lQPewnC_.-LRwoPE^ಽgRNScRfBۇ]8Yt3qh[SEt~мC e{X)~dgLQ˲ܾ]Qd͟+5L;Rچo<6;jw++cP+>;Ow7 l>W-K3P:mPEcXO3ҢRڙ2Sڏ"Z}ؑh˪yLZQΚL'k\eEG}>boNE:ܲ&w%_:/sqnɖJ%Z"Ԭ%s5keͶ_Ty?O"1wR͕>ի? "Rw% )sˤ^&W;3TRZx% /W];#xQw;34o8gR5۟rC7%uXY7xXМsvfG^?P/*,e4ʿKTVK Opb*8Q756|[VX[@.Xsu޾x"jho>޺+yX>C~JGO&N~ܔ)Z7]=w%PzCpأ0V 0K@:kYW[(4vvDbyY,ӥ%4jt+"CCC+;Ei^;_8o؉svcYV$^wʏښU+{XU*SU=A/uv~> [:wήIUFdc_3M}'X%+wcW-;[ڷ~ۻ22ov-b9KY5T/A-X杜o>gMuHCU$)yN@#,!jHUJ)wJR߼{8wHߺ'V&8J vfjΝtZv *YNP{Ҿ2NJ ;&dxl9 Dm꾘=rXۉ"RZD:8;"Cָ/dL(\9בV̷wёpx֌iE>t/Έ ՚D"."3ܴ;5xk{k&LSC5M\5Tcm ӛk2rCP1w= @wY*VJkQ]QE;sr*Z$~xs w:VcL%c;'ާzާ[w{p޾gR%G#EI2ȔM"r~C>Zn`~#4TVnXq7"k{GF`T,JADR׮j1i0"jsZf(=Riq{U{_V~{]ܥ UIwmރ-[}Dq[$"/د鮺~hQWv6HLGi^[ٿ:9H_{v&U u2o(M*$&G(=P"neΫ.ݰh//}w:F]뮚1YD;g{"}-"8JmCRb4^|lJ:V-е+Ux6~p=yH)4q4=ޯoZ{;{%u`=_\cC-{do_c}]$V"Z롡h&c9TR9[fۯcHk|ݽkWPpJ%Nk2Ceac K7}^JcӚ"=xeSFOת~ZdxilVWWzE;?pDCenAv%~e;YK֍Yqij.kYo1^] IDATwunvIJ%_)9kDbكfұc{&MuZZ>uW~"guǞ"#lد7*H%憇p/_½LUbnx r#,7%5c_~G3{ֱh}skɟ*ZPHWk5{2]Fe9Ɛ2u6H ~SRI@#gJߔT˲%ōV[u"_{%;=rGVWz?yinJ*3T4{8qC-K|RT(>qǍW\.6EǴR3D,*"e=өtĨKʰ)^ϿybgK~j5~J]}?皼}%wSRI@c2[Q([tn:Zb߿hp$}_WMٻ>~ 67[kce U)_}GĬ% UTn{𗡐?̲ }-V{?viqw,kkoK֯F˭;|뾟3iŝV J)[½|U`wݳ3T H>KB(ێywp9%Rӛg͘v/`M,w(|=#Cd9M-qyp/W½|U%(;"N)e r~pV4ogL;NwZG"榆"fK7oOܕ $V%憇p/_<^ȎPFяr՗mPD۾R3Ͽ/q_L ղUa0b%*TG<ޡ֏vCuU"xyOqegW7{V穕O pAo,VXPQWl;n\dH]ЉTj;~ ]ݹmO)բEʖ3& )pG L:a__ɻQ#m'߿h~CC]mic/?{V)*c,W,_RH&9:k4j7sJqlپs.۰aݚ-3EyL;v۲mvY8sNRµ%TtCu\뾖Ikk\&j$f.>cK*YtѦK7ZPZ؉W^k[;:;CLG*֝{A # ½}§Y 5TYw<Ѣ*xӚfNo=kFscCMu" iTwOo{GWkۉmrO|ruߙ\0(aB[ޮƙjKؽ/oJj(,˿"2-"@` Mg@Og⥛nhibP{iE${PW^+";&ArAmlj&>?N #{"y)PlCcr0&1M4F9R-Ս3aZrff2ζ2TGFA{Oc,G#ڦiX ?-g2Cu#N?5]exdD@O4sdMTǪcU5H<JȞEd[K;+;4cR) θ>Adw0"@;p`  Dw0"@;pU,E;aZ+V9K;#]&Wc`  Dw0"@;p`  Dw0"@Tҝcaܥ(?)yBw0"@;p`  Dw0"@;h,;.e(h%:.o0FA\0"@;p`  Dw0"@;p` (d2Y5Q&+/uSipPebKGD6G,IDATxV0R:(S蜜\f;M[e4~ДF ԑ^Hbn}s$$;ޅdΖ ͅ!k32%{ "ؤ s}d:j| Uz.g5J.D3 +@&d&w d*?$JM2yd7Xx@$ rӀ\M Dref^:E@r0)Pٳɍ) '6E6  mB>Lڇb1?D ~gobA dBUUuT( U6&I)˧( C& ]hBr+>CC۠fݨd@ڂ$#a;MT܏ӹ+Vr&BsIn/,5MbK։|d_*sV2n>esH~  !&JJ&t&-ug 1 5 J%  !pȚrddtKk'B !eBTrBll씩Ö)]aw[)k+_ nJjN) Ou@^ 8|pƊ} N%ߢp'ϵ'\+c{@4 _>%HWf\.|+{ʡ6Eʍi;qGv9զ( A /H{Q@K!sq Gl| 㶎9 4 lĞ?@ʏzՄ rx[ Dg@B/K?'5CBgOY _R/"ؒ׌w- ͺx T0 eޣ@r=%L}4Cq KW@4bGC } @ΚSlq jeYWM][_Q2j-OQ?Y*J9J=NZ_OņOQ#ʷ3AU(B}2JVKDYJ2hQ 9 f/g&tcdu o~|1:M8Ce8[)Awl56663 !2Җ2Vs9Zc^뤤[G0'ӃJK@:8fnDz+yB6w,jR3pr/8pH@]|+8D֎Di(@* =߆/*\)?>dOWusD &N\^{@͊KcIq&6+ii0!i~;#X#шIt@4ȪՁ̖JĺoUb8 wŵAPg|e/^HW~N]:=ûCҎmJ ׯͯz@ ׅPIXRZv)w׭VW Qk" yˏOmHAtsrOShrA[S?i=:բ>~FЬjI22 #̱lH.yKז1J`=tb+bŽT5/2o9G~%ylfdy$Gmy8dH=Gήh H1 Ay\斀B;ޱw  #f{6t6*~bSYmqJr 5BuY+***.,O3MUR+ H"Iׂ˟ r2m= #6%G~h_ |-T > fh8Ym IZH;mҷ2AUi7_uj6i[&c0ްDA2huIb;a#UAZIK)@G,:F=MH\3.Xҹ6g$Rƾ; \zG1N'/.Nq߫;4ʗ#T)9,V'2 fZOT+Vwݤk|KJO }Px fƭwrszty|VK>%Yb5<@C1}wx1x;hR܆ejX4Lyp]I[w`Nc\J#DX{Ҳ 4N`C/j{/5d$UoӜ'EN=ك3-RR{ %k6> l[5 !Iw{sWi7@ ɇ !HZk 01"J Ξa;8Ml7k(@J}Q/ {-p,L$mpq|0M!Ͳ|+~!rR#"M Nr"Y./1@γ1|:(nJړ!:^yeT9W/"G4B5Bxk{ml1Pԇnw34fB g cNlWܧhM 2+N=/# `AYqF% )"Z';|,y1]en6>8yK㎙cÚ]S)`dYψpϺGx@ B9c[@ҏ?LO?7LvSgZkNNG񎋑FRaN%V~Q[- z ظ A7,gf l33 TqT-d~}lO98)mdlYZ(ߢmsf̘1n.RcF^gͯ(.P?l3)"}U:M4?G%6Zji?pn #Vp f 縩#F(X@YzMEA@ɀ-n9/Y2=?'+H9wՇ9Uuyw{}eb8% iup@4"&fT\>STiMz7܆o.BtGLӔnU8ˮ=j(Tj}r]Z /5'B "}@rD -U>gJ]@U9d@rQr1ij;;y\*2|VV)|o~3T^hIő7{\-^/<~34dGprL2~-+cKQ"ʔF! Ae:boAոD $uyM.*N[HS1 QbG+\(p׃OxApCS_+tB6X2'AHp0`F< 1OG+O4G)DH? L,N.ZP'-E:bb*yN=n@4@ArrY&CVOG0m;#e9 DW,dB2 M  aCRj`K#ʆe @iI!`jƸXh*eYH" KV,7E0)0$"f~9}o]5޼w_9Rolo o o o oyLb1+WM˵νZ|t{ ydw_xᯰqm{]ݝ[&5g2<Vl 1Ӓ 6kWCtRfC}2o M`/L,0 2o K/%G~{Hi|Id, 4Sћcdݺ-sk׾{/}XSBc Q}ܸ:SEm2H_߄ߴQHqT7FsrT 8]`g*B3=NԈXQ^/5ajcfZ7\LK`yaq1PH4~HC*bnb-q&t"M+R3I&c5 8a6tv_ȴ<<2e^HDgv q Җ-2(vJA~`xH)Zv>jA &Ċ3ɚ5"#`Ѣ?ϐA09]w1d^}سPI&AU?hK!gDS @pF l`Ϟ1cbu1c7̈́24HVgAB#F s&cx1$bꠉ~z6$)0. 0fE4 VlD ݻ& 53 Y6  f3YIu6XNsf\q  َ%cy60HgȤJ3z" gҥ*6-@ f/ITn-f(^Kq_+i|ٷm jE1Hw(̗ ك"zΥbF/MB?Pk$`mhh@DZܲF=,ܮ@\y{$jF}7uO>D$9eV7i0H1Jf<f݋ Ecv۶w,0J6J& "5QOsygy~{_94ޟq48̞rIxsBE`lѠQ 7=}A“Ol'؀^v%n:Ձ}~ꚘAG=8x\Ym,믿[F?:ݬYobCAK\[B$ߙ<8PA<47 хp29Wji忩AK: - 8`4K/b 9ysr1뛫_ϭ_ p'Ym1iFL}oѮkn4>G|wsM3gG^h9,ds h[6]~*]_afbX"6 tНC7)h|!D"&إIpN-` )m΅gHknGbUfALYʓrYݽ峈9{`l" -a(rQ!H-5vjztpiRp=gX&5FZoD#tX!̡e[rC4ӊc#kP'Os08xXw*!}0o^z~?۶BC”) %;*C>KKަAV?F~@Mm#<ҥi7Nf΁V@Lcpsl~}};ׇ Y7dd*= ' _z׮7`ժ ʐx{M˯!ܽۘOYSO=PڹsvۣoV~2d[Qǭ'Y\5}SKGěvz` 2MaI<NކY}?wPsI7s~d&4`NF"&@ _G]l$e$=Y\u7ӥ_󖙙ؐks#] 0;Ŭ~ #~&V4X^ b7uݶĴYƯ@T&4,E m+"!gƴ292& ]*,B hгS%?0[ڻw?k<>͹Ǚ" lUt`rM WB[o+Luzzͭ$PT):Pٚt|Peuu ^vyœ9SY$_>c+&#3s?~yĬn"(:hCF޿e tC_߉ߊT u q>G+4U9䶳fuÒ% /v 4>ӝm6mOpg9`W:΃ d>c253woy^2I "՚;G)*CW)jFi`YA:g G3Z'~kVv){YFk"ӫpl7}_ƨU>wY1f?ٮkq1 iWdm(+|!aʕv5T6O כMr$ۭ[nUx?,P}߽afI ݝPW{܋/tf21.{5ӭ̂Q~_N(ַ=uGM2NwgT6ag>;|LpAgg1V ZCF#[VU~]E2ݷg3Pm0aB@h\KX&5[ -& ,e?4k 9Al:P]\8_D0?s}` Y7 &ZR? q,6~tjЁ&U+Y"Ōv*.wܢzfV%bd/PY70e}ҝ4L`w,fsǩzU 8Ș8WS, '(>TEJȗkxCdB ίJ,5| ~sz6mz}vf"]/9vEW{^12Vw?Yؔsm {jw޹ʊ6:*ap='LX  Ci榛n/_Ǟ{@ RU̢MsʊGgg“OTx`p=";2`I^,hAS>&[s6@[WYVG}<lw"byM ;$AqWݽj@莉X\W:tt,a?"Έuq-Jf Gۼqylk;x>&Z~luS; pM1\v<,AY&Alafj~6ϯMyQUT%?3 p [UDA0pl5+u¿0=Z'K$25ԥ2e4腶  txbc\L0$hh`Bؽ{1a+۶J YL+wyڸU%8C*E 凜p˵I˪f?s]g~rի ]۽{!|P/|oXƢ]Obq>E v+(*Jtt qj6ڴr40=%_͞}"ZYqdCg4zеrA 7@_rX)TRqR5DBET"y4QXV,h E5` yb?p+4@ׯ&xt6P$3{&DW ?jnA=(t5Pܵj o2 2M f\fzR b:ڛr$.`D ާbd b&Zُ!+gg| .؂yX#됨=XP?^7 `ǀ=hl݇ 6Q{T>W;?>kd3L6 X!8>3~7ag=Kp[ePk4zSE*/|5Gz$[n6P x/t@.ebd"qC+X Ҡ%  y}INJ$neqI\:q}qm31HX'rJ $YsMkxRkD"= \P(  1Hưti7<9JwIuTjq멇S7z5j'kddT{Πr]={IO6w?|% }Qy32`K M~ 6?]SsH|}}2>ny zO^yeq/@MH~; jf D3aa">M~wضmg ;ႝW$z U<NHPixxd$0%2BVL+UzHhLI5I꺴$_nQ)-U\P~P̀s0̬2K_8+sDbO EOv\inyf2CK5 h P%pU*YPI>wtpGxGx,>B7 ֣*GwD%IlE1*AkjeCA&Ā Ҙ 1هKjCźKS6ЛX 7T$)˻ v}v`| 7  lI$tD믿 'I=ه.knj}啿:z j̙Di4q&Fo qJҨ~xbڤi.3,{^OC6$~PW xeD1wtwwV f>)J bGɀD1w 7._j8[wW)×F׶Νq`jWo߻%Ͳ3&m};ڵ/UP ZI=kٙ mrd'6{25^;l;Xf $pr# ,rHF&QQhy q7`fA w)#-J( g40@ᎦjaXt{ruJ( _D L #14kxq Nj3A0 P>P5$nb ɢ Xq0uZ9_T0DL- !7{9twwA0Ћa M&MIjErJ+1H³F`͚DT̒3 K+|Ry;x>"U/upTXpy_N5=|)y=/>XQD "H\r$w:眙*G]TܵkkQ墛ej:*k=bz'6e^8EsUK <@(:PYcQAB <@l$1+T,6ilaxT35$i$Ub g6HE&+(Ffj]4:D"SV)KCi3qbtv"Gȑ&ҸqL С A^J8xv?Բh~8aB |k[o o o VrߪuIENDB`simple-qrcode/docs/imgs/inverse_diagonal.png000064400000016410152427536730015236 0ustar00PNG  IHDRXgAMA a cHRMz&u0`:pQ<bKGDIDATx{pՕI$1yVqXZζ UA V@Dm*([CwDA@Gi-ȶ2Z) >C<I KHB~ι{3Ð}}{ c x*)_^x@xxŋċ//^< ^x@xEN U0ycv ҞY?=}w>8Ǝo|Οg &\S^s7ay}jջoX>tmʕ߂}fN<ȲO{9iӥ^~!W |~yuW/Kr`ߥL$)0!$mt IhGzr<"fw ahHO3 &%=\wyL_y^hn:dxy5 sY@dR$,kޓ<rw?/|ٹs/+hPQ}tO\˭vnx~WJQŋCCH(8x;$G+;3\}8/ْ𑹦7η_KMzr]ک4>h@y ZԼBT~Ő@!+03HUU3 8 VK'b@?zT^$t/I>$ZK0T3ۀ$*]{M=HXUd7غrKwsN["T/ Bˀ MgΗ Akӿ Y3+W΄2dVf:P!+R3ʵ8Q*x̘pM4"W'mm#orډߎ2j벲BX١4 a8460fu}Wֺ]".vfN7a ;w455s;QߦVTA5/:s]+Ҝ;;E%7?:vn1dۤ 6bꍨ9HSAmQ&^KۮBӕY  v,¦!8RA}?nHX̐-bQk"7$ =XccVh0CtuHl:ʘz!(\;Zv$mZUql62_6ovÔ˘EHN$;v-[SPEE,Zt]ƳlF|J4Wx{9Ou]$ ~U *@Gm3 t|X?0ҿ_!Fp8)癈9Y@qw{v:2vK\*~ݙ$$BӕMϝDpd Q ǖŪڸG#H!IOInX a@tew&XQ& NGÇ ԣ -$ؽR6v Y=ȔE݆7H(Q‘Ĩ&-sĔ*1[3o8d7w{}Vߧʊ&I k5;L0D6 L$$ڡ/O=u? f:шtPmLIQW 7!uy&^q=wO0PX1jՎg"731&tr-VODG'$tHj˸$|B9Td%VLw]$j1D5I$ z>q{&10`ޑ ,7 ӯ^Isi67HTC̚("veҍСp 8W|hi9']m\8$ӧoLlJ7i'ꌂw,ع{Я_oϚ(Kiچ"B\](ět_TiNWԐ45ށm6tED5IHpRzd2o'H .$6d a$д xH4 !3 32v2uHhH/'Hw`#8 U}ZQMhBHH@`{HWa Ru]LO˨yzZ[O}>kajͪ_رヰd/fDx:4:o.ɓ n.<{346~mK{s>,3e/9Z_X*h0 MJIp׽WCxH< !I?$P)!Ib #jgtlr9[|ɓmq3Ksh _.=ɮnڵSA}XǍƽv_ #~E/oM^ oΜo ӭ=ۡί8q5m/I Yn>رe_Od9r7/G7?RN7;Og\UwXCBs,Tt!|OEx2u\?Q)wdQMcҵJG-V|QՃټ qG:$xh;Br Sɓ)Hh1i0ǐi* HG$AbU VzH8 ɽr8c`ZTK$npciH,F5Kvbr L~1$@ .G ";Hss+n׿~.pXd~;;:r[ZSw~yoyyd]?|ɇMbEhm=3f<%LT y~ ϛfPQBGQ^!2$j9{As1йNx}e"[`U@aLmt. gx-ڤSlJf-h{"^T B@L&ԌᐸRM$ ܌B8u:f 0 )8̫i"8ƩN'rMA1ٱLC".A̪h,آRv-n{`M$̖+)PP!U#fw`jH?)OCJ9)8Ās-U^ ĉu0|n#TUtÏaƌe\S!b~͜Kν&Ħ(u0{S\#ڔ)cORc  5kb 2 |ny6nDĀLr*c p}Ruu]Dި}cQo!t\3&2?R t5aˆȴk!ɯ R WV - +ٽc`Rn鍟rJѺ"@|nt,B׈f*)0캧'у/f@Ž^f؟IEHиVSAw೼IJWl{^f!a@"S}>f!IHj2Ğ1Q,kwRH*`YU \&~jY[6p#o8yaF-><Ժqe2DY|A6m7Yߋ/>.̏ާOot7ntcbt=tEdԔgpYPRPY3;(گz^nRSS}~ ,ARSS}}d&`uV$H)6L8rt.H%+nwC@0D 1\0xHCxH< Q% a r >$);>$Ƀ mt*/ (Hyo!8|ov *o~n{Ս,Ϻu¶mYE󰲪ӻ2Y1.$ HkK_Q+pm!9uiяRwutW(U]?ϛw=L4.=[6ڵ[*U=OZu vNd^/~ vj?^y>+3sKqa=8ĢM[r1lזH1F5\B֑Q#ۂN7ɀD\fC2Sc iZ(l~c<6$#$t!a8cq;ilYs`` q*I Cӹ9{0ڽ E7]988:R8)OB{{G_X˾hAs3['awUQ[9:]ee?UWW( 0LZ'bt߂7[ӤI( sL,4gd%.$f]ML6 \gڳ{&)bHKB\QMarb3g< wp 2g ;% ㄀8g.V,$v:q$z= 9eہDY[ -"C yi{@<FG4*F9;w:hhíen@ gC\RbF~*m NС5Ne,xQ0mNoW>0l7ֈ$jeա\iqE! 'tq,BP*̪SqC6cWɁ$e!h$Cbsy~tKq\l{L|IDHdjk>mLCĻwp40$.qH1I^CPT8UrJWQQvK_'F{ؾ}]up۪00! ߬A@d- 1itt0` ;oɓ92-[ކ~E?aR)~usRit-sS܄#az*E_Ql0*+{Sbg~&^0f%1q4S%7j)rwjFu0Nw&򬘌1~H4$HPts6~&hPdF|$N3 aJ=R`Wnb$ZMCB ~g ;̨6 =\Hh ,G7 L&c&5k.dN8= a戴Av>j_jC;Va!h֯NYA:MކUz QZ]2ufϾnu*j$v)rD%FUo!6f-HdF8.m9y)gy]u;O(4K~߰v͊IIh7Lf $(5o e}y{pgsU\U|YExs͛D :YZZAsskVtTrƘ-EEP[[Sө'gɬn )_}pȫ ~.IC"'dРjXz:5o#tEQ ^n(7tq/1y]ĤffOuɓ@<+ vIU%Q;B֮`y<㱫z$#$.^lt7J~W킔\k@ؙ9]1ظ2 Zb{ #qK4xp?J߾eзom@tw_:];Gss ̘q?7Os+LzW2wtFEp ]w{JK#gsW WcQsɴrtŀ6|\u8t;v|4q;=v}&.~@#j[2a\?$qÚF5t&\wJƆՎgӕ(hzL=3tK<}&lAbVGtQLb+\r]Ot/$QMme!Zvʄ9} -2$$t{3Lq<|lVR-/彡8:0ٱcv (++'2\qS)(|q&`Op9rLzqr3/=IR xxŋċ/GPzrbQIENDB`simple-qrcode/docs/imgs/eye-1.png000064400000002607152427536730012650 0ustar00PNG  IHDR^gAMA a cHRMz&u0`:pQ<PLTEtttݾ2;;;***yyyTa2󐐐cccʺܠQQQ>>>///uuuSSSߚiii<bKGDH6IDATxY[@`VP*.6 Xj7_ 3'̒Ġw9̒ j G!Īfo?$*$Ms8]R-֧j^d@g9Tҵٟ!Ac^ (O@yƐ r&A/ļQ heB&*ClK@@\!-jr3prj`ǖ(Cq  H3!;");Rx@d =X@:EEanPĥ-y@`RE7!Q3$3D9xbT2 eA6J03}< m1tnjEH>xItTܳ*fI(M:QMƬS8|Z, ye^Ym9@yosJ.Hzg|$3۴f>,bΐ-C@r35a †;  U![/1idB"/-t #A*?'9 DIENDB`simple-qrcode/docs/imgs/horizontal.png000064400000007267152427536730014130 0ustar00PNG  IHDRXgAMA a cHRMz&u0`:pQ<bKGD0IDATx{lTUǿ9}Rځt6jB!uAL@@RB[TDaTXfj!FE"6UyE(H[:v:Gvsϝ{r;$Mz=<~~9g~#v;!. @@@@@@@@@!! YYY$Ht{Gٸ2_ii1ƍWq'MZؖ "//G6}jQY_M\rjkOlmwύ\-/?AW,B(B(B tswhllq:+'I4î]}_͂W<̙Tu{vl>aa&Mʩ7tfŊIOO7fbK967 Z9!tB(B(B(B(B _Պ޿ܔ&׾ri7o^PS@udqqЖw`q>CG ˗DU(^x~HKN>?wy~L-LSX_/++S;פ-}V8!!!!!$,촡FCP 8LjU]Gs+CP `fQ 1}4Z]fp BBBBBBH@i^/3Zo^c=S%aA8 DjjTU}h >^u'֮MVލUރ b8$АBBBBBBd4oP[{%+lZn ;v}vQd ƶmy@BCC: L`A BBB=blͺR` $?&)7;L)5 (*z]-#Fd8msVȶ}Vu̙O8%66Ru͚#Z= [- LG!&{TUmBz Yhll2[!-͂_gS˩~Ex'1xG1thO˨E P P   ؟_xP ҥfMqR[v}"(HBBBd wa8 Ѫ+7 ÆQ$$$ĩ.oc֬ rYN;C0?Cg<|;v|y6@P7m($%))Zt,Y(L&?/3gS HLǸqRV^:/;>q+-{d{O&{ml     c]އ>r6HEZ4ӧ2Νc6oݺR1MÔȅ7/74T~뭙7tm mD%ɽ~80ee74(YxMjo׵)JRR.mJHDp￙&{xI0 cB8H'!!!!$mw'pkÌOCn 9\dŋ UUӑX+ C}$De~]a~wݕŋ XkȍwYQNУxի-;]nGSSۂ(ˑ-g߾ZTVWOss+l'HXn0UpE|6,۷kip_A@@@@huˮ" $7w,rrXڭ}N~z$i0kĉ0@?iMAMY/zNH3<o5L] sKƎ1!BBBBx<{a3oeZjx,I22,<89`P_B[gd#))?tRxE܂>+--6@F-Owq{n:LyO}Wڵ/`ٲo D˖=!XgȐxȊ6A BBBB;1%%E5zn„{0iR|Ç˓;nȷ1++ vށF?`[ У]]v]t82O6=_eu)Niw)<^ym[T ͦbV^|iۢ%9    ?Buvw{6jW<$ !!A u)d ,ǩSԡCB$99#]ݸq/6nM/yˠv)-ӲӱdluuQZzX~UUS8 DV|Bx~_cB(B(B(BBB 8%Oǵk=Ypf9M֔% P P P P b fdff9 nuE4z{Q]P>AAuuSS5x,bKGDHIDATxr0`p\ wK qzoڦΤZe%ٲMH2LfdtAtC9bcb("$=' _zAW rɐ /ㆌشcR6]$dZ,@.r33+nLMT^NBDM]@B=&C0f{Al8@␵B -J!y2+b^ @ m]Y$F^4 2_ /HYlW]a܊C5a{v@@ z!UtjXꆥ r9W@)%e!,1=9V+\껑Xmuc|dl"Q@'qbBl~>F.3DypȾi9dS] H 3' MmttBf<+;?WbF^=fͶ7!Elq | [@ؠ!C'ϓZr+JmnM玟r:;̂;b:aӚD)E¨ v/TqY h Ͳ+IBa!L8eDS6n!6X~_i[{#F6Xs-U)y[J}qՖ! CYtPI{D8KǸ! A*E^ڨif@ѤQ4s;4ʡm 6a@WwbF]Z@ViE;'iWx 7^WyKL7+ͯS>7<;E:5i~{l3H:Mr߆1Pi@6LV8MQ-VkUa!kc8ִX.HⲾ7x1E  x@e= oWWWFɨşiiz{׸Hi$r u6e/i'$?,Р>  $$o3%hE ܨwMH>ȈoYz+``QnE#Ԙy+ +m"IJ|,Ltj#]!(X0G.2sU9Iϧ/<9ՉКPNhXNϰL'F>.lp}GW<;6)Xɟ[Z.qw _ƉȽGg w5"]q |[(n*z.M>1@:;S>s dGVo(in p5 _f #ٝ ## Introduction Simple QrCode est un adaptateur facile d'utilisation pour le framework Laravel et qui s'appuie sur le magnifique travail fourni par [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Nous avons conçu une interface intuitive, facile d'installation et familière aux utilisateurs de Laravel. ## Traductions Nous recherchons des utilisateurs parlant arabe, espagnol, français, coréen ou japonnais pour nous aider à traduire cette documentation. Si vous vous en sentez capable, créez une pull request ! ## Configuration #### Composer Commencez par ajouter le paquet QrCode à la section `require` de votre fichier `composer.json`: "require": { "simplesoftwareio/simple-qrcode": "~2" } Lancez ensuite la commande `composer update`. #### Service Provider ###### Laravel <= 5.4 Ajouter l'entrée `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` au tableau `providers` du fichier de configuration `config/app.php`. #### Alias ###### Laravel <= 5.4 Enfin, ajoutez l'entrée `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` au tableau `aliases` du fichier de configuration `config/app.php`. ## Utilisations Simples #### Print View L'un des pricipaux usages que nous faisons de ce paquet et d'avoir des QrCodes dans toutes nos vues d'impression. Cela donne la possibilité à nos clients qui le flashent de revenir à la page d'origine du document après que celui-ci a été imprimé. Nous obtenons cette fonctionnalité en ajoutant le code suivant au fichier footer.blade.php.
{!! QrCode::size(100)->generate(Request::url()); !!}

Flashez-moi pour revenir à la page d'origine.

#### Embarquer Un QrCode Vous pouvez embarquer un qrcode dans un courriel pour permettre à vos utilisateurs de le flasher. Voici un exemple pour mettre ceci en œuvre dans Laravel : // Dans un template blade. ## Usage #### Usage De Base L'utilisation du Générateur de QrCode est très simple. La syntaxe minimale est : QrCode::generate('Transformez-moi en QrCode !'); Cela créera un QrCode qui dit "Transformez-moi en QrCode !" #### Generate `Generate` sert à fabriquer un QrCode. QrCode::generate('Transformez-moi en QrCode !'); >Attention! Cette méthode doit être appelée en dernier si vous l'utilisez dans un appel chaîné. Par défaut, `Generate` retournera le contenu d'une image SVG sous forme de chaîne. Vous pouvez afficher cette image directement avec un navigateur moderne dans un template Blade de Laravel de cette façon : {!! QrCode::generate('Transformez-moi en QrCode !'); !!} La méthode `generate` accepte un second paramètre pour définir un nom de fichier où enregistrer le QrCode. QrCode::generate('Transformez-moi en QrCode !', '../public/qrcodes/qrcode.svg'); #### Changement De Format >Le générateur de QrCode est prévu pour retourner une image SVG par défaut. >Attention! La méthode `format` doit être appelée avant toute autre option de formatage, telles que `size`, `color`, `backgroundColor` et `margin`. Trois formats sont actuellement supportés : PNG, EPS et SVG. Pour changer de format, utilisez le code suivant : QrCode::format('png'); // retourne une image PNG QrCode::format('eps'); // retourne une image EPS QrCode::format('svg'); // retourne une image SVG #### Changement De Taille >Le générateur de QrCode retournera par défaut le QrCode dans la plus petite taille possible en pixels. Vous pouvez changer la taille du QrCode par la méthode `size` qui prend comme paramètre la taille désirée en pixels : QrCode::size(100); #### Changement De Couleur >Changez les couleurs de vos QrCode avec précaution car certains lecteurs rencontrent des difficultés avec les QrCodes en couleur. Toutes les couleurs doivent être exprimées en RGB (rouge, vert, bleu). Vous pouvez changer la couleur de trait du QrCode par la méthode `color` : QrCode::color(255,0,255); La couleur de fond peut être définie de la même façon par la méthode `backgroundColor` : QrCode::backgroundColor(255,255,0); #### Changement Des Marges Vous pouvez définir une marge autour du QrCode par la méthode `margin` : QrCode::margin(100); #### Correction D'Erreur Il est très aisé de changer le niveau de correction d'erreur. Utilisez la syntaxe suivante : QrCode::errorCorrection('H'); Voici la liste des options supportées pour la méthode `errorCorrection`. | Correction d'Erreur | Capacité De Correction | | --- | --- | | L | 7% de redondance. | | M | 15% de redondance. | | Q | 25% de redondance. | | H | 30% de redondance. | >L'élévation du niveau de correction d'erreur se fait au détriment de la taille du QrCode et de la quantité de données qu'il peut stocker. Pour en savoir plus, consultez [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction) (en anglais). #### Encodage La norme de codage par défaut des caractères contenus dans le QrCode est l'`ISO-8859-1`. Pour en savoir plus sur le codage, voyez [codage des caractères](http://fr.wikipedia.org/wiki/Codage_des_caractères). Vous pouvez changer le codage par le code suivant : QrCode::encoding('UTF-8')->generate('Transformez-moi en QrCode avec des symboles ♠♥!!'); | Codage Des Caractères | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >Une erreur du type `Could not encode content to ISO-8859-1` signifie qu'un mauvais codage est utilisé. Nous recommendons `UTF-8` si vous n'êtes pas sûr. #### Merge La méthode `merge` fusionne une image sur un QrCode. C'est une pratique courante pour placer un logo dans un QrCode. QrCode::merge($nom_de_fichier, $pourcentage, $absolu); // Génère un QrCode avec une image centrée. QrCode::format('png')->merge('chemin-vers-l-image.png')->generate(); // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. QrCode::format('png')->merge('chemin-vers-l-image.png', .3)->generate(); // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >La méthode `merge` ne supporte que les images PNG. >Le chemin vers l'image est relatif au chemin de base de l'application si $absolu est à `false`. Changez cette variable à `true` pour utiliser des chemins absolus. > Vous devriez utiliser un haut niveau de correction d'erreur avec la méthode `merge` pour assurer la bonne lecture du QrCode. Nous recommandons l'utilisation de `errorCorrection('H')`. ![Fusion de Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Fusion De Chaîne Binaire La méthode `mergeString` est semblable à la méthode `merge` si ce n'est qu'elle prend comme paramètre le contenu du fichier sous forme de chaîne au lieu du nom du fichier. C'est particulièrement utile lorsque vous travaillez avec une façade `Storage`. L'interface de `mergeString` est très similaire à celle de `merge`. QrCode::mergeString(Storage::get('chemin/vers/image.png'), $percentage); // Génère un QrCode avec une image centrée. QrCode::format('png')->mergeString(Storage::get('chemin/vers/image.png'))->generate(); // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. QrCode::format('png')->mergeString(Storage::get('chemin/vers/image.png'), .3)->generate(); >A l'instar de la méthode `merge`, seul le format d'image PNG est supporté. Les même recommandations relatives à la correction d'erreur s'appliquent. #### Utilisation Avancée Toutes les méthodes supportent le chaînage. La méthode `generate` doit être appelée en dernier et toute modification du `format` en premier. Vous pourriez par exemple écrire : QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Transformez-moi en QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Transformez-moi en QrCode!'); Vous pouvez afficher une image PNG sans enregistrer de fichier en spécifiant une chaîne brute encodée avec `base64_encode`. ## Helpers #### Que sont les helpers? Les helpers facilitent la création de QrCodes qui déclenchent une action du lecteur lorsqu'ils sont flashés. #### E-Mail Cet helper génère un QrCode pour l'envoi de courriel dont les destinataire, sujet et contenu peuvent être prédéfinis. QrCode::email($destinataire, $sujet, $contenu); // Renseigne l'adresse du destinataire QrCode::email('foo@bar.com'); // Renseigne le destinataire, le sujet et le contenu du courriel QrCode::email('foo@bar.com', 'Ceci est le sujet.', 'Ceci est le contenu.'); // Ne renseigne que le sujet et le contenu du courriel QrCode::email(null, 'Ceci est le sujet.', 'Ceci est le contenu.'); #### Geo Cet helper génère un QrCode avec des coordonnées géographiques (latitude et longitude) qui pourront être ouvertes par une application Google Maps ou similaire. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### Numéro de Téléphone Cet helper génère un QrCode qui lorsqu'il est flashé compose un numéro de téléphone. QrCode::phoneNumber($numeroDeTelephone); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS (Messages Texte) Cet helper génère un QrCode d'envoi de SMS dont le destinataire et le message peuvent être prédéfinis. QrCode::SMS($numeroDeTelephone, $message); // Crée un SMS pour un numéro de téléphone QrCode::SMS('555-555-5555'); // Crée un SMS pour un numéro de téléphone avec un message QrCode::SMS('555-555-5555', 'Corps du message'); #### WiFi Cet helper génère un QrCode qui permet la connexion à un réseau WiFi. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID du réseau', 'password' => 'Mot de passe de connexion', 'hidden' => 'Indique si le SSID du réseau est masqué ou non.' ]); // Connexion à un réseau WiFi ouvert QrCode::wiFi([ 'ssid' => 'Nom du réseau', ]); // Connexion à un réseau WiFi ouvert et masqué QrCode::wiFi([ 'ssid' => 'Nom du réseau', 'hidden' => 'true' ]); // Connexion à un réseau WiFi sécurisé QrCode::wiFi([ 'ssid' => 'Nom du réseau', 'encryption' => 'WPA', 'password' => 'Mot de passe' ]); >La recherche de réseaux WiFi n'est actuellement pas supportée par les produis Apple. ## Usage Courant des QrCodes Vous pouvez utiliser un des pseudos-protocoles du tableau suivant comme paramètre de la méthode `generate` pour créer un QrCode contenant des informations avancées : QrCode::generate('http://www.simplesoftware.io'); | Usage | Protocole | Exemple | | --- | --- | --- | | URL de site internet | http:// | http://www.simplesoftware.io | | URL de site internet sécurisé | https:// | https://www.simplesoftware.io | | Adresse de courriel | mailto: | mailto:support@simplesoftware.io | | Numéro de téléphone | tel: | tel:555-555-5555 | | SMS | sms: | sms:555-555-5555 | | SMS avec message pré-défini | sms: | sms::I am a pretyped message | | SMS avec message et numéro de téléphone pré-définis | sms: | sms:555-555-5555:I am a pretyped message | | Coordonnées géographiques | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [Voir les exemples](https://fr.wikipedia.org/wiki/Code_QR#Correction_d.27erreur) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ##Usage Hors De Laravel Vous pouvez utiliser ce paquet en dehors de Laravel en instanciant un objet de classe `BaconQrCodeGenerator`. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Créer un qrcode sans Laravel!'); simple-qrcode/docs/de/README.md000064400000046515152427536730012140 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) #### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) - [Einführung](#docs-introduction) - [Upgrade-Anleitung](#docs-upgrade) - [Installation](#docs-configuration) - [Einfache Anwendungsideen](#docs-ideas) - [Nutzungsbeispiele](#docs-usage) - [Helfer](#docs-helpers) - [Häufig verwendete QrCodes](#docs-common-usage) - [Verwendung außerhalb von Laravel](#docs-outside-laravel) ## Einführung Simple QrCode stellt eine komfortable Schnittstelle zum Generieren von QrCodes für das beliebte Laravel Framework dar und basiert auf der großartigen Arbeit von [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Das Paket ist einfach zu installieren und bietet ein Laravel-Nutzern vertrautes Nutzererlebnis. ![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) ## Upgrade-Anleitung Um von v2 auf v3 zu aktualisieren, muss die Versionsangabe der `simplesoftwareio/simple-qrcode` Abhängigkeit in der `composer.json` Datei auf `~4` geändert werden: "require": { "simplesoftwareio/simple-qrcode": "~4" } Ein abschließender Aufruf von `composer update simplesoftwareio/simple-qrcode` aktualisiert das installierte Paket. >Um das `png` Bildformat zu verwenden, **muss zwingend** die `imagick` PHP Extension installiert werden. #### v4 Es gab einen Fehler im Bereich der Laravel Facades von v3, der einige Probleme beim Laden verursachte. Da die Problembehebung eine nicht abwärtskompatible Änderung nötig gemacht hat, wurde v4 veröffentlicht. Bei einem Upgrade von v2 muss kein Code angepasst werden; die nachfolgende Änderung betrifft nur Nutzer der v3. Sämtliche Verweise auf die `QrCode` Facade müssen wie folgt geändert werden: ``` use SimpleSoftwareIO\QrCode\Facades\QrCode; ``` ## Installation #### Composer Das Paket kann durch Ausführung von `composer require simplesoftwareio/simple-qrcode "~4"` installiert werden. Laravel wird das Paket automatisch integrieren. ## Einfache Anwendungsideen #### Druckansicht Wir verwenden das Package hauptsächlich dazu, QrCodes auf all unseren Druckansichten zu platzieren. So können unsere Kunden durch einfaches Scannen des QrCodes auf der ausgedruckten Seite zur Ursprungsseite zurückfinden. Erreicht haben wir das durch ein Hinzufügen der folgenden Zeilen in unserer footer.blade.php Datei:
{!! QrCode::size(100)->generate(Request::url()); !!}

Scan mich, um zur Original-Seite zurückzukehren.

#### Einbetten eines QrCodes Ein QrCode kann in eine E-Mail eingebettet werden, um den Nutzern ein schnelles Scannen zu ermöglichen. Das folgende Beispiel zeigt, wie man dies mit Laravel umsetzt: // Innerhalb eines Blade Templates. ## Nutzungsbeispiele #### Grundfunktionen ``` // Alle Beispiele gehen davon aus, dass die QrCode Facade über die untenstehende Code-Zeile eingebunden wird. Für Laravel Benutzer wird die Facade automatisch geladen. use SimpleSoftwareIO\QrCode\Facades\QrCode; ``` Die Verwendung des QrCode Generators ist sehr einfach. Die einfachste Art der Nutzung ist: use SimpleSoftwareIO\QrCode\Facades\QrCode; QrCode::generate('Wandel mich in einen QrCode!'); Dies wird einen QrCode mit dem Inhalt "Wandel mich in einen QrCode!" generieren. #### Generate `(string $data, string $filename = null)` `Generate` wird genutzt, um den QrCode zu generieren. QrCode::generate('Wandel mich in einen QrCode!'); Standardmäßig liefert `generate` einen String mit SVG Daten zurück. Über Laravels Blade Template System kann dieser direkt in modernen Browsern angezeigt werden: {!! QrCode::generate('Wandel mich in einen QrCode!'); !!} Die `generate` Methode akzeptiert als zweiten Parameter einen Dateipfad zum Speichern des QrCodes in einer Zieldatei: QrCode::generate('Wandel mich in einen QrCode!', '../public/qrcodes/qrcode.svg'); #### Format `(string $format)` Es werden derzeit drei Bildformate unterstützt: `png`, `eps` und `svg`. Das gewünschte Format kann wie folgt gewählt werden: QrCode::format('png'); // Wird ein png zurückliefern QrCode::format('eps'); // Wird ein eps zurückliefern QrCode::format('svg'); // Wird ein svg zurückliefern > `imagick` wird benötigt, um ein `png` zu generieren. #### Size `(int $size)` Die gewünschte Größe des QrCodes kann über die `size` Methode festgelegt werden. Dazu wird einfach die gewünschte Größe in Pixel übergeben: QrCode::size(100); ![200 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) #### Color `(int $red, int $green, int $blue, int $alpha = null)` >Vorsicht beim Ändern der Farbe eines QrCodes: einige QrCode-Leser haben große Schwierigkeiten, farbige QrCodes zu lesen. Alle Farben werden im RGBA (Rot, Grün, Blau, Alpha) Format angegeben. Die Farbe eines QrCodes kann wie folgt geändert werden: QrCode::color(255, 0, 0); // Roter QrCode QrCode::color(255, 0, 0, 25); // Roter QrCode mit 25% Transparenz ![Red QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![Red Transparent QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) #### Background Color `(int $red, int $green, int $blue, int $alpha = null)` Die Hintergrundfarbe eines QrCodes kann über die `backgroundColor` Methode geändert werden. QrCode::backgroundColor(255, 0, 0); // QrCode mit rotem Hintergrund QrCode::backgroundColor(255, 0, 0, 25); // QrCode mit rotem Hintergrund und 25% Transparenz ![Red Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![Red Transparent Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) #### Gradient `$startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` Einem QrCode kann über die `gradient` Methode ein Farbverlauf zugewiesen werden. Die folgenden Typen von Gradienten werden unterstützt: | Typ | Beispiel | | --- | --- | | `vertical` | ![Veritcal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | | `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | | `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | | `inverse_diagonal` | ![Invrse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | | `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | #### EyeColor `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` Die Farben der Positionsmarker können über die `eyeColor` Methode angepasst werden. | Auge Nr. | Beispiel | | --- | --- | | `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | | `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| | `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | #### Style `(string $style, float $size = 0.5)` Über `square` (quadratisch), `dot` (punktförmig), oder `round` (rund) kann der Stil einfach ausgetauscht werden. Dies ändert die Datenblöcke innerhalb des QrCodes. Der zweite Parameter bestimmt die Größe der einzelnen Punkte oder deren Abrundung. | Stil | Beispiel | | --- | --- | | `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| | `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | #### Eye Style `(string $style)` Es werden zwei verschiedene Stile von Positionsmarkern unterstützt: `square` (quadratisch) und `circle` (rund). | Style | Example | | --- | --- | | `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | | `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| #### Margin `(int $margin)` Der Seitenrand des QrCodes kann über die folgende Syntax festgelegt werden: QrCode::margin(100); #### Error Correction `(string $errorCorrection)` Über die `errorCorrection` Methode kann der anzuwendende Grad der Fehlerkorrektur einfach geändert werden: QrCode::errorCorrection('H'); Die folgenden Optionen werden von der Methode unterstützt: | Fehlerkorrekturstufe | Gewährleistete Sicherheit | | --- | --- | | L | 7% der Daten können wiederhergestellt werden. | | M | 15% der Daten können wiederhergestellt werden. | | Q | 25% der Daten können wiederhergestellt werden. | | H | 30% of der Daten können wiederhergestellt werden. | >Je hoher die Fehlerkorrekturstufe, desto größer wird der resultierende QrCode und desto weniger Daten können in ihm gespeichert werden. Mehr Informationen zur [Fehlerkorrektur](http://de.wikipedia.org/wiki/QR_code#Error_correction) finden sich in der Wikipedia. #### Encoding `(string $encoding)` Über die `encoding` Methode kann die für den QrCode verwendete Zeichenkodierung bestimmt werden. Standardmäßig wird `ISO-8859-1` verwendet. Mehr zur [Zeichenkodierung](https://de.wikipedia.org/wiki/Zeichenkodierung) findet sich in der Wikipedia. Die folgenden Kodierungen werden unterstützt: QrCode::encoding('UTF-8')->generate('Generier mir einen QrCode mit Symbolen ♠♥!!'); | Zeichenkodierung | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | #### Merge `(string $filepath, float $percentage = .2, bool $absolute = false)` Die `merge` Methode passt ein Bild in einen QrCode ein. Üblicherweise wird dies verwendet, um ein Logo in einem QrCode anzuzeigen. // Generiert einen QrCode mit einem mittig zentrierten Bild. QrCode::format('png')->merge('pfad-zur-bilddatei.png')->generate(); // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. QrCode::format('png')->merge('pfad-zur-bilddatei.png', .3)->generate(); // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. QrCode::format('png')->merge('http://www.google.com/irgendeinbild.png', .3, true)->generate(); >Die `merge` Methode unterstützt derzeit ausschließlich Bilder im PNG Format. >Der Dateipfad muss relativ zum Basispfad der App angegeben werden, solange `$absolute` auf `false` gesetzt ist. Ein absoluter Dateipfad wird erwartet, wenn der Parameter auf `true` gesetzt wird. >Bei Verwendung der `merge` Methode sollte eine hohe Fehlerkorrekturstufe gewählt werden, um sicherzustellen, dass der QrCode lesbar bleibt. Wir empfehlen eine Nutzung von `errorCorrection('H')`. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### Merge Binary String `(string $content, float $percentage = .2)` Die `mergeString` Methode entspricht der `merge` Methode, erlaubt aber abweichend den Inhalt einer Bilddatei als String zu übergeben. Dies ist besonders hilfreich, wenn mit der `Storage` Facade gearbeitet wird. // Generiert einen QrCode mit einem mittig zentrierten Bild. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >Wie auch bei `merge` werden derzeit nur Daten im PNG Format unterstützt. Ebenso wird auch hier die Verwendung einer hohen Fehlerkorrekturstufe empfohlen. #### Fortgeschrittene Nutzung Alle Methoden können verkettet werden. Dabei muss die `generate` Methode jeweils als letztes aufgerufen werden. So sind beispielsweise die folgenden Aufrufe möglich: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Generier einen QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Generier einen QrCode!'); Durch Umwandlung der als String zurückgelieferten binären Bilddaten über `base64_encode` kann der QrCode als PNG Bild angezeigt werden, ohne dieses vorher in einer Datei speichern zu müssen: ## Helfer #### Was sind Helfer? Helfer stellen einen einfachen Weg war, QrCodes zu generieren, die einen QrCode-Leser anweisen, nach dem Scannen eine bestimmte Aktion auszuführen. #### BitCoin Dieser Helfer generiert einen QrCode, um BitCoin-Zahlungen anzuweisen. [Weitere Informationen](https://bitco.in/en/developer-guide#plain-text) dazu (in Englisch). QrCode::BTC($adresse, $betrag); // Weist eine Zahlung über 0.334BTC an die angegebene Adresse an. QrCode::BTC('bitcoin adresse', 0.334); // Sendet eine Zahlung über 0.334BTC an die Adresse mit zusätzlichen optionalen Parametern. QrCode::size(500)->BTC('adresse', 0.0034, [ 'label' => 'Meine Kennzeichnung', 'message' => 'Meine Nachricht', 'returnAddress' => 'https://www.rueckkehrurl.com' ]); #### E-Mail Dieser Helfer generiert einen E-Mail QrCode, der automatisch die Zieladresse, Betreff und einen Text im E-Mail-Programm befüllt: QrCode::email($an, $betreff, $nachricht); // Füllt die Zieladresse aus. QrCode::email('foo@bar.com'); // Füllt die Zieladresse, das Betreff und die Nachricht einer E-Mail aus. QrCode::email('foo@bar.com', 'Dies ist das Betreff.', 'Dies ist die Nachricht.'); // Füllt nur Betreff und Nachricht aus. QrCode::email(null, ''Dies ist das Betreff.', 'Dies ist die Nachricht.'); #### Geo Dieser Helfer generiert einen QrCode mit Positionsinformationen über Angabe eines Breiten- und Längengrads, die ein Smartphone lesen und in Google Maps oder einer ähnlichen App darstellen kann. QrCode::geo($breitengrad, $laengengrad); QrCode::geo(37.822214, -122.481769); #### Telefonnummer Dieser Helfer generiert einen QrCode, der den QrCode-Leser anweist, eine Telefonnummer anzuwählen. QrCode::phoneNumber($telefonNummer); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### SMS Nachrichten Über diesen Helfer können Nachrichten in der SMS App vorab mit der Nummer und dem Text ausgefüllt werden: QrCode::SMS($telefonNummer, $nachricht); // Generiert eine leere SMS mit vorbefüllter Telefonnummer. QrCode::SMS('555-555-5555'); // Generiert eine SMS mit vorbefüllter Telefonnummer und Nachricht. QrCode::SMS('555-555-5555', 'Nachricht'); #### WiFi Dieser Helper generiert QrCodes, die gescannt werden können um ein Mobilgerät mit einem Drahtlosnetzwerk zu verbinden: QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID des Netzwerks', 'password' => 'Passwort des Netzwerks', 'hidden' => 'Bestimmt ob die SSID des Netzwerks versteckt ist oder nicht.' ]); // Verbindet zu einem offenen Drahtlosnetzwerk. QrCode::wiFi([ 'ssid' => 'Netzwerkname', ]); // Verbindet zu einem offenen Drahtlosnetzwerk mit geheimer SSID. QrCode::wiFi([ 'ssid' => 'Netzwerkname', 'hidden' => 'true' ]); // Verbindet zu einem gesicherten Drahtlosnetzwerk mit WPA Verschlüsselung. QrCode::wiFi([ 'ssid' => 'Nerzwerkname', 'encryption' => 'WPA', 'password' => 'Netzwerkpasswort' ]); >WiFi QrCodes werden aktuell nicht von Apple-Produkten unterstützt. ## Häufig verwendete QrCodes Dem Inhaltsparameter der `generate` Methode kann ein Präfix vorangestellt werden, um auf schnelle Weise einen QrCode mit komplexeren Informationen zu generieren: QrCode::generate('http://www.simplesoftware.io'); | Verwendung | Präfix | Beispiel | | --- | --- | --- | | Webseiten URL | http:// | http://www.simplesoftware.io | | Sichere URL | https:// | https://www.simplesoftware.io | | E-mail Adresse | mailto: | mailto:support@simplesoftware.io | | Telefonnummer | tel: | tel:555-555-5555 | | SMS | sms: | sms:555-555-5555 | | SMS mit vorbefüllter Nachricht | sms: | sms::Ich bin eine vorbefüllte Nachricht | | SMS mit vorbefüllter Nachricht und Nummer | sms: | sms:555-555-5555:Ich bin eine vorbefüllte Nachricht | | Geo-Position | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Eine Adresse, Irgendwo, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [Beispiele auf Wikipedia](https://de.wikipedia.org/wiki/VCard) | | Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Versteckt(True/False) | ## Verwendung außerhalb von Laravel Dieses Paket kann auch ohne Laravel verwendet werden, indem man eine neue Instanz der `Generator` Klasse erzeugt. use SimpleSoftwareIO\QrCode\Generator; $qrcode = new Generator; $qrcode->size(500)->generate('Generiere einen QrCode ohne Laravel!'); simple-qrcode/docs/kr/README.md000064400000036174152427536730012164 0ustar00[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - [소개(Introduction)](#docs-introduction) - [번역(Translations)](#docs-translations) - [설정(Configuration)](#docs-configuration) - [간단한 아이디어(Simple Ideas)](#docs-ideas) - [사용법(Usage)](#docs-usage) - [헬퍼(Helpers)](#docs-helpers) - [사용 예시(Common QrCode Usage)](#docs-common-usage) - [라라벨을 사용하지 않는 곳에서 사용하기(Usage Outside of Laravel)](#docs-outside-laravel) ## 소개(Introduction) Simple QrCode는 인기가 많은 라라벨 프레임워크 상에서 쉽게 사용할 수 있는 Qr코드 생성 패키지로, 정말 잘 만들어진 [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode)를 기반으로 만들어졌습니다. 우리는 라라벨을 이용하는 사람들에게 친숙하고 쉬운 인터페이스를 만들었습니다. ## 번역(Translations) 우리는 현재 이 문서의 번역을 도와줄 아랍어, 스페인어, 불어, 혹은 일본어를 할 줄 아는 사람을 찾고 있습니다. 만약 번역을 해주실 수 있다면, 풀리퀘스트(Pull request)를 보내주세요! ## 설정(Configuration) #### Composer 우선, Simple QrCode 패키지를 `composer.json` 파일의 `require`에 추가해주세요: "require": { "simplesoftwareio/simple-qrcode": "~2" } 그 다음으로, `composer update` 명령을 실행해주세요. #### Service Provider ###### Laravel <= 5.4 `config/app.php`의 `providers` 배열 안에, `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class`를 등록해주세요. #### Aliases ###### Laravel <= 5.4 마지막으로, `config/app.php` 설정 파일의 `aliases` 배열 안에, `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class`를 등록해주세요. ## 간단한 아이디어(Simple Ideas) #### 화면에 출력하기 이 패키지를 사용하는 핵심적인 이유 중 하나는 Qr코드를 화면에 출력하기 위함입니다. 이 패키지는 우리의 고객들이 Qr코드를 스캔하는 것만으로 원래의 페이지로 돌아가게 할 수 있습니다. 우리는 이를 footer.blade.php 파일에 아래의 코드를 추가함으로서 해냈습니다.
{!! QrCode::size(100)->generate(Request::url()); !!}

Scan me to return to the original page.

#### Qr코드 Embed하기 Qr코드를 이메일에 embed함으로서 유저가 쉽고 빠르게 스캔할 수 있게 할 수도 있습니다. 아래의 코드는 라라벨에서의 예시입니다. //Inside of a blade template. ## 사용법(Usage) #### 간단한(Basic) 사용법 Qr코드를 생성하는 방법은 정말 쉽습니다. 가장 간단한 구문은: QrCode::generate('Make me into a QrCode!'); 위 코드는 "Make me into a QrCode!"라는 문장을 Qr코드로 만들어줍니다. #### 생성(Generate) `Generate`는 Qr코드를 만들기 위해 사용됩니다. QrCode::generate('Make me into a QrCode!'); >주의하세요! 만약 메소드 체이닝을 사용하신다면, 이 메소드는 마지막에 호출되어야 합니다. 기본적인 `Generate`는 SVG 이미지 문자열을 반환합니다. 라라벨의 Blade를 사용하시면, 현대의 브라우저에는 직접적으로 출력하실 수 있습니다. 아래의 코드를 참고하세요: {!! QrCode::generate('Make me into a QrCode!'); !!} `generate` 메소드의 두 번째 인자는 Qr코드를 저장할 파일명과 경로입니다. QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); #### 포맷(Format) 변경 >Qr코드를 생성하면 기본적으로 SVG 이미지가 반환됩니다. >주의하세요! `format` 메소드는 `size`, `color`, `backgroundColor`, 그리고 `margin`과 같은 다른 포맷팅 옵션들보다 먼저 호출되어야 합니다. 현재는 PNG, EPS, 그리고 SVG 이 세 가지 포맷을 지원하고 있습니다. 포맷을 변경하려면 아래의 코드를 참고하세요: QrCode::format('png'); //Will return a PNG image QrCode::format('eps'); //Will return a EPS image QrCode::format('svg'); //Will return a SVG image #### 크기 변경 >Qr코드를 생성하면 기본적으로 Qr코드를 만들기 위한 최소 픽셀 사이즈로 반환됩니다. `size` 메소드를 사용하면 Qr코드의 크기를 변경할 수 있습니다. 아래의 코드처럼, 단순히 원하는 픽셀 사이즈를 입력하세요: QrCode::size(100); #### 색 변경 >Qr코드의 색을 변경할 때는 주의하세요. 어떤 Qr리더들은 색이 입혀진 Qr코드를 잘 읽지 못합니다. 모든 색은 RGB (Red Green Blue)로 표현되어야 합니다. 아래의 코드와 같이 Qr코드의 색을 변경할 수 있습니다: QrCode::color(255,0,255); 배경색도 변경할 수 있고, 같은 표현 방법을 사용합니다. QrCode::backgroundColor(255,255,0); #### 여백(Margin) 변경 Qr코드 주위의 여백을 변경하는 것 또한 가능합니다. 아래의 코드처럼, 단순히 원하는 여백을 입력하세요: QrCode::margin(100); #### 오류 복원(Error Correction) 오류 복원 레벨을 변경하는 것은 쉽습니다. 아래의 코드를 참고하세요: QrCode::errorCorrection('H'); 아래는 `errorCorrection` 메소드에서 지원하는 옵션들입니다. | 오류 복원 레벨 | 복원률 | | --- | --- | | L | 약 7%의 codewords | | M | 약 15%의 codewords | | Q | 약 25%의 codewords | | H | 약 30%의 codewords | >codewords는 데이터를 구성하는 단위로 Qr코드에는 8bit/codewords를 의미합니다. >복원율이 커질 수록 Qr코드가 커지고 저장할 수 있는 데이터가 적어집니다. [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction)를 참고하세요. #### 인코딩(Encoding) Qr코드를 만들기 위한 문자 인코딩을 변경할 수 있습니다. 기본값은 `ISO-8859-1`입니다. [character encoding](http://en.wikipedia.org/wiki/Character_encoding)를 참고하세요. 아래의 코드처럼, 다른 인코딩으로 변경할 수 있습니다: QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); | 문자 인코더(Character Encoder) | | --- | | ISO-8859-1 | | ISO-8859-2 | | ISO-8859-3 | | ISO-8859-4 | | ISO-8859-5 | | ISO-8859-6 | | ISO-8859-7 | | ISO-8859-8 | | ISO-8859-9 | | ISO-8859-10 | | ISO-8859-11 | | ISO-8859-12 | | ISO-8859-13 | | ISO-8859-14 | | ISO-8859-15 | | ISO-8859-16 | | SHIFT-JIS | | WINDOWS-1250 | | WINDOWS-1251 | | WINDOWS-1252 | | WINDOWS-1256 | | UTF-16BE | | UTF-8 | | ASCII | | GBK | | EUC-KR | >`Could not encode content to ISO-8859-1` 오류는 잘못된 문자 인코딩이 사용되고 있다는 것을 의미합니다. 만약 확신이 없다면 `UTF-8` 사용을 권장합니다. #### 병합(Merge) `merge` 메소드는 이미지를 Qr코드 위에 합쳐줍니다. 주로 로고 이미지를 Qr코드 안에 넣기 위해 사용합니다. QrCode::merge($filename, $percentage, $absolute); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->merge('path-to-image.png')->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('path-to-image.png', .3)->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); >`merge` 메소드는 현재 PNG 포맷만 지원합니다. >`$absolute`가 `false`로 되어 있으면, 파일 경로는 상대 경로입니다. 절대 경로를 사용하고 싶으시면, 이 변수 값을 `true`로 변경해주세요. >`merge`를 사용하면서 Qr리더가 잘 스캔하게 하기 위해서는 높은 오류 복원율을 사용해야합니다. `errorCorrection('H')`를 사용하기를 권장합니다. ![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) #### 이진 문자열 병합(Merge Binary String) `mergeString` 메소드는 `merge`와 동일한 동작을 합니다. 단, `mergeString` 메소드를 사용하면 파일을 파일의 경로가 아닌 문자열로 표현할 수 있도록 해줍니다. 이는 `Storage` 파사드를 같이 사용할 때, 유용하게 쓰입니다. `mergeString`의 인터페이스는 `merge`와 거의 동일합니다. QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); //Generates a QrCode with an image centered in the middle. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); >일반적인 `merge` 메소드 호출처럼, 현재 PNG 포맷만 지원합니다. 오류 복원율도 동일하게 높은 레벨의 오류 복원율을 권장합니다. #### 고급(Advanced) 사용법 모든 메소드는 메소드 체이닝을 지원합니다. `generate` 메소드는 반드시 마지막에 호출되어야 하고, `format` 변경은 반드시 첫 부분에 호출되어야 합니다. 아래의 예시 코드를 참고해주세요: QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); PNG 이미지를 `base64_encode`를 사용하여 인코딩된 raw string을 사용하면, 파일로 저장하지 않아도 출력할 수 있습니다. ## 헬퍼(Helpers) #### 헬퍼가 무엇인가요? 헬퍼는 Qr리더로 스캔했을 때, 특정한 동작을 할 수 있는 Qr코드를 만들어줍니다. #### 비트코인(BitCoin) 이 헬퍼는 스캔했을 때 비트코인을 송금할 수 있는 Qr코드를 만들어줍니다. [더 알아보기](https://bitco.in/en/developer-guide#plain-text) QrCode::BTC($address, $amount); //Sends a 0.334BTC payment to the address QrCode::BTC('bitcoin address', 0.334); //Sends a 0.334BTC payment to the address with some optional arguments QrCode::size(500)->BTC('address', 0.0034, [ 'label' => 'my label', 'message' => 'my message', 'returnAddress' => 'https://www.returnaddress.com' ]); #### 이메일(E-mail) 이 헬퍼는 이메일 주소, 제목, 그리고 내용이 미리 입력되어 있는 채로 이메일을 보낼 수 있는 Qr코드를 만들어줍니다. QrCode::email($to, $subject, $body); //Fills in the to address QrCode::email('foo@bar.com'); //Fills in the to address, subject, and body of an e-mail. QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); //Fills in just the subject and body of an e-mail. QrCode::email(null, 'This is the subject.', 'This is the message body.'); #### 지리위치(Geo) 이 헬퍼는 스마트폰으로 스캔해서 구글 지도 같은 지도 앱들에 위치를 표현할 수 있도록 위도와 경도 값을 포함하고 있는 Qr코드를 만들어줍니다. QrCode::geo($latitude, $longitude); QrCode::geo(37.822214, -122.481769); #### 전화번호(Phone Number) 이 헬퍼는 스캔해서 통화 연결을 할 수 있는 Qr코드를 만들어줍니다. QrCode::phoneNumber($phoneNumber); QrCode::phoneNumber('555-555-5555'); QrCode::phoneNumber('1-800-Laravel'); #### 문자 메세지(SMS) 이 헬퍼는 받는 사람 번호와 문자 메세지 내용이 미리 입력되어 있는 채로 문자 메세지를 보낼 수 있는 Qr코드를 만들어줍니다. QrCode::SMS($phoneNumber, $message); //Creates a text message with the number filled in. QrCode::SMS('555-555-5555'); //Creates a text message with the number and message filled in. QrCode::SMS('555-555-5555', 'Body of the message'); #### 와이파이(WiFi) 이 헬퍼는 스마트폰으로 스캔해서 와이파이에 연결할 수 있도록 하는 Qr코드를 만들어줍니다. QrCode::wiFi([ 'encryption' => 'WPA/WEP', 'ssid' => 'SSID of the network', 'password' => 'Password of the network', 'hidden' => 'Whether the network is a hidden SSID or not.' ]); //Connects to an open WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', ]); //Connects to an open, hidden WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'hidden' => 'true' ]); //Connects to an secured, WiFi network. QrCode::wiFi([ 'ssid' => 'Network Name', 'encryption' => 'WPA', 'password' => 'myPassword' ]); >현재 애플 제품(예. 아이폰 등)은 와이파이 스캔을 지원하지 않습니다. ## 사용 예시(Common QrCode Usage) 아래 표에 있는 접두사(prefix)를 `generate` 섹션에 사용하면, 더 고급스러운 정보가 저장된 Qr코드를 만들 수 있습니다: QrCode::generate('http://www.simplesoftware.io'); | 사용처 | Prefix | 예시 | | --- | --- | --- | | 웹사이트(http) URL | http:// | http://www.simplesoftware.io | | 웹사이트(https) URL | https:// | https://www.simplesoftware.io | | 이메일 주소 | mailto: | mailto:support@simplesoftware.io | | 전화번호 | tel: | tel:555-555-5555 | | 문자 메세지(SMS) | sms: | sms:555-555-5555 | | 내용이 미리 입력된 문자 메세지(SMS) | sms: | sms::I am a pretyped message | | 번호와 내용이 미리 입력된 문자 메세지(SMS) | sms: | sms:555-555-5555:I am a pretyped message | | 지리위치 정보(Geo Address) | geo: | geo:-78.400364,-85.916993 | | MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | | VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | | 와이파이(Wifi) | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | ## 라라벨을 사용하지 않는 곳에서 사용하기(Usage Outside of Laravel) `BaconQrCodeGenerator` 클래스를 인스턴스화하면, 라라벨을 사용하지 않는 곳에서 이 패키지를 사용할 수 있습니다. use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; $qrcode = new BaconQrCodeGenerator; $qrcode->size(500)->generate('Make a qrcode without Laravel!'); simple-qrcode/.github/workflows/php.yml000064400000000667152427536730014246 0ustar00name: Unit Tests on: push: branches: [ master, develop ] pull_request: branches: [ master, develop ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Validate composer.json and composer.lock run: composer validate - name: Install dependencies run: composer install --prefer-dist --no-progress - name: Run test suite run: composer run-script test simple-qrcode/.github/stale.yml000064400000001231152427536730012516 0ustar00# Number of days of inactivity before an issue becomes stale daysUntilStale: 90 # Number of days of inactivity before a stale issue is closed daysUntilClose: 7 # Issues with these labels will never be considered stale exemptLabels: - bug # Label to use when marking an issue as stale staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: true simple-qrcode/src/DataTypes/Email.php000064400000004460152427536730013557 0ustar00setProperties($arguments); } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->buildEmailString(); } /* * Builds the email string. * * @return string */ protected function buildEmailString() { $email = $this->prefix.$this->email; if (isset($this->subject) || isset($this->body)) { $data = [ 'subject' => $this->subject, 'body' => $this->body, ]; $email .= '?'.http_build_query($data); } return $email; } /** * Sets the objects properties. * * @param $arguments */ protected function setProperties(array $arguments) { if (isset($arguments[0])) { $this->setEmail($arguments[0]); } if (isset($arguments[1])) { $this->subject = $arguments[1]; } if (isset($arguments[2])) { $this->body = $arguments[2]; } } /** * Sets the email property. * * @param $email */ protected function setEmail($email) { if ($this->isValidEmail($email)) { $this->email = $email; } } /** * Ensures an email is valid. * * @param string $email * * @return bool */ protected function isValidEmail($email) { if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException('Invalid email provided'); } return true; } } simple-qrcode/src/DataTypes/PhoneNumber.php000064400000001275152427536730014753 0ustar00phoneNumber = $arguments[0]; } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->prefix.$this->phoneNumber; } } simple-qrcode/src/DataTypes/DataTypeInterface.php000064400000000522152427536730016057 0ustar00latitude = $arguments[0]; $this->longitude = $arguments[1]; } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->prefix.$this->latitude.$this->separator.$this->longitude; } } simple-qrcode/src/DataTypes/WiFi.php000064400000004507152427536730013370 0ustar00setProperties($arguments); } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->buildWifiString(); } /** * Builds the WiFi string. * * @return string */ protected function buildWifiString() { $wifi = $this->prefix; if (isset($this->encryption)) { $wifi .= 'T:'.$this->encryption.$this->separator; } if (isset($this->ssid)) { $wifi .= 'S:'.$this->ssid.$this->separator; } if (isset($this->password)) { $wifi .= 'P:'.$this->password.$this->separator; } if (isset($this->hidden)) { $wifi .= 'H:'.$this->hidden.$this->separator; } return $wifi; } /** * Sets the WiFi properties. * * @param $arguments */ protected function setProperties(array $arguments) { $arguments = $arguments[0]; if (isset($arguments['encryption'])) { $this->encryption = $arguments['encryption']; } if (isset($arguments['ssid'])) { $this->ssid = $arguments['ssid']; } if (isset($arguments['password'])) { $this->password = $arguments['password']; } if (isset($arguments['hidden'])) { $this->hidden = $arguments['hidden']; } } } simple-qrcode/src/DataTypes/BTC.php000064400000004606152427536730013142 0ustar00setProperties($arguments); } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->buildBitCoinString(); } /** * Sets the BitCoin arguments. * * @param array $arguments */ protected function setProperties(array $arguments) { if (isset($arguments[0])) { $this->address = $arguments[0]; } if (isset($arguments[1])) { $this->amount = $arguments[1]; } if (isset($arguments[2])) { $this->setOptions($arguments[2]); } } /** * Sets the optional BitCoin options. * * @param array $options */ protected function setOptions(array $options) { if (isset($options['label'])) { $this->label = $options['label']; } if (isset($options['message'])) { $this->message = $options['message']; } if (isset($options['returnAddress'])) { $this->returnAddress = $options['returnAddress']; } } /** * Builds a BitCoin string. * * @return string */ protected function buildBitCoinString() { $query = http_build_query([ 'amount' => $this->amount, 'label' => $this->label, 'message' => $this->message, 'r' => $this->returnAddress, ]); $btc = $this->prefix.$this->address.'?'.$query; return $btc; } } simple-qrcode/src/DataTypes/SMS.php000064400000003040152427536730013163 0ustar00setProperties($arguments); } /** * Returns the correct QrCode format. * * @return string */ public function __toString() { return $this->buildSMSString(); } /** * Sets the phone number and message for a sms message. * * @param array $arguments */ protected function setProperties(array $arguments) { if (isset($arguments[0])) { $this->phoneNumber = $arguments[0]; } if (isset($arguments[1])) { $this->message = $arguments[1]; } } /** * Builds a SMS string. * * @return string */ protected function buildSMSString() { $sms = $this->prefix.$this->phoneNumber; if (isset($this->message)) { $sms .= $this->separator.$this->message; } return $sms; } } simple-qrcode/src/Facades/QrCode.php000064400000000627152427536730013336 0ustar00image = imagecreatefromstring($image); } /* * Returns the width of an image * * @return int */ public function getWidth() { return imagesx($this->image); } /* * Returns the height of an image * * @return int */ public function getHeight() { return imagesy($this->image); } /** * Returns the image string. * * @return string */ public function getImageResource() { return $this->image; } /** * Sets the image string. * * @param resource $image */ public function setImageResource($image) { $this->image = $image; } } simple-qrcode/src/QrCodeServiceProvider.php000064400000000773152427536730015046 0ustar00app->bind('qrcode', function () { return new Generator(); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return [Generator::class]; } } simple-qrcode/src/ImageMerge.php000064400000011473152427536730012636 0ustar00sourceImage = $sourceImage; $this->mergeImage = $mergeImage; } /** * Returns an QrCode that has been merge with another image. * This is usually used with logos to imprint a logo into a QrCode. * * @param $percentage float The percentage of size relative to the entire QR of the merged image * * @return string */ public function merge($percentage) { $this->setProperties($percentage); $img = imagecreatetruecolor($this->sourceImage->getWidth(), $this->sourceImage->getHeight()); imagealphablending($img, true); $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); imagefill($img, 0, 0, $transparent); imagecopy( $img, $this->sourceImage->getImageResource(), 0, 0, 0, 0, $this->sourceImage->getWidth(), $this->sourceImage->getHeight() ); imagecopyresampled( $img, $this->mergeImage->getImageResource(), $this->centerX, $this->centerY, 0, 0, $this->postMergeImageWidth, $this->postMergeImageHeight, $this->mergeImageWidth, $this->mergeImageHeight ); $this->sourceImage->setImageResource($img); return $this->createImage(); } /** * Creates a PNG Image. * * @return string */ protected function createImage() { ob_start(); imagepng($this->sourceImage->getImageResource()); return ob_get_clean(); } /** * Sets the objects properties. * * @param $percentage float The percentage that the merge image should take up. * * @return void */ protected function setProperties($percentage) { if ($percentage > 1) { throw new InvalidArgumentException('$percentage must be less than 1'); } $this->sourceImageHeight = $this->sourceImage->getHeight(); $this->sourceImageWidth = $this->sourceImage->getWidth(); $this->mergeImageHeight = $this->mergeImage->getHeight(); $this->mergeImageWidth = $this->mergeImage->getWidth(); $this->calculateOverlap($percentage); $this->calculateCenter(); } /** * Calculates the center of the source Image using the Merge image. * * @return void */ protected function calculateCenter() { $this->centerX = intval(($this->sourceImageWidth / 2) - ($this->postMergeImageWidth / 2)); $this->centerY = intval(($this->sourceImageHeight / 2) - ($this->postMergeImageHeight / 2)); } /** * Calculates the width of the merge image being placed on the source image. * * @param float $percentage * * @return void */ protected function calculateOverlap($percentage) { $this->mergeRatio = round($this->mergeImageWidth / $this->mergeImageHeight, 2); $this->postMergeImageWidth = intval($this->sourceImageWidth * $percentage); $this->postMergeImageHeight = intval($this->postMergeImageWidth / $this->mergeRatio); } } simple-qrcode/src/Generator.php000064400000035137152427536730012565 0ustar00createClass($method); $dataType->create($arguments); return $this->generate(strval($dataType)); } /** * Generates the QrCode. * * @param string $text * @param string|null $filename * @return void|Illuminate\Support\HtmlString|string * @throws WriterException * @throws InvalidArgumentException */ public function generate(string $text, string $filename = null) { $qrCode = $this->getWriter($this->getRenderer())->writeString($text, $this->encoding, $this->errorCorrection); if ($this->imageMerge !== null && $this->format === 'png') { $merger = new ImageMerge(new Image($qrCode), new Image($this->imageMerge)); $qrCode = $merger->merge($this->imagePercentage); } if ($filename) { file_put_contents($filename, $qrCode); return; } if (class_exists(\Illuminate\Support\HtmlString::class)) { return new \Illuminate\Support\HtmlString($qrCode); } return $qrCode; } /** * Merges an image over the QrCode. * * @param string $filepath * @param float $percentage * @param SimpleSoftwareIO\QrCode\boolean|bool $absolute * @return Generator */ public function merge(string $filepath, float $percentage = .2, bool $absolute = false): self { if (function_exists('base_path') && ! $absolute) { $filepath = base_path().$filepath; } $this->imageMerge = file_get_contents($filepath); $this->imagePercentage = $percentage; return $this; } /** * Merges an image string with the center of the QrCode. * * @param string $content * @param float $percentage * @return Generator */ public function mergeString(string $content, float $percentage = .2): self { $this->imageMerge = $content; $this->imagePercentage = $percentage; return $this; } /** * Sets the size of the QrCode. * * @param int $pixels * @return Generator */ public function size(int $pixels): self { $this->pixels = $pixels; return $this; } /** * Sets the format of the QrCode. * * @param string $format * @return Generator * @throws InvalidArgumentException */ public function format(string $format): self { if (! in_array($format, ['svg', 'eps', 'png'])) { throw new InvalidArgumentException("\$format must be svg, eps, or png. {$format} is not a valid."); } $this->format = $format; return $this; } /** * Sets the foreground color of the QrCode. * * @param int $red * @param int $green * @param int $blue * @param null|int $alpha * @return Generator */ public function color(int $red, int $green, int $blue, ?int $alpha = null): self { $this->color = $this->createColor($red, $green, $blue, $alpha); return $this; } /** * Sets the background color of the QrCode. * * @param int $red * @param int $green * @param int $blue * @param null|int $alpha * @return Generator */ public function backgroundColor(int $red, int $green, int $blue, ?int $alpha = null): self { $this->backgroundColor = $this->createColor($red, $green, $blue, $alpha); return $this; } /** * Sets the eye color for the provided eye index. * * @param int $eyeNumber * @param int $innerRed * @param int $innerGreen * @param int $innerBlue * @param int $outterRed * @param int $outterGreen * @param int $outterBlue * @return Generator * @throws InvalidArgumentException */ public function eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0): self { if ($eyeNumber < 0 || $eyeNumber > 2) { throw new InvalidArgumentException("\$eyeNumber must be 0, 1, or 2. {$eyeNumber} is not valid."); } $this->eyeColors[$eyeNumber] = new EyeFill( $this->createColor($innerRed, $innerGreen, $innerBlue), $this->createColor($outterRed, $outterGreen, $outterBlue) ); return $this; } public function gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type): self { $type = strtoupper($type); $this->gradient = new Gradient( $this->createColor($startRed, $startGreen, $startBlue), $this->createColor($endRed, $endGreen, $endBlue), GradientType::$type() ); return $this; } /** * Sets the eye style. * * @param string $style * @return Generator * @throws InvalidArgumentException */ public function eye(string $style): self { if (! in_array($style, ['square', 'circle'])) { throw new InvalidArgumentException("\$style must be square or circle. {$style} is not a valid eye style."); } $this->eyeStyle = $style; return $this; } /** * Sets the style of the blocks for the QrCode. * * @param string $style * @param float $size * @return Generator * @throws InvalidArgumentException */ public function style(string $style, float $size = 0.5): self { if (! in_array($style, ['square', 'dot', 'round'])) { throw new InvalidArgumentException("\$style must be square, dot, or round. {$style} is not a valid."); } if ($size < 0 || $size >= 1) { throw new InvalidArgumentException("\$size must be between 0 and 1. {$size} is not valid."); } $this->style = $style; $this->styleSize = $size; return $this; } /** * Sets the encoding for the QrCode. * Possible values are * ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, * ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-11, * ISO-8859-12, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, * SHIFT-JIS, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252, WINDOWS-1256, * UTF-16BE, UTF-8, ASCII, GBK, EUC-KR. * * @param string $encoding * @return Generator */ public function encoding(string $encoding): self { $this->encoding = strtoupper($encoding); return $this; } /** * Sets the error correction for the QrCode. * L: 7% loss. * M: 15% loss. * Q: 25% loss. * H: 30% loss. * * @param string $errorCorrection * @return Generator */ public function errorCorrection(string $errorCorrection): self { $errorCorrection = strtoupper($errorCorrection); $this->errorCorrection = ErrorCorrectionLevel::$errorCorrection(); return $this; } /** * Sets the margin of the QrCode. * * @param int $margin * @return Generator */ public function margin(int $margin): self { $this->margin = $margin; return $this; } /** * Fetches the Writer. * * @param ImageRenderer $renderer * @return Writer */ public function getWriter(ImageRenderer $renderer): Writer { return new Writer($renderer); } /** * Fetches the Image Renderer. * * @return ImageRenderer */ public function getRenderer(): ImageRenderer { $renderer = new ImageRenderer( $this->getRendererStyle(), $this->getFormatter() ); return $renderer; } /** * Returns the Renderer Style. * * @return RendererStyle */ public function getRendererStyle(): RendererStyle { return new RendererStyle($this->pixels, $this->margin, $this->getModule(), $this->getEye(), $this->getFill()); } /** * Fetches the formatter. * * @return ImageBackEndInterface */ public function getFormatter(): ImageBackEndInterface { if ($this->format === 'png') { return new ImagickImageBackEnd('png'); } if ($this->format === 'eps') { return new EpsImageBackEnd; } return new SvgImageBackEnd; } /** * Fetches the module. * * @return ModuleInterface */ public function getModule(): ModuleInterface { if ($this->style === 'dot') { return new DotsModule($this->styleSize); } if ($this->style === 'round') { return new RoundnessModule($this->styleSize); } return SquareModule::instance(); } /** * Fetches the eye style. * * @return EyeInterface */ public function getEye(): EyeInterface { if ($this->eyeStyle === 'square') { return SquareEye::instance(); } if ($this->eyeStyle === 'circle') { return SimpleCircleEye::instance(); } return new ModuleEye($this->getModule()); } /** * Fetches the color fill. * * @return Fill */ public function getFill(): Fill { $foregroundColor = $this->color ?? new Rgb(0, 0, 0); $backgroundColor = $this->backgroundColor ?? new Rgb(255, 255, 255); $eye0 = $this->eyeColors[0] ?? EyeFill::inherit(); $eye1 = $this->eyeColors[1] ?? EyeFill::inherit(); $eye2 = $this->eyeColors[2] ?? EyeFill::inherit(); if ($this->gradient) { return Fill::withForegroundGradient($backgroundColor, $this->gradient, $eye0, $eye1, $eye2); } return Fill::withForegroundColor($backgroundColor, $foregroundColor, $eye0, $eye1, $eye2); } /** * Creates a RGB or Alpha channel color. * @param int $red * @param int $green * @param int $blue * @param null|int $alpha * @return ColorInterface */ public function createColor(int $red, int $green, int $blue, ?int $alpha = null): ColorInterface { if (is_null($alpha)) { return new Rgb($red, $green, $blue); } return new Alpha($alpha, new Rgb($red, $green, $blue)); } /** * Creates a new DataType class dynamically. * * @param string $method * @return DataTypeInterface */ protected function createClass(string $method): DataTypeInterface { $class = $this->formatClass($method); if (! class_exists($class)) { throw new BadMethodCallException(); } return new $class(); } /** * Formats the method name correctly. * * @param $method * @return string */ protected function formatClass(string $method): string { $method = ucfirst($method); $class = "SimpleSoftwareIO\QrCode\DataTypes\\".$method; return $class; } } simple-qrcode/CHANGELOG.md000064400000004023152427536730011136 0ustar00Simple QrCode ============= ##Change Log #### 2.0.0 * Fixed a bug where the merge image was not reset correctly. (#93) * Added Laravel auto discovery support. (#82) - Thanks [mazedlx](https://github.com/mazedlx) #### 1.5.1 * Fixed a bug where a QrCode used within a loop would not generate correctly. #### 1.5.0 * Added Portuguese translation. -Thanks [francisek](https://github.com/francisek) and [Varpie!](https://github.com/Varpie) * Added BitCoin helper #### 1.4.6 * Added Portuguese translation. -Thanks [felipewmartins!](https://github.com/felipewmartins) #### 1.4.5 * Added Spanish translation. -Thanks [gtarraga!](https://github.com/gtarraga) * Added Hindi translation. -Thanks [himanshu81494!](https://github.com/himanshu81494) #### 1.4.4 * Added Italian translation. -Thanks [simocosimo!](https://github.com/simocosimo) #### 1.4.3 * Updated the docs to our new format. * Correct some typos in the Russian translation. #### 1.4.2 * Added Russian translation. -Thanks Victoria! * Added Chinese translation. -Thanks [blusewang!](https://github.com/blusewang) #### 1.4.1 * Improved the quality of QrCodes with logos merge on them. -Thanks [tuupke!](https://github.com/tuupke) #### 1.4.0 * Added the `mergeString` method. This method adds the ability to pass in a binary string to create a QrCode with an image on it. -Thanks [tuupke!](https://github.com/tuupke) #### 1.3.3 * Allow absolute paths to be used with the `merge` method. #### 1.3.2 * Changed `bindShared` to `singleton` to support Laravel 5.2 -Thanks [lhdev!](https://github.com/lhdev) #### 1.3.1 * Fixed a bug where `merge` did not work as expected when used with `size.` #### 1.3.0 * Added `merge` method. * Fixed a typo in the readme. #### 1.2.0 * Added full support for Laravel 5 * Added the following helpers. * E-Mail * Geo * Phone Number * SMS * WiFi #### 1.1.1 * Update dependencies. * Corrected some composer file issues. * Added some missing Laravel information to the QrCode Service Provider. ####1.1.0 * Added the ability to change the character encoding. simple-qrcode/SECURITY.md000064400000000631152427536730011117 0ustar00# Security Policy ## Supported Versions | Version | Supported | | ------- | ------------------ | | >= 2.x | :white_check_mark: | | <= 1.x | :x: | ## Reporting a Vulnerability Please report security vulnerabilities responsibility by emailing `security@simplesoftware.io.` We will fix the vulnerability privately, push a new release, and then go public with the notification. simple-qrcode/.gitignore000064400000000033152427536730011312 0ustar00.idea /vendor composer.locksimple-qrcode/README.md000064400000005664152427536730010620 0ustar00Simple QrCode ======================== ![Unit Tests](https://github.com/SimpleSoftwareIO/simple-qrcode/workflows/Unit%20Tests/badge.svg) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) ## [Deutsch](https://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](https://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](https://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](https://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](https://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](https://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](https://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](https://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](https://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](https://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) Language files are currently out of date. We need volunteers to upgrade them to v4! Please submit a PR request! ### Try our dead simple, free file transfer service [keep.sh](https://keep.sh) [![keep.sh](https://user-images.githubusercontent.com/624784/95805291-1121e980-0cd3-11eb-9048-0264bd9f2fd7.gif)](https://keep.sh) Easy fast file sharing from the command line with a single curl command! `curl --upload-file your-local-file.txt https://keep.sh` ## Introduction Simple QrCode is an easy to use wrapper for the popular Laravel framework based on the great work provided by [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). We created an interface that is familiar and easy to install for Laravel users. ## Official Documentation Documentation for Simple QrCode can be found on our [website.](http://www.simplesoftware.io/#/docs/simple-qrcode) ## Examples ![Example 1](docs/imgs/example-1.png) ![Example 2](docs/imgs/example-2.png) ## Use Cases

Platform to sell tickets online

## Contributing Please submit all issues and pull requests to the [simplesoftwareio/simple-qrcode](https://github.com/simplesoftwareio/simple-qrcode) repository on the develop branch! ## License This software is released under the [MIT license.](https://opensource.org/licenses/MIT) simple-qrcode/composer.json000064400000002267152427536730012057 0ustar00{ "name": "simplesoftwareio/simple-qrcode", "description": "Simple QrCode is a QR code generator made for Laravel.", "keywords": ["qrcode", "laravel", "simple", "generator", "wrapper"], "homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode", "license" : "MIT", "authors": [ { "name": "Simple Software LLC", "email": "support@simplesoftware.io" } ], "require": { "php": ">=7.2|^8.0", "ext-gd": "*", "bacon/bacon-qr-code": "^2.0" }, "require-dev": { "mockery/mockery": "~1", "phpunit/phpunit": "~9" }, "suggest": { "ext-imagick": "Allows the generation of PNG QrCodes.", "illuminate/support": "Allows for use within Laravel." }, "autoload": { "psr-4": { "SimpleSoftwareIO\\QrCode\\": "src" } }, "scripts": { "test": "phpunit" }, "extra": { "laravel": { "providers": [ "SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider" ], "aliases": { "QrCode": "SimpleSoftwareIO\\QrCode\\Facades\\QrCode" } } } } simple-qrcode/CONTRIBUTING.md000064400000000302152427536730011552 0ustar00# Contribution Guidelines Please submit all issues and pull requests to the [simplesoftwareio/simple-qrcode](https://github.com/simplesoftwareio/simple-qrcode) repository on the develop branch!simple-qrcode/phpunit.xml000064400000001035152427536730011536 0ustar00 ./tests/ simple-qrcode/LICENSE000064400000002131152427536730010330 0ustar00The MIT License (MIT) Copyright (c) 2014-2020 Simple Software LLC www.simplesoftware.io Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.