組み込み開発でテスタビリティを支える / Testability in Embedded Software

32fe1b1b174c69d06b455799ed1fb285?s=47 h.iseri
February 17, 2018

組み込み開発でテスタビリティを支える / Testability in Embedded Software

テスト自動化研究会の活動で作成した資料の公開用簡略版

32fe1b1b174c69d06b455799ed1fb285?s=128

h.iseri

February 17, 2018
Tweet

Transcript

  1.       1

  2. )43.&/ • 4 • D@AFID=;DKH1*/"D@E;':<GJK B9 ; (: • 

    • ;8:,84;>AIC?0 # L4DKH31-/3235!;M • 04$D@AFID=%5"+6/$D@E3 1-/4D@AFID=%; *7+# 2
  3. WWfkiab_RQNOheiS hegjmh`T • %'( CZ[hei  ^H\IQRVK LZD • Cfkiab_hei&)'SDn+38

    7093;oA • hegjmh`SPBcei^PG\ • Chegjmh`S PWWfkiab_Scei F%$ J]\D Chei^ETBVKhegjmh`^[XUGD • Chei  SMYSdehlD!*39-6923;<" /3<=10;736=<094:;23;>9539 09263.:4=?0;3#!.=3409,>9580@;" 3
  4.     4   "  #!

  5. 746:<7.+, >5;8/0-1=39-<=2? •  >%& ! (*? •  >'&)

    ! (*? •  >$#(&$!! ! (*? •  >$"%$' ! (*? •  > "%!  (*? •  >( ! (*? •  >#&'(# ! (*? !"  ( S.)  $ # 5
  6. )[Y\P[YZ]_[WMQ • *"c3@:A67;<;CEd • )*I • +!c37B:AD67;<;CEd • [Y\&P b

    .V) JSKH • c1?>CA?<<67;<;CEd • [Y\-V)JSKH • , (c2:8?=@?B67;<;CEd • [Y\-PTJSF[Y\$ RP/'I • %c4;=@<;8;CEd • )[Y\SLP$ VXa^`OJSKH • c4C67;<;CEd • )[Y\O0GUINH • #,c5>9:ABC6>967;<;CEd • [Y\-V#,JSKH 6
  7.  " 0,.4:0%   • 0,1  • 0,1,*>6#"

    • 0,.4:0%  • 0,1 "0,.4:0%#" • +,08<7;0,.4:0%  • 0,.4:0%#3>2&'$! #  • -51&'$$>(0)/90,.4:0%  • 0,.4:0%= • 0,.4:0% 7
  8.  • /+0  • /+0+)=5" ! • /+-39/$ 

    • /+0 !/+-39/$" ! • *+/7;6:/+-39/$ • /+-39/$"2=1%&#  " • ,40%&##='/(.8/+-39/$ • /+-39/$<  • /+-39/$ 8  $  # %     ! "  
  9. UQVGUQSY_ULG KNV^Mb *( UQSY_ULJ CI • ) )  +(

    UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV 9
  10. TOQY`TFE&?D • TOV% E>DGdQeZHeO •  • TOV)E% ?D=E#>D= •

    -LdZFKbeN_d<UXSI<.10Lea< • ' • TOV)B E% ?D='E#>D= • -cK<]^`Rd[<VbeM •  • "!E% !ACD=% A+@Ld\eWdV E,?D=( $E#>D • -`dJ*<[`[cPSM*</49473472; 07642:587 10
  11. ?9:DH?43(1 • ?9@3 '1,?9@FJ?4H?4 • ?9@  • 8B?4<6=7 •

    .-2)?9@;EI • #$&$%"0?9@   • %$  $! +* • ?9@   • ?9@>JI,)/,AG5C+* 11
  12.  12  )' %   )'  /

      )'      ,+!  !  )' %   )'  /   .       "-  )'($ #&*
  13.  13  .*  (   .* 

    !6   .*      31#  #  .*  (   .*  !6   5       $4  .*,' %)0 2/ +&/ "-/
  14. "  •  #$ $ •  • 

    •  •   !$" 14 
  15. ^Z`) EI^Z`Oq[sfPsZI&4v @G&4I*E (HBL • # I+Oq[sfPsZ • u 

    tRXpJpYNbGF,M!ALu?  tTkg\kJ"-u?+0rWseZ!pU • %G+Oq[sfPsZ • # HCDOq[sfPsZ • uQilos[ ?Xilos[ ?. I • 3%GOq[sfPsZ • ^Z`!IOq[sfPsZ • u_d]S t:=68'u?^Z`!/ t>6<=? =7;59;'u?12$!pUrjc[mqU • 1Oq[sfPsZ • VsaohnI1IOq[sfPsZ • u6;9IK?Upsdn 15
  16. YUV]cYOH HPf_W[ YU[D GBA • YU[>J >LK • IXgdH C

    ? MK • !FPfVg^QgU • &9-/+928/"# '754*<8154CZ\WRCC@K • )*($%# +&(CTabegVH@NC@K • (249;`gU# 0.-USc_[ ,:3=6<8154FE!CC@K 16         " ""     "$' "")%      $'  * (  &  #!
  17. 856:?80** •  ( • /B3847=, '#%!)856:? 80. • 859&$+"2>B,*

    • 859 *) $-A  • * ( • ;@<1@9* •  *856:?80. 17
  18. aZ]fnaSH +H-#v +?: 2OQPH=,L0L • &H + • 8'AC;P&N`to=D>P< •

    hq[ZH + • 8Trh_bHIOQP< • jdYlrbH + • 8.' I<9^tkHZVoI < • /EHbptcUg • u *) • (&<O5AC;F;<:3s4nZWIF;< • 8 $JH6 • %R1@BF;<:n\tZR!.AF;< • 87JH6 • GAF;<:eXRM0KF;< • 8[VmnaS • -"#=[VmnaSitoEFOF;< 18
  19. aZ]fnaSH +H-#v +?: 2OQPH=,L0L • &H + • 8'AC;P&N`to=D>P< •

    hq[ZH + • 8Trh_bHIOQP< • jdYlrbH + • 8.' I<9^tkHZVoI < • /EHbptcUg • u *) • (&<O5AC;F;<:3s4nZWIF;< • 8 $JH6 • %R1@BF;<:n\tZR!.AF;< • 87JH6 • GAF;<:eXRM0KF;< • 8[VmnaS • -"#=[VmnaSitoEFOF;< 19 /79-;>6  4:# $# !%(#@10  ?8/793<5(  $)+  @1* /79.= '#"&2,/79.=
  20. , "Syktn]th , "[ohq`bPMZ • gbh+RNKOI, "[hfme^tP/-R 'V2W  )RQZU

    PS1 5T HHPJZ clh^_\ S1 5Tz o]topq &3 Tz opq&3T HHPJZ S o]topqS &$ sviLY\]i r#UPS1 5 6!=<LYsviU PS1 5 1 5S .4) sviS  opq&$S ) %Sopq&$ Spjdqta) :D?B w7)+X 0qb`S( LYx ohq`b /-R'V2W , " >G@EFADC :>;PSohq`bS ohq`b- [ /-u*R'V2W 98
  21.  0    •  .!-$'%&) #+-/ 

       • ,"!(!-$'%&),"*  $"' %!  2/%! -5.* :4)93 +; # A+>?8 -5)9  =6(# -5)9  -507 &1@assertion $'IF ,< 21
  22. 9!:C@CM B?K • =;LE7M <JG"IK8 BMBG"HF>8 • C • Tg^

    • acaeY[U # • cfS # • Q`WPS] #(%bOfZ # • *331% • $@C\XZ_c\N@D7B C= >A &BAK • dRVgTg^ RO^h+0-/,.2').,6/.45i 22
  23. $V S)T$LUT] 0EE=DF@BA !V • otvUQJRV0EE=DF@BA • -*0763504V8:F;?<B>*2:A:>=D • "V0EE=DF@BAL(&\

    N^PK_# • (_%YTM^XT[TJmvlcd`Z&V $_ UO] • gunbr'0EE=DF@BA • - ;BAEF9=GCD +*EF:F@;9:EE=DF,1..//- • gunbrS`hvipu_ HeqvZVI] gvlWgunbrUO] • guoafsvipu'kvjV$_ UO] 23
  24. 01%,*')(:>G[PU]LOIV[=AC 24 •  %,*')(:G[PU]LOIV[>4 ?MJN> ;69ZSY;<892C -F]R[K]J>WEQWX4 ->A3< D29MJN

    7CHJMTD! \ 5B2: @C .%,"+*)#&$%,*')(WEQWX=AC  /
  25. UQVGUQSY_ULG KNV^Mb 25 *( UQSY_ULJ CI • ) ) 

    +( UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV
  26. ;79@F;0&(/I4;5:E' "  • /I4;5:EHBG%$)#;79@F;0 • ;79@F;0 .$-?I=12/* ' •

    ;7<HBG"$-;79@F;0'D3>8C* ' • ;79@F;0.,*$ .;7<'76IA&% #-+!. 26
  27. RmV^W]hFJ+IMN0/73J 4 +IMN0/K^Z_- 'J( • #&J1 QH@>?C=Q+5 "l "l"6GAE!)BN: +ID;EXkfmak_LSk\mcTmZQ0/

    BN •  "p1 K;>?C: • "p1 KPON>?C: • UdYTW_2 *8%  lXk[e_nbmjk`lgSimo • .$9,9Q <N 27 "      !   
  28.        '#*" ,$ )

        '.*" ,$-  0 ,$2+  ,$ (4 3   /1!% (4 &5 28
  29.      4* '#*" ,$ ) 

      '.*" ,$-  0 ,$2+  ,$ (4 3 &6 # /1!% (4 &5 -! <+ 4* 20" $ 3> :';) =  .0"$ 4*  /5, 7(% 29  <+ 4* 20" $ ; ? 8 9& 6 1
  30.      4* 62:0 <3!*9  

     6@:0 <3!=  C%(<3F; "&"#)' <3! "7H+ "G &6 # AD/4 " "7H+5J -! <+ 4* 20" $ 3> :';) =  .0"$ 4*  /5, 7(% 30  <+ 4* 20" $ ; ? 8 9& 6 1 -K>.1 '"E  $' 8I ?ML ,B 
  31. Vt[d\cnMP ORS#"-'P( 'P(Nd`e#"P • aieYZVP!u^j_`dlvO& Pr kqu7=G=@*B>*4BA;=DAE+T# JrkqKNOd`eP QT$LS oXimtb_`dl

    \o`w) iUXps] ^j_`dl \o`w gtfYZV ^j_`dl \o`w) " ^j_`dl \o`w)  ^j_`dl \o`w Pd`e w)Jd`bhpdWO%LS d`e w) d`bhpdWO%LS d`e w) d`e w d`e w 654*2/0.13/..2*8=<?;:@*<=G?;=*EB>FH:D=*, 9B>FH:D=*@?>=*;I;@=*CDB;=EE=E 31
  32. !LRS('5/M 1T$C + Q/T 1ESHOM('M 64 !-TGPGPDFKB • ('p%I# •

    3fqdWXULRS 0AYg^lAn`ZKJ$* 74 !-T&ES • 9??:>@;=<LRS!._X`Z • [eaVa]cM, 84 !-T ESgn^]T"N • a]cp2 a]cT • IM) T • 3iblAibl\hjmq\ko 32 "'   )$  #  ! %* $$&(
  33. +NUW10>8O 9Y-B 5 T8Y 9GWHRO10O • .:M10O &*YFICVGW • lmq(*TgvdO4

    • FICVTW • ;'/u '/fvr) 2!S@WOK"&GW • _pvu%10w4)x • FICVTW • tvs\nvOkio[rYFICV3ZK*GW • -%10wkredb`?krea[?<7)x • $N YAXJFICVTW • ,6Qcjh]^[KP?EEO=K#FNMWELDA 33
  34. ?;@5%46L9?:>F. • ?;@.K5*)53/ • ?;@JCI')4?;=BH?75 • K K  •

    ?;@GL?7H?7 •  .!#E8A<D5 -0/ • ",&2?;=BH?75+(41$- 34
  35. jfk$ ZOXgok^_[[|ajbisU x]t|[|ajbismh|z}2=<9;2:~ • gok^_[Zlr]zZ(Tx]t*R • "W)WR%Kjfhnwj\!S'P-N [pwc|euz :<5 3;>

    q]by dzky|v| Ix]t,76V& QJZ  I x]t,T({ Z }wz b +Rx]tZYOK45<1458` v|R(~ H2=<9;2:.2@@BDG?C@B.<BFGRVx]t R[pwc|euzSq]bydzky|v x]tZjfkT# L2=<9;2:.;G?CA?EAFM/2=<9;2:0 35
  36. LGM ;.:HRM>?<<_ALBJV8 Q_LFYO^C `")(%'"&! • \=W; 7- 9;19202:- 36 <S[D_FY^

    &($ #'* U=B]E^M]_Z_ System Service OS   Service Abstraction Hardware Driver +#'*\=W514 5/:,]C9>@KJ NKC;73 XOKMLGM9 LGM 55/:61 4 +BZGI614  7E ^T_P^M; XOKMLGM9 LGM 8 72:
  37. NHO</;JSO@A==_CNDMX8 )('&)=_CNDMXQK_] 37 Broker      

         *F_RH9=UZ8"! <U\CG514,  8 < * )('&)QK_]7:3+ =LUN>T6=_CND MXWBPIV`c a <2;5+NHKRZN> 0 76; -Z=[K?V%$#b.T[_H^LEYH
  38. 4'+5ZVW\`ZRHBLHQcSZT X_DI19NH&$:0( • "K,KHQcSZTX_I2UVZ^deb]aH  MYcaH!P ;<=O3 AH IHUVZ^QcSZTX_*)D JO3"K,KI9N

    8G<6 • /P.G%7BLG2QcSZT[IE> C19NHZV[#H&$:9@F6 • UVZ^QcSZTX_*)D2ZVW\`ZRG ->C 6O9:2ZVW\`ZRP?O 38
  39. WSXGWSU[dWLG KNXcMg 39 *( WSU[dWLJ CI • ) ) AQg\ahU[Rbg

    +( WSU[dWLJBIKhOWPV_JCI • FHI"!)$G% • eM`hKhOWPV_A-=<86=KhOWPV_ ,( WSU[dWLJBIE]fTSJCI • ,DGK]fhVAWSX&# • WSU[dWLG • WSXG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • WSX#]fTS • /0/1)GZcYPSAdSP^hSYWSX
  40. '$('$%)+'#! "*,-&  "*,-&      

     40
  41. ]Z_I]Z[`g]VS?RUcjl\ , DKGIUcjl\@PQAM *)  HQ"M • W]il]VbH]Z[`g]VSQAM> • %N

    J]Z[`g]V S#BER> • (30=]Z_Icj_[WakY +) @PQ"M •  O! H]Z[`g]VSQ"M • (]Z_&%=2f^h=.4;768'59:'14;<=f^h&] Z_=f^hdlZ]Z_ ,) CGQ"M • $H]Z[`g]VI SDR • WkXgek[hH]Z_SR • m-/HL"TF%]Z_ 41
  42.  ".+/#,+ 647  •  "./- • 647 (6459:621&)!'3<810

    • ;*/- • +6471; $(*%0    (James W. Grenning) 42
  43. UQVGUQSY_ULG KNV^Mb 43 *( UQSY_ULJ CI • ) ) 

    +( UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV
  44. @<>BD@:8 "4(69CEF?1  • @<A/ .36 • @<>BD@:/&8@<A/+! • @<ACE=<.36

    • @<A,@<A8!0$ &)6 • @<>BD@:#-,%7.@<A -,%7. @<A85*6 • @<A '2( @<A;F<86 • @<>BD@:86/6@<A8(6 44
  45. 856;?80(!/ 859( - +% • 859( %856;?80(!/. • 856;?80/- *&,'

    •  (1@6B=2B5'#$8594B: %)>7<@3"$ (/A  45
  46. c`bhlcXRKV c`eRUJSN!H • UJSOLMF^`cj1aieZ[WRQ RI • 'Q o*o$ • ("T+R)q38;

    F6599 r • #R,G • gbpnTYdX\jR% • 4598:QPc`e]pfR R% • 2A?<B-2C>?-W_kYmaieZ[W&R.8C=?DE-20-7<DE@B/ 46
  47. /.0''*"( '  • -21' %#$ !+) &/.0-21',  //

     Excel! void test_1_1() { … expect1 = 1; expect2 = 0; … assert(expect1 == result1); assert(expect2 == result2); … } void test_userCreation_minusAgeIsInvalid(void) { … expectUser = createUser(“invalid usar”, -1); … EXPECT_EQUAL_USER(expectUser, result); … } …  " Test as Documantation     47 xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros)
  48. /.0''*"( '  • -21' %#$ !+) &/.0-21',  //

     Excel! void test_1_1() { … expect1 = 1; expect2 = 0; … assert(expect1 == result1); assert(expect2 == result2); … } void test_userCreation_minusAgeIsInvalid(void) { … expectUser = createUser(“invalid usar”, -1); … EXPECT_EQUAL_USER(expectUser, result); … } …  " Test as Documantation     48 xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros)    
  49. Wvvltko~¼¬§®”&”+ flyzTeslrryTUT¬§®¥»¯”·² ¢©·¹£ • YuklTeslrry • biyj{xlTflyzT¬§®”)Bƒ”9F†P • YutkozouthrTflyzT_umojT¬§®µ¨«¯” $4H†DO

    • ]hxkVzuVflyzTYuklT¬§®‹›”“PŠ‰†‚› • flyzTYuklTZ{vrojhzoutT¬§®¥»¯”¥±³ºID†ˆ‰Ÿ‚› • flyzT_umojTotTcxuk{jzoutT¬§®G“€¬§®/“Š…C‰œ’ƒ¸¦«¢†‚› • Xlnh|ouxTeslrry • WyylxzoutTdu{rlzzl¬§®¤»§-/€‘”hyylxzout†-Š”…7‡’ƒ • [xxhzojTflyz¬§®?2†'Šš-Šš‹› • ^tzlxhjzotmTflyzy¼:˜”¬§®•”!†"ƒ;¬§®?2†› • dlyu{xjlT_lhqhml¼·¨»§J,†„–ˆƒŽƒ’ƒ • autklzlxsotoyzojTflyz¼¶¹ª´º’ žŽƒ€?2†“’Žƒ›>¼ • \xlynT\o~z{xl¼*1”8ž.Šˆ‹›\xhmorlTflyz6L’ 5—¬§®†œ› • \xlw{ltzTZli{mmotm¬§®-…™Rž7‡Œ€­°«¡ž;‹› • `ht{hrT^tzlx|ltzout¬§®C“(3†%E€A¬§®†C‰œ’ˆ’› • eru}Tflyzy¬§®”C“/K†……› • cxupljzTeslrr • X{mmTflyzy N&€ M&”R†ƒ • Zl|lruvlxyTauzTgxozotmTflyzyJ<@†¬§®ž0ƒˆœ’ƒ]omnT • flyzT`hotzlthtjlTYuyz¬§®”¥§®†Sƒ • cxuk{jzoutTX{my¬§®ž0ƒƒ›”“€# =”¬§®°£†Q ‹› xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros) 49
  50. *??6=59Dpe_fRR 26AB(1<6;;A()(e_f^ogRlhY[blm\ • 26AB 1<6;;Ap+@@3B94(26AB • e_f$ I • R

    % • -=B6@34B9=7(26ABAp!URe_fSRIGF  "Oe_f$ IWV • 06A>C@46(.63:376plao_&IHTJGLNGPG • />=56B6@<9=9AB94(26ABpkmcjnP XLNGNE$ IQPLNGV • #R %RM • ,@6A8(,9DBC@6p R`dfZdiXe_f]o_'O KPG 50
  51. :68<>:31 .#/2=?@9+  • :6;)  (-/ • :68<>:3)!1:6;) %

    • :6;=?76(-/ • :6;&:6;1* !$/ • :68<>:3 '& 01:6;)65@=(#/ • :6;",#:6;4@61/ • :68<>:31/)/:6;1#/ 51
  52.    !   •   

                    "D1,>:E "D1$!&' "  %$!&' "0A ;C " F2 6=4=( "& #"  "68 /7  "-<. "*?@AG VSTeP+D (http://qualab.jp/vstep/) ) 1 9B)  53  52
  53. ?<@ 7?<>AC?;:/8 ?<@&BD=<37! )( ?<@ 7.:6 28 • ?<>AC?;7# 7'.409:E"

    *(  287-8?<@:8 +( ?<@ 7$ :/8 • ?<>AC?;7 :1,%5 :/8              53
  54.   " g?bR "  +SA " KGSA 6[PC

    $ ," 0 ," 8Z MU XL MU 5] H; e`V PC_ aQ PC 1X @EH 5] H; ":YN :YJ "g?X> " + *!-0 "=cf "^J  ) " 6[PC 5]H; " 6[PC 5]H; 6[F Oh   1 … 6[F -20℃ *# (. Oh /'. O21 <TB7 30s35s 54 VSTeP%" &JaSST'16\dJW 9JaSST\dID34
  55.          

     55 1 % 0
  56. TRV H>KG BJ TRV HC@^KBJ   !  

       ! …     ")    ! …. ")      (+)& $M]QWL\]OH%EA DTRV"K BJ;TRV HK BJ (,)HTRV"KA: TRV?FTRV"K: TRVH# GIDJ <TRV"HH= ^N[RY_R'XSP_QY_RH ZU\]O`53482) ^05!:/*.798`1-634a  ! …. QA    !   56
  57. 7E@/ENKOHE !"!#H4E • NKO?14E!"!#!$+%$'&() '$+%$'&*-, • JRH6<C.5F9JR3BFE:4 • NKO3JR:>NKMPSNI@ 3BD.

    3  • !"!#ANKOQTLK@@=7E H G8NKOA6;2D0 1"#A  →24-B '6/;<   ?!9.   1"  ,%1"  (3  (& ?!9.   → 8?$ 1" *#A  →50 :=@+)7> 57
  58. B “‹s“¡Ÿ£•“ 2C ‹¦©¤›ŸŠ9ƒwu • §£—˜–¡Ÿ£‡‹2C ‹¦©¤›Ÿ • ¡Ÿ£•D}†t“ˆo‹¡Ÿ£‡¥œxF…z‘ ”‰y‰“

    • q¡Ÿ£$E?M0  \kmjfelhkjT`gngiTž©¥Ÿ (,K4rU_cdbZV • B ¡Ÿ£Œ>’O}x*‰‚ŽŠoQA }†‹‰y ‰„‚¡Ÿ£•3RŠD}<z†}u{ˆxt • ]^]aˆ~y¡Ÿ£B ‹L6 .•! |€“ • 2C ‹¦©¤›ŸŠ“‚ŽŠ¯ XW ¡Ÿ£JH;<7Š“ • ¡Ÿ£‹/%•)8Š“p¡Ÿ£‹ •='“ YW ¡Ÿ£¬Ÿ•B ‡&|€y“p ‰“# ¡Ÿ£‹B •Nv“ • 5"}t¡Ÿ£JH¨¢ª•’”“ • V:€¡Ÿ£‡‹š¬«¬¤S ¡Ÿ£‹ • B @‰¡Ÿ£™©›ª­¡Ÿ£+‹/%®•8“ • V1•G-@‰¨¢ª[c`‡IP 58
  59. %#'" • %#' %#')&*%#'"  %#' (+$# !"  %

    'P7 -*$! K:2I FBJ?% '3G+&. FB;H% '6> ;HN9K:% ' *-&OpenCVK: N9 <O5E ")/5 E*$! K:    ;H2I % '3G -*$!K: N9=QN9 @ % '%#, % '/%( N9K:;H% ' % 'P7MA % '%#,C8 ;H1D0 % '3G % '6>4RL 59
  60.  • !   • "%  '$ !

    # &'   60