0+-492:$.*& 1/2.6& ! 7#=/-/8+%'+I'*+%*#-%)' ! 7&-2*&2-#' ! (%*/=)2"/8+%' ! @+*2)#)'+%' A !+9#)3+%'X"+?'3)'</;.'93L9'3)'L++;Y' A !+2="3%L'X"+?'3)'L++;.'93L9'3)'</;Y' 1/*6& ! V%;#=#%;#%&';#J#"+=$#%&' ! V%;#=#%;#%&'$/3%&#%/%*#'/%;'#J+"28+%' ! V$=-+J#'-#2)/<3"3&Q' D763'P'O#Q+%;'&9#':Q&9' HZ'
!"#$&(4,-9)& D&34,-9)&$<&2&5+-49)&$,&!"#$&.):5$,+9+A*& D&34,-9)&$<&2&UDd&_9)&?+,.2$,$,A& ! !+;#' ! \#)+2-*#)' ! :#&/;/&/' E'(11#Z'&1# Module )&1.,)E&#Z'&1# +=0!# 7P-N# A+7# ;&$(J($(# D763'P'O#Q+%;'&9#':Q&9' H]'
=+-)&W$<$3$9$.*&0).2-2.2& D&34,-9)&$<&2&UDd&_9)&?+,.2$,$,A&?+-)& ! G9/&'*+;#'3%'&9#'E4\'`"#'3)'J3)3<"#'&+'+&9#-'*+;#'3%'&9#'E4\'`"#j' ! G9/&'*+;#'3%'&9#'E4\'`"#'3)'J3)3<"#'&+'*+;#'+2&)3;#'&9#'E4\'`"#j' ! G9/&'*+;#'+2&)3;#'&9#'E4\'`"#'3)'J3)3<"#'&+'*+;#'3%)3;#'&9#'E4\'`"#j' e,9$7)&<.2,-2:-&UDd&_9)<E&!"#$&5).2-2.2&)\>9$?$.9*&2,<S):<&299&+@&./)<)& 84)<;+,<& D763'P'O#Q+%;'&9#':Q&9' H^'
O,.):,29&=+-)&W$<$3$9$.*& O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' D763'P'O#Q+%;'&9#':Q&9' Hb'
O,.):,29&=+-)&W$<$3$9$.*& O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)' D763'P'O#Q+%;'&9#':Q&9' Hd'
O,.):,29&=+-)&W$<$3$9$.*& O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)' B+&A).&<.2,-2:-&UDd&3)/2Q$+:& ! O2%;"#K!"/))B/&9P'5' D763'P'O#Q+%;'&9#':Q&9' He'
O,.):,29&=+-)&W$<$3$9$.*& O,.):,29&?+-)&$,&<.2,-2:-&UDd<&?2,&<))&299&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&(4,-9)c=92<<F2./& ! !+$$/K;#"3$3&#;'"3)&'3%;3*/8%L'?9#-#'&+')#/-*9'3%'&9#'E4\'`"#'?9#%'"++03%L' I+-'*"/))#)' B+&A).&<.2,-2:-&UDd&3)/2Q$+:& ! O2%;"#K!"/))B/&9P'5' 02*&29<+&$,?94-)&)53)--)-&UDd<&2,-&-$:)?.+:$)<& P\25>9)<& ! O2%;"#K!"/))B/&9P'"3<[I++5F/-.*"/))#)[' ! O2%;"#K!"/))B/&9P'"3<[I++5F/-.5' D763'P'O#Q+%;'&9#':Q&9' Rh'
P\>+<$,A&O,.):,29&=+-)&`KaIb& ".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' D763'P'O#Q+%;'&9#':Q&9' Rg'
P\>+<$,A&O,.):,29&=+-)&`KaIb& ".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&P\>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'I-+$'&9#'<2%;"#'*"/))'=/&9'&+'#C=+)#' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' 1/*&-+&./$<6& D763'P'O#Q+%;'&9#':Q&9' RH'
P\>+<$,A&O,.):,29&=+-)&`KaIb& ".2,-2:-&UDd&_9)<&)\>+<)&299&$,.):,29&:++.c:)92;Q)&>2?72A)<& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&P\>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'I-+$'&9#'<2%;"#'*"/))'=/&9'&+'#C=+)#' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' 1/*&-+&./$<6& ! V&')#=/-/&#)'3%&#-%/"'J3)3<3"3&Q'I-+$'#C&#-%/"'J3)3<3"3&Q' ! V%'+&9#-'?+-;).'3&'/""+?)'<2%;"#)'&+'9/J#'=-3J/&#'*+%&#%&' D763'P'O#Q+%;'&9#':Q&9' RR'
D??)<<$,A&P\.):,29&=+-)&`KaIb& ".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' D763'P'O#Q+%;'&9#':Q&9' RZ'
D??)<<$,A&P\.):,29&=+-)&`KaIb& ".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' D763'P'O#Q+%;'&9#':Q&9' R]'
D??)<<$,A&P\.):,29&=+-)&`KaIb& ".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' (4,-9)<&54<.&$5>+:.&)Q):*&,))-)-&>2?72A)&,+.&?+,.2$,)-&$,&./)&34,-9)&$.<)9@E& )\?)>.&G2Q2fg& 1/*&-+&./$<6& D763'P'O#Q+%;'&9#':Q&9' R^'
D??)<<$,A&P\.):,29&=+-)&`KaIb& ".2,-2:-&UDd<&$5>9$?$.9*&<))&)Q):*./$,A&+./):&?92<<&+,&./)&?92<<&>2./& ! _+&'&9#'*/)#'?3&9'<2%;"#)' (4,-9)<&54<.&<>)?$@*&O5>+:.cF2?72A)& ! T3)&'+I'=/*0/L#)'%##;#;'I-+$'+&9#-'<2%;"#)' ! N)#)'*+$$+%'D763')Q%&/C'$#%8+%#;'#/-"3#-' (4,-9)<&54<.&$5>+:.&)Q):*&,))-)-&>2?72A)&,+.&?+,.2$,)-&$,&./)&34,-9)&$.<)9@E& )\?)>.&G2Q2fg& 1/*&-+&./$<6& ! :/0#';#=#%;#%*3#)' )\>9$?$.& ! :/0#';#=#%;#%*3#)' 52,2A)239)& D763'P'O#Q+%;'&9#':Q&9' Rb'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Kaib& O52A$,)&34,-9)&D&<+5)/+S&A).<&<):Q9).&$,<.2,?)<&@:+5&34,-9)&(& B 5;4.)$# K(8(MA1&)8'&$[# &M4.)$# A K(8(MA1&)8'&$[# H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$# D763'P'O#Q+%;'&9#':Q&9' Rd'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Kaib& 1/2.&$@&34,-9)&D&29<+&S2,.)-&.+&A).&<):Q9).&$,<.2,?)<&<+5)/+S&@:+5&34,-9)&=6& B 5;4.)$# K(8(MA1&)8'&$[# &M4.)$# A K(8(MA1&)8'&$[# H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$# D763'P'O#Q+%;'&9#':Q&9' Re'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`Iaib& (4,-9)&=&?+49-&$5>+:.&@:+5&34,-9)&(E&34.&./),&$.&$<&-)>),-),.&+,&$.& &M4.)$# B K(8(MA1&)8'&$[# 5;4.)$# K(8(MA1&)8'&$[# A H"&#E.4F#.D# K(8(MA1&)8'&$A-&)8'&$# C 5;4.)$# K(8(MA1&)8'&$[# D763'P'O#Q+%;'&9#':Q&9' Zh'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`jaib& (4,-9)&=&?+49-&)\>+:.&$.<&+S,&<):Q9).&>2?72A)E&34.&34,-9)&D&?+49-&+,9*&<))& )$./):&=&+:&(& &M4.)$# C K(8(MA1&)8'&$[# 5;4.)$# K(8(MA1&)8'&$[# :' A &M4.)$# N2.#E.45&1#.D# B K(8(MA1&)8'&$[# K(8(MA1&)8'&$A-&)8'&$# D763'P'O#Q+%;'&9#':Q&9' Zg'
O5>+:;,A&h&P\>+:;,A&2&F2?72A)&`iaib& (4,-9)&=&?+49-&$5>+:.E&?+,.2$,&2,-&)\>+:.&<):Q9).&.+&<+9Q)&./)&-$9)552& PM4.)$#("J#5;4.)$# K(8(MA1&)8'&$[# C PM4.)$#("J#5;4.)$# K(8(MA1&)8'&$[# B 5;4.)$# K(8(MA1&)8'&$[# A D763'P'O#Q+%;'&9#':Q&9' ZH'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", org.foo.service; version="1.1" Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' ZR'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Indicates R4 Import-Package: semantics and syntax osgi.service.log; version="[1.0.0,1.1.0)", org.foo.service; version="1.1" Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' ZZ'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", Indicates R4 org.foo.service; version="1.1" Globally unique ID semantics and syntax Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' Z]'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", org.foo.service; version="1.1" Internal bundle class path Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' Z^'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Import of a Bundle-Version: 1.0.0 package version range Bundle-ClassPath: .,org/foo/embedded.jar Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", org.foo.service; version="1.1" Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' Zb'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Importing an exported Bundle-ClassPath: .,org/foo/embedded.jar package Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", org.foo.service; version="1.1" Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' Zd'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Exported package with Import-Package: version and arbitrary osgi.service.log; version="[1.0.0,1.1.0)", attribute org.foo.service; version="1.1" Export-Package: org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' Ze'
(4,-9)&02,$@)<.&P\25>9)& Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.foo.simplebundle Bundle-Version: 1.0.0 Bundle-ClassPath: .,org/foo/embedded.jar Import-Package: osgi.service.log; version="[1.0.0,1.1.0)", Provided package with org.foo.service; version="1.1" dependency on exported Export-Package: package org.foo.service; version="1.1"; vendor="org.foo", org.foo.service.bar; version="1.1"; uses:="org.foo.service" D763'P'O#Q+%;'&9#':Q&9' ]h'
!"#$&V)>),-),?*&0+-)9& F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' D763'P'O#Q+%;'&9#':Q&9' ]g'
!"#$&V)>),-),?*&0+-)9& F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)' D763'P'O#Q+%;'&9#':Q&9' ]H'
!"#$&V)>),-),?*&0+-)9& F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)' F2?72A)c9)Q)9&-)>),-),?$)<& ! @3%#'L-/3%#;' ! @"#C3<"#.'#%/<"#'-#I/*&+-3%L' ! 4-#'&9#'&-2#';#=#%;#%*3#)'X35#5.'&9#Qo-#'3%'&9#'*+;#Y' D763'P'O#Q+%;'&9#':Q&9' ]R'
!"#$&V)>),-),?*&0+-)9& F2?72A)c9)Q)9&Q<&5+-49)c9)Q)9&-)>),-),?$)<& ! G9+'J)'?9/&' 0+-49)c9)Q)9&-)>),-),?$)<& ! !+/-)#'L-/3%#;' ! 4-#'<-3n"#' ! M3;#'&9#'&-2#';#=#%;#%*3#)' F2?72A)c9)Q)9&-)>),-),?$)<& ! @3%#'L-/3%#;' ! @"#C3<"#.'#%/<"#'-#I/*&+-3%L' ! 4-#'&9#'&-2#';#=#%;#%*3#)'X35#5.'&9#Qo-#'3%'&9#'*+;#Y' F2?72A)c9)Q)9&-)>),-),?$)<&:)84$:)&>2?72A)<&.+&3)&2.+5$?&`$f)fE&$,&2&<$,A9)& 34,-9)b& D763'P'O#Q+%;'&9#':Q&9' ]Z'
V)>),-),?*&d)<+94;+,&`KaIb& D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' D763'P'O#Q+%;'&9#':Q&9' ]]'
V)>),-),?*&d)<+94;+,&`KaIb& D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & 5;4.)$# & 5;4.)$# K(8(MA1&)8'&$# K(8(MA1&)8'&$A%\4# C A B & &M4.)$# &M4.)$# K(8(MA1&)8'&$A%\4# K(8(MA1&)8'&$# D763'P'O#Q+%;'&9#':Q&9' ]^'
V)>),-),?*&d)<+94;+,&`KaIb& D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & 5;4.)$# & 5;4.)$# K(8(MA1&)8'&$# K(8(MA1&)8'&$A%\4# C A B & &M4.)$# &M4.)$# & K(8(MA1&)8'&$A%\4# K(8(MA1&)8'&$# & ! aQ=3*/""Q.'-#)+"J3%L'/'<2%;"#'?3""'-#)2"&'3%'+&9#-'<2%;"#)'<#3%L'&-/%)38J#"Q' -#)+"J#;' D763'P'O#Q+%;'&9#':Q&9' ]b'
V)>),-),?*&d)<+94;+,&`KaIb& D4.+52;?299*&52,2A)-&3*&./)&!"#$&@:25)S+:7& ! (%)2-#)'/'<2%;"#o)';#=#%;#%*3#)'/-#')/8)`#;'<#I+-#'&9#'<2%;"#'*/%'<#'2)#;' O,&<$5>9)&.):5<E&:)<+9Q$,A&2&34,-9)&52.?/)<&$.<&$5>+:.)-&>2?72A)<&.+&34,-9)<& >:+Q$-$,A&./)5& & 5;4.)$# 5;4.)$# K(8(MA1&)8'&$# & K(8(MA1&)8'&$A%\4# C A B & &M4.)$# &M4.)$# K(8(MA1&)8'&$A%\4# K(8(MA1&)8'&$# & ! aQ=3*/""Q.'-#)+"J3%L'/'<2%;"#'?3""'-#)2"&'3%'+&9#-'<2%;"#)'<#3%L'&-/%)38J#"Q' -#)+"J#;' ! VI'/'J#-)3+%'+-'/-<3&-/-Q'/n-3<2&#)'/-#')=#*3`#;'+%'3$=+-&).'&9#%'#C=+-&)'$2)&' $/&*9' A :2"8="#'/n-3<2&#)'+%'/%'3$=+-&'/-#'"+L3*/""Q' DMV)-& D763'P'O#Q+%;'&9#':Q&9' ]d'
V)>),-),?*&d)<+94;+,&`IaIb& 049;>9)&52.?/$,A&>:+Q$-):<& & B & &M4.)$# 5;4.)$# & K(8(MA1&)8'&$[# K(8(MA1&)8'&$[# 8&)15."]^GA_A`^# 8&)15."]^GA_A`^# :' A & C & &M4.)$# & K(8(MA1&)8'&$[# 8&)15."]^GAaA`^# & D763'P'O#Q+%;'&9#':Q&9' ]e'
V)>),-),?*&d)<+94;+,&`IaIb& 049;>9)&52.?/$,A&>:+Q$-):<& & B & & &M4.)$# 5;4.)$# K(8(MA1&)8'&$[# K(8(MA1&)8'&$[# & 8&)15."]^GA_A`^# 8&)15."]^GA_A`^# :' A & C & &M4.)$# K(8(MA1&)8'&$[# & 8&)15."]^GAaA`^# ! \#)+"28+%'/"L+-3&9$'+-;#-)'$/&*93%L'=-+J3;#-)' A 4"-#/;Q'-#)+"J#;'=-+J3;#-)'+-;#-#;'<Q';#*-#/)3%L'J#-)3+%' A N%-#)+"J#;'=-+J3;#-)'+-;#-#;'<Q';#*-#/)3%L'J#-)3+%' A VI'J#-)3+%)'/-#'#12/".'$/&*93%L'=-+J3;#-)'/-#'+-;#-#;'</)#;'+%'3%)&/""/8+%'+-;#-' D763'P'O#Q+%;'&9#':Q&9' ^h'
M+,c0+-492:&F2$,.&F:+A:25&`Kajb& 1)&/2Q)&2&<$5>9)&>2$,.&>:+A:25& 7).;#$%&#H-65#5"#=EX."# :..C# D763'P'O#Q+%;'&9#':Q&9' ^g'
M+,c0+-492:&F2$,.&F:+A:25&`Iajb& O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'& META-INF/ META-INF/MANIFEST.MF org/ org/foo/ org/foo/paint/ org/foo/paint/PaintFrame$1$1.class org/foo/paint/PaintFrame$1.class org/foo/paint/PaintFrame$ShapeActionListener.class org/foo/paint/PaintFrame.class org/foo/paint/SimpleShape.class org/foo/paint/ShapeComponent.class org/foo/shape/ org/foo/shape/Circle.class org/foo/shape/circle.png org/foo/shape/Square.class org/foo/shape/square.png org/foo/shape/Triangle.class org/foo/shape/triangle.png D763'P'O#Q+%;'&9#':Q&9' ^H'
M+,c0+-492:&F2$,.&F:+A:25&`Iajb& O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'& Main implementation META-INF/ package is META-INF/MANIFEST.MF org.foo.paint org/ org/foo/ org/foo/paint/ org/foo/paint/PaintFrame$1$1.class org/foo/paint/PaintFrame$1.class org/foo/paint/PaintFrame$ShapeActionListener.class org/foo/paint/PaintFrame.class org/foo/paint/SimpleShape.class org/foo/paint/ShapeComponent.class org/foo/shape/ org/foo/shape/Circle.class org/foo/shape/circle.png org/foo/shape/Square.class org/foo/shape/square.png org/foo/shape/Triangle.class org/foo/shape/triangle.png D763'P'O#Q+%;'&9#':Q&9' ^R'
M+,c0+-492:&F2$,.&F:+A:25&`Iajb& O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'& META-INF/ META-INF/MANIFEST.MF org/ org/foo/ org/foo/paint/ Static main method in org/foo/paint/PaintFrame$1$1.class PaintFrame org/foo/paint/PaintFrame$1.class org/foo/paint/PaintFrame$ShapeActionListener.class org/foo/paint/PaintFrame.class org/foo/paint/SimpleShape.class org/foo/paint/ShapeComponent.class org/foo/shape/ org/foo/shape/Circle.class org/foo/shape/circle.png org/foo/shape/Square.class org/foo/shape/square.png org/foo/shape/Triangle.class org/foo/shape/triangle.png D763'P'O#Q+%;'&9#':Q&9' ^Z'
M+,c0+-492:&F2$,.&F:+A:25&`Iajb& O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'& META-INF/ META-INF/MANIFEST.MF org/ org/foo/ org/foo/paint/ Interface SimpleShape org/foo/paint/PaintFrame$1$1.class supports multiple shape org/foo/paint/PaintFrame$1.class org/foo/paint/PaintFrame$ShapeActionListener.class implementations org/foo/paint/PaintFrame.class org/foo/paint/SimpleShape.class org/foo/paint/ShapeComponent.class org/foo/shape/ org/foo/shape/Circle.class org/foo/shape/circle.png org/foo/shape/Square.class org/foo/shape/square.png org/foo/shape/Triangle.class org/foo/shape/triangle.png D763'P'O#Q+%;'&9#':Q&9' ^]'
M+,c0+-492:&F2$,.&F:+A:25&`Iajb& O.&$<&>2?72A)-&2<&2&<$,A9)&UDd&_9)&S$./&./)&@+99+S$,A&?+,.),.<'& META-INF/ META-INF/MANIFEST.MF org/ org/foo/ org/foo/paint/ org/foo/paint/PaintFrame$1$1.class org/foo/paint/PaintFrame$1.class org/foo/paint/PaintFrame$ShapeActionListener.class org/foo/paint/PaintFrame.class org/foo/paint/SimpleShape.class org/foo/paint/ShapeComponent.class org/foo/shape/ Shape implementations org/foo/shape/Circle.class defined in org.foo.shape org/foo/shape/circle.png org/foo/shape/Square.class org/foo/shape/square.png org/foo/shape/Triangle.class org/foo/shape/triangle.png D763'P'O#Q+%;'&9#':Q&9' ^^'
M+,c0+-492:&F2$,.&F:+A:25&`jajb& d)92;+,</$>&25+,A&?92<<)<& c# b# Simple Paint Shape Frame b# c# Shape Triangle Circle Square Component D763'P'O#Q+%;'&9#':Q&9' ^b'
M+,c0+-492:&F2$,.&F:+A:25&`jajb& d)92;+,</$>&25+,A&?92<<)<& c# b# Simple Paint Shape Frame b# c# Shape Triangle Circle Square Component How to decompose into bundles? D763'P'O#Q+%;'&9#':Q&9' ^d'
0+-492:&F2$,.&F:+A:25&V)<$A,& &M4.)$# Shape .)*AD..A1%(4&# Paint Circle &M4.)$# .)*AD..A1%(4&AE5)E'&# Square &M4.)$# .)*AD..A1%(4&A1d,()&# Triangle &M4.)$# .)*AD..A1%(4&A$)5("*'&# D763'P'O#Q+%;'&9#':Q&9' ^e'
(),)_.<&+@&0+-492:$H)-&F2$,.&F:+A:25& P,@+:?)-&9+A$?29&3+4,-2:$)<& & D4.+52;?&-)>),-),?*&:)<+94;+,& ! (%)2-#)'=-+=#-'*+%`L2-/8+%' ' O5>:+Q)<&:)4<23$9$.*&+@&?+-)& & O5>:+Q)<&23$9$.*&.+&?:)2.)&-$C):),.&?+,_A4:2;+,<& D763'P'O#Q+%;'&9#':Q&9' bh'
D763'P'O#Q+%;'&9#':Q&9' bg'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):& !,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' D763'P'O#Q+%;'&9#':Q&9' bH'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):& !,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0' D763'P'O#Q+%;'&9#':Q&9' bR'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):& !,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0' 1/2.&$@&S)&S2,.&.+&2--&2,-&:)5+Q)&34,-9)<&2.&:4,&;5)6& ! G#'%##;')+$#?/Q'&+'/**#))'&9#'2%;#-"Q3%L'I-/$#?+-0' D763'P'O#Q+%;'&9#':Q&9' bZ'
1/2.&h&1/*&+@&Z$@)?*?9)&Z2*):& !,?)&S)&/2Q)&2&34,-9)E&S/2.&-+&S)&-+&S$./&$.6& ! G#'%##;'&+')+$#9+?'&#""'&9#'D763'I-/$#?+-0'/<+2&'3&' 1/2.&$@&+4:&34,-9)&,))-<&.+&3)&$,$;29$H)-&<+5)/+S6& ! G#'%##;')+$#')+-&'+I'9++0'3%'&9#'I-/$#?+-0' 1/2.&$@&S)&S2,.&.+&2--&2,-&:)5+Q)&34,-9)<&2.&:4,&;5)6& ! G#'%##;')+$#?/Q'&+'/**#))'&9#'2%;#-"Q3%L'I-/$#?+-0' 1)&?2,&-+&299&+@&./)<)&./$,A<&S$./&2&S)99c-)_,)-&9$@)?*?9)&@+:&34,-9)<& ! 4'"3I#*Q*"#';#`%#)'&9#')&/L#)'+I'/'<2%;"#o)'"3I#8$#' A a9#'I-/$#?+-0'/))+*3/&#)'/'"3I#*Q*"#')&/&#'?3&9'#/*9'<2%;"#' D763'P'O#Q+%;'&9#':Q&9' b]'
(4,-9)&Z$@)&=*?9)& 5"1$(''# INSTALLED ,4J($&# ,"5"1$(''# )&1.'8&# ,"5"1$(''# UNINSTALLED RESOLVED 1$()$# STARTING STOPPING 1$.4# &M4'5E5$# (,$.;(XE# ACTIVE D763'P'O#Q+%;'&9#':Q&9' b^'
(4,-9)&Z$@)&=*?9)& 5"1$(''# INSTALLED ,4J($&# ,"5"1$(''# )&1.'8&# ,"5"1$(''# UNINSTALLED RESOLVED 1$()$# ;&2<9*)./'"'=8.$9&>'#&2<9*&2')32' ?<$&'$&,&.$&.?)&2' STARTING STOPPING 1$.4# &M4'5E5$# (,$.;(XE# ACTIVE D763'P'O#Q+%;'&9#':Q&9' bb'
(4,-9)&Z$@)&=*?9)& @?-*"-./'"'=8.$9&>',#<*)$&2'".' 5"1$(''# <,,<#38.)31'3<').)-"9)A&'".$' "??&22'3B&'C#"4&%<#D' INSTALLED ,4J($&# ,"5"1$(''# )&1.'8&# ,"5"1$(''# UNINSTALLED RESOLVED 1$()$# STARTING STOPPING 1$.4# &M4'5E5$# (,$.;(XE# ACTIVE D763'P'O#Q+%;'&9#':Q&9' bd'
(4,-9)&D?;Q2.+:& B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& D763'P'O#Q+%;'&9#':Q&9' be'
(4,-9)&D?;Q2.+:& B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' D763'P'O#Q+%;'&9#':Q&9' dh'
(4,-9)&D?;Q2.+:& B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' public interface BundleActivator { & void start(BundleContext context) throws Exception; void stop(BundleContext context) throws Exception; } D763'P'O#Q+%;'&9#':Q&9' dg'
(4,-9)&D?;Q2.+:& B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' public interface BundleActivator { & void start(BundleContext context) throws Exception; & void stop(BundleContext context) throws Exception; } & ! 4;;38+%/"'$/%3I#)&'$#&/;/&/'3)'%##;#;'&+';#*"/-#'&9#'/*8J/&+-' Bundle-Activator: <fully-qualified-class-name> &A*A># Bundle-Activator: org.foo.MyActivator D763'P'O#Q+%;'&9#':Q&9' dH'
(4,-9)&D?;Q2.+:& B/)&34,-9)&2?;Q2.+:&$<&2&@:25)S+:7&/++7&.+&299+S&34,-9)<&.+&<.2:.4>&2,-& </4.-+S,& ! a9#'9++0'3)'3%J+0#;'3%'&9#'7a4\aV_6[7aDBBV_6')&/&#)' ! 4%'/*8J/&+-'3$="#$#%&)'/')3$="#'3%&#-I/*#'/%;'3)'3%*"2;#;'3%'&9#'<2%;"#'E4\' `"#' & public interface BundleActivator { void start( BundleContext context ) throws Exception; & void stop( BundleContext context ) throws Exception; } & ! 4;;38+%/"'$/%3I#)&'$#&/;/&/'3)'%##;#;'&+';#*"/-#'&9#'/*8J/&+-' Bundle-Activator: <fully-qualified-class-name> What are these? &A*A># Bundle-Activator: org.foo.MyActivator D763'P'O#Q+%;'&9#':Q&9' dR'
(4,-9)&=+,.)\.& d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.& public interface BundleContext { String getProperty(String key); Bundle getBundle(); Bundle installBundle(String location) throws BundleException; Bundle installBundle(String location, InputStream input) throws BundleException; Bundle getBundle(long id); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... } D763'P'O#Q+%;'&9#':Q&9' dZ'
(4,-9)&=+,.)\.& d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.& Lifecycle method public interface BundleContext { to install other bundles String getProperty(String key); Bundle getBundle(); Bundle installBundle(String location) throws BundleException; Bundle installBundle(String location, InputStream input) throws BundleException; Bundle getBundle(long id); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... } D763'P'O#Q+%;'&9#':Q&9' d]'
(4,-9)&=+,.)\.& d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.& public interface BundleContext { String getProperty(String key); Bundle getBundle(); Bundle installBundle(String location) throws BundleException; Bundle installBundle(String location, InputStream input) throws BundleException; Access to other Bundle getBundle(long id); installed bundles Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... } D763'P'O#Q+%;'&9#':Q&9' d^'
(4,-9)&=+,.)\.& d)>:)<),.<&./)&34,-9)k<&)\)?4;+,&?+,.)\.& public interface BundleContext { String getProperty(String key); Access to our own bundle... Bundle getBundle(); what's that? Bundle installBundle(String location) throws BundleException; Bundle installBundle(String location, InputStream input) throws BundleException; Bundle getBundle(long id); Bundle[] getBundles(); ... void addBundleListener(BundleListener listener); void removeBundleListener(BundleListener listener); void addFrameworkListener(FrameworkListener listener); void removeFrameworkListener(FrameworkListener listener); ... File getDataFile(String filename); ... } D763'P'O#Q+%;'&9#':Q&9' db'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& public interface Bundle { ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); long getBundleId(); String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' dd'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& Lifecycle method to public interface Bundle { start bundle ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); long getBundleId(); String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' de'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& Lifecycle method to public interface Bundle { ... stop bundle int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); long getBundleId(); String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' eh'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& public interface Bundle { ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); Lifecycle method to long getBundleId(); update bundle String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' eg'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& public interface Bundle { ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); Lifecycle method to long getBundleId(); uninstall bundle String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' eH'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& public interface Bundle { ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); Access to long getBundleId(); bundle resources String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' eR'
(4,-9)& d4,c;5)&:)>:)<),.2;+,&+@&2&34,-9)& public interface Bundle { ... int getState(); void start(int options) throws BundleException; void start() throws BundleException; void stop(int options) throws BundleException; void stop() throws BundleException; void update() throws BundleException; void update(InputStream in) throws BundleException; void uninstall() throws BundleException; Dictionary getHeaders(); String getSymbolicName(); Access to long getBundleId(); accessible classes String getLocation(); ... URL getResource(String name); Enumeration getResources(String name) throws IOException; Class loadClass(String name) throws ClassNotFoundException; ... BundleContext getBundleContext(); } D763'P'O#Q+%;'&9#':Q&9' eZ'
(4,-9)&V*,25$<5& (4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)' N.#'51$&"#D.)#&8&"$1# BundleContext.addBundleListener() D763'P'O#Q+%;'&9#':Q&9' e]'
(4,-9)&V*,25$<5& (4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)' !;4'&;&"$#'51$&"&)#5"$&)D(E&# public interface BundleListener extends EventListener { public void bundleChanged(BundleEvent event); } D763'P'O#Q+%;'&9#':Q&9' e^'
(4,-9)&V*,25$<5& (4,-9)<&?2,&3)&$,<.299)-E&<.2:.)-E&<.+>>)-E&4>-2.)-E&2,-&4,$,<.299)-&2.&:4,&;5)& ! O2%;"#'#J#%&)')3L%/"'"3I#*Q*"#'*9/%L#)' e&E&58&J#&8&"$# public class BundleEvent extends EventObject { public final static int INSTALLED = 0x00000001; public final static int STARTED = 0x00000002; public final static int STOPPED = 0x00000004; public final static int UPDATED = 0x00000008; public final static int UNINSTALLED = 0x00000010; public final static int RESOLVED = 0x00000020; public final static int UNRESOLVED = 0x00000040; public final static int STARTING = 0x00000080; public final static int STOPPING = 0x00000100; … public Bundle getBundle() { … } public int getType() { … } } D763'P'O#Q+%;'&9#':Q&9' eb'
(4,-9)c(2<)-&V*,25$?&P\.),<$3$9$.*& (4,-9)&9$@)?*?9)&)Q),.<&>:+Q$-)&2&5)?/2,$<5&@+:&-*,25$?&)\.),<$3$9$.*& B/)&)\.),-):&>2X):,& ! 4%'/=="3*/8+%'*+$=+%#%&.'*/""#;'&9#'#C&#%;#-.'"3)&#%)'I+-'<2%;"#)'&+'<#' 3%)&/""#;.')&/-&#;.'/%;')&+==#;' ! D%'3%)&/"".'&9#'#C&#%;#-'=-+<#)'<2%;"#)'&+')##'3I'&9#Q'/-#'#C&#%)3+%)' A aQ=3*/""Q.'#C&#%)3+%'*+%&/3%')=#*3/"'$#&/;/&/'+-'-#)+2-*#)'&+'3%;3*/&#'&9#Q' =-+J3;#'/%'#C&#%)3+%' ! G9#%')&/-&#;.'&9#'#C&#%;#-'=#-I+-$)')+$#'/*8+%'&+'3%&#L-/&#'&9#'#C&#%)3+%' 3%&+'&9#'/=="3*/8+%' ! G9#%')&+==#;.'&9#'#C&#%;#-'=#-I+-$)')+$#'/*8+%'&+'-#$+J#'&9#'#C&#%)3+%' I-+$'&9#'/=="3*/8+%' D763'P'O#Q+%;'&9#':Q&9' ed'
P\.),-):&F2X):,& Installed bundles Tracker Frame W.)&# D763'P'O#Q+%;'&9#':Q&9' ee'
P\.),-):&F2X):,& Installed bundles e&*51$&)# :,"J'&#'51$&"&)# Tracker Frame W.)&# D763'P'O#Q+%;'&9#':Q&9' ghh'
Recommend
More recommend